diff --git a/CHANGELOG b/CHANGELOG index d3280c5d0a1..4abe86f8ced 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,7 +1,25 @@ Please view this file on the master branch, on stable branches it's out of date. 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) + - 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 - Fix duplicate "me" in tooltip of the "thumbsup" awards Emoji (Stan Hu) diff --git a/Gemfile b/Gemfile index 99bdc386567..e37651f6fb3 100644 --- a/Gemfile +++ b/Gemfile @@ -306,6 +306,8 @@ group :production do gem "gitlab_meta", '7.0' end +gem "newrelic_rpm", '~> 3.14' + gem 'octokit', '~> 3.8.0' gem "mail_room", "~> 0.6.1" diff --git a/Gemfile.lock b/Gemfile.lock index 41400ff9825..bd220146bf7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -480,6 +480,7 @@ GEM net-ldap (0.12.1) net-ssh (3.0.1) netrc (0.11.0) + newrelic_rpm (3.14.1.311) nokogiri (1.6.7.2) mini_portile2 (~> 2.0.0.rc2) nprogress-rails (0.1.6.7) @@ -962,6 +963,7 @@ DEPENDENCIES nested_form (~> 0.3.2) net-ssh (~> 3.0.1) nokogiri (~> 1.6.7, >= 1.6.7.2) + newrelic_rpm (~> 3.14) nprogress-rails (~> 0.1.6.7) oauth2 (~> 1.0.0) octokit (~> 3.8.0) diff --git a/app/assets/javascripts/activities.js.coffee b/app/assets/javascripts/activities.js.coffee index 3b6b453ac51..5092e824e65 100644 --- a/app/assets/javascripts/activities.js.coffee +++ b/app/assets/javascripts/activities.js.coffee @@ -1,7 +1,7 @@ class @Activities constructor: -> Pager.init 20, true - $(".event-filter a").bind "click", (event) => + $(".event-filter-link").on "click", (event) => event.preventDefault() @toggleFilter($(event.currentTarget)) @reloadActivities() @@ -12,18 +12,10 @@ class @Activities toggleFilter: (sender) -> - sender.closest('li').toggleClass "active" + $('.event-filter .active').removeClass "active" event_filters = $.cookie("event_filter") filter = sender.attr("id").split("_")[0] - if event_filters - event_filters = event_filters.split(",") - else - event_filters = new Array() + $.cookie "event_filter", (if event_filters isnt filter then filter else ""), { path: '/' } - index = event_filters.indexOf(filter) - if index is -1 - event_filters.push filter - else - event_filters.splice index, 1 - - $.cookie "event_filter", event_filters.join(","), { path: '/' } + if event_filters isnt filter + sender.closest('li').toggleClass "active" diff --git a/app/assets/javascripts/awards_handler.coffee b/app/assets/javascripts/awards_handler.coffee index 360acb864f6..8f89d3e61a2 100644 --- a/app/assets/javascripts/awards_handler.coffee +++ b/app/assets/javascripts/awards_handler.coffee @@ -1,10 +1,10 @@ class @AwardsHandler constructor: (@post_emoji_url, @noteable_type, @noteable_id, @aliases) -> - $(".add-award").click (event)-> + $(".add-award").click (event) => event.stopPropagation() event.preventDefault() - $(".emoji-menu").show() - $("#emoji_search").focus() + + @showEmojiMenu() $("html").on 'click', (event) -> if !$(event.target).closest(".emoji-menu").length @@ -14,6 +14,16 @@ class @AwardsHandler @renderFrequentlyUsedBlock() @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) -> emoji = @normilizeEmojiName(emoji) @postEmoji emoji, => diff --git a/app/assets/javascripts/dispatcher.js.coffee b/app/assets/javascripts/dispatcher.js.coffee index 4c6cf3417e8..89f1993797f 100644 --- a/app/assets/javascripts/dispatcher.js.coffee +++ b/app/assets/javascripts/dispatcher.js.coffee @@ -90,6 +90,7 @@ class Dispatcher when 'groups:new', 'groups:edit', 'admin:groups:edit', 'admin:groups:new' new GroupAvatar() when 'projects:tree:show' + shortcut_handler = new ShortcutsNavigation() new TreeView() when 'projects:find_file:show' shortcut_handler = true diff --git a/app/assets/stylesheets/framework/blocks.scss b/app/assets/stylesheets/framework/blocks.scss index bd89cc7dc1d..d7e4153ddc0 100644 --- a/app/assets/stylesheets/framework/blocks.scss +++ b/app/assets/stylesheets/framework/blocks.scss @@ -66,7 +66,7 @@ } .oneline { - line-height: 42px; + line-height: 35px; } > p:last-child { diff --git a/app/assets/stylesheets/framework/files.scss b/app/assets/stylesheets/framework/files.scss index c7f3604850d..07907e6e5a6 100644 --- a/app/assets/stylesheets/framework/files.scss +++ b/app/assets/stylesheets/framework/files.scss @@ -158,7 +158,7 @@ } &:hover { - background: $hover; + background: $row-hover; } } } diff --git a/app/assets/stylesheets/framework/jquery.scss b/app/assets/stylesheets/framework/jquery.scss index d6cd78813c0..0cdcd923b3c 100644 --- a/app/assets/stylesheets/framework/jquery.scss +++ b/app/assets/stylesheets/framework/jquery.scss @@ -48,8 +48,8 @@ .ui-state-hover, .ui-state-focus { - border: 1px solid $hover; - background: $hover; + border: 1px solid $row-hover; + background: $row-hover; color: #333; } } diff --git a/app/assets/stylesheets/framework/lists.scss b/app/assets/stylesheets/framework/lists.scss index 5c65383ec1a..354392d5ec3 100644 --- a/app/assets/stylesheets/framework/lists.scss +++ b/app/assets/stylesheets/framework/lists.scss @@ -38,7 +38,7 @@ &.smoke { background-color: $background-color; } &:hover { - background: $hover; + background: $row-hover; } &:last-child { diff --git a/app/assets/stylesheets/framework/timeline.scss b/app/assets/stylesheets/framework/timeline.scss index 47b843e5e3d..aa244fe548d 100644 --- a/app/assets/stylesheets/framework/timeline.scss +++ b/app/assets/stylesheets/framework/timeline.scss @@ -5,13 +5,13 @@ padding: 0; .timeline-entry { - padding: $gl-padding 0; + padding: $gl-padding $gl-btn-padding; border-color: $table-border-color; color: $gl-gray; border-bottom: 1px solid $border-white-light; &:target { - background: $hover; + background: $row-hover; } &:last-child { diff --git a/app/assets/stylesheets/framework/tw_bootstrap_variables.scss b/app/assets/stylesheets/framework/tw_bootstrap_variables.scss index 33270388e64..b1b8295411b 100644 --- a/app/assets/stylesheets/framework/tw_bootstrap_variables.scss +++ b/app/assets/stylesheets/framework/tw_bootstrap_variables.scss @@ -70,7 +70,7 @@ $pagination-bg: #fff; $pagination-border: $border-color; $pagination-hover-color: $gl-gray; -$pagination-hover-bg: $hover; +$pagination-hover-bg: $row-hover; $pagination-hover-border: $border-color; $pagination-active-color: $blue-dark; diff --git a/app/assets/stylesheets/framework/variables.scss b/app/assets/stylesheets/framework/variables.scss index 04db0da73d1..4d72c7e905e 100644 --- a/app/assets/stylesheets/framework/variables.scss +++ b/app/assets/stylesheets/framework/variables.scss @@ -1,4 +1,4 @@ -$hover: #faf9f9; +$row-hover: #f4f8fe; $gl-text-color: #54565B; $gl-text-green: #4A2; $gl-text-red: #D12F19; diff --git a/app/assets/stylesheets/pages/profile.scss b/app/assets/stylesheets/pages/profile.scss index 67fbbef73ae..de4d9fd80fa 100644 --- a/app/assets/stylesheets/pages/profile.scss +++ b/app/assets/stylesheets/pages/profile.scss @@ -51,9 +51,17 @@ .profile-link-holder { display: inline; + a { + color: $blue-dark; + text-decoration: none; + } +} + +// Middle dot divider between each element in a list of items. +.middle-dot-divider { &:after { - content: "\00B7"; - padding: 0px 6px; + content: "\00B7"; // Middle Dot + padding: 0 6px; font-weight: bold; } @@ -63,11 +71,12 @@ padding: 0; } } +} - a { - color: $blue-dark; - text-decoration: none; - } +.profile-user-bio { + // Limits the width of the user bio for readability. + max-width: 750px; + margin: auto; } .modal-profile-crop { diff --git a/app/assets/stylesheets/pages/tree.scss b/app/assets/stylesheets/pages/tree.scss index c7411617cb3..ef63b010600 100644 --- a/app/assets/stylesheets/pages/tree.scss +++ b/app/assets/stylesheets/pages/tree.scss @@ -21,7 +21,7 @@ &:hover { td { - background: $hover; + background: $row-hover; } cursor: pointer; } diff --git a/app/controllers/emojis_controller.rb b/app/controllers/emojis_controller.rb new file mode 100644 index 00000000000..1bec5a7d27f --- /dev/null +++ b/app/controllers/emojis_controller.rb @@ -0,0 +1,6 @@ +class EmojisController < ApplicationController + layout false + + def index + end +end diff --git a/app/views/emojis/index.html.haml b/app/views/emojis/index.html.haml new file mode 100644 index 00000000000..b66e513e4d2 --- /dev/null +++ b/app/views/emojis/index.html.haml @@ -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"]) \ No newline at end of file diff --git a/app/views/groups/_projects.html.haml b/app/views/groups/_projects.html.haml index 9c16ab7e30f..209729dc7ee 100644 --- a/app/views/groups/_projects.html.haml +++ b/app/views/groups/_projects.html.haml @@ -1,11 +1,12 @@ .top-area .nav-controls = 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 current_user && current_user.can_create_project? - = link_to new_project_path, class: 'btn btn-new' do - = icon('plus') - New Project + - if @projects.present? + = search_field_tag :filter_projects, nil, placeholder: 'Filter by name', class: 'projects-list-filter form-control', spellcheck: false + - if can? current_user, :create_projects, @group + = link_to new_project_path(namespace_id: @group.id), class: 'btn btn-new pull-right' do + = icon('plus') + New Project .projects-list-holder = render 'shared/projects/list', projects: @projects, projects_limit: 20, stars: false, skip_namespace: true diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml index a0ba11b11a1..6148d8cb3d2 100644 --- a/app/views/groups/show.html.haml +++ b/app/views/groups/show.html.haml @@ -32,10 +32,9 @@ %li.active = link_to "#activity", 'data-toggle' => 'tab' do Activity - - if @projects.present? - %li - = link_to "#projects", 'data-toggle' => 'tab' do - Projects + %li + = link_to "#projects", 'data-toggle' => 'tab' do + Projects - if can?(current_user, :read_group, @group) %div{ class: container_class } diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml index 3bfd781e51d..d109635fa1e 100644 --- a/app/views/users/show.html.haml +++ b/app/views/users/show.html.haml @@ -35,35 +35,37 @@ = @user.name .cover-desc - %span - @#{@user.username}. - - if @user.bio.present? - %span - #{@user.bio}. - %span + %span.middle-dot-divider + @#{@user.username} + %span.middle-dot-divider Member since #{@user.created_at.to_s(:medium)} + + - if @user.bio.present? + .cover-desc + %p.profile-user-bio + = @user.bio .cover-desc - unless @user.public_email.blank? - .profile-link-holder + .profile-link-holder.middle-dot-divider = link_to @user.public_email, "mailto:#{@user.public_email}" - unless @user.skype.blank? - .profile-link-holder + .profile-link-holder.middle-dot-divider = link_to "skype:#{@user.skype}", title: "Skype" do = icon('skype') - 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 = icon('linkedin-square') - unless @user.twitter.blank? - .profile-link-holder + .profile-link-holder.middle-dot-divider = link_to "https://twitter.com/#{@user.twitter}", title: "Twitter" do = icon('twitter-square') - unless @user.website_url.blank? - .profile-link-holder + .profile-link-holder.middle-dot-divider = link_to @user.short_website_url, @user.full_website_url - unless @user.location.blank? - .profile-link-holder + .profile-link-holder.middle-dot-divider = icon('map-marker') = @user.location diff --git a/app/views/votes/_votes_block.html.haml b/app/views/votes/_votes_block.html.haml index 91c5b7eac5e..176fd29cb57 100644 --- a/app/views/votes/_votes_block.html.haml +++ b/app/views/votes/_votes_block.html.haml @@ -9,15 +9,6 @@ .awards-controls %a.add-award{"href" => "#"} = 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 :javascript diff --git a/config/newrelic.yml b/config/newrelic.yml new file mode 100644 index 00000000000..9ef922a38d9 --- /dev/null +++ b/config/newrelic.yml @@ -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 diff --git a/config/routes.rb b/config/routes.rb index 30681356c5f..1485b64da19 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -43,6 +43,8 @@ Rails.application.routes.draw do get '/autocomplete/users' => 'autocomplete#users' get '/autocomplete/users/:id' => 'autocomplete#user' + # Emojis + resources :emojis, only: :index # Search get 'search' => 'search#show' diff --git a/features/dashboard/event_filters.feature b/features/dashboard/event_filters.feature index 96399ea21a6..8c3ff64164f 100644 --- a/features/dashboard/event_filters.feature +++ b/features/dashboard/event_filters.feature @@ -43,10 +43,16 @@ Feature: Event Filters And I should not see new member event When I click "team" event filter 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 And I should see new member 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 diff --git a/features/steps/project/issues/award_emoji.rb b/features/steps/project/issues/award_emoji.rb index 93cf608cc62..277c63914d1 100644 --- a/features/steps/project/issues/award_emoji.rb +++ b/features/steps/project/issues/award_emoji.rb @@ -96,6 +96,7 @@ class Spinach::Features::AwardEmoji < Spinach::FeatureSteps end 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