diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-08-18 18:12:17 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-08-18 18:12:17 +0300 |
commit | c48bbe6650648fa034696de25983418981e695eb (patch) | |
tree | 0dcf30de46ba62585746d9e5f8fa6ceb52df7d28 /app/assets/javascripts/graphql_shared | |
parent | c7b2529418eb0fb802637709eafe8016a4d106b0 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/assets/javascripts/graphql_shared')
-rw-r--r-- | app/assets/javascripts/graphql_shared/issuable_client.js | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/app/assets/javascripts/graphql_shared/issuable_client.js b/app/assets/javascripts/graphql_shared/issuable_client.js new file mode 100644 index 00000000000..991572958c3 --- /dev/null +++ b/app/assets/javascripts/graphql_shared/issuable_client.js @@ -0,0 +1,80 @@ +import produce from 'immer'; +import VueApollo from 'vue-apollo'; +import getIssueStateQuery from '~/issues/show/queries/get_issue_state.query.graphql'; +import createDefaultClient from '~/lib/graphql'; +import typeDefs from '~/work_items/graphql/typedefs.graphql'; +import workItemQuery from '~/work_items/graphql/work_item.query.graphql'; +import { WIDGET_TYPE_LABELS } from '~/work_items/constants'; + +export const temporaryConfig = { + typeDefs, + cacheConfig: { + possibleTypes: { + LocalWorkItemWidget: ['LocalWorkItemLabels'], + }, + typePolicies: { + WorkItem: { + fields: { + mockWidgets: { + read(widgets) { + return ( + widgets || [ + { + __typename: 'LocalWorkItemLabels', + type: WIDGET_TYPE_LABELS, + allowScopedLabels: true, + nodes: [], + }, + ] + ); + }, + }, + widgets: { + merge(_, incoming) { + return incoming; + }, + }, + }, + }, + }, + }, +}; + +export const resolvers = { + Mutation: { + updateIssueState: (_, { issueType = undefined, isDirty = false }, { cache }) => { + const sourceData = cache.readQuery({ query: getIssueStateQuery }); + const data = produce(sourceData, (draftData) => { + draftData.issueState = { issueType, isDirty }; + }); + cache.writeQuery({ query: getIssueStateQuery, data }); + }, + localUpdateWorkItem(_, { input }, { cache }) { + const sourceData = cache.readQuery({ + query: workItemQuery, + variables: { id: input.id }, + }); + + const data = produce(sourceData, (draftData) => { + if (input.labels) { + const labelsWidget = draftData.workItem.mockWidgets.find( + (widget) => widget.type === WIDGET_TYPE_LABELS, + ); + labelsWidget.nodes = [...input.labels]; + } + }); + + cache.writeQuery({ + query: workItemQuery, + variables: { id: input.id }, + data, + }); + }, + }, +}; + +export const defaultClient = createDefaultClient(resolvers, temporaryConfig); + +export const apolloProvider = new VueApollo({ + defaultClient, +}); |