From 07fa8e097bfc1143cfe362a0a4f2031d4792b73b Mon Sep 17 00:00:00 2001 From: Peter Hegman <phegman@gitlab.com> Date: Tue, 18 Jan 2022 00:17:51 +0000 Subject: [PATCH] Add `Delete` button to label edit view Allow users to delete labels from the edit view Changelog: added --- .../labels/components/delete_label_modal.vue | 13 +++++++ .../pages/admin/labels/edit/index.js | 2 ++ .../pages/groups/labels/edit/index.js | 2 ++ .../pages/projects/labels/edit/index.js | 2 ++ app/models/label.rb | 2 +- app/presenters/label_presenter.rb | 6 ++-- app/views/shared/labels/_form.html.haml | 15 +++++--- doc/user/admin_area/img/admin_labels.png | Bin 23063 -> 0 bytes .../admin_area/img/admin_labels_v14_7.png | Bin 0 -> 10804 bytes doc/user/admin_area/labels.md | 9 +++-- doc/user/project/labels.md | 7 ++-- spec/factories/labels.rb | 2 ++ spec/features/admin/admin_labels_spec.rb | 16 +++++++++ spec/features/groups/labels/edit_spec.rb | 14 ++++++++ .../projects/labels/user_edits_labels_spec.rb | 14 ++++++++ .../labels/delete_label_modal_spec.js | 33 +++++++++++++----- spec/presenters/label_presenter_spec.rb | 25 +++++++++++++ 17 files changed, 138 insertions(+), 24 deletions(-) delete mode 100644 doc/user/admin_area/img/admin_labels.png create mode 100644 doc/user/admin_area/img/admin_labels_v14_7.png diff --git a/app/assets/javascripts/labels/components/delete_label_modal.vue b/app/assets/javascripts/labels/components/delete_label_modal.vue index 1ff0938d0867..2be404de1e15 100644 --- a/app/assets/javascripts/labels/components/delete_label_modal.vue +++ b/app/assets/javascripts/labels/components/delete_label_modal.vue @@ -56,6 +56,7 @@ export default { </gl-sprintf> </template> <gl-sprintf + v-if="subjectName" :message=" __( `%{strongStart}${labelName}%{strongEnd} will be permanently deleted from ${subjectName}. This cannot be undone.`, @@ -66,6 +67,18 @@ export default { <strong>{{ content }}</strong> </template> </gl-sprintf> + <gl-sprintf + v-else + :message=" + __( + `%{strongStart}${labelName}%{strongEnd} will be permanently deleted. This cannot be undone.`, + ) + " + > + <template #strong="{ content }"> + <strong>{{ content }}</strong> + </template> + </gl-sprintf> <template #modal-footer> <gl-button category="secondary" @click="closeModal">{{ __('Cancel') }}</gl-button> <gl-button diff --git a/app/assets/javascripts/pages/admin/labels/edit/index.js b/app/assets/javascripts/pages/admin/labels/edit/index.js index a3b9c43388a8..a5eee2857df3 100644 --- a/app/assets/javascripts/pages/admin/labels/edit/index.js +++ b/app/assets/javascripts/pages/admin/labels/edit/index.js @@ -1,3 +1,5 @@ import Labels from '~/labels/labels'; +import { initDeleteLabelModal } from '~/labels'; new Labels(); // eslint-disable-line no-new +initDeleteLabelModal(); diff --git a/app/assets/javascripts/pages/groups/labels/edit/index.js b/app/assets/javascripts/pages/groups/labels/edit/index.js index e4e377f62fcf..c032321d0396 100644 --- a/app/assets/javascripts/pages/groups/labels/edit/index.js +++ b/app/assets/javascripts/pages/groups/labels/edit/index.js @@ -1,4 +1,6 @@ import Labels from 'ee_else_ce/labels/labels'; +import { initDeleteLabelModal } from '~/labels'; // eslint-disable-next-line no-new new Labels(); +initDeleteLabelModal(); diff --git a/app/assets/javascripts/pages/projects/labels/edit/index.js b/app/assets/javascripts/pages/projects/labels/edit/index.js index c4d7af39767a..cb554e3d4da5 100644 --- a/app/assets/javascripts/pages/projects/labels/edit/index.js +++ b/app/assets/javascripts/pages/projects/labels/edit/index.js @@ -1,3 +1,5 @@ import Labels from 'ee_else_ce/labels/labels'; +import { initDeleteLabelModal } from '~/labels'; new Labels(); // eslint-disable-line no-new +initDeleteLabelModal(); diff --git a/app/models/label.rb b/app/models/label.rb index a46d6bc5c0ff..0ebbb5b9bd34 100644 --- a/app/models/label.rb +++ b/app/models/label.rb @@ -260,7 +260,7 @@ def hook_attrs attributes end - def present(attributes) + def present(attributes = {}) super(**attributes.merge(presenter_class: ::LabelPresenter)) end diff --git a/app/presenters/label_presenter.rb b/app/presenters/label_presenter.rb index fafade2828f0..8d604f9a0f6d 100644 --- a/app/presenters/label_presenter.rb +++ b/app/presenters/label_presenter.rb @@ -2,7 +2,7 @@ class LabelPresenter < Gitlab::View::Presenter::Delegated presents ::Label, as: :label - delegate :name, :full_name, to: :label_subject, prefix: :subject + delegate :name, :full_name, to: :label_subject, prefix: :subject, allow_nil: true delegator_override :subject # TODO: Fix `Gitlab::View::Presenter::Delegated#subject` not to override `Label#subject`. @@ -10,6 +10,7 @@ def edit_path case label when GroupLabel then edit_group_label_path(label.group, label) when ProjectLabel then edit_project_label_path(label.project, label) + else edit_admin_label_path(label) end end @@ -17,6 +18,7 @@ def destroy_path case label when GroupLabel then group_label_path(label.group, label) when ProjectLabel then project_label_path(label.project, label) + else admin_label_path(label) end end @@ -43,7 +45,7 @@ def project_label? end def label_subject - @label_subject ||= label.subject + @label_subject ||= label.subject if label.respond_to?(:subject) end private diff --git a/app/views/shared/labels/_form.html.haml b/app/views/shared/labels/_form.html.haml index 9c17735cd14d..29f6dc02749f 100644 --- a/app/views/shared/labels/_form.html.haml +++ b/app/views/shared/labels/_form.html.haml @@ -26,9 +26,14 @@ %br = _("Or you can choose one of the suggested colors below") = render_suggested_colors - .form-actions + .gl-display-flex.gl-justify-content-space-between.gl-p-5.gl-bg-gray-10.gl-border-t-solid.gl-border-t-gray-100.gl-border-t-1 + %div + - if @label.persisted? + = f.submit _('Save changes'), class: 'btn gl-button btn-confirm js-save-button' + - else + = f.submit _('Create label'), class: 'btn gl-button btn-confirm js-save-button qa-label-create-button' + = link_to _('Cancel'), back_path, class: 'btn gl-button btn-default btn-cancel' - if @label.persisted? - = f.submit _('Save changes'), class: 'btn gl-button btn-confirm js-save-button' - - else - = f.submit _('Create label'), class: 'btn gl-button btn-confirm js-save-button qa-label-create-button' - = link_to _('Cancel'), back_path, class: 'btn gl-button btn-default btn-cancel' + - presented_label = @label.present + %button.btn.btn-danger.gl-button.btn-danger-secondary.js-delete-label-modal-button{ type: 'button', data: { label_name: presented_label.name, subject_name: presented_label.subject_name, destroy_path: presented_label.destroy_path } } + %span.gl-button-text= _('Delete') diff --git a/doc/user/admin_area/img/admin_labels.png b/doc/user/admin_area/img/admin_labels.png deleted file mode 100644 index a9ea059ccf9dd1c8ffa1522db955a867fed40f07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23063 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 diff --git a/doc/user/admin_area/img/admin_labels_v14_7.png b/doc/user/admin_area/img/admin_labels_v14_7.png new file mode 100644 index 0000000000000000000000000000000000000000..01a4ea0c2ccfee2f74e858cf94f79b1f4b6c90c1 GIT binary patch literal 10804 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¨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 literal 0 HcmV?d00001 diff --git a/doc/user/admin_area/labels.md b/doc/user/admin_area/labels.md index b5dbf835d70d..93114186e756 100644 --- a/doc/user/admin_area/labels.md +++ b/doc/user/admin_area/labels.md @@ -7,13 +7,12 @@ type: reference # Labels administration **(FREE SELF)** -In the Admin Area, you can manage labels for the GitLab instance. For more details, see [Labels](../project/labels.md). +To manage labels for the GitLab instance, select **Labels** (**{labels}**) from the Admin Area sidebar. For more details on how to manage labels, see [Labels](../project/labels.md). -## Default Labels +Labels created in the Admin Area are automatically added to new projects. +Updating or adding labels in the Admin Area does not modify labels in existing projects. -Labels created in the Admin Area become available to each _new_ project. - - + <!-- ## Troubleshooting diff --git a/doc/user/project/labels.md b/doc/user/project/labels.md index 8874512f9c3f..7ccc39eeb8bd 100644 --- a/doc/user/project/labels.md +++ b/doc/user/project/labels.md @@ -90,9 +90,10 @@ label section of the right sidebar of an issue or a merge request: color value for a specific color. 1. Click **Create**. -Once created, you can edit a label by clicking the pencil (**{pencil}**), or delete -a label by clicking the three dots (**{ellipsis_v}**) next to the **Subscribe** button -and selecting **Delete**. +To edit a label after you create it, select (**{pencil}**). + +To delete a project label, select (**{ellipsis_v}**) next to the **Subscribe** button +and select **Delete** or select **Delete** when you edit a label. WARNING: If you delete a label, it is permanently deleted. All references to the label are removed from the system and you cannot undo the deletion. diff --git a/spec/factories/labels.rb b/spec/factories/labels.rb index a9a9416c48bb..f0cef41db69b 100644 --- a/spec/factories/labels.rb +++ b/spec/factories/labels.rb @@ -42,4 +42,6 @@ factory :group_label, traits: [:base_label] do group end + + factory :admin_label, traits: [:base_label], class: 'Label' end diff --git a/spec/features/admin/admin_labels_spec.rb b/spec/features/admin/admin_labels_spec.rb index 72afc040e3d6..ba0870a53ae0 100644 --- a/spec/features/admin/admin_labels_spec.rb +++ b/spec/features/admin/admin_labels_spec.rb @@ -3,6 +3,8 @@ require 'spec_helper' RSpec.describe 'admin issues labels' do + include Spec::Support::Helpers::ModalHelpers + let!(:bug_label) { Label.create!(title: 'bug', template: true) } let!(:feature_label) { Label.create!(title: 'feature', template: true) } @@ -99,5 +101,19 @@ expect(page).to have_content('fix') end end + + it 'allows user to delete label', :js do + visit edit_admin_label_path(bug_label) + + click_button 'Delete' + + within_modal do + expect(page).to have_content("#{bug_label.title} will be permanently deleted. This cannot be undone.") + + click_link 'Delete label' + end + + expect(page).to have_content('Label was removed') + end end end diff --git a/spec/features/groups/labels/edit_spec.rb b/spec/features/groups/labels/edit_spec.rb index 2be7f61eeb96..8e6560af3522 100644 --- a/spec/features/groups/labels/edit_spec.rb +++ b/spec/features/groups/labels/edit_spec.rb @@ -3,6 +3,8 @@ require 'spec_helper' RSpec.describe 'Edit group label' do + include Spec::Support::Helpers::ModalHelpers + let(:user) { create(:user) } let(:group) { create(:group) } let(:label) { create(:group_label, group: group) } @@ -20,4 +22,16 @@ expect(current_path).to eq(root_path) expect(label.reload.title).to eq('new label name') end + + it 'allows user to delete label', :js do + click_button 'Delete' + + within_modal do + expect(page).to have_content("#{label.title} will be permanently deleted from #{group.name}. This cannot be undone.") + + click_link 'Delete label' + end + + expect(page).to have_content("#{label.title} deleted permanently") + end end diff --git a/spec/features/projects/labels/user_edits_labels_spec.rb b/spec/features/projects/labels/user_edits_labels_spec.rb index 8300a1a85422..999c238c7b39 100644 --- a/spec/features/projects/labels/user_edits_labels_spec.rb +++ b/spec/features/projects/labels/user_edits_labels_spec.rb @@ -3,6 +3,8 @@ require "spec_helper" RSpec.describe "User edits labels" do + include Spec::Support::Helpers::ModalHelpers + let_it_be(:project) { create(:project_empty_repo, :public) } let_it_be(:label) { create(:label, project: project) } let_it_be(:user) { create(:user) } @@ -24,4 +26,16 @@ expect(page).to have_content(new_title).and have_no_content(label.title) end end + + it 'allows user to delete label', :js do + click_button 'Delete' + + within_modal do + expect(page).to have_content("#{label.title} will be permanently deleted from #{project.name}. This cannot be undone.") + + click_link 'Delete label' + end + + expect(page).to have_content('Label was removed') + end end diff --git a/spec/frontend/labels/delete_label_modal_spec.js b/spec/frontend/labels/delete_label_modal_spec.js index c1e6ce879901..980495389481 100644 --- a/spec/frontend/labels/delete_label_modal_spec.js +++ b/spec/frontend/labels/delete_label_modal_spec.js @@ -13,6 +13,10 @@ describe('DeleteLabelModal', () => { subjectName: 'GitLab Org', destroyPath: `${TEST_HOST}/2`, }, + { + labelName: 'admin label', + destroyPath: `${TEST_HOST}/3`, + }, ]; beforeEach(() => { @@ -22,8 +26,12 @@ describe('DeleteLabelModal', () => { const button = document.createElement('button'); button.setAttribute('class', 'js-delete-label-modal-button'); button.setAttribute('data-label-name', x.labelName); - button.setAttribute('data-subject-name', x.subjectName); button.setAttribute('data-destroy-path', x.destroyPath); + + if (x.subjectName) { + button.setAttribute('data-subject-name', x.subjectName); + } + button.innerHTML = 'Action'; buttonContainer.appendChild(button); }); @@ -62,6 +70,7 @@ describe('DeleteLabelModal', () => { index ${0} ${1} + ${2} `(`when multiple buttons exist`, ({ index }) => { beforeEach(() => { initDeleteLabelModal(); @@ -69,14 +78,22 @@ describe('DeleteLabelModal', () => { }); it('correct props are passed to gl-modal', () => { - expect(findModal().querySelector('.modal-title').innerHTML).toContain( - buttons[index].labelName, - ); - expect(findModal().querySelector('.modal-body').innerHTML).toContain( - buttons[index].subjectName, - ); + const button = buttons[index]; + + expect(findModal().querySelector('.modal-title').innerHTML).toContain(button.labelName); + + if (button.subjectName) { + expect(findModal().querySelector('.modal-body').textContent).toContain( + `${button.labelName} will be permanently deleted from ${button.subjectName}. This cannot be undone.`, + ); + } else { + expect(findModal().querySelector('.modal-body').textContent).toContain( + `${button.labelName} will be permanently deleted. This cannot be undone.`, + ); + } + expect(findModal().querySelector('.modal-footer .btn-danger').href).toContain( - buttons[index].destroyPath, + button.destroyPath, ); }); }); diff --git a/spec/presenters/label_presenter_spec.rb b/spec/presenters/label_presenter_spec.rb index bab0d9a10653..b4d36eaf3401 100644 --- a/spec/presenters/label_presenter_spec.rb +++ b/spec/presenters/label_presenter_spec.rb @@ -10,6 +10,7 @@ let(:label) { build_stubbed(:label, project: project).present(issuable_subject: project) } let(:group_label) { build_stubbed(:group_label, group: group).present(issuable_subject: project) } + let(:admin_label) { build_stubbed(:admin_label).present(issuable_subject: nil) } describe '#edit_path' do context 'with group label' do @@ -23,6 +24,12 @@ it { is_expected.to eq(edit_project_label_path(project, label)) } end + + context 'with an admin label' do + subject { admin_label.edit_path } + + it { is_expected.to eq(edit_admin_label_path(admin_label)) } + end end describe '#destroy_path' do @@ -37,6 +44,12 @@ it { is_expected.to eq(project_label_path(project, label)) } end + + context 'with an admin label' do + subject { admin_label.destroy_path } + + it { is_expected.to eq(admin_label_path(admin_label)) } + end end describe '#filter_path' do @@ -91,6 +104,12 @@ it { is_expected.to eq(label.project.name) } end + + context 'with an admin label' do + subject { admin_label.subject_name } + + it { is_expected.to be_nil } + end end describe '#subject_full_name' do @@ -105,5 +124,11 @@ it { is_expected.to eq(label.project.full_name) } end + + context 'with an admin label' do + subject { admin_label.subject_full_name } + + it { is_expected.to be_nil } + end end end -- GitLab