diff --git a/app/assets/javascripts/issues/list/components/issues_list_app.vue b/app/assets/javascripts/issues/list/components/issues_list_app.vue index 5fb83dfd1ab14eb200648f06dd0bb27d1e772e9e..c8703fb3ab894dd1744b48ffce0d97db8f61a0dd 100644 --- a/app/assets/javascripts/issues/list/components/issues_list_app.vue +++ b/app/assets/javascripts/issues/list/components/issues_list_app.vue @@ -6,8 +6,11 @@ import { GlDropdown, GlDropdownItem, GlDropdownDivider, + GlDrawer, + GlLink, } from '@gitlab/ui'; import * as Sentry from '@sentry/browser'; +import produce from 'immer'; import fuzzaldrinPlus from 'fuzzaldrin-plus'; import { isEmpty } from 'lodash'; import IssueCardStatistics from 'ee_else_ce/issues/list/components/issue_card_statistics.vue'; @@ -62,6 +65,14 @@ import IssuableList from '~/vue_shared/issuable/list/components/issuable_list_ro import { DEFAULT_PAGE_SIZE, issuableListTabs } from '~/vue_shared/issuable/list/constants'; import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin'; import NewResourceDropdown from '~/vue_shared/components/new_resource_dropdown/new_resource_dropdown.vue'; +import WorkItemDetail from '~/work_items/components/work_item_detail.vue'; +import { + WIDGET_TYPE_ASSIGNEES, + WIDGET_TYPE_LABELS, + WIDGET_TYPE_START_AND_DUE_DATE, + WIDGET_TYPE_WEIGHT, + WIDGET_TYPE_MILESTONE, +} from '~/work_items/constants'; import { CREATED_DESC, defaultTypeTokenOptions, @@ -124,11 +135,14 @@ export default { GlDropdown, GlDropdownDivider, GlDropdownItem, + GlDrawer, IssuableByEmail, IssuableList, IssueCardStatistics, IssueCardTimeInfo, NewResourceDropdown, + WorkItemDetail, + GlLink, }, directives: { GlTooltip: GlTooltipDirective, @@ -194,6 +208,7 @@ export default { sortKey: CREATED_DESC, state: STATUS_OPEN, pageSize: DEFAULT_PAGE_SIZE, + activeIssuable: null, }; }, apollo: { @@ -504,6 +519,9 @@ export default { }) ); }, + isIssuableSelected() { + return !isEmpty(this.activeIssuable); + }, }, watch: { $route(newValue, oldValue) { @@ -764,12 +782,61 @@ export default { this.sortKey = sortKey; this.state = state || STATUS_OPEN; }, + handleSelectIssuable(issuable) { + this.activeIssuable = issuable; + }, + updateIssuablesCache(workItem) { + const client = this.$apollo.provider.clients.defaultClient; + const issuesList = client.readQuery({ + query: getIssuesQuery, + variables: this.queryVariables, + }); + + const data = produce(issuesList, (draftData) => { + const activeIssue = draftData.project.issues.nodes.find( + (issue) => issue.iid === workItem.iid, + ); + + activeIssue.title = workItem.title; + activeIssue.assignees = workItem?.widgets?.find( + (widget) => widget.type === WIDGET_TYPE_ASSIGNEES, + ).assignees; + activeIssue.labels = workItem?.widgets?.find( + (widget) => widget.type === WIDGET_TYPE_LABELS, + ).labels; + activeIssue.milestone = workItem?.widgets?.find( + (widget) => widget.type === WIDGET_TYPE_MILESTONE, + ).milestone; + activeIssue.weight = workItem?.widgets?.find( + (widget) => widget.type === WIDGET_TYPE_WEIGHT, + ).weight; + activeIssue.dueDate = workItem?.widgets?.find( + (widget) => widget.type === WIDGET_TYPE_START_AND_DUE_DATE, + ).dueDate; + }); + + client.writeQuery({ query: getIssuesQuery, variables: this.queryVariables, data }); + }, }, };