From 775b2961fe64f9485dc0cf905b2caf597f40a3cc Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Thu, 4 Mar 2021 06:11:17 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- .../issue_show/components/edit_actions.vue | 16 +++-- app/views/notify/_users_list.html.haml | 10 ++++ ...rge_when_pipeline_succeeds_email.html.haml | 18 ++---- ...rge_when_pipeline_succeeds_email.text.haml | 1 + ...ation-to-merge-request-email-notificat.yml | 5 ++ .../321752-cablett-delete-epic-warning.yml | 5 ++ .../sh-fix-kroki-format-filtering.yml | 5 ++ doc/user/group/epics/manage_epics.md | 3 + lib/gitlab/kroki.rb | 3 - locale/gitlab.pot | 6 ++ qa/qa/page/dashboard/snippet/edit.rb | 6 +- spec/lib/gitlab/kroki_spec.rb | 38 ++++++++++++ spec/mailers/emails/merge_requests_spec.rb | 60 +++++++++++-------- 13 files changed, 131 insertions(+), 45 deletions(-) create mode 100644 app/views/notify/_users_list.html.haml create mode 100644 changelogs/unreleased/300750-add-missing-reviewers-information-to-merge-request-email-notificat.yml create mode 100644 changelogs/unreleased/321752-cablett-delete-epic-warning.yml create mode 100644 changelogs/unreleased/sh-fix-kroki-format-filtering.yml create mode 100644 spec/lib/gitlab/kroki_spec.rb diff --git a/app/assets/javascripts/issue_show/components/edit_actions.vue b/app/assets/javascripts/issue_show/components/edit_actions.vue index dd378c40b46..20c759cfbbd 100644 --- a/app/assets/javascripts/issue_show/components/edit_actions.vue +++ b/app/assets/javascripts/issue_show/components/edit_actions.vue @@ -45,15 +45,23 @@ export default { shouldShowDeleteButton() { return this.canDestroy && this.showDeleteButton; }, + deleteIssuableButtonText() { + return sprintf(__('Delete %{issuableType}'), { + issuableType: issuableTypes[this.issuableType], + }); + }, }, methods: { closeForm() { eventHub.$emit('close.form'); }, deleteIssuable() { - const confirmMessage = sprintf(__('%{issuableType} will be removed! Are you sure?'), { - issuableType: issuableTypes[this.issuableType], - }); + const confirmMessage = + this.issuableType === 'epic' + ? __('Delete this epic and all descendants?') + : sprintf(__('%{issuableType} will be removed! Are you sure?'), { + issuableType: issuableTypes[this.issuableType], + }); // eslint-disable-next-line no-alert if (window.confirm(confirmMessage)) { this.deleteLoading = true; @@ -90,7 +98,7 @@ export default { class="float-right gl-mr-3 qa-delete-button" @click="deleteIssuable" > - {{ __('Delete') }} + {{ deleteIssuableButtonText }} diff --git a/app/views/notify/_users_list.html.haml b/app/views/notify/_users_list.html.haml new file mode 100644 index 00000000000..3e436ea8765 --- /dev/null +++ b/app/views/notify/_users_list.html.haml @@ -0,0 +1,10 @@ +%tr + %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;border-top:1px solid #ededed;" } + = user_label + %td{ style: "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; margin: 0; padding: 14px 0 0px 5px; font-size: 15px; line-height: 1.4; color: #333333; font-weight: 400; width: 75%; border-top-style: solid; border-top-color: #ededed; border-top-width: 1px; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt;" } + %ul.users-list{ style: "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; font-size: 15px; line-height: 1.4; padding-right: 5px; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt;" } + - users.each do |user| + %li + %img.avatar{ alt: "Avatar", height: "24", src: avatar_icon_for_user(user, 24, only_path: false), style: "border-radius: 12px; max-width: 100%; height: auto; -ms-interpolation-mode: bicubic; margin: -2px 0;", width: "24" } + %a.muted{ href: user_url(user), style: "color: #333333; text-decoration: none; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; vertical-align: top;" } + = user.name diff --git a/app/views/notify/merge_when_pipeline_succeeds_email.html.haml b/app/views/notify/merge_when_pipeline_succeeds_email.html.haml index 4db213fb229..e7c51c8fb13 100644 --- a/app/views/notify/merge_when_pipeline_succeeds_email.html.haml +++ b/app/views/notify/merge_when_pipeline_succeeds_email.html.haml @@ -42,13 +42,13 @@ } } - ul.assignees-list { + ul.users-list { list-style: none; padding: 0px; display: block; margin-top: 0px; } - ul.assignees-list li { + ul.users-list li { display: inline-block; padding-right: 12px; padding-top: 8px; @@ -137,16 +137,10 @@ = @merge_request.author.name - if @merge_request.assignees.any? - %tr - %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;border-top:1px solid #ededed;" } - = assignees_label(@merge_request, include_value: false) - %td{ style: "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; margin: 0; padding: 14px 0 0px 5px; font-size: 15px; line-height: 1.4; color: #333333; font-weight: 400; width: 75%; border-top-style: solid; border-top-color: #ededed; border-top-width: 1px; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt;" } - %ul.assignees-list{ style: "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; font-size: 15px; line-height: 1.4; padding-right: 5px; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt;" } - - @merge_request.assignees.each do |assignee| - %li - %img.avatar{ alt: "Avatar", height: "24", src: avatar_icon_for_user(assignee, 24, only_path: false), style: "border-radius: 12px; max-width: 100%; height: auto; -ms-interpolation-mode: bicubic; margin: -2px 0;", width: "24" } - %a.muted{ href: user_url(assignee), style: "color: #333333; text-decoration: none; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; vertical-align: top;" } - = assignee.name + = render 'users_list', users: @merge_request.assignees, user_label: assignees_label(@merge_request, include_value: false) + + - if @merge_request.reviewers.any? + = render 'users_list', users: @merge_request.reviewers, user_label: reviewers_label(@merge_request, include_value: false) = render_if_exists 'layouts/mailer/additional_text' diff --git a/app/views/notify/merge_when_pipeline_succeeds_email.text.haml b/app/views/notify/merge_when_pipeline_succeeds_email.text.haml index fdc23a6af0f..de29dda6c71 100644 --- a/app/views/notify/merge_when_pipeline_succeeds_email.text.haml +++ b/app/views/notify/merge_when_pipeline_succeeds_email.text.haml @@ -6,3 +6,4 @@ Merge Request url: #{project_merge_request_url(@merge_request.target_project, @m Author: #{sanitize_name(@merge_request.author_name)} = assignees_label(@merge_request) += reviewers_label(@merge_request) diff --git a/changelogs/unreleased/300750-add-missing-reviewers-information-to-merge-request-email-notificat.yml b/changelogs/unreleased/300750-add-missing-reviewers-information-to-merge-request-email-notificat.yml new file mode 100644 index 00000000000..5b23c6204b6 --- /dev/null +++ b/changelogs/unreleased/300750-add-missing-reviewers-information-to-merge-request-email-notificat.yml @@ -0,0 +1,5 @@ +--- +title: Add reviewers detail to merge when pipeline succeeds email +merge_request: 55463 +author: +type: added diff --git a/changelogs/unreleased/321752-cablett-delete-epic-warning.yml b/changelogs/unreleased/321752-cablett-delete-epic-warning.yml new file mode 100644 index 00000000000..6ca739c60b7 --- /dev/null +++ b/changelogs/unreleased/321752-cablett-delete-epic-warning.yml @@ -0,0 +1,5 @@ +--- +title: Clarify epic delete warning +merge_request: 55574 +author: +type: changed diff --git a/changelogs/unreleased/sh-fix-kroki-format-filtering.yml b/changelogs/unreleased/sh-fix-kroki-format-filtering.yml new file mode 100644 index 00000000000..7c5f3d210ae --- /dev/null +++ b/changelogs/unreleased/sh-fix-kroki-format-filtering.yml @@ -0,0 +1,5 @@ +--- +title: Fix disabling of Kroki optional formats +merge_request: 55665 +author: +type: fixed diff --git a/doc/user/group/epics/manage_epics.md b/doc/user/group/epics/manage_epics.md index d4c1a5fc768..98aed0b52a1 100644 --- a/doc/user/group/epics/manage_epics.md +++ b/doc/user/group/epics/manage_epics.md @@ -75,6 +75,9 @@ A modal appears to confirm your action. Deleting an epic releases all existing issues from their associated epic in the system. +WARNING: +If you delete an epic, all its child epics and their descendants are deleted as well. If needed, you can [remove child epics](#remove-a-child-epic-from-a-parent-epic) from the parent epic before you delete it. + ## Close an epic Whenever you decide that there is no longer need for that epic, diff --git a/lib/gitlab/kroki.rb b/lib/gitlab/kroki.rb index 2948b6ebd5b..fa10e922c80 100644 --- a/lib/gitlab/kroki.rb +++ b/lib/gitlab/kroki.rb @@ -31,9 +31,6 @@ module Gitlab DIAGRAMS_FORMATS end - # No additional diagram formats - return diagram_formats unless current_settings.kroki_formats.present? - # Diagrams that require a companion container must be explicitly enabled from the settings diagram_formats.select do |diagram_type| current_settings.kroki_format_supported?(diagram_type) diff --git a/locale/gitlab.pot b/locale/gitlab.pot index c030018c6c2..e7916e963f7 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -9766,6 +9766,9 @@ msgstr "" msgid "Delete" msgstr "" +msgid "Delete %{issuableType}" +msgstr "" + msgid "Delete %{name}" msgstr "" @@ -9823,6 +9826,9 @@ msgstr "" msgid "Delete this attachment" msgstr "" +msgid "Delete this epic and all descendants?" +msgstr "" + msgid "Delete user list" msgstr "" diff --git a/qa/qa/page/dashboard/snippet/edit.rb b/qa/qa/page/dashboard/snippet/edit.rb index 40add146e97..cd8ac77ae04 100644 --- a/qa/qa/page/dashboard/snippet/edit.rb +++ b/qa/qa/page/dashboard/snippet/edit.rb @@ -18,13 +18,17 @@ module QA element :delete_file_button end + view 'app/assets/javascripts/snippets/components/snippet_visibility_edit.vue' do + element :visibility_content + end + def add_to_file_content(content) text_area.set content text_area.has_text?(content) # wait for changes to take effect end def change_visibility_to(visibility_type) - choose(visibility_type) + click_element(:visibility_content, visibility: visibility_type) end def click_add_file diff --git a/spec/lib/gitlab/kroki_spec.rb b/spec/lib/gitlab/kroki_spec.rb new file mode 100644 index 00000000000..cb3d41528f5 --- /dev/null +++ b/spec/lib/gitlab/kroki_spec.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true +require 'spec_helper' + +RSpec.describe Gitlab::Kroki do + using RSpec::Parameterized::TableSyntax + + describe '.formats' do + def default_formats + %w[bytefield c4plantuml ditaa erd graphviz nomnoml plantuml svgbob umlet vega vegalite wavedrow].freeze + end + + subject { described_class.formats(Gitlab::CurrentSettings) } + + where(:enabled_formats, :expected_formats) do + '' | default_formats + 'blockdiag' | default_formats + %w[actdiag blockdiag nwdiag packetdiag rackdiag seqdiag] + 'bpmn' | default_formats + %w[bpmn] + 'excalidraw' | default_formats + %w[excalidraw] + end + + with_them do + before do + kroki_formats = + if enabled_formats.present? + { enabled_formats => true } + else + {} + end + + stub_application_setting(kroki_enabled: true, kroki_url: "http://localhost:8000", kroki_formats: kroki_formats) + end + + it 'returns the expected formats' do + expect(subject).to match_array(expected_formats) + end + end + end +end diff --git a/spec/mailers/emails/merge_requests_spec.rb b/spec/mailers/emails/merge_requests_spec.rb index 34665d943ab..5ab0265203e 100644 --- a/spec/mailers/emails/merge_requests_spec.rb +++ b/spec/mailers/emails/merge_requests_spec.rb @@ -6,37 +6,47 @@ require 'email_spec' RSpec.describe Emails::MergeRequests do include EmailSpec::Matchers - describe "#resolved_all_discussions_email" do - let(:user) { create(:user) } - let(:merge_request) { create(:merge_request) } - let(:current_user) { create(:user) } + let_it_be(:recipient) { create(:user) } + let_it_be(:current_user) { create(:user) } + let_it_be(:assignee, reload: true) { create(:user, email: 'assignee@example.com', name: 'John Doe') } + let_it_be(:reviewer, reload: true) { create(:user, email: 'reviewer@example.com', name: 'Jane Doe') } + let_it_be(:project) { create(:project, :repository) } + let_it_be(:merge_request) do + create(:merge_request, source_project: project, + target_project: project, + author: current_user, + assignees: [assignee], + reviewers: [reviewer], + description: 'Awesome description') + end - subject { Notify.resolved_all_discussions_email(user.id, merge_request.id, current_user.id) } + describe "#merge_when_pipeline_succeeds_email" do + let(:title) { "Merge request #{merge_request.to_reference} was scheduled to merge after pipeline succeeds by #{current_user.name}" } + + subject { Notify.merge_when_pipeline_succeeds_email(recipient.id, merge_request.id, current_user.id) } + + it "has required details" do + aggregate_failures do + expect(subject).to have_content title + expect(subject).to have_content merge_request.to_reference + expect(subject).to have_content current_user.name + expect(subject.html_part).to have_content(assignee.name) + expect(subject.text_part).to have_content(assignee.name) + expect(subject.html_part).to have_content(reviewer.name) + expect(subject.text_part).to have_content(reviewer.name) + end + end + end + + describe "#resolved_all_discussions_email" do + subject { Notify.resolved_all_discussions_email(recipient.id, merge_request.id, current_user.id) } it "includes the name of the resolver" do expect(subject).to have_body_text current_user.name end end - describe "#merge_when_pipeline_succeeds_email" do - let(:user) { create(:user) } - let(:merge_request) { create(:merge_request) } - let(:current_user) { create(:user) } - let(:project) { create(:project, :repository) } - let(:title) { "Merge request #{merge_request.to_reference} was scheduled to merge after pipeline succeeds by #{current_user.name}" } - - subject { Notify.merge_when_pipeline_succeeds_email(user.id, merge_request.id, current_user.id) } - - it "has required details" do - expect(subject).to have_content title - expect(subject).to have_content merge_request.to_reference - expect(subject).to have_content current_user.name - end - end - describe '#merge_requests_csv_email' do - let(:user) { create(:user) } - let(:project) { create(:project) } let(:merge_requests) { create_list(:merge_request, 10) } let(:export_status) do { @@ -48,10 +58,10 @@ RSpec.describe Emails::MergeRequests do let(:csv_data) { MergeRequests::ExportCsvService.new(MergeRequest.all, project).csv_data } - subject { Notify.merge_requests_csv_email(user, project, csv_data, export_status) } + subject { Notify.merge_requests_csv_email(recipient, project, csv_data, export_status) } it { expect(subject.subject).to eq("#{project.name} | Exported merge requests") } - it { expect(subject.to).to contain_exactly(user.notification_email_for(project.group)) } + it { expect(subject.to).to contain_exactly(recipient.notification_email_for(project.group)) } it { expect(subject.html_part).to have_content("Your CSV export of 10 merge requests from project") } it { expect(subject.text_part).to have_content("Your CSV export of 10 merge requests from project") }