diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-05-11 12:12:30 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-05-11 12:12:30 +0000 |
commit | 0b54f87a31c23544ca5917bf772ce9c64a61562c (patch) | |
tree | 79d56df6750e84fd4a10205d9dcce293f7c5d491 /app/assets | |
parent | e348fb4c1b9eaf21655001dc4346ceb0c0c3d5b4 (diff) | |
download | gitlab-ce-0b54f87a31c23544ca5917bf772ce9c64a61562c.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/assets')
11 files changed, 100 insertions, 129 deletions
diff --git a/app/assets/javascripts/notes/constants.js b/app/assets/javascripts/notes/constants.js index e7c3385ae5c..419b427682e 100644 --- a/app/assets/javascripts/notes/constants.js +++ b/app/assets/javascripts/notes/constants.js @@ -61,17 +61,7 @@ export const MR_FILTER_OPTIONS = [ { text: __('Approvals'), value: 'approval', - systemNoteIcons: ['approval', 'unapproval'], - }, - { - text: __('Commits & branches'), - value: 'commit_branches', - systemNoteIcons: ['commit', 'fork'], - }, - { - text: __('Merge request status'), - value: 'status', - systemNoteIcons: ['git-merge', 'issue-close', 'issues'], + systemNoteIcons: ['approval', 'unapproval', 'check'], }, { text: __('Assignees & reviewers'), @@ -84,6 +74,18 @@ export const MR_FILTER_OPTIONS = [ ], }, { + text: __('Comments'), + value: 'comments', + noteType: ['DiscussionNote', 'DiffNote'], + individualNote: true, + noteText: [s__('IssuableEvents|resolved all threads')], + }, + { + text: __('Commits & branches'), + value: 'commit_branches', + systemNoteIcons: ['commit', 'fork'], + }, + { text: __('Edits'), value: 'edits', systemNoteIcons: ['pencil', 'task-done'], @@ -94,25 +96,24 @@ export const MR_FILTER_OPTIONS = [ systemNoteIcons: ['label'], }, { + text: __('Lock status'), + value: 'lock_status', + systemNoteIcons: ['lock', 'lock-open'], + }, + { text: __('Mentions'), value: 'mentions', systemNoteIcons: ['comment-dots'], }, { + text: __('Merge request status'), + value: 'status', + systemNoteIcons: ['git-merge', 'issue-close', 'issues', 'merge-request-close'], + }, + { text: __('Tracking'), value: 'tracking', noteType: ['MilestoneNote'], systemNoteIcons: ['timer'], }, - { - text: __('Comments'), - value: 'comments', - noteType: ['DiscussionNote', 'DiffNote'], - individualNote: true, - }, - { - text: __('Lock status'), - value: 'lock_status', - systemNoteIcons: ['lock', 'lock-open'], - }, ]; diff --git a/app/assets/javascripts/packages_and_registries/settings/project/components/container_expiration_policy_form.vue b/app/assets/javascripts/packages_and_registries/settings/project/components/container_expiration_policy_form.vue index dd22d29d9a7..c13d49b5379 100644 --- a/app/assets/javascripts/packages_and_registries/settings/project/components/container_expiration_policy_form.vue +++ b/app/assets/javascripts/packages_and_registries/settings/project/components/container_expiration_policy_form.vue @@ -225,9 +225,6 @@ export default { <template #strong="{ content }"> <strong>{{ content }}</strong> </template> - <template #secondStrong="{ content }"> - <strong>{{ content }}</strong> - </template> </gl-sprintf> </p> <expiration-dropdown @@ -264,9 +261,6 @@ export default { <template #strong="{ content }"> <strong>{{ content }}</strong> </template> - <template #secondStrong="{ content }"> - <strong>{{ content }}</strong> - </template> </gl-sprintf> </p> <expiration-dropdown diff --git a/app/assets/javascripts/packages_and_registries/settings/project/constants.js b/app/assets/javascripts/packages_and_registries/settings/project/constants.js index 5f59372e5ba..05616a0a4f6 100644 --- a/app/assets/javascripts/packages_and_registries/settings/project/constants.js +++ b/app/assets/javascripts/packages_and_registries/settings/project/constants.js @@ -29,7 +29,7 @@ export const TEXT_AREA_INVALID_FEEDBACK = s__( export const KEEP_HEADER_TEXT = s__('ContainerRegistry|Keep these tags'); export const KEEP_INFO_TEXT = s__( - 'ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept.', + 'ContainerRegistry|Tags that match %{strongStart}any of%{strongEnd} these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{strongStart}latest%{strongEnd} tag is always kept.', ); export const KEEP_N_LABEL = s__('ContainerRegistry|Keep the most recent:'); export const NAME_REGEX_KEEP_LABEL = s__('ContainerRegistry|Keep tags matching:'); diff --git a/app/assets/javascripts/vue_merge_request_widget/components/approvals/queries/approvals.subscription.graphql b/app/assets/javascripts/vue_merge_request_widget/components/approvals/queries/approvals.subscription.graphql new file mode 100644 index 00000000000..d5092d9ae1a --- /dev/null +++ b/app/assets/javascripts/vue_merge_request_widget/components/approvals/queries/approvals.subscription.graphql @@ -0,0 +1,17 @@ +#import "~/graphql_shared/fragments/user.fragment.graphql" + +subscription mergeRequestApprovalStateUpdated($issuableId: IssuableID!) { + mergeRequestApprovalStateUpdated(issuableId: $issuableId) { + ... on MergeRequest { + id + approvedBy { + nodes { + ...User + } + } + userPermissions { + canApprove + } + } + } +} diff --git a/app/assets/javascripts/vue_merge_request_widget/mixins/approvals.js b/app/assets/javascripts/vue_merge_request_widget/mixins/approvals.js index 7e658e77d37..3228c09c9b6 100644 --- a/app/assets/javascripts/vue_merge_request_widget/mixins/approvals.js +++ b/app/assets/javascripts/vue_merge_request_widget/mixins/approvals.js @@ -1,5 +1,11 @@ -import { createAlert } from '~/alert'; +import mergeRequestApprovalStateUpdated from 'ee_else_ce/vue_merge_request_widget/components/approvals/queries/approvals.subscription.graphql'; import approvedByQuery from 'ee_else_ce/vue_merge_request_widget/components/approvals/queries/approvals.query.graphql'; + +import { createAlert } from '~/alert'; + +import { convertToGraphQLId } from '../../graphql_shared/utils'; +import { TYPENAME_MERGE_REQUEST } from '../../graphql_shared/constants'; + import { FETCH_ERROR } from '../components/approvals/messages'; export default { @@ -25,6 +31,29 @@ export default { message: FETCH_ERROR, }); }, + subscribeToMore: { + document: mergeRequestApprovalStateUpdated, + variables() { + return { + issuableId: convertToGraphQLId(TYPENAME_MERGE_REQUEST, this.mr.id), + }; + }, + skip() { + return !this.mr?.id || !this.isRealtimeEnabled; + }, + updateQuery( + _, + { + subscriptionData: { + data: { mergeRequestApprovalStateUpdated: queryResult }, + }, + }, + ) { + if (queryResult) { + this.mr.setApprovals(queryResult); + } + }, + }, }, }, data() { @@ -34,6 +63,14 @@ export default { disableCommittersApproval: false, }; }, + computed: { + isRealtimeEnabled() { + // This mixin needs glFeatureFlagsMixin, but fatals if it's included here. + // Parents that include this mixin (approvals) should also include the + // glFeatureFlagsMixin mixin, or this will always be false. + return Boolean(this.glFeatures?.realtimeApprovals); + }, + }, methods: { clearError() { this.$emit('clearError'); diff --git a/app/assets/javascripts/work_items/components/work_item_detail.vue b/app/assets/javascripts/work_items/components/work_item_detail.vue index 56802f76bba..e3ac49b90d5 100644 --- a/app/assets/javascripts/work_items/components/work_item_detail.vue +++ b/app/assets/javascripts/work_items/components/work_item_detail.vue @@ -438,15 +438,15 @@ export default { this.activeToast?.hide(); } }, - async removeChild(childId) { + async removeChild({ id }) { try { - const { data } = await this.updateWorkItem(null, childId, null); + const { data } = await this.updateWorkItem(null, id, null); if (data.workItemUpdate.errors.length === 0) { this.activeToast = this.$toast.show(s__('WorkItem|Child removed'), { action: { text: s__('WorkItem|Undo'), - onClick: this.undoChildRemoval.bind(this, data.workItemUpdate.workItem, childId), + onClick: this.undoChildRemoval.bind(this, data.workItemUpdate.workItem, id), }, }); } diff --git a/app/assets/javascripts/work_items/components/work_item_detail_modal.vue b/app/assets/javascripts/work_items/components/work_item_detail_modal.vue index 376263503de..f8422dda211 100644 --- a/app/assets/javascripts/work_items/components/work_item_detail_modal.vue +++ b/app/assets/javascripts/work_items/components/work_item_detail_modal.vue @@ -2,7 +2,6 @@ import { GlAlert, GlModal } from '@gitlab/ui'; import { s__ } from '~/locale'; import { scrollToTargetOnResize } from '~/lib/utils/resize_observer'; -import deleteWorkItemFromTaskMutation from '../graphql/delete_task_from_work_item.mutation.graphql'; import deleteWorkItemMutation from '../graphql/delete_work_item.mutation.graphql'; export default { @@ -27,26 +26,6 @@ export default { required: false, default: null, }, - issueGid: { - type: String, - required: false, - default: '', - }, - lockVersion: { - type: Number, - required: false, - default: null, - }, - lineNumberStart: { - type: String, - required: false, - default: null, - }, - lineNumberEnd: { - type: String, - required: false, - default: null, - }, }, emits: ['workItemDeleted', 'close', 'update-modal'], data() { @@ -75,50 +54,6 @@ export default { }, methods: { deleteWorkItem() { - if (this.lockVersion != null && this.lineNumberStart && this.lineNumberEnd) { - this.deleteWorkItemWithTaskData(); - } else { - this.deleteWorkItemWithoutTaskData(); - } - }, - deleteWorkItemWithTaskData() { - this.$apollo - .mutate({ - mutation: deleteWorkItemFromTaskMutation, - variables: { - input: { - id: this.issueGid, - lockVersion: this.lockVersion, - taskData: { - id: this.workItemId, - lineNumberStart: Number(this.lineNumberStart), - lineNumberEnd: Number(this.lineNumberEnd), - }, - }, - }, - }) - .then( - ({ - data: { - workItemDeleteTask: { - workItem: { descriptionHtml }, - errors, - }, - }, - }) => { - if (errors?.length) { - throw new Error(errors[0]); - } - - this.$emit('workItemDeleted', descriptionHtml); - this.hide(); - }, - ) - .catch((error) => { - this.setErrorMessage(error.message); - }); - }, - deleteWorkItemWithoutTaskData() { this.$apollo .mutate({ mutation: deleteWorkItemMutation, @@ -191,7 +126,6 @@ export default { <work-item-detail is-modal - :work-item-parent-id="issueGid" :work-item-id="displayedWorkItemId" :work-item-iid="displayedWorkItemIid" class="gl-p-5 gl-mt-n3 gl-reset-bg gl-isolation-isolate" diff --git a/app/assets/javascripts/work_items/components/work_item_links/work_item_link_child.vue b/app/assets/javascripts/work_items/components/work_item_links/work_item_link_child.vue index 8152412a5c1..401c8a53eb0 100644 --- a/app/assets/javascripts/work_items/components/work_item_links/work_item_link_child.vue +++ b/app/assets/javascripts/work_items/components/work_item_links/work_item_link_child.vue @@ -184,19 +184,19 @@ export default { showScopedLabel(label) { return isScopedLabel(label) && this.allowsScopedLabels; }, - async removeChild(childId) { + async removeChild({ id }) { this.cloneChildren(); this.isLoadingChildren = true; try { - const { data } = await this.updateWorkItem(childId, null); + const { data } = await this.updateWorkItem(id, null); if (!data?.workItemUpdate?.errors?.length) { - this.filterRemovedChild(childId); + this.filterRemovedChild(id); this.activeToast = this.$toast.show(s__('WorkItem|Child removed'), { action: { text: s__('WorkItem|Undo'), - onClick: this.undoChildRemoval.bind(this, childId), + onClick: this.undoChildRemoval.bind(this, id), }, }); } @@ -341,7 +341,7 @@ export default { :work-item-id="childItem.id" :parent-work-item-id="issuableGid" data-testid="links-menu" - @removeChild="$emit('removeChild', childItem.id)" + @removeChild="$emit('removeChild', childItem)" /> </div> </div> diff --git a/app/assets/javascripts/work_items/components/work_item_links/work_item_links.vue b/app/assets/javascripts/work_items/components/work_item_links/work_item_links.vue index 46c109f2d57..5728e33880e 100644 --- a/app/assets/javascripts/work_items/components/work_item_links/work_item_links.vue +++ b/app/assets/javascripts/work_items/components/work_item_links/work_item_links.vue @@ -185,29 +185,26 @@ export default { variables: { id: this.issuableGid, workItem }, }); }, - async updateWorkItem(workItem, childId, parentId) { - const response = await this.$apollo.mutate({ + async undoChildRemoval(workItem, childId) { + const { data } = await this.$apollo.mutate({ mutation: updateWorkItemMutation, - variables: { input: { id: childId, hierarchyWidget: { parentId } } }, + variables: { input: { id: childId, hierarchyWidget: { parentId: this.issuableGid } } }, }); - if (parentId === null) { - await this.removeHierarchyChild(workItem); - } else { - await this.addHierarchyChild(workItem); - } - - return response; - }, - async undoChildRemoval(workItem, childId) { - const { data } = await this.updateWorkItem(workItem, childId, this.issuableGid); + await this.addHierarchyChild(workItem); if (data.workItemUpdate.errors.length === 0) { this.activeToast?.hide(); } }, - async removeChild(childId) { - const { data } = await this.updateWorkItem({ id: childId }, childId, null); + async removeChild(workItem) { + const childId = workItem.id; + const { data } = await this.$apollo.mutate({ + mutation: updateWorkItemMutation, + variables: { input: { id: childId, hierarchyWidget: { parentId: null } } }, + }); + + await this.removeHierarchyChild(workItem); if (data.workItemUpdate.errors.length === 0) { this.activeToast = this.$toast.show(s__('WorkItem|Child removed'), { diff --git a/app/assets/javascripts/work_items/components/work_item_links/work_item_tree_children.vue b/app/assets/javascripts/work_items/components/work_item_links/work_item_tree_children.vue index 121c987da71..2cabf489bc6 100644 --- a/app/assets/javascripts/work_items/components/work_item_links/work_item_tree_children.vue +++ b/app/assets/javascripts/work_items/components/work_item_links/work_item_tree_children.vue @@ -36,7 +36,7 @@ export default { :issuable-gid="workItemId" :child-item="child" :work-item-type="workItemType" - @removeChild="$emit('removeChild', child.id)" + @removeChild="$emit('removeChild', $event)" @click="$emit('click', Object.assign($event, { childItem: child }))" /> </div> diff --git a/app/assets/javascripts/work_items/graphql/delete_task_from_work_item.mutation.graphql b/app/assets/javascripts/work_items/graphql/delete_task_from_work_item.mutation.graphql deleted file mode 100644 index 32c07ed48c7..00000000000 --- a/app/assets/javascripts/work_items/graphql/delete_task_from_work_item.mutation.graphql +++ /dev/null @@ -1,9 +0,0 @@ -mutation workItemDeleteTask($input: WorkItemDeleteTaskInput!) { - workItemDeleteTask(input: $input) { - workItem { - id - descriptionHtml - } - errors - } -} |