Merge branch 'master' into avatar-cropping
This commit is contained in:
commit
0104ab79b3
25 changed files with 134 additions and 67 deletions
18
CHANGELOG
18
CHANGELOG
|
@ -1,7 +1,25 @@
|
||||||
Please view this file on the master branch, on stable branches it's out of date.
|
Please view this file on the master branch, on stable branches it's out of date.
|
||||||
|
|
||||||
v 8.6.0 (unreleased)
|
v 8.6.0 (unreleased)
|
||||||
|
- Improve the formatting for the user page bio (Connor Shea)
|
||||||
|
|
||||||
|
v 8.5.1
|
||||||
|
- Fix group projects styles
|
||||||
- Show Crowd login tab when sign in is disabled and Crowd is enabled (Peter Hudec)
|
- Show Crowd login tab when sign in is disabled and Crowd is enabled (Peter Hudec)
|
||||||
|
- Fix a set of small UI glitches in project, profile, and wiki pages
|
||||||
|
- Restrict permissions on public/uploads
|
||||||
|
- Fix the merge request side-by-side view after loading diff results
|
||||||
|
- Fix the look of tooltip for the "Revert" button
|
||||||
|
- Add when the Builds & Runners API changes got introduced
|
||||||
|
- Fix error 500 on some merged merge requests
|
||||||
|
- Fix an issue causing the content of the issuable sidebar to disappear
|
||||||
|
- Fix error 500 when trying to mark an already done todo as "done"
|
||||||
|
- Fix an issue where MRs weren't sortable
|
||||||
|
- Issues can now be dragged & dropped into empty milestone lists. This is also
|
||||||
|
possible with MRs
|
||||||
|
- Changed padding & background color for highlighted notes
|
||||||
|
- Re-add the newrelic_rpm gem which was removed without any deprecation or warning (Stan Hu)
|
||||||
|
- Update sentry-raven gem to 0.15.6
|
||||||
|
|
||||||
v 8.5.0
|
v 8.5.0
|
||||||
- Fix duplicate "me" in tooltip of the "thumbsup" awards Emoji (Stan Hu)
|
- Fix duplicate "me" in tooltip of the "thumbsup" awards Emoji (Stan Hu)
|
||||||
|
|
2
Gemfile
2
Gemfile
|
@ -306,6 +306,8 @@ group :production do
|
||||||
gem "gitlab_meta", '7.0'
|
gem "gitlab_meta", '7.0'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
gem "newrelic_rpm", '~> 3.14'
|
||||||
|
|
||||||
gem 'octokit', '~> 3.8.0'
|
gem 'octokit', '~> 3.8.0'
|
||||||
|
|
||||||
gem "mail_room", "~> 0.6.1"
|
gem "mail_room", "~> 0.6.1"
|
||||||
|
|
|
@ -480,6 +480,7 @@ GEM
|
||||||
net-ldap (0.12.1)
|
net-ldap (0.12.1)
|
||||||
net-ssh (3.0.1)
|
net-ssh (3.0.1)
|
||||||
netrc (0.11.0)
|
netrc (0.11.0)
|
||||||
|
newrelic_rpm (3.14.1.311)
|
||||||
nokogiri (1.6.7.2)
|
nokogiri (1.6.7.2)
|
||||||
mini_portile2 (~> 2.0.0.rc2)
|
mini_portile2 (~> 2.0.0.rc2)
|
||||||
nprogress-rails (0.1.6.7)
|
nprogress-rails (0.1.6.7)
|
||||||
|
@ -962,6 +963,7 @@ DEPENDENCIES
|
||||||
nested_form (~> 0.3.2)
|
nested_form (~> 0.3.2)
|
||||||
net-ssh (~> 3.0.1)
|
net-ssh (~> 3.0.1)
|
||||||
nokogiri (~> 1.6.7, >= 1.6.7.2)
|
nokogiri (~> 1.6.7, >= 1.6.7.2)
|
||||||
|
newrelic_rpm (~> 3.14)
|
||||||
nprogress-rails (~> 0.1.6.7)
|
nprogress-rails (~> 0.1.6.7)
|
||||||
oauth2 (~> 1.0.0)
|
oauth2 (~> 1.0.0)
|
||||||
octokit (~> 3.8.0)
|
octokit (~> 3.8.0)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
class @Activities
|
class @Activities
|
||||||
constructor: ->
|
constructor: ->
|
||||||
Pager.init 20, true
|
Pager.init 20, true
|
||||||
$(".event-filter a").bind "click", (event) =>
|
$(".event-filter-link").on "click", (event) =>
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
@toggleFilter($(event.currentTarget))
|
@toggleFilter($(event.currentTarget))
|
||||||
@reloadActivities()
|
@reloadActivities()
|
||||||
|
@ -12,18 +12,10 @@ class @Activities
|
||||||
|
|
||||||
|
|
||||||
toggleFilter: (sender) ->
|
toggleFilter: (sender) ->
|
||||||
sender.closest('li').toggleClass "active"
|
$('.event-filter .active').removeClass "active"
|
||||||
event_filters = $.cookie("event_filter")
|
event_filters = $.cookie("event_filter")
|
||||||
filter = sender.attr("id").split("_")[0]
|
filter = sender.attr("id").split("_")[0]
|
||||||
if event_filters
|
$.cookie "event_filter", (if event_filters isnt filter then filter else ""), { path: '/' }
|
||||||
event_filters = event_filters.split(",")
|
|
||||||
else
|
|
||||||
event_filters = new Array()
|
|
||||||
|
|
||||||
index = event_filters.indexOf(filter)
|
if event_filters isnt filter
|
||||||
if index is -1
|
sender.closest('li').toggleClass "active"
|
||||||
event_filters.push filter
|
|
||||||
else
|
|
||||||
event_filters.splice index, 1
|
|
||||||
|
|
||||||
$.cookie "event_filter", event_filters.join(","), { path: '/' }
|
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
class @AwardsHandler
|
class @AwardsHandler
|
||||||
constructor: (@post_emoji_url, @noteable_type, @noteable_id, @aliases) ->
|
constructor: (@post_emoji_url, @noteable_type, @noteable_id, @aliases) ->
|
||||||
$(".add-award").click (event)->
|
$(".add-award").click (event) =>
|
||||||
event.stopPropagation()
|
event.stopPropagation()
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
$(".emoji-menu").show()
|
|
||||||
$("#emoji_search").focus()
|
@showEmojiMenu()
|
||||||
|
|
||||||
$("html").on 'click', (event) ->
|
$("html").on 'click', (event) ->
|
||||||
if !$(event.target).closest(".emoji-menu").length
|
if !$(event.target).closest(".emoji-menu").length
|
||||||
|
@ -14,6 +14,16 @@ class @AwardsHandler
|
||||||
@renderFrequentlyUsedBlock()
|
@renderFrequentlyUsedBlock()
|
||||||
@setupSearch()
|
@setupSearch()
|
||||||
|
|
||||||
|
showEmojiMenu: ->
|
||||||
|
if $(".emoji-menu").length
|
||||||
|
$(".emoji-menu").show()
|
||||||
|
$("#emoji_search").focus()
|
||||||
|
else
|
||||||
|
$.get "/emojis", (response) ->
|
||||||
|
$(".add-award").after response
|
||||||
|
$(".emoji-menu").show()
|
||||||
|
$("#emoji_search").focus()
|
||||||
|
|
||||||
addAward: (emoji) ->
|
addAward: (emoji) ->
|
||||||
emoji = @normilizeEmojiName(emoji)
|
emoji = @normilizeEmojiName(emoji)
|
||||||
@postEmoji emoji, =>
|
@postEmoji emoji, =>
|
||||||
|
|
|
@ -90,6 +90,7 @@ class Dispatcher
|
||||||
when 'groups:new', 'groups:edit', 'admin:groups:edit', 'admin:groups:new'
|
when 'groups:new', 'groups:edit', 'admin:groups:edit', 'admin:groups:new'
|
||||||
new GroupAvatar()
|
new GroupAvatar()
|
||||||
when 'projects:tree:show'
|
when 'projects:tree:show'
|
||||||
|
shortcut_handler = new ShortcutsNavigation()
|
||||||
new TreeView()
|
new TreeView()
|
||||||
when 'projects:find_file:show'
|
when 'projects:find_file:show'
|
||||||
shortcut_handler = true
|
shortcut_handler = true
|
||||||
|
|
|
@ -66,7 +66,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.oneline {
|
.oneline {
|
||||||
line-height: 42px;
|
line-height: 35px;
|
||||||
}
|
}
|
||||||
|
|
||||||
> p:last-child {
|
> p:last-child {
|
||||||
|
|
|
@ -158,7 +158,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background: $hover;
|
background: $row-hover;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,8 +48,8 @@
|
||||||
|
|
||||||
.ui-state-hover,
|
.ui-state-hover,
|
||||||
.ui-state-focus {
|
.ui-state-focus {
|
||||||
border: 1px solid $hover;
|
border: 1px solid $row-hover;
|
||||||
background: $hover;
|
background: $row-hover;
|
||||||
color: #333;
|
color: #333;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,7 @@
|
||||||
&.smoke { background-color: $background-color; }
|
&.smoke { background-color: $background-color; }
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background: $hover;
|
background: $row-hover;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:last-child {
|
&:last-child {
|
||||||
|
|
|
@ -5,13 +5,13 @@
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
|
||||||
.timeline-entry {
|
.timeline-entry {
|
||||||
padding: $gl-padding 0;
|
padding: $gl-padding $gl-btn-padding;
|
||||||
border-color: $table-border-color;
|
border-color: $table-border-color;
|
||||||
color: $gl-gray;
|
color: $gl-gray;
|
||||||
border-bottom: 1px solid $border-white-light;
|
border-bottom: 1px solid $border-white-light;
|
||||||
|
|
||||||
&:target {
|
&:target {
|
||||||
background: $hover;
|
background: $row-hover;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:last-child {
|
&:last-child {
|
||||||
|
|
|
@ -70,7 +70,7 @@ $pagination-bg: #fff;
|
||||||
$pagination-border: $border-color;
|
$pagination-border: $border-color;
|
||||||
|
|
||||||
$pagination-hover-color: $gl-gray;
|
$pagination-hover-color: $gl-gray;
|
||||||
$pagination-hover-bg: $hover;
|
$pagination-hover-bg: $row-hover;
|
||||||
$pagination-hover-border: $border-color;
|
$pagination-hover-border: $border-color;
|
||||||
|
|
||||||
$pagination-active-color: $blue-dark;
|
$pagination-active-color: $blue-dark;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
$hover: #faf9f9;
|
$row-hover: #f4f8fe;
|
||||||
$gl-text-color: #54565B;
|
$gl-text-color: #54565B;
|
||||||
$gl-text-green: #4A2;
|
$gl-text-green: #4A2;
|
||||||
$gl-text-red: #D12F19;
|
$gl-text-red: #D12F19;
|
||||||
|
|
|
@ -51,9 +51,17 @@
|
||||||
.profile-link-holder {
|
.profile-link-holder {
|
||||||
display: inline;
|
display: inline;
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: $blue-dark;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Middle dot divider between each element in a list of items.
|
||||||
|
.middle-dot-divider {
|
||||||
&:after {
|
&:after {
|
||||||
content: "\00B7";
|
content: "\00B7"; // Middle Dot
|
||||||
padding: 0px 6px;
|
padding: 0 6px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,11 +71,12 @@
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
a {
|
.profile-user-bio {
|
||||||
color: $blue-dark;
|
// Limits the width of the user bio for readability.
|
||||||
text-decoration: none;
|
max-width: 750px;
|
||||||
}
|
margin: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.modal-profile-crop {
|
.modal-profile-crop {
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
td {
|
td {
|
||||||
background: $hover;
|
background: $row-hover;
|
||||||
}
|
}
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
6
app/controllers/emojis_controller.rb
Normal file
6
app/controllers/emojis_controller.rb
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
class EmojisController < ApplicationController
|
||||||
|
layout false
|
||||||
|
|
||||||
|
def index
|
||||||
|
end
|
||||||
|
end
|
9
app/views/emojis/index.html.haml
Normal file
9
app/views/emojis/index.html.haml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
.emoji-menu
|
||||||
|
.emoji-menu-content
|
||||||
|
= text_field_tag :emoji_search, "", class: "emoji-search search-input form-control"
|
||||||
|
- AwardEmoji.emoji_by_category.each do |category, emojis|
|
||||||
|
%h5= AwardEmoji::CATEGORIES[category]
|
||||||
|
%ul
|
||||||
|
- emojis.each do |emoji|
|
||||||
|
%li
|
||||||
|
= emoji_icon(emoji["name"], emoji["unicode"], emoji["aliases"])
|
|
@ -1,11 +1,12 @@
|
||||||
.top-area
|
.top-area
|
||||||
.nav-controls
|
.nav-controls
|
||||||
= form_tag request.original_url, method: :get, class: 'project-filter-form', id: 'project-filter-form' do |f|
|
= form_tag request.original_url, method: :get, class: 'project-filter-form', id: 'project-filter-form' do |f|
|
||||||
= search_field_tag :filter_projects, params[:filter_projects], placeholder: 'Filter by name...', class: 'input-short project-filter-form-field form-control projects-list-filter', spellcheck: false, id: 'project-filter-form-field'
|
- if @projects.present?
|
||||||
- if current_user && current_user.can_create_project?
|
= search_field_tag :filter_projects, nil, placeholder: 'Filter by name', class: 'projects-list-filter form-control', spellcheck: false
|
||||||
= link_to new_project_path, class: 'btn btn-new' do
|
- if can? current_user, :create_projects, @group
|
||||||
= icon('plus')
|
= link_to new_project_path(namespace_id: @group.id), class: 'btn btn-new pull-right' do
|
||||||
New Project
|
= icon('plus')
|
||||||
|
New Project
|
||||||
|
|
||||||
.projects-list-holder
|
.projects-list-holder
|
||||||
= render 'shared/projects/list', projects: @projects, projects_limit: 20, stars: false, skip_namespace: true
|
= render 'shared/projects/list', projects: @projects, projects_limit: 20, stars: false, skip_namespace: true
|
||||||
|
|
|
@ -32,10 +32,9 @@
|
||||||
%li.active
|
%li.active
|
||||||
= link_to "#activity", 'data-toggle' => 'tab' do
|
= link_to "#activity", 'data-toggle' => 'tab' do
|
||||||
Activity
|
Activity
|
||||||
- if @projects.present?
|
%li
|
||||||
%li
|
= link_to "#projects", 'data-toggle' => 'tab' do
|
||||||
= link_to "#projects", 'data-toggle' => 'tab' do
|
Projects
|
||||||
Projects
|
|
||||||
|
|
||||||
- if can?(current_user, :read_group, @group)
|
- if can?(current_user, :read_group, @group)
|
||||||
%div{ class: container_class }
|
%div{ class: container_class }
|
||||||
|
|
|
@ -35,35 +35,37 @@
|
||||||
= @user.name
|
= @user.name
|
||||||
|
|
||||||
.cover-desc
|
.cover-desc
|
||||||
%span
|
%span.middle-dot-divider
|
||||||
@#{@user.username}.
|
@#{@user.username}
|
||||||
- if @user.bio.present?
|
%span.middle-dot-divider
|
||||||
%span
|
|
||||||
#{@user.bio}.
|
|
||||||
%span
|
|
||||||
Member since #{@user.created_at.to_s(:medium)}
|
Member since #{@user.created_at.to_s(:medium)}
|
||||||
|
|
||||||
|
- if @user.bio.present?
|
||||||
|
.cover-desc
|
||||||
|
%p.profile-user-bio
|
||||||
|
= @user.bio
|
||||||
|
|
||||||
.cover-desc
|
.cover-desc
|
||||||
- unless @user.public_email.blank?
|
- unless @user.public_email.blank?
|
||||||
.profile-link-holder
|
.profile-link-holder.middle-dot-divider
|
||||||
= link_to @user.public_email, "mailto:#{@user.public_email}"
|
= link_to @user.public_email, "mailto:#{@user.public_email}"
|
||||||
- unless @user.skype.blank?
|
- unless @user.skype.blank?
|
||||||
.profile-link-holder
|
.profile-link-holder.middle-dot-divider
|
||||||
= link_to "skype:#{@user.skype}", title: "Skype" do
|
= link_to "skype:#{@user.skype}", title: "Skype" do
|
||||||
= icon('skype')
|
= icon('skype')
|
||||||
- unless @user.linkedin.blank?
|
- unless @user.linkedin.blank?
|
||||||
.profile-link-holder
|
.profile-link-holder.middle-dot-divider
|
||||||
= link_to "https://www.linkedin.com/in/#{@user.linkedin}", title: "LinkedIn" do
|
= link_to "https://www.linkedin.com/in/#{@user.linkedin}", title: "LinkedIn" do
|
||||||
= icon('linkedin-square')
|
= icon('linkedin-square')
|
||||||
- unless @user.twitter.blank?
|
- unless @user.twitter.blank?
|
||||||
.profile-link-holder
|
.profile-link-holder.middle-dot-divider
|
||||||
= link_to "https://twitter.com/#{@user.twitter}", title: "Twitter" do
|
= link_to "https://twitter.com/#{@user.twitter}", title: "Twitter" do
|
||||||
= icon('twitter-square')
|
= icon('twitter-square')
|
||||||
- unless @user.website_url.blank?
|
- unless @user.website_url.blank?
|
||||||
.profile-link-holder
|
.profile-link-holder.middle-dot-divider
|
||||||
= link_to @user.short_website_url, @user.full_website_url
|
= link_to @user.short_website_url, @user.full_website_url
|
||||||
- unless @user.location.blank?
|
- unless @user.location.blank?
|
||||||
.profile-link-holder
|
.profile-link-holder.middle-dot-divider
|
||||||
= icon('map-marker')
|
= icon('map-marker')
|
||||||
= @user.location
|
= @user.location
|
||||||
|
|
||||||
|
|
|
@ -9,15 +9,6 @@
|
||||||
.awards-controls
|
.awards-controls
|
||||||
%a.add-award{"href" => "#"}
|
%a.add-award{"href" => "#"}
|
||||||
= icon('smile-o')
|
= icon('smile-o')
|
||||||
.emoji-menu
|
|
||||||
.emoji-menu-content
|
|
||||||
= text_field_tag :emoji_search, "", class: "emoji-search search-input form-control"
|
|
||||||
- AwardEmoji.emoji_by_category.each do |category, emojis|
|
|
||||||
%h5= AwardEmoji::CATEGORIES[category]
|
|
||||||
%ul
|
|
||||||
- emojis.each do |emoji|
|
|
||||||
%li
|
|
||||||
= emoji_icon(emoji["name"], emoji["unicode"], emoji["aliases"])
|
|
||||||
|
|
||||||
- if current_user
|
- if current_user
|
||||||
:javascript
|
:javascript
|
||||||
|
|
16
config/newrelic.yml
Normal file
16
config/newrelic.yml
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
# New Relic configuration file
|
||||||
|
#
|
||||||
|
# This file is here to make sure the New Relic gem stays
|
||||||
|
# quiet by default.
|
||||||
|
#
|
||||||
|
# To enable and configure New Relic, please use
|
||||||
|
# environment variables, e.g. NEW_RELIC_ENABLED=true
|
||||||
|
|
||||||
|
production:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
development:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
test:
|
||||||
|
enabled: false
|
|
@ -43,6 +43,8 @@ Rails.application.routes.draw do
|
||||||
get '/autocomplete/users' => 'autocomplete#users'
|
get '/autocomplete/users' => 'autocomplete#users'
|
||||||
get '/autocomplete/users/:id' => 'autocomplete#user'
|
get '/autocomplete/users/:id' => 'autocomplete#user'
|
||||||
|
|
||||||
|
# Emojis
|
||||||
|
resources :emojis, only: :index
|
||||||
|
|
||||||
# Search
|
# Search
|
||||||
get 'search' => 'search#show'
|
get 'search' => 'search#show'
|
||||||
|
|
|
@ -43,10 +43,16 @@ Feature: Event Filters
|
||||||
And I should not see new member event
|
And I should not see new member event
|
||||||
When I click "team" event filter
|
When I click "team" event filter
|
||||||
And I visit dashboard activity page
|
And I visit dashboard activity page
|
||||||
Then I should see push event
|
|
||||||
And I should see new member event
|
|
||||||
And I should not see merge request event
|
|
||||||
When I click "push" event filter
|
|
||||||
Then I should not see push event
|
Then I should not see push event
|
||||||
And I should see new member event
|
And I should see new member event
|
||||||
And I should not see merge request event
|
And I should not see merge request event
|
||||||
|
When I click "push" event filter
|
||||||
|
And I visit dashboard activity page
|
||||||
|
Then I should see push event
|
||||||
|
And I should not see new member event
|
||||||
|
And I should not see merge request event
|
||||||
|
When I click "merge" event filter
|
||||||
|
And I visit dashboard activity page
|
||||||
|
Then I should see merge request event
|
||||||
|
And I should not see push event
|
||||||
|
And I should not see new member event
|
||||||
|
|
|
@ -96,6 +96,7 @@ class Spinach::Features::AwardEmoji < Spinach::FeatureSteps
|
||||||
end
|
end
|
||||||
|
|
||||||
step 'The search field is focused' do
|
step 'The search field is focused' do
|
||||||
page.evaluate_script("document.activeElement.id").should eq "emoji_search"
|
expect(page).to have_selector('#emoji_search')
|
||||||
|
expect(page.evaluate_script('document.activeElement.id')).to eq('emoji_search')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue