diff options
author | Brett Walker <bwalker@gitlab.com> | 2018-10-18 20:06:33 -0500 |
---|---|---|
committer | Brett Walker <bwalker@gitlab.com> | 2018-10-31 19:01:04 -0500 |
commit | a8869a571b3093004d8777cfe1a3e56a22db0210 (patch) | |
tree | f1bde41b632802a45489ac30de861ef330efe0c6 | |
parent | 31733b6fc5a9ba4443a5dd279e787e2fd8e31c6d (diff) | |
download | gitlab-ce-a8869a571b3093004d8777cfe1a3e56a22db0210.tar.gz |
Dynamically store the valid label endpoint
In order to ensure we have the right endpoint to query for an
issue's possible valid labels, we store that url in the issue
object that gets passed to the frontend.
-rw-r--r-- | app/assets/javascripts/boards/models/issue.js | 1 | ||||
-rw-r--r-- | app/assets/javascripts/labels_select.js | 2 | ||||
-rw-r--r-- | app/models/issue.rb | 3 | ||||
-rw-r--r-- | app/views/shared/boards/components/sidebar/_labels.html.haml | 4 | ||||
-rw-r--r-- | changelogs/unreleased/51620-cannot-add-label-to-issue-from-board.yml | 4 | ||||
-rw-r--r-- | spec/features/groups/board_sidebar_spec.rb | 45 | ||||
-rw-r--r-- | spec/fixtures/api/schemas/issue.json | 1 |
7 files changed, 56 insertions, 4 deletions
diff --git a/app/assets/javascripts/boards/models/issue.js b/app/assets/javascripts/boards/models/issue.js index bb3b2865934..ce03c21c90f 100644 --- a/app/assets/javascripts/boards/models/issue.js +++ b/app/assets/javascripts/boards/models/issue.js @@ -30,6 +30,7 @@ class ListIssue { this.toggleSubscriptionEndpoint = obj.toggle_subscription_endpoint; this.milestone_id = obj.milestone_id; this.project_id = obj.project_id; + this.validLabelsEndpoint = obj.valid_labels_endpoint; if (obj.project) { this.project = new IssueProject(obj.project); diff --git a/app/assets/javascripts/labels_select.js b/app/assets/javascripts/labels_select.js index 5457604b3b9..c0a76814102 100644 --- a/app/assets/javascripts/labels_select.js +++ b/app/assets/javascripts/labels_select.js @@ -59,7 +59,6 @@ export default class LabelsSelect { $toggleText = $dropdown.find('.dropdown-toggle-text'); namespacePath = $dropdown.data('namespacePath'); projectPath = $dropdown.data('projectPath'); - labelUrl = $dropdown.data('labels'); issueUpdateURL = $dropdown.data('issueUpdate'); selectedLabel = $dropdown.data('selected'); if (selectedLabel != null && !$dropdown.hasClass('js-multiselect')) { @@ -168,6 +167,7 @@ export default class LabelsSelect { $dropdown.glDropdown({ showMenuAbove: showMenuAbove, data: function(term, callback) { + labelUrl = $dropdown.attr('data-labels'); axios .get(labelUrl) .then(res => { diff --git a/app/models/issue.rb b/app/models/issue.rb index 4ace5d3ab97..50ea0c830ee 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -240,7 +240,8 @@ class Issue < ActiveRecord::Base reference_path: issue_reference, real_path: url_helper.project_issue_path(project, self), issue_sidebar_endpoint: url_helper.project_issue_path(project, self, format: :json, serializer: 'sidebar'), - toggle_subscription_endpoint: url_helper.toggle_subscription_project_issue_path(project, self) + toggle_subscription_endpoint: url_helper.toggle_subscription_project_issue_path(project, self), + valid_labels_endpoint: url_helper.project_labels_path(project, format: :json, include_ancestor_groups: true) ) end diff --git a/app/views/shared/boards/components/sidebar/_labels.html.haml b/app/views/shared/boards/components/sidebar/_labels.html.haml index 6138914206b..3448ee8350b 100644 --- a/app/views/shared/boards/components/sidebar/_labels.html.haml +++ b/app/views/shared/boards/components/sidebar/_labels.html.haml @@ -19,13 +19,13 @@ ":value" => "label.id" } .dropdown %button.dropdown-menu-toggle.js-label-select.js-multiselect.js-issue-board-sidebar{ type: "button", - "v-bind:data-selected" => "selectedLabels", + ":data-selected" => "selectedLabels", + ":data-labels" => "issue.validLabelsEndpoint", data: { toggle: "dropdown", field_name: "issue[label_names][]", show_no: "true", show_any: "true", project_id: @project&.try(:id), - labels: labels_filter_path_with_defaults, namespace_path: @namespace_path, project_path: @project.try(:path) } } %span.dropdown-toggle-text diff --git a/changelogs/unreleased/51620-cannot-add-label-to-issue-from-board.yml b/changelogs/unreleased/51620-cannot-add-label-to-issue-from-board.yml new file mode 100644 index 00000000000..9e99779d352 --- /dev/null +++ b/changelogs/unreleased/51620-cannot-add-label-to-issue-from-board.yml @@ -0,0 +1,4 @@ +title: Make Issue Board sidebar show project-specific labels based on selected Issue +merge_request: 22475 +author: +type: fixed diff --git a/spec/features/groups/board_sidebar_spec.rb b/spec/features/groups/board_sidebar_spec.rb new file mode 100644 index 00000000000..9f597efa7b7 --- /dev/null +++ b/spec/features/groups/board_sidebar_spec.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe 'Group Issue Boards', :js do + include BoardHelpers + + let(:group) { create(:group) } + let(:user) { create(:group_member, user: create(:user), group: group ).user } + let!(:project_1) { create(:project, :public, group: group) } + let!(:project_2) { create(:project, :public, group: group) } + let!(:project_1_label) { create(:label, project: project_1, name: 'Development 1') } + let!(:project_2_label) { create(:label, project: project_2, name: 'Development 2') } + let!(:group_label) { create(:group_label, title: 'Bug', description: 'Fusce consequat', group: group) } + let!(:issue_1) { create(:labeled_issue, project: project_1, relative_position: 1) } + let!(:issue_2) { create(:labeled_issue, project: project_2, relative_position: 2) } + let(:board) { create(:board, group: group) } + let!(:list) { create(:list, board: board, label: project_1_label, position: 0) } + let(:card) { find('.board:nth-child(1)').first('.board-card') } + + before do + sign_in(user) + + visit group_board_path(group, board) + wait_for_requests + end + + context 'labels' do + it 'only shows valid labels for the issue project and group' do + click_card(card) + + page.within('.labels') do + click_link 'Edit' + + wait_for_requests + + page.within('.selectbox') do + expect(page).to have_content(project_1_label.title) + expect(page).to have_content(group_label.title) + expect(page).not_to have_content(project_2_label.title) + end + end + end + end +end diff --git a/spec/fixtures/api/schemas/issue.json b/spec/fixtures/api/schemas/issue.json index 8833825e3fb..28f11115428 100644 --- a/spec/fixtures/api/schemas/issue.json +++ b/spec/fixtures/api/schemas/issue.json @@ -15,6 +15,7 @@ "relative_position": { "type": "integer" }, "issue_sidebar_endpoint": { "type": "string" }, "toggle_subscription_endpoint": { "type": "string" }, + "valid_labels_endpoint": { "type": "string" }, "reference_path": { "type": "string" }, "real_path": { "type": "string" }, "project": { |