diff --git a/app/assets/javascripts/merge_request_dashboard/components/merge_requests_query.vue b/app/assets/javascripts/merge_request_dashboard/components/merge_requests_query.vue index 573b7afcf325a1a0e08ef6f90f080644472cabba..34761f9d04685f02c98056b72e336051d7e703b8 100644 --- a/app/assets/javascripts/merge_request_dashboard/components/merge_requests_query.vue +++ b/app/assets/javascripts/merge_request_dashboard/components/merge_requests_query.vue @@ -1,21 +1,27 @@ <script> import reviewerQuery from '../queries/reviewer.query.graphql'; +import reviewerCountQuery from '../queries/reviewer_count.query.graphql'; import assigneeQuery from '../queries/assignee.query.graphql'; +import assigneeCountQuery from '../queries/assignee_count.query.graphql'; import assigneeOrReviewerQuery from '../queries/assignee_or_reviewer.query.graphql'; +import assigneeOrReviewerCountQuery from '../queries/assignee_or_reviewer_count.query.graphql'; const PER_PAGE = 20; const QUERIES = { - reviewRequestedMergeRequests: reviewerQuery, - assignedMergeRequests: assigneeQuery, - assigneeOrReviewerMergeRequests: assigneeOrReviewerQuery, + reviewRequestedMergeRequests: { dataQuery: reviewerQuery, countQuery: reviewerCountQuery }, + assignedMergeRequests: { dataQuery: assigneeQuery, countQuery: assigneeCountQuery }, + assigneeOrReviewerMergeRequests: { + dataQuery: assigneeOrReviewerQuery, + countQuery: assigneeOrReviewerCountQuery, + }, }; export default { apollo: { mergeRequests: { query() { - return QUERIES[this.query]; + return QUERIES[this.query].dataQuery; }, update(d) { return d.currentUser?.mergeRequests || {}; @@ -30,6 +36,20 @@ export default { this.error = true; }, }, + count: { + query() { + return QUERIES[this.query].countQuery; + }, + update(d) { + return d.currentUser?.mergeRequests?.count; + }, + variables() { + return { + ...this.variables, + perPage: PER_PAGE, + }; + }, + }, }, props: { query: { @@ -44,6 +64,7 @@ export default { data() { return { mergeRequests: null, + count: null, error: false, }; }, @@ -69,7 +90,7 @@ export default { render() { return this.$scopedSlots.default({ mergeRequests: this.mergeRequests?.nodes || [], - count: this.mergeRequests ? this.mergeRequests.count : null, + count: this.count, hasNextPage: this.hasNextPage, loadMore: this.loadMore, loading: this.isLoading, diff --git a/app/assets/javascripts/merge_request_dashboard/queries/assignee.query.graphql b/app/assets/javascripts/merge_request_dashboard/queries/assignee.query.graphql index 25dc21a07b271f67f798df7b8faba9d3dc57d728..e7361721e649b541f0093e959b772fb280bafe91 100644 --- a/app/assets/javascripts/merge_request_dashboard/queries/assignee.query.graphql +++ b/app/assets/javascripts/merge_request_dashboard/queries/assignee.query.graphql @@ -22,7 +22,6 @@ query requestingReview( after: $afterCursor sort: UPDATED_DESC ) { - count pageInfo { ...PageInfo } diff --git a/app/assets/javascripts/merge_request_dashboard/queries/assignee_count.query.graphql b/app/assets/javascripts/merge_request_dashboard/queries/assignee_count.query.graphql new file mode 100644 index 0000000000000000000000000000000000000000..d533a157a486fa37b1f1bc856ce5e8015a797145 --- /dev/null +++ b/app/assets/javascripts/merge_request_dashboard/queries/assignee_count.query.graphql @@ -0,0 +1,20 @@ +query requestingReviewCount( + $state: MergeRequestState = opened + $reviewState: MergeRequestReviewState + $reviewStates: [MergeRequestReviewState!] + $reviewerWildcardId: ReviewerWildcardId + $mergedAfter: Time +) { + currentUser { + id + mergeRequests: assignedMergeRequests( + state: $state + reviewState: $reviewState + reviewStates: $reviewStates + reviewerWildcardId: $reviewerWildcardId + mergedAfter: $mergedAfter + ) { + count + } + } +} diff --git a/app/assets/javascripts/merge_request_dashboard/queries/assignee_or_reviewer.query.graphql b/app/assets/javascripts/merge_request_dashboard/queries/assignee_or_reviewer.query.graphql index 5a743656a194c42ed0919c35331dc439b23c5010..a0b65e70867d136bac4bb9508d626adce46445db 100644 --- a/app/assets/javascripts/merge_request_dashboard/queries/assignee_or_reviewer.query.graphql +++ b/app/assets/javascripts/merge_request_dashboard/queries/assignee_or_reviewer.query.graphql @@ -20,7 +20,6 @@ query assigneeOrReviewer( after: $afterCursor sort: UPDATED_DESC ) { - count pageInfo { ...PageInfo } diff --git a/app/assets/javascripts/merge_request_dashboard/queries/assignee_or_reviewer_count.query.graphql b/app/assets/javascripts/merge_request_dashboard/queries/assignee_or_reviewer_count.query.graphql new file mode 100644 index 0000000000000000000000000000000000000000..c27f0a159fb40eb13b2707e0b73e14e0a99677cb --- /dev/null +++ b/app/assets/javascripts/merge_request_dashboard/queries/assignee_or_reviewer_count.query.graphql @@ -0,0 +1,18 @@ +query assigneeOrReviewerCount( + $state: MergeRequestState = opened + $assignedReviewStates: [MergeRequestReviewState!] + $reviewerReviewStates: [MergeRequestReviewState!] + $mergedAfter: Time +) { + currentUser { + id + mergeRequests: assigneeOrReviewerMergeRequests( + state: $state + assignedReviewStates: $assignedReviewStates + reviewerReviewStates: $reviewerReviewStates + mergedAfter: $mergedAfter + ) { + count + } + } +} diff --git a/app/assets/javascripts/merge_request_dashboard/queries/reviewer.query.graphql b/app/assets/javascripts/merge_request_dashboard/queries/reviewer.query.graphql index fbdfcb46c06f1afdbfe40b4d8ff72b31cb9e7167..e0c74ffed5acd30c3b7334b5ae9ae094156f0069 100644 --- a/app/assets/javascripts/merge_request_dashboard/queries/reviewer.query.graphql +++ b/app/assets/javascripts/merge_request_dashboard/queries/reviewer.query.graphql @@ -20,7 +20,6 @@ query reviewRequests( after: $afterCursor sort: UPDATED_DESC ) { - count pageInfo { ...PageInfo } diff --git a/app/assets/javascripts/merge_request_dashboard/queries/reviewer_count.query.graphql b/app/assets/javascripts/merge_request_dashboard/queries/reviewer_count.query.graphql new file mode 100644 index 0000000000000000000000000000000000000000..c7232688c8dd09ce3192044af7223c7d6688156b --- /dev/null +++ b/app/assets/javascripts/merge_request_dashboard/queries/reviewer_count.query.graphql @@ -0,0 +1,18 @@ +query reviewRequestsCount( + $state: MergeRequestState = opened + $reviewState: MergeRequestReviewState + $reviewStates: [MergeRequestReviewState!] + $mergedAfter: Time +) { + currentUser { + id + mergeRequests: reviewRequestedMergeRequests( + state: $state + reviewState: $reviewState + reviewStates: $reviewStates + mergedAfter: $mergedAfter + ) { + count + } + } +} diff --git a/spec/frontend/merge_request_dashboard/components/app_spec.js b/spec/frontend/merge_request_dashboard/components/app_spec.js index cbd98607e26ea13877f5a7d51b88c2837b11cdd9..81e0b97363a426b9d4bfce2b73b5a142bff79a54 100644 --- a/spec/frontend/merge_request_dashboard/components/app_spec.js +++ b/spec/frontend/merge_request_dashboard/components/app_spec.js @@ -8,6 +8,7 @@ import MergeRequestsQuery from '~/merge_request_dashboard/components/merge_reque import CollapsibleSection from '~/merge_request_dashboard/components/collapsible_section.vue'; import MergeRequest from '~/merge_request_dashboard/components/merge_request.vue'; import assigneeQuery from '~/merge_request_dashboard/queries/assignee.query.graphql'; +import assigneeCountQuery from '~/merge_request_dashboard/queries/assignee_count.query.graphql'; import { createMockMergeRequest } from '../mock_data'; Vue.use(VueApollo); @@ -27,7 +28,6 @@ describe('Merge requests app component', () => { currentUser: { id: 1, mergeRequests: { - count: 1, pageInfo: { hasNextPage: true, hasPreviousPage: false, @@ -41,7 +41,22 @@ describe('Merge requests app component', () => { }, }); const apolloProvider = createMockApollo( - [[assigneeQuery, assigneeQueryMock]], + [ + [assigneeQuery, assigneeQueryMock], + [ + assigneeCountQuery, + jest.fn().mockResolvedValue({ + data: { + currentUser: { + id: 1, + mergeRequests: { + count: 1, + }, + }, + }, + }), + ], + ], {}, { typePolicies: { Query: { fields: { currentUser: { merge: false } } } } }, ); diff --git a/spec/frontend/merge_request_dashboard/components/merge_requests_query_spec.js b/spec/frontend/merge_request_dashboard/components/merge_requests_query_spec.js index 4b1fc388c9b848d91298d947b756c2690eefb803..99cf15c0bab2707762aa50fd3b0f84a88dd9d495 100644 --- a/spec/frontend/merge_request_dashboard/components/merge_requests_query_spec.js +++ b/spec/frontend/merge_request_dashboard/components/merge_requests_query_spec.js @@ -5,7 +5,9 @@ import createMockApollo from 'helpers/mock_apollo_helper'; import waitForPromises from 'helpers/wait_for_promises'; import MergeRequestQuery from '~/merge_request_dashboard/components/merge_requests_query.vue'; import reviewerQuery from '~/merge_request_dashboard/queries/reviewer.query.graphql'; +import reviewerCountQuery from '~/merge_request_dashboard/queries/reviewer_count.query.graphql'; import assigneeQuery from '~/merge_request_dashboard/queries/assignee.query.graphql'; +import assigneeCountQuery from '~/merge_request_dashboard/queries/assignee_count.query.graphql'; import { createMockMergeRequest } from '../mock_data'; Vue.use(VueApollo); @@ -23,7 +25,6 @@ describe('Merge requests query component', () => { currentUser: { id: 1, mergeRequests: { - count: 0, pageInfo: { __typename: 'PageInfo', hasNextPage: false, @@ -41,7 +42,6 @@ describe('Merge requests query component', () => { currentUser: { id: 1, mergeRequests: { - count: 0, pageInfo: { hasNextPage: false, hasPreviousPage: false, @@ -54,10 +54,26 @@ describe('Merge requests query component', () => { }, }, }); - const apolloProvider = createMockApollo([ - [reviewerQuery, reviewerQueryMock], - [assigneeQuery, assigneeQueryMock], - ]); + const apolloProvider = createMockApollo( + [ + [reviewerQuery, reviewerQueryMock], + [assigneeQuery, assigneeQueryMock], + [ + reviewerCountQuery, + jest + .fn() + .mockResolvedValue({ data: { currentUser: { id: 1, mergeRequests: { count: 1 } } } }), + ], + [ + assigneeCountQuery, + jest + .fn() + .mockResolvedValue({ data: { currentUser: { id: 1, mergeRequests: { count: 1 } } } }), + ], + ], + {}, + { typePolicies: { Query: { fields: { currentUser: { merge: false } } } } }, + ); slotSpy = jest.fn();