From f19ffffacda2d7f415f682f6e50e3cf06182e15e Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Wed, 22 Feb 2023 21:07:43 +0000 Subject: Add latest changes from gitlab-org/gitlab@master --- app/assets/images/learn_gitlab/section_code.svg | 4 ++ app/assets/javascripts/ide/index.js | 1 + .../ide/stores/modules/commit/actions.js | 5 ++ app/assets/javascripts/ide/stores/state.js | 1 + .../jobs/components/table/graphql/cache_config.js | 60 ++++++++++++---------- .../table/graphql/queries/get_jobs.query.graphql | 1 - .../graphql/queries/get_jobs_count.query.graphql | 8 +++ .../jobs/components/table/jobs_table_app.vue | 41 +++++++++------ app/controllers/ide_controller.rb | 1 + app/helpers/broadcast_messages_helper.rb | 17 ++++++ app/helpers/ide_helper.rb | 5 +- app/models/onboarding/completion.rb | 38 ++++++++++---- app/views/admin/broadcast_messages/index.html.haml | 14 +---- app/views/ide/_show.html.haml | 9 +++- 14 files changed, 135 insertions(+), 70 deletions(-) create mode 100644 app/assets/images/learn_gitlab/section_code.svg create mode 100644 app/assets/javascripts/jobs/components/table/graphql/queries/get_jobs_count.query.graphql (limited to 'app') diff --git a/app/assets/images/learn_gitlab/section_code.svg b/app/assets/images/learn_gitlab/section_code.svg new file mode 100644 index 00000000000..da170c93be6 --- /dev/null +++ b/app/assets/images/learn_gitlab/section_code.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/assets/javascripts/ide/index.js b/app/assets/javascripts/ide/index.js index 29c44d2f596..967c83b320f 100644 --- a/app/assets/javascripts/ide/index.js +++ b/app/assets/javascripts/ide/index.js @@ -72,6 +72,7 @@ export const initLegacyWebIDE = (el, options = {}) => { environmentsGuidanceAlertDismissed: !parseBoolean(el.dataset.enableEnvironmentsGuidance), previewMarkdownPath: el.dataset.previewMarkdownPath, userPreferencesPath: el.dataset.userPreferencesPath, + learnGitlabSource: parseBoolean(el.dataset.learnGitlabSource), }); }, beforeDestroy() { diff --git a/app/assets/javascripts/ide/stores/modules/commit/actions.js b/app/assets/javascripts/ide/stores/modules/commit/actions.js index d490b8c5dad..7f8e253ed37 100644 --- a/app/assets/javascripts/ide/stores/modules/commit/actions.js +++ b/app/assets/javascripts/ide/stores/modules/commit/actions.js @@ -1,6 +1,7 @@ import { createAlert } from '~/flash'; import { addNumericSuffix } from '~/ide/utils'; import { sprintf, __ } from '~/locale'; +import Tracking from '~/tracking'; import { leftSidebarViews } from '../../../constants'; import eventHub from '../../../eventhub'; import { parseCommitError } from '../../../lib/errors'; @@ -162,6 +163,10 @@ export const commitChanges = ({ commit, state, getters, dispatch, rootState, roo ); } + if (rootState.learnGitlabSource) { + Tracking.event(undefined, 'commit', { label: 'web_ide_learn_gitlab_source' }); + } + dispatch('setLastCommitMessage', data); dispatch('updateCommitMessage', ''); return dispatch('updateFilesAfterCommit', { diff --git a/app/assets/javascripts/ide/stores/state.js b/app/assets/javascripts/ide/stores/state.js index 356bbf28a48..013a0c3ce8f 100644 --- a/app/assets/javascripts/ide/stores/state.js +++ b/app/assets/javascripts/ide/stores/state.js @@ -32,4 +32,5 @@ export default () => ({ environmentsGuidanceAlertDetected: false, previewMarkdownPath: '', userPreferencesPath: '', + learnGitlabSource: false, }); diff --git a/app/assets/javascripts/jobs/components/table/graphql/cache_config.js b/app/assets/javascripts/jobs/components/table/graphql/cache_config.js index 8bcd7ffd10f..5390c023da4 100644 --- a/app/assets/javascripts/jobs/components/table/graphql/cache_config.js +++ b/app/assets/javascripts/jobs/components/table/graphql/cache_config.js @@ -11,42 +11,48 @@ export default { }, CiJobConnection: { merge(existing = {}, incoming, { args = {} }) { - let nodes; + if (incoming.nodes) { + let nodes; - const areNodesEqual = isEqual(existing.nodes, incoming.nodes); - const statuses = Array.isArray(args.statuses) ? [...args.statuses] : args.statuses; - const { pageInfo } = incoming; + const areNodesEqual = isEqual(existing.nodes, incoming.nodes); + const statuses = Array.isArray(args.statuses) ? [...args.statuses] : args.statuses; + const { pageInfo } = incoming; - if (Object.keys(existing).length !== 0 && isEqual(existing?.statuses, args?.statuses)) { - if (areNodesEqual) { - if (incoming.pageInfo.hasNextPage) { - nodes = [...existing.nodes, ...incoming.nodes]; + if (Object.keys(existing).length !== 0 && isEqual(existing?.statuses, args?.statuses)) { + if (areNodesEqual) { + if (incoming.pageInfo.hasNextPage) { + nodes = [...existing.nodes, ...incoming.nodes]; + } else { + nodes = [...incoming.nodes]; + } } else { - nodes = [...incoming.nodes]; - } - } else { - if (!existing.pageInfo?.hasNextPage) { - nodes = [...incoming.nodes]; + if (!existing.pageInfo?.hasNextPage) { + nodes = [...incoming.nodes]; - return { - nodes, - statuses, - pageInfo, - count: incoming.count, - }; - } + return { + nodes, + statuses, + pageInfo, + }; + } - nodes = [...existing.nodes, ...incoming.nodes]; + nodes = [...existing.nodes, ...incoming.nodes]; + } + } else { + nodes = [...incoming.nodes]; } - } else { - nodes = [...incoming.nodes]; + + return { + nodes, + statuses, + pageInfo, + }; } return { - nodes, - statuses, - pageInfo, - count: incoming.count, + nodes: existing.nodes, + pageInfo: existing.pageInfo, + statuses: args.statuses, }; }, }, diff --git a/app/assets/javascripts/jobs/components/table/graphql/queries/get_jobs.query.graphql b/app/assets/javascripts/jobs/components/table/graphql/queries/get_jobs.query.graphql index 851be211b25..69719011079 100644 --- a/app/assets/javascripts/jobs/components/table/graphql/queries/get_jobs.query.graphql +++ b/app/assets/javascripts/jobs/components/table/graphql/queries/get_jobs.query.graphql @@ -2,7 +2,6 @@ query getJobs($fullPath: ID!, $after: String, $first: Int = 30, $statuses: [CiJo project(fullPath: $fullPath) { id jobs(after: $after, first: $first, statuses: $statuses) { - count pageInfo { endCursor hasNextPage diff --git a/app/assets/javascripts/jobs/components/table/graphql/queries/get_jobs_count.query.graphql b/app/assets/javascripts/jobs/components/table/graphql/queries/get_jobs_count.query.graphql new file mode 100644 index 00000000000..a4e02ae721a --- /dev/null +++ b/app/assets/javascripts/jobs/components/table/graphql/queries/get_jobs_count.query.graphql @@ -0,0 +1,8 @@ +query getJobsCount($fullPath: ID!, $statuses: [CiJobStatus!]) { + project(fullPath: $fullPath) { + id + jobs(statuses: $statuses) { + count + } + } +} diff --git a/app/assets/javascripts/jobs/components/table/jobs_table_app.vue b/app/assets/javascripts/jobs/components/table/jobs_table_app.vue index 3209fc4b90d..49960278208 100644 --- a/app/assets/javascripts/jobs/components/table/jobs_table_app.vue +++ b/app/assets/javascripts/jobs/components/table/jobs_table_app.vue @@ -6,6 +6,7 @@ import { setUrlParams, updateHistory, queryToObject } from '~/lib/utils/url_util import JobsFilteredSearch from '../filtered_search/jobs_filtered_search.vue'; import { validateQueryString } from '../filtered_search/utils'; import GetJobs from './graphql/queries/get_jobs.query.graphql'; +import GetJobsCount from './graphql/queries/get_jobs_count.query.graphql'; import JobsTable from './jobs_table.vue'; import JobsTableEmptyState from './jobs_table_empty_state.vue'; import JobsTableTabs from './jobs_table_tabs.vue'; @@ -13,7 +14,8 @@ import { RAW_TEXT_WARNING } from './constants'; export default { i18n: { - errorMsg: __('There was an error fetching the jobs for your project.'), + jobsFetchErrorMsg: __('There was an error fetching the jobs for your project.'), + jobsCountErrorMsg: __('There was an error fetching the number of jobs for your project.'), loadingAriaLabel: __('Loading'), }, filterSearchBoxStyles: @@ -43,15 +45,29 @@ export default { }; }, update(data) { - const { jobs: { nodes: list = [], pageInfo = {}, count } = {} } = data.project || {}; + const { jobs: { nodes: list = [], pageInfo = {} } = {} } = data.project || {}; return { list, pageInfo, - count, }; }, error() { - this.hasError = true; + this.error = this.$options.i18n.jobsFetchErrorMsg; + }, + }, + jobsCount: { + query: GetJobsCount, + variables() { + return { + fullPath: this.fullPath, + ...this.validatedQueryString, + }; + }, + update({ project }) { + return project?.jobs?.count || 0; + }, + error() { + this.error = this.$options.i18n.jobsCountErrorMsg; }, }, }, @@ -60,11 +76,11 @@ export default { jobs: { list: [], }, - hasError: false, - isAlertDismissed: false, + error: '', scope: null, infiniteScrollingTriggered: false, filterSearchTriggered: false, + jobsCount: null, count: 0, }; }, @@ -72,9 +88,6 @@ export default { loading() { return this.$apollo.queries.jobs.loading; }, - shouldShowAlert() { - return this.hasError && !this.isAlertDismissed; - }, // Show when on All tab with no jobs // Show only when not loading and filtered search has not been triggered // So we don't show empty state when results are empty on a filtered search @@ -95,9 +108,6 @@ export default { showFilteredSearch() { return !this.scope; }, - jobsCount() { - return this.jobs.count; - }, validatedQueryString() { const queryStringObject = queryToObject(window.location.search); @@ -146,6 +156,7 @@ export default { }); this.$apollo.queries.jobs.refetch({ statuses: filter.value.data }); + this.$apollo.queries.jobsCount.refetch({ statuses: filter.value.data }); } }); }, @@ -168,14 +179,14 @@ export default {