diff --git a/app/assets/javascripts/work_items/components/notes/work_item_notes_activity_header.vue b/app/assets/javascripts/work_items/components/notes/work_item_notes_activity_header.vue index 075aa3efe3e9d3a4afae3afb491f0482fbabdb6f..799275f3875fee59d1a0d1856f6dd393e4d9de50 100644 --- a/app/assets/javascripts/work_items/components/notes/work_item_notes_activity_header.vue +++ b/app/assets/javascripts/work_items/components/notes/work_item_notes_activity_header.vue @@ -1,6 +1,5 @@ <script> import WorkItemActivitySortFilter from '~/work_items/components/notes/work_item_activity_sort_filter.vue'; -import { s__ } from '~/locale'; import { ASC } from '~/notes/constants'; import { WORK_ITEM_NOTES_FILTER_ALL_NOTES, @@ -11,13 +10,17 @@ import { } from '~/work_items/constants'; export default { - i18n: { - activityLabel: s__('WorkItem|Activity'), - }, components: { + AiSummarizeNotes: () => + import('ee_component/notes/components/note_actions/ai_summarize_notes.vue'), WorkItemActivitySortFilter, }, props: { + canSummarizeComments: { + type: Boolean, + required: false, + default: false, + }, disableActivityFilterSort: { type: Boolean, required: true, @@ -27,6 +30,10 @@ export default { default: ASC, required: false, }, + workItemId: { + type: String, + required: true, + }, workItemType: { type: String, required: true, @@ -70,10 +77,17 @@ export default { </script> <template> - <div class="gl-flex gl-flex-wrap gl-items-center gl-justify-between gl-pb-3"> - <component :is="useH2 ? 'h2' : 'h3'" :class="headerClasses">{{ - $options.i18n.activityLabel - }}</component> + <div class="gl-flex gl-flex-wrap gl-items-center gl-gap-3 gl-pb-3"> + <div class="gl-flex gl-grow gl-items-center gl-justify-between gl-gap-3"> + <component :is="useH2 ? 'h2' : 'h3'" :class="headerClasses"> + {{ s__('WorkItem|Activity') }} + </component> + <ai-summarize-notes + v-if="canSummarizeComments" + :resource-global-id="workItemId" + size="small" + /> + </div> <div class="gl-flex gl-gap-3"> <work-item-activity-sort-filter :work-item-type="workItemType" 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 08e5dde787212f5c1d8f1296db2b819dab3797a5..5b26acc4ff53cc35864665b15f565b6bd3fa114f 100644 --- a/app/assets/javascripts/work_items/components/work_item_detail.vue +++ b/app/assets/javascripts/work_items/components/work_item_detail.vue @@ -328,6 +328,9 @@ export default { canAssignUnassignUser() { return this.workItemAssignees && this.canUpdateMetadata; }, + canSummarizeComments() { + return this.workItem.userPermissions?.summarizeComments; + }, isDiscussionLocked() { return this.workItemNotes?.discussionLocked; }, @@ -1112,6 +1115,7 @@ export default { :is-modal="isModal" :assignees="workItemAssignees && workItemAssignees.assignees.nodes" :can-set-work-item-metadata="canAssignUnassignUser" + :can-summarize-comments="canSummarizeComments" :report-abuse-path="reportAbusePath" :is-discussion-locked="isDiscussionLocked" :is-work-item-confidential="workItem.confidential" diff --git a/app/assets/javascripts/work_items/components/work_item_notes.vue b/app/assets/javascripts/work_items/components/work_item_notes.vue index 7cc0a6d098f95160c9d636a841bb1582d9cf2873..20c2f0cb0e0be976130bccef21279dc4b58f9c39 100644 --- a/app/assets/javascripts/work_items/components/work_item_notes.vue +++ b/app/assets/javascripts/work_items/components/work_item_notes.vue @@ -81,6 +81,11 @@ export default { required: false, default: false, }, + canSummarizeComments: { + type: Boolean, + required: false, + default: false, + }, reportAbusePath: { type: String, required: true, @@ -129,6 +134,7 @@ export default { discussionFilter: WORK_ITEM_NOTES_FILTER_ALL_NOTES, workItemNamespace: null, previewNote: null, + workItemNotes: [], }; }, computed: { @@ -286,7 +292,6 @@ export default { Sentry.captureException(error); }, }, - // eslint-disable-next-line @gitlab/vue-no-undef-apollo-properties workItemNotes: { query: workItemNotesByIidQuery, variables() { @@ -448,8 +453,10 @@ export default { <template> <div class="work-item-notes"> <work-item-notes-activity-header + :can-summarize-comments="canSummarizeComments" :sort-order="sortOrder" :disable-activity-filter-sort="disableActivityFilterSort" + :work-item-id="workItemId" :work-item-type="workItemType" :discussion-filter="discussionFilter" :use-h2="useH2" diff --git a/app/assets/javascripts/work_items/graphql/cache_utils.js b/app/assets/javascripts/work_items/graphql/cache_utils.js index 2769e3ab0e6e129dec33a6301ecd5bf8d665e1be..1a23897a6d2d91c0e212d336e7a69a9ba56b28b1 100644 --- a/app/assets/javascripts/work_items/graphql/cache_utils.js +++ b/app/assets/javascripts/work_items/graphql/cache_utils.js @@ -596,15 +596,16 @@ export const setNewWorkItemCache = async ( __typename: 'WorkItemType', }, userPermissions: { - deleteWorkItem: true, - updateWorkItem: true, - moveWorkItem: true, adminParentLink: true, - setWorkItemMetadata: true, - createNote: true, adminWorkItemLink: true, + createNote: true, + deleteWorkItem: true, markNoteAsInternal: true, + moveWorkItem: true, reportSpam: true, + setWorkItemMetadata: true, + summarizeComments: true, + updateWorkItem: true, __typename: 'WorkItemPermissions', }, widgets, @@ -617,15 +618,16 @@ export const setNewWorkItemCache = async ( }; export const optimisticUserPermissions = { - deleteWorkItem: false, - updateWorkItem: false, - moveWorkItem: false, adminParentLink: false, - setWorkItemMetadata: false, - createNote: false, adminWorkItemLink: false, + createNote: false, + deleteWorkItem: false, markNoteAsInternal: false, + moveWorkItem: false, reportSpam: false, + setWorkItemMetadata: false, + summarizeComments: false, + updateWorkItem: false, __typename: 'WorkItemPermissions', }; diff --git a/app/assets/javascripts/work_items/graphql/work_item.fragment.graphql b/app/assets/javascripts/work_items/graphql/work_item.fragment.graphql index 6c0aa34da0a40e828c66529bcda4a5b168368cb6..0eafb0e566f5fe62057f2e1e8f6ab5e536fe08c7 100644 --- a/app/assets/javascripts/work_items/graphql/work_item.fragment.graphql +++ b/app/assets/javascripts/work_items/graphql/work_item.fragment.graphql @@ -32,15 +32,16 @@ fragment WorkItem on WorkItem { iconName } userPermissions { - deleteWorkItem - updateWorkItem - moveWorkItem adminParentLink - setWorkItemMetadata - createNote adminWorkItemLink + createNote + deleteWorkItem markNoteAsInternal + moveWorkItem reportSpam + setWorkItemMetadata + summarizeComments + updateWorkItem } widgets { ...WorkItemWidgets diff --git a/app/assets/javascripts/work_items/graphql/work_item_hierarchy.fragment.graphql b/app/assets/javascripts/work_items/graphql/work_item_hierarchy.fragment.graphql index 1b6ad539d5decbf016755964544806ec48d35dfc..52e19614c2b706d7704556f7d01eae9b9babebff 100644 --- a/app/assets/javascripts/work_items/graphql/work_item_hierarchy.fragment.graphql +++ b/app/assets/javascripts/work_items/graphql/work_item_hierarchy.fragment.graphql @@ -11,14 +11,16 @@ fragment WorkItemHierarchy on WorkItem { title confidential userPermissions { - deleteWorkItem - updateWorkItem - moveWorkItem adminParentLink - setWorkItemMetadata - createNote adminWorkItemLink + createNote + deleteWorkItem markNoteAsInternal + moveWorkItem + reportSpam + setWorkItemMetadata + summarizeComments + updateWorkItem } widgets { type diff --git a/ee/app/assets/javascripts/ai/editor_actions/summarize_comments.js b/ee/app/assets/javascripts/ai/editor_actions/summarize_comments.js deleted file mode 100644 index 788b023f5d9c341bac67865571d47d13f2b4d4b3..0000000000000000000000000000000000000000 --- a/ee/app/assets/javascripts/ai/editor_actions/summarize_comments.js +++ /dev/null @@ -1,27 +0,0 @@ -import aiActionMutation from 'ee/graphql_shared/mutations/ai_action.mutation.graphql'; -import { __ } from '~/locale'; -import { convertToGraphQLId } from '~/graphql_shared/utils'; -import { TYPENAME_USER } from '~/graphql_shared/constants'; - -export const summarizeCommentsAction = (resourceGlobalId) => ({ - title: __('Summarize comments'), - description: __('Creates a summary of all comments'), - subscriptionVariables() { - return { - userId: convertToGraphQLId(TYPENAME_USER, gon.current_user_id), - resourceId: resourceGlobalId, - }; - }, - apolloMutation() { - return { - mutation: aiActionMutation, - variables: { - input: { - summarizeComments: { - resourceId: resourceGlobalId, - }, - }, - }, - }; - }, -}); diff --git a/ee/app/assets/javascripts/notes/components/note_actions/ai_summarize_notes.vue b/ee/app/assets/javascripts/notes/components/note_actions/ai_summarize_notes.vue index c45177b77b8f1415bac5b7d23ee242a2bf9a356e..39d552b583040093ceeb7fd67adfbe0a1e091d53 100644 --- a/ee/app/assets/javascripts/notes/components/note_actions/ai_summarize_notes.vue +++ b/ee/app/assets/javascripts/notes/components/note_actions/ai_summarize_notes.vue @@ -1,42 +1,32 @@ <script> import { GlButton, GlTooltipDirective } from '@gitlab/ui'; -import { s__, __ } from '~/locale'; -import { createAlert } from '~/alert'; -import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin'; import { sendDuoChatCommand } from 'ee/ai/utils'; import { BV_HIDE_TOOLTIP } from '~/lib/utils/constants'; export default { + name: 'AiSummarizeNotes', components: { GlButton, }, directives: { GlTooltip: GlTooltipDirective, }, - mixins: [glFeatureFlagsMixin()], - inject: ['summarizeClientSubscriptionId'], props: { + loading: { + type: Boolean, + default: false, + required: false, + }, resourceGlobalId: { type: String, required: true, }, - loading: { - type: Boolean, - default: false, + size: { + type: String, required: false, + default: 'medium', }, }, - data() { - return { - errorAlert: null, - aiCompletionResponse: {}, - }; - }, - destroyed() { - if (this.timeout) { - clearTimeout(this.timeout); - } - }, methods: { onClick() { this.hideTooltips(); @@ -55,19 +45,6 @@ export default { this.$root.$emit(BV_HIDE_TOOLTIP); }); }, - handleError(error) { - this.hideTooltips(); - const alertOptions = error ? { captureError: true, error } : {}; - this.errorAlert = createAlert({ - message: error ? error.message : __('Something went wrong'), - ...alertOptions, - }); - this.$parent.$emit('set-ai-loading', false); - }, - }, - i18n: { - button: s__('AISummary|View summary'), - tooltip: s__('AISummary|Generates a summary of this issue'), }, }; </script> @@ -78,11 +55,12 @@ export default { icon="duo-chat" :disabled="loading" :loading="loading" - :title="$options.i18n.tooltip" - :aria-label="$options.i18n.tooltip" + :size="size" + :title="s__('AISummary|Generates a summary of this issue')" + :aria-label="s__('AISummary|Generates a summary of this issue')" @click="onClick" @mouseout="hideTooltips" > - {{ $options.i18n.button }} + {{ s__('AISummary|View summary') }} </gl-button> </template> diff --git a/ee/spec/frontend/notes/components/note_actions/ai_summarize_notes_spec.js b/ee/spec/frontend/notes/components/note_actions/ai_summarize_notes_spec.js index b0b7b4f6a5f4494c650cfd520958c31f47c4cd8a..de5b2a7953aba56ded5a7418df1cf6001156c39a 100644 --- a/ee/spec/frontend/notes/components/note_actions/ai_summarize_notes_spec.js +++ b/ee/spec/frontend/notes/components/note_actions/ai_summarize_notes_spec.js @@ -1,38 +1,21 @@ -import Vue, { nextTick } from 'vue'; -import VueApollo from 'vue-apollo'; +import { nextTick } from 'vue'; import { GlButton } from '@gitlab/ui'; +import { shallowMount } from '@vue/test-utils'; import { BV_HIDE_TOOLTIP } from '~/lib/utils/constants'; -import createMockApollo from 'helpers/mock_apollo_helper'; -import { mountExtended } from 'helpers/vue_test_utils_helper'; import * as aiUtils from 'ee/ai/utils'; import AiSummaryNotes from 'ee/notes/components/note_actions/ai_summarize_notes.vue'; -import aiActionMutation from 'ee/graphql_shared/mutations/ai_action.mutation.graphql'; -Vue.use(VueApollo); jest.mock('ee/ai/utils'); jest.spyOn(aiUtils, 'sendDuoChatCommand'); describe('AiSummarizeNotes component', () => { let wrapper; - let aiActionMutationHandler; const resourceGlobalId = 'gid://gitlab/Issue/1'; - const clientSubscriptionId = 'someId'; const findButton = () => wrapper.findComponent(GlButton); const createWrapper = () => { - aiActionMutationHandler = jest.fn(); - - const mockApollo = createMockApollo([[aiActionMutation, aiActionMutationHandler]]); - - wrapper = mountExtended(AiSummaryNotes, { - apolloProvider: mockApollo, - provide: { - summarizeClientSubscriptionId: clientSubscriptionId, - glAbilities: { - summarizeComments: true, - }, - }, + wrapper = shallowMount(AiSummaryNotes, { propsData: { resourceGlobalId, }, @@ -43,7 +26,7 @@ describe('AiSummarizeNotes component', () => { it('calls sendDuoChatCommand with correct variables', async () => { createWrapper(); - await findButton().trigger('click'); + findButton().vm.$emit('click'); await nextTick(); expect(aiUtils.sendDuoChatCommand).toHaveBeenCalledWith({ @@ -58,7 +41,7 @@ describe('AiSummarizeNotes component', () => { const bsTooltipHide = jest.fn(); wrapper.vm.$root.$on(BV_HIDE_TOOLTIP, bsTooltipHide); - await findButton().trigger('click'); + findButton().vm.$emit('click'); await nextTick(); expect(bsTooltipHide).toHaveBeenCalled(); @@ -66,19 +49,15 @@ describe('AiSummarizeNotes component', () => { }); describe('on mouseout', () => { - let bsTooltipHide; - - beforeEach(async () => { + it('closes tooltip', async () => { createWrapper(); - bsTooltipHide = jest.fn(); + const bsTooltipHide = jest.fn(); wrapper.vm.$root.$on(BV_HIDE_TOOLTIP, bsTooltipHide); - await findButton().trigger('mouseout'); + findButton().vm.$emit('mouseout'); await nextTick(); - }); - it('closes tooltip', () => { expect(bsTooltipHide).toHaveBeenCalled(); }); }); diff --git a/ee/spec/frontend/work_items/components/work_item_notes_activity_header_spec.js b/ee/spec/frontend/work_items/components/work_item_notes_activity_header_spec.js new file mode 100644 index 0000000000000000000000000000000000000000..ec69e03e257f440bc12ee3bdcbcd0b9028dbeef0 --- /dev/null +++ b/ee/spec/frontend/work_items/components/work_item_notes_activity_header_spec.js @@ -0,0 +1,31 @@ +import AiSummarizeNotes from 'ee_component/notes/components/note_actions/ai_summarize_notes.vue'; +import { shallowMountExtended } from 'helpers/vue_test_utils_helper'; +import waitForPromises from 'helpers/wait_for_promises'; +import WorkItemNotesActivityHeader from '~/work_items/components/notes/work_item_notes_activity_header.vue'; + +describe('WorkItemNotesActivityHeader component', () => { + let wrapper; + + const findAiSummarizeNotes = () => wrapper.findComponent(AiSummarizeNotes); + + const createComponent = ({ canSummarizeComments = false } = {}) => { + wrapper = shallowMountExtended(WorkItemNotesActivityHeader, { + propsData: { + canSummarizeComments, + disableActivityFilterSort: false, + workItemId: 'gid://gitlab/WorkItem/123', + workItemType: 'Task', + }, + }); + }; + + it.each([true, false])( + 'renders "View summary" button depending on canSummarizeComments', + async (canSummarizeComments) => { + createComponent({ canSummarizeComments }); + await waitForPromises(); + + expect(findAiSummarizeNotes().exists()).toBe(canSummarizeComments); + }, + ); +}); diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 687fa2e6dfb787f9a935e0d74cd10094ffe58840..b76f0defd7783553b041bf4144135e39ef89b6cf 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -17480,9 +17480,6 @@ msgstr "" msgid "Creates a reminder to-do item after the specified time period." msgstr "" -msgid "Creates a summary of all comments" -msgstr "" - msgid "Creates branch '%{branch_name}' and a merge request to resolve this issue." msgstr "" @@ -56816,9 +56813,6 @@ msgstr "" msgid "Summarize code changes" msgstr "" -msgid "Summarize comments" -msgstr "" - msgid "Summarize the comments in the current issue." msgstr "" diff --git a/spec/frontend/work_items/components/notes/work_item_notes_activity_header_spec.js b/spec/frontend/work_items/components/notes/work_item_notes_activity_header_spec.js index dff54fef9fe3b3afa97f2a09df0f841ea9fecfb3..547bd831e1c0ea31fb2a04bce239115ddb4d2e24 100644 --- a/spec/frontend/work_items/components/notes/work_item_notes_activity_header_spec.js +++ b/spec/frontend/work_items/components/notes/work_item_notes_activity_header_spec.js @@ -1,12 +1,9 @@ import { shallowMountExtended } from 'helpers/vue_test_utils_helper'; -import WorkItemNotesActivityHeader from '~/work_items/components/notes/work_item_notes_activity_header.vue'; import { ASC } from '~/notes/constants'; -import { - WORK_ITEM_NOTES_FILTER_ALL_NOTES, - WORK_ITEM_NOTES_FILTER_ONLY_HISTORY, -} from '~/work_items/constants'; +import WorkItemNotesActivityHeader from '~/work_items/components/notes/work_item_notes_activity_header.vue'; +import { WORK_ITEM_NOTES_FILTER_ONLY_HISTORY } from '~/work_items/constants'; -describe('Work Item Note Activity Header', () => { +describe('WorkItemNotesActivityHeader component', () => { let wrapper; const findActivityLabelH2Heading = () => wrapper.find('h2'); @@ -14,53 +11,53 @@ describe('Work Item Note Activity Header', () => { const findActivityFilterDropdown = () => wrapper.findByTestId('work-item-filter'); const findActivitySortDropdown = () => wrapper.findByTestId('work-item-sort'); - const createComponent = ({ - disableActivityFilterSort = false, - sortOrder = ASC, - workItemType = 'Task', - discussionFilter = WORK_ITEM_NOTES_FILTER_ALL_NOTES, - useH2 = false, - } = {}) => { + const createComponent = ({ useH2 = false } = {}) => { wrapper = shallowMountExtended(WorkItemNotesActivityHeader, { propsData: { - disableActivityFilterSort, - sortOrder, - workItemType, - discussionFilter, + disableActivityFilterSort: false, useH2, + workItemId: 'gid://gitlab/WorkItem/123', + workItemType: 'Task', }, }); }; - beforeEach(() => { + it('renders Activity heading', () => { createComponent(); - }); - it('Should have the Activity label', () => { - expect(findActivityLabelH3Heading().text()).toBe( - WorkItemNotesActivityHeader.i18n.activityLabel, - ); + expect(findActivityLabelH3Heading().text()).toBe('Activity'); }); - it('Should render an H2 instead of an H3 if useH2 is true', () => { + it('renders an h3 heading by default', () => { createComponent(); + expect(findActivityLabelH3Heading().exists()).toBe(true); expect(findActivityLabelH2Heading().exists()).toBe(false); + }); + + it('renders an h2 heading when useH2=true', () => { createComponent({ useH2: true }); + expect(findActivityLabelH2Heading().exists()).toBe(true); expect(findActivityLabelH3Heading().exists()).toBe(false); }); it('Should have Activity filtering dropdown', () => { + createComponent(); + expect(findActivityFilterDropdown().exists()).toBe(true); }); it('Should have Activity sorting dropdown', () => { + createComponent(); + expect(findActivitySortDropdown().exists()).toBe(true); }); describe('Activity Filter', () => { it('emits `changeFilter` when filtering discussions', () => { + createComponent(); + findActivityFilterDropdown().vm.$emit('changeFilter', WORK_ITEM_NOTES_FILTER_ONLY_HISTORY); expect(wrapper.emitted('changeFilter')).toEqual([[WORK_ITEM_NOTES_FILTER_ONLY_HISTORY]]); @@ -69,6 +66,8 @@ describe('Work Item Note Activity Header', () => { describe('Activity Sorting', () => { it('emits `changeSort` when sorting discussions/activity', () => { + createComponent(); + findActivitySortDropdown().vm.$emit('changeSort', ASC); expect(wrapper.emitted('changeSort')).toEqual([[ASC]]); diff --git a/spec/frontend/work_items/graphql/cache_utils_spec.js b/spec/frontend/work_items/graphql/cache_utils_spec.js index d8d697d19fbf31ed339cf138056d13847d1e2411..631cc965f45e2d5c76ded264f9aaffac7cb86fcc 100644 --- a/spec/frontend/work_items/graphql/cache_utils_spec.js +++ b/spec/frontend/work_items/graphql/cache_utils_spec.js @@ -272,14 +272,16 @@ describe('work items graphql cache utils', () => { }, userPermissions: { __typename: 'WorkItemPermissions', - deleteWorkItem: true, - updateWorkItem: true, - moveWorkItem: true, adminParentLink: true, - setWorkItemMetadata: true, - createNote: true, adminWorkItemLink: true, + createNote: true, + deleteWorkItem: true, markNoteAsInternal: true, + moveWorkItem: true, + reportSpam: true, + setWorkItemMetadata: true, + summarizeComments: true, + updateWorkItem: true, }, widgets: [ { diff --git a/spec/frontend/work_items/mock_data.js b/spec/frontend/work_items/mock_data.js index ac04da695a4899ab68fc5d3f1fefdc4f88e44e8d..5314a421494ecdd8055399d1217e24d3ddf94ded 100644 --- a/spec/frontend/work_items/mock_data.js +++ b/spec/frontend/work_items/mock_data.js @@ -216,15 +216,16 @@ export const workItemQueryResponse = { iconName: 'issue-type-task', }, userPermissions: { - deleteWorkItem: false, - updateWorkItem: false, - moveWorkItem: false, - setWorkItemMetadata: false, adminParentLink: false, - createNote: false, adminWorkItemLink: true, + deleteWorkItem: false, + createNote: false, markNoteAsInternal: true, + moveWorkItem: false, reportSpam: false, + setWorkItemMetadata: false, + summarizeComments: false, + updateWorkItem: false, __typename: 'WorkItemPermissions', }, widgets: [ @@ -340,15 +341,16 @@ export const updateWorkItemMutationResponse = { iconName: 'issue-type-task', }, userPermissions: { - deleteWorkItem: false, - updateWorkItem: false, - moveWorkItem: false, - setWorkItemMetadata: false, adminParentLink: false, - createNote: false, adminWorkItemLink: true, + createNote: false, + deleteWorkItem: false, markNoteAsInternal: true, + moveWorkItem: false, reportSpam: false, + setWorkItemMetadata: false, + summarizeComments: false, + updateWorkItem: false, __typename: 'WorkItemPermissions', }, reference: 'test-project-path#1', @@ -478,15 +480,16 @@ export const convertWorkItemMutationResponse = { iconName: 'issue-type-objective', }, userPermissions: { - deleteWorkItem: false, - updateWorkItem: false, - moveWorkItem: false, - setWorkItemMetadata: false, adminParentLink: false, - createNote: false, adminWorkItemLink: true, + createNote: false, + deleteWorkItem: false, markNoteAsInternal: true, + moveWorkItem: false, reportSpam: false, + setWorkItemMetadata: false, + summarizeComments: false, + updateWorkItem: false, __typename: 'WorkItemPermissions', }, reference: 'gitlab-org/gitlab-test#1', @@ -1348,6 +1351,7 @@ export const workItemResponseFactory = ({ reportSpam = false, canAdminWorkItemLink = true, canMarkNoteAsInternal = true, + canSummarizeComments = false, notificationsWidgetPresent = true, currentUserTodosWidgetPresent = true, awardEmojiWidgetPresent = true, @@ -1431,15 +1435,16 @@ export const workItemResponseFactory = ({ }, workItemType, userPermissions: { - deleteWorkItem: canDelete, - updateWorkItem: canUpdate, - moveWorkItem: canMove, - setWorkItemMetadata: canUpdate, adminParentLink, adminWorkItemLink: canAdminWorkItemLink, createNote: canCreateNote, + deleteWorkItem: canDelete, markNoteAsInternal: canMarkNoteAsInternal, + moveWorkItem: canMove, reportSpam, + setWorkItemMetadata: canUpdate, + summarizeComments: canSummarizeComments, + updateWorkItem: canUpdate, __typename: 'WorkItemPermissions', }, reference: 'test-project-path#1', @@ -1895,15 +1900,16 @@ export const createWorkItemMutationResponse = { iconName: 'issue-type-task', }, userPermissions: { - deleteWorkItem: false, - updateWorkItem: false, - moveWorkItem: false, - setWorkItemMetadata: false, adminParentLink: false, - createNote: false, adminWorkItemLink: true, + createNote: false, + deleteWorkItem: false, markNoteAsInternal: true, + moveWorkItem: false, reportSpam: false, + setWorkItemMetadata: false, + summarizeComments: false, + updateWorkItem: false, __typename: 'WorkItemPermissions', }, reference: 'test-project-path#1', @@ -1970,15 +1976,16 @@ export const workItemHierarchyNoUpdatePermissionResponse = { closedAt: null, author: mockAssignees[0], userPermissions: { - deleteWorkItem: false, - updateWorkItem: false, - moveWorkItem: false, - setWorkItemMetadata: false, adminParentLink: false, - createNote: false, adminWorkItemLink: true, + createNote: false, + deleteWorkItem: false, markNoteAsInternal: true, + moveWorkItem: false, reportSpam: false, + setWorkItemMetadata: false, + summarizeComments: false, + updateWorkItem: false, __typename: 'WorkItemPermissions', }, namespace: { @@ -2402,15 +2409,16 @@ export const workItemHierarchyResponse = { title: 'New title', webUrl: 'http://gdk.test/gitlab-org/gitlab/-/issues/1', userPermissions: { - deleteWorkItem: true, - updateWorkItem: true, - moveWorkItem: true, - setWorkItemMetadata: true, adminParentLink: true, - createNote: true, adminWorkItemLink: true, + createNote: true, + deleteWorkItem: true, markNoteAsInternal: true, + moveWorkItem: true, reportSpam: false, + setWorkItemMetadata: true, + summarizeComments: true, + updateWorkItem: true, __typename: 'WorkItemPermissions', }, author: { @@ -2470,15 +2478,16 @@ export const workItemObjectiveWithChild = { fullName: 'Group name', }, userPermissions: { - deleteWorkItem: true, - updateWorkItem: true, - moveWorkItem: true, - setWorkItemMetadata: true, adminParentLink: true, - createNote: true, adminWorkItemLink: true, + createNote: true, + deleteWorkItem: true, markNoteAsInternal: true, + moveWorkItem: true, reportSpam: false, + setWorkItemMetadata: true, + summarizeComments: true, + updateWorkItem: true, __typename: 'WorkItemPermissions', }, author: { @@ -2562,15 +2571,16 @@ export const workItemObjectiveWithoutChild = { fullName: 'Group name', }, userPermissions: { - deleteWorkItem: true, - updateWorkItem: true, - moveWorkItem: true, - setWorkItemMetadata: true, adminParentLink: true, - createNote: true, adminWorkItemLink: true, + createNote: true, + deleteWorkItem: true, markNoteAsInternal: true, + moveWorkItem: true, reportSpam: false, + setWorkItemMetadata: true, + summarizeComments: true, + updateWorkItem: true, __typename: 'WorkItemPermissions', }, author: { @@ -2617,15 +2627,16 @@ export const workItemHierarchyTreeEmptyResponse = { }, title: 'New title', userPermissions: { - deleteWorkItem: true, - updateWorkItem: true, - moveWorkItem: true, - setWorkItemMetadata: true, adminParentLink: true, - createNote: true, adminWorkItemLink: true, + createNote: true, + deleteWorkItem: true, markNoteAsInternal: true, + moveWorkItem: true, reportSpam: false, + setWorkItemMetadata: true, + summarizeComments: true, + updateWorkItem: true, __typename: 'WorkItemPermissions', }, confidential: false, @@ -2884,15 +2895,16 @@ export const workItemHierarchyTreeResponse = { }, title: 'New title', userPermissions: { - deleteWorkItem: true, - updateWorkItem: true, - moveWorkItem: true, - setWorkItemMetadata: true, adminParentLink: true, - createNote: true, adminWorkItemLink: true, + createNote: true, + deleteWorkItem: true, markNoteAsInternal: true, + moveWorkItem: true, reportSpam: false, + setWorkItemMetadata: true, + summarizeComments: true, + updateWorkItem: true, __typename: 'WorkItemPermissions', }, confidential: false, @@ -2930,15 +2942,16 @@ export const workItemHierarchyTreeSingleClosedItemResponse = { }, title: 'New title', userPermissions: { - deleteWorkItem: true, - updateWorkItem: true, - moveWorkItem: true, - setWorkItemMetadata: true, adminParentLink: true, - createNote: true, adminWorkItemLink: true, + createNote: true, + deleteWorkItem: true, markNoteAsInternal: true, + moveWorkItem: true, reportSpam: false, + setWorkItemMetadata: true, + summarizeComments: true, + updateWorkItem: true, __typename: 'WorkItemPermissions', }, confidential: false, @@ -3070,15 +3083,16 @@ export const workItemObjectiveWithClosedChild = { name: 'Project name', }, userPermissions: { - deleteWorkItem: true, - updateWorkItem: true, - moveWorkItem: true, - setWorkItemMetadata: true, adminParentLink: true, - createNote: true, adminWorkItemLink: true, + createNote: true, + deleteWorkItem: true, markNoteAsInternal: true, + moveWorkItem: true, reportSpam: false, + setWorkItemMetadata: true, + summarizeComments: true, + updateWorkItem: true, __typename: 'WorkItemPermissions', }, author: { @@ -3138,15 +3152,16 @@ export const changeWorkItemParentMutationResponse = { iconName: 'issue-type-issue', }, userPermissions: { - deleteWorkItem: true, - updateWorkItem: true, - moveWorkItem: true, - setWorkItemMetadata: true, adminParentLink: true, - createNote: true, adminWorkItemLink: true, + createNote: true, + deleteWorkItem: true, markNoteAsInternal: true, + moveWorkItem: true, reportSpam: false, + setWorkItemMetadata: true, + summarizeComments: true, + updateWorkItem: true, __typename: 'WorkItemPermissions', }, description: null, @@ -5641,15 +5656,16 @@ export const createWorkItemQueryResponse = { __typename: 'WorkItemType', }, userPermissions: { - deleteWorkItem: true, - updateWorkItem: true, - moveWorkItem: true, adminParentLink: true, - setWorkItemMetadata: true, - createNote: true, adminWorkItemLink: true, + createNote: true, + deleteWorkItem: true, markNoteAsInternal: true, + moveWorkItem: true, reportSpam: false, + setWorkItemMetadata: true, + summarizeComments: true, + updateWorkItem: true, __typename: 'WorkItemPermissions', }, widgets: [ @@ -5932,15 +5948,16 @@ export const mockToggleResolveDiscussionResponse = { }; const mockUserPermissions = { - deleteWorkItem: true, - updateWorkItem: true, - moveWorkItem: true, adminParentLin: true, - setWorkItemMetadata: true, - createNote: true, adminWorkItemLink: true, + createNote: true, + deleteWorkItem: true, markNoteAsInternal: true, + moveWorkItem: true, reportSpam: false, + setWorkItemMetadata: true, + summarizeComments: true, + updateWorkItem: true, __typename: 'WorkItemPermissions', }; @@ -6095,15 +6112,16 @@ export const workItemHierarchyNoChildrenTreeResponse = { }, title: 'New title without children', userPermissions: { - deleteWorkItem: true, - updateWorkItem: true, - moveWorkItem: true, - setWorkItemMetadata: true, adminParentLink: true, - createNote: true, adminWorkItemLink: true, + createNote: true, + deleteWorkItem: true, markNoteAsInternal: true, + moveWorkItem: true, reportSpam: false, + setWorkItemMetadata: true, + summarizeComments: true, + updateWorkItem: true, __typename: 'WorkItemPermissions', }, confidential: false,