diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-06-30 00:07:45 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-06-30 00:07:45 +0000 |
commit | e222250937b497b4cf6e9b8e5ddde0097f0e0954 (patch) | |
tree | 28884b81a74a2d9da5bb446c925b4903b512ae81 /app/assets/javascripts | |
parent | 97eb4a009519453821dcae6c99049e490863adce (diff) | |
download | gitlab-ce-e222250937b497b4cf6e9b8e5ddde0097f0e0954.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/assets/javascripts')
5 files changed, 103 insertions, 22 deletions
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 583f8b6ed17..57250b69d70 100644 --- a/app/assets/javascripts/issues_list/components/issues_list_app.vue +++ b/app/assets/javascripts/issues_list/components/issues_list_app.vue @@ -20,6 +20,7 @@ import { CREATED_DESC, i18n, initialPageParams, + issuesCountSmartQueryBase, MAX_LIST_SIZE, PAGE_SIZE, PARAM_DUE_DATE, @@ -29,11 +30,11 @@ import { TOKEN_TYPE_ASSIGNEE, TOKEN_TYPE_AUTHOR, TOKEN_TYPE_CONFIDENTIAL, - TOKEN_TYPE_MY_REACTION, TOKEN_TYPE_EPIC, TOKEN_TYPE_ITERATION, TOKEN_TYPE_LABEL, TOKEN_TYPE_MILESTONE, + TOKEN_TYPE_MY_REACTION, TOKEN_TYPE_WEIGHT, UPDATED_DESC, urlSortParams, @@ -171,26 +172,17 @@ export default { showBulkEditSidebar: false, sortKey: getSortKey(getParameterByName(PARAM_SORT)) || defaultSortKey, state: state || IssuableStates.Opened, - totalIssues: 0, }; }, apollo: { issues: { query: getIssuesQuery, variables() { - return { - projectPath: this.projectPath, - search: this.searchQuery, - sort: this.sortKey, - state: this.state, - ...this.pageParams, - ...this.apiFilterParams, - }; + return this.queryVariables; }, update: ({ project }) => project?.issues.nodes ?? [], result({ data }) { this.pageInfo = data.project?.issues.pageInfo ?? {}; - this.totalIssues = data.project?.issues.count ?? 0; this.exportCsvPathWithQuery = this.getExportCsvPathWithQuery(); }, error(error) { @@ -201,8 +193,55 @@ export default { }, debounce: 200, }, + countOpened: { + ...issuesCountSmartQueryBase, + variables() { + return { + ...this.queryVariables, + state: IssuableStates.Opened, + }; + }, + skip() { + return !this.hasProjectIssues; + }, + }, + countClosed: { + ...issuesCountSmartQueryBase, + variables() { + return { + ...this.queryVariables, + state: IssuableStates.Closed, + }; + }, + skip() { + return !this.hasProjectIssues; + }, + }, + countAll: { + ...issuesCountSmartQueryBase, + variables() { + return { + ...this.queryVariables, + state: IssuableStates.All, + }; + }, + skip() { + return !this.hasProjectIssues; + }, + }, }, computed: { + queryVariables() { + return { + isSignedIn: this.isSignedIn, + projectPath: this.projectPath, + search: this.searchQuery, + sort: this.sortKey, + state: this.state, + ...this.pageParams, + ...this.apiFilterParams, + }; + }, hasSearch() { return this.searchQuery || Object.keys(this.urlFilterParams).length; }, @@ -347,13 +386,14 @@ export default { return getSortOptions(this.hasIssueWeightsFeature, this.hasBlockedIssuesFeature); }, tabCounts() { - return Object.values(IssuableStates).reduce( - (acc, state) => ({ - ...acc, - [state]: this.state === state ? this.totalIssues : undefined, - }), - {}, - ); + return { + [IssuableStates.Opened]: this.countOpened, + [IssuableStates.Closed]: this.countClosed, + [IssuableStates.All]: this.countAll, + }; + }, + currentTabCount() { + return this.tabCounts[this.state] ?? 0; }, urlParams() { return { @@ -595,7 +635,7 @@ export default { v-if="isSignedIn" class="gl-md-mr-3" :export-csv-path="exportCsvPathWithQuery" - :issuable-count="totalIssues" + :issuable-count="currentTabCount" /> <gl-button v-if="canBulkUpdate" @@ -706,7 +746,7 @@ export default { <csv-import-export-buttons class="gl-mr-3" :export-csv-path="exportCsvPathWithQuery" - :issuable-count="totalIssues" + :issuable-count="currentTabCount" /> </template> </gl-empty-state> diff --git a/app/assets/javascripts/issues_list/constants.js b/app/assets/javascripts/issues_list/constants.js index 6337ccc4926..e4b9136343e 100644 --- a/app/assets/javascripts/issues_list/constants.js +++ b/app/assets/javascripts/issues_list/constants.js @@ -1,3 +1,5 @@ +import getIssuesCountQuery from 'ee_else_ce/issues_list/queries/get_issues_count.query.graphql'; +import createFlash from '~/flash'; import { __, s__ } from '~/locale'; import { FILTER_ANY, @@ -68,6 +70,7 @@ export const i18n = { confidentialYes: __('Yes'), downvotes: __('Downvotes'), editIssues: __('Edit issues'), + errorFetchingCounts: __('An error occurred while getting issue counts'), errorFetchingIssues: __('An error occurred while loading issues'), jiraIntegrationMessage: s__( 'JiraService|%{jiraDocsLinkStart}Enable the Jira integration%{jiraDocsLinkEnd} to view your Jira issues in GitLab.', @@ -321,3 +324,15 @@ export const filters = { }, }, }; + +export const issuesCountSmartQueryBase = { + query: getIssuesCountQuery, + context: { + isSingleRequest: true, + }, + update: ({ project }) => project?.issues.count, + error(error) { + createFlash({ message: i18n.errorFetchingCounts, captureError: true, error }); + }, + debounce: 200, +}; diff --git a/app/assets/javascripts/issues_list/queries/get_issues.query.graphql b/app/assets/javascripts/issues_list/queries/get_issues.query.graphql index afd53084ca0..124190915c0 100644 --- a/app/assets/javascripts/issues_list/queries/get_issues.query.graphql +++ b/app/assets/javascripts/issues_list/queries/get_issues.query.graphql @@ -2,6 +2,7 @@ #import "./issue.fragment.graphql" query getProjectIssues( + $isSignedIn: Boolean = false $projectPath: ID! $search: String $sort: IssueSort @@ -33,7 +34,6 @@ query getProjectIssues( first: $firstPageSize last: $lastPageSize ) { - count pageInfo { ...PageInfo } diff --git a/app/assets/javascripts/issues_list/queries/get_issues_count.query.graphql b/app/assets/javascripts/issues_list/queries/get_issues_count.query.graphql new file mode 100644 index 00000000000..a1742859640 --- /dev/null +++ b/app/assets/javascripts/issues_list/queries/get_issues_count.query.graphql @@ -0,0 +1,26 @@ +query getProjectIssuesCount( + $projectPath: ID! + $search: String + $state: IssuableState + $assigneeId: String + $assigneeUsernames: [String!] + $authorUsername: String + $labelName: [String] + $milestoneTitle: [String] + $not: NegatedIssueFilterInput +) { + project(fullPath: $projectPath) { + issues( + search: $search + state: $state + assigneeId: $assigneeId + assigneeUsernames: $assigneeUsernames + authorUsername: $authorUsername + labelName: $labelName + milestoneTitle: $milestoneTitle + not: $not + ) { + count + } + } +} diff --git a/app/assets/javascripts/issues_list/queries/issue.fragment.graphql b/app/assets/javascripts/issues_list/queries/issue.fragment.graphql index de30d8b4bf6..f7ebf64ffb8 100644 --- a/app/assets/javascripts/issues_list/queries/issue.fragment.graphql +++ b/app/assets/javascripts/issues_list/queries/issue.fragment.graphql @@ -11,7 +11,7 @@ fragment IssueFragment on Issue { title updatedAt upvotes - userDiscussionsCount + userDiscussionsCount @include(if: $isSignedIn) webUrl assignees { nodes { |