diff options
Diffstat (limited to 'app/assets/javascripts/graphql_shared')
7 files changed, 143 insertions, 2 deletions
diff --git a/app/assets/javascripts/graphql_shared/fragments/issuable_timelogs.fragment.graphql b/app/assets/javascripts/graphql_shared/fragments/issuable_timelogs.fragment.graphql index fb771d7ec8a..45dbfb30704 100644 --- a/app/assets/javascripts/graphql_shared/fragments/issuable_timelogs.fragment.graphql +++ b/app/assets/javascripts/graphql_shared/fragments/issuable_timelogs.fragment.graphql @@ -1,4 +1,5 @@ fragment TimelogFragment on Timelog { + __typename id timeSpent user { diff --git a/app/assets/javascripts/graphql_shared/fragments/issue_time_tracking.fragment.graphql b/app/assets/javascripts/graphql_shared/fragments/issue_time_tracking.fragment.graphql new file mode 100644 index 00000000000..dbe6ad9f059 --- /dev/null +++ b/app/assets/javascripts/graphql_shared/fragments/issue_time_tracking.fragment.graphql @@ -0,0 +1,13 @@ +#import "~/graphql_shared/fragments/issuable_timelogs.fragment.graphql" + +fragment IssueTimeTrackingFragment on Issue { + __typename + id + humanTotalTimeSpent + totalTimeSpent + timelogs { + nodes { + ...TimelogFragment + } + } +} diff --git a/app/assets/javascripts/graphql_shared/fragments/merge_request_time_tracking.fragment.graphql b/app/assets/javascripts/graphql_shared/fragments/merge_request_time_tracking.fragment.graphql new file mode 100644 index 00000000000..68d3c02cf2e --- /dev/null +++ b/app/assets/javascripts/graphql_shared/fragments/merge_request_time_tracking.fragment.graphql @@ -0,0 +1,13 @@ +#import "~/graphql_shared/fragments/issuable_timelogs.fragment.graphql" + +fragment MergeRequestTimeTrackingFragment on MergeRequest { + __typename + id + humanTotalTimeSpent + totalTimeSpent + timelogs { + nodes { + ...TimelogFragment + } + } +} 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..e86103c332b --- /dev/null +++ b/app/assets/javascripts/graphql_shared/issuable_client.js @@ -0,0 +1,93 @@ +import produce from 'immer'; +import VueApollo from 'vue-apollo'; +import { concatPagination } from '@apollo/client/utilities'; +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: { + Project: { + fields: { + projectMembers: { + keyArgs: ['fullPath', 'search', 'relations', 'first'], + }, + }, + }, + WorkItem: { + fields: { + mockWidgets: { + read(widgets) { + return ( + widgets || [ + { + __typename: 'LocalWorkItemLabels', + type: WIDGET_TYPE_LABELS, + allowScopedLabels: true, + nodes: [], + }, + ] + ); + }, + }, + widgets: { + merge(_, incoming) { + return incoming; + }, + }, + }, + }, + MemberInterfaceConnection: { + fields: { + nodes: concatPagination(), + }, + }, + }, + }, +}; + +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, +}); diff --git a/app/assets/javascripts/graphql_shared/possible_types.json b/app/assets/javascripts/graphql_shared/possible_types.json index eac325f184f..72dbf9e7b7b 100644 --- a/app/assets/javascripts/graphql_shared/possible_types.json +++ b/app/assets/javascripts/graphql_shared/possible_types.json @@ -140,6 +140,7 @@ "WorkItemWidgetAssignees", "WorkItemWidgetDescription", "WorkItemWidgetHierarchy", + "WorkItemWidgetIteration", "WorkItemWidgetLabels", "WorkItemWidgetStartAndDueDate", "WorkItemWidgetVerificationStatus", diff --git a/app/assets/javascripts/graphql_shared/queries/project_topics_search.query.graphql b/app/assets/javascripts/graphql_shared/queries/project_topics_search.query.graphql new file mode 100644 index 00000000000..0c0a874d950 --- /dev/null +++ b/app/assets/javascripts/graphql_shared/queries/project_topics_search.query.graphql @@ -0,0 +1,10 @@ +query searchProjectTopics($search: String) { + topics(search: $search) { + nodes { + id + name + title + avatarUrl + } + } +} diff --git a/app/assets/javascripts/graphql_shared/queries/users_search.query.graphql b/app/assets/javascripts/graphql_shared/queries/users_search.query.graphql index bb34e4032f4..f64c4276deb 100644 --- a/app/assets/javascripts/graphql_shared/queries/users_search.query.graphql +++ b/app/assets/javascripts/graphql_shared/queries/users_search.query.graphql @@ -1,10 +1,20 @@ #import "../fragments/user.fragment.graphql" #import "~/graphql_shared/fragments/user_availability.fragment.graphql" -query projectUsersSearch($search: String!, $fullPath: ID!) { +query projectUsersSearch($search: String!, $fullPath: ID!, $after: String, $first: Int) { workspace: project(fullPath: $fullPath) { id - users: projectMembers(search: $search, relations: [DIRECT, INHERITED, INVITED_GROUPS]) { + users: projectMembers( + search: $search + relations: [DIRECT, INHERITED, INVITED_GROUPS] + first: $first + after: $after + ) { + pageInfo { + hasNextPage + endCursor + startCursor + } nodes { id user { |