diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-11-17 03:12:37 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-11-17 03:12:37 +0300 |
commit | 049fd8333a1c87144f43680f69f472de89bb7743 (patch) | |
tree | f04a0c0dc4aa142a46ac7544c9decc8af9083764 /app | |
parent | f9e0126cad562c7199e26e84a1540df3bc849e55 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
22 files changed, 96 insertions, 78 deletions
diff --git a/app/assets/javascripts/sidebar/components/assignees/assignees.vue b/app/assets/javascripts/sidebar/components/assignees/assignees.vue index 968efab5c82..bdd014163a0 100644 --- a/app/assets/javascripts/sidebar/components/assignees/assignees.vue +++ b/app/assets/javascripts/sidebar/components/assignees/assignees.vue @@ -39,8 +39,8 @@ export default { assignSelf() { this.$emit('assign-self'); }, - toggleAttentionRequired(data) { - this.$emit('toggle-attention-required', data); + toggleAttentionRequested(data) { + this.$emit('toggle-attention-requested', data); }, }, }; @@ -65,7 +65,7 @@ export default { v-else :users="sortedAssigness" :issuable-type="issuableType" - @toggle-attention-required="toggleAttentionRequired" + @toggle-attention-requested="toggleAttentionRequested" /> </div> </div> diff --git a/app/assets/javascripts/sidebar/components/assignees/issuable_assignees.vue b/app/assets/javascripts/sidebar/components/assignees/issuable_assignees.vue index c4856a801cf..a3379784bc1 100644 --- a/app/assets/javascripts/sidebar/components/assignees/issuable_assignees.vue +++ b/app/assets/javascripts/sidebar/components/assignees/issuable_assignees.vue @@ -33,8 +33,8 @@ export default { }, }, methods: { - toggleAttentionRequired(data) { - this.$emit('toggle-attention-required', data); + toggleAttentionRequested(data) { + this.$emit('toggle-attention-requested', data); }, }, }; @@ -66,7 +66,7 @@ export default { :users="users" :issuable-type="issuableType" class="gl-text-gray-800 gl-mt-2 hide-collapsed" - @toggle-attention-required="toggleAttentionRequired" + @toggle-attention-requested="toggleAttentionRequested" /> </div> </template> diff --git a/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees.vue b/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees.vue index 6af33f0eec2..453dd1b0580 100644 --- a/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees.vue +++ b/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees.vue @@ -125,8 +125,8 @@ export default { availability: this.assigneeAvailabilityStatus[username] || '', })); }, - toggleAttentionRequired(data) { - this.mediator.toggleAttentionRequired('assignee', data); + toggleAttentionRequested(data) { + this.mediator.toggleAttentionRequested('assignee', data); }, }, }; @@ -155,7 +155,7 @@ export default { :editable="store.editable" :issuable-type="issuableType" @assign-self="assignSelf" - @toggle-attention-required="toggleAttentionRequired" + @toggle-attention-requested="toggleAttentionRequested" /> </div> </template> diff --git a/app/assets/javascripts/sidebar/components/assignees/uncollapsed_assignee_list.vue b/app/assets/javascripts/sidebar/components/assignees/uncollapsed_assignee_list.vue index 3bf0acf7216..8d5c3b2def3 100644 --- a/app/assets/javascripts/sidebar/components/assignees/uncollapsed_assignee_list.vue +++ b/app/assets/javascripts/sidebar/components/assignees/uncollapsed_assignee_list.vue @@ -2,7 +2,7 @@ import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin'; import { IssuableType } from '~/issue_show/constants'; import { __, sprintf } from '~/locale'; -import AttentionRequiredToggle from '../attention_required_toggle.vue'; +import AttentionRequestedToggle from '../attention_requested_toggle.vue'; import AssigneeAvatarLink from './assignee_avatar_link.vue'; import UserNameWithStatus from './user_name_with_status.vue'; @@ -10,7 +10,7 @@ const DEFAULT_RENDER_COUNT = 5; export default { components: { - AttentionRequiredToggle, + AttentionRequestedToggle, AssigneeAvatarLink, UserNameWithStatus, }, @@ -82,8 +82,8 @@ export default { } return u?.status?.availability || ''; }, - toggleAttentionRequired(data) { - this.$emit('toggle-attention-required', data); + toggleAttentionRequested(data) { + this.$emit('toggle-attention-requested', data); }, }, }; @@ -113,11 +113,11 @@ export default { }" class="gl-display-inline-block" > - <attention-required-toggle + <attention-requested-toggle v-if="showVerticalList && user.can_update_merge_request" :user="user" type="assignee" - @toggle-attention-required="toggleAttentionRequired" + @toggle-attention-requested="toggleAttentionRequested" /> <assignee-avatar-link :user="user" diff --git a/app/assets/javascripts/sidebar/components/attention_required_toggle.vue b/app/assets/javascripts/sidebar/components/attention_requested_toggle.vue index 90cb0bfcc3f..38ba468d197 100644 --- a/app/assets/javascripts/sidebar/components/attention_required_toggle.vue +++ b/app/assets/javascripts/sidebar/components/attention_requested_toggle.vue @@ -5,9 +5,9 @@ import { BV_HIDE_TOOLTIP } from '~/lib/utils/constants'; export default { i18n: { - attentionRequiredReviewer: __('Request attention to review'), - attentionRequiredAssignee: __('Request attention'), - removeAttentionRequired: __('Remove attention request'), + attentionRequestedReviewer: __('Request attention to review'), + attentionRequestedAssignee: __('Request attention'), + removeAttentionRequested: __('Remove attention request'), }, components: { GlButton, @@ -32,13 +32,13 @@ export default { }, computed: { tooltipTitle() { - if (this.user.attention_required) { - return this.$options.i18n.removeAttentionRequired; + if (this.user.attention_requested) { + return this.$options.i18n.removeAttentionRequested; } return this.type === 'reviewer' - ? this.$options.i18n.attentionRequiredReviewer - : this.$options.i18n.attentionRequiredAssignee; + ? this.$options.i18n.attentionRequestedReviewer + : this.$options.i18n.attentionRequestedAssignee; }, }, methods: { @@ -47,7 +47,7 @@ export default { this.$root.$emit(BV_HIDE_TOOLTIP); this.loading = true; - this.$emit('toggle-attention-required', { + this.$emit('toggle-attention-requested', { user: this.user, callback: this.toggleAttentionRequiredComplete, }); @@ -63,8 +63,8 @@ export default { <span v-gl-tooltip.left.viewport="tooltipTitle"> <gl-button :loading="loading" - :variant="user.attention_required ? 'warning' : 'default'" - :icon="user.attention_required ? 'star' : 'star-o'" + :variant="user.attention_requested ? 'warning' : 'default'" + :icon="user.attention_requested ? 'star' : 'star-o'" :aria-label="tooltipTitle" size="small" category="tertiary" diff --git a/app/assets/javascripts/sidebar/components/reviewers/reviewers.vue b/app/assets/javascripts/sidebar/components/reviewers/reviewers.vue index 78f095dc77d..b07fd944ff9 100644 --- a/app/assets/javascripts/sidebar/components/reviewers/reviewers.vue +++ b/app/assets/javascripts/sidebar/components/reviewers/reviewers.vue @@ -49,8 +49,8 @@ export default { requestReview(data) { this.$emit('request-review', data); }, - toggleAttentionRequired(data) { - this.$emit('toggle-attention-required', data); + toggleAttentionRequested(data) { + this.$emit('toggle-attention-requested', data); }, }, }; @@ -73,7 +73,7 @@ export default { :root-path="rootPath" :issuable-type="issuableType" @request-review="requestReview" - @toggle-attention-required="toggleAttentionRequired" + @toggle-attention-requested="toggleAttentionRequested" /> </div> </div> diff --git a/app/assets/javascripts/sidebar/components/reviewers/sidebar_reviewers.vue b/app/assets/javascripts/sidebar/components/reviewers/sidebar_reviewers.vue index 8f33d4cd056..2ea63219e92 100644 --- a/app/assets/javascripts/sidebar/components/reviewers/sidebar_reviewers.vue +++ b/app/assets/javascripts/sidebar/components/reviewers/sidebar_reviewers.vue @@ -88,8 +88,8 @@ export default { requestReview(data) { this.mediator.requestReview(data); }, - toggleAttentionRequired(data) { - this.mediator.toggleAttentionRequired('reviewer', data); + toggleAttentionRequested(data) { + this.mediator.toggleAttentionRequested('reviewer', data); }, }, }; @@ -109,7 +109,7 @@ export default { :editable="store.editable" :issuable-type="issuableType" @request-review="requestReview" - @toggle-attention-required="toggleAttentionRequired" + @toggle-attention-requested="toggleAttentionRequested" /> </div> </template> diff --git a/app/assets/javascripts/sidebar/components/reviewers/uncollapsed_reviewer_list.vue b/app/assets/javascripts/sidebar/components/reviewers/uncollapsed_reviewer_list.vue index adfb2491720..adaf1b65f3f 100644 --- a/app/assets/javascripts/sidebar/components/reviewers/uncollapsed_reviewer_list.vue +++ b/app/assets/javascripts/sidebar/components/reviewers/uncollapsed_reviewer_list.vue @@ -2,7 +2,7 @@ import { GlButton, GlTooltipDirective, GlIcon } from '@gitlab/ui'; import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin'; import { __, sprintf, s__ } from '~/locale'; -import AttentionRequiredToggle from '../attention_required_toggle.vue'; +import AttentionRequestedToggle from '../attention_requested_toggle.vue'; import ReviewerAvatarLink from './reviewer_avatar_link.vue'; const LOADING_STATE = 'loading'; @@ -16,7 +16,7 @@ export default { GlButton, GlIcon, ReviewerAvatarLink, - AttentionRequiredToggle, + AttentionRequestedToggle, }, directives: { GlTooltip: GlTooltipDirective, @@ -80,8 +80,8 @@ export default { this.loadingStates[userId] = null; } }, - toggleAttentionRequired(data) { - this.$emit('toggle-attention-required', data); + toggleAttentionRequested(data) { + this.$emit('toggle-attention-requested', data); }, }, LOADING_STATE, @@ -97,11 +97,11 @@ export default { :class="{ 'gl-mb-3': index !== users.length - 1 }" data-testid="reviewer" > - <attention-required-toggle + <attention-requested-toggle v-if="glFeatures.mrAttentionRequests && user.can_update_merge_request" :user="user" type="reviewer" - @toggle-attention-required="toggleAttentionRequired" + @toggle-attention-requested="toggleAttentionRequested" /> <reviewer-avatar-link :user="user" :root-path="rootPath" :issuable-type="issuableType"> <div class="gl-ml-3 gl-line-height-normal gl-display-grid"> diff --git a/app/assets/javascripts/sidebar/queries/attention_required.mutation.graphql b/app/assets/javascripts/sidebar/queries/attention_required.mutation.graphql deleted file mode 100644 index 2843291de97..00000000000 --- a/app/assets/javascripts/sidebar/queries/attention_required.mutation.graphql +++ /dev/null @@ -1,5 +0,0 @@ -mutation mergeRequestAttentionRequired($projectPath: ID!, $iid: String!, $userId: ID!) { - mergeRequestAttentionRequired(input: { projectPath: $projectPath, iid: $iid, userId: $userId }) { - errors - } -} diff --git a/app/assets/javascripts/sidebar/queries/toggle_attention_requested.mutation.graphql b/app/assets/javascripts/sidebar/queries/toggle_attention_requested.mutation.graphql new file mode 100644 index 00000000000..a9f4af6e1b9 --- /dev/null +++ b/app/assets/javascripts/sidebar/queries/toggle_attention_requested.mutation.graphql @@ -0,0 +1,7 @@ +mutation mergeRequestToggleAttentionRequested($projectPath: ID!, $iid: String!, $userId: ID!) { + mergeRequestToggleAttentionRequested( + input: { projectPath: $projectPath, iid: $iid, userId: $userId } + ) { + errors + } +} diff --git a/app/assets/javascripts/sidebar/services/sidebar_service.js b/app/assets/javascripts/sidebar/services/sidebar_service.js index 455825c09f9..d8ab8f1c65b 100644 --- a/app/assets/javascripts/sidebar/services/sidebar_service.js +++ b/app/assets/javascripts/sidebar/services/sidebar_service.js @@ -5,7 +5,7 @@ import createGqClient, { fetchPolicies } from '~/lib/graphql'; import axios from '~/lib/utils/axios_utils'; import reviewerRereviewMutation from '../queries/reviewer_rereview.mutation.graphql'; import sidebarDetailsMRQuery from '../queries/sidebarDetailsMR.query.graphql'; -import attentionRequiredMutation from '../queries/attention_required.mutation.graphql'; +import toggleAttentionRequestedMutation from '../queries/toggle_attention_requested.mutation.graphql'; const queries = { merge_request: sidebarDetailsMRQuery, @@ -92,9 +92,9 @@ export default class SidebarService { }); } - attentionRequired(userId) { + toggleAttentionRequested(userId) { return gqClient.mutate({ - mutation: attentionRequiredMutation, + mutation: toggleAttentionRequestedMutation, variables: { userId: convertToGraphQLId(TYPE_USER, `${userId}`), projectPath: this.fullPath, diff --git a/app/assets/javascripts/sidebar/sidebar_mediator.js b/app/assets/javascripts/sidebar/sidebar_mediator.js index 0de4ae4569f..86580744ccc 100644 --- a/app/assets/javascripts/sidebar/sidebar_mediator.js +++ b/app/assets/javascripts/sidebar/sidebar_mediator.js @@ -63,30 +63,27 @@ export default class SidebarMediator { .catch(() => callback(userId, false)); } - async toggleAttentionRequired(type, { user, callback }) { + async toggleAttentionRequested(type, { user, callback }) { try { const isReviewer = type === 'reviewer'; const reviewerOrAssignee = isReviewer ? this.store.findReviewer(user) : this.store.findAssignee(user); - if (reviewerOrAssignee.attention_required) { + await this.service.toggleAttentionRequested(user.id); + + if (reviewerOrAssignee.attention_requested) { toast( sprintf(__('Removed attention request from @%{username}'), { username: user.username, }), ); } else { - await this.service.attentionRequired(user.id); - toast(sprintf(__('Requested attention from @%{username}'), { username: user.username })); } - if (isReviewer) { - this.store.updateReviewer(user.id, 'attention_required'); - } else { - this.store.updateAssignee(user.id, 'attention_required'); - } + this.store.updateReviewer(user.id, 'attention_requested'); + this.store.updateAssignee(user.id, 'attention_requested'); callback(); } catch (error) { diff --git a/app/assets/javascripts/vue_shared/components/settings/settings_block.vue b/app/assets/javascripts/vue_shared/components/settings/settings_block.vue index e75fedbb1d7..e68f0f31c13 100644 --- a/app/assets/javascripts/vue_shared/components/settings/settings_block.vue +++ b/app/assets/javascripts/vue_shared/components/settings/settings_block.vue @@ -24,10 +24,13 @@ export default { }, }, data() { + const forceOpen = !this.collapsible || this.defaultExpanded; return { // Non-collapsible sections should always be expanded. // For collapsible sections, fall back to defaultExpanded. - sectionExpanded: !this.collapsible || this.defaultExpanded, + sectionExpanded: forceOpen, + initialised: forceOpen, + animating: false, }; }, computed: { @@ -53,7 +56,12 @@ export default { toggleSectionExpanded() { this.sectionExpanded = !this.sectionExpanded; + if (!this.initialised) { + this.initialised = true; + } + if (this.sectionExpanded) { + this.animating = true; this.$refs.settingsContent.focus(); } }, @@ -68,7 +76,10 @@ export default { </script> <template> - <section class="settings" :class="{ 'no-animate': !slideAnimated, expanded: sectionExpanded }"> + <section + class="settings" + :class="{ 'no-animate': !slideAnimated, expanded: sectionExpanded, animating }" + > <div class="settings-header"> <h4> <span @@ -103,12 +114,14 @@ export default { </p> </div> <div + v-show="initialised" :id="settingsContentId" ref="settingsContent" :aria-labelledby="settingsLabelId" tabindex="-1" role="region" class="settings-content" + @animationend="animating = false" > <slot></slot> </div> diff --git a/app/graphql/mutations/merge_requests/attention_required.rb b/app/graphql/mutations/merge_requests/toggle_attention_requested.rb index 51e1891aad3..f316f23fb85 100644 --- a/app/graphql/mutations/merge_requests/attention_required.rb +++ b/app/graphql/mutations/merge_requests/toggle_attention_requested.rb @@ -2,20 +2,20 @@ module Mutations module MergeRequests - class AttentionRequired < Base - graphql_name 'MergeRequestAttentionRequired' + class ToggleAttentionRequested < Base + graphql_name 'MergeRequestToggleAttentionRequested' argument :user_id, ::Types::GlobalIDType[::User], loads: Types::UserType, required: true, description: <<~DESC - User ID for the user that has their attention requested. + User ID for the user to toggle attention requested. DESC def resolve(project_path:, iid:, user:) merge_request = authorized_find!(project_path: project_path, iid: iid) - result = ::MergeRequests::AttentionRequiredService.new(project: merge_request.project, current_user: current_user, merge_request: merge_request, user: user).execute + result = ::MergeRequests::ToggleAttentionRequestedService.new(project: merge_request.project, current_user: current_user, merge_request: merge_request, user: user).execute { merge_request: merge_request, diff --git a/app/graphql/types/mutation_type.rb b/app/graphql/types/mutation_type.rb index 5366283e55a..e8a952e9c61 100644 --- a/app/graphql/types/mutation_type.rb +++ b/app/graphql/types/mutation_type.rb @@ -68,7 +68,7 @@ module Types mount_mutation Mutations::MergeRequests::SetDraft, calls_gitaly: true mount_mutation Mutations::MergeRequests::SetAssignees mount_mutation Mutations::MergeRequests::ReviewerRereview - mount_mutation Mutations::MergeRequests::AttentionRequired, feature_flag: :mr_attention_requests + mount_mutation Mutations::MergeRequests::ToggleAttentionRequested, feature_flag: :mr_attention_requests mount_mutation Mutations::Metrics::Dashboard::Annotations::Create mount_mutation Mutations::Metrics::Dashboard::Annotations::Delete mount_mutation Mutations::Notes::Create::Note, calls_gitaly: true diff --git a/app/helpers/todos_helper.rb b/app/helpers/todos_helper.rb index b715993b6dc..79767ca76b7 100644 --- a/app/helpers/todos_helper.rb +++ b/app/helpers/todos_helper.rb @@ -24,7 +24,7 @@ module TodosHelper when Todo::UNMERGEABLE then 'Could not merge' when Todo::DIRECTLY_ADDRESSED then "directly addressed #{todo_action_subject(todo)} on" when Todo::MERGE_TRAIN_REMOVED then "Removed from Merge Train:" - when Todo::ATTENTION_REQUIRED then 'requested your attention on' + when Todo::ATTENTION_REQUESTED then 'requested your attention on' end end diff --git a/app/models/concerns/merge_request_reviewer_state.rb b/app/models/concerns/merge_request_reviewer_state.rb index ba3c55adf64..216a3a0bd64 100644 --- a/app/models/concerns/merge_request_reviewer_state.rb +++ b/app/models/concerns/merge_request_reviewer_state.rb @@ -7,7 +7,7 @@ module MergeRequestReviewerState enum state: { unreviewed: 0, reviewed: 1, - attention_required: 2 + attention_requested: 2 } validates :state, @@ -18,7 +18,7 @@ module MergeRequestReviewerState def set_state if Feature.enabled?(:mr_attention_requests, self.merge_request&.project, default_enabled: :yaml) - self.state = :attention_required + self.state = :attention_requested end end end diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index d220f4b837a..0cd8f12088c 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -1945,7 +1945,7 @@ class MergeRequest < ApplicationRecord end end - def attention_required_enabled? + def attention_requested_enabled? Feature.enabled?(:mr_attention_requests, project, default_enabled: :yaml) end diff --git a/app/models/todo.rb b/app/models/todo.rb index d0a6d1d9e23..742b8fd2a9d 100644 --- a/app/models/todo.rb +++ b/app/models/todo.rb @@ -18,7 +18,7 @@ class Todo < ApplicationRecord DIRECTLY_ADDRESSED = 7 MERGE_TRAIN_REMOVED = 8 # This is an EE-only feature REVIEW_REQUESTED = 9 - ATTENTION_REQUIRED = 10 + ATTENTION_REQUESTED = 10 ACTION_NAMES = { ASSIGNED => :assigned, @@ -30,7 +30,7 @@ class Todo < ApplicationRecord UNMERGEABLE => :unmergeable, DIRECTLY_ADDRESSED => :directly_addressed, MERGE_TRAIN_REMOVED => :merge_train_removed, - ATTENTION_REQUIRED => :attention_required + ATTENTION_REQUESTED => :attention_requested }.freeze belongs_to :author, class_name: "User" @@ -191,8 +191,8 @@ class Todo < ApplicationRecord action == REVIEW_REQUESTED end - def attention_required? - action == ATTENTION_REQUIRED + def attention_requested? + action == ATTENTION_REQUESTED end def merge_train_removed? diff --git a/app/serializers/merge_request_user_entity.rb b/app/serializers/merge_request_user_entity.rb index b527a9be5ad..97912656bbb 100644 --- a/app/serializers/merge_request_user_entity.rb +++ b/app/serializers/merge_request_user_entity.rb @@ -20,8 +20,8 @@ class MergeRequestUserEntity < ::API::Entities::UserBasic find_reviewer_or_assignee(user, options)&.reviewed? end - expose :attention_required, if: satisfies(:present?, :allows_reviewers?, :attention_required_enabled?) do |user, options| - find_reviewer_or_assignee(user, options)&.attention_required? + expose :attention_requested, if: satisfies(:present?, :allows_reviewers?, :attention_requested_enabled?) do |user, options| + find_reviewer_or_assignee(user, options)&.attention_requested? end expose :approved, if: satisfies(:present?) do |user, options| diff --git a/app/services/merge_requests/attention_required_service.rb b/app/services/merge_requests/toggle_attention_requested_service.rb index 54a549899fd..66c5d6fce5d 100644 --- a/app/services/merge_requests/attention_required_service.rb +++ b/app/services/merge_requests/toggle_attention_requested_service.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true module MergeRequests - class AttentionRequiredService < MergeRequests::BaseService + class ToggleAttentionRequestedService < MergeRequests::BaseService attr_accessor :merge_request, :user def initialize(project:, current_user:, merge_request:, user:) @@ -15,10 +15,12 @@ module MergeRequests return error("Invalid permissions") unless can?(current_user, :update_merge_request, merge_request) if reviewer || assignee - reviewer&.update(state: :attention_required) - assignee&.update(state: :attention_required) + update_state(reviewer) + update_state(assignee) - notity_user + if reviewer&.attention_requested? || assignee&.attention_requested? + notity_user + end success else @@ -29,7 +31,7 @@ module MergeRequests private def notity_user - todo_service.create_attention_required_todo(merge_request, current_user, user) + todo_service.create_attention_requested_todo(merge_request, current_user, user) end def assignee @@ -39,5 +41,9 @@ module MergeRequests def reviewer merge_request.find_reviewer(user) end + + def update_state(reviewer_or_assignee) + reviewer_or_assignee&.update(state: reviewer_or_assignee&.attention_requested? ? :reviewed : :attention_requested) + end end end diff --git a/app/services/todo_service.rb b/app/services/todo_service.rb index 10779e38b75..091f441831a 100644 --- a/app/services/todo_service.rb +++ b/app/services/todo_service.rb @@ -217,8 +217,8 @@ class TodoService create_todos(reviewers, attributes) end - def create_attention_required_todo(target, author, users) - attributes = attributes_for_todo(target.project, target, author, Todo::ATTENTION_REQUIRED) + def create_attention_requested_todo(target, author, users) + attributes = attributes_for_todo(target.project, target, author, Todo::ATTENTION_REQUESTED) create_todos(users, attributes) end |