From 3861a8c5fca96bf374e1f210a4e2082be01485f7 Mon Sep 17 00:00:00 2001 From: Clement Ho Date: Mon, 8 Aug 2016 10:41:15 -0500 Subject: [PATCH 01/50] Fix button missing type --- CHANGELOG | 1 + app/views/projects/issues/show.html.haml | 2 +- app/views/projects/merge_requests/show/_mr_title.html.haml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 77bcea54cf9..a21f92bb40b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -56,6 +56,7 @@ v 8.11.0 (unreleased) - Add the `sprockets-es6` gem - Multiple trigger variables show in separate lines (Katarzyna Kobierska Ula Budziszewska) - Profile requests when a header is passed + - Fix button missing type (ClemMakesApps) - Avoid calculation of line_code and position for _line partial when showing diff notes on discussion tab. - Speedup DiffNote#active? on discussions, preloading noteables and avoid touching git repository to return diff_refs when possible - Add commit stats in commit api. !5517 (dixpac) diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml index e5cce16a171..2f248fbfc1d 100644 --- a/app/views/projects/issues/show.html.haml +++ b/app/views/projects/issues/show.html.haml @@ -22,7 +22,7 @@ - if can?(current_user, :create_issue, @project) || can?(current_user, :update_issue, @issue) .issuable-actions .clearfix.issue-btn-group.dropdown - %button.btn.btn-default.pull-left.hidden-md.hidden-lg{ data: { toggle: "dropdown" } } + %button.btn.btn-default.pull-left.hidden-md.hidden-lg{ type: "button", data: { toggle: "dropdown" } } %span.caret Options .dropdown-menu.dropdown-menu-align-right.hidden-lg diff --git a/app/views/projects/merge_requests/show/_mr_title.html.haml b/app/views/projects/merge_requests/show/_mr_title.html.haml index b24bdf22ceb..098ce19da21 100644 --- a/app/views/projects/merge_requests/show/_mr_title.html.haml +++ b/app/views/projects/merge_requests/show/_mr_title.html.haml @@ -14,7 +14,7 @@ - if can?(current_user, :update_merge_request, @merge_request) .issuable-actions .clearfix.issue-btn-group.dropdown - %button.btn.btn-default.pull-left.hidden-md.hidden-lg{ data: { toggle: "dropdown" } } + %button.btn.btn-default.pull-left.hidden-md.hidden-lg{ type: "button", data: { toggle: "dropdown" } } %span.caret Options .dropdown-menu.dropdown-menu-align-right.hidden-lg From c887d2131f02ffe88722d276e3a8cf3bcf9a74f2 Mon Sep 17 00:00:00 2001 From: Connor Shea Date: Mon, 8 Aug 2016 10:36:32 -0600 Subject: [PATCH 02/50] Fix small image previews in the file viewer. See also https://gitlab.com/gitlab-org/gitlab-ce/issues/20505#note_13670085 --- app/assets/stylesheets/framework/files.scss | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/framework/files.scss b/app/assets/stylesheets/framework/files.scss index 407f1873431..1ccc331458b 100644 --- a/app/assets/stylesheets/framework/files.scss +++ b/app/assets/stylesheets/framework/files.scss @@ -63,9 +63,10 @@ &.image_file { background: #eee; text-align: center; + img { - padding: 100px; - max-width: 50%; + padding: 20px; + max-width: 100%; } } From 9cb3fcda281853f5bdbb4c3a716a875ce72928e4 Mon Sep 17 00:00:00 2001 From: Clement Ho Date: Tue, 9 Aug 2016 11:58:42 -0500 Subject: [PATCH 03/50] Fix spacing and vertical alignment on build status icon on commits page --- CHANGELOG | 1 + app/assets/stylesheets/pages/commit.scss | 20 +++++++++++++++++++ .../projects/commit/_commit_box.html.haml | 3 ++- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 77bcea54cf9..62b8c9e0ac1 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -52,6 +52,7 @@ v 8.11.0 (unreleased) - Gitlab::Metrics.current_transaction needs to be public for RailsQueueDuration - Fix search for notes which belongs to deleted objects - Add GitLab Workhorse version to admin dashboard (Katarzyna Kobierska Ula Budziszewska) + - Fix spacing and vertical alignment on build status icon on commits page (ClemMakesApps) - Allow branch names ending with .json for graph and network page !5579 (winniehell) - Add the `sprockets-es6` gem - Multiple trigger variables show in separate lines (Katarzyna Kobierska Ula Budziszewska) diff --git a/app/assets/stylesheets/pages/commit.scss b/app/assets/stylesheets/pages/commit.scss index bbe0c6c5f1f..fe8a8025038 100644 --- a/app/assets/stylesheets/pages/commit.scss +++ b/app/assets/stylesheets/pages/commit.scss @@ -66,6 +66,26 @@ margin-left: 8px; } } + + .ci-status-link { + margin-left: 2px; + + svg { + vertical-align: middle; + } + + .ci-status-label { + display: inline-block; + } + + &:hover { + text-decoration: none; + + .ci-status-label { + text-decoration: underline; + } + } + } } .ci-status-link { diff --git a/app/views/projects/commit/_commit_box.html.haml b/app/views/projects/commit/_commit_box.html.haml index 3ad866bb2f1..14adee7a6e9 100644 --- a/app/views/projects/commit/_commit_box.html.haml +++ b/app/views/projects/commit/_commit_box.html.haml @@ -56,7 +56,8 @@ = pluralize(@commit.pipelines.count, 'pipeline') = link_to builds_namespace_project_commit_path(@project.namespace, @project, @commit.id), class: "ci-status-link ci-status-icon-#{@commit.status}" do = ci_icon_for_status(@commit.status) - = ci_label_for_status(@commit.status) + %span.ci-status-label + = ci_label_for_status(@commit.status) - if @commit.pipelines.duration in = time_interval_in_words @commit.pipelines.duration From 761031c974de2c389ddc589a16776acd0b293030 Mon Sep 17 00:00:00 2001 From: Connor Shea Date: Fri, 12 Aug 2016 11:02:46 -0600 Subject: [PATCH 04/50] Decrease max-width for image previews to 80%. --- app/assets/stylesheets/framework/files.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/stylesheets/framework/files.scss b/app/assets/stylesheets/framework/files.scss index 1ccc331458b..d3e3fc50736 100644 --- a/app/assets/stylesheets/framework/files.scss +++ b/app/assets/stylesheets/framework/files.scss @@ -66,7 +66,7 @@ img { padding: 20px; - max-width: 100%; + max-width: 80%; } } From 3eba2e4f70f18f2a86d0134e264e963d67cbac45 Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Date: Thu, 4 Aug 2016 14:29:45 -0500 Subject: [PATCH 05/50] Wrap single lines of code; horizontally scroll multi-line code blocks --- CHANGELOG | 1 + app/assets/stylesheets/framework/typography.scss | 10 +++++++++- app/assets/stylesheets/pages/detail_page.scss | 8 ++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 96965a20f69..11ca5a414bc 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -95,6 +95,7 @@ v 8.11.0 (unreleased) - Sensible state specific default sort order for issues and merge requests !5453 (tomb0y) - Fix bug where destroying a namespace would not always destroy projects - Fix RequestProfiler::Middleware error when code is reloaded in development + - Allow horizontal scrolling of code blocks in issue body - Catch what warden might throw when profiling requests to re-throw it - Avoid commit lookup on diff_helper passing existing local variable to the helper method - Add description to new_issue email and new_merge_request_email in text/plain content type. !5663 (dixpac) diff --git a/app/assets/stylesheets/framework/typography.scss b/app/assets/stylesheets/framework/typography.scss index 8659604cb8b..06874a993fa 100644 --- a/app/assets/stylesheets/framework/typography.scss +++ b/app/assets/stylesheets/framework/typography.scss @@ -14,12 +14,20 @@ margin-top: 0; } + // Single code lines should wrap code { font-family: $monospace_font; - white-space: pre; + white-space: pre-wrap; word-wrap: normal; } + // Multi-line code blocks should scroll horizontally + pre { + code { + white-space: pre; + } + } + kbd { display: inline-block; padding: 3px 5px; diff --git a/app/assets/stylesheets/pages/detail_page.scss b/app/assets/stylesheets/pages/detail_page.scss index 1b389d83525..742984d6c7a 100644 --- a/app/assets/stylesheets/pages/detail_page.scss +++ b/app/assets/stylesheets/pages/detail_page.scss @@ -36,9 +36,17 @@ } .wiki { + // Single lines of code should wrap code { white-space: pre-wrap; word-break: keep-all; } + + // Code blocks should scroll horizontally + pre { + code { + white-space: pre; + } + } } } From 4d757ea5020dbace177bb0e9773046ee939396de Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Date: Thu, 4 Aug 2016 14:57:29 -0500 Subject: [PATCH 06/50] Remove unneeded code --- app/assets/stylesheets/pages/detail_page.scss | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/app/assets/stylesheets/pages/detail_page.scss b/app/assets/stylesheets/pages/detail_page.scss index 742984d6c7a..4d9c73c6840 100644 --- a/app/assets/stylesheets/pages/detail_page.scss +++ b/app/assets/stylesheets/pages/detail_page.scss @@ -34,19 +34,4 @@ } } } - - .wiki { - // Single lines of code should wrap - code { - white-space: pre-wrap; - word-break: keep-all; - } - - // Code blocks should scroll horizontally - pre { - code { - white-space: pre; - } - } - } } From 15bbab880eb9673b8120f6a34f3c145a88a58a53 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 15 Aug 2016 15:43:04 +0000 Subject: [PATCH 07/50] Add test requirement for new files --- CONTRIBUTING.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fbc8e15bebf..b393e4157a9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -387,7 +387,9 @@ description area. Copy-paste it to retain the markdown format. 1. The change is as small as possible 1. Include proper tests and make all tests pass (unless it contains a test - exposing a bug in existing code) + exposing a bug in existing code). Every new file with code you created + must have a corresponging file with tests even if functionality is + already tested somewhere else. 1. If you suspect a failing CI build is unrelated to your contribution, you may try and restart the failing CI job or ask a developer to fix the aforementioned failing test From fdf283ab2e504a40aaac3ff5c38a8445d2047c44 Mon Sep 17 00:00:00 2001 From: Clement Ho Date: Mon, 15 Aug 2016 13:41:55 -0500 Subject: [PATCH 08/50] Fix commit mention font inconsistency --- CHANGELOG | 1 + app/assets/stylesheets/framework/gfm.scss | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index ccc60846787..28bae17e5c3 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -19,6 +19,7 @@ v 8.11.0 (unreleased) - Ignore URLs starting with // in Markdown links !5677 (winniehell) - Fix CI status icon link underline (ClemMakesApps) - The Repository class is now instrumented + - Fix commit mention font inconsistency (ClemMakesApps) - Fix filter label tooltip HTML rendering (ClemMakesApps) - Cache the commit author in RequestStore to avoid extra lookups in PostReceive - Expand commit message width in repo view (ClemMakesApps) diff --git a/app/assets/stylesheets/framework/gfm.scss b/app/assets/stylesheets/framework/gfm.scss index f4d35c4b4b1..c0de09f3968 100644 --- a/app/assets/stylesheets/framework/gfm.scss +++ b/app/assets/stylesheets/framework/gfm.scss @@ -2,7 +2,7 @@ * Styles that apply to all GFM related forms. */ -.gfm-commit, .gfm-commit_range { +.gfm-commit_range { font-family: $monospace_font; font-size: 90%; } From 054d8fba0347c37c1c85629e31aca89833b9ee57 Mon Sep 17 00:00:00 2001 From: Clement Ho Date: Fri, 5 Aug 2016 14:51:29 -0500 Subject: [PATCH 09/50] Fix branch title trailing space on hover --- CHANGELOG | 1 + app/views/projects/branches/_branch.html.haml | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index e9c8a4895e1..35cff98afd0 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -44,6 +44,7 @@ v 8.11.0 (unreleased) - Add hover state to todos !5361 (winniehell) - Limit git rev-list output count to one in forced push check - Show deployment status on merge requests with external URLs + - Fix branch title trailing space on hover (ClemMakesApps) - Clean up unused routes (Josef Strzibny) - Fix issue on empty project to allow developers to only push to protected branches if given permission - Add green outline to New Branch button. !5447 (winniehell) diff --git a/app/views/projects/branches/_branch.html.haml b/app/views/projects/branches/_branch.html.haml index 4bd85061240..6192ccb710b 100644 --- a/app/views/projects/branches/_branch.html.haml +++ b/app/views/projects/branches/_branch.html.haml @@ -5,8 +5,8 @@ - number_commits_ahead = diverging_commit_counts[:ahead] %li(class="js-branch-#{branch.name}") %div - = link_to namespace_project_tree_path(@project.namespace, @project, branch.name) do - %span.item-title.str-truncated= branch.name + = link_to namespace_project_tree_path(@project.namespace, @project, branch.name), class: 'item-title str-truncated' do + = branch.name   - if branch.name == @repository.root_ref %span.label.label-primary default From 41d598ce5004d23c6af7961284cfd9055297ba09 Mon Sep 17 00:00:00 2001 From: Connor Shea Date: Mon, 1 Aug 2016 13:56:56 -0600 Subject: [PATCH 10/50] Initial implementation of an async branch dropdown for Revert and Cherry Pick. --- app/assets/stylesheets/framework/modal.scss | 1 - app/controllers/projects/branches_controller.rb | 7 +++++++ app/views/projects/commit/_change.html.haml | 9 ++++++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/framework/modal.scss b/app/assets/stylesheets/framework/modal.scss index 26ad2870aa0..8374f30d0b2 100644 --- a/app/assets/stylesheets/framework/modal.scss +++ b/app/assets/stylesheets/framework/modal.scss @@ -1,6 +1,5 @@ .modal-body { position: relative; - overflow-y: auto; padding: 15px; .form-actions { diff --git a/app/controllers/projects/branches_controller.rb b/app/controllers/projects/branches_controller.rb index 48fe81b0d74..462d4e461e1 100644 --- a/app/controllers/projects/branches_controller.rb +++ b/app/controllers/projects/branches_controller.rb @@ -15,6 +15,13 @@ class Projects::BranchesController < Projects::ApplicationController diverging_commit_counts = repository.diverging_commit_counts(branch) [memo, diverging_commit_counts[:behind], diverging_commit_counts[:ahead]].max end + + respond_to do |format| + format.html + format.json do + render json: @repository.branch_names.to_json + end + end end def recent diff --git a/app/views/projects/commit/_change.html.haml b/app/views/projects/commit/_change.html.haml index d9b800a4ded..f5407bdbc7b 100644 --- a/app/views/projects/commit/_change.html.haml +++ b/app/views/projects/commit/_change.html.haml @@ -17,7 +17,14 @@ .form-group.branch = label_tag 'target_branch', target_label, class: 'control-label' .col-sm-10 - = select_tag "target_branch", project_branches, class: "select2 select2-sm js-target-branch" + .dropdown + = dropdown_toggle @project.default_branch, { toggle: "dropdown", selected: @project.default_branch, ref: @ref, refs_url: branches_namespace_project_path(@project.namespace, @project) }, { toggle_class: "js-project-refs-dropdown js-target-branch" } + .dropdown-menu.dropdown-menu-selectable + = dropdown_title "Switch branch" + = dropdown_filter "Search branches" + = dropdown_content + = dropdown_loading + - if can?(current_user, :push_code, @project) .js-create-merge-request-container .checkbox From f4eda673c5d7f98919e74a4542e13ac1bcfdd76d Mon Sep 17 00:00:00 2001 From: Connor Shea Date: Mon, 1 Aug 2016 16:07:08 -0600 Subject: [PATCH 11/50] Make the ref-selector function work properly for branch selection. --- app/assets/javascripts/project.js | 5 +++-- app/views/projects/commit/_change.html.haml | 9 ++------- app/views/shared/_ref_switcher.html.haml | 2 +- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/app/assets/javascripts/project.js b/app/assets/javascripts/project.js index b97f6d22715..4e1de4dfb72 100644 --- a/app/assets/javascripts/project.js +++ b/app/assets/javascripts/project.js @@ -65,7 +65,8 @@ url: $dropdown.data('refs-url'), data: { ref: $dropdown.data('ref') - } + }, + dataType: "json" }).done(function(refs) { return callback(refs); }); @@ -73,7 +74,7 @@ selectable: true, filterable: true, filterByText: true, - fieldName: 'ref', + fieldName: $dropdown.data('field-name'), renderRow: function(ref) { var link; if (ref.header != null) { diff --git a/app/views/projects/commit/_change.html.haml b/app/views/projects/commit/_change.html.haml index f5407bdbc7b..6faf8267d4e 100644 --- a/app/views/projects/commit/_change.html.haml +++ b/app/views/projects/commit/_change.html.haml @@ -17,13 +17,8 @@ .form-group.branch = label_tag 'target_branch', target_label, class: 'control-label' .col-sm-10 - .dropdown - = dropdown_toggle @project.default_branch, { toggle: "dropdown", selected: @project.default_branch, ref: @ref, refs_url: branches_namespace_project_path(@project.namespace, @project) }, { toggle_class: "js-project-refs-dropdown js-target-branch" } - .dropdown-menu.dropdown-menu-selectable - = dropdown_title "Switch branch" - = dropdown_filter "Search branches" - = dropdown_content - = dropdown_loading + = hidden_field_tag :target_branch, @project.default_branch, id: 'target_branch' + = dropdown_tag(@project.default_branch, options: { title: "Switch branch", filter: true, placeholder: "Search branches", toggle_class: 'js-project-refs-dropdown js-target-branch', dropdown_class: 'dropdown-menu-selectable', data: { field_name: "target_branch", selected: @project.default_branch, target_branch: @project.default_branch, refs_url: namespace_project_branches_path(@project.namespace, @project), submit_form_on_click: false }}) - if can?(current_user, :push_code, @project) .js-create-merge-request-container diff --git a/app/views/shared/_ref_switcher.html.haml b/app/views/shared/_ref_switcher.html.haml index ea7162d4d63..9a8252ab087 100644 --- a/app/views/shared/_ref_switcher.html.haml +++ b/app/views/shared/_ref_switcher.html.haml @@ -6,7 +6,7 @@ - @options && @options.each do |key, value| = hidden_field_tag key, value, id: nil .dropdown - = dropdown_toggle dropdown_toggle_text, { toggle: "dropdown", selected: dropdown_toggle_text, ref: @ref, refs_url: refs_namespace_project_path(@project.namespace, @project) }, { toggle_class: "js-project-refs-dropdown" } + = dropdown_toggle dropdown_toggle_text, { toggle: "dropdown", selected: dropdown_toggle_text, ref: @ref, refs_url: refs_namespace_project_path(@project.namespace, @project), field_name: 'ref', submit_form_on_click: true }, { toggle_class: "js-project-refs-dropdown" } .dropdown-menu.dropdown-menu-selectable{ class: ("dropdown-menu-align-right" if local_assigns[:align_right]) } = dropdown_title "Switch branch/tag" = dropdown_filter "Search branches and tags" From 0bfef4bd83ee62076b4c22ca56d4c1d751ebfc98 Mon Sep 17 00:00:00 2001 From: Connor Shea Date: Tue, 2 Aug 2016 10:01:44 -0600 Subject: [PATCH 12/50] Add dynamic sizing for dropdown toggle, update Changelog. Also resolve feedback. --- CHANGELOG | 1 + app/assets/stylesheets/framework/dropdowns.scss | 9 +++++++++ app/views/projects/commit/_change.html.haml | 2 +- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 837e9e27aba..29e3fa0c112 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -57,6 +57,7 @@ v 8.11.0 (unreleased) - Trigram indexes for the "ci_runners" table have been removed to speed up UPDATE queries - Fix devise deprecation warnings. - Update version_sorter and use new interface for faster tag sorting + - Load branches asynchronously in Cherry Pick and Revert dialogs. - Optimize checking if a user has read access to a list of issues !5370 - Store all DB secrets in secrets.yml, under descriptive names !5274 - Nokogiri's various parsing methods are now instrumented diff --git a/app/assets/stylesheets/framework/dropdowns.scss b/app/assets/stylesheets/framework/dropdowns.scss index f1635a53763..7d3a063d6c2 100644 --- a/app/assets/stylesheets/framework/dropdowns.scss +++ b/app/assets/stylesheets/framework/dropdowns.scss @@ -84,6 +84,15 @@ width: 100%; } } + + // Allows dynamic-width text in the dropdown toggle. + // Resizes to allow long text without overflowing the container. + &.dynamic { + width: auto; + min-width: 160px; + max-width: 100%; + padding-right: 25px; + } } .dropdown-menu, diff --git a/app/views/projects/commit/_change.html.haml b/app/views/projects/commit/_change.html.haml index 6faf8267d4e..e4cd55b9f7a 100644 --- a/app/views/projects/commit/_change.html.haml +++ b/app/views/projects/commit/_change.html.haml @@ -18,7 +18,7 @@ = label_tag 'target_branch', target_label, class: 'control-label' .col-sm-10 = hidden_field_tag :target_branch, @project.default_branch, id: 'target_branch' - = dropdown_tag(@project.default_branch, options: { title: "Switch branch", filter: true, placeholder: "Search branches", toggle_class: 'js-project-refs-dropdown js-target-branch', dropdown_class: 'dropdown-menu-selectable', data: { field_name: "target_branch", selected: @project.default_branch, target_branch: @project.default_branch, refs_url: namespace_project_branches_path(@project.namespace, @project), submit_form_on_click: false }}) + = dropdown_tag(@project.default_branch, options: { title: "Switch branch", filter: true, placeholder: "Search branches", toggle_class: 'js-project-refs-dropdown js-target-branch dynamic', dropdown_class: 'dropdown-menu-selectable', data: { field_name: "target_branch", selected: @project.default_branch, target_branch: @project.default_branch, refs_url: namespace_project_branches_path(@project.namespace, @project), submit_form_on_click: false }}) - if can?(current_user, :push_code, @project) .js-create-merge-request-container From 3babc959db12efd794d3620ae7ec051216a8ac5d Mon Sep 17 00:00:00 2001 From: Connor Shea Date: Tue, 2 Aug 2016 10:53:10 -0600 Subject: [PATCH 13/50] Fix tests. --- app/controllers/projects/branches_controller.rb | 2 +- spec/features/projects/branches_spec.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/projects/branches_controller.rb b/app/controllers/projects/branches_controller.rb index 462d4e461e1..2de8ada3e29 100644 --- a/app/controllers/projects/branches_controller.rb +++ b/app/controllers/projects/branches_controller.rb @@ -19,7 +19,7 @@ class Projects::BranchesController < Projects::ApplicationController respond_to do |format| format.html format.json do - render json: @repository.branch_names.to_json + render json: @repository.branch_names end end end diff --git a/spec/features/projects/branches_spec.rb b/spec/features/projects/branches_spec.rb index 79abba21854..1b14945bf0a 100644 --- a/spec/features/projects/branches_spec.rb +++ b/spec/features/projects/branches_spec.rb @@ -20,7 +20,7 @@ describe 'Branches', feature: true do describe 'Find branches' do it 'shows filtered branches', js: true do - visit namespace_project_branches_path(project.namespace, project, project.id) + visit namespace_project_branches_path(project.namespace, project) fill_in 'branch-search', with: 'fix' find('#branch-search').native.send_keys(:enter) From 9a8b29e3ee3fc88f536f104a4ff962c0e435f3f4 Mon Sep 17 00:00:00 2001 From: Connor Shea Date: Fri, 5 Aug 2016 15:07:11 -0600 Subject: [PATCH 14/50] Add a test for the cherry pick dropdown. --- .../projects/commits/cherry_pick_spec.rb | 31 ++++++++++++++++--- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/spec/features/projects/commits/cherry_pick_spec.rb b/spec/features/projects/commits/cherry_pick_spec.rb index 1b4ff6b6f1b..e45e3a36d01 100644 --- a/spec/features/projects/commits/cherry_pick_spec.rb +++ b/spec/features/projects/commits/cherry_pick_spec.rb @@ -1,4 +1,5 @@ require 'spec_helper' +include WaitForAjax describe 'Cherry-pick Commits' do let(:project) { create(:project) } @@ -8,12 +9,11 @@ describe 'Cherry-pick Commits' do before do login_as :user project.team << [@user, :master] - visit namespace_project_commits_path(project.namespace, project, project.repository.root_ref, { limit: 5 }) + visit namespace_project_commit_path(project.namespace, project, master_pickable_commit.id) end context "I cherry-pick a commit" do it do - visit namespace_project_commit_path(project.namespace, project, master_pickable_commit.id) find("a[href='#modal-cherry-pick-commit']").click expect(page).not_to have_content('v1.0.0') # Only branches, not tags page.within('#modal-cherry-pick-commit') do @@ -26,7 +26,6 @@ describe 'Cherry-pick Commits' do context "I cherry-pick a merge commit" do it do - visit namespace_project_commit_path(project.namespace, project, master_pickable_merge.id) find("a[href='#modal-cherry-pick-commit']").click page.within('#modal-cherry-pick-commit') do uncheck 'create_merge_request' @@ -38,7 +37,6 @@ describe 'Cherry-pick Commits' do context "I cherry-pick a commit that was previously cherry-picked" do it do - visit namespace_project_commit_path(project.namespace, project, master_pickable_commit.id) find("a[href='#modal-cherry-pick-commit']").click page.within('#modal-cherry-pick-commit') do uncheck 'create_merge_request' @@ -56,7 +54,6 @@ describe 'Cherry-pick Commits' do context "I cherry-pick a commit in a new merge request" do it do - visit namespace_project_commit_path(project.namespace, project, master_pickable_commit.id) find("a[href='#modal-cherry-pick-commit']").click page.within('#modal-cherry-pick-commit') do click_button 'Cherry-pick' @@ -64,4 +61,28 @@ describe 'Cherry-pick Commits' do expect(page).to have_content('The commit has been successfully cherry-picked. You can now submit a merge request to get this change into the original branch.') end end + + context "I cherry-pick a commit from a different branch", js: true do + it do + find('.commit-action-buttons a.dropdown-toggle').click + find(:css, "a[href='#modal-cherry-pick-commit']").click + + page.within('#modal-cherry-pick-commit') do + click_button 'master' + end + + wait_for_ajax + + page.within('#modal-cherry-pick-commit .dropdown-menu .dropdown-content') do + click_link 'feature' + end + + page.within('#modal-cherry-pick-commit') do + uncheck 'create_merge_request' + click_button 'Cherry-pick' + end + + expect(page).to have_content('The commit has been successfully cherry-picked.') + end + end end From 7fdd8613b72e74b91b9508ff79e6092e8b530dbe Mon Sep 17 00:00:00 2001 From: Clement Ho Date: Wed, 17 Aug 2016 15:28:47 -0500 Subject: [PATCH 15/50] Fix badge count alignment --- CHANGELOG | 1 + app/assets/stylesheets/framework/nav.scss | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 61342926836..820d6e7a370 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -16,6 +16,7 @@ v 8.11.0 (unreleased) - API: List access requests, request access, approve, and deny access requests to a project or a group. !4833 - Use long options for curl examples in documentation !5703 (winniehell) - Remove magic comments (`# encoding: UTF-8`) from Ruby files. !5456 (winniehell) + - Fix badge count alignment (ClemMakesApps) - GitLab Performance Monitoring can now track custom events such as the number of tags pushed to a repository - Add support for relative links starting with ./ or / to RelativeLinkFilter (winniehell) - Ignore URLs starting with // in Markdown links !5677 (winniehell) diff --git a/app/assets/stylesheets/framework/nav.scss b/app/assets/stylesheets/framework/nav.scss index 7852fc9a424..9e924f99e9c 100644 --- a/app/assets/stylesheets/framework/nav.scss +++ b/app/assets/stylesheets/framework/nav.scss @@ -72,6 +72,7 @@ font-weight: normal; background-color: #eee; color: #78a; + vertical-align: baseline; } } From ff903e645335901355ab837accc995408f79e96a Mon Sep 17 00:00:00 2001 From: Paco Guzman Date: Fri, 5 Aug 2016 15:29:20 +0200 Subject: [PATCH 16/50] Move to project dropdown with infinite scroll for better performance Use just SQL to check is a user can admin_issue on a project Using offset pagination instead pages to avoid a count query Tradeoff - we duplicate how we check admin_issue in a SQL relation in the Ability class --- CHANGELOG | 1 + app/assets/javascripts/issuable_form.js | 24 +++++++-- app/assets/stylesheets/framework/selects.scss | 3 +- app/finders/move_to_project_finder.rb | 6 +++ app/views/shared/issuable/_form.html.haml | 2 +- .../autocomplete_controller_spec.rb | 50 +++++++++++++++++++ spec/finders/move_to_project_finder_spec.rb | 22 ++++++++ 7 files changed, 101 insertions(+), 7 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 61c654002ad..a3186a8afb9 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -105,6 +105,7 @@ v 8.11.0 (unreleased) - Fix merge request new view not changing code view rendering style - Make error pages responsive (Takuya Noguchi) - The performance of the project dropdown used for moving issues has been improved + - Move to project dropdown with infinite scroll for better performance - Fix skip_repo parameter being ignored when destroying a namespace - Add all builds into stage/job dropdowns on builds page - Change requests_profiles resource constraint to catch virtually any file diff --git a/app/assets/javascripts/issuable_form.js b/app/assets/javascripts/issuable_form.js index 297d4f029f0..b7f92ae9883 100644 --- a/app/assets/javascripts/issuable_form.js +++ b/app/assets/javascripts/issuable_form.js @@ -102,20 +102,34 @@ }; IssuableForm.prototype.initMoveDropdown = function() { - var $moveDropdown; + var $moveDropdown, pageSize; $moveDropdown = $('.js-move-dropdown'); if ($moveDropdown.length) { + pageSize = $moveDropdown.data('page-size'); return $('.js-move-dropdown').select2({ ajax: { url: $moveDropdown.data('projects-url'), - results: function(data) { + quietMillis: 125, + data: function(term, page, context) { return { - results: data + search: term, + offset_id: context }; }, - data: function(query) { + results: function(data) { + var context, + more; + + if (data.length >= pageSize) + more = true; + + if (data[data.length - 1]) + context = data[data.length - 1].id; + return { - search: query + results: data, + more: more, + context: context }; } }, diff --git a/app/assets/stylesheets/framework/selects.scss b/app/assets/stylesheets/framework/selects.scss index 21d87cc9d34..b2e22b60440 100644 --- a/app/assets/stylesheets/framework/selects.scss +++ b/app/assets/stylesheets/framework/selects.scss @@ -45,7 +45,8 @@ min-width: 175px; } -.select2-results .select2-result-label { +.select2-results .select2-result-label, +.select2-more-results { padding: 10px 15px; } diff --git a/app/finders/move_to_project_finder.rb b/app/finders/move_to_project_finder.rb index 3334b8556df..79eb45568be 100644 --- a/app/finders/move_to_project_finder.rb +++ b/app/finders/move_to_project_finder.rb @@ -1,4 +1,6 @@ class MoveToProjectFinder + PAGE_SIZE = 50 + def initialize(user) @user = user end @@ -8,6 +10,10 @@ class MoveToProjectFinder projects = projects.search(search) if search.present? projects = projects.excluding_project(from_project) + # infinite scroll using offset + projects = projects.where('projects.id < ?', offset_id) if offset_id.present? + projects = projects.limit(PAGE_SIZE) + # to ask for Project#name_with_namespace projects.includes(namespace: :owner) end diff --git a/app/views/shared/issuable/_form.html.haml b/app/views/shared/issuable/_form.html.haml index 9e2e096d5f9..901351f2620 100644 --- a/app/views/shared/issuable/_form.html.haml +++ b/app/views/shared/issuable/_form.html.haml @@ -120,7 +120,7 @@ = label_tag :move_to_project_id, 'Move', class: 'control-label' .col-sm-10 .issuable-form-select-holder - = hidden_field_tag :move_to_project_id, nil, class: 'js-move-dropdown', data: { placeholder: 'Select project', projects_url: autocomplete_projects_path(project_id: @project.id) } + = hidden_field_tag :move_to_project_id, nil, class: 'js-move-dropdown', data: { placeholder: 'Select project', projects_url: autocomplete_projects_path(project_id: @project.id), page_size: MoveToProjectFinder::PAGE_SIZE }   %span{ data: { toggle: 'tooltip', placement: 'auto top' }, style: 'cursor: default', title: 'Moving an issue will copy the discussion to a different project and close it here. All participants will be notified of the new location.' } diff --git a/spec/controllers/autocomplete_controller_spec.rb b/spec/controllers/autocomplete_controller_spec.rb index 44128a43362..a121cb2fc97 100644 --- a/spec/controllers/autocomplete_controller_spec.rb +++ b/spec/controllers/autocomplete_controller_spec.rb @@ -237,6 +237,56 @@ describe AutocompleteController do end end + context 'authorized projects apply limit' do + before do + authorized_project2 = create(:project) + authorized_project3 = create(:project) + + authorized_project.team << [user, :master] + authorized_project2.team << [user, :master] + authorized_project3.team << [user, :master] + + stub_const 'MoveToProjectFinder::PAGE_SIZE', 2 + end + + describe 'GET #projects with project ID' do + before do + get(:projects, project_id: project.id) + end + + let(:body) { JSON.parse(response.body) } + + it do + expect(body).to be_kind_of(Array) + expect(body.size).to eq 3 # Of a total of 4 + end + end + end + + context 'authorized projects with offset' do + before do + authorized_project2 = create(:project) + authorized_project3 = create(:project) + + authorized_project.team << [user, :master] + authorized_project2.team << [user, :master] + authorized_project3.team << [user, :master] + end + + describe 'GET #projects with project ID and offset_id' do + before do + get(:projects, project_id: project.id, offset_id: authorized_project.id) + end + + let(:body) { JSON.parse(response.body) } + + it do + expect(body.detect { |item| item['id'] == 0 }).to be_nil # 'No project' is not there + expect(body.detect { |item| item['id'] == authorized_project.id }).to be_nil # Offset project is not there either + end + end + end + context 'authorized projects without admin_issue ability' do before(:each) do authorized_project.team << [user, :guest] diff --git a/spec/finders/move_to_project_finder_spec.rb b/spec/finders/move_to_project_finder_spec.rb index 4f3304f7b6d..fdce4e714ff 100644 --- a/spec/finders/move_to_project_finder_spec.rb +++ b/spec/finders/move_to_project_finder_spec.rb @@ -51,6 +51,28 @@ describe MoveToProjectFinder do expect(subject.execute(project).to_a).to eq([other_reporter_project]) end + + it 'returns a page of projects ordered by id in descending order' do + stub_const 'MoveToProjectFinder::PAGE_SIZE', 2 + + reporter_project.team << [user, :reporter] + developer_project.team << [user, :developer] + master_project.team << [user, :master] + + expect(subject.execute(project).to_a).to eq([master_project, developer_project]) + end + + it 'returns projects after the given offset id' do + stub_const 'MoveToProjectFinder::PAGE_SIZE', 2 + + reporter_project.team << [user, :reporter] + developer_project.team << [user, :developer] + master_project.team << [user, :master] + + expect(subject.execute(project, search: nil, offset_id: master_project.id).to_a).to eq([developer_project, reporter_project]) + expect(subject.execute(project, search: nil, offset_id: developer_project.id).to_a).to eq([reporter_project]) + expect(subject.execute(project, search: nil, offset_id: reporter_project.id).to_a).to be_empty + end end context 'search' do From 42496ecef778ad6d3500babbf33d350b6ab984d7 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Thu, 18 Aug 2016 11:37:07 +0200 Subject: [PATCH 17/50] Render coverage badge for latest successful pipeline --- lib/gitlab/badge/coverage/report.rb | 3 +- spec/lib/gitlab/badge/coverage/report_spec.rb | 77 +++++++++++-------- 2 files changed, 46 insertions(+), 34 deletions(-) diff --git a/lib/gitlab/badge/coverage/report.rb b/lib/gitlab/badge/coverage/report.rb index 3d56ea3e47a..95d925dc7f3 100644 --- a/lib/gitlab/badge/coverage/report.rb +++ b/lib/gitlab/badge/coverage/report.rb @@ -13,8 +13,7 @@ module Gitlab @job = job @pipeline = @project.pipelines - .where(ref: @ref) - .where(sha: @project.commit(@ref).try(:sha)) + .latest_successful_for(@ref) .first end diff --git a/spec/lib/gitlab/badge/coverage/report_spec.rb b/spec/lib/gitlab/badge/coverage/report_spec.rb index 1ff49602486..ab0cce6e091 100644 --- a/spec/lib/gitlab/badge/coverage/report_spec.rb +++ b/spec/lib/gitlab/badge/coverage/report_spec.rb @@ -44,45 +44,49 @@ describe Gitlab::Badge::Coverage::Report do end end - context 'pipeline exists' do - let!(:pipeline) do - create(:ci_pipeline, project: project, - sha: project.commit.id, - ref: 'master') - end - - context 'builds exist' do - before do - create(:ci_build, name: 'first', pipeline: pipeline, coverage: 40) - create(:ci_build, pipeline: pipeline, coverage: 60) + context 'when latest successful pipeline exists' do + before do + create_pipeline do |pipeline| + create(:ci_build, :success, pipeline: pipeline, name: 'first', coverage: 40) + create(:ci_build, :success, pipeline: pipeline, coverage: 60) end - context 'particular job specified' do - let(:job_name) { 'first' } - - it 'returns coverage for the particular job' do - expect(badge.status).to eq 40 - end - end - - context 'particular job not specified' do - let(:job_name) { '' } - - it 'returns arithemetic mean for the pipeline' do - expect(badge.status).to eq 50 - end + create_pipeline do |pipeline| + create(:ci_build, :failed, pipeline: pipeline, coverage: 10) end end - context 'builds do not exist' do - it_behaves_like 'unknown coverage report' + context 'when particular job specified' do + let(:job_name) { 'first' } - context 'particular job specified' do - let(:job_name) { 'nonexistent' } + it 'returns coverage for the particular job' do + expect(badge.status).to eq 40 + end + end - it 'retruns nil' do - expect(badge.status).to be_nil - end + context 'when particular job not specified' do + let(:job_name) { '' } + + it 'returns arithemetic mean for the pipeline' do + expect(badge.status).to eq 50 + end + end + end + + context 'when only failed pipeline exists' do + before do + create_pipeline do |pipeline| + create(:ci_build, :failed, pipeline: pipeline, coverage: 10) + end + end + + it_behaves_like 'unknown coverage report' + + context 'particular job specified' do + let(:job_name) { 'nonexistent' } + + it 'retruns nil' do + expect(badge.status).to be_nil end end end @@ -90,4 +94,13 @@ describe Gitlab::Badge::Coverage::Report do context 'pipeline does not exist' do it_behaves_like 'unknown coverage report' end + + def create_pipeline + opts = { project: project, sha: project.commit.id, ref: 'master' } + + create(:ci_pipeline, opts).tap do |pipeline| + yield pipeline + pipeline.build_updated + end + end end From cfbdf7420cd1ad5733d7e0da12eb28ffcbaf0b0d Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Thu, 18 Aug 2016 11:47:46 +0200 Subject: [PATCH 18/50] Update documentation for test coverage report badge --- doc/ci/pipelines.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/ci/pipelines.md b/doc/ci/pipelines.md index d90d7aca4fd..20cd88c8d20 100644 --- a/doc/ci/pipelines.md +++ b/doc/ci/pipelines.md @@ -67,6 +67,8 @@ use following Markdown code to embed the est coverage report into `README.md`: ![coverage](http://gitlab.com/gitlab-org/gitlab-ce/badges/master/coverage.svg?job=coverage) ``` +The latest successful pipeline will be used to read the test coverage value. + [builds]: #builds [jobs]: yaml/README.md#jobs [stages]: yaml/README.md#stages From 804474d78c1cc0440f29424b0b6bbe2f5f77eab7 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Thu, 18 Aug 2016 11:49:26 +0200 Subject: [PATCH 19/50] Add Changelog entry for coverage badge improvements --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index 61c654002ad..18d9a301a25 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ Please view this file on the master branch, on stable branches it's out of date. v 8.11.0 (unreleased) + - Use test coverage value from the latest successful pipeline in badge. !5862 - Add test coverage report badge. !5708 - Remove the http_parser.rb dependency by removing the tinder gem. !5758 (tbalthazar) - Ability to specify branches for Pivotal Tracker integration (Egor Lynko) From 8527f3fa4641cee3c56e8eef7c07efc06aa7bdc5 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Thu, 18 Aug 2016 12:38:14 +0200 Subject: [PATCH 20/50] Update coverage report badge feature tests --- .../features/projects/badges/coverage_spec.rb | 41 +++++++++++-------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/spec/features/projects/badges/coverage_spec.rb b/spec/features/projects/badges/coverage_spec.rb index af86d3c338a..5972e7f31c2 100644 --- a/spec/features/projects/badges/coverage_spec.rb +++ b/spec/features/projects/badges/coverage_spec.rb @@ -4,12 +4,6 @@ feature 'test coverage badge' do given!(:user) { create(:user) } given!(:project) { create(:project, :private) } - given!(:pipeline) do - create(:ci_pipeline, project: project, - ref: 'master', - sha: project.commit.id) - end - context 'when user has access to view badge' do background do project.team << [user, :developer] @@ -17,8 +11,10 @@ feature 'test coverage badge' do end scenario 'user requests coverage badge image for pipeline' do - create_job(coverage: 100, name: 'test:1') - create_job(coverage: 90, name: 'test:2') + create_pipeline do |pipeline| + create_build(pipeline, coverage: 100, name: 'test:1') + create_build(pipeline, coverage: 90, name: 'test:2') + end show_test_coverage_badge @@ -26,9 +22,11 @@ feature 'test coverage badge' do end scenario 'user requests coverage badge for specific job' do - create_job(coverage: 50, name: 'test:1') - create_job(coverage: 50, name: 'test:2') - create_job(coverage: 85, name: 'coverage') + create_pipeline do |pipeline| + create_build(pipeline, coverage: 50, name: 'test:1') + create_build(pipeline, coverage: 50, name: 'test:2') + create_build(pipeline, coverage: 85, name: 'coverage') + end show_test_coverage_badge(job: 'coverage') @@ -36,7 +34,9 @@ feature 'test coverage badge' do end scenario 'user requests coverage badge for pipeline without coverage' do - create_job(coverage: nil, name: 'test') + create_pipeline do |pipeline| + create_build(pipeline, coverage: nil, name: 'test') + end show_test_coverage_badge @@ -54,10 +54,19 @@ feature 'test coverage badge' do end end - def create_job(coverage:, name:) - create(:ci_build, name: name, - coverage: coverage, - pipeline: pipeline) + def create_pipeline + opts = { project: project, ref: 'master', sha: project.commit.id } + + create(:ci_pipeline, opts).tap do |pipeline| + yield pipeline + pipeline.build_updated + end + end + + def create_build(pipeline, coverage:, name:) + opts = { pipeline: pipeline, coverage: coverage, name: name } + + create(:ci_build, :success, opts) end def show_test_coverage_badge(job: nil) From d3af645e6aee2430e0882a25dc7ad11c80f23aea Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Wed, 17 Aug 2016 13:30:36 +0200 Subject: [PATCH 21/50] Refactor pipeline fixtures for dev env a little --- db/fixtures/development/14_builds.rb | 51 +++++++++++++++------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/db/fixtures/development/14_builds.rb b/db/fixtures/development/14_builds.rb index 069d9dd6226..3b02dddc1fd 100644 --- a/db/fixtures/development/14_builds.rb +++ b/db/fixtures/development/14_builds.rb @@ -34,33 +34,38 @@ class Gitlab::Seeder::Builds end end + private + def pipelines - master_pipelines + merge_request_pipelines + create_master_pipelines + create_merge_request_pipelines end - def master_pipelines - create_pipelines_for(@project, 'master') - rescue - [] - end - - def merge_request_pipelines - @project.merge_requests.last(5).map do |merge_request| - create_pipelines(merge_request.source_project, merge_request.source_branch, merge_request.commits.last(5)) - end.flatten - rescue - [] - end - - def create_pipelines_for(project, ref) - commits = project.repository.commits(ref, limit: 5) - create_pipelines(project, ref, commits) - end - - def create_pipelines(project, ref, commits) - commits.map do |commit| - project.pipelines.create(sha: commit.id, ref: ref) + def create_master_pipelines + @project.repository.commits('master', limit: 5).map do |commit| + create_pipeline!(@project, 'master', commit) end + rescue + [] + end + + def create_merge_request_pipelines + pipelines = @project.merge_requests.first(5).map do |merge_request| + project = merge_request.source_project + branch = merge_request.source_branch + + merge_request.commits.last(5).map do |commit| + create_pipeline!(project, branch, commit) + end + end + + pipelines.flatten + rescue + [] + end + + + def create_pipeline!(project, ref, commit) + project.pipelines.create(sha: commit.id, ref: ref) end def build_create!(pipeline, opts = {}) From 312c1dce925e97319063e9e9b052607a8a26c5ed Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Thu, 18 Aug 2016 09:00:08 +0200 Subject: [PATCH 22/50] Fix build logs in development environment fixtures --- db/fixtures/development/14_builds.rb | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/db/fixtures/development/14_builds.rb b/db/fixtures/development/14_builds.rb index 3b02dddc1fd..903b75c924b 100644 --- a/db/fixtures/development/14_builds.rb +++ b/db/fixtures/development/14_builds.rb @@ -41,7 +41,7 @@ class Gitlab::Seeder::Builds end def create_master_pipelines - @project.repository.commits('master', limit: 5).map do |commit| + @project.repository.commits('master', limit: 4).map do |commit| create_pipeline!(@project, 'master', commit) end rescue @@ -49,11 +49,11 @@ class Gitlab::Seeder::Builds end def create_merge_request_pipelines - pipelines = @project.merge_requests.first(5).map do |merge_request| + pipelines = @project.merge_requests.first(3).map do |merge_request| project = merge_request.source_project branch = merge_request.source_branch - merge_request.commits.last(5).map do |commit| + merge_request.commits.last(4).map do |commit| create_pipeline!(project, branch, commit) end end @@ -71,7 +71,7 @@ class Gitlab::Seeder::Builds def build_create!(pipeline, opts = {}) attributes = build_attributes_for(pipeline, opts) - Ci::Build.create!(attributes) do |build| + Ci::Build.create!(attributes).tap do |build| if opts[:name].start_with?('build') artifacts_cache_file(artifacts_archive_path) do |file| build.artifacts_file = file @@ -82,8 +82,12 @@ class Gitlab::Seeder::Builds end end + ## + # We need to set build trace after saving a build (id required) + # That is why we need `#tap` method instead of passing block + # directly to `Ci::Build#create!`. + # if %w(running success failed).include?(build.status) - # We need to set build trace after saving a build (id required) build.trace = FFaker::Lorem.paragraphs(6).join("\n\n") end end From dda60230623844b2615742de8d96b49f90ac8a87 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Thu, 18 Aug 2016 09:39:44 +0200 Subject: [PATCH 23/50] Fix build artifacts in fixtures in development env --- db/fixtures/development/14_builds.rb | 52 ++++++++++++++++------------ 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/db/fixtures/development/14_builds.rb b/db/fixtures/development/14_builds.rb index 903b75c924b..55af91c1cb8 100644 --- a/db/fixtures/development/14_builds.rb +++ b/db/fixtures/development/14_builds.rb @@ -69,46 +69,52 @@ class Gitlab::Seeder::Builds end def build_create!(pipeline, opts = {}) - attributes = build_attributes_for(pipeline, opts) + attributes = job_attributes(pipeline, opts) + .merge(commands: '$ build command') Ci::Build.create!(attributes).tap do |build| - if opts[:name].start_with?('build') - artifacts_cache_file(artifacts_archive_path) do |file| - build.artifacts_file = file - end + setup_artifacts(build) + setup_build_log(build) + build.save + end + end - artifacts_cache_file(artifacts_metadata_path) do |file| - build.artifacts_metadata = file - end - end + def setup_artifacts(build) + return unless %w[build test].include?(build.stage) - ## - # We need to set build trace after saving a build (id required) - # That is why we need `#tap` method instead of passing block - # directly to `Ci::Build#create!`. - # - if %w(running success failed).include?(build.status) - build.trace = FFaker::Lorem.paragraphs(6).join("\n\n") - end + artifacts_cache_file(artifacts_archive_path) do |file| + build.artifacts_file = file + end + + artifacts_cache_file(artifacts_metadata_path) do |file| + build.artifacts_metadata = file + end + end + + def setup_build_log(build) + ## + # We need to set build trace after saving a build (id required) + # That is why we need `#tap` method instead of passing block + # directly to `Ci::Build#create!`. + # + if %w(running success failed).include?(build.status) + build.trace = FFaker::Lorem.paragraphs(6).join("\n\n") end end def commit_status_create!(pipeline, opts = {}) - attributes = commit_status_attributes_for(pipeline, opts) + attributes = job_attributes(pipeline, opts) + GenericCommitStatus.create!(attributes) end - def commit_status_attributes_for(pipeline, opts) + def job_attributes(pipeline, opts) { name: 'test build', stage: 'test', stage_idx: stage_index(opts[:stage]), ref: 'master', tag: false, user: build_user, project: @project, pipeline: pipeline, created_at: Time.now, updated_at: Time.now }.merge(opts) end - def build_attributes_for(pipeline, opts) - commit_status_attributes_for(pipeline, opts).merge(commands: '$ build command') - end - def build_user @project.team.users.sample end From 34960c299c256bc8470333d63ed1a4946064d6b6 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Thu, 18 Aug 2016 10:15:21 +0200 Subject: [PATCH 24/50] Reorder failed stages and improve build statuses --- db/fixtures/development/14_builds.rb | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/db/fixtures/development/14_builds.rb b/db/fixtures/development/14_builds.rb index 55af91c1cb8..a6117c12930 100644 --- a/db/fixtures/development/14_builds.rb +++ b/db/fixtures/development/14_builds.rb @@ -7,11 +7,12 @@ class Gitlab::Seeder::Builds { name: 'rspec:windows', stage: 'test', status: :success }, { name: 'rspec:windows', stage: 'test', status: :success }, { name: 'rspec:osx', stage: 'test', status_event: :success }, - { name: 'spinach:linux', stage: 'test', status: :pending }, - { name: 'spinach:osx', stage: 'test', status: :canceled }, - { name: 'cucumber:linux', stage: 'test', status: :running }, - { name: 'cucumber:osx', stage: 'test', status: :failed }, - { name: 'staging', stage: 'deploy', environment: 'staging', status: :success }, + { name: 'spinach:linux', stage: 'test', status: :success }, + { name: 'spinach:osx', stage: 'test', status: :failed, allow_failure: true}, + { name: 'env:alpha', stage: 'deploy', environment: 'alpha', status: :pending }, + { name: 'env:beta', stage: 'deploy', environment: 'beta', status: :running }, + { name: 'env:gamma', stage: 'deploy', environment: 'gamma', status: :canceled }, + { name: 'staging', stage: 'deploy', environment: 'staging', status_event: :success }, { name: 'production', stage: 'deploy', environment: 'production', when: 'manual', status: :skipped }, { name: 'slack', stage: 'notify', when: 'manual', status: :created }, ] From b16f5319146ef2a47ff785ca87f7b2257dd3636b Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Thu, 18 Aug 2016 10:15:56 +0200 Subject: [PATCH 25/50] Reduce the number of build fixtures created in dev --- db/fixtures/development/14_builds.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/fixtures/development/14_builds.rb b/db/fixtures/development/14_builds.rb index a6117c12930..9a3d54fb56c 100644 --- a/db/fixtures/development/14_builds.rb +++ b/db/fixtures/development/14_builds.rb @@ -147,7 +147,7 @@ class Gitlab::Seeder::Builds end Gitlab::Seeder.quiet do - Project.all.sample(10).each do |project| + Project.all.sample(5).each do |project| project_builds = Gitlab::Seeder::Builds.new(project) project_builds.seed! end From c3ce005e66832587efd228e355daab0d3d08e7dd Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Thu, 18 Aug 2016 10:17:28 +0200 Subject: [PATCH 26/50] Rename file that holds pipeline fixtures in dev env --- db/fixtures/development/{14_builds.rb => 14_pipelines.rb} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename db/fixtures/development/{14_builds.rb => 14_pipelines.rb} (100%) diff --git a/db/fixtures/development/14_builds.rb b/db/fixtures/development/14_pipelines.rb similarity index 100% rename from db/fixtures/development/14_builds.rb rename to db/fixtures/development/14_pipelines.rb From 7450fe78000ac32ede0e363373585a846b4f0a0d Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Thu, 18 Aug 2016 10:28:12 +0200 Subject: [PATCH 27/50] Change name of the class that with pipeline seeds --- db/fixtures/development/14_pipelines.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/db/fixtures/development/14_pipelines.rb b/db/fixtures/development/14_pipelines.rb index 9a3d54fb56c..36b0d16bfb9 100644 --- a/db/fixtures/development/14_pipelines.rb +++ b/db/fixtures/development/14_pipelines.rb @@ -1,4 +1,4 @@ -class Gitlab::Seeder::Builds +class Gitlab::Seeder::Pipelines STAGES = %w[build test deploy notify] BUILDS = [ { name: 'build:linux', stage: 'build', status: :success }, @@ -148,7 +148,7 @@ end Gitlab::Seeder.quiet do Project.all.sample(5).each do |project| - project_builds = Gitlab::Seeder::Builds.new(project) + project_builds = Gitlab::Seeder::Pipelines.new(project) project_builds.seed! end end From 3b6258570c70d08d4b8d8b92f72bc48b113a4d08 Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Date: Thu, 18 Aug 2016 13:32:20 -0500 Subject: [PATCH 28/50] Fix layout of edit tags page --- app/views/projects/releases/edit.html.haml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/app/views/projects/releases/edit.html.haml b/app/views/projects/releases/edit.html.haml index 835398b6f98..33d5cbff420 100644 --- a/app/views/projects/releases/edit.html.haml +++ b/app/views/projects/releases/edit.html.haml @@ -1,18 +1,20 @@ +- @no_container = true - page_title "Edit", @tag.name, "Tags" = render "projects/commits/head" -.row-content-block - .oneline - .title - Release notes for tag - %strong #{@tag.name} +%div{ class: container_class } + .sub-header-block.no-bottom-space + .oneline + .title + Release notes for tag + %strong #{@tag.name} + -.prepend-top-default = form_for(@release, method: :put, url: namespace_project_tag_release_path(@project.namespace, @project, @tag.name), html: { class: 'form-horizontal common-note-form release-form js-quick-submit' }) do |f| = render layout: 'projects/md_preview', locals: { preview_class: "md-preview", referenced_users: true } do = render 'projects/zen', f: f, attr: :description, classes: 'note-textarea', placeholder: "Write your release notes or drag files here..." = render 'projects/notes/hints' .error-alert - .form-actions.prepend-top-default + .prepend-top-default = f.submit 'Save changes', class: 'btn btn-save' = link_to "Cancel", namespace_project_tag_path(@project.namespace, @project, @tag.name), class: "btn btn-default btn-cancel" From 8c4b1e36c5b52e2ee03cd725d4641b3614f2ada1 Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Date: Thu, 18 Aug 2016 13:42:44 -0500 Subject: [PATCH 29/50] Add space under MR title --- app/assets/stylesheets/pages/merge_requests.scss | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/assets/stylesheets/pages/merge_requests.scss b/app/assets/stylesheets/pages/merge_requests.scss index b4636269518..fcdaf671538 100644 --- a/app/assets/stylesheets/pages/merge_requests.scss +++ b/app/assets/stylesheets/pages/merge_requests.scss @@ -374,3 +374,10 @@ } } } + +.merge-request-details { + + .title { + margin-bottom: 20px; + } +} From 3a32c396e1a998193b953b97ce07b437d2f2526d Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Date: Thu, 18 Aug 2016 19:54:24 -0500 Subject: [PATCH 30/50] Add boards controller to issue nav item --- app/views/layouts/nav/_project.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml index 1d3b8fc3683..f7012595a5a 100644 --- a/app/views/layouts/nav/_project.html.haml +++ b/app/views/layouts/nav/_project.html.haml @@ -65,7 +65,7 @@ Graphs - if project_nav_tab? :issues - = nav_link(controller: [:issues, :labels, :milestones]) do + = nav_link(controller: [:issues, :labels, :milestones, :boards]) do = link_to namespace_project_issues_path(@project.namespace, @project), title: 'Issues', class: 'shortcuts-issues' do %span Issues From faf81b6ce70e8f495f97394b6cc02c057f2feba6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Fri, 19 Aug 2016 08:11:07 +0300 Subject: [PATCH 31/50] drop execute bit originally added by mistakes --- app/assets/javascripts/boards/test_utils/simulate_drag.js | 0 vendor/assets/javascripts/Chart.js | 0 vendor/assets/javascripts/autosize.js | 0 vendor/assets/javascripts/jquery.scrollTo.js | 0 4 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 app/assets/javascripts/boards/test_utils/simulate_drag.js mode change 100755 => 100644 vendor/assets/javascripts/Chart.js mode change 100755 => 100644 vendor/assets/javascripts/autosize.js mode change 100755 => 100644 vendor/assets/javascripts/jquery.scrollTo.js diff --git a/app/assets/javascripts/boards/test_utils/simulate_drag.js b/app/assets/javascripts/boards/test_utils/simulate_drag.js old mode 100755 new mode 100644 diff --git a/vendor/assets/javascripts/Chart.js b/vendor/assets/javascripts/Chart.js old mode 100755 new mode 100644 diff --git a/vendor/assets/javascripts/autosize.js b/vendor/assets/javascripts/autosize.js old mode 100755 new mode 100644 diff --git a/vendor/assets/javascripts/jquery.scrollTo.js b/vendor/assets/javascripts/jquery.scrollTo.js old mode 100755 new mode 100644 From be3b6ac74bde84680a797944db173dcc9bd81022 Mon Sep 17 00:00:00 2001 From: Timothy Andrew Date: Fri, 19 Aug 2016 11:18:49 +0530 Subject: [PATCH 32/50] Add a spec testing a second side effect of `Repository#merge`. - It sets the `in_progress_merge_commit_sha` variable on the given merge request, so that the branch permissions (developers can merge) check can proceed in the `pre-receive` hook. --- spec/models/repository_spec.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb index f7dbfd712cc..1fea50ad42c 100644 --- a/spec/models/repository_spec.rb +++ b/spec/models/repository_spec.rb @@ -719,6 +719,14 @@ describe Repository, models: true do expect(merge_commit).to be_present expect(repository.blob_at(merge_commit.id, 'files/ruby/feature.rb')).to be_present end + + it 'sets the `in_progress_merge_commit_sha` flag for the given merge request' do + merge_request = create(:merge_request, source_branch: 'feature', target_branch: 'master', source_project: project) + merge_commit_id = repository.merge(user, merge_request, commit_options) + repository.commit(merge_commit_id) + + expect(merge_request.in_progress_merge_commit_sha).to eq(merge_commit_id) + end end describe '#revert' do From 67d9e9227744329cbc4e6cbf3ed04357e18ec207 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Fri, 19 Aug 2016 10:07:51 +0100 Subject: [PATCH 33/50] Hides tooltips when dragging issues --- .../javascripts/boards/components/board_list.js.es6 | 4 ++++ .../boards/mixins/sortable_default_options.js.es6 | 3 +++ app/assets/stylesheets/pages/boards.scss | 13 ++++++------- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/app/assets/javascripts/boards/components/board_list.js.es6 b/app/assets/javascripts/boards/components/board_list.js.es6 index 1503d14c508..c5d74c36a5b 100644 --- a/app/assets/javascripts/boards/components/board_list.js.es6 +++ b/app/assets/javascripts/boards/components/board_list.js.es6 @@ -63,6 +63,10 @@ Store.moving.issue = card.issue; Store.moving.list = card.list; + + $('.has-tooltip').tooltip('hide') + .tooltip('disable'); + document.body.classList.add('is-dragging'); }, onAdd: (e) => { gl.issueBoards.BoardsStore.moveIssueToList(Store.moving.list, this.list, Store.moving.issue); diff --git a/app/assets/javascripts/boards/mixins/sortable_default_options.js.es6 b/app/assets/javascripts/boards/mixins/sortable_default_options.js.es6 index b7afe4897b6..ce1bb362be2 100644 --- a/app/assets/javascripts/boards/mixins/sortable_default_options.js.es6 +++ b/app/assets/javascripts/boards/mixins/sortable_default_options.js.es6 @@ -12,9 +12,12 @@ scrollSensitivity: 100, scrollSpeed: 20, onStart () { + $('.has-tooltip').tooltip('hide') + .tooltip('disable'); document.body.classList.add('is-dragging'); }, onEnd () { + $('.has-tooltip').tooltip('enable'); document.body.classList.remove('is-dragging'); } } diff --git a/app/assets/stylesheets/pages/boards.scss b/app/assets/stylesheets/pages/boards.scss index ad4b2d6496f..2d1cb547f95 100644 --- a/app/assets/stylesheets/pages/boards.scss +++ b/app/assets/stylesheets/pages/boards.scss @@ -8,9 +8,13 @@ } .is-dragging { + // Important because plugin sets inline CSS + opacity: 1!important; + * { - cursor: -webkit-grabbing; - cursor: grabbing; + // !important to make sure no style can override this when dragging + cursor: -webkit-grabbing!important; + cursor: grabbing!important; } } @@ -254,11 +258,6 @@ opacity: 0.3; } -.is-dragging { - // Important because plugin sets inline CSS - opacity: 1!important; -} - .card { position: relative; width: 100%; From d1f4a812d403cc8aa9839fc0de1fa78de7462916 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Fri, 19 Aug 2016 10:09:22 +0100 Subject: [PATCH 34/50] Hides tooltip when dragging Fixes issue with cursor not changing when dragging --- .../boards/components/board.js.es6 | 2 +- .../boards/components/board_list.js.es6 | 4 +--- .../mixins/sortable_default_options.js.es6 | 22 +++++++++++-------- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/app/assets/javascripts/boards/components/board.js.es6 b/app/assets/javascripts/boards/components/board.js.es6 index e17784e7948..5ef6a1b2277 100644 --- a/app/assets/javascripts/boards/components/board.js.es6 +++ b/app/assets/javascripts/boards/components/board.js.es6 @@ -55,7 +55,7 @@ draggable: '.is-draggable', handle: '.js-board-handle', onEnd: (e) => { - document.body.classList.remove('is-dragging'); + gl.issueBoards.onEnd(); if (e.newIndex !== undefined && e.oldIndex !== e.newIndex) { const order = this.sortable.toArray(), diff --git a/app/assets/javascripts/boards/components/board_list.js.es6 b/app/assets/javascripts/boards/components/board_list.js.es6 index c5d74c36a5b..dceacb25452 100644 --- a/app/assets/javascripts/boards/components/board_list.js.es6 +++ b/app/assets/javascripts/boards/components/board_list.js.es6 @@ -64,9 +64,7 @@ Store.moving.issue = card.issue; Store.moving.list = card.list; - $('.has-tooltip').tooltip('hide') - .tooltip('disable'); - document.body.classList.add('is-dragging'); + gl.issueBoards.onStart(); }, onAdd: (e) => { gl.issueBoards.BoardsStore.moveIssueToList(Store.moving.list, this.list, Store.moving.issue); diff --git a/app/assets/javascripts/boards/mixins/sortable_default_options.js.es6 b/app/assets/javascripts/boards/mixins/sortable_default_options.js.es6 index ce1bb362be2..8e8d13ede5a 100644 --- a/app/assets/javascripts/boards/mixins/sortable_default_options.js.es6 +++ b/app/assets/javascripts/boards/mixins/sortable_default_options.js.es6 @@ -2,6 +2,17 @@ window.gl = window.gl || {}; window.gl.issueBoards = window.gl.issueBoards || {}; + gl.issueBoards.onStart = () => { + $('.has-tooltip').tooltip('hide') + .tooltip('disable'); + document.body.classList.add('is-dragging'); + }; + + gl.issueBoards.onEnd = () => { + $('.has-tooltip').tooltip('enable'); + document.body.classList.remove('is-dragging'); + }; + gl.issueBoards.getBoardSortableDefaultOptions = (obj) => { let defaultSortOptions = { forceFallback: true, @@ -11,15 +22,8 @@ filter: '.has-tooltip', scrollSensitivity: 100, scrollSpeed: 20, - onStart () { - $('.has-tooltip').tooltip('hide') - .tooltip('disable'); - document.body.classList.add('is-dragging'); - }, - onEnd () { - $('.has-tooltip').tooltip('enable'); - document.body.classList.remove('is-dragging'); - } + onStart: gl.issueBoards.onStart, + onEnd: gl.issueBoards.onEnd } Object.keys(obj).forEach((key) => { defaultSortOptions[key] = obj[key]; }); From 35cea54a52acbdf619783c76dbce1852a048ff7a Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Fri, 19 Aug 2016 10:21:09 +0100 Subject: [PATCH 35/50] Fixed keyboard shortcuts not working on issue boards Closes #21071 --- app/assets/javascripts/dispatcher.js | 3 +++ spec/features/boards/boards_spec.rb | 12 ++++++++++++ 2 files changed, 15 insertions(+) diff --git a/app/assets/javascripts/dispatcher.js b/app/assets/javascripts/dispatcher.js index 74c4ab563f9..32e3aa62358 100644 --- a/app/assets/javascripts/dispatcher.js +++ b/app/assets/javascripts/dispatcher.js @@ -20,6 +20,9 @@ path = page.split(':'); shortcut_handler = null; switch (page) { + case 'projects:boards:show': + shortcut_handler = new ShortcutsNavigation(); + break; case 'projects:issues:index': Issuable.init(); new IssuableBulkActions(); diff --git a/spec/features/boards/boards_spec.rb b/spec/features/boards/boards_spec.rb index 8910c50c294..5d777895542 100644 --- a/spec/features/boards/boards_spec.rb +++ b/spec/features/boards/boards_spec.rb @@ -572,6 +572,18 @@ describe 'Issue Boards', feature: true, js: true do end end + context 'keyboard shortcuts' do + before do + visit namespace_project_board_path(project.namespace, project) + wait_for_vue_resource + end + + it 'allows user to use keyboard shortcuts' do + find('.boards-list').native.send_keys('i') + expect(page).to have_content('New Issue') + end + end + context 'signed out user' do before do logout From b99f84119708cecab02dd3691febdf285a384b96 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 19 Aug 2016 09:24:51 +0000 Subject: [PATCH 36/50] Update contribution acceptance criteria with tests requirements --- CONTRIBUTING.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b393e4157a9..d8093a61b4c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -387,9 +387,8 @@ description area. Copy-paste it to retain the markdown format. 1. The change is as small as possible 1. Include proper tests and make all tests pass (unless it contains a test - exposing a bug in existing code). Every new file with code you created - must have a corresponging file with tests even if functionality is - already tested somewhere else. + exposing a bug in existing code). Every new class should have corresponding + unit tests, even if the class is exercised at a higher level, such as a feature test. 1. If you suspect a failing CI build is unrelated to your contribution, you may try and restart the failing CI job or ask a developer to fix the aforementioned failing test From 681f9aca39101109edb3b46a14282b007d68e69b Mon Sep 17 00:00:00 2001 From: Paco Guzman Date: Fri, 19 Aug 2016 12:44:20 +0200 Subject: [PATCH 37/50] Fix notification_service argument error of declined invitation emails MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Removing unused access_level parameter. Bug introduced here -> 6d103a2f4764441b1650ba6d790732056c9a8516 access_level parameter wasn’t needed since -> 88c2639356e6e4b4b05d96584768e07a9ce4b048 --- CHANGELOG | 1 + app/services/notification_service.rb | 2 -- spec/services/notification_service_spec.rb | 40 ++++++++++++++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 7ea2631f9f4..8c0a972c4e0 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -141,6 +141,7 @@ v 8.11.0 (unreleased) - Each `File::exists?` replaced to `File::exist?` because of deprecate since ruby version 2.2.0 - Add auto-completition in pipeline (Katarzyna Kobierska Ula Budziszewska) - Add pipelines tab to merge requests + - Fix notification_service argument error of declined invitation emails - Fix a memory leak caused by Banzai::Filter::SanitizationFilter - Speed up todos queries by limiting the projects set we join with - Ensure file editing in UI does not overwrite commited changes without warning user diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb index 66a838b3d13..6139ed56e25 100644 --- a/app/services/notification_service.rb +++ b/app/services/notification_service.rb @@ -242,7 +242,6 @@ class NotificationService project_member.real_source_type, project_member.project.id, project_member.invite_email, - project_member.access_level, project_member.created_by_id ).deliver_later end @@ -269,7 +268,6 @@ class NotificationService group_member.real_source_type, group_member.group.id, group_member.invite_email, - group_member.access_level, group_member.created_by_id ).deliver_later end diff --git a/spec/services/notification_service_spec.rb b/spec/services/notification_service_spec.rb index 18da3b1b453..f81a58899fd 100644 --- a/spec/services/notification_service_spec.rb +++ b/spec/services/notification_service_spec.rb @@ -1113,6 +1113,46 @@ describe NotificationService, services: true do end end + describe 'GroupMember' do + describe '#decline_group_invite' do + let(:creator) { create(:user) } + let(:group) { create(:group) } + let(:member) { create(:user) } + + before(:each) do + group.add_owner(creator) + group.add_developer(member, creator) + end + + it do + group_member = group.members.first + + expect do + notification.decline_group_invite(group_member) + end.to change { ActionMailer::Base.deliveries.size }.by(1) + end + end + end + + describe 'ProjectMember' do + describe '#decline_group_invite' do + let(:project) { create(:project) } + let(:member) { create(:user) } + + before(:each) do + project.team << [member, :developer, project.owner] + end + + it do + project_member = project.members.first + + expect do + notification.decline_project_invite(project_member) + end.to change { ActionMailer::Base.deliveries.size }.by(1) + end + end + end + def build_team(project) @u_watcher = create_global_setting_for(create(:user), :watch) @u_participating = create_global_setting_for(create(:user), :participating) From c15dc455f12a37713b82a9a2f1e1017d6fbfac5f Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Fri, 19 Aug 2016 14:43:02 +0200 Subject: [PATCH 38/50] Move and improvement comment in pipeline fixtures --- db/fixtures/development/14_pipelines.rb | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/db/fixtures/development/14_pipelines.rb b/db/fixtures/development/14_pipelines.rb index 36b0d16bfb9..49e6e2361b1 100644 --- a/db/fixtures/development/14_pipelines.rb +++ b/db/fixtures/development/14_pipelines.rb @@ -74,6 +74,10 @@ class Gitlab::Seeder::Pipelines .merge(commands: '$ build command') Ci::Build.create!(attributes).tap do |build| + # We need to set build trace and artifacts after saving a build + # (id required), that is why we need `#tap` method instead of passing + # block directly to `Ci::Build#create!`. + setup_artifacts(build) setup_build_log(build) build.save @@ -93,11 +97,6 @@ class Gitlab::Seeder::Pipelines end def setup_build_log(build) - ## - # We need to set build trace after saving a build (id required) - # That is why we need `#tap` method instead of passing block - # directly to `Ci::Build#create!`. - # if %w(running success failed).include?(build.status) build.trace = FFaker::Lorem.paragraphs(6).join("\n\n") end From 52c610246007087dcb3dbcf9ab900c27197576d3 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Wed, 6 Jul 2016 18:19:43 +0100 Subject: [PATCH 39/50] Destroy branch delete tooltip when row is removed Closes #19528 --- app/assets/javascripts/application.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index a122fa2d637..c77983896a3 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -153,7 +153,9 @@ }); }); $('.remove-row').bind('ajax:success', function() { - return $(this).closest('li').fadeOut(); + $(this).tooltip('destroy') + .closest('li') + .fadeOut(); }); $('.js-remove-tr').bind('ajax:before', function() { return $(this).hide(); From 0da7a892bb7fec5c580a6a15d2d9f02cf9d86db1 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Wed, 20 Jul 2016 10:33:21 +0100 Subject: [PATCH 40/50] Added tests --- .../features/projects/branches/delete_spec.rb | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 spec/features/projects/branches/delete_spec.rb diff --git a/spec/features/projects/branches/delete_spec.rb b/spec/features/projects/branches/delete_spec.rb new file mode 100644 index 00000000000..77acceca7eb --- /dev/null +++ b/spec/features/projects/branches/delete_spec.rb @@ -0,0 +1,22 @@ +require 'spec_helper' + +feature 'Delete branch', feature: true, js: true do + let(:project) { create(:project) } + let(:user) { create(:user) } + + before do + project.team << [user, :master] + login_as user + visit namespace_project_branches_path(project.namespace, project) + end + + it 'destroys tooltip' do + first('.remove-row').hover + expect(page).to have_selector('.tooltip') + + first('.remove-row').click + sleep 1 + + expect(page).not_to have_selector('.tooltip') + end +end From 25465751c17f8202e6edb8b345ae783b31067dd2 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Thu, 18 Aug 2016 14:08:01 +0100 Subject: [PATCH 41/50] Change sleep to wait_for_ajax --- spec/features/projects/branches/delete_spec.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spec/features/projects/branches/delete_spec.rb b/spec/features/projects/branches/delete_spec.rb index 77acceca7eb..63878c55421 100644 --- a/spec/features/projects/branches/delete_spec.rb +++ b/spec/features/projects/branches/delete_spec.rb @@ -1,6 +1,8 @@ require 'spec_helper' feature 'Delete branch', feature: true, js: true do + include WaitForAjax + let(:project) { create(:project) } let(:user) { create(:user) } @@ -15,7 +17,7 @@ feature 'Delete branch', feature: true, js: true do expect(page).to have_selector('.tooltip') first('.remove-row').click - sleep 1 + wait_for_ajax expect(page).not_to have_selector('.tooltip') end From 71d65467a859af34fb6f1ed251679dfa6e8631ec Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Date: Wed, 17 Aug 2016 17:45:52 -0500 Subject: [PATCH 42/50] Fix alignment of icon on commits page --- app/assets/stylesheets/pages/commit.scss | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/app/assets/stylesheets/pages/commit.scss b/app/assets/stylesheets/pages/commit.scss index fe8a8025038..53ec0002afe 100644 --- a/app/assets/stylesheets/pages/commit.scss +++ b/app/assets/stylesheets/pages/commit.scss @@ -68,22 +68,11 @@ } .ci-status-link { - margin-left: 2px; svg { - vertical-align: middle; - } - - .ci-status-label { - display: inline-block; - } - - &:hover { - text-decoration: none; - - .ci-status-label { - text-decoration: underline; - } + position: relative; + top: 2px; + margin: 0 2px 0 3px; } } } From 560d468dc6bebe07614ce964c9c2338f38d7bfed Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Date: Wed, 17 Aug 2016 17:46:31 -0500 Subject: [PATCH 43/50] Have hover color of builds span full width --- app/assets/stylesheets/pages/builds.scss | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/pages/builds.scss b/app/assets/stylesheets/pages/builds.scss index 81fce55853c..c1bb250b42d 100644 --- a/app/assets/stylesheets/pages/builds.scss +++ b/app/assets/stylesheets/pages/builds.scss @@ -168,7 +168,6 @@ text-overflow: ellipsis; &:hover { - background-color: $row-hover; color: $gl-text-color; } } @@ -190,6 +189,10 @@ display: block; } } + + &:hover { + background-color: $row-hover; + } } } } From 1ac37d97e6870b59db7983d6e84714777500017c Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Date: Thu, 18 Aug 2016 09:18:56 -0500 Subject: [PATCH 44/50] Add play icon SVG --- app/assets/stylesheets/pages/pipelines.scss | 15 +++++++++++---- app/helpers/ci_status_helper.rb | 2 +- app/views/shared/icons/_icon_play.svg | 1 + 3 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 app/views/shared/icons/_icon_play.svg diff --git a/app/assets/stylesheets/pages/pipelines.scss b/app/assets/stylesheets/pages/pipelines.scss index ce1c424624f..6fa097e3bf1 100644 --- a/app/assets/stylesheets/pages/pipelines.scss +++ b/app/assets/stylesheets/pages/pipelines.scss @@ -300,6 +300,17 @@ &.playable { background-color: $gray-light; + + svg { + height: 12px; + width: 12px; + position: relative; + top: 1px; + + path { + fill: $layout-link-gray; + } + } } .build-content { @@ -319,10 +330,6 @@ margin-right: 5px; } - .fa { - font-size: 13px; - } - // Connect first build in each stage with right horizontal line &:first-child { &::after { diff --git a/app/helpers/ci_status_helper.rb b/app/helpers/ci_status_helper.rb index 94df7d131ca..bb285a17baf 100644 --- a/app/helpers/ci_status_helper.rb +++ b/app/helpers/ci_status_helper.rb @@ -39,7 +39,7 @@ module CiStatusHelper when 'running' 'icon_status_running' when 'play' - return icon('play fw') + 'icon_play' when 'created' 'icon_status_pending' else diff --git a/app/views/shared/icons/_icon_play.svg b/app/views/shared/icons/_icon_play.svg new file mode 100644 index 00000000000..80a6d41dbf6 --- /dev/null +++ b/app/views/shared/icons/_icon_play.svg @@ -0,0 +1 @@ + \ No newline at end of file From 931274baab8357fca15094f7f82fd78f35f70c2c Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Wed, 13 Jul 2016 11:53:27 +0100 Subject: [PATCH 45/50] Added tooltip to label value in collapsed sidebar Closes #19398 --- CHANGELOG | 2 ++ app/assets/javascripts/labels_select.js | 30 ++++++++++++++-- app/helpers/issuables_helper.rb | 14 ++++++++ app/views/shared/issuable/_sidebar.html.haml | 2 +- spec/features/issues/issue_sidebar_spec.rb | 38 ++++++++++++++++++++ 5 files changed, 83 insertions(+), 3 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index fec7c56c32d..d7b561f8922 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -300,6 +300,8 @@ v 8.10.0 - Reduce size of HTML used by diff comment forms - Protected branches have a "Developers can Merge" setting. !4892 (original implementation by Mathias Vestergaard) - Fix user creation with stronger minimum password requirements. !4054 (nathan-pmt) + - Added tooltip listing label names to the labels value in the collapsed issuable sidebar + - Fix user creation with stronger minimum password requirements !4054 (nathan-pmt) - Only show New Snippet button to users that can create snippets. - PipelinesFinder uses git cache data - Track a user who created a pipeline diff --git a/app/assets/javascripts/labels_select.js b/app/assets/javascripts/labels_select.js index 0526430989f..c26d902bac1 100644 --- a/app/assets/javascripts/labels_select.js +++ b/app/assets/javascripts/labels_select.js @@ -4,7 +4,7 @@ var _this; _this = this; $('.js-label-select').each(function(i, dropdown) { - var $block, $colorPreview, $dropdown, $form, $loading, $selectbox, $sidebarCollapsedValue, $value, abilityName, defaultLabel, enableLabelCreateButton, issueURLSplit, issueUpdateURL, labelHTMLTemplate, labelNoneHTMLTemplate, labelUrl, projectId, saveLabelData, selectedLabel, showAny, showNo; + var $block, $colorPreview, $dropdown, $form, $loading, $selectbox, $sidebarCollapsedValue, $value, abilityName, defaultLabel, enableLabelCreateButton, issueURLSplit, issueUpdateURL, labelHTMLTemplate, labelNoneHTMLTemplate, labelUrl, projectId, saveLabelData, selectedLabel, showAny, showNo, $sidebarLabelTooltip; $dropdown = $(dropdown); projectId = $dropdown.data('project-id'); labelUrl = $dropdown.data('labels'); @@ -21,6 +21,7 @@ $block = $selectbox.closest('.block'); $form = $dropdown.closest('form'); $sidebarCollapsedValue = $block.find('.sidebar-collapsed-icon span'); + $sidebarLabelTooltip = $block.find('.js-sidebar-labels-tooltip'); $value = $block.find('.value'); $loading = $block.find('.block-loading').fadeOut(); if (issueUpdateURL != null) { @@ -52,7 +53,7 @@ dataType: 'JSON', data: data }).done(function(data) { - var labelCount, template; + var labelCount, template, labelTooltipTitle; $loading.fadeOut(); $dropdown.trigger('loaded.gl.dropdown'); $selectbox.hide(); @@ -66,6 +67,31 @@ } $value.removeAttr('style').html(template); $sidebarCollapsedValue.text(labelCount); + + if (data.labels.length) { + labelTooltipTitle = _.chain(data.labels) + .map(function (label, i) { + if (i < 5) { + return label.title; + } + }) + .compact() + .values(); + + if (data.labels.length > 5) { + labelTooltipTitle.push('and ' + (data.labels.length - 5) + ' more'); + } + + labelTooltipTitle = labelTooltipTitle.join(', '); + } else { + labelTooltipTitle = ''; + $sidebarLabelTooltip.tooltip('destroy'); + } + + $sidebarLabelTooltip + .attr('title', labelTooltipTitle) + .tooltip('fixTitle'); + $('.has-tooltip', $value).tooltip({ container: 'body' }); diff --git a/app/helpers/issuables_helper.rb b/app/helpers/issuables_helper.rb index 47d174361db..b95a3e95001 100644 --- a/app/helpers/issuables_helper.rb +++ b/app/helpers/issuables_helper.rb @@ -72,6 +72,20 @@ module IssuablesHelper end end + def issuable_labels_tooltip(labels) + max_labels = 5 + label_size = labels.size + label_names = labels.each_with_index.map do |label, i| + label.name unless i >= max_labels + end + + if label_size > max_labels + label_names << "and #{label_size - max_labels} more" + end + + label_names.compact.join(', ') + end + private def sidebar_gutter_collapsed? diff --git a/app/views/shared/issuable/_sidebar.html.haml b/app/views/shared/issuable/_sidebar.html.haml index 8e2fcbdfab8..c1b50e65af5 100644 --- a/app/views/shared/issuable/_sidebar.html.haml +++ b/app/views/shared/issuable/_sidebar.html.haml @@ -109,7 +109,7 @@ - if issuable.project.labels.any? .block.labels - .sidebar-collapsed-icon + .sidebar-collapsed-icon.js-sidebar-labels-tooltip{ title: issuable_labels_tooltip(issuable.labels_array), data: { placement: "left", container: "body" } } = icon('tags') %span = issuable.labels_array.size diff --git a/spec/features/issues/issue_sidebar_spec.rb b/spec/features/issues/issue_sidebar_spec.rb index 4b1aec8bf71..a6acbd5a701 100644 --- a/spec/features/issues/issue_sidebar_spec.rb +++ b/spec/features/issues/issue_sidebar_spec.rb @@ -73,6 +73,44 @@ feature 'Issue Sidebar', feature: true do end end + context 'update labels', js: true do + before do + project.team << [user, :developer] + visit_issue(project, issue) + end + + context 'more than 5' do + before do + create(:label, project: project, title: 'a') + create(:label, project: project, title: 'b') + create(:label, project: project, title: 'c') + create(:label, project: project, title: 'd') + create(:label, project: project, title: 'e') + create(:label, project: project, title: 'f') + end + + it 'should update the tooltip for collapsed sidebar' do + page.within('.block.labels') do + find('.edit-link').click + + page.within('.dropdown-menu-labels') do + click_link 'a' + click_link 'b' + click_link 'c' + click_link 'd' + click_link 'e' + click_link 'f' + end + + find('.edit-link').click + sleep 1 + + expect(find('.js-sidebar-labels-tooltip', visible: false)['data-original-title']).to eq('a, b, c, d, e, and 1 more') + end + end + end + end + def visit_issue(project, issue) visit namespace_project_issue_path(project.namespace, project, issue) end From 696740844b58cc24cd983a1b87acc9f7a6acaad7 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Wed, 3 Aug 2016 11:30:36 +0100 Subject: [PATCH 46/50] Made logic simpler by moving away from underscorejs --- app/assets/javascripts/labels_select.js | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/app/assets/javascripts/labels_select.js b/app/assets/javascripts/labels_select.js index c26d902bac1..5eb9def1982 100644 --- a/app/assets/javascripts/labels_select.js +++ b/app/assets/javascripts/labels_select.js @@ -53,7 +53,7 @@ dataType: 'JSON', data: data }).done(function(data) { - var labelCount, template, labelTooltipTitle; + var labelCount, template, labelTooltipTitle, labelTitles; $loading.fadeOut(); $dropdown.trigger('loaded.gl.dropdown'); $selectbox.hide(); @@ -69,20 +69,16 @@ $sidebarCollapsedValue.text(labelCount); if (data.labels.length) { - labelTooltipTitle = _.chain(data.labels) - .map(function (label, i) { - if (i < 5) { - return label.title; - } - }) - .compact() - .values(); + labelTitles = data.labels.map(function(label) { + return label.title; + }); - if (data.labels.length > 5) { - labelTooltipTitle.push('and ' + (data.labels.length - 5) + ' more'); + if (labelTitles.length > 5) { + labelTitles = labelTitles.slice(0, 5); + labelTitles.push('and ' + (data.labels.length - 5) + ' more'); } - labelTooltipTitle = labelTooltipTitle.join(', '); + labelTooltipTitle = labelTitles.join(', '); } else { labelTooltipTitle = ''; $sidebarLabelTooltip.tooltip('destroy'); From 87284321ffc23fde2be175cb9ba01a5aa37071a6 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Thu, 18 Aug 2016 11:38:12 +0100 Subject: [PATCH 47/50] Addressed feedback --- CHANGELOG | 3 +-- app/assets/javascripts/labels_select.js | 2 ++ app/helpers/issuables_helper.rb | 16 ++++++---------- app/views/shared/issuable/_sidebar.html.haml | 2 +- spec/features/issues/issue_sidebar_spec.rb | 4 +++- 5 files changed, 13 insertions(+), 14 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index d7b561f8922..2ff1be3322b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -18,6 +18,7 @@ v 8.11.0 (unreleased) - API: Endpoints for enabling and disabling deploy keys - API: List access requests, request access, approve, and deny access requests to a project or a group. !4833 - Use long options for curl examples in documentation !5703 (winniehell) + - Added tooltip listing label names to the labels value in the collapsed issuable sidebar - Remove magic comments (`# encoding: UTF-8`) from Ruby files. !5456 (winniehell) - Fix badge count alignment (ClemMakesApps) - GitLab Performance Monitoring can now track custom events such as the number of tags pushed to a repository @@ -300,8 +301,6 @@ v 8.10.0 - Reduce size of HTML used by diff comment forms - Protected branches have a "Developers can Merge" setting. !4892 (original implementation by Mathias Vestergaard) - Fix user creation with stronger minimum password requirements. !4054 (nathan-pmt) - - Added tooltip listing label names to the labels value in the collapsed issuable sidebar - - Fix user creation with stronger minimum password requirements !4054 (nathan-pmt) - Only show New Snippet button to users that can create snippets. - PipelinesFinder uses git cache data - Track a user who created a pipeline diff --git a/app/assets/javascripts/labels_select.js b/app/assets/javascripts/labels_select.js index 5eb9def1982..8dbbd9dd517 100644 --- a/app/assets/javascripts/labels_select.js +++ b/app/assets/javascripts/labels_select.js @@ -32,6 +32,8 @@ labelNoneHTMLTemplate = 'None'; } + $sidebarLabelTooltip.tooltip(); + new gl.CreateLabelDropdown($dropdown.closest('.dropdown').find('.dropdown-new-label'), projectId); saveLabelData = function() { diff --git a/app/helpers/issuables_helper.rb b/app/helpers/issuables_helper.rb index b95a3e95001..c3f4c1b148d 100644 --- a/app/helpers/issuables_helper.rb +++ b/app/helpers/issuables_helper.rb @@ -72,18 +72,14 @@ module IssuablesHelper end end - def issuable_labels_tooltip(labels) - max_labels = 5 - label_size = labels.size - label_names = labels.each_with_index.map do |label, i| - label.name unless i >= max_labels - end + def issuable_labels_tooltip(labels, limit: 5) + first = labels[0...limit] + last = labels[(limit-1)...-1] - if label_size > max_labels - label_names << "and #{label_size - max_labels} more" - end + label_names = first.collect(&:name) + label_names << "and #{last.size} more" unless last.empty? - label_names.compact.join(', ') + label_names.join(', ') end private diff --git a/app/views/shared/issuable/_sidebar.html.haml b/app/views/shared/issuable/_sidebar.html.haml index c1b50e65af5..bb18ef2536e 100644 --- a/app/views/shared/issuable/_sidebar.html.haml +++ b/app/views/shared/issuable/_sidebar.html.haml @@ -109,7 +109,7 @@ - if issuable.project.labels.any? .block.labels - .sidebar-collapsed-icon.js-sidebar-labels-tooltip{ title: issuable_labels_tooltip(issuable.labels_array), data: { placement: "left", container: "body" } } + .sidebar-collapsed-icon.js-sidebar-labels-tooltip{ title: issuable_labels_tooltip(issuable.labels), data: { placement: "left", container: "body" } } = icon('tags') %span = issuable.labels_array.size diff --git a/spec/features/issues/issue_sidebar_spec.rb b/spec/features/issues/issue_sidebar_spec.rb index a6acbd5a701..b043bc3feee 100644 --- a/spec/features/issues/issue_sidebar_spec.rb +++ b/spec/features/issues/issue_sidebar_spec.rb @@ -1,6 +1,8 @@ require 'rails_helper' feature 'Issue Sidebar', feature: true do + include WaitForAjax + let(:project) { create(:project) } let(:issue) { create(:issue, project: project) } let!(:user) { create(:user)} @@ -103,7 +105,7 @@ feature 'Issue Sidebar', feature: true do end find('.edit-link').click - sleep 1 + wait_for_ajax expect(find('.js-sidebar-labels-tooltip', visible: false)['data-original-title']).to eq('a, b, c, d, e, and 1 more') end From bcf304b04ac4bd7e7863421f84a388ab4039b80f Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Thu, 18 Aug 2016 13:59:09 +0100 Subject: [PATCH 48/50] Changed tests to use JS tests --- app/assets/javascripts/labels_select.js | 4 +- app/helpers/issuables_helper.rb | 3 +- app/views/shared/issuable/_sidebar.html.haml | 2 +- spec/features/issues/issue_sidebar_spec.rb | 40 --------- spec/helpers/issuable_helper_spec.rb | 16 ++++ .../fixtures/issue_sidebar_label.html.haml | 16 ++++ .../labels_issue_sidebar_spec.js.es6 | 89 +++++++++++++++++++ 7 files changed, 126 insertions(+), 44 deletions(-) create mode 100644 spec/helpers/issuable_helper_spec.rb create mode 100644 spec/javascripts/fixtures/issue_sidebar_label.html.haml create mode 100644 spec/javascripts/labels_issue_sidebar_spec.js.es6 diff --git a/app/assets/javascripts/labels_select.js b/app/assets/javascripts/labels_select.js index 8dbbd9dd517..565dbeacdb3 100644 --- a/app/assets/javascripts/labels_select.js +++ b/app/assets/javascripts/labels_select.js @@ -34,7 +34,9 @@ $sidebarLabelTooltip.tooltip(); - new gl.CreateLabelDropdown($dropdown.closest('.dropdown').find('.dropdown-new-label'), projectId); + if ($dropdown.closest('.dropdown').find('.dropdown-new-label').length) { + new gl.CreateLabelDropdown($dropdown.closest('.dropdown').find('.dropdown-new-label'), projectId); + } saveLabelData = function() { var data, selected; diff --git a/app/helpers/issuables_helper.rb b/app/helpers/issuables_helper.rb index c3f4c1b148d..b9baeb1d6c4 100644 --- a/app/helpers/issuables_helper.rb +++ b/app/helpers/issuables_helper.rb @@ -73,8 +73,7 @@ module IssuablesHelper end def issuable_labels_tooltip(labels, limit: 5) - first = labels[0...limit] - last = labels[(limit-1)...-1] + first, last = labels.partition.with_index{ |_, i| i < limit } label_names = first.collect(&:name) label_names << "and #{last.size} more" unless last.empty? diff --git a/app/views/shared/issuable/_sidebar.html.haml b/app/views/shared/issuable/_sidebar.html.haml index bb18ef2536e..c1b50e65af5 100644 --- a/app/views/shared/issuable/_sidebar.html.haml +++ b/app/views/shared/issuable/_sidebar.html.haml @@ -109,7 +109,7 @@ - if issuable.project.labels.any? .block.labels - .sidebar-collapsed-icon.js-sidebar-labels-tooltip{ title: issuable_labels_tooltip(issuable.labels), data: { placement: "left", container: "body" } } + .sidebar-collapsed-icon.js-sidebar-labels-tooltip{ title: issuable_labels_tooltip(issuable.labels_array), data: { placement: "left", container: "body" } } = icon('tags') %span = issuable.labels_array.size diff --git a/spec/features/issues/issue_sidebar_spec.rb b/spec/features/issues/issue_sidebar_spec.rb index b043bc3feee..4b1aec8bf71 100644 --- a/spec/features/issues/issue_sidebar_spec.rb +++ b/spec/features/issues/issue_sidebar_spec.rb @@ -1,8 +1,6 @@ require 'rails_helper' feature 'Issue Sidebar', feature: true do - include WaitForAjax - let(:project) { create(:project) } let(:issue) { create(:issue, project: project) } let!(:user) { create(:user)} @@ -75,44 +73,6 @@ feature 'Issue Sidebar', feature: true do end end - context 'update labels', js: true do - before do - project.team << [user, :developer] - visit_issue(project, issue) - end - - context 'more than 5' do - before do - create(:label, project: project, title: 'a') - create(:label, project: project, title: 'b') - create(:label, project: project, title: 'c') - create(:label, project: project, title: 'd') - create(:label, project: project, title: 'e') - create(:label, project: project, title: 'f') - end - - it 'should update the tooltip for collapsed sidebar' do - page.within('.block.labels') do - find('.edit-link').click - - page.within('.dropdown-menu-labels') do - click_link 'a' - click_link 'b' - click_link 'c' - click_link 'd' - click_link 'e' - click_link 'f' - end - - find('.edit-link').click - wait_for_ajax - - expect(find('.js-sidebar-labels-tooltip', visible: false)['data-original-title']).to eq('a, b, c, d, e, and 1 more') - end - end - end - end - def visit_issue(project, issue) visit namespace_project_issue_path(project.namespace, project, issue) end diff --git a/spec/helpers/issuable_helper_spec.rb b/spec/helpers/issuable_helper_spec.rb new file mode 100644 index 00000000000..2dd2eab0524 --- /dev/null +++ b/spec/helpers/issuable_helper_spec.rb @@ -0,0 +1,16 @@ +require 'spec_helper' + +describe IssuablesHelper do + let(:label) { build_stubbed(:label) } + let(:label2) { build_stubbed(:label) } + + context 'label tooltip' do + it 'returns label text' do + expect(issuable_labels_tooltip([label])).to eq(label.title) + end + + it 'returns label text' do + expect(issuable_labels_tooltip([label, label2], limit: 1)).to eq("#{label.title}, and 1 more") + end + end +end diff --git a/spec/javascripts/fixtures/issue_sidebar_label.html.haml b/spec/javascripts/fixtures/issue_sidebar_label.html.haml new file mode 100644 index 00000000000..74421730b98 --- /dev/null +++ b/spec/javascripts/fixtures/issue_sidebar_label.html.haml @@ -0,0 +1,16 @@ +.block.labels + .sidebar-collapsed-icon.js-sidebar-labels-tooltip + .title.hide-collapsed + %a.edit-link.pull-right{ href: "#" } + Edit + .selectbox.hide-collapsed{ style: "display: none;" } + .dropdown + %button.dropdown-menu-toggle.js-label-select.js-multiselect{"data-ability-name" => "issue", "data-field-name" => "issue[label_names][]", "data-issue-update" => "/root/test/issues/2.json", "data-labels" => "/root/test/labels.json", "data-project-id" => "12", "data-show-any" => "true", "data-show-no" => "true", "data-toggle" => "dropdown", :type => "button"} + %span.dropdown-toggle-text + Label + %i.fa.fa-chevron-down + .dropdown-menu.dropdown-select.dropdown-menu-paging.dropdown-menu-labels.dropdown-menu-selectable + .dropdown-page-one + .dropdown-content + .dropdown-loading + %i.fa.fa-spinner.fa-spin diff --git a/spec/javascripts/labels_issue_sidebar_spec.js.es6 b/spec/javascripts/labels_issue_sidebar_spec.js.es6 new file mode 100644 index 00000000000..840c7b6d015 --- /dev/null +++ b/spec/javascripts/labels_issue_sidebar_spec.js.es6 @@ -0,0 +1,89 @@ +//= require lib/utils/type_utility +//= require jquery +//= require bootstrap +//= require gl_dropdown +//= require select2 +//= require jquery.nicescroll +//= require api +//= require create_label +//= require issuable_context +//= require users_select +//= require labels_select + +(() => { + let saveLabelCount = 0; + describe('Issue dropdown sidebar', () => { + fixture.preload('issue_sidebar_label.html'); + + beforeEach(() => { + fixture.load('issue_sidebar_label.html'); + new IssuableContext('{"id":1,"name":"Administrator","username":"root"}'); + new LabelsSelect(); + + spyOn(jQuery, 'ajax').and.callFake((req) => { + const d = $.Deferred(); + let LABELS_DATA = [] + + if (req.url === '/root/test/labels.json') { + for (let i = 0; i < 10; i++) { + LABELS_DATA.push({id: i, title: `test ${i}`, color: '#5CB85C'}); + } + } else if (req.url === '/root/test/issues/2.json') { + let tmp = [] + for (let i = 0; i < saveLabelCount; i++) { + tmp.push({id: i, title: `test ${i}`, color: '#5CB85C'}); + } + LABELS_DATA = {labels: tmp}; + } + + d.resolve(LABELS_DATA); + return d.promise(); + }); + }); + + it('changes collapsed tooltip when changing labels when less than 5', (done) => { + saveLabelCount = 5; + $('.edit-link').get(0).click(); + + setTimeout(() => { + expect($('.dropdown-content a').length).toBe(10); + + $('.dropdow-content a').each((i, $link) => { + if (i < 5) { + $link.get(0).click(); + } + }); + + $('.edit-link').get(0).click(); + + setTimeout(() => { + expect($('.sidebar-collapsed-icon').attr('data-original-title')).toBe('test 0, test 1, test 2, test 3, test 4'); + done(); + }, 0); + }, 0); + }); + + it('changes collapsed tooltip when changing labels when more than 5', (done) => { + saveLabelCount = 6; + $('.edit-link').get(0).click(); + + setTimeout(() => { + expect($('.dropdown-content a').length).toBe(10); + + $('.dropdow-content a').each((i, $link) => { + if (i < 5) { + $link.get(0).click(); + } + }); + + $('.edit-link').get(0).click(); + + setTimeout(() => { + expect($('.sidebar-collapsed-icon').attr('data-original-title')).toBe('test 0, test 1, test 2, test 3, test 4, and 1 more'); + done(); + }, 0); + }, 0); + }); + }); +})(); + From d1b987fd05ef650cfb227da5828a1cd4fc811436 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Fri, 19 Aug 2016 15:36:49 +0100 Subject: [PATCH 49/50] Changed file name Updated spec HAML --- CHANGELOG | 2 +- .../{issuable_helper_spec.rb => issuables_helper_spec.rb} | 0 spec/javascripts/fixtures/issue_sidebar_label.html.haml | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename spec/helpers/{issuable_helper_spec.rb => issuables_helper_spec.rb} (100%) diff --git a/CHANGELOG b/CHANGELOG index 2ff1be3322b..e37b43668e7 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -18,7 +18,7 @@ v 8.11.0 (unreleased) - API: Endpoints for enabling and disabling deploy keys - API: List access requests, request access, approve, and deny access requests to a project or a group. !4833 - Use long options for curl examples in documentation !5703 (winniehell) - - Added tooltip listing label names to the labels value in the collapsed issuable sidebar + - Added tooltip listing label names to the labels value in the collapsed issuable sidebar - Remove magic comments (`# encoding: UTF-8`) from Ruby files. !5456 (winniehell) - Fix badge count alignment (ClemMakesApps) - GitLab Performance Monitoring can now track custom events such as the number of tags pushed to a repository diff --git a/spec/helpers/issuable_helper_spec.rb b/spec/helpers/issuables_helper_spec.rb similarity index 100% rename from spec/helpers/issuable_helper_spec.rb rename to spec/helpers/issuables_helper_spec.rb diff --git a/spec/javascripts/fixtures/issue_sidebar_label.html.haml b/spec/javascripts/fixtures/issue_sidebar_label.html.haml index 74421730b98..397bdc85c67 100644 --- a/spec/javascripts/fixtures/issue_sidebar_label.html.haml +++ b/spec/javascripts/fixtures/issue_sidebar_label.html.haml @@ -5,7 +5,7 @@ Edit .selectbox.hide-collapsed{ style: "display: none;" } .dropdown - %button.dropdown-menu-toggle.js-label-select.js-multiselect{"data-ability-name" => "issue", "data-field-name" => "issue[label_names][]", "data-issue-update" => "/root/test/issues/2.json", "data-labels" => "/root/test/labels.json", "data-project-id" => "12", "data-show-any" => "true", "data-show-no" => "true", "data-toggle" => "dropdown", :type => "button"} + %button.dropdown-menu-toggle.js-label-select.js-multiselect{ type: "button", data: { ability_name: "issue", field_name: "issue[label_names][]", issue_update: "/root/test/issues/2.json", labels: "/root/test/labels.json", project_id: "12", show_any: "true", show_no: "true", toggle: "dropdown" } } %span.dropdown-toggle-text Label %i.fa.fa-chevron-down From 63fc0a9db5c4893a28e3ae60f519e141deb4ce9e Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Fri, 19 Aug 2016 16:04:19 +0100 Subject: [PATCH 50/50] Increased vertical alignment of labels for issues in lists --- app/assets/stylesheets/pages/boards.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/stylesheets/pages/boards.scss b/app/assets/stylesheets/pages/boards.scss index ad4b2d6496f..c2cdd45b6e1 100644 --- a/app/assets/stylesheets/pages/boards.scss +++ b/app/assets/stylesheets/pages/boards.scss @@ -316,6 +316,7 @@ .card-footer { margin-top: 5px; + line-height: 25px; .label { margin-right: 4px;