diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-03-16 00:07:57 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-03-16 00:07:57 +0300 |
commit | 512177dcc7369c6c3f4ae54cc8a0abcb73828f71 (patch) | |
tree | 3ceb4aba221a235c570f6f7e5398b88a381e3ead /app | |
parent | 7f08e6916d8259a8ed1549cb54460f0b746d9d8b (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
11 files changed, 65 insertions, 19 deletions
diff --git a/app/assets/javascripts/lib/utils/array_utility.js b/app/assets/javascripts/lib/utils/array_utility.js index 197e7790ed7..04f9cb1cdb5 100644 --- a/app/assets/javascripts/lib/utils/array_utility.js +++ b/app/assets/javascripts/lib/utils/array_utility.js @@ -18,3 +18,13 @@ export const swapArrayItems = (array, leftIndex = 0, rightIndex = 0) => { copy[rightIndex] = temp; return copy; }; + +/** + * Return an array with all duplicate items from the given array + * + * @param {Array} array - The source array + * @returns {Array} new array with all duplicate items + */ +export const getDuplicateItemsFromArray = (array) => [ + ...new Set(array.filter((value, index) => array.indexOf(value) !== index)), +]; diff --git a/app/assets/javascripts/notes/components/note_header.vue b/app/assets/javascripts/notes/components/note_header.vue index 0925195d4bb..71d767c3b95 100644 --- a/app/assets/javascripts/notes/components/note_header.vue +++ b/app/assets/javascripts/notes/components/note_header.vue @@ -6,6 +6,7 @@ import { GlSafeHtmlDirective as SafeHtml, } from '@gitlab/ui'; import { mapActions } from 'vuex'; +import { __ } from '~/locale'; import timeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue'; import UserNameWithStatus from '../../sidebar/components/assignees/user_name_with_status.vue'; @@ -139,6 +140,10 @@ export default { return selectedAuthor?.availability || ''; }, }, + i18n: { + showThread: __('Show thread'), + hideThread: __('Hide thread'), + }, }; </script> @@ -148,10 +153,16 @@ export default { <button class="note-action-button discussion-toggle-button js-vue-toggle-button" type="button" + data-testid="thread-toggle" @click="handleToggle" > <gl-icon ref="chevronIcon" :name="toggleChevronIconName" /> - {{ __('Toggle thread') }} + <template v-if="expanded"> + {{ $options.i18n.hideThread }} + </template> + <template v-else> + {{ $options.i18n.showThread }} + </template> </button> </div> <template v-if="hasAuthor"> diff --git a/app/assets/javascripts/releases/components/asset_links_form.vue b/app/assets/javascripts/releases/components/asset_links_form.vue index b9601428850..b81da399a7b 100644 --- a/app/assets/javascripts/releases/components/asset_links_form.vue +++ b/app/assets/javascripts/releases/components/asset_links_form.vue @@ -56,6 +56,9 @@ export default { hasDuplicateUrl(link) { return Boolean(this.getLinkErrors(link).isDuplicate); }, + hasDuplicateName(link) { + return Boolean(this.getLinkErrors(link).isTitleDuplicate); + }, hasBadFormat(link) { return Boolean(this.getLinkErrors(link).isBadFormat); }, @@ -72,7 +75,7 @@ export default { return !this.hasDuplicateUrl(link) && !this.hasBadFormat(link) && !this.hasEmptyUrl(link); }, isNameValid(link) { - return !this.hasEmptyName(link); + return !this.hasEmptyName(link) && !this.hasDuplicateName(link); }, /** @@ -121,7 +124,7 @@ export default { <p> {{ __( - 'Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed.', + 'Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique.', ) }} </p> @@ -165,7 +168,7 @@ export default { </gl-sprintf> </span> <span v-else-if="hasDuplicateUrl(link)" class="invalid-feedback d-inline"> - {{ __('This URL is already used for another link; duplicate URLs are not allowed') }} + {{ __('This URL already exists.') }} </span> </template> </gl-form-group> @@ -191,6 +194,9 @@ export default { <span v-if="hasEmptyName(link)" class="invalid-feedback d-inline"> {{ __('Link title is required') }} </span> + <span v-else-if="hasDuplicateName(link)" class="invalid-feedback d-inline"> + {{ __('This title already exists.') }} + </span> </template> </gl-form-group> diff --git a/app/assets/javascripts/releases/stores/modules/edit_new/actions.js b/app/assets/javascripts/releases/stores/modules/edit_new/actions.js index 576f099248e..b3ba4f9263a 100644 --- a/app/assets/javascripts/releases/stores/modules/edit_new/actions.js +++ b/app/assets/javascripts/releases/stores/modules/edit_new/actions.js @@ -162,7 +162,7 @@ const createReleaseLink = async ({ state, link }) => { input: { projectPath: state.projectPath, tagName: state.tagName, - name: link.name, + name: link.name.trim(), url: link.url, linkType: link.linkType.toUpperCase(), directAssetPath: link.directAssetPath, diff --git a/app/assets/javascripts/releases/stores/modules/edit_new/getters.js b/app/assets/javascripts/releases/stores/modules/edit_new/getters.js index d83ec05872a..d4f49e53619 100644 --- a/app/assets/javascripts/releases/stores/modules/edit_new/getters.js +++ b/app/assets/javascripts/releases/stores/modules/edit_new/getters.js @@ -1,5 +1,6 @@ import { isEmpty } from 'lodash'; import { hasContent } from '~/lib/utils/text_utility'; +import { getDuplicateItemsFromArray } from '~/lib/utils/array_utility'; /** * @returns {Boolean} `true` if the app is editing an existing release. @@ -95,6 +96,17 @@ export const validationErrors = (state) => { } }); + // check for duplicated Link Titles + const linkTitles = state.release.assets.links.map((link) => link.name.trim()); + const duplicatedTitles = getDuplicateItemsFromArray(linkTitles); + + // add a validation error for each link that shares Link Title + state.release.assets.links.forEach((link) => { + if (hasContent(link.name) && duplicatedTitles.includes(link.name.trim())) { + errors.assets.links[link.id].isTitleDuplicate = true; + } + }); + return errors; }; @@ -131,7 +143,7 @@ export const releaseCreateMutatationVariables = (state, getters) => { ref: state.createFrom, assets: { links: getters.releaseLinksToCreate.map(({ name, url, linkType }) => ({ - name, + name: name.trim(), url, linkType: linkType.toUpperCase(), })), diff --git a/app/assets/javascripts/security_configuration/components/constants.js b/app/assets/javascripts/security_configuration/components/constants.js index c498c87e72f..6a4009b222d 100644 --- a/app/assets/javascripts/security_configuration/components/constants.js +++ b/app/assets/javascripts/security_configuration/components/constants.js @@ -16,6 +16,8 @@ import { REPORT_TYPE_LICENSE_COMPLIANCE, } from '~/vue_shared/security_reports/constants'; +import kontraLogo from 'images/vulnerability/kontra-logo.svg'; +import scwLogo from 'images/vulnerability/scw-logo.svg'; import configureSastMutation from '../graphql/configure_sast.mutation.graphql'; import configureSastIacMutation from '../graphql/configure_iac.mutation.graphql'; import configureSecretDetectionMutation from '../graphql/configure_secret_detection.mutation.graphql'; @@ -284,9 +286,9 @@ export const AUTO_DEVOPS_ENABLED_ALERT_DISMISSED_STORAGE_KEY = // https://gitlab.com/gitlab-org/gitlab/-/issues/346899 export const TEMP_PROVIDER_LOGOS = { Kontra: { - svg: '/assets/vulnerability/kontra-logo.svg', + svg: kontraLogo, }, [__('Secure Code Warrior')]: { - svg: '/assets/vulnerability/scw-logo.svg', + svg: scwLogo, }, }; diff --git a/app/assets/javascripts/security_configuration/components/training_provider_list.vue b/app/assets/javascripts/security_configuration/components/training_provider_list.vue index ea3eedc6e90..6f130bec15e 100644 --- a/app/assets/javascripts/security_configuration/components/training_provider_list.vue +++ b/app/assets/javascripts/security_configuration/components/training_provider_list.vue @@ -7,6 +7,7 @@ import { GlLink, GlSkeletonLoader, GlIcon, + GlSafeHtmlDirective, } from '@gitlab/ui'; import * as Sentry from '@sentry/browser'; import Tracking from '~/tracking'; @@ -50,6 +51,7 @@ export default { }, directives: { GlTooltip: GlTooltipDirective, + SafeHtml: GlSafeHtmlDirective, }, mixins: [Tracking.mixin()], inject: ['projectFullPath'], @@ -233,11 +235,12 @@ export default { @change="toggleProvider(provider)" /> <div v-if="$options.TEMP_PROVIDER_LOGOS[provider.name]" class="gl-ml-4"> - <img - :src="$options.TEMP_PROVIDER_LOGOS[provider.name].svg" - width="18" + <div + v-safe-html="$options.TEMP_PROVIDER_LOGOS[provider.name].svg" + data-testid="provider-logo" + style="width: 18px" role="presentation" - /> + ></div> </div> <div class="gl-ml-3"> <h3 class="gl-font-lg gl-m-0 gl-mb-2">{{ provider.name }}</h3> diff --git a/app/views/admin/broadcast_messages/_form.html.haml b/app/views/admin/broadcast_messages/_form.html.haml index d81ebb8a2bb..3e698f0508c 100644 --- a/app/views/admin/broadcast_messages/_form.html.haml +++ b/app/views/admin/broadcast_messages/_form.html.haml @@ -16,7 +16,7 @@ - else = _('Your message here') -= form_for [:admin, @broadcast_message], html: { class: 'broadcast-message-form js-quick-submit js-requires-input'} do |f| += gitlab_ui_form_for [:admin, @broadcast_message], html: { class: 'broadcast-message-form js-quick-submit js-requires-input'} do |f| = form_errors(@broadcast_message) .form-group.row.mt-4 @@ -52,15 +52,14 @@ .col-sm-2.col-form-label.pt-0 = f.label :starts_at, _("Dismissable") .col-sm-10 - = f.check_box :dismissable - = f.label :dismissable do - = _('Allow users to dismiss the broadcast message') + = f.gitlab_ui_checkbox_component :dismissable, _('Allow users to dismiss the broadcast message') - if Feature.enabled?(:role_targeted_broadcast_messages, default_enabled: :yaml) .form-group.row .col-sm-2.col-form-label = f.label :target_access_levels, _('Target roles') .col-sm-10 - = f.select :target_access_levels, target_access_level_options, { include_hidden: false }, multiple: true, class: 'form-control' + - target_access_level_options.each do |human_access_level, access_level| + = f.gitlab_ui_checkbox_component :target_access_levels, human_access_level, checked_value: access_level, unchecked_value: false, checkbox_options: { multiple: true } .form-text.text-muted = _('The broadcast message displays only to users in projects and groups who have these roles.') .form-group.row.js-toggle-colors-container.toggle-colors.hide diff --git a/app/views/discussions/_discussion.html.haml b/app/views/discussions/_discussion.html.haml index 075eb99fc36..477f6c73388 100644 --- a/app/views/discussions/_discussion.html.haml +++ b/app/views/discussions/_discussion.html.haml @@ -11,7 +11,8 @@ %button.note-action-button.discussion-toggle-button.js-toggle-button{ type: "button", class: ("js-toggle-lazy-diff" unless expanded) } = sprite_icon('chevron-up', css_class: "js-sidebar-collapse #{'hidden' unless expanded}") = sprite_icon('chevron-down', css_class: "js-sidebar-expand #{'hidden' if expanded}") - = _('Toggle thread') + %span.js-sidebar-collapse{ class: "#{'hidden' unless expanded}" }= _('Hide thread') + %span.js-sidebar-expand{ class: "#{'hidden' if expanded}" }= _('Show thread') = link_to_member(@project, discussion.author, avatar: false) .inline.discussion-headline-light diff --git a/app/workers/all_queues.yml b/app/workers/all_queues.yml index 367b118ec71..08e37308936 100644 --- a/app/workers/all_queues.yml +++ b/app/workers/all_queues.yml @@ -1663,7 +1663,7 @@ :worker_name: Ci::DropPipelineWorker :feature_category: :continuous_integration :has_external_dependencies: - :urgency: :low + :urgency: :high :resource_boundary: :unknown :weight: 3 :idempotent: true diff --git a/app/workers/ci/drop_pipeline_worker.rb b/app/workers/ci/drop_pipeline_worker.rb index edb97c3cac5..6018290b3a2 100644 --- a/app/workers/ci/drop_pipeline_worker.rb +++ b/app/workers/ci/drop_pipeline_worker.rb @@ -9,6 +9,8 @@ module Ci sidekiq_options retry: 3 include PipelineQueue + urgency :high + idempotent! def perform(pipeline_id, failure_reason) |