diff --git a/.gitlab/ci/notifications.gitlab-ci.yml b/.gitlab/ci/notifications.gitlab-ci.yml index 21f7312063a..8e00ba022d0 100644 --- a/.gitlab/ci/notifications.gitlab-ci.yml +++ b/.gitlab/ci/notifications.gitlab-ci.yml @@ -10,8 +10,8 @@ schedule:package-and-qa:notify-success: extends: - .only-canonical-schedules - .notify - before_script: - - export COMMIT_NOTES_URL="https://$CI_SERVER_HOST/$CI_PROJECT_PATH/commit/$CI_COMMIT_SHA#notes-list" + variables: + COMMIT_NOTES_URL: "https://$CI_SERVER_HOST/$CI_PROJECT_PATH/commit/$CI_COMMIT_SHA#notes-list" script: - 'scripts/notify-slack qa-master ":tada: Scheduled QA against master passed! :tada: See $CI_PIPELINE_URL. For downstream pipelines, see $COMMIT_NOTES_URL" ci_passing' needs: ["schedule:package-and-qa"] @@ -21,8 +21,8 @@ schedule:package-and-qa:notify-failure: extends: - .only-canonical-schedules - .notify - before_script: - - export COMMIT_NOTES_URL="https://$CI_SERVER_HOST/$CI_PROJECT_PATH/commit/$CI_COMMIT_SHA#notes-list" + variables: + COMMIT_NOTES_URL: "https://$CI_SERVER_HOST/$CI_PROJECT_PATH/commit/$CI_COMMIT_SHA#notes-list" script: - 'scripts/notify-slack qa-master ":skull_and_crossbones: Scheduled QA against master failed! :skull_and_crossbones: See $CI_PIPELINE_URL. For downstream pipelines, see $COMMIT_NOTES_URL" ci_failing' needs: ["schedule:package-and-qa"] diff --git a/app/assets/javascripts/blob/template_selector.js b/app/assets/javascripts/blob/template_selector.js index 02216e4e93d..6cfe354d277 100644 --- a/app/assets/javascripts/blob/template_selector.js +++ b/app/assets/javascripts/blob/template_selector.js @@ -27,11 +27,16 @@ export default class TemplateSelector { search: { fields: ['name'], }, - clicked: options => this.fetchFileTemplate(options), + clicked: options => this.onDropdownClicked(options), text: item => item.name, }); } + // Subclasses can override this method to conditionally prevent fetching file templates + onDropdownClicked(options) { + this.fetchFileTemplate(options); + } + initAutosizeUpdateEvent() { this.autosizeUpdateEvent = document.createEvent('Event'); this.autosizeUpdateEvent.initEvent('autosize:update', true, false); @@ -81,6 +86,10 @@ export default class TemplateSelector { } } + getEditorContent() { + return this.editor.getValue(); + } + startLoadingSpinner() { this.$dropdownIcon.addClass('fa-spinner fa-spin').removeClass('fa-chevron-down'); } diff --git a/app/assets/javascripts/gl_dropdown.js b/app/assets/javascripts/gl_dropdown.js index 437c4941fda..4e1b4f2652c 100644 --- a/app/assets/javascripts/gl_dropdown.js +++ b/app/assets/javascripts/gl_dropdown.js @@ -717,6 +717,7 @@ GitLabDropdown = (function() { selectedObject = this.renderedData[groupName][selectedIndex]; } else { selectedIndex = el.closest('li').index(); + this.selectedIndex = selectedIndex; selectedObject = this.renderedData[selectedIndex]; } } diff --git a/app/assets/javascripts/pages/projects/issues/form.js b/app/assets/javascripts/pages/projects/issues/form.js index 2205a7bafe3..96e47187fed 100644 --- a/app/assets/javascripts/pages/projects/issues/form.js +++ b/app/assets/javascripts/pages/projects/issues/form.js @@ -15,7 +15,9 @@ export default () => { new IssuableForm($('.issue-form')); new LabelsSelect(); new MilestoneSelect(); - new IssuableTemplateSelectors(); + new IssuableTemplateSelectors({ + warnTemplateOverride: true, + }); initSuggestions(); }; diff --git a/app/assets/javascripts/pages/projects/merge_requests/init_merge_request.js b/app/assets/javascripts/pages/projects/merge_requests/init_merge_request.js index 8f0dc8554e2..e51ab79a51d 100644 --- a/app/assets/javascripts/pages/projects/merge_requests/init_merge_request.js +++ b/app/assets/javascripts/pages/projects/merge_requests/init_merge_request.js @@ -16,5 +16,7 @@ export default () => { new IssuableForm($('.merge-request-form')); new LabelsSelect(); new MilestoneSelect(); - new IssuableTemplateSelectors(); + new IssuableTemplateSelectors({ + warnTemplateOverride: true, + }); }; diff --git a/app/assets/javascripts/releases/components/release_block.vue b/app/assets/javascripts/releases/components/release_block.vue index 7b6bd9913a8..921ada91544 100644 --- a/app/assets/javascripts/releases/components/release_block.vue +++ b/app/assets/javascripts/releases/components/release_block.vue @@ -6,6 +6,9 @@ import Icon from '~/vue_shared/components/icon.vue'; import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue'; import timeagoMixin from '~/vue_shared/mixins/timeago'; import { __, n__, sprintf } from '../../locale'; +import { slugify } from '~/lib/utils/text_utility'; +import { getLocationHash } from '~/lib/utils/url_utility'; +import { scrollToElement } from '~/lib/utils/common_utils'; export default { name: 'ReleaseBlock', @@ -26,7 +29,15 @@ export default { default: () => ({}), }, }, + data() { + return { + isHighlighted: false, + }; + }, computed: { + id() { + return slugify(this.release.tag_name); + }, releasedTimeAgo() { return sprintf(__('released %{time}'), { time: this.timeFormated(this.release.released_at), @@ -62,10 +73,21 @@ export default { return n__('Milestone', 'Milestones', this.release.milestones.length); }, }, + mounted() { + const hash = getLocationHash(); + if (hash && slugify(hash) === this.id) { + this.isHighlighted = true; + setTimeout(() => { + this.isHighlighted = false; + }, 2000); + + scrollToElement(this.$el); + } + }, };