From d89b82481b3ee5a226bab905555dd9c6a4708521 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Wed, 21 Apr 2021 09:09:15 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- .gitlab/ci/rails.gitlab-ci.yml | 4 +- .rubocop_manual_todo.yml | 61 ------ .../javascripts/cycle_analytics/constants.js | 1 + .../cycle_analytics/store/actions.js | 51 +++++ .../cycle_analytics/store/index.js | 21 ++ .../cycle_analytics/store/mutation_types.js | 12 ++ .../cycle_analytics/store/mutations.js | 52 +++++ .../cycle_analytics/store/state.js | 17 ++ .../javascripts/cycle_analytics/utils.js | 63 ++++++ .../components/expiration_dropdown.vue | 0 .../project}/components/expiration_input.vue | 5 +- .../components/expiration_run_text.vue | 5 +- .../project}/components/expiration_toggle.vue | 5 +- .../components/registry_settings_app.vue | 4 +- .../project}/components/settings_form.vue | 8 +- .../settings/project}/constants.js | 0 ...ntainer_expiration_policy.fragment.graphql | 0 .../settings/project}/graphql/index.js | 0 ...ntainer_expiration_policy.mutation.graphql | 0 .../get_expiration_policy.query.graphql | 0 .../project}/graphql/utils/cache_update.js | 0 .../project}/registry_settings_bundle.js | 0 .../settings/project}/utils.js | 0 .../projects/settings/ci_cd/show/index.js | 2 +- .../boards/board_issue_input_base_type.rb | 4 + app/models/clusters/agent.rb | 1 + app/models/clusters/agent_token.rb | 4 +- ...115-more-filters-issue-resolver-boards.yml | 5 + changelogs/unreleased/322128-token-order.yml | 5 + .../unreleased/gitaly_usage_data_apdex.yml | 5 + ...x-empty-line-after-let-it-be-gitlab-ci.yml | 5 + ...y-line-after-let-it-be-models-packages.yml | 5 + ...y-line-after-let-it-be-models-releases.yml | 5 + ...-empty-line-after-let-it-be-presenters.yml | 5 + ...empty-line-after-let-it-be-services-ci.yml | 5 + .../settings/20210321224827_gitaly_apdex.yml | 20 ++ ...ex_cluster_agent_tokens_on_last_used_at.rb | 20 ++ db/schema_migrations/20210420012909 | 1 + db/structure.sql | 2 +- doc/api/graphql/reference/index.md | 9 + doc/development/fe_guide/icons.md | 7 + doc/development/rake_tasks.md | 4 + doc/development/usage_ping/dictionary.md | 12 ++ .../cycle_analytics/data_collector.rb | 15 ++ lib/gitlab/usage_data.rb | 13 +- locale/gitlab.pot | 12 ++ scripts/gitaly-test-build | 4 +- scripts/gitaly-test-spawn | 4 +- spec/frontend/cycle_analytics/mock_data.js | 186 ++++++++++++++++++ .../cycle_analytics/store/actions_spec.js | 130 ++++++++++++ .../cycle_analytics/store/mutations_spec.js | 83 ++++++++ spec/frontend/cycle_analytics/utils_spec.js | 77 ++++++++ .../settings/__snapshots__/utils_spec.js.snap | 0 .../__snapshots__/settings_form_spec.js.snap | 0 .../components/expiration_dropdown_spec.js | 2 +- .../components/expiration_input_spec.js | 4 +- .../components/expiration_run_text_spec.js | 7 +- .../components/expiration_toggle_spec.js | 4 +- .../components/registry_settings_app_spec.js | 8 +- .../settings/components/settings_form_spec.js | 10 +- .../settings/graphql/cache_updated_spec.js | 4 +- .../settings/project}/settings/mock_data.js | 0 .../settings/project}/settings/utils_spec.js | 2 +- .../gitlab/ci/build/policy/changes_spec.rb | 1 + .../ci/config/external/file/local_spec.rb | 1 + .../ci/config/external/file/project_spec.rb | 1 + .../ci/config/external/file/template_spec.rb | 1 + .../gitlab/ci/config/external/mapper_spec.rb | 1 + .../ci/config/external/processor_spec.rb | 1 + .../gitlab/ci/pipeline/chain/build_spec.rb | 1 + .../chain/cancel_pending_pipelines_spec.rb | 1 + .../ci/pipeline/chain/template_usage_spec.rb | 1 + .../pipeline/chain/validate/external_spec.rb | 1 + .../chain/validate/repository_spec.rb | 1 + .../lib/gitlab/ci/pipeline/seed/build_spec.rb | 1 + .../ci/pipeline/seed/deployment_spec.rb | 1 + .../ci/pipeline/seed/environment_spec.rb | 1 + .../seed/processable/resource_group_spec.rb | 1 + .../ci/reports/test_failure_history_spec.rb | 1 + spec/lib/gitlab/ci/syntax_templates_spec.rb | 1 + spec/lib/gitlab/ci/trace/chunked_io_spec.rb | 1 + spec/lib/gitlab/ci/trace_spec.rb | 1 + spec/lib/gitlab/usage_data_spec.rb | 13 ++ spec/models/clusters/agent_spec.rb | 1 + spec/models/clusters/agent_token_spec.rb | 13 ++ spec/models/packages/dependency_spec.rb | 5 + .../models/packages/go/module_version_spec.rb | 11 ++ spec/models/packages/package_spec.rb | 2 + spec/models/packages/tag_spec.rb | 1 + spec/models/release_spec.rb | 1 + spec/models/releases/evidence_spec.rb | 1 + spec/models/releases/source_spec.rb | 1 + .../alert_management/alert_presenter_spec.rb | 1 + spec/presenters/ci/pipeline_presenter_spec.rb | 2 + spec/presenters/label_presenter_spec.rb | 1 + .../composer/packages_presenter_spec.rb | 1 + .../packages/conan/package_presenter_spec.rb | 1 + .../packages/detail/package_presenter_spec.rb | 1 + .../packages/npm/package_presenter_spec.rb | 1 + .../nuget/search_results_presenter_spec.rb | 1 + spec/presenters/project_presenter_spec.rb | 2 + .../prometheus_alert_presenter_spec.rb | 1 + spec/presenters/release_presenter_spec.rb | 1 + spec/presenters/user_presenter_spec.rb | 1 + .../ci/change_variable_service_spec.rb | 1 + .../ci/change_variables_service_spec.rb | 1 + .../cross_project_pipeline_spec.rb | 1 + .../custom_config_content_spec.rb | 1 + .../create_pipeline_service/dry_run_spec.rb | 1 + .../environment_spec.rb | 1 + .../parameter_content_spec.rb | 1 + .../parent_child_pipeline_spec.rb | 1 + .../ci/create_pipeline_service_spec.rb | 1 + .../create_web_ide_terminal_service_spec.rb | 1 + .../ci/expire_pipeline_cache_service_spec.rb | 1 + .../create_pipeline_service_spec.rb | 1 + .../ci/find_exposed_artifacts_service_spec.rb | 1 + .../ci/job_artifacts/create_service_spec.rb | 1 + .../ci/parse_dotenv_artifact_service_spec.rb | 1 + .../ci/pipeline_bridge_status_service_spec.rb | 1 + .../ci/pipeline_trigger_service_spec.rb | 1 + .../observe_histograms_service_spec.rb | 1 + spec/services/ci/register_job_service_spec.rb | 1 + ...source_from_resource_group_service_spec.rb | 1 + spec/services/ci/retry_build_service_spec.rb | 1 + .../ci/stop_environments_service_spec.rb | 1 + .../support/helpers/gitaly_setup.rb | 10 +- .../admin/dashboard/index.html.haml_spec.rb | 16 +- 128 files changed, 1024 insertions(+), 106 deletions(-) create mode 100644 app/assets/javascripts/cycle_analytics/constants.js create mode 100644 app/assets/javascripts/cycle_analytics/store/actions.js create mode 100644 app/assets/javascripts/cycle_analytics/store/index.js create mode 100644 app/assets/javascripts/cycle_analytics/store/mutation_types.js create mode 100644 app/assets/javascripts/cycle_analytics/store/mutations.js create mode 100644 app/assets/javascripts/cycle_analytics/store/state.js create mode 100644 app/assets/javascripts/cycle_analytics/utils.js rename app/assets/javascripts/{registry/settings => packages_and_registries/settings/project}/components/expiration_dropdown.vue (100%) rename app/assets/javascripts/{registry/settings => packages_and_registries/settings/project}/components/expiration_input.vue (95%) rename app/assets/javascripts/{registry/settings => packages_and_registries/settings/project}/components/expiration_run_text.vue (87%) rename app/assets/javascripts/{registry/settings => packages_and_registries/settings/project}/components/expiration_toggle.vue (91%) rename app/assets/javascripts/{registry/settings => packages_and_registries/settings/project}/components/registry_settings_app.vue (93%) rename app/assets/javascripts/{registry/settings => packages_and_registries/settings/project}/components/settings_form.vue (95%) rename app/assets/javascripts/{registry/settings => packages_and_registries/settings/project}/constants.js (100%) rename app/assets/javascripts/{registry/settings => packages_and_registries/settings/project}/graphql/fragments/container_expiration_policy.fragment.graphql (100%) rename app/assets/javascripts/{registry/settings => packages_and_registries/settings/project}/graphql/index.js (100%) rename app/assets/javascripts/{registry/settings => packages_and_registries/settings/project}/graphql/mutations/update_container_expiration_policy.mutation.graphql (100%) rename app/assets/javascripts/{registry/settings => packages_and_registries/settings/project}/graphql/queries/get_expiration_policy.query.graphql (100%) rename app/assets/javascripts/{registry/settings => packages_and_registries/settings/project}/graphql/utils/cache_update.js (100%) rename app/assets/javascripts/{registry/settings => packages_and_registries/settings/project}/registry_settings_bundle.js (100%) rename app/assets/javascripts/{registry/settings => packages_and_registries/settings/project}/utils.js (100%) create mode 100644 changelogs/unreleased/300115-more-filters-issue-resolver-boards.yml create mode 100644 changelogs/unreleased/322128-token-order.yml create mode 100644 changelogs/unreleased/gitaly_usage_data_apdex.yml create mode 100644 changelogs/unreleased/issue-325836-fix-empty-line-after-let-it-be-gitlab-ci.yml create mode 100644 changelogs/unreleased/issue-325836-fix-empty-line-after-let-it-be-models-packages.yml create mode 100644 changelogs/unreleased/issue-325836-fix-empty-line-after-let-it-be-models-releases.yml create mode 100644 changelogs/unreleased/issue-325836-fix-empty-line-after-let-it-be-presenters.yml create mode 100644 changelogs/unreleased/issue-325836-fix-empty-line-after-let-it-be-services-ci.yml create mode 100644 config/metrics/settings/20210321224827_gitaly_apdex.yml create mode 100644 db/migrate/20210420012909_index_cluster_agent_tokens_on_last_used_at.rb create mode 100644 db/schema_migrations/20210420012909 create mode 100644 spec/frontend/cycle_analytics/mock_data.js create mode 100644 spec/frontend/cycle_analytics/store/actions_spec.js create mode 100644 spec/frontend/cycle_analytics/store/mutations_spec.js create mode 100644 spec/frontend/cycle_analytics/utils_spec.js rename spec/frontend/{registry => packages_and_registries/settings/project}/settings/__snapshots__/utils_spec.js.snap (100%) rename spec/frontend/{registry => packages_and_registries/settings/project}/settings/components/__snapshots__/settings_form_spec.js.snap (100%) rename spec/frontend/{registry => packages_and_registries/settings/project}/settings/components/expiration_dropdown_spec.js (95%) rename spec/frontend/{registry => packages_and_registries/settings/project}/settings/components/expiration_input_spec.js (96%) rename spec/frontend/{registry => packages_and_registries/settings/project}/settings/components/expiration_run_text_spec.js (87%) rename spec/frontend/{registry => packages_and_registries/settings/project}/settings/components/expiration_toggle_spec.js (91%) rename spec/frontend/{registry => packages_and_registries/settings/project}/settings/components/registry_settings_app_spec.js (92%) rename spec/frontend/{registry => packages_and_registries/settings/project}/settings/components/settings_form_spec.js (96%) rename spec/frontend/{registry => packages_and_registries/settings/project}/settings/graphql/cache_updated_spec.js (82%) rename spec/frontend/{registry => packages_and_registries/settings/project}/settings/mock_data.js (100%) rename spec/frontend/{registry => packages_and_registries/settings/project}/settings/utils_spec.js (94%) rename scripts/gitaly_test.rb => spec/support/helpers/gitaly_setup.rb (94%) diff --git a/.gitlab/ci/rails.gitlab-ci.yml b/.gitlab/ci/rails.gitlab-ci.yml index 064aa5a8351..6e86f92ab26 100644 --- a/.gitlab/ci/rails.gitlab-ci.yml +++ b/.gitlab/ci/rails.gitlab-ci.yml @@ -113,10 +113,10 @@ ############################ # rspec job parallel configs .rspec-migration-parallel: - parallel: 5 + parallel: 7 .rspec-ee-migration-parallel: - parallel: 2 + parallel: 3 .rspec-unit-parallel: parallel: 20 diff --git a/.rubocop_manual_todo.yml b/.rubocop_manual_todo.yml index 7f4a69ef128..f428105cb32 100644 --- a/.rubocop_manual_todo.yml +++ b/.rubocop_manual_todo.yml @@ -420,7 +420,6 @@ RSpec/EmptyLineAfterFinalLetItBe: - ee/spec/controllers/subscriptions_controller_spec.rb - ee/spec/features/boards/group_boards/multiple_boards_spec.rb - ee/spec/features/ci_shared_runner_warnings_spec.rb - - ee/spec/features/dashboards/todos_spec.rb - ee/spec/features/groups/groups_security_credentials_spec.rb - ee/spec/features/groups/hooks/user_edits_hooks_spec.rb - ee/spec/features/groups/iterations/user_edits_iteration_spec.rb @@ -655,25 +654,6 @@ RSpec/EmptyLineAfterFinalLetItBe: - spec/lib/extracts_path_spec.rb - spec/lib/extracts_ref_spec.rb - spec/lib/gitlab/cache/ci/project_pipeline_status_spec.rb - - spec/lib/gitlab/ci/build/policy/changes_spec.rb - - spec/lib/gitlab/ci/config/external/file/local_spec.rb - - spec/lib/gitlab/ci/config/external/file/project_spec.rb - - spec/lib/gitlab/ci/config/external/file/template_spec.rb - - spec/lib/gitlab/ci/config/external/mapper_spec.rb - - spec/lib/gitlab/ci/config/external/processor_spec.rb - - spec/lib/gitlab/ci/pipeline/chain/build_spec.rb - - spec/lib/gitlab/ci/pipeline/chain/cancel_pending_pipelines_spec.rb - - spec/lib/gitlab/ci/pipeline/chain/template_usage_spec.rb - - spec/lib/gitlab/ci/pipeline/chain/validate/external_spec.rb - - spec/lib/gitlab/ci/pipeline/chain/validate/repository_spec.rb - - spec/lib/gitlab/ci/pipeline/seed/build_spec.rb - - spec/lib/gitlab/ci/pipeline/seed/deployment_spec.rb - - spec/lib/gitlab/ci/pipeline/seed/environment_spec.rb - - spec/lib/gitlab/ci/pipeline/seed/processable/resource_group_spec.rb - - spec/lib/gitlab/ci/reports/test_failure_history_spec.rb - - spec/lib/gitlab/ci/syntax_templates_spec.rb - - spec/lib/gitlab/ci/trace/chunked_io_spec.rb - - spec/lib/gitlab/ci/trace_spec.rb - spec/lib/gitlab/closing_issue_extractor_spec.rb - spec/lib/gitlab/composer/cache_spec.rb - spec/lib/gitlab/data_builder/wiki_page_spec.rb @@ -710,16 +690,9 @@ RSpec/EmptyLineAfterFinalLetItBe: - spec/models/note_spec.rb - spec/models/notification_setting_spec.rb - spec/models/operations/feature_flag_spec.rb - - spec/models/packages/dependency_spec.rb - - spec/models/packages/go/module_version_spec.rb - - spec/models/packages/package_spec.rb - - spec/models/packages/tag_spec.rb - spec/models/plan_limits_spec.rb - spec/models/prometheus_alert_spec.rb - spec/models/protected_branch/push_access_level_spec.rb - - spec/models/release_spec.rb - - spec/models/releases/evidence_spec.rb - - spec/models/releases/source_spec.rb - spec/models/repository_spec.rb - spec/models/service_spec.rb - spec/models/snippet_repository_spec.rb @@ -729,18 +702,6 @@ RSpec/EmptyLineAfterFinalLetItBe: - spec/models/user_spec.rb - spec/models/wiki_page/meta_spec.rb - spec/models/wiki_page_spec.rb - - spec/presenters/alert_management/alert_presenter_spec.rb - - spec/presenters/ci/pipeline_presenter_spec.rb - - spec/presenters/label_presenter_spec.rb - - spec/presenters/packages/composer/packages_presenter_spec.rb - - spec/presenters/packages/conan/package_presenter_spec.rb - - spec/presenters/packages/detail/package_presenter_spec.rb - - spec/presenters/packages/npm/package_presenter_spec.rb - - spec/presenters/packages/nuget/search_results_presenter_spec.rb - - spec/presenters/project_presenter_spec.rb - - spec/presenters/prometheus_alert_presenter_spec.rb - - spec/presenters/release_presenter_spec.rb - - spec/presenters/user_presenter_spec.rb - spec/requests/api/api_spec.rb - spec/requests/api/award_emoji_spec.rb - spec/requests/api/branches_spec.rb @@ -839,28 +800,6 @@ RSpec/EmptyLineAfterFinalLetItBe: - spec/services/auth/dependency_proxy_authentication_service_spec.rb - spec/services/auto_merge_service_spec.rb - spec/services/bulk_create_integration_service_spec.rb - - spec/services/ci/change_variable_service_spec.rb - - spec/services/ci/change_variables_service_spec.rb - - spec/services/ci/create_pipeline_service/cross_project_pipeline_spec.rb - - spec/services/ci/create_pipeline_service/custom_config_content_spec.rb - - spec/services/ci/create_pipeline_service/dry_run_spec.rb - - spec/services/ci/create_pipeline_service/environment_spec.rb - - spec/services/ci/create_pipeline_service/parameter_content_spec.rb - - spec/services/ci/create_pipeline_service/parent_child_pipeline_spec.rb - - spec/services/ci/create_pipeline_service_spec.rb - - spec/services/ci/create_web_ide_terminal_service_spec.rb - - spec/services/ci/expire_pipeline_cache_service_spec.rb - - spec/services/ci/external_pull_requests/create_pipeline_service_spec.rb - - spec/services/ci/find_exposed_artifacts_service_spec.rb - - spec/services/ci/job_artifacts/create_service_spec.rb - - spec/services/ci/parse_dotenv_artifact_service_spec.rb - - spec/services/ci/pipeline_bridge_status_service_spec.rb - - spec/services/ci/pipeline_trigger_service_spec.rb - - spec/services/ci/prometheus_metrics/observe_histograms_service_spec.rb - - spec/services/ci/register_job_service_spec.rb - - spec/services/ci/resource_groups/assign_resource_from_resource_group_service_spec.rb - - spec/services/ci/retry_build_service_spec.rb - - spec/services/ci/stop_environments_service_spec.rb - spec/services/clusters/applications/prometheus_health_check_service_spec.rb - spec/services/container_expiration_policy_service_spec.rb - spec/services/dependency_proxy/find_or_create_manifest_service_spec.rb diff --git a/app/assets/javascripts/cycle_analytics/constants.js b/app/assets/javascripts/cycle_analytics/constants.js new file mode 100644 index 00000000000..d79de207afe --- /dev/null +++ b/app/assets/javascripts/cycle_analytics/constants.js @@ -0,0 +1 @@ +export const DEFAULT_DAYS_TO_DISPLAY = 30; diff --git a/app/assets/javascripts/cycle_analytics/store/actions.js b/app/assets/javascripts/cycle_analytics/store/actions.js new file mode 100644 index 00000000000..fe3c6d6b3ba --- /dev/null +++ b/app/assets/javascripts/cycle_analytics/store/actions.js @@ -0,0 +1,51 @@ +import createFlash from '~/flash'; +import axios from '~/lib/utils/axios_utils'; +import { __ } from '~/locale'; +import { DEFAULT_DAYS_TO_DISPLAY } from '../constants'; +import * as types from './mutation_types'; + +export const fetchCycleAnalyticsData = ({ + state: { requestPath, startDate }, + dispatch, + commit, +}) => { + commit(types.REQUEST_CYCLE_ANALYTICS_DATA); + + return axios + .get(requestPath, { + params: { 'cycle_analytics[start_date]': startDate }, + }) + .then(({ data }) => commit(types.RECEIVE_CYCLE_ANALYTICS_DATA_SUCCESS, data)) + .then(() => dispatch('setSelectedStage')) + .then(() => dispatch('fetchStageData')) + .catch(() => { + commit(types.RECEIVE_CYCLE_ANALYTICS_DATA_ERROR); + createFlash({ + message: __('There was an error while fetching value stream analytics data.'), + }); + }); +}; + +export const fetchStageData = ({ state: { requestPath, selectedStage, startDate }, commit }) => { + commit(types.REQUEST_STAGE_DATA); + + return axios + .get(`${requestPath}/events/${selectedStage.name}.json`, { + params: { 'cycle_analytics[start_date]': startDate }, + }) + .then(({ data }) => commit(types.RECEIVE_STAGE_DATA_SUCCESS, data)) + .catch(() => commit(types.RECEIVE_STAGE_DATA_ERROR)); +}; + +export const setSelectedStage = ({ commit, state: { stages } }, selectedStage = null) => { + const stage = selectedStage || stages[0]; + commit(types.SET_SELECTED_STAGE, stage); +}; + +export const setDateRange = ({ commit }, { startDate = DEFAULT_DAYS_TO_DISPLAY }) => + commit(types.SET_DATE_RANGE, { startDate }); + +export const initializeVsa = ({ commit, dispatch }, initialData = {}) => { + commit(types.INITIALIZE_VSA, initialData); + return dispatch('fetchCycleAnalyticsData'); +}; diff --git a/app/assets/javascripts/cycle_analytics/store/index.js b/app/assets/javascripts/cycle_analytics/store/index.js new file mode 100644 index 00000000000..ab47538dcf5 --- /dev/null +++ b/app/assets/javascripts/cycle_analytics/store/index.js @@ -0,0 +1,21 @@ +/** + * While we are in the process implementing group level features at the project level + * we will use a simplified vuex store for the project level, eventually this can be + * replaced with the store at ee/app/assets/javascripts/analytics/cycle_analytics/store/index.js + * once we have enough of the same features implemented across the project and group level + */ + +import Vue from 'vue'; +import Vuex from 'vuex'; +import * as actions from './actions'; +import mutations from './mutations'; +import state from './state'; + +Vue.use(Vuex); + +export default () => + new Vuex.Store({ + actions, + mutations, + state, + }); diff --git a/app/assets/javascripts/cycle_analytics/store/mutation_types.js b/app/assets/javascripts/cycle_analytics/store/mutation_types.js new file mode 100644 index 00000000000..00aae49ae9f --- /dev/null +++ b/app/assets/javascripts/cycle_analytics/store/mutation_types.js @@ -0,0 +1,12 @@ +export const INITIALIZE_VSA = 'INITIALIZE_VSA'; + +export const SET_SELECTED_STAGE = 'SET_SELECTED_STAGE'; +export const SET_DATE_RANGE = 'SET_DATE_RANGE'; + +export const REQUEST_CYCLE_ANALYTICS_DATA = 'REQUEST_CYCLE_ANALYTICS_DATA'; +export const RECEIVE_CYCLE_ANALYTICS_DATA_SUCCESS = 'RECEIVE_CYCLE_ANALYTICS_DATA_SUCCESS'; +export const RECEIVE_CYCLE_ANALYTICS_DATA_ERROR = 'RECEIVE_CYCLE_ANALYTICS_DATA_ERROR'; + +export const REQUEST_STAGE_DATA = 'REQUEST_STAGE_DATA'; +export const RECEIVE_STAGE_DATA_SUCCESS = 'RECEIVE_STAGE_DATA_SUCCESS'; +export const RECEIVE_STAGE_DATA_ERROR = 'RECEIVE_STAGE_DATA_ERROR'; diff --git a/app/assets/javascripts/cycle_analytics/store/mutations.js b/app/assets/javascripts/cycle_analytics/store/mutations.js new file mode 100644 index 00000000000..8fd5c78339a --- /dev/null +++ b/app/assets/javascripts/cycle_analytics/store/mutations.js @@ -0,0 +1,52 @@ +import { decorateData, decorateEvents } from '../utils'; +import * as types from './mutation_types'; + +export default { + [types.INITIALIZE_VSA](state, { requestPath }) { + state.requestPath = requestPath; + }, + [types.SET_SELECTED_STAGE](state, stage) { + state.isLoadingStage = true; + state.selectedStage = stage; + state.isLoadingStage = false; + }, + [types.SET_DATE_RANGE](state, { startDate }) { + state.startDate = startDate; + }, + [types.REQUEST_CYCLE_ANALYTICS_DATA](state) { + state.isLoading = true; + state.stages = []; + state.hasError = false; + }, + [types.RECEIVE_CYCLE_ANALYTICS_DATA_SUCCESS](state, data) { + state.isLoading = false; + const { stages, summary } = decorateData(data); + state.stages = stages; + state.summary = summary; + state.hasError = false; + }, + [types.RECEIVE_CYCLE_ANALYTICS_DATA_ERROR](state) { + state.isLoading = false; + state.stages = []; + state.hasError = true; + }, + [types.REQUEST_STAGE_DATA](state) { + state.isLoadingStage = true; + state.isEmptyStage = false; + state.selectedStageEvents = []; + state.hasError = false; + }, + [types.RECEIVE_STAGE_DATA_SUCCESS](state, { events = [] }) { + const { selectedStage } = state; + state.isLoadingStage = false; + state.isEmptyStage = !events.length; + state.selectedStageEvents = decorateEvents(events, selectedStage); + state.hasError = false; + }, + [types.RECEIVE_STAGE_DATA_ERROR](state) { + state.isLoadingStage = false; + state.isEmptyStage = true; + state.selectedStageEvents = []; + state.hasError = true; + }, +}; diff --git a/app/assets/javascripts/cycle_analytics/store/state.js b/app/assets/javascripts/cycle_analytics/store/state.js new file mode 100644 index 00000000000..5db4e1878a9 --- /dev/null +++ b/app/assets/javascripts/cycle_analytics/store/state.js @@ -0,0 +1,17 @@ +import { DEFAULT_DAYS_TO_DISPLAY } from '../constants'; + +export default () => ({ + requestPath: '', + startDate: DEFAULT_DAYS_TO_DISPLAY, + stages: [], + summary: [], + analytics: [], + stats: [], + selectedStage: {}, + selectedStageEvents: [], + medians: {}, + hasError: false, + isLoading: false, + isLoadingStage: false, + isEmptyStage: false, +}); diff --git a/app/assets/javascripts/cycle_analytics/utils.js b/app/assets/javascripts/cycle_analytics/utils.js new file mode 100644 index 00000000000..3afe4b021be --- /dev/null +++ b/app/assets/javascripts/cycle_analytics/utils.js @@ -0,0 +1,63 @@ +import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils'; +import { dasherize } from '~/lib/utils/text_utility'; +import { __ } from '../locale'; +import DEFAULT_EVENT_OBJECTS from './default_event_objects'; + +const EMPTY_STAGE_TEXTS = { + issue: __( + 'The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage.', + ), + plan: __( + 'The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit.', + ), + code: __( + 'The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request.', + ), + test: __( + 'The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running.', + ), + review: __( + 'The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request.', + ), + staging: __( + 'The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time.', + ), +}; + +/** + * These `decorate` methods will be removed when me migrate to the + * new table layout https://gitlab.com/gitlab-org/gitlab/-/issues/326704 + */ +const mapToEvent = (event, stage) => { + return convertObjectPropsToCamelCase( + { + ...DEFAULT_EVENT_OBJECTS[stage.slug], + ...event, + }, + { deep: true }, + ); +}; + +export const decorateEvents = (events, stage) => events.map((event) => mapToEvent(event, stage)); + +const mapToStage = (permissions, item) => { + const slug = dasherize(item.name.toLowerCase()); + return { + ...item, + slug, + active: false, + isUserAllowed: permissions[slug], + emptyStageText: EMPTY_STAGE_TEXTS[slug], + component: `stage-${slug}-component`, + }; +}; + +const mapToSummary = ({ value, ...rest }) => ({ ...rest, value: value || '-' }); + +export const decorateData = (data = {}) => { + const { permissions, stats, summary } = data; + return { + stages: stats?.map((item) => mapToStage(permissions, item)) || [], + summary: summary?.map((item) => mapToSummary(item)) || [], + }; +}; diff --git a/app/assets/javascripts/registry/settings/components/expiration_dropdown.vue b/app/assets/javascripts/packages_and_registries/settings/project/components/expiration_dropdown.vue similarity index 100% rename from app/assets/javascripts/registry/settings/components/expiration_dropdown.vue rename to app/assets/javascripts/packages_and_registries/settings/project/components/expiration_dropdown.vue diff --git a/app/assets/javascripts/registry/settings/components/expiration_input.vue b/app/assets/javascripts/packages_and_registries/settings/project/components/expiration_input.vue similarity index 95% rename from app/assets/javascripts/registry/settings/components/expiration_input.vue rename to app/assets/javascripts/packages_and_registries/settings/project/components/expiration_input.vue index 42b7c7918a5..d6d85189792 100644 --- a/app/assets/javascripts/registry/settings/components/expiration_input.vue +++ b/app/assets/javascripts/packages_and_registries/settings/project/components/expiration_input.vue @@ -1,6 +1,9 @@