diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/assets/javascripts/behaviors/preview_markdown.js | 7 | ||||
-rw-r--r-- | app/assets/javascripts/dropzone_input.js | 1 | ||||
-rw-r--r-- | app/assets/javascripts/issues/list/utils.js | 2 | ||||
-rw-r--r-- | app/assets/javascripts/vue_shared/components/markdown/field.vue | 75 | ||||
-rw-r--r-- | app/assets/javascripts/vue_shared/issuable/list/constants.js | 2 | ||||
-rw-r--r-- | app/controllers/graphql_controller.rb | 7 | ||||
-rw-r--r-- | app/finders/fork_targets_finder.rb | 4 | ||||
-rw-r--r-- | app/helpers/search_helper.rb | 2 | ||||
-rw-r--r-- | app/helpers/sorting_titles_values_helper.rb | 4 | ||||
-rw-r--r-- | app/models/user.rb | 4 | ||||
-rw-r--r-- | app/policies/global_policy.rb | 2 | ||||
-rw-r--r-- | app/views/groups/runners/_runner.html.haml | 2 | ||||
-rw-r--r-- | app/views/projects/buttons/_fork.html.haml | 2 | ||||
-rw-r--r-- | app/views/projects/forks/index.html.haml | 2 |
14 files changed, 70 insertions, 46 deletions
diff --git a/app/assets/javascripts/behaviors/preview_markdown.js b/app/assets/javascripts/behaviors/preview_markdown.js index a548b283142..679940d1317 100644 --- a/app/assets/javascripts/behaviors/preview_markdown.js +++ b/app/assets/javascripts/behaviors/preview_markdown.js @@ -124,13 +124,6 @@ const writeButtonSelector = '.js-md-write-button'; lastTextareaPreviewed = null; const markdownToolbar = $('.md-header-toolbar'); -$.fn.setupMarkdownPreview = function () { - const $form = $(this); - $form.find('textarea.markdown-area').on('input', () => { - markdownPreview.hideReferencedUsers($form); - }); -}; - $(document).on('markdown-preview:show', (e, $form) => { if (!$form) { return; diff --git a/app/assets/javascripts/dropzone_input.js b/app/assets/javascripts/dropzone_input.js index 7c7127dfa44..491c2ced358 100644 --- a/app/assets/javascripts/dropzone_input.js +++ b/app/assets/javascripts/dropzone_input.js @@ -51,7 +51,6 @@ export default function dropzoneInput(form, config = { parallelUploads: 2 }) { // Add dropzone area to the form. const $mdArea = formTextarea.closest('.md-area'); - form.setupMarkdownPreview(); const $formDropzone = form.find('.div-dropzone'); $formDropzone.parent().addClass('div-dropzone-wrapper'); $formDropzone.append(divHover); diff --git a/app/assets/javascripts/issues/list/utils.js b/app/assets/javascripts/issues/list/utils.js index c64925edc28..2919bbbfef8 100644 --- a/app/assets/javascripts/issues/list/utils.js +++ b/app/assets/javascripts/issues/list/utils.js @@ -72,7 +72,7 @@ export const getSortOptions = (hasIssueWeightsFeature, hasBlockedIssuesFeature) }, { id: 3, - title: __('Last updated'), + title: __('Updated date'), sortDirection: { ascending: UPDATED_ASC, descending: UPDATED_DESC, diff --git a/app/assets/javascripts/vue_shared/components/markdown/field.vue b/app/assets/javascripts/vue_shared/components/markdown/field.vue index 86f04c78ebe..5c86c928ce3 100644 --- a/app/assets/javascripts/vue_shared/components/markdown/field.vue +++ b/app/assets/javascripts/vue_shared/components/markdown/field.vue @@ -2,7 +2,7 @@ import { GlIcon } from '@gitlab/ui'; import $ from 'jquery'; import '~/behaviors/markdown/render_gfm'; -import { unescape } from 'lodash'; +import { debounce, unescape } from 'lodash'; import createFlash from '~/flash'; import GLForm from '~/gl_form'; import axios from '~/lib/utils/axios_utils'; @@ -110,7 +110,7 @@ export default { return { markdownPreview: '', referencedCommands: '', - referencedUsers: '', + referencedUsers: [], hasSuggestion: false, markdownPreviewLoading: false, previewMarkdown: false, @@ -188,6 +188,24 @@ export default { }); } }, + + textareaValue: { + immediate: true, + handler(textareaValue, oldVal) { + const all = /@all([^\w._-]|$)/; + const hasAll = all.test(textareaValue); + const hadAll = all.test(oldVal); + + const justAddedAll = !hadAll && hasAll; + const justRemovedAll = hadAll && !hasAll; + + if (justAddedAll) { + this.debouncedFetchMarkdown(); + } else if (justRemovedAll) { + this.referencedUsers = []; + } + }, + }, }, mounted() { // GLForm class handles all the toolbar buttons @@ -222,9 +240,9 @@ export default { if (this.textareaValue) { this.markdownPreviewLoading = true; this.markdownPreview = __('Loading…'); - axios - .post(this.markdownPreviewPath, { text: this.textareaValue }) - .then((response) => this.renderMarkdown(response.data)) + + this.fetchMarkdown() + .then((data) => this.renderMarkdown(data)) .catch(() => createFlash({ message: __('Error loading markdown preview'), @@ -239,17 +257,28 @@ export default { this.previewMarkdown = false; }, + fetchMarkdown() { + return axios.post(this.markdownPreviewPath, { text: this.textareaValue }).then(({ data }) => { + const { references } = data; + if (references) { + this.referencedCommands = references.commands; + this.referencedUsers = references.users; + this.hasSuggestion = references.suggestions?.length > 0; + this.suggestions = references.suggestions; + } + + return data; + }); + }, + + debouncedFetchMarkdown: debounce(function debouncedFetchMarkdown() { + return this.fetchMarkdown(); + }, 400), + renderMarkdown(data = {}) { this.markdownPreviewLoading = false; this.markdownPreview = data.body || __('Nothing to preview.'); - if (data.references) { - this.referencedCommands = data.references.commands; - this.referencedUsers = data.references.users; - this.hasSuggestion = data.references.suggestions && data.references.suggestions.length; - this.suggestions = data.references.suggestions; - } - this.$nextTick() .then(() => $(this.$refs['markdown-preview']).renderGFM()) .catch(() => @@ -326,18 +355,14 @@ export default { v-html="markdownPreview /* eslint-disable-line vue/no-v-html */" ></div> </template> - <template v-if="previewMarkdown && !markdownPreviewLoading"> - <div - v-if="referencedCommands" - class="referenced-commands" - v-html="referencedCommands /* eslint-disable-line vue/no-v-html */" - ></div> - <div v-if="shouldShowReferencedUsers" class="referenced-users"> - <gl-icon name="warning-solid" /> - <span - v-html="addMultipleToDiscussionWarning /* eslint-disable-line vue/no-v-html */" - ></span> - </div> - </template> + <div + v-if="referencedCommands && previewMarkdown && !markdownPreviewLoading" + class="referenced-commands" + v-html="referencedCommands /* eslint-disable-line vue/no-v-html */" + ></div> + <div v-if="shouldShowReferencedUsers" class="referenced-users"> + <gl-icon name="warning-solid" /> + <span v-html="addMultipleToDiscussionWarning /* eslint-disable-line vue/no-v-html */"></span> + </div> </div> </template> diff --git a/app/assets/javascripts/vue_shared/issuable/list/constants.js b/app/assets/javascripts/vue_shared/issuable/list/constants.js index 773ad0f8e93..c6dce6a51c2 100644 --- a/app/assets/javascripts/vue_shared/issuable/list/constants.js +++ b/app/assets/javascripts/vue_shared/issuable/list/constants.js @@ -38,7 +38,7 @@ export const AvailableSortOptions = [ }, { id: 2, - title: __('Last updated'), + title: __('Updated date'), sortDirection: { descending: 'updated_desc', ascending: 'updated_asc', diff --git a/app/controllers/graphql_controller.rb b/app/controllers/graphql_controller.rb index f48d03869a4..689ca32f6d9 100644 --- a/app/controllers/graphql_controller.rb +++ b/app/controllers/graphql_controller.rb @@ -44,6 +44,13 @@ class GraphqlController < ApplicationController # The default feature category is overridden to read from request feature_category :not_owned + # We don't know what the query is going to be, so we can't set a high urgency + # See https://gitlab.com/groups/gitlab-org/-/epics/5841 for the work that will + # allow us to specify an urgency per query. + # Currently, all queries have a default urgency. And this is measured in the `graphql_queries` + # SLI. But queries could be multiplexed, so the total duration could be longer. + urgency :low, [:execute] + def execute result = multiplex? ? execute_multiplex : execute_query render json: result diff --git a/app/finders/fork_targets_finder.rb b/app/finders/fork_targets_finder.rb index 3a79b216853..0b5dfb16572 100644 --- a/app/finders/fork_targets_finder.rb +++ b/app/finders/fork_targets_finder.rb @@ -8,9 +8,9 @@ class ForkTargetsFinder # rubocop: disable CodeReuse/ActiveRecord def execute(options = {}) - return ::Namespace.where(id: user.manageable_namespaces).sort_by_type unless options[:only_groups] + return ::Namespace.where(id: user.forkable_namespaces).sort_by_type unless options[:only_groups] - ::Group.where(id: user.manageable_groups) + ::Group.where(id: user.manageable_groups(include_groups_with_developer_maintainer_access: true)) end # rubocop: enable CodeReuse/ActiveRecord diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb index 7970151d603..6efede8d565 100644 --- a/app/helpers/search_helper.rb +++ b/app/helpers/search_helper.rb @@ -141,7 +141,7 @@ module SearchHelper } }, { - title: _('Last updated'), + title: _('Updated date'), sortable: true, sortParam: { asc: 'updated_asc', diff --git a/app/helpers/sorting_titles_values_helper.rb b/app/helpers/sorting_titles_values_helper.rb index 75ba6e8a153..4dfa7689110 100644 --- a/app/helpers/sorting_titles_values_helper.rb +++ b/app/helpers/sorting_titles_values_helper.rb @@ -59,7 +59,7 @@ module SortingTitlesValuesHelper end def sort_title_latest_activity - s_('SortOptions|Last updated') + _('Updated date') end def sort_title_milestone @@ -127,7 +127,7 @@ module SortingTitlesValuesHelper end def sort_title_recently_updated - s_('SortOptions|Last updated') + _('Updated date') end def sort_title_start_date_later diff --git a/app/models/user.rb b/app/models/user.rb index 8e954aac1ba..406eb2d6204 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1535,8 +1535,8 @@ class User < ApplicationRecord end end - def manageable_namespaces - @manageable_namespaces ||= [namespace] + manageable_groups + def forkable_namespaces + @forkable_namespaces ||= [namespace] + manageable_groups(include_groups_with_developer_maintainer_access: true) end def manageable_groups(include_groups_with_developer_maintainer_access: false) diff --git a/app/policies/global_policy.rb b/app/policies/global_policy.rb index c3b4b163cb4..2a2ddf29899 100644 --- a/app/policies/global_policy.rb +++ b/app/policies/global_policy.rb @@ -9,7 +9,7 @@ class GlobalPolicy < BasePolicy with_options scope: :user, score: 0 condition(:access_locked) { @user&.access_locked? } - condition(:can_create_fork, scope: :user) { @user && @user.manageable_namespaces.any? { |namespace| @user.can?(:create_projects, namespace) } } + condition(:can_create_fork, scope: :user) { @user && @user.forkable_namespaces.any? { |namespace| @user.can?(:create_projects, namespace) } } condition(:required_terms_not_accepted, scope: :user, score: 0) do @user&.required_terms_not_accepted? diff --git a/app/views/groups/runners/_runner.html.haml b/app/views/groups/runners/_runner.html.haml index 3bb1ad421ca..78ce5b3e110 100644 --- a/app/views/groups/runners/_runner.html.haml +++ b/app/views/groups/runners/_runner.html.haml @@ -76,5 +76,5 @@ = sprite_icon('close', css_class: 'gl-icon') - else .btn-group - = link_to group_runner_path(@group, runner), method: :delete, class: 'gl-button btn btn-danger btn-icon has-tooltip', title: _('Remove'), ref: 'tooltip', aria: { label: _('Remove') }, data: { placement: 'top', container: 'body', confirm: _('Are you sure?') } do + = link_to group_runner_path(@group, runner), method: :delete, class: 'gl-button btn btn-danger btn-icon has-tooltip', title: _('Remove'), ref: 'tooltip', aria: { label: _('Remove') }, data: { placement: 'top', container: 'body', confirm: _('Are you sure?'), confirm_btn_variant: "danger" } do = sprite_icon('close', css_class: 'gl-icon') diff --git a/app/views/projects/buttons/_fork.html.haml b/app/views/projects/buttons/_fork.html.haml index 3cec7fd9eb8..c57b6dbe28c 100644 --- a/app/views/projects/buttons/_fork.html.haml +++ b/app/views/projects/buttons/_fork.html.haml @@ -1,7 +1,7 @@ - unless @project.empty_repo? - if current_user .count-badge.btn-group - - if current_user.already_forked?(@project) && current_user.manageable_namespaces.size < 2 + - if current_user.already_forked?(@project) && current_user.forkable_namespaces.size < 2 = link_to namespace_project_path(current_user, current_user.fork_of(@project)), title: s_('ProjectOverview|Go to your fork'), class: 'gl-button btn btn-default btn-sm has-tooltip fork-btn' do = sprite_icon('fork', css_class: 'icon') %span= s_('ProjectOverview|Fork') diff --git a/app/views/projects/forks/index.html.haml b/app/views/projects/forks/index.html.haml index d6f421e8ad6..5330c3aa6d6 100644 --- a/app/views/projects/forks/index.html.haml +++ b/app/views/projects/forks/index.html.haml @@ -25,7 +25,7 @@ = forks_sort_direction_button(sort_value) - if current_user && can?(current_user, :fork_project, @project) - - if current_user.already_forked?(@project) && current_user.manageable_namespaces.size < 2 + - if current_user.already_forked?(@project) && current_user.forkable_namespaces.size < 2 = link_to namespace_project_path(current_user, current_user.fork_of(@project)), title: _('Go to your fork'), class: 'btn gl-button btn-confirm gl-md-ml-3' do = sprite_icon('fork', size: 12) %span= _('Fork') |