Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
f56bae9a64
commit
775b2961fe
|
@ -45,15 +45,23 @@ export default {
|
||||||
shouldShowDeleteButton() {
|
shouldShowDeleteButton() {
|
||||||
return this.canDestroy && this.showDeleteButton;
|
return this.canDestroy && this.showDeleteButton;
|
||||||
},
|
},
|
||||||
|
deleteIssuableButtonText() {
|
||||||
|
return sprintf(__('Delete %{issuableType}'), {
|
||||||
|
issuableType: issuableTypes[this.issuableType],
|
||||||
|
});
|
||||||
|
},
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
closeForm() {
|
closeForm() {
|
||||||
eventHub.$emit('close.form');
|
eventHub.$emit('close.form');
|
||||||
},
|
},
|
||||||
deleteIssuable() {
|
deleteIssuable() {
|
||||||
const confirmMessage = sprintf(__('%{issuableType} will be removed! Are you sure?'), {
|
const confirmMessage =
|
||||||
issuableType: issuableTypes[this.issuableType],
|
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
|
// eslint-disable-next-line no-alert
|
||||||
if (window.confirm(confirmMessage)) {
|
if (window.confirm(confirmMessage)) {
|
||||||
this.deleteLoading = true;
|
this.deleteLoading = true;
|
||||||
|
@ -90,7 +98,7 @@ export default {
|
||||||
class="float-right gl-mr-3 qa-delete-button"
|
class="float-right gl-mr-3 qa-delete-button"
|
||||||
@click="deleteIssuable"
|
@click="deleteIssuable"
|
||||||
>
|
>
|
||||||
{{ __('Delete') }}
|
{{ deleteIssuableButtonText }}
|
||||||
</gl-button>
|
</gl-button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -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
|
|
@ -42,13 +42,13 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ul.assignees-list {
|
ul.users-list {
|
||||||
list-style: none;
|
list-style: none;
|
||||||
padding: 0px;
|
padding: 0px;
|
||||||
display: block;
|
display: block;
|
||||||
margin-top: 0px;
|
margin-top: 0px;
|
||||||
}
|
}
|
||||||
ul.assignees-list li {
|
ul.users-list li {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
padding-right: 12px;
|
padding-right: 12px;
|
||||||
padding-top: 8px;
|
padding-top: 8px;
|
||||||
|
@ -137,16 +137,10 @@
|
||||||
= @merge_request.author.name
|
= @merge_request.author.name
|
||||||
|
|
||||||
- if @merge_request.assignees.any?
|
- if @merge_request.assignees.any?
|
||||||
%tr
|
= render 'users_list', users: @merge_request.assignees, user_label: assignees_label(@merge_request, include_value: false)
|
||||||
%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)
|
- if @merge_request.reviewers.any?
|
||||||
%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;" }
|
= render 'users_list', users: @merge_request.reviewers, user_label: reviewers_label(@merge_request, include_value: false)
|
||||||
%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_if_exists 'layouts/mailer/additional_text'
|
= render_if_exists 'layouts/mailer/additional_text'
|
||||||
|
|
||||||
|
|
|
@ -6,3 +6,4 @@ Merge Request url: #{project_merge_request_url(@merge_request.target_project, @m
|
||||||
|
|
||||||
Author: #{sanitize_name(@merge_request.author_name)}
|
Author: #{sanitize_name(@merge_request.author_name)}
|
||||||
= assignees_label(@merge_request)
|
= assignees_label(@merge_request)
|
||||||
|
= reviewers_label(@merge_request)
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: Add reviewers detail to merge when pipeline succeeds email
|
||||||
|
merge_request: 55463
|
||||||
|
author:
|
||||||
|
type: added
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: Clarify epic delete warning
|
||||||
|
merge_request: 55574
|
||||||
|
author:
|
||||||
|
type: changed
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: Fix disabling of Kroki optional formats
|
||||||
|
merge_request: 55665
|
||||||
|
author:
|
||||||
|
type: fixed
|
|
@ -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.
|
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
|
## Close an epic
|
||||||
|
|
||||||
Whenever you decide that there is no longer need for that epic,
|
Whenever you decide that there is no longer need for that epic,
|
||||||
|
|
|
@ -31,9 +31,6 @@ module Gitlab
|
||||||
DIAGRAMS_FORMATS
|
DIAGRAMS_FORMATS
|
||||||
end
|
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
|
# Diagrams that require a companion container must be explicitly enabled from the settings
|
||||||
diagram_formats.select do |diagram_type|
|
diagram_formats.select do |diagram_type|
|
||||||
current_settings.kroki_format_supported?(diagram_type)
|
current_settings.kroki_format_supported?(diagram_type)
|
||||||
|
|
|
@ -9766,6 +9766,9 @@ msgstr ""
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Delete %{issuableType}"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Delete %{name}"
|
msgid "Delete %{name}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -9823,6 +9826,9 @@ msgstr ""
|
||||||
msgid "Delete this attachment"
|
msgid "Delete this attachment"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Delete this epic and all descendants?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Delete user list"
|
msgid "Delete user list"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
|
@ -18,13 +18,17 @@ module QA
|
||||||
element :delete_file_button
|
element :delete_file_button
|
||||||
end
|
end
|
||||||
|
|
||||||
|
view 'app/assets/javascripts/snippets/components/snippet_visibility_edit.vue' do
|
||||||
|
element :visibility_content
|
||||||
|
end
|
||||||
|
|
||||||
def add_to_file_content(content)
|
def add_to_file_content(content)
|
||||||
text_area.set content
|
text_area.set content
|
||||||
text_area.has_text?(content) # wait for changes to take effect
|
text_area.has_text?(content) # wait for changes to take effect
|
||||||
end
|
end
|
||||||
|
|
||||||
def change_visibility_to(visibility_type)
|
def change_visibility_to(visibility_type)
|
||||||
choose(visibility_type)
|
click_element(:visibility_content, visibility: visibility_type)
|
||||||
end
|
end
|
||||||
|
|
||||||
def click_add_file
|
def click_add_file
|
||||||
|
|
|
@ -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
|
|
@ -6,37 +6,47 @@ require 'email_spec'
|
||||||
RSpec.describe Emails::MergeRequests do
|
RSpec.describe Emails::MergeRequests do
|
||||||
include EmailSpec::Matchers
|
include EmailSpec::Matchers
|
||||||
|
|
||||||
describe "#resolved_all_discussions_email" do
|
let_it_be(:recipient) { create(:user) }
|
||||||
let(:user) { create(:user) }
|
let_it_be(:current_user) { create(:user) }
|
||||||
let(:merge_request) { create(:merge_request) }
|
let_it_be(:assignee, reload: true) { create(:user, email: 'assignee@example.com', name: 'John Doe') }
|
||||||
let(:current_user) { create(:user) }
|
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
|
it "includes the name of the resolver" do
|
||||||
expect(subject).to have_body_text current_user.name
|
expect(subject).to have_body_text current_user.name
|
||||||
end
|
end
|
||||||
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
|
describe '#merge_requests_csv_email' do
|
||||||
let(:user) { create(:user) }
|
|
||||||
let(:project) { create(:project) }
|
|
||||||
let(:merge_requests) { create_list(:merge_request, 10) }
|
let(:merge_requests) { create_list(:merge_request, 10) }
|
||||||
let(:export_status) do
|
let(:export_status) do
|
||||||
{
|
{
|
||||||
|
@ -48,10 +58,10 @@ RSpec.describe Emails::MergeRequests do
|
||||||
|
|
||||||
let(:csv_data) { MergeRequests::ExportCsvService.new(MergeRequest.all, project).csv_data }
|
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.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.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") }
|
it { expect(subject.text_part).to have_content("Your CSV export of 10 merge requests from project") }
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue