Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-12-23 18:09:54 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2020-12-23 18:09:54 +0300
commit9dbca64417abbec779a219b9e0df9d289d945032 (patch)
tree3721592153aa2c991a4a5fe686eb4471dabd98b4
parent5c9f6c66fabf22927e862b2b60362e4ea25b250b (diff)
Add latest changes from gitlab-org/gitlab@master
-rw-r--r--.prettierignore2470
-rw-r--r--.prettierrc2
-rw-r--r--app/assets/javascripts/boards/boards_util.js11
-rw-r--r--app/assets/javascripts/boards/components/board_configuration_options.vue35
-rw-r--r--app/assets/javascripts/boards/components/board_form.vue124
-rw-r--r--app/assets/javascripts/boards/graphql/board.mutation.graphql11
-rw-r--r--app/assets/javascripts/boards/graphql/board_create.mutation.graphql7
-rw-r--r--app/assets/javascripts/boards/graphql/board_update.mutation.graphql9
-rw-r--r--app/assets/javascripts/boards/index.js3
-rw-r--r--app/assets/javascripts/boards/mount_multiple_boards_switcher.js4
-rw-r--r--app/assets/javascripts/tooltips/components/tooltips.vue8
-rw-r--r--app/assets/javascripts/tooltips/index.js2
-rw-r--r--app/views/shared/wikis/_sidebar.html.haml18
-rw-r--r--app/views/shared/wikis/edit.html.haml2
-rw-r--r--changelogs/unreleased/218997-fj-add-snippet-repository-moves-api-endpoints.yml5
-rw-r--r--changelogs/unreleased/23109-add-wiki-edit-button.yml5
-rw-r--r--changelogs/unreleased/292902-move-to-createboard-mutation-instead-of-rest-api-call-updateboard.yml6
-rw-r--r--config/feature_flags/development/gl_tooltips.yml8
-rw-r--r--doc/user/project/wiki/index.md8
-rw-r--r--lib/api/api.rb1
-rw-r--r--lib/api/snippet_repository_storage_moves.rb110
-rw-r--r--lib/gitlab/gon_helper.rb1
-rw-r--r--locale/gitlab.pot119
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/snippet_repository_storage_move.json20
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/snippet_repository_storage_moves.json6
-rw-r--r--spec/frontend/boards/components/board_configuration_options_spec.js49
-rw-r--r--spec/frontend/boards/components/board_form_spec.js101
-rw-r--r--spec/frontend/ide/components/pipelines/list_spec.js10
-rw-r--r--spec/frontend/tooltips/components/tooltips_spec.js10
-rw-r--r--spec/frontend/tooltips/index_spec.js4
-rw-r--r--spec/requests/api/graphql/user/starred_projects_query_spec.rb24
-rw-r--r--spec/requests/api/project_repository_storage_moves_spec.rb220
-rw-r--r--spec/requests/api/snippet_repository_storage_moves_spec.rb12
-rw-r--r--spec/support/shared_examples/features/wiki/user_views_wiki_sidebar_shared_examples.rb52
-rw-r--r--spec/support/shared_examples/requests/api/repository_storage_moves_shared_examples.rb219
-rw-r--r--spec/views/shared/wikis/_sidebar.html.haml_spec.rb24
36 files changed, 3236 insertions, 484 deletions
diff --git a/.prettierignore b/.prettierignore
index ff8188bbda4..3b4f2ce3833 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -9,3 +9,2473 @@ doc/api/graphql/reference/gitlab_schema.graphql
*.css
*.scss
*.md
+
+## lovely-lovelace
+app/assets/javascripts/alerts_settings/components/alerts_settings_wrapper.vue
+app/assets/javascripts/behaviors/markdown/paste_markdown_table.js
+app/assets/javascripts/boards/components/sidebar/remove_issue.vue
+app/assets/javascripts/diffs/components/diff_row.vue
+app/assets/javascripts/diffs/store/getters.js
+app/assets/javascripts/dropzone_input.js
+app/assets/javascripts/feature_flags/components/strategy.vue
+app/assets/javascripts/ide/lib/create_diff.js
+app/assets/javascripts/ide/stores/modules/pipelines/getters.js
+app/assets/javascripts/members/components/table/members_table.vue
+app/assets/javascripts/members/store/utils.js
+app/assets/javascripts/monitoring/stores/actions.js
+app/assets/javascripts/monitoring/stores/getters.js
+app/assets/javascripts/packages/list/utils.js
+app/assets/javascripts/pages/projects/forks/new/components/fork_groups_list.vue
+app/assets/javascripts/pages/users/user_tabs.js
+app/assets/javascripts/projects/settings/access_dropdown.js
+
+## stoic-swirles
+app/assets/javascripts/repository/log_tree.js
+app/assets/javascripts/repository/utils/dom.js
+app/assets/javascripts/sidebar/components/labels/sidebar_labels.vue
+app/assets/javascripts/user_lists/store/utils.js
+app/assets/javascripts/vue_shared/components/alert_details_table.vue
+app/assets/javascripts/vue_shared/components/upload_dropzone/upload_dropzone.vue
+app/assets/javascripts/vue_shared/constants.js
+ee/app/assets/javascripts/analytics/cycle_analytics/utils.js
+ee/app/assets/javascripts/analytics/repository_analytics/components/select_projects_dropdown.vue
+ee/app/assets/javascripts/boards/stores/getters.js
+ee/app/assets/javascripts/dependencies/store/modules/list/getters.js
+ee/app/assets/javascripts/epic/store/getters.js
+ee/app/assets/javascripts/insights/components/insights_page.vue
+ee/app/assets/javascripts/pages/trial_registrations/new/username_suggester.js
+ee/app/assets/javascripts/related_items_tree/store/mutations.js
+ee/app/assets/javascripts/security_dashboard/components/project_vulnerabilities.vue
+ee/spec/frontend/analytics/shared/components/groups_dropdown_filter_spec.js
+ee/spec/frontend/analytics/shared/components/projects_dropdown_filter_spec.js
+ee/spec/frontend/approvals/components/approvers_list_spec.js
+ee/spec/frontend/approvals/components/rule_controls_spec.js
+ee/spec/frontend/audit_events/components/audit_events_filter_spec.js
+ee/spec/frontend/dependencies/components/dependencies_table_spec.js
+ee/spec/frontend/geo_node_form/components/geo_node_form_capacities_spec.js
+ee/spec/frontend/security_configuration/dast_profiles/graphql/cache_utils_spec.js
+ee/spec/frontend/security_configuration/dast_site_profiles_form/components/dast_site_profile_form_spec.js
+ee/spec/frontend/security_configuration/dast_site_validation/components/dast_site_validation_modal_spec.js
+ee/spec/frontend/security_dashboard/components/vulnerability_list_spec.js
+ee/spec/frontend/sidebar/components/status/status_spec.js
+ee/spec/frontend/storage_counter/components/projects_table_spec.js
+ee/spec/frontend/vulnerabilities/footer_spec.js
+spec/frontend/blob/balsamiq/balsamiq_viewer_spec.js
+
+## objective-swirles
+spec/frontend/boards/components/sidebar/board_sidebar_labels_select_spec.js
+spec/frontend/clusters/stores/clusters_store_spec.js
+spec/frontend/diffs/components/diff_file_header_spec.js
+spec/frontend/diffs/components/hidden_files_warning_spec.js
+spec/frontend/environments/environment_monitoring_spec.js
+spec/frontend/import_entities/import_groups/graphql/services/status_poller_spec.js
+spec/frontend/issuable/related_issues/components/add_issuable_form_spec.js
+spec/frontend/notes/components/discussion_filter_spec.js
+spec/frontend/pipeline_editor/components/lint/ci_lint_results_spec.js
+spec/frontend/projects/settings_service_desk/components/service_desk_setting_spec.js
+spec/frontend/snippets/components/edit_spec.js
+spec/frontend/user_lists/store/show/mutations_spec.js
+spec/frontend/vue_shared/components/stacked_progress_bar_spec.js
+spec/frontend_integration/ide/helpers/ide_helper.js
+
+## boring-bohr
+jest.config.base.js
+jest.config.js
+scripts/frontend/block_dependencies.js
+scripts/frontend/check_page_bundle_mixins_css_for_sideeffects.js
+scripts/frontend/extract_gettext_all.js
+scripts/frontend/file_test_coverage.js
+scripts/frontend/frontend_script_utils.js
+scripts/frontend/merge_coverage_frontend.js
+scripts/frontend/prettier.js
+scripts/frontend/stylelint/stylelint-utility-map.js
+scripts/frontend/stylelint/stylelint-utils.js
+app/assets/javascripts/access_tokens/index.js
+app/assets/javascripts/activities.js
+app/assets/javascripts/add_context_commits_modal/components/add_context_commits_modal_wrapper.vue
+app/assets/javascripts/add_context_commits_modal/store/actions.js
+
+## interesting-kepler
+app/assets/javascripts/add_context_commits_modal/utils.js
+app/assets/javascripts/admin/application_settings/setup_metrics_and_profiling.js
+app/assets/javascripts/admin/statistics_panel/store/actions.js
+app/assets/javascripts/admin/statistics_panel/store/getters.js
+app/assets/javascripts/admin/users/components/users_table.vue
+app/assets/javascripts/admin/users/index.js
+app/assets/javascripts/alert_handler.js
+app/assets/javascripts/alert_management/components/alert_details.vue
+app/assets/javascripts/alert_management/components/alert_management_table.vue
+app/assets/javascripts/alert_management/components/alert_metrics.vue
+app/assets/javascripts/alert_management/components/alert_status.vue
+app/assets/javascripts/alert_management/components/sidebar/sidebar_assignees.vue
+app/assets/javascripts/alert_management/components/sidebar/sidebar_todo.vue
+app/assets/javascripts/alert_management/details.js
+app/assets/javascripts/alert_management/list.js
+app/assets/javascripts/alerts_service_settings/components/alerts_service_form.vue
+app/assets/javascripts/alerts_service_settings/index.js
+app/assets/javascripts/alerts_settings/components/alert_mapping_builder.vue
+app/assets/javascripts/alerts_settings/components/alerts_integrations_list.vue
+app/assets/javascripts/alerts_settings/components/alerts_settings_form.vue
+app/assets/javascripts/alerts_settings/graphql.js
+app/assets/javascripts/alerts_settings/index.js
+app/assets/javascripts/alerts_settings/utils/cache_updates.js
+app/assets/javascripts/analytics/instance_statistics/components/instance_statistics_count_chart.vue
+app/assets/javascripts/analytics/instance_statistics/components/projects_and_groups_chart.vue
+app/assets/javascripts/analytics/instance_statistics/components/users_chart.vue
+app/assets/javascripts/analytics/instance_statistics/utils.js
+app/assets/javascripts/analytics/product_analytics/activity_charts_bundle.js
+app/assets/javascripts/api.js
+app/assets/javascripts/authentication/u2f/authenticate.js
+app/assets/javascripts/authentication/u2f/register.js
+
+## reverent-lovelace
+app/assets/javascripts/authentication/webauthn/authenticate.js
+app/assets/javascripts/authentication/webauthn/register.js
+app/assets/javascripts/awards_handler.js
+app/assets/javascripts/badges/components/badge_form.vue
+app/assets/javascripts/badges/components/badge_settings.vue
+app/assets/javascripts/badges/store/actions.js
+app/assets/javascripts/badges/store/mutations.js
+app/assets/javascripts/batch_comments/components/preview_item.vue
+app/assets/javascripts/batch_comments/stores/modules/batch_comments/actions.js
+app/assets/javascripts/batch_comments/stores/modules/batch_comments/getters.js
+app/assets/javascripts/batch_comments/stores/modules/batch_comments/mutations.js
+app/assets/javascripts/batch_comments/utils.js
+app/assets/javascripts/behaviors/autosize.js
+app/assets/javascripts/behaviors/bind_in_out.js
+app/assets/javascripts/behaviors/copy_to_clipboard.js
+app/assets/javascripts/behaviors/gl_emoji.js
+app/assets/javascripts/behaviors/load_startup_css.js
+app/assets/javascripts/behaviors/markdown/copy_as_gfm.js
+app/assets/javascripts/behaviors/markdown/highlight_current_user.js
+app/assets/javascripts/behaviors/markdown/marks/inline_diff.js
+app/assets/javascripts/behaviors/markdown/marks/inline_html.js
+app/assets/javascripts/behaviors/markdown/nodes/code_block.js
+app/assets/javascripts/behaviors/markdown/nodes/emoji.js
+app/assets/javascripts/behaviors/markdown/nodes/image.js
+app/assets/javascripts/behaviors/markdown/nodes/playable.js
+app/assets/javascripts/behaviors/markdown/nodes/reference.js
+app/assets/javascripts/behaviors/markdown/nodes/table_cell.js
+app/assets/javascripts/behaviors/markdown/nodes/task_list_item.js
+app/assets/javascripts/behaviors/markdown/render_math.js
+app/assets/javascripts/behaviors/markdown/render_mermaid.js
+app/assets/javascripts/behaviors/markdown/render_metrics.js
+app/assets/javascripts/behaviors/markdown/schema.js
+app/assets/javascripts/behaviors/markdown/serializer.js
+
+## nice-swanson
+app/assets/javascripts/behaviors/preview_markdown.js
+app/assets/javascripts/behaviors/quick_submit.js
+app/assets/javascripts/behaviors/requires_input.js
+app/assets/javascripts/behaviors/secret_values.js
+app/assets/javascripts/behaviors/shortcuts/keybindings.js
+app/assets/javascripts/behaviors/shortcuts/shortcuts.js
+app/assets/javascripts/behaviors/shortcuts/shortcuts_blob.js
+app/assets/javascripts/behaviors/shortcuts/shortcuts_issuable.js
+app/assets/javascripts/blob/3d_viewer/index.js
+app/assets/javascripts/blob/balsamiq/balsamiq_viewer.js
+app/assets/javascripts/blob/blob_file_dropzone.js
+app/assets/javascripts/blob/blob_line_permalink_updater.js
+app/assets/javascripts/blob/components/blob_content_error.vue
+app/assets/javascripts/blob/file_template_mediator.js
+app/assets/javascripts/blob/notebook/notebook_viewer.vue
+app/assets/javascripts/blob/openapi/index.js
+app/assets/javascripts/blob/sketch/index.js
+app/assets/javascripts/blob/stl_viewer.js
+app/assets/javascripts/blob/suggest_gitlab_ci_yml/index.js
+app/assets/javascripts/blob/template_selector.js
+app/assets/javascripts/blob/template_selectors/ci_syntax_yaml_selector.js
+app/assets/javascripts/blob/template_selectors/ci_yaml_selector.js
+app/assets/javascripts/blob/template_selectors/dockerfile_selector.js
+app/assets/javascripts/blob/template_selectors/gitignore_selector.js
+app/assets/javascripts/blob/template_selectors/license_selector.js
+app/assets/javascripts/blob/template_selectors/metrics_dashboard_selector.js
+app/assets/javascripts/blob/template_selectors/type_selector.js
+app/assets/javascripts/blob/viewer/index.js
+app/assets/javascripts/blob_edit/blob_bundle.js
+app/assets/javascripts/blob_edit/edit_blob.js
+app/assets/javascripts/boards/boards_util.js
+
+## keen-chatelet
+app/assets/javascripts/boards/components/board_assignee_dropdown.vue
+app/assets/javascripts/boards/components/board_card_layout.vue
+app/assets/javascripts/boards/components/board_form.vue
+app/assets/javascripts/boards/components/board_list.vue
+app/assets/javascripts/boards/components/board_list_new.vue
+app/assets/javascripts/boards/components/board_new_issue_new.vue
+app/assets/javascripts/boards/components/board_sidebar.js
+app/assets/javascripts/boards/components/boards_selector.vue
+app/assets/javascripts/boards/components/modal/footer.vue
+app/assets/javascripts/boards/components/modal/index.vue
+app/assets/javascripts/boards/components/project_select.vue
+app/assets/javascripts/boards/components/sidebar/board_sidebar_labels_select.vue
+app/assets/javascripts/boards/components/sidebar/board_sidebar_milestone_select.vue
+app/assets/javascripts/boards/filtered_search_boards.js
+app/assets/javascripts/boards/filters/due_date_filters.js
+app/assets/javascripts/boards/index.js
+app/assets/javascripts/boards/mixins/sortable_default_options.js
+app/assets/javascripts/boards/models/issue.js
+app/assets/javascripts/boards/models/list.js
+app/assets/javascripts/boards/stores/actions.js
+app/assets/javascripts/boards/stores/boards_store.js
+app/assets/javascripts/boards/stores/getters.js
+app/assets/javascripts/boards/stores/modal_store.js
+app/assets/javascripts/boards/stores/mutations.js
+app/assets/javascripts/branches/divergence_graph.js
+app/assets/javascripts/breadcrumb.js
+app/assets/javascripts/broadcast_notification.js
+app/assets/javascripts/build_artifacts.js
+app/assets/javascripts/ci_settings_pipeline_triggers/index.js
+app/assets/javascripts/ci_variable_list/ci_variable_list.js
+app/assets/javascripts/ci_variable_list/components/ci_environments_dropdown.vue
+app/assets/javascripts/ci_variable_list/components/ci_variable_table.vue
+
+## relaxed-kilby
+app/assets/javascripts/ci_variable_list/store/actions.js
+app/assets/javascripts/ci_variable_list/store/getters.js
+app/assets/javascripts/ci_variable_list/store/utils.js
+app/assets/javascripts/clone_panel.js
+app/assets/javascripts/clusters/clusters_bundle.js
+app/assets/javascripts/clusters/components/fluentd_output_settings.vue
+app/assets/javascripts/clusters/forms/stores/index.js
+app/assets/javascripts/clusters/stores/clusters_store.js
+app/assets/javascripts/clusters/stores/new_cluster/index.js
+app/assets/javascripts/clusters_list/components/clusters.vue
+app/assets/javascripts/clusters_list/load_clusters.js
+app/assets/javascripts/clusters_list/store/actions.js
+app/assets/javascripts/clusters_list/store/index.js
+app/assets/javascripts/code_navigation/index.js
+app/assets/javascripts/code_navigation/store/actions.js
+app/assets/javascripts/code_navigation/utils/index.js
+app/assets/javascripts/commit/image_file.js
+app/assets/javascripts/commit/pipelines/pipelines_bundle.js
+app/assets/javascripts/commit_merge_requests.js
+app/assets/javascripts/commons/nav/user_merge_requests.js
+app/assets/javascripts/compare_autocomplete.js
+app/assets/javascripts/confidential_merge_request/components/project_form_group.vue
+app/assets/javascripts/confirm_danger_modal.js
+app/assets/javascripts/confirm_modal.js
+app/assets/javascripts/contributors/components/contributors.vue
+app/assets/javascripts/contributors/stores/actions.js
+app/assets/javascripts/contributors/stores/getters.js
+app/assets/javascripts/contributors/utils.js
+app/assets/javascripts/create_cluster/components/cluster_form_dropdown.vue
+app/assets/javascripts/create_cluster/eks_cluster/index.js
+app/assets/javascripts/create_cluster/eks_cluster/services/aws_services_facade.js
+
+## lucid-lederberg
+app/assets/javascripts/create_cluster/eks_cluster/store/actions.js
+app/assets/javascripts/create_cluster/eks_cluster/store/state.js
+app/assets/javascripts/create_cluster/gke_cluster/components/gke_dropdown_mixin.js
+app/assets/javascripts/create_cluster/gke_cluster/components/gke_project_id_dropdown.vue
+app/assets/javascripts/create_cluster/gke_cluster/index.js
+app/assets/javascripts/create_cluster/gke_cluster/store/actions.js
+app/assets/javascripts/create_cluster/gke_cluster/store/getters.js
+app/assets/javascripts/create_cluster/gke_cluster_namespace/index.js
+app/assets/javascripts/create_cluster/init_create_cluster.js
+app/assets/javascripts/create_cluster/store/cluster_dropdown/actions.js
+app/assets/javascripts/create_item_dropdown.js
+app/assets/javascripts/create_label.js
+app/assets/javascripts/create_merge_request_dropdown.js
+app/assets/javascripts/custom_metrics/components/custom_metrics_form_fields.vue
+app/assets/javascripts/custom_metrics/constants.js
+app/assets/javascripts/cycle_analytics/cycle_analytics_bundle.js
+app/assets/javascripts/cycle_analytics/cycle_analytics_service.js
+app/assets/javascripts/cycle_analytics/cycle_analytics_store.js
+app/assets/javascripts/deploy_freeze/store/actions.js
+app/assets/javascripts/deploy_freeze/store/index.js
+app/assets/javascripts/deploy_freeze/store/mutations.js
+app/assets/javascripts/deploy_keys/components/app.vue
+app/assets/javascripts/deploy_keys/components/key.vue
+app/assets/javascripts/deploy_keys/service/index.js
+app/assets/javascripts/deploy_keys/store/index.js
+app/assets/javascripts/deprecated_jquery_dropdown/gl_dropdown.js
+app/assets/javascripts/deprecated_jquery_dropdown/gl_dropdown_filter.js
+app/assets/javascripts/deprecated_jquery_dropdown/gl_dropdown_input.js
+app/assets/javascripts/deprecated_jquery_dropdown/gl_dropdown_remote.js
+app/assets/javascripts/design_management/components/design_notes/design_discussion.vue
+app/assets/javascripts/design_management/components/design_presentation.vue
+app/assets/javascripts/design_management/components/design_sidebar.vue
+app/assets/javascripts/design_management/components/design_todo_button.vue
+
+## loving-feistel
+app/assets/javascripts/design_management/components/toolbar/design_navigation.vue
+app/assets/javascripts/design_management/components/toolbar/index.vue
+app/assets/javascripts/design_management/components/upload/design_version_dropdown.vue
+app/assets/javascripts/design_management/graphql.js
+app/assets/javascripts/design_management/mixins/all_designs.js
+app/assets/javascripts/design_management/mixins/all_versions.js
+app/assets/javascripts/design_management/pages/design/index.vue
+app/assets/javascripts/design_management/pages/index.vue
+app/assets/javascripts/design_management/utils/cache_update.js
+app/assets/javascripts/design_management/utils/design_management_utils.js
+app/assets/javascripts/design_management/utils/error_messages.js
+app/assets/javascripts/diff.js
+app/assets/javascripts/diffs/components/app.vue
+app/assets/javascripts/diffs/components/compare_dropdown_layout.vue
+app/assets/javascripts/diffs/components/diff_content.vue
+app/assets/javascripts/diffs/components/diff_expansion_cell.vue
+app/assets/javascripts/diffs/components/diff_file.vue
+app/assets/javascripts/diffs/components/diff_gutter_avatars.vue
+app/assets/javascripts/diffs/components/diff_line_note_form.vue
+app/assets/javascripts/diffs/components/diff_row_utils.js
+app/assets/javascripts/diffs/components/parallel_diff_table_row.vue
+app/assets/javascripts/diffs/components/tree_list.vue
+app/assets/javascripts/diffs/index.js
+app/assets/javascripts/diffs/store/actions.js
+app/assets/javascripts/diffs/store/getters_versions_dropdowns.js
+app/assets/javascripts/diffs/store/mutations.js
+app/assets/javascripts/diffs/store/utils.js
+app/assets/javascripts/diffs/utils/diff_file.js
+app/assets/javascripts/diffs/workers/tree_worker.js
+app/assets/javascripts/dirty_submit/dirty_submit_collection.js
+app/assets/javascripts/dirty_submit/dirty_submit_form.js
+
+## distracted-nash
+app/assets/javascripts/droplab/drop_down.js
+app/assets/javascripts/droplab/drop_lab.js
+app/assets/javascripts/droplab/hook_button.js
+app/assets/javascripts/droplab/hook_input.js
+app/assets/javascripts/droplab/plugins/ajax.js
+app/assets/javascripts/droplab/plugins/ajax_filter.js
+app/assets/javascripts/droplab/plugins/input_setter.js
+app/assets/javascripts/due_date_select.js
+app/assets/javascripts/editor/editor_lite.js
+app/assets/javascripts/editor/editor_markdown_ext.js
+app/assets/javascripts/editor/utils.js
+app/assets/javascripts/emoji/index.js
+app/assets/javascripts/emoji/no_emoji_validator.js
+app/assets/javascripts/emoji/support/is_emoji_unicode_supported.js
+app/assets/javascripts/emoji/support/unicode_support_map.js
+app/assets/javascripts/environments/components/environment_item.vue
+app/assets/javascripts/environments/components/environment_rollback.vue
+app/assets/javascripts/environments/components/environments_app.vue
+app/assets/javascripts/environments/components/environments_table.vue
+app/assets/javascripts/environments/mixins/environments_mixin.js
+app/assets/javascripts/environments/stores/environments_store.js
+app/assets/javascripts/error_tracking/components/error_details.vue
+app/assets/javascripts/error_tracking/store/actions.js
+app/assets/javascripts/error_tracking/store/details/actions.js
+app/assets/javascripts/error_tracking/store/details/getters.js
+app/assets/javascripts/error_tracking/store/list/mutations.js
+app/assets/javascripts/error_tracking/utils.js
+app/assets/javascripts/error_tracking_settings/store/actions.js
+app/assets/javascripts/error_tracking_settings/store/getters.js
+app/assets/javascripts/error_tracking_settings/store/mutations.js
+app/assets/javascripts/error_tracking_settings/utils.js
+
+## modest-mayer
+app/assets/javascripts/experimental_flags.js
+app/assets/javascripts/feature_flags/components/edit_feature_flag.vue
+app/assets/javascripts/feature_flags/components/feature_flags.vue
+app/assets/javascripts/feature_flags/components/feature_flags_table.vue
+app/assets/javascripts/feature_flags/components/form.vue
+app/assets/javascripts/feature_flags/components/new_feature_flag.vue
+app/assets/javascripts/feature_flags/store/edit/actions.js
+app/assets/javascripts/feature_flags/store/edit/index.js
+app/assets/javascripts/feature_flags/store/gitlab_user_list/actions.js
+app/assets/javascripts/feature_flags/store/gitlab_user_list/index.js
+app/assets/javascripts/feature_flags/store/helpers.js
+app/assets/javascripts/feature_flags/store/index/actions.js
+app/assets/javascripts/feature_flags/store/index/index.js
+app/assets/javascripts/feature_flags/store/index/mutations.js
+app/assets/javascripts/feature_flags/store/new/actions.js
+app/assets/javascripts/feature_flags/store/new/index.js
+app/assets/javascripts/feature_flags/utils.js
+app/assets/javascripts/feature_highlight/feature_highlight.js
+app/assets/javascripts/feature_highlight/feature_highlight_helper.js
+app/assets/javascripts/file_pickers.js
+app/assets/javascripts/files_comment_button.js
+app/assets/javascripts/filterable_list.js
+app/assets/javascripts/filtered_search/available_dropdown_mappings.js
+app/assets/javascripts/filtered_search/components/recent_searches_dropdown_content.vue
+app/assets/javascripts/filtered_search/dropdown_ajax_filter.js
+app/assets/javascripts/filtered_search/dropdown_emoji.js
+app/assets/javascripts/filtered_search/dropdown_hint.js
+app/assets/javascripts/filtered_search/dropdown_non_user.js
+app/assets/javascripts/filtered_search/dropdown_utils.js
+app/assets/javascripts/filtered_search/filtered_search_dropdown.js
+app/assets/javascripts/filtered_search/filtered_search_dropdown_manager.js
+app/assets/javascripts/filtered_search/filtered_search_manager.js
+app/assets/javascripts/filtered_search/filtered_search_token_keys.js
+app/assets/javascripts/filtered_search/filtered_search_visual_tokens.js
+app/assets/javascripts/filtered_search/issuable_filtered_search_token_keys.js
+
+## stoic-merkle
+app/assets/javascripts/filtered_search/stores/recent_searches_store.js
+app/assets/javascripts/filtered_search/visual_token_value.js
+app/assets/javascripts/flash.js
+app/assets/javascripts/fly_out_nav.js
+app/assets/javascripts/frequent_items/components/app.vue
+app/assets/javascripts/frequent_items/index.js
+app/assets/javascripts/frequent_items/store/actions.js
+app/assets/javascripts/frequent_items/store/getters.js
+app/assets/javascripts/frequent_items/store/mutations.js
+app/assets/javascripts/frequent_items/utils.js
+app/assets/javascripts/gfm_auto_complete.js
+app/assets/javascripts/gl_field_errors.js
+app/assets/javascripts/gl_form.js
+app/assets/javascripts/gpg_badges.js
+app/assets/javascripts/grafana_integration/store/actions.js
+app/assets/javascripts/grafana_integration/store/index.js
+app/assets/javascripts/graphql_shared/utils.js
+app/assets/javascripts/group.js
+app/assets/javascripts/group_settings/components/shared_runners_form.vue
+app/assets/javascripts/groups/components/app.vue
+app/assets/javascripts/groups/components/visibility_level_dropdown.vue
+app/assets/javascripts/groups/init_invite_members_banner.js
+app/assets/javascripts/groups/members/index.js
+app/assets/javascripts/groups/members/utils.js
+app/assets/javascripts/groups/store/groups_store.js
+app/assets/javascripts/groups/transfer_dropdown.js
+app/assets/javascripts/groups_select.js
+app/assets/javascripts/helpers/event_hub_factory.js
+app/assets/javascripts/helpers/monitor_helper.js
+app/assets/javascripts/helpers/startup_css_helper.js
+app/assets/javascripts/ide/commit_icon.js
+
+## great-curie
+app/assets/javascripts/ide/components/commit_sidebar/list_item.vue
+app/assets/javascripts/ide/components/file_templates/bar.vue
+app/assets/javascripts/ide/components/file_templates/dropdown.vue
+app/assets/javascripts/ide/components/ide.vue
+app/assets/javascripts/ide/components/ide_sidebar_nav.vue
+app/assets/javascripts/ide/components/new_dropdown/upload.vue
+app/assets/javascripts/ide/components/panes/collapsible_sidebar.vue
+app/assets/javascripts/ide/components/preview/clientside.vue
+app/assets/javascripts/ide/components/preview/navigator.vue
+app/assets/javascripts/ide/components/repo_commit_section.vue
+app/assets/javascripts/ide/components/repo_editor.vue
+app/assets/javascripts/ide/ide_router.js
+app/assets/javascripts/ide/lib/common/disposable.js
+app/assets/javascripts/ide/lib/common/model.js
+app/assets/javascripts/ide/lib/create_file_diff.js
+app/assets/javascripts/ide/lib/decorations/controller.js
+app/assets/javascripts/ide/lib/diff/controller.js
+app/assets/javascripts/ide/lib/diff/diff.js
+app/assets/javascripts/ide/lib/diff/diff_worker.js
+app/assets/javascripts/ide/lib/editor.js
+app/assets/javascripts/ide/lib/editor_options.js
+app/assets/javascripts/ide/lib/editorconfig/parser.js
+app/assets/javascripts/ide/lib/editorconfig/rules_mapper.js
+app/assets/javascripts/ide/lib/errors.js
+app/assets/javascripts/ide/lib/files.js
+app/assets/javascripts/ide/lib/mirror.js
+app/assets/javascripts/ide/services/index.js
+app/assets/javascripts/ide/services/terminals.js
+app/assets/javascripts/ide/stores/actions.js
+app/assets/javascripts/ide/stores/actions/file.js
+app/assets/javascripts/ide/stores/actions/merge_request.js
+app/assets/javascripts/ide/stores/actions/project.js
+app/assets/javascripts/ide/stores/actions/tree.js
+
+## gifted-euclid
+app/assets/javascripts/ide/stores/extend.js
+app/assets/javascripts/ide/stores/getters.js
+app/assets/javascripts/ide/stores/modules/branches/actions.js
+app/assets/javascripts/ide/stores/modules/branches/mutations.js
+app/assets/javascripts/ide/stores/modules/commit/actions.js
+app/assets/javascripts/ide/stores/modules/commit/getters.js
+app/assets/javascripts/ide/stores/modules/editor/setup.js
+app/assets/javascripts/ide/stores/modules/file_templates/actions.js
+app/assets/javascripts/ide/stores/modules/file_templates/getters.js
+app/assets/javascripts/ide/stores/modules/merge_requests/actions.js
+app/assets/javascripts/ide/stores/modules/merge_requests/mutations.js
+app/assets/javascripts/ide/stores/modules/pane/getters.js
+app/assets/javascripts/ide/stores/modules/pipelines/actions.js
+app/assets/javascripts/ide/stores/modules/pipelines/mutations.js
+app/assets/javascripts/ide/stores/modules/pipelines/utils.js
+app/assets/javascripts/ide/stores/modules/terminal/actions/checks.js
+app/assets/javascripts/ide/stores/modules/terminal/actions/session_controls.js
+app/assets/javascripts/ide/stores/modules/terminal/actions/session_status.js
+app/assets/javascripts/ide/stores/modules/terminal/getters.js
+app/assets/javascripts/ide/stores/modules/terminal/messages.js
+app/assets/javascripts/ide/stores/modules/terminal/utils.js
+app/assets/javascripts/ide/stores/modules/terminal_sync/actions.js
+app/assets/javascripts/ide/stores/mutations.js
+app/assets/javascripts/ide/stores/mutations/file.js
+app/assets/javascripts/ide/stores/mutations/tree.js
+app/assets/javascripts/ide/stores/plugins/terminal.js
+app/assets/javascripts/ide/stores/plugins/terminal_sync.js
+app/assets/javascripts/ide/stores/utils.js
+app/assets/javascripts/ide/sync_router_and_store.js
+app/assets/javascripts/ide/utils.js
+app/assets/javascripts/image_diff/helpers/badge_helper.js
+
+## nervous-mclaren
+app/assets/javascripts/image_diff/init_discussion_tab.js
+app/assets/javascripts/image_diff/replaced_image_diff.js
+app/assets/javascripts/image_diff/view_types.js
+app/assets/javascripts/import_entities/import_groups/components/import_table.vue
+app/assets/javascripts/import_entities/import_groups/components/import_table_row.vue
+app/assets/javascripts/import_entities/import_groups/graphql/client_factory.js
+app/assets/javascripts/import_entities/import_groups/graphql/services/source_groups_manager.js
+app/assets/javascripts/import_entities/import_groups/graphql/services/status_poller.js
+app/assets/javascripts/import_entities/import_projects/store/actions.js
+app/assets/javascripts/import_entities/import_projects/store/getters.js
+app/assets/javascripts/import_entities/import_projects/store/mutations.js
+app/assets/javascripts/init_changes_dropdown.js
+app/assets/javascripts/integrations/edit/components/dynamic_field.vue
+app/assets/javascripts/integrations/edit/components/override_dropdown.vue
+app/assets/javascripts/integrations/edit/store/getters.js
+app/assets/javascripts/integrations/integration_settings_form.js
+app/assets/javascripts/invite_member/init_invite_member_modal.js
+app/assets/javascripts/invite_member/init_invite_member_trigger.js
+app/assets/javascripts/invite_members/components/invite_members_modal.vue
+app/assets/javascripts/invite_members/components/members_token_select.vue
+app/assets/javascripts/invite_members/init_invite_members_modal.js
+app/assets/javascripts/invite_members/init_invite_members_trigger.js
+app/assets/javascripts/issuable_bulk_update_actions.js
+app/assets/javascripts/issuable_bulk_update_sidebar.js
+app/assets/javascripts/issuable_context.js
+app/assets/javascripts/issuable_form.js
+app/assets/javascripts/issuable_index.js
+app/assets/javascripts/issuable_list/components/issuable_list_root.vue
+app/assets/javascripts/issuable_suggestions/components/app.vue
+app/assets/javascripts/issue.js
+app/assets/javascripts/issue_show/components/app.vue
+
+## beautiful-franklin
+app/assets/javascripts/issue_show/components/fields/description_template.vue
+app/assets/javascripts/issue_show/issue.js
+app/assets/javascripts/issue_show/utils/parse_data.js
+app/assets/javascripts/issues_list/components/issuable.vue
+app/assets/javascripts/issues_list/components/issuables_list_app.vue
+app/assets/javascripts/issues_list/index.js
+app/assets/javascripts/jira_connect/index.js
+app/assets/javascripts/jira_import/components/jira_import_form.vue
+app/assets/javascripts/jira_import/utils/cache_update.js
+app/assets/javascripts/jira_import/utils/jira_import_utils.js
+app/assets/javascripts/jobs/components/job_app.vue
+app/assets/javascripts/jobs/components/log/line.vue
+app/assets/javascripts/jobs/components/manual_variables_form.vue
+app/assets/javascripts/jobs/components/trigger_block.vue
+app/assets/javascripts/jobs/store/actions.js
+app/assets/javascripts/jobs/store/getters.js
+app/assets/javascripts/jobs/store/utils.js
+app/assets/javascripts/labels_select.js
+app/assets/javascripts/lazy_loader.js
+app/assets/javascripts/lib/chrome_84_icon_fix.js
+app/assets/javascripts/lib/dompurify.js
+app/assets/javascripts/lib/graphql.js
+app/assets/javascripts/lib/utils/ajax_cache.js
+app/assets/javascripts/lib/utils/apollo_startup_js_link.js
+app/assets/javascripts/lib/utils/autosave.js
+app/assets/javascripts/lib/utils/axios_startup_calls.js
+app/assets/javascripts/lib/utils/axios_utils.js
+app/assets/javascripts/lib/utils/bootstrap_linked_tabs.js
+app/assets/javascripts/lib/utils/chart_utils.js
+app/assets/javascripts/lib/utils/color_utils.js
+app/assets/javascripts/lib/utils/common_utils.js
+app/assets/javascripts/lib/utils/css_utils.js
+app/assets/javascripts/lib/utils/datetime_range.js
+app/assets/javascripts/lib/utils/datetime_utility.js
+app/assets/javascripts/lib/utils/dom_utils.js
+app/assets/javascripts/lib/utils/forms.js
+app/assets/javascripts/lib/utils/grammar.js
+app/assets/javascripts/lib/utils/icon_utils.js
+app/assets/javascripts/lib/utils/notify.js
+app/assets/javascripts/lib/utils/number_utils.js
+app/assets/javascripts/lib/utils/poll.js
+app/assets/javascripts/lib/utils/poll_until_complete.js
+app/assets/javascripts/lib/utils/set.js
+app/assets/javascripts/lib/utils/simple_poll.js
+app/assets/javascripts/lib/utils/sticky.js
+app/assets/javascripts/lib/utils/text_markdown.js
+app/assets/javascripts/lib/utils/text_utility.js
+app/assets/javascripts/lib/utils/type_utility.js
+
+## zen-robinson
+app/assets/javascripts/lib/utils/unit_format/formatter_factory.js
+app/assets/javascripts/lib/utils/url_utility.js
+app/assets/javascripts/line_highlighter.js
+app/assets/javascripts/locale/ensure_single_line.js
+app/assets/javascripts/locale/index.js
+app/assets/javascripts/locale/sprintf.js
+app/assets/javascripts/logs/components/log_advanced_filters.vue
+app/assets/javascripts/logs/logs_tracking_helper.js
+app/assets/javascripts/logs/stores/actions.js
+app/assets/javascripts/logs/stores/getters.js
+app/assets/javascripts/logs/utils.js
+app/assets/javascripts/main.js
+app/assets/javascripts/manual_ordering.js
+app/assets/javascripts/member_expiration_date.js
+app/assets/javascripts/members.js
+app/assets/javascripts/members/components/avatars/user_avatar.vue
+app/assets/javascripts/members/components/filter_sort/members_filtered_search_bar.vue
+app/assets/javascripts/members/components/filter_sort/sort_dropdown.vue
+app/assets/javascripts/members/store/index.js
+app/assets/javascripts/members/utils.js
+app/assets/javascripts/merge_conflicts/components/diff_file_editor.js
+app/assets/javascripts/merge_conflicts/components/inline_conflict_lines.js
+app/assets/javascripts/merge_conflicts/components/parallel_conflict_lines.js
+app/assets/javascripts/merge_conflicts/merge_conflict_store.js
+app/assets/javascripts/merge_request.js
+app/assets/javascripts/merge_request_tabs.js
+app/assets/javascripts/milestone.js
+app/assets/javascripts/milestone_select.js
+app/assets/javascripts/milestones/components/milestone_combobox.vue
+app/assets/javascripts/milestones/stores/actions.js
+app/assets/javascripts/milestones/stores/mutations.js
+
+## inspiring-lovelace
+app/assets/javascripts/mini_pipeline_graph_dropdown.js
+app/assets/javascripts/mirrors/mirror_repos.js
+app/assets/javascripts/mirrors/ssh_mirror.js
+app/assets/javascripts/monitoring/components/alert_widget.vue
+app/assets/javascripts/monitoring/components/alert_widget_form.vue
+app/assets/javascripts/monitoring/components/charts/annotations.js
+app/assets/javascripts/monitoring/components/charts/anomaly.vue
+app/assets/javascripts/monitoring/components/charts/bar.vue
+app/assets/javascripts/monitoring/components/charts/column.vue
+app/assets/javascripts/monitoring/components/charts/heatmap.vue
+app/assets/javascripts/monitoring/components/charts/options.js
+app/assets/javascripts/monitoring/components/charts/stacked_column.vue
+app/assets/javascripts/monitoring/components/charts/time_series.vue
+app/assets/javascripts/monitoring/components/dashboard_panel.vue
+app/assets/javascripts/monitoring/components/duplicate_dashboard_form.vue
+app/assets/javascripts/monitoring/components/duplicate_dashboard_modal.vue
+app/assets/javascripts/monitoring/components/embeds/embed_group.vue
+app/assets/javascripts/monitoring/components/embeds/metric_embed.vue
+app/assets/javascripts/monitoring/components/empty_state.vue
+app/assets/javascripts/monitoring/components/variables/dropdown_field.vue
+app/assets/javascripts/monitoring/csv_export.js
+app/assets/javascripts/monitoring/requests/index.js
+app/assets/javascripts/monitoring/services/alerts_service.js
+app/assets/javascripts/monitoring/stores/embed_group/getters.js
+app/assets/javascripts/monitoring/stores/mutations.js
+app/assets/javascripts/monitoring/stores/utils.js
+app/assets/javascripts/monitoring/stores/variable_mapping.js
+app/assets/javascripts/monitoring/utils.js
+app/assets/javascripts/monitoring/validators.js
+app/assets/javascripts/mr_notes/init_notes.js
+app/assets/javascripts/mr_notes/stores/getters.js
+
+## cool-dirac
+app/assets/javascripts/mr_popover/components/mr_popover.vue
+app/assets/javascripts/mr_popover/index.js
+app/assets/javascripts/namespace_select.js
+app/assets/javascripts/network/branch_graph.js
+app/assets/javascripts/new_branch_form.js
+app/assets/javascripts/notebook/cells/markdown.vue
+app/assets/javascripts/notes.js
+app/assets/javascripts/notes/components/diff_with_note.vue
+app/assets/javascripts/notes/components/discussion_actions.vue
+app/assets/javascripts/notes/components/discussion_counter.vue
+app/assets/javascripts/notes/components/discussion_filter.vue
+app/assets/javascripts/notes/components/multiline_comment_utils.js
+app/assets/javascripts/notes/components/note_actions.vue
+app/assets/javascripts/notes/components/note_body.vue
+app/assets/javascripts/notes/components/note_form.vue
+app/assets/javascripts/notes/components/noteable_discussion.vue
+app/assets/javascripts/notes/components/noteable_note.vue
+app/assets/javascripts/notes/components/notes_app.vue
+app/assets/javascripts/notes/components/toggle_replies_widget.vue
+app/assets/javascripts/notes/discussion_filters.js
+app/assets/javascripts/notes/mixins/diff_line_note_form.js
+app/assets/javascripts/notes/mixins/discussion_navigation.js
+app/assets/javascripts/notes/mixins/resolvable.js
+app/assets/javascripts/notes/sort_discussions.js
+app/assets/javascripts/notes/stores/actions.js
+app/assets/javascripts/notes/stores/collapse_utils.js
+app/assets/javascripts/notes/stores/getters.js
+app/assets/javascripts/notes/stores/mutations.js
+app/assets/javascripts/notes/stores/utils.js
+app/assets/javascripts/notes/utils.js
+app/assets/javascripts/notifications_dropdown.js
+
+## practical-cohen
+app/assets/javascripts/onboarding_issues/index.js
+app/assets/javascripts/operation_settings/store/actions.js
+app/assets/javascripts/operation_settings/store/index.js
+app/assets/javascripts/packages/details/components/package_files.vue
+app/assets/javascripts/packages/list/components/packages_list.vue
+app/assets/javascripts/packages/list/components/packages_list_app.vue
+app/assets/javascripts/packages/list/components/packages_sort.vue
+app/assets/javascripts/packages/list/stores/getters.js
+app/assets/javascripts/packages/shared/components/package_tags.vue
+app/assets/javascripts/packages/shared/utils.js
+app/assets/javascripts/pages/admin/admin.js
+app/assets/javascripts/pages/admin/application_settings/payload_previewer.js
+app/assets/javascripts/pages/admin/broadcast_messages/broadcast_message.js
+app/assets/javascripts/pages/admin/jobs/index/components/stop_jobs_modal.vue
+app/assets/javascripts/pages/admin/projects/index.js
+app/assets/javascripts/pages/admin/projects/index/index.js
+app/assets/javascripts/pages/admin/users/index.js
+app/assets/javascripts/pages/admin/users/new/index.js
+app/assets/javascripts/pages/dashboard/projects/index/components/customize_homepage_banner.vue
+app/assets/javascripts/pages/dashboard/projects/index/init_customize_homepage_banner.js
+app/assets/javascripts/pages/groups/new/group_path_validator.js
+app/assets/javascripts/pages/groups/shared/group_tabs.js
+app/assets/javascripts/pages/milestones/shared/components/delete_milestone_modal.vue
+app/assets/javascripts/pages/milestones/shared/components/promote_milestone_modal.vue
+app/assets/javascripts/pages/milestones/shared/delete_milestone_modal_init.js
+app/assets/javascripts/pages/milestones/shared/promote_milestone_modal_init.js
+app/assets/javascripts/pages/profiles/show/index.js
+app/assets/javascripts/pages/projects/blob/show/index.js
+app/assets/javascripts/pages/projects/graphs/charts/index.js
+app/assets/javascripts/pages/projects/graphs/components/code_coverage.vue
+app/assets/javascripts/pages/projects/issues/service_desk/filtered_search.js
+
+## vigorous-wiles
+app/assets/javascripts/pages/projects/issues/show.js
+app/assets/javascripts/pages/projects/jobs/index/index.js
+app/assets/javascripts/pages/projects/labels/components/promote_label_modal.vue
+app/assets/javascripts/pages/projects/labels/index/index.js
+app/assets/javascripts/pages/projects/merge_requests/creations/new/compare.js
+app/assets/javascripts/pages/projects/new/index.js
+app/assets/javascripts/pages/projects/pages_domains/form.js
+app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/target_branch_dropdown.js
+app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/timezone_dropdown.js
+app/assets/javascripts/pages/projects/pipelines/init_pipelines.js
+app/assets/javascripts/pages/projects/project.js
+app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js
+app/assets/javascripts/pages/projects/shared/permissions/external.js
+app/assets/javascripts/pages/projects/shared/permissions/index.js
+app/assets/javascripts/pages/projects/tags/index/index.js
+app/assets/javascripts/pages/search/show/refresh_counts.js
+app/assets/javascripts/pages/sessions/new/length_validator.js
+app/assets/javascripts/pages/sessions/new/preserve_url_fragment.js
+app/assets/javascripts/pages/sessions/new/signin_tabs_memoizer.js
+app/assets/javascripts/pages/sessions/new/username_validator.js
+app/assets/javascripts/pages/shared/mount_badge_settings.js
+app/assets/javascripts/pages/shared/wikis/wikis.js
+app/assets/javascripts/pages/users/activity_calendar.js
+app/assets/javascripts/pages/users/index.js
+app/assets/javascripts/pdf/index.vue
+app/assets/javascripts/pdf/page/index.vue
+app/assets/javascripts/performance/utils.js
+app/assets/javascripts/performance_bar/components/detailed_metric.vue
+app/assets/javascripts/performance_bar/components/request_selector.vue
+app/assets/javascripts/performance_bar/index.js
+app/assets/javascripts/performance_bar/performance_bar_log.js
+
+## musing-khayyam
+app/assets/javascripts/performance_bar/services/performance_bar_service.js
+app/assets/javascripts/performance_bar/stores/performance_bar_store.js
+app/assets/javascripts/persistent_user_callout.js
+app/assets/javascripts/persistent_user_callouts.js
+app/assets/javascripts/pipeline_editor/graphql/resolvers.js
+app/assets/javascripts/pipeline_new/components/pipeline_new_form.vue
+app/assets/javascripts/pipeline_new/utils/format_refs.js
+app/assets/javascripts/pipelines/components/dag/dag.vue
+app/assets/javascripts/pipelines/components/dag/dag_graph.vue
+app/assets/javascripts/pipelines/components/dag/drawing_utils.js
+app/assets/javascripts/pipelines/components/dag/interactions.js
+app/assets/javascripts/pipelines/components/graph/graph_component_legacy.vue
+app/assets/javascripts/pipelines/components/graph/utils.js
+app/assets/javascripts/pipelines/components/header_component.vue
+app/assets/javascripts/pipelines/components/parsing_utils.js
+app/assets/javascripts/pipelines/components/pipeline_graph/drawing_utils.js
+app/assets/javascripts/pipelines/components/pipeline_graph/pipeline_graph.vue
+app/assets/javascripts/pipelines/components/pipelines_list/pipelines.vue
+app/assets/javascripts/pipelines/components/pipelines_list/pipelines_filtered_search.vue
+app/assets/javascripts/pipelines/components/pipelines_list/stage.vue
+app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_branch_name_token.vue
+app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_status_token.vue
+app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_tag_name_token.vue
+app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_trigger_author_token.vue
+app/assets/javascripts/pipelines/components/unwrapping_utils.js
+app/assets/javascripts/pipelines/mixins/graph_pipeline_bundle_mixin.js
+app/assets/javascripts/pipelines/mixins/pipelines.js
+app/assets/javascripts/pipelines/pipeline_details_bundle.js
+app/assets/javascripts/pipelines/pipeline_details_header.js
+app/assets/javascripts/pipelines/pipeline_details_mediator.js
+app/assets/javascripts/pipelines/stores/pipeline_store.js
+
+## musing-engelbart
+app/assets/javascripts/pipelines/stores/test_reports/getters.js
+app/assets/javascripts/pipelines/stores/test_reports/index.js
+app/assets/javascripts/pipelines/stores/test_reports/utils.js
+app/assets/javascripts/pipelines/utils.js
+app/assets/javascripts/popovers/components/popovers.vue
+app/assets/javascripts/popovers/index.js
+app/assets/javascripts/profile/account/components/update_username.vue
+app/assets/javascripts/profile/add_ssh_key_validation.js
+app/assets/javascripts/profile/preferences/profile_preferences_bundle.js
+app/assets/javascripts/profile/profile.js
+app/assets/javascripts/project_find_file.js
+app/assets/javascripts/project_select.js
+app/assets/javascripts/project_select_combo_button.js
+app/assets/javascripts/project_visibility.js
+app/assets/javascripts/projects/commit_box/info/load_branches.js
+app/assets/javascripts/projects/commits/components/author_select.vue
+app/assets/javascripts/projects/commits/index.js
+app/assets/javascripts/projects/commits/store/actions.js
+app/assets/javascripts/projects/experiment_new_project_creation/components/app.vue
+app/assets/javascripts/projects/pipelines/charts/components/app.vue
+app/assets/javascripts/projects/pipelines/charts/components/app_legacy.vue
+app/assets/javascripts/projects/pipelines/charts/index.js
+app/assets/javascripts/projects/project_new.js
+app/assets/javascripts/projects/settings/components/shared_runners_toggle.vue
+app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue
+app/assets/javascripts/projects/tree/components/commit_pipeline_status_component.vue
+app/assets/javascripts/prometheus_alerts/components/reset_key.vue
+app/assets/javascripts/prometheus_metrics/custom_metrics.js
+app/assets/javascripts/prometheus_metrics/prometheus_metrics.js
+app/assets/javascripts/protected_branches/protected_branch_create.js
+app/assets/javascripts/protected_branches/protected_branch_edit.js
+
+## sweet-wilbur
+app/assets/javascripts/read_more.js
+app/assets/javascripts/ref/components/ref_results_section.vue
+app/assets/javascripts/ref/components/ref_selector.vue
+app/assets/javascripts/ref/stores/actions.js
+app/assets/javascripts/ref/stores/mutations.js
+app/assets/javascripts/ref_select_dropdown.js
+app/assets/javascripts/registry/explorer/components/details_page/tags_list.vue
+app/assets/javascripts/registry/explorer/components/registry_breadcrumb.vue
+app/assets/javascripts/registry/explorer/pages/details.vue
+app/assets/javascripts/registry/settings/components/registry_settings_app.vue
+app/assets/javascripts/registry/settings/components/settings_form.vue
+app/assets/javascripts/registry/settings/graphql/utils/cache_update.js
+app/assets/javascripts/registry/settings/utils.js
+app/assets/javascripts/related_issues/components/related_issuable_input.vue
+app/assets/javascripts/related_issues/components/related_issues_block.vue
+app/assets/javascripts/related_issues/components/related_issues_root.vue
+app/assets/javascripts/related_issues/index.js
+app/assets/javascripts/related_issues/stores/related_issues_store.js
+app/assets/javascripts/related_merge_requests/index.js
+app/assets/javascripts/related_merge_requests/store/actions.js
+app/assets/javascripts/releases/components/release_block_assets.vue
+app/assets/javascripts/releases/components/release_block_milestone_info.vue
+app/assets/javascripts/releases/components/releases_sort.vue
+app/assets/javascripts/releases/mount_edit.js
+app/assets/javascripts/releases/mount_index.js
+app/assets/javascripts/releases/mount_new.js
+app/assets/javascripts/releases/mount_show.js
+app/assets/javascripts/releases/stores/getters.js
+app/assets/javascripts/releases/stores/modules/detail/actions.js
+app/assets/javascripts/releases/stores/modules/detail/getters.js
+app/assets/javascripts/releases/stores/modules/detail/index.js
+app/assets/javascripts/releases/stores/modules/detail/mutations.js
+
+## awesome-chaum
+app/assets/javascripts/releases/stores/modules/list/actions.js
+app/assets/javascripts/releases/stores/modules/list/index.js
+app/assets/javascripts/releases/util.js
+app/assets/javascripts/reports/accessibility_report/store/getters.js
+app/assets/javascripts/reports/accessibility_report/store/index.js
+app/assets/javascripts/reports/codequality_report/store/actions.js
+app/assets/javascripts/reports/codequality_report/store/getters.js
+app/assets/javascripts/reports/codequality_report/store/index.js
+app/assets/javascripts/reports/codequality_report/store/utils/codequality_comparison.js
+app/assets/javascripts/reports/codequality_report/workers/codequality_comparison_worker.js
+app/assets/javascripts/reports/components/grouped_issues_list.vue
+app/assets/javascripts/reports/components/grouped_test_reports_app.vue
+app/assets/javascripts/reports/components/issues_list.vue
+app/assets/javascripts/reports/components/report_item.vue
+app/assets/javascripts/reports/store/getters.js
+app/assets/javascripts/reports/store/mutations.js
+app/assets/javascripts/reports/store/utils.js
+app/assets/javascripts/repository/components/breadcrumbs.vue
+app/assets/javascripts/repository/components/directory_download_links.vue
+app/assets/javascripts/repository/components/last_commit.vue
+app/assets/javascripts/repository/components/table/parent_row.vue
+app/assets/javascripts/repository/components/tree_content.vue
+app/assets/javascripts/repository/graphql.js
+app/assets/javascripts/repository/router.js
+app/assets/javascripts/repository/utils/commit.js
+app/assets/javascripts/repository/utils/readme.js
+app/assets/javascripts/search/highlight_blob_search_result.js
+app/assets/javascripts/search/sidebar/index.js
+app/assets/javascripts/search/store/actions.js
+app/assets/javascripts/search/store/index.js
+app/assets/javascripts/search/topbar/index.js
+
+## keen-sutherland
+app/assets/javascripts/search_autocomplete.js
+app/assets/javascripts/self_monitor/store/actions.js
+app/assets/javascripts/self_monitor/store/index.js
+app/assets/javascripts/sentry_error_stack_trace/index.js
+app/assets/javascripts/serverless/components/area.vue
+app/assets/javascripts/serverless/store/actions.js
+app/assets/javascripts/serverless/store/getters.js
+app/assets/javascripts/serverless/utils.js
+app/assets/javascripts/set_status_modal/utils.js
+app/assets/javascripts/sidebar/components/assignees/assignees.vue
+app/assets/javascripts/sidebar/components/assignees/assignees_realtime.vue
+app/assets/javascripts/sidebar/components/assignees/collapsed_assignee_list.vue
+app/assets/javascripts/sidebar/components/confidential/edit_form_buttons.vue
+app/assets/javascripts/sidebar/components/reviewers/collapsed_reviewer_list.vue
+app/assets/javascripts/sidebar/components/reviewers/reviewers.vue
+app/assets/javascripts/sidebar/components/severity/sidebar_severity.vue
+app/assets/javascripts/sidebar/components/time_tracking/sidebar_time_tracking.vue
+app/assets/javascripts/sidebar/lib/sidebar_move_issue.js
+app/assets/javascripts/sidebar/mount_milestone_sidebar.js
+app/assets/javascripts/sidebar/mount_sidebar.js
+app/assets/javascripts/sidebar/sidebar_mediator.js
+app/assets/javascripts/sidebar/utils.js
+app/assets/javascripts/single_file_diff.js
+app/assets/javascripts/smart_interval.js
+app/assets/javascripts/snippet/collapsible_input.js
+app/assets/javascripts/snippets/components/edit.vue
+app/assets/javascripts/snippets/components/snippet_blob_actions_edit.vue
+app/assets/javascripts/snippets/components/snippet_blob_edit.vue
+app/assets/javascripts/snippets/components/snippet_blob_view.vue
+app/assets/javascripts/snippets/components/snippet_header.vue
+app/assets/javascripts/snippets/mixins/snippets.js
+
+## lucid-lalande
+app/assets/javascripts/snippets/utils/blob.js
+app/assets/javascripts/static_site_editor/graphql/index.js
+app/assets/javascripts/static_site_editor/graphql/resolvers/file.js
+app/assets/javascripts/static_site_editor/graphql/resolvers/has_submitted_changes.js
+app/assets/javascripts/static_site_editor/graphql/resolvers/submit_content_changes.js
+app/assets/javascripts/static_site_editor/image_repository.js
+app/assets/javascripts/static_site_editor/index.js
+app/assets/javascripts/static_site_editor/pages/home.vue
+app/assets/javascripts/static_site_editor/services/formatter.js
+app/assets/javascripts/static_site_editor/services/front_matterify.js
+app/assets/javascripts/static_site_editor/services/image_service.js
+app/assets/javascripts/static_site_editor/services/load_source_content.js
+app/assets/javascripts/static_site_editor/services/parse_source_file.js
+app/assets/javascripts/static_site_editor/services/renderers/render_image.js
+app/assets/javascripts/static_site_editor/services/submit_content_changes.js
+app/assets/javascripts/static_site_editor/services/templater.js
+app/assets/javascripts/task_list.js
+app/assets/javascripts/terminal/terminal.js
+app/assets/javascripts/terraform/components/terraform_list.vue
+app/assets/javascripts/test_utils/simulate_input.js
+app/assets/javascripts/toggle_buttons.js
+app/assets/javascripts/tooltips/components/tooltips.vue
+app/assets/javascripts/tooltips/index.js
+app/assets/javascripts/tracking.js
+app/assets/javascripts/tree.js
+app/assets/javascripts/ui_development_kit.js
+app/assets/javascripts/usage_ping_consent.js
+app/assets/javascripts/user_callout.js
+app/assets/javascripts/user_lists/store/edit/actions.js
+app/assets/javascripts/user_lists/store/edit/index.js
+app/assets/javascripts/user_lists/store/new/actions.js
+app/assets/javascripts/user_lists/store/new/index.js
+
+## nostalgic-morse
+app/assets/javascripts/user_lists/store/show/actions.js
+app/assets/javascripts/user_lists/store/show/index.js
+app/assets/javascripts/user_lists/store/show/mutations.js
+app/assets/javascripts/user_popovers.js
+app/assets/javascripts/users_select/index.js
+app/assets/javascripts/vue_alerts.js
+app/assets/javascripts/vue_merge_request_widget/components/approvals/approvals.vue
+app/assets/javascripts/vue_merge_request_widget/components/deployment/deployment_actions.vue
+app/assets/javascripts/vue_merge_request_widget/components/deployment/deployment_view_button.vue
+app/assets/javascripts/vue_merge_request_widget/components/deployment/memory_usage.vue
+app/assets/javascripts/vue_merge_request_widget/components/extensions/base.vue
+app/assets/javascripts/vue_merge_request_widget/components/extensions/container.js
+app/assets/javascripts/vue_merge_request_widget/components/extensions/index.js
+app/assets/javascripts/vue_merge_request_widget/components/mr_widget_alert_message.vue
+app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_auto_merge_enabled.vue
+app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.vue
+app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merged.vue
+app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_missing_branch.vue
+app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_rebase.vue
+app/assets/javascripts/vue_merge_request_widget/components/states/ready_to_merge.vue
+app/assets/javascripts/vue_merge_request_widget/components/states/squash_before_merge.vue
+app/assets/javascripts/vue_merge_request_widget/components/states/work_in_progress.vue
+app/assets/javascripts/vue_merge_request_widget/components/terraform/mr_widget_terraform_container.vue
+app/assets/javascripts/vue_merge_request_widget/extensions/issues.js
+app/assets/javascripts/vue_merge_request_widget/mixins/approvals.js
+app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue
+app/assets/javascripts/vue_merge_request_widget/services/mr_widget_service.js
+app/assets/javascripts/vue_merge_request_widget/stores/artifacts_list/getters.js
+app/assets/javascripts/vue_shared/components/actions_button.vue
+app/assets/javascripts/vue_shared/components/awards_list.vue
+app/assets/javascripts/vue_shared/components/commit.vue
+app/assets/javascripts/vue_shared/components/confirm_modal.vue
+
+## thirsty-mccarthy
+app/assets/javascripts/vue_shared/components/date_time_picker/date_time_picker.vue
+app/assets/javascripts/vue_shared/components/date_time_picker/date_time_picker_input.vue
+app/assets/javascripts/vue_shared/components/date_time_picker/date_time_picker_lib.js
+app/assets/javascripts/vue_shared/components/deprecated_modal_2.vue
+app/assets/javascripts/vue_shared/components/dismissible_container.vue
+app/assets/javascripts/vue_shared/components/file_finder/index.vue
+app/assets/javascripts/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue
+app/assets/javascripts/vue_shared/components/filtered_search_bar/filtered_search_utils.js
+app/assets/javascripts/vue_shared/components/filtered_search_bar/store/modules/filters/actions.js
+app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/author_token.vue
+app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/branch_token.vue
+app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/label_token.vue
+app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/milestone_token.vue
+app/assets/javascripts/vue_shared/components/gfm_autocomplete/gfm_autocomplete.vue
+app/assets/javascripts/vue_shared/components/gfm_autocomplete/utils.js
+app/assets/javascripts/vue_shared/components/lib/utils/diff_utils.js
+app/assets/javascripts/vue_shared/components/markdown/field.vue
+app/assets/javascripts/vue_shared/components/markdown/header.vue
+app/assets/javascripts/vue_shared/components/markdown/suggestions.vue
+app/assets/javascripts/vue_shared/components/modal_copy_button.vue
+app/assets/javascripts/vue_shared/components/ordered_layout.vue
+app/assets/javascripts/vue_shared/components/paginated_table_with_search_and_tabs/paginated_table_with_search_and_tabs.vue
+app/assets/javascripts/vue_shared/components/paginated_table_with_search_and_tabs/utils.js
+app/assets/javascripts/vue_shared/components/project_selector/project_list_item.vue
+app/assets/javascripts/vue_shared/components/registry/list_item.vue
+app/assets/javascripts/vue_shared/components/registry/title_area.vue
+app/assets/javascripts/vue_shared/components/rich_content_editor/rich_content_editor.vue
+app/assets/javascripts/vue_shared/components/rich_content_editor/services/build_custom_renderer.js
+app/assets/javascripts/vue_shared/components/rich_content_editor/services/build_html_to_markdown_renderer.js
+app/assets/javascripts/vue_shared/components/rich_content_editor/services/editor_service.js
+app/assets/javascripts/vue_shared/components/rich_content_editor/services/renderers/build_uneditable_token.js
+app/assets/javascripts/vue_shared/components/rich_content_editor/services/renderers/render_html_block.js
+app/assets/javascripts/vue_shared/components/rich_content_editor/services/renderers/render_identifier_instance_text.js
+app/assets/javascripts/vue_shared/components/rich_content_editor/services/renderers/render_identifier_paragraph.js
+app/assets/javascripts/vue_shared/components/rich_content_editor/services/renderers/render_softbreak.js
+app/assets/javascripts/vue_shared/components/rich_content_editor/services/renderers/render_utils.js
+
+## practical-wozniak
+app/assets/javascripts/vue_shared/components/rich_content_editor/services/sanitize_html.js
+app/assets/javascripts/vue_shared/components/select2_select.vue
+app/assets/javascripts/vue_shared/components/sidebar/labels_select/dropdown_create_label.vue
+app/assets/javascripts/vue_shared/components/sidebar/labels_select/dropdown_value_collapsed.vue
+app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_create_view.vue
+app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/labels_select_root.vue
+app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/store/getters.js
+app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/store/mutations.js
+app/assets/javascripts/vue_shared/components/split_button.vue
+app/assets/javascripts/vue_shared/components/tabs/tabs.js
+app/assets/javascripts/vue_shared/components/timezone_dropdown.vue
+app/assets/javascripts/vue_shared/components/web_ide_link.vue
+app/assets/javascripts/vue_shared/directives/autofocusonshow.js
+app/assets/javascripts/vue_shared/directives/validation.js
+app/assets/javascripts/vue_shared/gl_feature_flags_plugin.js
+app/assets/javascripts/vue_shared/mixins/ci_pagination_api_mixin.js
+app/assets/javascripts/vue_shared/security_reports/security_reports_app.vue
+app/assets/javascripts/vue_shared/security_reports/store/getters.js
+app/assets/javascripts/vue_shared/security_reports/store/modules/sast/actions.js
+app/assets/javascripts/vue_shared/security_reports/store/modules/secret_detection/actions.js
+app/assets/javascripts/vue_shared/security_reports/store/utils.js
+app/assets/javascripts/vue_shared/translate.js
+app/assets/javascripts/vuex_shared/bindings.js
+app/assets/javascripts/whats_new/components/app.vue
+app/assets/javascripts/whats_new/index.js
+app/assets/javascripts/whats_new/utils/get_drawer_body_height.js
+app/assets/javascripts/whats_new/utils/notification.js
+app/assets/javascripts/zen_mode.js
+config/helpers/is_eslint.js
+config/helpers/vendor_dll_hash.js
+config/karma.config.js
+
+## frosty-kare
+config/plugins/monaco_webpack.js
+config/webpack.config.js
+ee/app/assets/javascripts/add_gitlab_slack_application/components/add_gitlab_slack_application.vue
+ee/app/assets/javascripts/admin/dev_ops_report/components/devops_adoption_app.vue
+ee/app/assets/javascripts/admin/dev_ops_report/components/devops_adoption_segment_modal.vue
+ee/app/assets/javascripts/admin/dev_ops_report/components/devops_adoption_table.vue
+ee/app/assets/javascripts/admin/dev_ops_report/graphql.js
+ee/app/assets/javascripts/admin/dev_ops_report/utils/cache_updates.js
+ee/app/assets/javascripts/analytics/code_review_analytics/components/app.vue
+ee/app/assets/javascripts/analytics/code_review_analytics/components/filter_bar.vue
+ee/app/assets/javascripts/analytics/code_review_analytics/filtered_search_code_review_analytics.js
+ee/app/assets/javascripts/analytics/code_review_analytics/store/modules/merge_requests/actions.js
+ee/app/assets/javascripts/analytics/code_review_analytics/utils.js
+ee/app/assets/javascripts/analytics/contribution_analytics/components/column_chart.vue
+ee/app/assets/javascripts/analytics/contribution_analytics/contribution_analytics_bundle.js
+ee/app/assets/javascripts/analytics/cycle_analytics/components/create_value_stream_form/utils.js
+ee/app/assets/javascripts/analytics/cycle_analytics/components/custom_stage_form.vue
+ee/app/assets/javascripts/analytics/cycle_analytics/components/filter_bar.vue
+ee/app/assets/javascripts/analytics/cycle_analytics/components/stage_dropdown_filter.vue
+ee/app/assets/javascripts/analytics/cycle_analytics/components/stage_table_nav.vue
+ee/app/assets/javascripts/analytics/cycle_analytics/components/tasks_by_type/tasks_by_type_filters.vue
+ee/app/assets/javascripts/analytics/cycle_analytics/components/time_metrics_card.vue
+ee/app/assets/javascripts/analytics/cycle_analytics/index.js
+ee/app/assets/javascripts/analytics/cycle_analytics/store/actions.js
+ee/app/assets/javascripts/analytics/cycle_analytics/store/getters.js
+ee/app/assets/javascripts/analytics/cycle_analytics/store/modules/custom_stages/actions.js
+ee/app/assets/javascripts/analytics/cycle_analytics/store/modules/custom_stages/mutations.js
+ee/app/assets/javascripts/analytics/cycle_analytics/store/modules/duration_chart/actions.js
+ee/app/assets/javascripts/analytics/cycle_analytics/store/modules/duration_chart/getters.js
+ee/app/assets/javascripts/analytics/cycle_analytics/store/modules/type_of_work/actions.js
+ee/app/assets/javascripts/analytics/cycle_analytics/store/mutations.js
+
+## frosty-sammet
+ee/app/assets/javascripts/analytics/group_ci_cd_analytics/index.js
+ee/app/assets/javascripts/analytics/merge_request_analytics/components/filter_bar.vue
+ee/app/assets/javascripts/analytics/merge_request_analytics/components/throughput_chart.vue
+ee/app/assets/javascripts/analytics/merge_request_analytics/components/throughput_table.vue
+ee/app/assets/javascripts/analytics/merge_request_analytics/graphql/throughput_chart_query_builder.js
+ee/app/assets/javascripts/analytics/merge_request_analytics/index.js
+ee/app/assets/javascripts/analytics/merge_request_analytics/utils.js
+ee/app/assets/javascripts/analytics/productivity_analytics/components/app.vue
+ee/app/assets/javascripts/analytics/productivity_analytics/components/metric_chart.vue
+ee/app/assets/javascripts/analytics/productivity_analytics/components/mr_table.vue
+ee/app/assets/javascripts/analytics/productivity_analytics/filtered_search_productivity_analytics.js
+ee/app/assets/javascripts/analytics/productivity_analytics/store/getters.js
+ee/app/assets/javascripts/analytics/productivity_analytics/store/modules/charts/actions.js
+ee/app/assets/javascripts/analytics/productivity_analytics/store/modules/charts/getters.js
+ee/app/assets/javascripts/analytics/productivity_analytics/store/modules/filters/getters.js
+ee/app/assets/javascripts/analytics/productivity_analytics/store/modules/table/actions.js
+ee/app/assets/javascripts/analytics/productivity_analytics/store/modules/table/getters.js
+ee/app/assets/javascripts/analytics/productivity_analytics/utils.js
+ee/app/assets/javascripts/analytics/repository_analytics/components/download_test_coverage.vue
+ee/app/assets/javascripts/analytics/repository_analytics/components/test_coverage_table.vue
+ee/app/assets/javascripts/analytics/shared/components/groups_dropdown_filter.vue
+ee/app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue
+ee/app/assets/javascripts/analytics/shared/components/scatterplot.vue
+ee/app/assets/javascripts/analytics/shared/utils.js
+ee/app/assets/javascripts/approvals/components/app.vue
+ee/app/assets/javascripts/approvals/components/approvers_select.vue
+ee/app/assets/javascripts/approvals/components/branches_select.vue
+ee/app/assets/javascripts/approvals/components/license_compliance/index.vue
+ee/app/assets/javascripts/approvals/components/mr_edit/app.vue
+ee/app/assets/javascripts/approvals/components/mr_edit/mr_rules.vue
+ee/app/assets/javascripts/approvals/components/mr_edit/mr_rules_hidden_inputs.vue
+ee/app/assets/javascripts/approvals/components/mr_edit/rule_input.vue
+
+## strange-shirley
+ee/app/assets/javascripts/approvals/components/project_settings/project_rules.vue
+ee/app/assets/javascripts/approvals/components/rule_form.vue
+ee/app/assets/javascripts/approvals/components/security_configuration/unconfigured_security_rules.vue
+ee/app/assets/javascripts/approvals/mappers.js
+ee/app/assets/javascripts/approvals/stores/modules/base/getters.js
+ee/app/assets/javascripts/approvals/stores/modules/license_compliance/actions.js
+ee/app/assets/javascripts/approvals/stores/modules/mr_edit/actions.js
+ee/app/assets/javascripts/approvals/stores/modules/mr_edit/mutations.js
+ee/app/assets/javascripts/approvals/stores/modules/project_settings/actions.js
+ee/app/assets/javascripts/audit_events/components/audit_events_filter.vue
+ee/app/assets/javascripts/audit_events/components/sorting_field.vue
+ee/app/assets/javascripts/audit_events/components/tokens/member_token.vue
+ee/app/assets/javascripts/audit_events/components/tokens/project_token.vue
+ee/app/assets/javascripts/audit_events/components/tokens/shared/audit_filter_token.vue
+ee/app/assets/javascripts/audit_events/components/tokens/user_token.vue
+ee/app/assets/javascripts/audit_events/constants.js
+ee/app/assets/javascripts/audit_events/init_audit_events.js
+ee/app/assets/javascripts/audit_events/store/getters.js
+ee/app/assets/javascripts/audit_events/utils.js
+ee/app/assets/javascripts/audit_events/validators.js
+ee/app/assets/javascripts/billings/seat_usage/store/actions.js
+ee/app/assets/javascripts/billings/seat_usage/store/getters.js
+ee/app/assets/javascripts/billings/subscriptions/store/actions.js
+ee/app/assets/javascripts/billings/subscriptions/store/getters.js
+ee/app/assets/javascripts/billings/subscriptions/store/mutations.js
+ee/app/assets/javascripts/boards/boards_util.js
+ee/app/assets/javascripts/boards/components/board_scope.vue
+ee/app/assets/javascripts/boards/components/boards_list_selector/index.js
+ee/app/assets/javascripts/boards/components/boards_list_selector/list_container.vue
+ee/app/assets/javascripts/boards/components/epics_swimlanes.vue
+ee/app/assets/javascripts/boards/components/new_list_dropdown.js
+
+## great-keldysh
+ee/app/assets/javascripts/boards/components/sidebar/remove_issue.js
+ee/app/assets/javascripts/boards/config_toggle.js
+ee/app/assets/javascripts/boards/ee_functions.js
+ee/app/assets/javascripts/boards/mixins/modal_footer.js
+ee/app/assets/javascripts/boards/models/list.js
+ee/app/assets/javascripts/boards/stores/actions.js
+ee/app/assets/javascripts/boards/stores/boards_store_ee.js
+ee/app/assets/javascripts/boards/stores/mutations.js
+ee/app/assets/javascripts/boards/toggle_labels.js
+ee/app/assets/javascripts/burndown_chart/burn_chart_data.js
+ee/app/assets/javascripts/burndown_chart/components/burn_charts.vue
+ee/app/assets/javascripts/burndown_chart/components/burnup_chart.vue
+ee/app/assets/javascripts/burndown_chart/components/open_timebox_summary.vue
+ee/app/assets/javascripts/clusters/components/environments.vue
+ee/app/assets/javascripts/clusters/mixins/track_uninstall_button_click.js
+ee/app/assets/javascripts/clusters_list/components/agents.vue
+ee/app/assets/javascripts/codequality_report/store/actions.js
+ee/app/assets/javascripts/codequality_report/store/getters.js
+ee/app/assets/javascripts/compliance_dashboard/compliance_dashboard_bundle.js
+ee/app/assets/javascripts/dependencies/components/dependencies_actions.vue
+ee/app/assets/javascripts/dependencies/components/paginated_dependencies_table.vue
+ee/app/assets/javascripts/dependencies/store/getters.js
+ee/app/assets/javascripts/dependencies/store/modules/list/actions.js
+ee/app/assets/javascripts/diffs/mixins/image_diff.js
+ee/app/assets/javascripts/droplab/plugins/custom_number.js
+ee/app/assets/javascripts/ee_trial_banner/ee_trial_banner.js
+ee/app/assets/javascripts/environments/stores/environments_store.js
+ee/app/assets/javascripts/epic/components/epic_form.vue
+ee/app/assets/javascripts/epic/components/sidebar_items/sidebar_labels.vue
+ee/app/assets/javascripts/epic/epic_bundle.js
+ee/app/assets/javascripts/epic/epic_tabs.js
+
+## stoic-einstein
+ee/app/assets/javascripts/epic/store/actions.js
+ee/app/assets/javascripts/epic/store/mutations.js
+ee/app/assets/javascripts/epic/utils/epic_utils.js
+ee/app/assets/javascripts/event_tracking/navbar.js
+ee/app/assets/javascripts/filtered_search/dropdown_weight.js
+ee/app/assets/javascripts/filtered_search/filtered_search_manager.js
+ee/app/assets/javascripts/filtered_search/issuable_filtered_search_token_keys.js
+ee/app/assets/javascripts/geo_node_form/components/geo_node_form_capacities.vue
+ee/app/assets/javascripts/geo_node_form/components/geo_node_form_namespaces.vue
+ee/app/assets/javascripts/geo_node_form/components/geo_node_form_shards.vue
+ee/app/assets/javascripts/geo_node_form/store/actions.js
+ee/app/assets/javascripts/geo_node_form/store/getters.js
+ee/app/assets/javascripts/geo_node_form/validations.js
+ee/app/assets/javascripts/geo_nodes/components/app.vue
+ee/app/assets/javascripts/geo_nodes/components/node_detail_sections/node_details_section_main.vue
+ee/app/assets/javascripts/geo_nodes/store/geo_nodes_store.js
+ee/app/assets/javascripts/geo_replicable/graphql/replicable_type_query_builder.js
+ee/app/assets/javascripts/geo_replicable/store/actions.js
+ee/app/assets/javascripts/geo_replicable/store/getters.js
+ee/app/assets/javascripts/geo_replicable/store/index.js
+ee/app/assets/javascripts/geo_settings/store/getters.js
+ee/app/assets/javascripts/geo_settings/store/state.js
+ee/app/assets/javascripts/geo_settings/validations.js
+ee/app/assets/javascripts/gfm_auto_complete.js
+ee/app/assets/javascripts/group_member_contributions/store/group_member_store.js
+ee/app/assets/javascripts/groups/members/utils.js
+ee/app/assets/javascripts/groups/settings/access_restriction_field/validate_ip_address.js
+ee/app/assets/javascripts/groups/settings/compliance_frameworks/components/list.vue
+ee/app/assets/javascripts/groups/settings/compliance_frameworks/init_list.js
+ee/app/assets/javascripts/groups/settings/components/comma_separated_list_token_selector.vue
+ee/app/assets/javascripts/insights/components/insights.vue
+ee/app/assets/javascripts/insights/components/insights_chart.vue
+
+## pedantic-noether
+ee/app/assets/javascripts/insights/stores/modules/insights/actions.js
+ee/app/assets/javascripts/insights/stores/modules/insights/helpers.js
+ee/app/assets/javascripts/insights/stores/modules/insights/mutations.js
+ee/app/assets/javascripts/integrations/jira/issues_list/components/jira_issues_list_root.vue
+ee/app/assets/javascripts/integrations/jira/issues_list/jira_issues_list_bundle.js
+ee/app/assets/javascripts/issues_analytics/components/issues_analytics.vue
+ee/app/assets/javascripts/issues_analytics/filtered_search_issues_analytics.js
+ee/app/assets/javascripts/issues_analytics/stores/modules/issue_analytics/actions.js
+ee/app/assets/javascripts/issues_analytics/stores/modules/issue_analytics/getters.js
+ee/app/assets/javascripts/iterations/components/iteration_report.vue
+ee/app/assets/javascripts/iterations/components/iteration_report_tabs.vue
+ee/app/assets/javascripts/iterations/components/iterations.vue
+ee/app/assets/javascripts/iterations/components/iterations_list.vue
+ee/app/assets/javascripts/ldap_groups_select.js
+ee/app/assets/javascripts/license_compliance/store/modules/list/actions.js
+ee/app/assets/javascripts/license_compliance/store/modules/list/getters.js
+ee/app/assets/javascripts/license_compliance/store/plugins/mediator.js
+ee/app/assets/javascripts/license_compliance/utils/mappers.js
+ee/app/assets/javascripts/maintenance_mode_settings/store/index.js
+ee/app/assets/javascripts/members.js
+ee/app/assets/javascripts/members/components/table/members_table_cell.vue
+ee/app/assets/javascripts/members/store/state.js
+ee/app/assets/javascripts/members/utils.js
+ee/app/assets/javascripts/on_demand_scans/components/on_demand_scans_form.vue
+ee/app/assets/javascripts/on_demand_scans/components/profile_selector/scanner_profile_selector.vue
+ee/app/assets/javascripts/on_demand_scans/components/profile_selector/site_profile_selector.vue
+ee/app/assets/javascripts/oncall_schedules/components/add_edit_schedule_form.vue
+ee/app/assets/javascripts/oncall_schedules/components/add_edit_schedule_modal.vue
+ee/app/assets/javascripts/oncall_schedules/components/delete_schedule_modal.vue
+ee/app/assets/javascripts/oncall_schedules/components/oncall_schedule.vue
+ee/app/assets/javascripts/oncall_schedules/components/rotations/components/add_rotation_modal.vue
+
+## gifted-dewdney
+ee/app/assets/javascripts/oncall_schedules/utils/cache_updates.js
+ee/app/assets/javascripts/oncall_schedules/utils/common_utils.js
+ee/app/assets/javascripts/pages/admin/application_settings/ci_cd/ci_template.js
+ee/app/assets/javascripts/pages/admin/application_settings/index.js
+ee/app/assets/javascripts/pages/admin/application_settings/integrations/index.js
+ee/app/assets/javascripts/pages/admin/emails/show/admin_email_select.js
+ee/app/assets/javascripts/pages/admin/geo/index.js
+ee/app/assets/javascripts/pages/admin/licenses/new/index.js
+ee/app/assets/javascripts/pages/admin/users/pipeline_minutes/reset_button.vue
+ee/app/assets/javascripts/pages/groups/saml_providers/saml_members/store/actions.js
+ee/app/assets/javascripts/pages/groups/saml_providers/saml_members/store/index.js
+ee/app/assets/javascripts/pages/projects/pipelines/show/codequality_report.js
+ee/app/assets/javascripts/pages/projects/pipelines/show/license_report.js
+ee/app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js
+ee/app/assets/javascripts/pages/projects/settings/repository/show/ee_mirror_repos.js
+ee/app/assets/javascripts/path_locks.js
+ee/app/assets/javascripts/projects/merge_requests/blocking_mr_input.js
+ee/app/assets/javascripts/protected_environments/protected_environment_create.js
+ee/app/assets/javascripts/protected_environments/protected_environment_edit.js
+ee/app/assets/javascripts/protected_tags/protected_tag_create.js
+ee/app/assets/javascripts/protected_tags/protected_tag_edit.js
+ee/app/assets/javascripts/registrations/groups/new/index.js
+ee/app/assets/javascripts/related_items_tree/components/related_items_tree_app.vue
+ee/app/assets/javascripts/related_items_tree/related_items_tree_bundle.js
+ee/app/assets/javascripts/related_items_tree/store/actions.js
+ee/app/assets/javascripts/related_items_tree/store/getters.js
+ee/app/assets/javascripts/related_items_tree/utils/epic_utils.js
+ee/app/assets/javascripts/repository/index.js
+ee/app/assets/javascripts/repository/utils/commit.js
+ee/app/assets/javascripts/requirements/components/requirement_item.vue
+ee/app/assets/javascripts/requirements/components/requirements_root.vue
+
+## gifted-black
+ee/app/assets/javascripts/requirements/requirements_bundle.js
+ee/app/assets/javascripts/roadmap/components/epics_list_section.vue
+ee/app/assets/javascripts/roadmap/components/roadmap_filters.vue
+ee/app/assets/javascripts/roadmap/roadmap_bundle.js
+ee/app/assets/javascripts/roadmap/store/actions.js
+ee/app/assets/javascripts/roadmap/store/getters.js
+ee/app/assets/javascripts/roadmap/store/mutations.js
+ee/app/assets/javascripts/roadmap/utils/epic_utils.js
+ee/app/assets/javascripts/roadmap/utils/roadmap_item_utils.js
+ee/app/assets/javascripts/saml_providers/dirty_form_checker.js
+ee/app/assets/javascripts/saml_providers/saml_settings_form.js
+ee/app/assets/javascripts/saml_providers/scim_token_toggle_area.js
+ee/app/assets/javascripts/search/highlight_blob_search_result.js
+ee/app/assets/javascripts/security_configuration/components/auto_fix_settings.vue
+ee/app/assets/javascripts/security_configuration/components/create_merge_request_button.vue
+ee/app/assets/javascripts/security_configuration/dast_profiles/components/dast_profiles.vue
+ee/app/assets/javascripts/security_configuration/dast_profiles/components/dast_profiles_list.vue
+ee/app/assets/javascripts/security_configuration/dast_profiles/graphql/cache_utils.js
+ee/app/assets/javascripts/security_configuration/dast_scanner_profiles/components/dast_scanner_profile_form.vue
+ee/app/assets/javascripts/security_configuration/dast_site_profiles_form/components/dast_site_profile_form.vue
+ee/app/assets/javascripts/security_configuration/modules/configuration/actions.js
+ee/app/assets/javascripts/security_configuration/sast/components/configuration_form.vue
+ee/app/assets/javascripts/security_configuration/sast/components/dynamic_fields.vue
+ee/app/assets/javascripts/security_configuration/sast/components/form_input.vue
+ee/app/assets/javascripts/security_configuration/sast/components/utils.js
+ee/app/assets/javascripts/security_dashboard/components/filters/standard_filter.vue
+ee/app/assets/javascripts/security_dashboard/components/first_class_group_security_dashboard_vulnerabilities.vue
+ee/app/assets/javascripts/security_dashboard/components/first_class_instance_security_dashboard_vulnerabilities.vue
+ee/app/assets/javascripts/security_dashboard/components/first_class_project_manager/project_manager.vue
+ee/app/assets/javascripts/security_dashboard/components/first_class_vulnerability_chart.vue
+ee/app/assets/javascripts/security_dashboard/components/first_class_vulnerability_severities.vue
+ee/app/assets/javascripts/security_dashboard/components/loading_error.vue
+ee/app/assets/javascripts/security_dashboard/components/project_security_charts.vue
+ee/app/assets/javascripts/security_dashboard/components/selection_summary.vue
+ee/app/assets/javascripts/security_dashboard/components/vulnerability_chart_buttons.vue
+ee/app/assets/javascripts/security_dashboard/components/vulnerability_count_list.vue
+ee/app/assets/javascripts/security_dashboard/components/vulnerability_count_list_layout.vue
+ee/app/assets/javascripts/security_dashboard/components/vulnerability_list.vue
+
+## confident-dijkstra
+ee/app/assets/javascripts/security_dashboard/helpers.js
+ee/app/assets/javascripts/security_dashboard/instance_dashboard_settings_init.js
+ee/app/assets/javascripts/security_dashboard/store/modules/filters/actions.js
+ee/app/assets/javascripts/security_dashboard/store/modules/pipeline_jobs/actions.js
+ee/app/assets/javascripts/security_dashboard/store/modules/pipeline_jobs/getters.js
+ee/app/assets/javascripts/security_dashboard/store/modules/project_selector/actions.js
+ee/app/assets/javascripts/security_dashboard/store/modules/project_selector/mutations.js
+ee/app/assets/javascripts/security_dashboard/store/modules/project_selector/utils/add_page_info.js
+ee/app/assets/javascripts/security_dashboard/store/modules/projects/actions.js
+ee/app/assets/javascripts/security_dashboard/store/modules/unscanned_projects/actions.js
+ee/app/assets/javascripts/security_dashboard/store/modules/unscanned_projects/getters.js
+ee/app/assets/javascripts/security_dashboard/store/modules/unscanned_projects/utils.js
+ee/app/assets/javascripts/security_dashboard/store/modules/vulnerabilities/actions.js
+ee/app/assets/javascripts/security_dashboard/store/modules/vulnerabilities/getters.js
+ee/app/assets/javascripts/security_dashboard/store/modules/vulnerabilities/mutations.js
+ee/app/assets/javascripts/security_dashboard/store/modules/vulnerabilities/utils.js
+ee/app/assets/javascripts/security_dashboard/store/modules/vulnerable_projects/actions.js
+ee/app/assets/javascripts/security_dashboard/store/modules/vulnerable_projects/getters.js
+ee/app/assets/javascripts/security_dashboard/store/modules/vulnerable_projects/utils.js
+ee/app/assets/javascripts/security_dashboard/store/plugins/mediator.js
+ee/app/assets/javascripts/security_dashboard/utils/first_class_project_manager_utils.js
+ee/app/assets/javascripts/sidebar/components/status/health_status_dropdown.vue
+ee/app/assets/javascripts/sidebar/components/status/status.vue
+ee/app/assets/javascripts/sidebar/mount_sidebar.js
+ee/app/assets/javascripts/sidebar/sidebar_mediator.js
+ee/app/assets/javascripts/status_page_settings/store/actions.js
+ee/app/assets/javascripts/status_page_settings/store/index.js
+ee/app/assets/javascripts/storage_counter/components/projects_table.vue
+ee/app/assets/javascripts/storage_counter/components/usage_graph.vue
+ee/app/assets/javascripts/storage_counter/utils.js
+ee/app/assets/javascripts/subscriptions/new/store/actions.js
+ee/app/assets/javascripts/subscriptions/new/store/getters.js
+ee/app/assets/javascripts/subscriptions/new/store/state.js
+
+## frosty-cannon
+ee/app/assets/javascripts/test_case_create/components/test_case_create_root.vue
+ee/app/assets/javascripts/test_case_create/test_case_create_bundle.js
+ee/app/assets/javascripts/test_case_list/components/test_case_list_root.vue
+ee/app/assets/javascripts/test_case_list/test_case_list_bundle.js
+ee/app/assets/javascripts/test_case_show/components/test_case_show_root.vue
+ee/app/assets/javascripts/test_case_show/components/test_case_sidebar.vue
+ee/app/assets/javascripts/test_case_show/mixins/test_case_graphql.js
+ee/app/assets/javascripts/test_case_show/test_case_show_bundle.js
+ee/app/assets/javascripts/threat_monitoring/components/alerts/alerts_list.vue
+ee/app/assets/javascripts/threat_monitoring/components/network_policy_list.vue
+ee/app/assets/javascripts/threat_monitoring/components/policy_editor/lib/from_yaml.js
+ee/app/assets/javascripts/threat_monitoring/components/policy_editor/lib/humanize.js
+ee/app/assets/javascripts/threat_monitoring/components/policy_editor/lib/rules.js
+ee/app/assets/javascripts/threat_monitoring/components/policy_editor/lib/to_yaml.js
+ee/app/assets/javascripts/threat_monitoring/components/policy_editor/lib/utils.js
+ee/app/assets/javascripts/threat_monitoring/components/policy_editor/policy_rule_entity.vue
+ee/app/assets/javascripts/threat_monitoring/components/statistics_history.vue
+ee/app/assets/javascripts/threat_monitoring/store/index.js
+ee/app/assets/javascripts/threat_monitoring/store/modules/network_policies/actions.js
+ee/app/assets/javascripts/threat_monitoring/store/modules/network_policies/getters.js
+ee/app/assets/javascripts/threat_monitoring/store/modules/network_policies/mutations.js
+ee/app/assets/javascripts/threat_monitoring/store/modules/threat_monitoring/actions.js
+ee/app/assets/javascripts/threat_monitoring/store/modules/threat_monitoring_statistics/actions.js
+ee/app/assets/javascripts/threat_monitoring/store/modules/threat_monitoring_statistics/index.js
+ee/app/assets/javascripts/threat_monitoring/store/modules/threat_monitoring_statistics/mutations.js
+ee/app/assets/javascripts/threat_monitoring/store/utils.js
+ee/app/assets/javascripts/validators/ip_address.js
+ee/app/assets/javascripts/vue_merge_request_widget/components/approvals/approvals.vue
+ee/app/assets/javascripts/vue_merge_request_widget/components/approvals/approvals_list.vue
+ee/app/assets/javascripts/vue_merge_request_widget/components/blocking_merge_requests/blocking_merge_requests_report.vue
+ee/app/assets/javascripts/vue_merge_request_widget/components/visual_review_app_link.vue
+
+## pedantic-wu
+ee/app/assets/javascripts/vue_merge_request_widget/mappers.js
+ee/app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue
+ee/app/assets/javascripts/vue_merge_request_widget/services/mr_widget_service.js
+ee/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js
+ee/app/assets/javascripts/vue_shared/components/accordion/accordion_item.vue
+ee/app/assets/javascripts/vue_shared/components/gfm_autocomplete/utils.js
+ee/app/assets/javascripts/vue_shared/components/sidebar/epics_select/store/actions.js
+ee/app/assets/javascripts/vue_shared/components/sidebar/epics_select/store/getters.js
+ee/app/assets/javascripts/vue_shared/dashboards/components/project_pipeline.vue
+ee/app/assets/javascripts/vue_shared/dashboards/store/actions.js
+ee/app/assets/javascripts/vue_shared/dashboards/store/mutations.js
+ee/app/assets/javascripts/vue_shared/license_compliance/components/add_license_form_dropdown.vue
+ee/app/assets/javascripts/vue_shared/license_compliance/components/admin_license_management_row.vue
+ee/app/assets/javascripts/vue_shared/license_compliance/store/actions.js
+ee/app/assets/javascripts/vue_shared/license_compliance/store/getters.js
+ee/app/assets/javascripts/vue_shared/license_compliance/store/mutations.js
+ee/app/assets/javascripts/vue_shared/license_compliance/store/utils.js
+ee/app/assets/javascripts/vue_shared/metrics_reports/store/getters.js
+ee/app/assets/javascripts/vue_shared/metrics_reports/store/mutations.js
+ee/app/assets/javascripts/vue_shared/security_reports/components/vulnerability_details.vue
+ee/app/assets/javascripts/vue_shared/security_reports/store/actions.js
+ee/app/assets/javascripts/vue_shared/security_reports/store/getters.js
+ee/app/assets/javascripts/vue_shared/security_reports/store/modules/api_fuzzing/actions.js
+ee/app/assets/javascripts/vue_shared/security_reports/store/modules/api_fuzzing/getters.js
+ee/app/assets/javascripts/vue_shared/security_reports/store/modules/sast/getters.js
+ee/app/assets/javascripts/vue_shared/security_reports/store/modules/secret_detection/getters.js
+ee/app/assets/javascripts/vue_shared/security_reports/store/utils.js
+ee/app/assets/javascripts/vue_shared/security_reports/store/utils/convert_report_type.js
+ee/app/assets/javascripts/vue_shared/security_reports/store/utils/get_primary_identifier.js
+ee/app/assets/javascripts/vulnerabilities/components/details.vue
+ee/app/assets/javascripts/vulnerabilities/components/footer.vue
+ee/app/assets/javascripts/vulnerabilities/components/header.vue
+ee/app/assets/javascripts/vulnerabilities/components/history_entry.vue
+ee/app/assets/javascripts/vulnerabilities/components/related_issues.vue
+ee/app/assets/javascripts/vulnerabilities/components/resolution_alert.vue
+
+## wonderful-proskuriakova
+ee/app/assets/javascripts/vulnerabilities/helpers.js
+ee/app/assets/javascripts/vulnerabilities/vulnerabilities_init.js
+ee/spec/frontend/admin/dev_ops_report/components/devops_adoption_segment_modal_spec.js
+ee/spec/frontend/admin/dev_ops_report/components/devops_adoption_table_cell_flag_spec.js
+ee/spec/frontend/admin/dev_ops_report/components/devops_adoption_table_spec.js
+ee/spec/frontend/analytics/code_review_analytics/components/app_spec.js
+ee/spec/frontend/analytics/code_review_analytics/components/filter_bar_spec.js
+ee/spec/frontend/analytics/code_review_analytics/components/merge_request_table_spec.js
+ee/spec/frontend/analytics/code_review_analytics/store/modules/merge_requests/actions_spec.js
+ee/spec/frontend/analytics/cycle_analytics/components/base_spec.js
+ee/spec/frontend/analytics/cycle_analytics/components/create_value_stream_form/custom_stage_fields_spec.js
+ee/spec/frontend/analytics/cycle_analytics/components/custom_stage_form_spec.js
+ee/spec/frontend/analytics/cycle_analytics/components/duration_chart_spec.js
+ee/spec/frontend/analytics/cycle_analytics/components/filter_bar_spec.js
+ee/spec/frontend/analytics/cycle_analytics/components/labels_selector_spec.js
+ee/spec/frontend/analytics/cycle_analytics/components/metrics_spec.js
+ee/spec/frontend/analytics/cycle_analytics/components/path_navigation_spec.js
+ee/spec/frontend/analytics/cycle_analytics/components/stage_dropdown_filter_spec.js
+ee/spec/frontend/analytics/cycle_analytics/components/stage_event_list_spec.js
+ee/spec/frontend/analytics/cycle_analytics/components/stage_nav_item_spec.js
+ee/spec/frontend/analytics/cycle_analytics/components/stage_table_spec.js
+ee/spec/frontend/analytics/cycle_analytics/components/tasks_by_type/tasks_by_type_filters_spec.js
+ee/spec/frontend/analytics/cycle_analytics/components/type_of_work_charts_spec.js
+ee/spec/frontend/analytics/cycle_analytics/components/value_stream_select_spec.js
+ee/spec/frontend/analytics/cycle_analytics/helpers.js
+ee/spec/frontend/analytics/cycle_analytics/mock_data.js
+ee/spec/frontend/analytics/cycle_analytics/store/getters_spec.js
+ee/spec/frontend/analytics/cycle_analytics/store/mutations_spec.js
+ee/spec/frontend/analytics/cycle_analytics/utils_spec.js
+ee/spec/frontend/analytics/merge_request_analytics/components/filter_bar_spec.js
+ee/spec/frontend/analytics/merge_request_analytics/components/throughput_table_spec.js
+
+## inspiring-banach
+ee/spec/frontend/analytics/productivity_analytics/components/app_spec.js
+ee/spec/frontend/analytics/productivity_analytics/helpers.js
+ee/spec/frontend/analytics/productivity_analytics/store/actions_spec.js
+ee/spec/frontend/analytics/productivity_analytics/store/modules/charts/actions_spec.js
+ee/spec/frontend/analytics/productivity_analytics/store/modules/charts/getters_spec.js
+ee/spec/frontend/analytics/productivity_analytics/store/modules/filters/actions_spec.js
+ee/spec/frontend/analytics/productivity_analytics/store/modules/table/actions_spec.js
+ee/spec/frontend/analytics/repository_analytics/components/select_projects_dropdown_spec.js
+ee/spec/frontend/analytics/repository_analytics/components/test_coverage_table_spec.js
+ee/spec/frontend/analytics/shared/utils_spec.js
+ee/spec/frontend/api_spec.js
+ee/spec/frontend/approvals/components/approval_check_popover_spec.js
+ee/spec/frontend/approvals/components/approval_check_rule_popover_spec.js
+ee/spec/frontend/approvals/components/approvers_select_spec.js
+ee/spec/frontend/approvals/components/branches_select_spec.js
+ee/spec/frontend/approvals/components/license_compliance/index_spec.js
+ee/spec/frontend/approvals/components/license_compliance/modal_spec.js
+ee/spec/frontend/approvals/components/mr_edit/mr_rules_hidden_inputs_spec.js
+ee/spec/frontend/approvals/components/mr_edit/mr_rules_spec.js
+ee/spec/frontend/approvals/components/project_settings/project_rules_spec.js
+ee/spec/frontend/approvals/components/rule_form_spec.js
+ee/spec/frontend/approvals/stores/modules/mr_edit/actions_spec.js
+ee/spec/frontend/approvals/stores/modules/project_settings/actions_spec.js
+ee/spec/frontend/audit_events/components/audit_events_app_spec.js
+ee/spec/frontend/audit_events/components/sorting_field_spec.js
+ee/spec/frontend/audit_events/components/tokens/audit_filter_token_spec.js
+ee/spec/frontend/billings/helpers.js
+ee/spec/frontend/billings/seat_usage/components/subscription_seats_spec.js
+ee/spec/frontend/billings/seat_usage/store/actions_spec.js
+ee/spec/frontend/billings/subscriptions/components/subscription_table_row_spec.js
+ee/spec/frontend/billings/subscriptions/store/mutations_spec.js
+
+## keen-napier
+ee/spec/frontend/boards/components/assignee_select_spec.js
+ee/spec/frontend/boards/components/board_list_header_new_spec.js
+ee/spec/frontend/boards/components/board_list_header_spec.js
+ee/spec/frontend/boards/components/board_list_selector/board_list_selector_spec.js
+ee/spec/frontend/boards/components/board_list_spec.js
+ee/spec/frontend/boards/components/board_setting_list_types_spec.js
+ee/spec/frontend/boards/components/board_settings_wip_limit_spec.js
+ee/spec/frontend/boards/components/epic_lane_spec.js
+ee/spec/frontend/boards/components/sidebar/board_sidebar_epic_select_spec.js
+ee/spec/frontend/boards/components/sidebar/board_sidebar_time_tracker_spec.js
+ee/spec/frontend/boards/components/weight_select_spec.js
+ee/spec/frontend/boards/milestone_select_spec.js
+ee/spec/frontend/boards/mock_data.js
+ee/spec/frontend/boards/stores/actions_spec.js
+ee/spec/frontend/boards/stores/boards_store_ee_spec.js
+ee/spec/frontend/boards/stores/mutations_spec.js
+ee/spec/frontend/burndown_chart/components/burn_charts_spec.js
+ee/spec/frontend/codequality_report/store/actions_spec.js
+ee/spec/frontend/compliance_dashboard/components/empty_state_spec.js
+ee/spec/frontend/compliance_dashboard/components/merge_requests/branch_details_spec.js
+ee/spec/frontend/compliance_dashboard/components/merge_requests/grid_spec.js
+ee/spec/frontend/compliance_dashboard/components/merge_requests/merge_request_spec.js
+ee/spec/frontend/compliance_dashboard/components/merge_requests/status_spec.js
+ee/spec/frontend/compliance_dashboard/components/merge_requests/statuses/approval_spec.js
+ee/spec/frontend/compliance_dashboard/components/merge_requests/statuses/pipeline_spec.js
+ee/spec/frontend/compliance_dashboard/components/shared/grid_column_heading_spec.js
+ee/spec/frontend/compliance_dashboard/components/shared/pagination_spec.js
+ee/spec/frontend/compliance_dashboard/mock_data.js
+ee/spec/frontend/dependencies/components/app_spec.js
+ee/spec/frontend/dependencies/components/dependencies_actions_spec.js
+ee/spec/frontend/dependencies/components/dependency_license_links_spec.js
+ee/spec/frontend/dependencies/components/dependency_list_job_failed_alert_spec.js
+
+## gallant-ride
+ee/spec/frontend/diffs/components/diff_line_note_form_spec.js
+ee/spec/frontend/environments/canary_ingress_spec.js
+ee/spec/frontend/environments/deploy_board_component_spec.js
+ee/spec/frontend/environments/environments_app_spec.js
+ee/spec/frontend/environments/environments_table_spec.js
+ee/spec/frontend/environments/mock_data.js
+ee/spec/frontend/environments_dashboard/components/project_header_spec.js
+ee/spec/frontend/epic/components/sidebar_items/sidebar_date_picker_spec.js
+ee/spec/frontend/epic/components/sidebar_items/sidebar_header_spec.js
+ee/spec/frontend/epic/components/sidebar_items/sidebar_todo_spec.js
+ee/spec/frontend/epic/store/actions_spec.js
+ee/spec/frontend/filtered_search/issues_filtered_search_token_keys_spec.js
+ee/spec/frontend/geo_node_form/components/geo_node_form_namespaces_spec.js
+ee/spec/frontend/geo_nodes/components/app_spec.js
+ee/spec/frontend/geo_nodes/components/geo_node_header_spec.js
+ee/spec/frontend/geo_nodes/components/geo_node_sync_progress_spec.js
+ee/spec/frontend/geo_nodes/components/node_detail_sections/node_details_section_main_spec.js
+ee/spec/frontend/geo_nodes/components/node_detail_sections/node_details_section_other_spec.js
+ee/spec/frontend/geo_nodes/store/geo_nodes_store_spec.js
+ee/spec/frontend/geo_replicable/components/app_spec.js
+ee/spec/frontend/geo_replicable/components/geo_replicable_filter_bar_spec.js
+ee/spec/frontend/geo_replicable/components/geo_replicable_spec.js
+ee/spec/frontend/geo_replicable/store/actions_spec.js
+ee/spec/frontend/group_member_contributions/components/table_header_spec.js
+ee/spec/frontend/group_member_contributions/store/group_member_store_spec.js
+ee/spec/frontend/groups/components/invite_members_spec.js
+ee/spec/frontend/groups/components/registration_trial_toggle_spec.js
+ee/spec/frontend/groups/settings/compliance_frameworks/components/list_spec.js
+ee/spec/frontend/groups/settings/components/comma_separated_list_token_selector_spec.js
+ee/spec/frontend/insights/components/insights_chart_spec.js
+ee/spec/frontend/issue_show/components/incidents/incident_sla_spec.js
+
+## boring-brattain
+ee/spec/frontend/issues_analytics/components/issues_analytics_spec.js
+ee/spec/frontend/issues_analytics/components/issues_analytics_table_spec.js
+ee/spec/frontend/issues_analytics/mock_data.js
+ee/spec/frontend/iterations/components/iteration_report_tabs_spec.js
+ee/spec/frontend/iterations/components/iterations_spec.js
+ee/spec/frontend/license_compliance/components/app_spec.js
+ee/spec/frontend/license_compliance/components/license_component_links_spec.js
+ee/spec/frontend/license_compliance/components/licenses_table_spec.js
+ee/spec/frontend/maintenance_mode_settings/components/app_spec.js
+ee/spec/frontend/members/components/ldap/ldap_override_confirmation_modal_spec.js
+ee/spec/frontend/members/components/table/members_table_spec.js
+ee/spec/frontend/members/utils_spec.js
+ee/spec/frontend/notes/components/note_header_spec.js
+ee/spec/frontend/on_demand_scans/components/on_demand_scans_app_spec.js
+ee/spec/frontend/on_demand_scans/components/on_demand_scans_form_spec.js
+ee/spec/frontend/on_demand_scans/components/profile_selector/profile_selector_spec.js
+ee/spec/frontend/on_demand_scans/components/profile_selector/scanner_profile_selector_spec.js
+ee/spec/frontend/on_demand_scans/components/profile_selector/site_profile_selector_spec.js
+ee/spec/frontend/on_demand_scans/mocks/apollo_mocks.js
+ee/spec/frontend/oncall_schedule/schedule/components/preset_weeks/weeks_header_sub_item_spec.js
+ee/spec/frontend/pages/groups/saml_providers/saml_members/store/actions_spec.js
+ee/spec/frontend/projects/merge_requests/blocking_mr_input_root_spec.js
+ee/spec/frontend/related_items_tree/components/create_issue_form_spec.js
+ee/spec/frontend/related_items_tree/store/actions_spec.js
+ee/spec/frontend/related_items_tree/store/mutations_spec.js
+ee/spec/frontend/requirements/components/requirement_status_badge_spec.js
+ee/spec/frontend/roadmap/components/epic_item_details_spec.js
+ee/spec/frontend/roadmap/components/epic_item_spec.js
+ee/spec/frontend/roadmap/components/epic_item_timeline_spec.js
+ee/spec/frontend/roadmap/components/epics_list_empty_spec.js
+ee/spec/frontend/roadmap/components/milestones_list_section_spec.js
+
+## compassionate-aryabhata
+ee/spec/frontend/roadmap/components/preset_months/months_header_sub_item_spec.js
+ee/spec/frontend/roadmap/components/preset_quarters/quarters_header_item_spec.js
+ee/spec/frontend/roadmap/components/preset_quarters/quarters_header_sub_item_spec.js
+ee/spec/frontend/roadmap/components/preset_weeks/weeks_header_sub_item_spec.js
+ee/spec/frontend/roadmap/store/actions_spec.js
+ee/spec/frontend/roadmap/store/mutations_spec.js
+ee/spec/frontend/saml_providers/dirty_form_checker_spec.js
+ee/spec/frontend/saml_providers/saml_settings_form_spec.js
+ee/spec/frontend/scim_token/scim_token_toggle_area_spec.js
+ee/spec/frontend/security_configuration/components/app_spec.js
+ee/spec/frontend/security_configuration/components/feature_status_spec.js
+ee/spec/frontend/security_configuration/components/helpers.js
+ee/spec/frontend/security_configuration/components/manage_feature_spec.js
+ee/spec/frontend/security_configuration/dast_profiles/components/dast_profiles_list_spec.js
+ee/spec/frontend/security_configuration/dast_profiles/components/dast_profiles_spec.js
+ee/spec/frontend/security_configuration/dast_profiles/components/dast_site_profiles_list_spec.js
+ee/spec/frontend/security_configuration/dast_scanner_profiles_form/components/dast_scanner_profiles_form_spec.js
+ee/spec/frontend/security_configuration/dast_site_profiles_form/components/dast_site_auth_section_spec.js
+ee/spec/frontend/security_configuration/sast/components/configuration_form_spec.js
+ee/spec/frontend/security_configuration/sast/components/dynamic_fields_spec.js
+ee/spec/frontend/security_configuration/sast/components/helpers.js
+ee/spec/frontend/security_configuration/sast/components/utils_spec.js
+ee/spec/frontend/security_dashboard/components/auto_fix_help_text_spec.js
+ee/spec/frontend/security_dashboard/components/filters/filter_body_spec.js
+ee/spec/frontend/security_dashboard/components/filters/filter_item_spec.js
+ee/spec/frontend/security_dashboard/components/filters/standard_filter_spec.js
+ee/spec/frontend/security_dashboard/components/first_class_project_manager/project_list_spec.js
+ee/spec/frontend/security_dashboard/components/first_class_project_security_dashboard_spec.js
+ee/spec/frontend/security_dashboard/components/first_class_vulnerability_severities_spec.js
+ee/spec/frontend/security_dashboard/components/loading_error_spec.js
+ee/spec/frontend/security_dashboard/components/pipeline_security_dashboard_spec.js
+ee/spec/frontend/security_dashboard/components/pipeline_status_badge_spec.js
+ee/spec/frontend/security_dashboard/components/security_charts_layout_spec.js
+ee/spec/frontend/security_dashboard/components/security_dashboard_layout_spec.js
+ee/spec/frontend/security_dashboard/components/security_dashboard_table_row_spec.js
+ee/spec/frontend/security_dashboard/components/security_dashboard_vuex_spec.js
+ee/spec/frontend/security_dashboard/components/security_reports_summary_spec.js
+ee/spec/frontend/security_dashboard/components/security_scanner_alert_spec.js
+ee/spec/frontend/security_dashboard/components/selection_summary_spec.js
+ee/spec/frontend/security_dashboard/components/selection_summary_vuex_spec.js
+ee/spec/frontend/security_dashboard/components/vulnerability_count_list_layout_spec.js
+
+## jovial-haslett
+ee/spec/frontend/security_dashboard/helpers.js
+ee/spec/frontend/security_dashboard/helpers_spec.js
+ee/spec/frontend/security_dashboard/store/modules/filters/mutations_spec.js
+ee/spec/frontend/security_dashboard/store/modules/pipeline_jobs/actions_spec.js
+ee/spec/frontend/security_dashboard/store/modules/project_selector/actions_spec.js
+ee/spec/frontend/security_dashboard/store/modules/project_selector/utils/add_page_info_spec.js
+ee/spec/frontend/security_dashboard/store/modules/projects/actions_spec.js
+ee/spec/frontend/security_dashboard/store/modules/unscanned_projects/getters_spec.js
+ee/spec/frontend/security_dashboard/store/modules/unscanned_projects/utils_spec.js
+ee/spec/frontend/security_dashboard/store/modules/vulnerabilities/actions_spec.js
+ee/spec/frontend/security_dashboard/store/modules/vulnerabilities/utils_spec.js
+ee/spec/frontend/security_dashboard/store/modules/vulnerable_projects/mock_data.js
+ee/spec/frontend/security_dashboard/store/modules/vulnerable_projects/utils_spec.js
+ee/spec/frontend/sidebar/components/iteration_select_spec.js
+ee/spec/frontend/sidebar/components/status/sidebar_status_spec.js
+ee/spec/frontend/status_page_settings/store/actions_spec.js
+ee/spec/frontend/storage_counter/components/usage_graph_spec.js
+ee/spec/frontend/storage_counter/components/usage_statistics_spec.js
+ee/spec/frontend/storage_counter/mock_data.js
+ee/spec/frontend/storage_counter/utils_spec.js
+ee/spec/frontend/subscriptions/new/components/checkout/progress_bar_spec.js
+ee/spec/frontend/subscriptions/new/components/checkout/step_spec.js
+ee/spec/frontend/subscriptions/new/components/checkout/subscription_details_spec.js
+ee/spec/frontend/subscriptions/new/store/actions_spec.js
+ee/spec/frontend/test_case_create/components/test_case_create_root_spec.js
+ee/spec/frontend/threat_monitoring/components/app_spec.js
+ee/spec/frontend/threat_monitoring/components/environment_picker_spec.js
+ee/spec/frontend/threat_monitoring/components/network_policy_list_spec.js
+ee/spec/frontend/threat_monitoring/components/policy_editor/lib/rules_spec.js
+ee/spec/frontend/threat_monitoring/components/policy_editor/policy_rule_builder_spec.js
+ee/spec/frontend/threat_monitoring/components/policy_editor/policy_rule_entity_spec.js
+
+## modest-kilby
+ee/spec/frontend/threat_monitoring/components/statistics_summary_spec.js
+ee/spec/frontend/threat_monitoring/components/threat_monitoring_filters_spec.js
+ee/spec/frontend/threat_monitoring/store/modules/threat_monitoring/actions_spec.js
+ee/spec/frontend/threat_monitoring/store/modules/threat_monitoring_statistics/getters_spec.js
+ee/spec/frontend/threat_monitoring/store/modules/threat_monitoring_statistics/mutations_spec.js
+ee/spec/frontend/trial_registrations/username_suggester_spec.js
+ee/spec/frontend/vue_mr_widget/components/approvals/approvals_auth_spec.js
+ee/spec/frontend/vue_mr_widget/components/approvals/approvals_footer_spec.js
+ee/spec/frontend/vue_mr_widget/components/approvals/approvals_list_spec.js
+ee/spec/frontend/vue_mr_widget/components/approvals/approvals_spec.js
+ee/spec/frontend/vue_mr_widget/components/blocking_merge_requests/blocking_merge_requests_report_spec.js
+ee/spec/frontend/vue_mr_widget/components/merge_train_helper_text_spec.js
+ee/spec/frontend/vue_mr_widget/components/merge_train_position_indicator_spec.js
+ee/spec/frontend/vue_mr_widget/components/mr_widget_pipeline_container_spec.js
+ee/spec/frontend/vue_mr_widget/ee_mr_widget_options_spec.js
+ee/spec/frontend/vue_mr_widget/stores/mr_widget_store_spec.js
+ee/spec/frontend/vue_shared/components/accordion/accordion_item_spec.js
+ee/spec/frontend/vue_shared/components/deployment_instance/deployment_instance_spec.js
+ee/spec/frontend/vue_shared/components/notes/system_note_spec.js
+ee/spec/frontend/vue_shared/components/security_reports/severity_badge_spec.js
+ee/spec/frontend/vue_shared/components/sidebar/epics_select/base_spec.js
+ee/spec/frontend/vue_shared/components/sidebar/epics_select/dropdown_contents_spec.js
+ee/spec/frontend/vue_shared/components/sidebar/epics_select/store/actions_spec.js
+ee/spec/frontend/vue_shared/components/sidebar/epics_select/store/getters_spec.js
+ee/spec/frontend/vue_shared/dashboards/store/actions_spec.js
+ee/spec/frontend/vue_shared/dashboards/store/mutations_spec.js
+ee/spec/frontend/vue_shared/discover/card_security_discover_app_spec.js
+ee/spec/frontend/vue_shared/license_compliance/components/add_license_form_dropdown_spec.js
+ee/spec/frontend/vue_shared/license_compliance/components/admin_license_management_row_spec.js
+ee/spec/frontend/vue_shared/license_compliance/components/delete_confirmation_modal_spec.js
+ee/spec/frontend/vue_shared/license_compliance/components/license_packages_spec.js
+
+## interesting-galileo
+ee/spec/frontend/vue_shared/license_compliance/license_management_spec.js
+ee/spec/frontend/vue_shared/license_compliance/mock_data.js
+ee/spec/frontend/vue_shared/license_compliance/mr_widget_license_report_spec.js
+ee/spec/frontend/vue_shared/license_compliance/store/actions_spec.js
+ee/spec/frontend/vue_shared/license_compliance/store/getters_spec.js
+ee/spec/frontend/vue_shared/security_reports/components/dast_modal_spec.js
+ee/spec/frontend/vue_shared/security_reports/components/dismiss_button_spec.js
+ee/spec/frontend/vue_shared/security_reports/components/modal_footer_spec.js
+ee/spec/frontend/vue_shared/security_reports/components/modal_spec.js
+ee/spec/frontend/vue_shared/security_reports/components/security_issue_body_spec.js
+ee/spec/frontend/vue_shared/security_reports/components/split_button_spec.js
+ee/spec/frontend/vue_shared/security_reports/components/vulnerability_details_spec.js
+ee/spec/frontend/vue_shared/security_reports/grouped_security_reports_app_spec.js
+ee/spec/frontend/vue_shared/security_reports/store/actions_spec.js
+ee/spec/frontend/vue_shared/security_reports/store/getters_spec.js
+ee/spec/frontend/vue_shared/security_reports/store/mediator_spec.js
+ee/spec/frontend/vue_shared/security_reports/store/modules/api_fuzzing/actions_spec.js
+ee/spec/frontend/vue_shared/security_reports/store/modules/sast/actions_spec.js
+ee/spec/frontend/vue_shared/security_reports/store/modules/secret_detection/actions_spec.js
+ee/spec/frontend/vulnerabilities/details_spec.js
+ee/spec/frontend/vulnerabilities/header_spec.js
+ee/spec/frontend/vulnerabilities/helpers_spec.js
+ee/spec/frontend/vulnerabilities/history_comment_editor_spec.js
+ee/spec/frontend/vulnerabilities/history_comment_spec.js
+ee/spec/frontend/vulnerabilities/history_entry_spec.js
+ee/spec/frontend/vulnerabilities/issue_link_spec.js
+ee/spec/frontend/vulnerabilities/related_issues_spec.js
+ee/spec/frontend/vulnerabilities/status_description_spec.js
+ee/spec/frontend/vulnerabilities/vulnerability_state_dropdown_spec.js
+
+## relaxed-goldwasser
+spec/frontend/__mocks__/@gitlab/ui.js
+spec/frontend/__mocks__/lodash/debounce.js
+spec/frontend/__mocks__/lodash/throttle.js
+spec/frontend/activities_spec.js
+spec/frontend/add_context_commits_modal/store/actions_spec.js
+spec/frontend/admin/statistics_panel/components/app_spec.js
+spec/frontend/admin/statistics_panel/store/actions_spec.js
+spec/frontend/alert_handler_spec.js
+spec/frontend/alerts_service_settings/components/alerts_service_form_spec.js
+spec/frontend/alerts_settings/alert_mapping_builder_spec.js
+spec/frontend/alerts_settings/alerts_settings_wrapper_spec.js
+spec/frontend/analytics/instance_statistics/components/app_spec.js
+spec/frontend/api_spec.js
+spec/frontend/authentication/two_factor_auth/components/recovery_codes_spec.js
+spec/frontend/authentication/u2f/authenticate_spec.js
+spec/frontend/authentication/u2f/register_spec.js
+spec/frontend/awards_handler_spec.js
+spec/frontend/badges/components/badge_form_spec.js
+spec/frontend/badges/components/badge_list_row_spec.js
+spec/frontend/badges/components/badge_list_spec.js
+spec/frontend/badges/components/badge_spec.js
+spec/frontend/badges/store/actions_spec.js
+spec/frontend/batch_comments/components/draft_note_spec.js
+spec/frontend/batch_comments/components/drafts_count_spec.js
+spec/frontend/batch_comments/components/preview_item_spec.js
+spec/frontend/batch_comments/components/publish_button_spec.js
+spec/frontend/batch_comments/stores/modules/batch_comments/actions_spec.js
+spec/frontend/behaviors/autosize_spec.js
+spec/frontend/behaviors/copy_as_gfm_spec.js
+spec/frontend/behaviors/load_startup_css_spec.js
+spec/frontend/behaviors/markdown/paste_markdown_table_spec.js
+spec/frontend/behaviors/quick_submit_spec.js
+spec/frontend/behaviors/secret_values_spec.js
+
+## eager-lamport
+spec/frontend/behaviors/shortcuts/keybindings_spec.js
+spec/frontend/behaviors/shortcuts/shortcuts_issuable_spec.js
+spec/frontend/blob/components/blob_content_error_spec.js
+spec/frontend/blob/components/blob_edit_content_spec.js
+spec/frontend/blob/components/blob_edit_header_spec.js
+spec/frontend/blob/components/blob_header_spec.js
+spec/frontend/blob/sketch/index_spec.js
+spec/frontend/blob/utils_spec.js
+spec/frontend/blob/viewer/index_spec.js
+spec/frontend/blob_edit/edit_blob_spec.js
+spec/frontend/boards/board_list_new_spec.js
+spec/frontend/boards/board_list_spec.js
+spec/frontend/boards/boards_store_spec.js
+spec/frontend/boards/components/board_assignee_dropdown_spec.js
+spec/frontend/boards/components/board_card_layout_spec.js
+spec/frontend/boards/components/board_card_spec.js
+spec/frontend/boards/components/board_configuration_options_spec.js
+spec/frontend/boards/components/board_list_header_new_spec.js
+spec/frontend/boards/components/board_list_header_spec.js
+spec/frontend/boards/components/boards_selector_spec.js
+spec/frontend/boards/components/issue_count_spec.js
+spec/frontend/boards/components/issue_due_date_spec.js
+spec/frontend/boards/components/issue_time_estimate_deprecated_spec.js
+spec/frontend/boards/components/issue_time_estimate_spec.js
+spec/frontend/boards/components/sidebar/board_sidebar_subscription_spec.js
+spec/frontend/boards/components/sidebar/remove_issue_spec.js
+spec/frontend/boards/issue_card_deprecated_spec.js
+spec/frontend/boards/issue_card_inner_spec.js
+spec/frontend/boards/list_spec.js
+spec/frontend/boards/mock_data.js
+spec/frontend/boards/stores/actions_spec.js
+spec/frontend/boards/stores/getters_spec.js
+spec/frontend/boards/stores/mutations_spec.js
+
+## busy-mayer
+spec/frontend/branches/branches_delete_modal_spec.js
+spec/frontend/ci_settings_pipeline_triggers/components/triggers_list_spec.js
+spec/frontend/ci_variable_list/components/ci_environments_dropdown_spec.js
+spec/frontend/ci_variable_list/components/ci_variable_modal_spec.js
+spec/frontend/ci_variable_list/components/ci_variable_settings_spec.js
+spec/frontend/ci_variable_list/store/actions_spec.js
+spec/frontend/clusters/clusters_bundle_spec.js
+spec/frontend/clusters/components/application_row_spec.js
+spec/frontend/clusters/components/applications_spec.js
+spec/frontend/clusters/components/fluentd_output_settings_spec.js
+spec/frontend/clusters/services/application_state_machine_spec.js
+spec/frontend/clusters_list/components/node_error_help_text_spec.js
+spec/frontend/clusters_list/store/actions_spec.js
+spec/frontend/code_navigation/store/actions_spec.js
+spec/frontend/collapsed_sidebar_todo_spec.js
+spec/frontend/commit/commit_pipeline_status_component_spec.js
+spec/frontend/commit/pipelines/pipelines_spec.js
+spec/frontend/commits_spec.js
+spec/frontend/confirm_modal_spec.js
+spec/frontend/contributors/store/actions_spec.js
+spec/frontend/create_cluster/eks_cluster/components/eks_cluster_configuration_form_spec.js
+spec/frontend/create_cluster/eks_cluster/store/actions_spec.js
+spec/frontend/create_cluster/eks_cluster/store/getters_spec.js
+spec/frontend/create_cluster/eks_cluster/store/mutations_spec.js
+spec/frontend/create_cluster/gke_cluster/helpers.js
+spec/frontend/create_cluster/gke_cluster/stores/actions_spec.js
+spec/frontend/create_cluster/gke_cluster_namespace/gke_cluster_namespace_spec.js
+spec/frontend/create_cluster/store/cluster_dropdown/mutations_spec.js
+spec/frontend/create_item_dropdown_spec.js
+spec/frontend/create_merge_request_dropdown_spec.js
+spec/frontend/custom_metrics/components/custom_metrics_form_fields_spec.js
+
+## eloquent-black
+spec/frontend/cycle_analytics/limit_warning_component_spec.js
+spec/frontend/deploy_freeze/components/timezone_dropdown_spec.js
+spec/frontend/deploy_keys/components/key_spec.js
+spec/frontend/deploy_keys/components/keys_panel_spec.js
+spec/frontend/deprecated_jquery_dropdown_spec.js
+spec/frontend/design_management/components/design_notes/design_discussion_spec.js
+spec/frontend/design_management/components/design_overlay_spec.js
+spec/frontend/design_management/components/design_scaler_spec.js
+spec/frontend/design_management/components/upload/design_version_dropdown_spec.js
+spec/frontend/design_management/pages/index_spec.js
+spec/frontend/design_management/router_spec.js
+spec/frontend/design_management/utils/error_messages_spec.js
+spec/frontend/diffs/components/app_spec.js
+spec/frontend/diffs/components/compare_dropdown_layout_spec.js
+spec/frontend/diffs/components/compare_versions_spec.js
+spec/frontend/diffs/components/diff_content_spec.js
+spec/frontend/diffs/components/diff_discussions_spec.js
+spec/frontend/diffs/components/diff_expansion_cell_spec.js
+spec/frontend/diffs/components/diff_file_spec.js
+spec/frontend/diffs/components/diff_line_note_form_spec.js
+spec/frontend/diffs/components/diff_stats_spec.js
+spec/frontend/diffs/components/diff_view_spec.js
+spec/frontend/diffs/components/image_diff_overlay_spec.js
+spec/frontend/diffs/components/no_changes_spec.js
+spec/frontend/diffs/components/parallel_diff_table_row_spec.js
+spec/frontend/diffs/components/settings_dropdown_spec.js
+spec/frontend/diffs/store/actions_spec.js
+spec/frontend/diffs/store/getters_versions_dropdowns_spec.js
+spec/frontend/diffs/store/utils_spec.js
+spec/frontend/diffs/utils/uuids_spec.js
+spec/frontend/dirty_submit/dirty_submit_collection_spec.js
+spec/frontend/dirty_submit/dirty_submit_form_spec.js
+
+## exciting-driscoll
+spec/frontend/droplab/drop_down_spec.js
+spec/frontend/droplab/plugins/ajax_filter_spec.js
+spec/frontend/editor/editor_lite_extension_base_spec.js
+spec/frontend/editor/editor_lite_spec.js
+spec/frontend/editor/editor_markdown_ext_spec.js
+spec/frontend/emoji/emoji_spec.js
+spec/frontend/environment.js
+spec/frontend/environments/environment_actions_spec.js
+spec/frontend/environments/environment_table_spec.js
+spec/frontend/environments/environment_terminal_button_spec.js
+spec/frontend/environments/folder/environments_folder_view_spec.js
+spec/frontend/error_tracking/components/error_details_spec.js
+spec/frontend/error_tracking/components/error_tracking_list_spec.js
+spec/frontend/error_tracking/store/actions_spec.js
+spec/frontend/error_tracking/store/details/actions_spec.js
+spec/frontend/error_tracking/store/list/actions_spec.js
+spec/frontend/error_tracking_settings/store/actions_spec.js
+spec/frontend/feature_flags/components/configure_feature_flags_modal_spec.js
+spec/frontend/feature_flags/components/edit_feature_flag_spec.js
+spec/frontend/feature_flags/components/environments_dropdown_spec.js
+spec/frontend/feature_flags/components/feature_flags_spec.js
+spec/frontend/feature_flags/components/form_spec.js
+spec/frontend/feature_flags/components/new_environments_dropdown_spec.js
+spec/frontend/feature_flags/components/strategies/gitlab_user_list_spec.js
+spec/frontend/feature_flags/components/user_lists_table_spec.js
+spec/frontend/feature_flags/store/edit/actions_spec.js
+spec/frontend/feature_flags/store/index/actions_spec.js
+spec/frontend/feature_flags/store/index/mutations_spec.js
+spec/frontend/feature_flags/store/new/actions_spec.js
+spec/frontend/feature_highlight/feature_highlight_helper_spec.js
+spec/frontend/filtered_search/components/recent_searches_dropdown_content_spec.js
+
+## determined-blackburn
+spec/frontend/filtered_search/filtered_search_manager_spec.js
+spec/frontend/filtered_search/filtered_search_token_keys_spec.js
+spec/frontend/filtered_search/filtered_search_visual_tokens_spec.js
+spec/frontend/filtered_search/issues_filtered_search_token_keys_spec.js
+spec/frontend/filtered_search/recent_searches_root_spec.js
+spec/frontend/filtered_search/services/recent_searches_service_spec.js
+spec/frontend/filtered_search/visual_token_value_spec.js
+spec/frontend/flash_spec.js
+spec/frontend/frequent_items/components/app_spec.js
+spec/frontend/frequent_items/components/frequent_items_list_item_spec.js
+spec/frontend/frequent_items/components/frequent_items_search_input_spec.js
+spec/frontend/frequent_items/store/actions_spec.js
+spec/frontend/gfm_auto_complete_spec.js
+spec/frontend/gl_field_errors_spec.js
+spec/frontend/gl_form_spec.js
+spec/frontend/gpg_badges_spec.js
+spec/frontend/group_settings/components/shared_runners_form_spec.js
+spec/frontend/groups/components/group_item_spec.js
+spec/frontend/groups/components/visibility_level_dropdown_spec.js
+spec/frontend/helpers/backoff_helper.js
+spec/frontend/helpers/dom_events_helper.js
+spec/frontend/helpers/dom_shims/size_properties.js
+spec/frontend/helpers/emoji.js
+spec/frontend/helpers/event_hub_factory_spec.js
+spec/frontend/helpers/fake_date.js
+spec/frontend/helpers/fake_request_animation_frame.js
+spec/frontend/helpers/fixtures.js
+spec/frontend/helpers/jest_helpers.js
+spec/frontend/helpers/local_storage_helper.js
+spec/frontend/helpers/locale_helper.js
+spec/frontend/helpers/mock_window_location_helper.js
+spec/frontend/helpers/set_timeout_promise_helper.js
+spec/frontend/helpers/set_window_location_helper_spec.js
+spec/frontend/helpers/startup_css_helper_spec.js
+spec/frontend/helpers/stub_children.js
+spec/frontend/helpers/text_helper.js
+spec/frontend/helpers/timeout.js
+spec/frontend/helpers/tracking_helper.js
+spec/frontend/helpers/vue_mock_directive.js
+spec/frontend/helpers/vue_test_utils_helper.js
+spec/frontend/helpers/vuex_action_helper.js
+spec/frontend/helpers/vuex_action_helper_spec.js
+spec/frontend/helpers/wait_for_promises.js
+spec/frontend/helpers/wait_using_real_timer.js
+
+## condescending-haslett
+spec/frontend/ide/components/activity_bar_spec.js
+spec/frontend/ide/components/branches/search_list_spec.js
+spec/frontend/ide/components/commit_sidebar/actions_spec.js
+spec/frontend/ide/components/commit_sidebar/list_item_spec.js
+spec/frontend/ide/components/commit_sidebar/list_spec.js
+spec/frontend/ide/components/commit_sidebar/message_field_spec.js
+spec/frontend/ide/components/commit_sidebar/new_merge_request_option_spec.js
+spec/frontend/ide/components/commit_sidebar/radio_group_spec.js
+spec/frontend/ide/components/commit_sidebar/success_message_spec.js
+spec/frontend/ide/components/error_message_spec.js
+spec/frontend/ide/components/file_row_extra_spec.js
+spec/frontend/ide/components/file_templates/bar_spec.js
+spec/frontend/ide/components/file_templates/dropdown_spec.js
+spec/frontend/ide/components/ide_sidebar_nav_spec.js
+spec/frontend/ide/components/ide_spec.js
+spec/frontend/ide/components/ide_status_bar_spec.js
+spec/frontend/ide/components/ide_status_mr_spec.js
+spec/frontend/ide/components/ide_tree_list_spec.js
+spec/frontend/ide/components/jobs/detail/scroll_button_spec.js
+spec/frontend/ide/components/jobs/detail_spec.js
+spec/frontend/ide/components/jobs/item_spec.js
+spec/frontend/ide/components/jobs/list_spec.js
+spec/frontend/ide/components/jobs/stage_spec.js
+spec/frontend/ide/components/merge_requests/list_spec.js
+spec/frontend/ide/components/nav_dropdown_button_spec.js
+spec/frontend/ide/components/nav_dropdown_spec.js
+spec/frontend/ide/components/new_dropdown/button_spec.js
+spec/frontend/ide/components/new_dropdown/index_spec.js
+spec/frontend/ide/components/new_dropdown/modal_spec.js
+spec/frontend/ide/components/new_dropdown/upload_spec.js
+spec/frontend/ide/components/panes/collapsible_sidebar_spec.js
+spec/frontend/ide/components/panes/right_spec.js
+
+## jovial-mirzakhani
+spec/frontend/ide/components/repo_commit_section_spec.js
+spec/frontend/ide/components/repo_editor_spec.js
+spec/frontend/ide/components/repo_tabs_spec.js
+spec/frontend/ide/components/resizable_panel_spec.js
+spec/frontend/ide/components/shared/tokened_input_spec.js
+spec/frontend/ide/components/terminal/session_spec.js
+spec/frontend/ide/components/terminal/terminal_controls_spec.js
+spec/frontend/ide/components/terminal/terminal_spec.js
+spec/frontend/ide/components/terminal_sync/terminal_sync_status_spec.js
+spec/frontend/ide/file_helpers.js
+spec/frontend/ide/helpers.js
+spec/frontend/ide/ide_router_extension_spec.js
+spec/frontend/ide/ide_router_spec.js
+spec/frontend/ide/lib/common/model_spec.js
+spec/frontend/ide/lib/create_diff_spec.js
+spec/frontend/ide/lib/create_file_diff_spec.js
+spec/frontend/ide/lib/diff/controller_spec.js
+spec/frontend/ide/lib/editor_spec.js
+spec/frontend/ide/lib/editorconfig/parser_spec.js
+spec/frontend/ide/lib/errors_spec.js
+spec/frontend/ide/lib/files_spec.js
+spec/frontend/ide/lib/mirror_spec.js
+spec/frontend/ide/services/index_spec.js
+spec/frontend/ide/stores/actions/file_spec.js
+spec/frontend/ide/stores/actions/merge_request_spec.js
+spec/frontend/ide/stores/actions/project_spec.js
+spec/frontend/ide/stores/actions/tree_spec.js
+spec/frontend/ide/stores/actions_spec.js
+spec/frontend/ide/stores/extend_spec.js
+spec/frontend/ide/stores/getters_spec.js
+spec/frontend/ide/stores/integration_spec.js
+
+## angry-bhabha
+spec/frontend/ide/stores/modules/branches/actions_spec.js
+spec/frontend/ide/stores/modules/branches/mutations_spec.js
+spec/frontend/ide/stores/modules/clientside/actions_spec.js
+spec/frontend/ide/stores/modules/commit/actions_spec.js
+spec/frontend/ide/stores/modules/commit/getters_spec.js
+spec/frontend/ide/stores/modules/file_templates/actions_spec.js
+spec/frontend/ide/stores/modules/merge_requests/actions_spec.js
+spec/frontend/ide/stores/modules/pane/actions_spec.js
+spec/frontend/ide/stores/modules/pipelines/actions_spec.js
+spec/frontend/ide/stores/modules/pipelines/mutations_spec.js
+spec/frontend/ide/stores/modules/terminal/actions/checks_spec.js
+spec/frontend/ide/stores/modules/terminal/actions/session_controls_spec.js
+spec/frontend/ide/stores/modules/terminal/actions/session_status_spec.js
+spec/frontend/ide/stores/modules/terminal_sync/actions_spec.js
+spec/frontend/ide/stores/mutations/file_spec.js
+spec/frontend/ide/sync_router_and_store_spec.js
+spec/frontend/ide/utils_spec.js
+spec/frontend/image_diff/init_discussion_tab_spec.js
+spec/frontend/image_diff/replaced_image_diff_spec.js
+spec/frontend/import_entities/import_groups/components/import_table_row_spec.js
+spec/frontend/import_entities/import_groups/graphql/client_factory_spec.js
+spec/frontend/import_entities/import_projects/components/import_projects_table_spec.js
+spec/frontend/import_entities/import_projects/components/provider_repo_table_row_spec.js
+spec/frontend/import_entities/import_projects/store/actions_spec.js
+spec/frontend/incidents_settings/components/incidents_settings_tabs_spec.js
+spec/frontend/integrations/edit/components/jira_issues_fields_spec.js
+spec/frontend/integrations/edit/components/jira_trigger_fields_spec.js
+spec/frontend/integrations/edit/components/trigger_fields_spec.js
+spec/frontend/issuable/related_issues/components/related_issues_block_spec.js
+spec/frontend/issuable_show/components/issuable_body_spec.js
+spec/frontend/issuable_show/components/issuable_edit_form_spec.js
+spec/frontend/issuable_show/components/issuable_header_spec.js
+spec/frontend/issuable_show/components/issuable_show_root_spec.js
+
+## practical-murdock
+spec/frontend/issuable_spec.js
+spec/frontend/issue_show/components/app_spec.js
+spec/frontend/issue_show/components/description_spec.js
+spec/frontend/issue_show/components/edit_actions_spec.js
+spec/frontend/issue_show/components/fields/description_spec.js
+spec/frontend/issue_show/components/form_spec.js
+spec/frontend/issue_show/components/header_actions_spec.js
+spec/frontend/issue_show/components/incidents/highlight_bar_spec.js
+spec/frontend/issue_show/components/pinned_links_spec.js
+spec/frontend/issue_show/issue_spec.js
+spec/frontend/issue_spec.js
+spec/frontend/issues_list/components/issuable_spec.js
+spec/frontend/issues_list/components/issuables_list_app_spec.js
+spec/frontend/jira_import/components/jira_import_form_spec.js
+spec/frontend/jira_import/components/jira_import_progress_spec.js
+spec/frontend/jira_import/components/jira_import_setup_spec.js
+spec/frontend/jobs/components/artifacts_block_spec.js
+spec/frontend/jobs/components/empty_state_spec.js
+spec/frontend/jobs/components/erased_block_spec.js
+spec/frontend/jobs/components/job_app_spec.js
+spec/frontend/jobs/components/job_container_item_spec.js
+spec/frontend/jobs/components/job_log_controllers_spec.js
+spec/frontend/jobs/components/log/line_spec.js
+spec/frontend/jobs/components/manual_variables_form_spec.js
+spec/frontend/jobs/components/stuck_block_spec.js
+spec/frontend/jobs/components/trigger_block_spec.js
+spec/frontend/jobs/store/actions_spec.js
+spec/frontend/jobs/store/helpers.js
+spec/frontend/lazy_loader_spec.js
+spec/frontend/lib/dompurify_spec.js
+spec/frontend/lib/utils/ajax_cache_spec.js
+spec/frontend/lib/utils/apollo_startup_js_link_spec.js
+spec/frontend/lib/utils/common_utils_spec.js
+spec/frontend/lib/utils/datetime_range_spec.js
+spec/frontend/lib/utils/datetime_utility_spec.js
+spec/frontend/lib/utils/dom_utils_spec.js
+spec/frontend/lib/utils/forms_spec.js
+spec/frontend/lib/utils/highlight_spec.js
+spec/frontend/lib/utils/icon_utils_spec.js
+spec/frontend/lib/utils/poll_spec.js
+spec/frontend/lib/utils/poll_until_complete_spec.js
+spec/frontend/lib/utils/text_utility_spec.js
+spec/frontend/lib/utils/url_utility_spec.js
+spec/frontend/lib/utils/users_cache_spec.js
+
+## determined-shamir
+spec/frontend/logs/components/environment_logs_spec.js
+spec/frontend/logs/components/log_advanced_filters_spec.js
+spec/frontend/logs/components/log_control_buttons_spec.js
+spec/frontend/logs/components/log_simple_filters_spec.js
+spec/frontend/logs/stores/actions_spec.js
+spec/frontend/logs/stores/mutations_spec.js
+spec/frontend/matchers.js
+spec/frontend/matchers_spec.js
+spec/frontend/members/components/avatars/user_avatar_spec.js
+spec/frontend/members/components/filter_sort/filter_sort_container_spec.js
+spec/frontend/members/components/filter_sort/members_filtered_search_bar_spec.js
+spec/frontend/members/components/filter_sort/sort_dropdown_spec.js
+spec/frontend/members/components/modals/remove_group_link_modal_spec.js
+spec/frontend/members/components/table/created_at_spec.js
+spec/frontend/members/components/table/expiration_datepicker_spec.js
+spec/frontend/members/components/table/expires_at_spec.js
+spec/frontend/members/components/table/member_avatar_spec.js
+spec/frontend/members/components/table/member_source_spec.js
+spec/frontend/members/components/table/members_table_spec.js
+spec/frontend/members/components/table/role_dropdown_spec.js
+spec/frontend/members/utils_spec.js
+spec/frontend/merge_request_spec.js
+spec/frontend/merge_request_tabs_spec.js
+spec/frontend/milestones/milestone_combobox_spec.js
+spec/frontend/mini_pipeline_graph_dropdown_spec.js
+spec/frontend/mocks/ce/lib/utils/axios_utils.js
+spec/frontend/mocks/mocks_helper.js
+spec/frontend/mocks/mocks_helper_spec.js
+spec/frontend/monitoring/alert_widget_spec.js
+spec/frontend/monitoring/components/charts/annotations_spec.js
+spec/frontend/monitoring/components/charts/anomaly_spec.js
+spec/frontend/monitoring/components/charts/bar_spec.js
+spec/frontend/monitoring/components/charts/column_spec.js
+spec/frontend/monitoring/components/charts/gauge_spec.js
+spec/frontend/monitoring/components/charts/options_spec.js
+spec/frontend/monitoring/components/charts/stacked_column_spec.js
+spec/frontend/monitoring/components/charts/time_series_spec.js
+
+## beautiful-benz
+spec/frontend/monitoring/components/dashboard_actions_menu_spec.js
+spec/frontend/monitoring/components/dashboard_header_spec.js
+spec/frontend/monitoring/components/dashboard_panel_spec.js
+spec/frontend/monitoring/components/dashboard_spec.js
+spec/frontend/monitoring/components/dashboards_dropdown_spec.js
+spec/frontend/monitoring/components/duplicate_dashboard_form_spec.js
+spec/frontend/monitoring/components/embeds/embed_group_spec.js
+spec/frontend/monitoring/components/graph_group_spec.js
+spec/frontend/monitoring/components/group_empty_state_spec.js
+spec/frontend/monitoring/components/links_section_spec.js
+spec/frontend/monitoring/components/refresh_button_spec.js
+spec/frontend/monitoring/components/variables/dropdown_field_spec.js
+spec/frontend/monitoring/fixture_data.js
+spec/frontend/monitoring/graph_data.js
+spec/frontend/monitoring/requests/index_spec.js
+spec/frontend/monitoring/store/actions_spec.js
+spec/frontend/monitoring/store/getters_spec.js
+spec/frontend/monitoring/store/mutations_spec.js
+spec/frontend/monitoring/store/utils_spec.js
+spec/frontend/monitoring/store_utils.js
+spec/frontend/monitoring/utils_spec.js
+spec/frontend/new_branch_spec.js
+spec/frontend/notebook/cells/code_spec.js
+spec/frontend/notebook/cells/output/index_spec.js
+spec/frontend/notebook/cells/prompt_spec.js
+spec/frontend/notebook/index_spec.js
+spec/frontend/notes/components/diff_discussion_header_spec.js
+spec/frontend/notes/components/discussion_counter_spec.js
+spec/frontend/notes/components/discussion_notes_spec.js
+spec/frontend/notes/components/discussion_resolve_button_spec.js
+spec/frontend/notes/components/multiline_comment_utils_spec.js
+spec/frontend/notes/components/note_actions_spec.js
+spec/frontend/notes/components/note_attachment_spec.js
+spec/frontend/notes/components/note_awards_list_spec.js
+spec/frontend/notes/components/note_body_spec.js
+spec/frontend/notes/components/note_form_spec.js
+spec/frontend/notes/components/note_header_spec.js
+spec/frontend/notes/components/noteable_discussion_spec.js
+spec/frontend/notes/components/noteable_note_spec.js
+spec/frontend/notes/components/notes_app_spec.js
+spec/frontend/notes/components/toggle_replies_widget_spec.js
+
+## admiring-elion
+spec/frontend/notes/helpers.js
+spec/frontend/notes/mixins/discussion_navigation_spec.js
+spec/frontend/notes/old_notes_spec.js
+spec/frontend/notes/stores/actions_spec.js
+spec/frontend/notes/stores/getters_spec.js
+spec/frontend/notes/stores/mutation_spec.js
+spec/frontend/oauth_remember_me_spec.js
+spec/frontend/packages/details/components/additional_metadata_spec.js
+spec/frontend/packages/details/components/package_history_spec.js
+spec/frontend/packages/details/store/actions_spec.js
+spec/frontend/packages/list/components/packages_sort_spec.js
+spec/frontend/packages/list/stores/actions_spec.js
+spec/frontend/packages/shared/components/package_path_spec.js
+spec/frontend/packages/shared/utils_spec.js
+spec/frontend/pager_spec.js
+spec/frontend/pages/admin/abuse_reports/abuse_reports_spec.js
+spec/frontend/pages/admin/application_settings/account_and_limits_spec.js
+spec/frontend/pages/admin/jobs/index/components/stop_jobs_modal_spec.js
+spec/frontend/pages/admin/users/components/delete_user_modal_spec.js
+spec/frontend/pages/admin/users/new/index_spec.js
+spec/frontend/pages/dashboard/todos/index/todos_spec.js
+spec/frontend/pages/import/bitbucket_server/components/bitbucket_server_status_table_spec.js
+spec/frontend/pages/labels/components/promote_label_modal_spec.js
+spec/frontend/pages/milestones/shared/components/delete_milestone_modal_spec.js
+spec/frontend/pages/milestones/shared/components/promote_milestone_modal_spec.js
+spec/frontend/pages/profiles/show/emoji_menu_spec.js
+spec/frontend/pages/projects/forks/new/components/fork_groups_list_item_spec.js
+spec/frontend/pages/projects/forks/new/components/fork_groups_list_spec.js
+spec/frontend/pages/projects/pipeline_schedules/shared/components/interval_pattern_input_spec.js
+spec/frontend/pages/projects/pipeline_schedules/shared/components/timezone_dropdown_spec.js
+spec/frontend/pages/projects/shared/permissions/components/project_feature_settings_spec.js
+spec/frontend/pages/projects/shared/permissions/components/settings_panel_spec.js
+
+## sweet-colden
+spec/frontend/pages/search/show/refresh_counts_spec.js
+spec/frontend/pages/sessions/new/preserve_url_fragment_spec.js
+spec/frontend/pages/sessions/new/signin_tabs_memoizer_spec.js
+spec/frontend/pdf/index_spec.js
+spec/frontend/pdf/page_spec.js
+spec/frontend/performance_bar/components/detailed_metric_spec.js
+spec/frontend/performance_bar/stores/performance_bar_store_spec.js
+spec/frontend/pipeline_editor/components/lint/ci_lint_spec.js
+spec/frontend/pipeline_editor/pipeline_editor_app_spec.js
+spec/frontend/pipeline_new/components/pipeline_new_form_spec.js
+spec/frontend/pipelines/components/dag/dag_graph_spec.js
+spec/frontend/pipelines/components/dag/dag_spec.js
+spec/frontend/pipelines/components/pipelines_filtered_search_spec.js
+spec/frontend/pipelines/graph/action_component_spec.js
+spec/frontend/pipelines/graph/graph_component_legacy_spec.js
+spec/frontend/pipelines/graph/job_item_spec.js
+spec/frontend/pipelines/graph/mock_data.js
+spec/frontend/pipelines/pipeline_graph/pipeline_graph_spec.js
+spec/frontend/pipelines/pipeline_url_spec.js
+spec/frontend/pipelines/pipelines_spec.js
+spec/frontend/pipelines/pipelines_table_row_spec.js
+spec/frontend/pipelines/pipelines_table_spec.js
+spec/frontend/pipelines/stores/pipeline_store_spec.js
+spec/frontend/pipelines/test_reports/stores/actions_spec.js
+spec/frontend/pipelines/test_reports/stores/getters_spec.js
+spec/frontend/pipelines/test_reports/test_suite_table_spec.js
+spec/frontend/pipelines/test_reports/test_summary_spec.js
+spec/frontend/pipelines/tokens/pipeline_trigger_author_token_spec.js
+spec/frontend/pipelines/unwrapping_utils_spec.js
+spec/frontend/profile/account/components/delete_account_modal_spec.js
+spec/frontend/project_find_file_spec.js
+
+## naughty-chebyshev
+spec/frontend/projects/experiment_new_project_creation/components/app_spec.js
+spec/frontend/projects/experiment_new_project_creation/components/legacy_container_spec.js
+spec/frontend/projects/experiment_new_project_creation/components/welcome_spec.js
+spec/frontend/projects/project_import_gitlab_project_spec.js
+spec/frontend/projects/settings/access_dropdown_spec.js
+spec/frontend/projects/settings_service_desk/services/service_desk_service_spec.js
+spec/frontend/prometheus_metrics/prometheus_metrics_spec.js
+spec/frontend/ref/components/ref_selector_spec.js
+spec/frontend/registry/explorer/components/delete_button_spec.js
+spec/frontend/registry/explorer/components/details_page/delete_alert_spec.js
+spec/frontend/registry/explorer/components/details_page/delete_modal_spec.js
+spec/frontend/registry/explorer/components/details_page/tags_list_spec.js
+spec/frontend/registry/explorer/components/list_page/image_list_row_spec.js
+spec/frontend/registry/explorer/components/registry_breadcrumb_spec.js
+spec/frontend/registry/explorer/mock_data.js
+spec/frontend/registry/explorer/pages/details_spec.js
+spec/frontend/registry/explorer/pages/list_spec.js
+spec/frontend/registry/settings/components/expiration_dropdown_spec.js
+spec/frontend/registry/settings/components/expiration_input_spec.js
+spec/frontend/registry/settings/components/expiration_run_text_spec.js
+spec/frontend/registry/settings/components/expiration_toggle_spec.js
+spec/frontend/registry/settings/components/registry_settings_app_spec.js
+spec/frontend/registry/settings/components/settings_form_spec.js
+spec/frontend/registry/settings/mock_data.js
+spec/frontend/related_merge_requests/components/related_merge_requests_spec.js
+spec/frontend/related_merge_requests/store/actions_spec.js
+spec/frontend/releases/components/app_edit_new_spec.js
+spec/frontend/releases/components/app_index_spec.js
+spec/frontend/releases/components/app_show_spec.js
+spec/frontend/releases/components/asset_links_form_spec.js
+spec/frontend/releases/components/issuable_stats_spec.js
+spec/frontend/releases/components/release_block_assets_spec.js
+spec/frontend/releases/components/release_block_milestone_info_spec.js
+spec/frontend/releases/components/releases_pagination_graphql_spec.js
+spec/frontend/releases/components/releases_pagination_rest_spec.js
+spec/frontend/releases/components/releases_pagination_spec.js
+spec/frontend/releases/components/tag_field_new_spec.js
+
+## competent-lichterman
+spec/frontend/releases/stores/modules/detail/actions_spec.js
+spec/frontend/releases/stores/modules/list/helpers.js
+spec/frontend/reports/accessibility_report/store/actions_spec.js
+spec/frontend/reports/codequality_report/store/actions_spec.js
+spec/frontend/reports/codequality_report/store/utils/codequality_comparison_spec.js
+spec/frontend/reports/components/grouped_issues_list_spec.js
+spec/frontend/reports/components/grouped_test_reports_app_spec.js
+spec/frontend/reports/components/issue_status_icon_spec.js
+spec/frontend/reports/components/report_section_spec.js
+spec/frontend/reports/store/actions_spec.js
+spec/frontend/right_sidebar_spec.js
+spec/frontend/search/index_spec.js
+spec/frontend/search/sidebar/components/app_spec.js
+spec/frontend/search/sidebar/components/confidentiality_filter_spec.js
+spec/frontend/search/sidebar/components/radio_filter_spec.js
+spec/frontend/search/sidebar/components/status_filter_spec.js
+spec/frontend/search/topbar/components/searchable_dropdown_spec.js
+spec/frontend/search_autocomplete_spec.js
+spec/frontend/self_monitor/store/actions_spec.js
+spec/frontend/sentry/sentry_config_spec.js
+spec/frontend/serverless/components/area_spec.js
+spec/frontend/serverless/components/function_row_spec.js
+spec/frontend/serverless/components/missing_prometheus_spec.js
+spec/frontend/serverless/components/pod_box_spec.js
+spec/frontend/serverless/components/url_spec.js
+spec/frontend/serverless/store/actions_spec.js
+spec/frontend/serverless/utils.js
+spec/frontend/set_status_modal/set_status_modal_wrapper_spec.js
+spec/frontend/shared/popover_spec.js
+spec/frontend/shortcuts_spec.js
+spec/frontend/sidebar/assignee_title_spec.js
+
+## exciting-buck
+spec/frontend/sidebar/components/assignees/collapsed_assignee_list_spec.js
+spec/frontend/sidebar/components/severity/severity_spec.js
+spec/frontend/sidebar/components/severity/sidebar_severity_spec.js
+spec/frontend/sidebar/components/time_tracking/time_tracker_spec.js
+spec/frontend/sidebar/confidential/edit_form_spec.js
+spec/frontend/sidebar/lock/edit_form_buttons_spec.js
+spec/frontend/sidebar/lock/edit_form_spec.js
+spec/frontend/sidebar/lock/issuable_lock_form_spec.js
+spec/frontend/sidebar/participants_spec.js
+spec/frontend/sidebar/reviewer_title_spec.js
+spec/frontend/sidebar/sidebar_mediator_spec.js
+spec/frontend/sidebar/sidebar_move_issue_spec.js
+spec/frontend/sidebar/subscriptions_spec.js
+spec/frontend/snippet/collapsible_input_spec.js
+spec/frontend/snippets/components/embed_dropdown_spec.js
+spec/frontend/snippets/components/snippet_blob_actions_edit_spec.js
+spec/frontend/snippets/components/snippet_visibility_edit_spec.js
+spec/frontend/snippets/utils/blob_spec.js
+spec/frontend/static_site_editor/components/edit_area_spec.js
+spec/frontend/static_site_editor/components/edit_meta_controls_spec.js
+spec/frontend/static_site_editor/graphql/resolvers/file_spec.js
+spec/frontend/static_site_editor/services/load_source_content_spec.js
+spec/frontend/static_site_editor/services/submit_content_changes_spec.js
+spec/frontend/syntax_highlight_spec.js
+spec/frontend/task_list_spec.js
+spec/frontend/tooltips/components/tooltips_spec.js
+spec/frontend/tooltips/index_spec.js
+spec/frontend/user_lists/components/add_user_modal_spec.js
+spec/frontend/user_lists/components/edit_user_list_spec.js
+spec/frontend/user_lists/components/new_user_list_spec.js
+spec/frontend/user_lists/components/user_list_spec.js
+
+## priceless-margulis
+spec/frontend/user_popovers_spec.js
+spec/frontend/vue_alerts_spec.js
+spec/frontend/vue_mr_widget/components/approvals/approvals_spec.js
+spec/frontend/vue_mr_widget/components/approvals/approvals_summary_spec.js
+spec/frontend/vue_mr_widget/components/artifacts_list_spec.js
+spec/frontend/vue_mr_widget/components/mr_collapsible_extension_spec.js
+spec/frontend/vue_mr_widget/components/mr_widget_alert_message_spec.js
+spec/frontend/vue_mr_widget/components/mr_widget_header_spec.js
+spec/frontend/vue_mr_widget/components/mr_widget_memory_usage_spec.js
+spec/frontend/vue_mr_widget/components/mr_widget_pipeline_container_spec.js
+spec/frontend/vue_mr_widget/components/mr_widget_pipeline_spec.js
+spec/frontend/vue_mr_widget/components/mr_widget_rebase_spec.js
+spec/frontend/vue_mr_widget/components/mr_widget_related_links_spec.js
+spec/frontend/vue_mr_widget/components/states/mr_widget_auto_merge_enabled_spec.js
+spec/frontend/vue_mr_widget/components/states/mr_widget_commits_header_spec.js
+spec/frontend/vue_mr_widget/components/states/mr_widget_conflicts_spec.js
+spec/frontend/vue_mr_widget/components/states/mr_widget_failed_to_merge_spec.js
+spec/frontend/vue_mr_widget/components/states/mr_widget_merged_spec.js
+spec/frontend/vue_mr_widget/components/states/mr_widget_missing_branch_spec.js
+spec/frontend/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js
+spec/frontend/vue_mr_widget/components/states/mr_widget_squash_before_merge_spec.js
+spec/frontend/vue_mr_widget/components/states/mr_widget_wip_spec.js
+spec/frontend/vue_mr_widget/components/terraform/mr_widget_terraform_container_spec.js
+spec/frontend/vue_mr_widget/components/terraform/terraform_plan_spec.js
+spec/frontend/vue_mr_widget/deployment/deployment_spec.js
+spec/frontend/vue_mr_widget/deployment/deployment_view_button_spec.js
+spec/frontend/vue_mr_widget/mr_widget_options_spec.js
+spec/frontend/vue_mr_widget/stores/artifacts_list/actions_spec.js
+spec/frontend/vue_mr_widget/stores/mr_widget_store_spec.js
+spec/frontend/vue_shared/components/actions_button_spec.js
+spec/frontend/vue_shared/components/alert_details_table_spec.js
+spec/frontend/vue_shared/components/awards_list_spec.js
+spec/frontend/vue_shared/components/ci_badge_link_spec.js
+spec/frontend/vue_shared/components/commit_spec.js
+spec/frontend/vue_shared/components/confirm_modal_spec.js
+
+## trusting-antonelli
+spec/frontend/vue_shared/components/content_viewer/viewers/markdown_viewer_spec.js
+spec/frontend/vue_shared/components/date_time_picker/date_time_picker_lib_spec.js
+spec/frontend/vue_shared/components/date_time_picker/date_time_picker_spec.js
+spec/frontend/vue_shared/components/deprecated_modal_2_spec.js
+spec/frontend/vue_shared/components/diff_viewer/diff_viewer_spec.js
+spec/frontend/vue_shared/components/diff_viewer/viewers/image_diff_viewer_spec.js
+spec/frontend/vue_shared/components/dismissible_container_spec.js
+spec/frontend/vue_shared/components/editor_lite_spec.js
+spec/frontend/vue_shared/components/expand_button_spec.js
+spec/frontend/vue_shared/components/file_finder/index_spec.js
+spec/frontend/vue_shared/components/file_finder/item_spec.js
+spec/frontend/vue_shared/components/file_tree_spec.js
+spec/frontend/vue_shared/components/filtered_search_bar/filtered_search_bar_root_spec.js
+spec/frontend/vue_shared/components/filtered_search_bar/store/modules/filters/test_helper.js
+spec/frontend/vue_shared/components/gl_countdown_spec.js
+spec/frontend/vue_shared/components/gl_modal_vuex_spec.js
+spec/frontend/vue_shared/components/issuable/issuable_header_warnings_spec.js
+spec/frontend/vue_shared/components/issue/issue_assignees_spec.js
+spec/frontend/vue_shared/components/issue/issue_milestone_spec.js
+spec/frontend/vue_shared/components/local_storage_sync_spec.js
+spec/frontend/vue_shared/components/markdown/apply_suggestion_spec.js
+spec/frontend/vue_shared/components/markdown/header_spec.js
+spec/frontend/vue_shared/components/markdown/suggestions_spec.js
+spec/frontend/vue_shared/components/markdown/toolbar_button_spec.js
+spec/frontend/vue_shared/components/notes/noteable_warning_spec.js
+spec/frontend/vue_shared/components/ordered_layout_spec.js
+spec/frontend/vue_shared/components/pagination_links_spec.js
+spec/frontend/vue_shared/components/project_avatar/default_spec.js
+spec/frontend/vue_shared/components/registry/details_row_spec.js
+spec/frontend/vue_shared/components/registry/list_item_spec.js
+spec/frontend/vue_shared/components/registry/metadata_item_spec.js
+spec/frontend/vue_shared/components/registry/title_area_spec.js
+
+## wizardly-agnesi
+spec/frontend/vue_shared/components/rich_content_editor/editor_service_spec.js
+spec/frontend/vue_shared/components/rich_content_editor/modals/add_image/upload_image_tab_spec.js
+spec/frontend/vue_shared/components/rich_content_editor/modals/insert_video_modal_spec.js
+spec/frontend/vue_shared/components/rich_content_editor/services/build_html_to_markdown_renderer_spec.js
+spec/frontend/vue_shared/components/rich_content_editor/services/renderers/mock_data.js
+spec/frontend/vue_shared/components/rich_content_editor/services/renderers/render_identifier_instance_text_spec.js
+spec/frontend/vue_shared/components/rich_content_editor/services/renderers/render_identifier_paragraph_spec.js
+spec/frontend/vue_shared/components/rich_content_editor/toolbar_item_spec.js
+spec/frontend/vue_shared/components/security_reports/help_icon_spec.js
+spec/frontend/vue_shared/components/security_reports/security_summary_spec.js
+spec/frontend/vue_shared/components/sidebar/collapsed_grouped_date_picker_spec.js
+spec/frontend/vue_shared/components/sidebar/labels_select/base_spec.js
+spec/frontend/vue_shared/components/sidebar/labels_select/dropdown_create_label_spec.js
+spec/frontend/vue_shared/components/sidebar/labels_select/dropdown_value_collapsed_spec.js
+spec/frontend/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_create_view_spec.js
+spec/frontend/vue_shared/components/sidebar/labels_select_vue/store/actions_spec.js
+spec/frontend/vue_shared/components/sidebar/labels_select_vue/store/mutations_spec.js
+spec/frontend/vue_shared/components/slot_switch_spec.js
+spec/frontend/vue_shared/components/split_button_spec.js
+spec/frontend/vue_shared/components/table_pagination_spec.js
+spec/frontend/vue_shared/components/tabs/tab_spec.js
+spec/frontend/vue_shared/components/tooltip_on_truncate_spec.js
+spec/frontend/vue_shared/components/user_avatar/user_avatar_link_spec.js
+spec/frontend/vue_shared/components/user_avatar/user_avatar_list_spec.js
+spec/frontend/vue_shared/components/user_popover/user_popover_spec.js
+spec/frontend/vue_shared/directives/validation_spec.js
+spec/frontend/vue_shared/security_reports/components/security_report_download_dropdown_spec.js
+spec/frontend/vue_shared/security_reports/security_reports_app_spec.js
+spec/frontend/vue_shared/security_reports/store/getters_spec.js
+spec/frontend/vue_shared/security_reports/store/modules/sast/actions_spec.js
+spec/frontend/vue_shared/security_reports/store/modules/secret_detection/actions_spec.js
+
+## upbeat-elion
+spec/frontend/vuex_shared/modules/modal/actions_spec.js
+spec/frontend/whats_new/components/app_spec.js
+spec/frontend/wikis_spec.js
+spec/frontend_integration/ide/ide_integration_spec.js
+spec/frontend_integration/test_helpers/fixtures.js
+spec/frontend_integration/test_helpers/mock_server/index.js
+spec/frontend_integration/test_helpers/mock_server/routes/404.js
+spec/frontend_integration/test_helpers/mock_server/routes/ci.js
+spec/frontend_integration/test_helpers/mock_server/routes/graphql.js
+spec/frontend_integration/test_helpers/mock_server/routes/index.js
+spec/frontend_integration/test_helpers/mock_server/routes/projects.js
+spec/frontend_integration/test_helpers/mock_server/routes/repository.js
+spec/frontend_integration/test_helpers/snapshot_serializer.js
+spec/javascripts/fly_out_nav_browser_spec.js
+spec/javascripts/lib/utils/browser_spec.js
+spec/javascripts/matchers.js
+spec/javascripts/test_bundle.js
diff --git a/.prettierrc b/.prettierrc
index 73988ef3f95..ace0e29d59b 100644
--- a/.prettierrc
+++ b/.prettierrc
@@ -1,6 +1,6 @@
{
"printWidth": 100,
"singleQuote": true,
- "arrowParens": "avoid",
+ "arrowParens": "always",
"trailingComma": "all"
}
diff --git a/app/assets/javascripts/boards/boards_util.js b/app/assets/javascripts/boards/boards_util.js
index 04ca65b4a8b..55dc155df0c 100644
--- a/app/assets/javascripts/boards/boards_util.js
+++ b/app/assets/javascripts/boards/boards_util.js
@@ -1,5 +1,4 @@
import { sortBy } from 'lodash';
-import axios from '~/lib/utils/axios_utils';
import { ListType } from './constants';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
@@ -121,15 +120,6 @@ export function moveIssueListHelper(issue, fromList, toList) {
return updatedIssue;
}
-export function getBoardsPath(endpoint, board) {
- const path = `${endpoint}${board.id ? `/${board.id}` : ''}.json`;
-
- if (board.id) {
- return axios.put(path, { board });
- }
- return axios.post(path, { board });
-}
-
export function isListDraggable(list) {
return list.listType !== ListType.backlog && list.listType !== ListType.closed;
}
@@ -146,6 +136,5 @@ export default {
fullBoardId,
fullLabelId,
fullIterationId,
- getBoardsPath,
isListDraggable,
};
diff --git a/app/assets/javascripts/boards/components/board_configuration_options.vue b/app/assets/javascripts/boards/components/board_configuration_options.vue
index 99d1e4a2611..b8ee930a8c9 100644
--- a/app/assets/javascripts/boards/components/board_configuration_options.vue
+++ b/app/assets/javascripts/boards/components/board_configuration_options.vue
@@ -6,36 +6,13 @@ export default {
GlFormCheckbox,
},
props: {
- currentBoard: {
- type: Object,
- required: true,
- },
- board: {
- type: Object,
+ hideBacklogList: {
+ type: Boolean,
required: true,
},
- isNewForm: {
+ hideClosedList: {
type: Boolean,
- required: false,
- default: false,
- },
- },
- data() {
- const { hide_backlog_list: hideBacklogList, hide_closed_list: hideClosedList } = this.isNewForm
- ? this.board
- : this.currentBoard;
-
- return {
- hideClosedList,
- hideBacklogList,
- };
- },
- methods: {
- changeClosedList(checked) {
- this.board.hideClosedList = !checked;
- },
- changeBacklogList(checked) {
- this.board.hideBacklogList = !checked;
+ required: true,
},
},
};
@@ -52,13 +29,13 @@ export default {
<gl-form-checkbox
:checked="!hideBacklogList"
data-testid="backlog-list-checkbox"
- @change="changeBacklogList"
+ @change="$emit('update:hideBacklogList', !hideBacklogList)"
>{{ __('Show the Open list') }}
</gl-form-checkbox>
<gl-form-checkbox
:checked="!hideClosedList"
data-testid="closed-list-checkbox"
- @change="changeClosedList"
+ @change="$emit('update:hideClosedList', !hideClosedList)"
>{{ __('Show the Closed list') }}
</gl-form-checkbox>
</div>
diff --git a/app/assets/javascripts/boards/components/board_form.vue b/app/assets/javascripts/boards/components/board_form.vue
index 7507874e951..78e94638cac 100644
--- a/app/assets/javascripts/boards/components/board_form.vue
+++ b/app/assets/javascripts/boards/components/board_form.vue
@@ -1,14 +1,15 @@
<script>
import { GlModal } from '@gitlab/ui';
-import { pick } from 'lodash';
import { __, s__ } from '~/locale';
import { deprecatedCreateFlash as Flash } from '~/flash';
-import { visitUrl } from '~/lib/utils/url_utility';
+import { visitUrl, stripFinalUrlSegment } from '~/lib/utils/url_utility';
+import { getIdFromGraphQLId, convertToGraphQLId } from '~/graphql_shared/utils';
import boardsStore from '~/boards/stores/boards_store';
-import { fullBoardId, getBoardsPath } from '../boards_util';
+import { fullLabelId, fullBoardId } from '../boards_util';
import BoardConfigurationOptions from './board_configuration_options.vue';
-import createBoardMutation from '../graphql/board.mutation.graphql';
+import updateBoardMutation from '../graphql/board_update.mutation.graphql';
+import createBoardMutation from '../graphql/board_create.mutation.graphql';
const boardDefaults = {
id: false,
@@ -91,8 +92,8 @@ export default {
},
},
inject: {
- endpoints: {
- default: {},
+ fullPath: {
+ default: '',
},
},
data() {
@@ -155,14 +156,38 @@ export default {
text: this.$options.i18n.cancelButtonText,
};
},
- boardPayload() {
- const { assignee, milestone, labels } = this.board;
- return {
- ...this.board,
- assignee_id: assignee?.id,
- milestone_id: milestone?.id,
- label_ids: labels.length ? labels.map(b => b.id) : [''],
+ currentMutation() {
+ return this.board.id ? updateBoardMutation : createBoardMutation;
+ },
+ mutationVariables() {
+ const { board } = this;
+ /* eslint-disable @gitlab/require-i18n-strings */
+ const baseMutationVariables = {
+ name: board.name,
+ weight: board.weight,
+ assigneeId: board.assignee?.id ? convertToGraphQLId('User', board.assignee.id) : null,
+ milestoneId:
+ board.milestone?.id || board.milestone?.id === 0
+ ? convertToGraphQLId('Milestone', board.milestone.id)
+ : null,
+ labelIds: board.labels.map(fullLabelId),
+ hideBacklogList: board.hide_backlog_list,
+ hideClosedList: board.hide_closed_list,
+ iterationId: board.iteration_id
+ ? convertToGraphQLId('Iteration', board.iteration_id)
+ : null,
};
+ /* eslint-enable @gitlab/require-i18n-strings */
+ return board.id
+ ? {
+ ...baseMutationVariables,
+ id: fullBoardId(board.id),
+ }
+ : {
+ ...baseMutationVariables,
+ projectPath: this.projectId ? this.fullPath : null,
+ groupPath: this.groupId ? this.fullPath : null,
+ };
},
},
mounted() {
@@ -175,55 +200,39 @@ export default {
setIteration(iterationId) {
this.board.iteration_id = iterationId;
},
- callBoardMutation(id) {
- return this.$apollo.mutate({
- mutation: createBoardMutation,
- variables: {
- ...pick(this.boardPayload, ['hideClosedList', 'hideBacklogList']),
- id,
- },
+ async createOrUpdateBoard() {
+ const response = await this.$apollo.mutate({
+ mutation: this.currentMutation,
+ variables: { input: this.mutationVariables },
});
- },
- async updateBoard() {
- const responses = await Promise.all([
- // Remove unnecessary REST API call when https://gitlab.com/gitlab-org/gitlab/-/issues/282299#note_462996301 is resolved
- getBoardsPath(this.endpoints.boardsEndpoint, this.boardPayload),
- this.callBoardMutation(fullBoardId(this.boardPayload.id)),
- ]);
- return responses[0].data;
+ return this.board.id
+ ? getIdFromGraphQLId(response.data.updateBoard.board.id)
+ : getIdFromGraphQLId(response.data.createBoard.board.id);
},
- async createBoard() {
- // TODO: change this to use `createBoard` mutation https://gitlab.com/gitlab-org/gitlab/-/issues/292466 is resolved
- const boardData = await getBoardsPath(this.endpoints.boardsEndpoint, this.boardPayload);
- this.callBoardMutation(fullBoardId(boardData.data.id));
-
- return boardData.data || boardData;
- },
- submit() {
+ async submit() {
if (this.board.name.length === 0) return;
this.isLoading = true;
if (this.isDeleteForm) {
- boardsStore
- .deleteBoard(this.currentBoard)
- .then(() => {
- this.isLoading = false;
- visitUrl(boardsStore.rootPath);
- })
- .catch(() => {
- Flash(this.$options.i18n.deleteErrorMessage);
- this.isLoading = false;
- });
+ try {
+ await boardsStore.deleteBoard(this.currentBoard);
+ visitUrl(boardsStore.rootPath);
+ } catch {
+ Flash(this.$options.i18n.deleteErrorMessage);
+ } finally {
+ this.isLoading = false;
+ }
} else {
- const boardAction = this.boardPayload.id ? this.updateBoard : this.createBoard;
- boardAction()
- .then(data => {
- visitUrl(data.board_path);
- })
- .catch(() => {
- Flash(this.$options.i18n.saveErrorMessage);
- this.isLoading = false;
- });
+ try {
+ const path = await this.createOrUpdateBoard();
+ const strippedUrl = stripFinalUrlSegment(window.location.href);
+ const url = strippedUrl.includes('boards') ? `${path}` : `boards/${path}`;
+ visitUrl(url);
+ } catch {
+ Flash(this.$options.i18n.saveErrorMessage);
+ } finally {
+ this.isLoading = false;
+ }
}
},
cancel() {
@@ -277,9 +286,8 @@ export default {
</div>
<board-configuration-options
- :is-new-form="isNewForm"
- :board="board"
- :current-board="currentBoard"
+ :hide-backlog-list.sync="board.hide_backlog_list"
+ :hide-closed-list.sync="board.hide_closed_list"
/>
<board-scope
diff --git a/app/assets/javascripts/boards/graphql/board.mutation.graphql b/app/assets/javascripts/boards/graphql/board.mutation.graphql
deleted file mode 100644
index fc3bb2285ee..00000000000
--- a/app/assets/javascripts/boards/graphql/board.mutation.graphql
+++ /dev/null
@@ -1,11 +0,0 @@
-mutation UpdateBoard($id: BoardID!, $hideClosedList: Boolean, $hideBacklogList: Boolean) {
- updateBoard(
- input: { id: $id, hideClosedList: $hideClosedList, hideBacklogList: $hideBacklogList }
- ) {
- board {
- id
- hideClosedList
- hideBacklogList
- }
- }
-}
diff --git a/app/assets/javascripts/boards/graphql/board_create.mutation.graphql b/app/assets/javascripts/boards/graphql/board_create.mutation.graphql
new file mode 100644
index 00000000000..e26d67dcc0e
--- /dev/null
+++ b/app/assets/javascripts/boards/graphql/board_create.mutation.graphql
@@ -0,0 +1,7 @@
+mutation createBoard($input: CreateBoardInput!) {
+ createBoard(input: $input) {
+ board {
+ id
+ }
+ }
+}
diff --git a/app/assets/javascripts/boards/graphql/board_update.mutation.graphql b/app/assets/javascripts/boards/graphql/board_update.mutation.graphql
new file mode 100644
index 00000000000..6b4ea2bef1a
--- /dev/null
+++ b/app/assets/javascripts/boards/graphql/board_update.mutation.graphql
@@ -0,0 +1,9 @@
+mutation UpdateBoard($input: UpdateBoardInput!) {
+ updateBoard(input: $input) {
+ board {
+ id
+ hideClosedList
+ hideBacklogList
+ }
+ }
+}
diff --git a/app/assets/javascripts/boards/index.js b/app/assets/javascripts/boards/index.js
index 37248f0400b..fac26c54519 100644
--- a/app/assets/javascripts/boards/index.js
+++ b/app/assets/javascripts/boards/index.js
@@ -335,7 +335,6 @@ export default () => {
}
mountMultipleBoardsSwitcher({
- boardsEndpoint: $boardApp.dataset.boardsEndpoint,
- recentBoardsEndpoint: $boardApp.dataset.recentBoardsEndpoint,
+ fullPath: $boardApp.dataset.fullPath,
});
};
diff --git a/app/assets/javascripts/boards/mount_multiple_boards_switcher.js b/app/assets/javascripts/boards/mount_multiple_boards_switcher.js
index df65ebb7526..71463010898 100644
--- a/app/assets/javascripts/boards/mount_multiple_boards_switcher.js
+++ b/app/assets/javascripts/boards/mount_multiple_boards_switcher.js
@@ -10,7 +10,7 @@ const apolloProvider = new VueApollo({
defaultClient: createDefaultClient(),
});
-export default (endpoints = {}) => {
+export default (params = {}) => {
const boardsSwitcherElement = document.getElementById('js-multiple-boards-switcher');
return new Vue({
el: boardsSwitcherElement,
@@ -36,7 +36,7 @@ export default (endpoints = {}) => {
return { boardsSelectorProps };
},
provide: {
- endpoints,
+ fullPath: params.fullPath,
},
render(createElement) {
return createElement(BoardsSelector, {
diff --git a/app/assets/javascripts/tooltips/components/tooltips.vue b/app/assets/javascripts/tooltips/components/tooltips.vue
index 05927006ea6..15fc84368b2 100644
--- a/app/assets/javascripts/tooltips/components/tooltips.vue
+++ b/app/assets/javascripts/tooltips/components/tooltips.vue
@@ -50,7 +50,8 @@ export default {
addTooltips(elements, config) {
const newTooltips = elements
.filter(element => !this.tooltipExists(element))
- .map(element => newTooltip(element, config));
+ .map(element => newTooltip(element, config))
+ .filter(tooltip => tooltip.title);
newTooltips.forEach(tooltip => this.observe(tooltip));
@@ -93,6 +94,9 @@ export default {
return this.tooltips.find(tooltip => tooltip.target === element);
},
},
+ safeHtmlConfig: {
+ ADD_TAGS: ['gl-emoji'],
+ },
};
</script>
<template>
@@ -110,7 +114,7 @@ export default {
:disabled="tooltip.disabled"
:show="tooltip.show"
>
- <span v-if="tooltip.html" v-safe-html="tooltip.title"></span>
+ <span v-if="tooltip.html" v-safe-html:[$options.safeHtmlConfig]="tooltip.title"></span>
<span v-else>{{ tooltip.title }}</span>
</gl-tooltip>
</div>
diff --git a/app/assets/javascripts/tooltips/index.js b/app/assets/javascripts/tooltips/index.js
index f7cad6639ae..335925aec5f 100644
--- a/app/assets/javascripts/tooltips/index.js
+++ b/app/assets/javascripts/tooltips/index.js
@@ -68,7 +68,7 @@ const invokeBootstrapApi = (elements, method) => {
}
};
-const isGlTooltipsEnabled = () => Boolean(window.gon.glTooltipsEnabled);
+const isGlTooltipsEnabled = () => Boolean(window.gon.features?.glTooltips);
const tooltipApiInvoker = ({ glHandler, bsHandler }) => (elements, ...params) => {
if (isGlTooltipsEnabled()) {
diff --git a/app/views/shared/wikis/_sidebar.html.haml b/app/views/shared/wikis/_sidebar.html.haml
index a906bf7aa63..4e9fdc8b95a 100644
--- a/app/views/shared/wikis/_sidebar.html.haml
+++ b/app/views/shared/wikis/_sidebar.html.haml
@@ -1,13 +1,23 @@
+- editing ||= false
+
%aside.right-sidebar.right-sidebar-expanded.wiki-sidebar.js-wiki-sidebar.js-right-sidebar{ data: { "offset-top" => "50", "spy" => "affix" } }
.sidebar-container
.block.wiki-sidebar-header.gl-mb-3.w-100
%a.gutter-toggle.float-right.d-block.d-md-none.js-sidebar-wiki-toggle{ href: "#" }
= sprite_icon('chevron-double-lg-right', css_class: 'gl-icon')
- - git_access_url = wiki_path(@wiki, action: :git_access)
- = link_to git_access_url, class: active_nav_link?(path: 'wikis#git_access') ? 'active' : '', data: { qa_selector: 'clone_repository_link' } do
- = sprite_icon('download', css_class: 'gl-mr-2')
- %span= _("Clone repository")
+ .gl-display-flex.gl-flex-wrap
+ - git_access_url = wiki_path(@wiki, action: :git_access)
+ = link_to git_access_url, class: 'gl-mr-5' + (active_nav_link?(path: 'wikis#git_access') ? ' active' : ''), data: { qa_selector: 'clone_repository_link' } do
+ = sprite_icon('download', css_class: 'gl-mr-2')
+ %span= _("Clone repository")
+
+ - if can?(current_user, :create_wiki, @wiki)
+ - edit_sidebar_url = wiki_page_path(@wiki, Wiki::SIDEBAR, action: :edit)
+ - link_class = (editing && @page&.slug == Wiki::SIDEBAR) ? 'active' : ''
+ = link_to edit_sidebar_url, class: link_class, data: { qa_selector: 'edit_sidebar_link' } do
+ = sprite_icon('pencil-square', css_class: 'gl-mr-2')
+ %span= _("Edit sidebar")
- if @sidebar_error.present?
= render 'shared/alert_info', body: s_('Wiki|The sidebar failed to load. You can reload the page to try again.')
diff --git a/app/views/shared/wikis/edit.html.haml b/app/views/shared/wikis/edit.html.haml
index 834749caaba..b289c018015 100644
--- a/app/views/shared/wikis/edit.html.haml
+++ b/app/views/shared/wikis/edit.html.haml
@@ -23,4 +23,4 @@
= render 'shared/wikis/form', uploads_path: wiki_attachment_upload_url
-= render 'shared/wikis/sidebar'
+= render 'shared/wikis/sidebar', editing: true
diff --git a/changelogs/unreleased/218997-fj-add-snippet-repository-moves-api-endpoints.yml b/changelogs/unreleased/218997-fj-add-snippet-repository-moves-api-endpoints.yml
new file mode 100644
index 00000000000..f757ffa8533
--- /dev/null
+++ b/changelogs/unreleased/218997-fj-add-snippet-repository-moves-api-endpoints.yml
@@ -0,0 +1,5 @@
+---
+title: Add snippet repository storage move API endpoints
+merge_request: 49228
+author:
+type: added
diff --git a/changelogs/unreleased/23109-add-wiki-edit-button.yml b/changelogs/unreleased/23109-add-wiki-edit-button.yml
new file mode 100644
index 00000000000..b5130d78b19
--- /dev/null
+++ b/changelogs/unreleased/23109-add-wiki-edit-button.yml
@@ -0,0 +1,5 @@
+---
+title: Add button to edit custom Wiki sidebar
+merge_request: 50323
+author: Frank Li
+type: changed
diff --git a/changelogs/unreleased/292902-move-to-createboard-mutation-instead-of-rest-api-call-updateboard.yml b/changelogs/unreleased/292902-move-to-createboard-mutation-instead-of-rest-api-call-updateboard.yml
new file mode 100644
index 00000000000..5dcbc79a54e
--- /dev/null
+++ b/changelogs/unreleased/292902-move-to-createboard-mutation-instead-of-rest-api-call-updateboard.yml
@@ -0,0 +1,6 @@
+---
+title: "[RUN-AS-IF-FOSS] Move to `createBoard` mutation instead of REST API call +
+ `updateBoard`"
+merge_request: 50171
+author:
+type: changed
diff --git a/config/feature_flags/development/gl_tooltips.yml b/config/feature_flags/development/gl_tooltips.yml
new file mode 100644
index 00000000000..22c67019c33
--- /dev/null
+++ b/config/feature_flags/development/gl_tooltips.yml
@@ -0,0 +1,8 @@
+---
+name: gl_tooltips
+introduced_by_url:
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/292972
+milestone: '13.8'
+type: development
+group: group::editor
+default_enabled: false
diff --git a/doc/user/project/wiki/index.md b/doc/user/project/wiki/index.md
index 7802f2ba95e..779179a6665 100644
--- a/doc/user/project/wiki/index.md
+++ b/doc/user/project/wiki/index.md
@@ -204,13 +204,11 @@ otherwise they will not display when pushed to GitLab:
## Customizing sidebar
-On the project's Wiki page, there is a right side navigation that renders the full Wiki pages list by default, with hierarchy.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/23109) in GitLab 13.8, the sidebar can be customized by clicking the **Edit sidebar** button.
-To customize the sidebar, you can create a file named `_sidebar` to fully replace the default navigation.
+To customize the Wiki's navigation sidebar, you need Developer permissions to the project.
-WARNING:
-Unless you link the `_sidebar` file from your custom nav, to edit it you'll have to access it directly
-from the browser's address bar by typing: `https://gitlab.com/<namespace>/<project_name>/-/wikis/_sidebar` (for self-managed GitLab instances, replace `gitlab.com` with your instance's URL).
+On the top-right, click **Edit sidebar** and make your changes. This creates a wiki page named `_sidebar` which fully replaces the default sidebar navigation.
Example for `_sidebar` (using Markdown format):
diff --git a/lib/api/api.rb b/lib/api/api.rb
index 06c2b46a2f2..adb9a431e01 100644
--- a/lib/api/api.rb
+++ b/lib/api/api.rb
@@ -251,6 +251,7 @@ module API
mount ::API::Services
mount ::API::Settings
mount ::API::SidekiqMetrics
+ mount ::API::SnippetRepositoryStorageMoves
mount ::API::Snippets
mount ::API::Statistics
mount ::API::Submodules
diff --git a/lib/api/snippet_repository_storage_moves.rb b/lib/api/snippet_repository_storage_moves.rb
new file mode 100644
index 00000000000..1a5b41eb1ec
--- /dev/null
+++ b/lib/api/snippet_repository_storage_moves.rb
@@ -0,0 +1,110 @@
+# frozen_string_literal: true
+
+module API
+ class SnippetRepositoryStorageMoves < ::API::Base
+ include PaginationParams
+
+ before { authenticated_as_admin! }
+
+ feature_category :gitaly
+
+ resource :snippet_repository_storage_moves do
+ desc 'Get a list of all snippet repository storage moves' do
+ detail 'This feature was introduced in GitLab 13.8.'
+ success Entities::SnippetRepositoryStorageMove
+ end
+ params do
+ use :pagination
+ end
+ get do
+ storage_moves = SnippetRepositoryStorageMove.order_created_at_desc
+
+ present paginate(storage_moves), with: Entities::SnippetRepositoryStorageMove, current_user: current_user
+ end
+
+ desc 'Get a snippet repository storage move' do
+ detail 'This feature was introduced in GitLab 13.8.'
+ success Entities::SnippetRepositoryStorageMove
+ end
+ params do
+ requires :repository_storage_move_id, type: Integer, desc: 'The ID of a snippet repository storage move'
+ end
+ get ':repository_storage_move_id' do
+ storage_move = SnippetRepositoryStorageMove.find(params[:repository_storage_move_id])
+
+ present storage_move, with: Entities::SnippetRepositoryStorageMove, current_user: current_user
+ end
+
+ desc 'Schedule bulk snippet repository storage moves' do
+ detail 'This feature was introduced in GitLab 13.8.'
+ end
+ params do
+ requires :source_storage_name, type: String, desc: 'The source storage shard', values: -> { Gitlab.config.repositories.storages.keys }
+ optional :destination_storage_name, type: String, desc: 'The destination storage shard', values: -> { Gitlab.config.repositories.storages.keys }
+ end
+ post do
+ ::Snippets::ScheduleBulkRepositoryShardMovesService.enqueue(
+ declared_params[:source_storage_name],
+ declared_params[:destination_storage_name]
+ )
+
+ accepted!
+ end
+ end
+
+ params do
+ requires :id, type: String, desc: 'The ID of a snippet'
+ end
+ resource :snippets do
+ helpers do
+ def user_snippet
+ Snippet.find_by(id: params[:id]) # rubocop: disable CodeReuse/ActiveRecord
+ end
+ end
+ desc 'Get a list of all snippets repository storage moves' do
+ detail 'This feature was introduced in GitLab 13.8.'
+ success Entities::SnippetRepositoryStorageMove
+ end
+ params do
+ use :pagination
+ end
+ get ':id/repository_storage_moves' do
+ storage_moves = user_snippet.repository_storage_moves.order_created_at_desc
+
+ present paginate(storage_moves), with: Entities::SnippetRepositoryStorageMove, current_user: current_user
+ end
+
+ desc 'Get a snippet repository storage move' do
+ detail 'This feature was introduced in GitLab 13.8.'
+ success Entities::SnippetRepositoryStorageMove
+ end
+ params do
+ requires :repository_storage_move_id, type: Integer, desc: 'The ID of a snippet repository storage move'
+ end
+ get ':id/repository_storage_moves/:repository_storage_move_id' do
+ storage_move = user_snippet.repository_storage_moves.find(params[:repository_storage_move_id])
+
+ present storage_move, with: Entities::SnippetRepositoryStorageMove, current_user: current_user
+ end
+
+ desc 'Schedule a snippet repository storage move' do
+ detail 'This feature was introduced in GitLab 13.8.'
+ success Entities::SnippetRepositoryStorageMove
+ end
+ params do
+ optional :destination_storage_name, type: String, desc: 'The destination storage shard'
+ end
+ post ':id/repository_storage_moves' do
+ storage_move = user_snippet.repository_storage_moves.build(
+ declared_params.merge(source_storage_name: user_snippet.repository_storage)
+ )
+
+ if storage_move.schedule
+ present storage_move, with: Entities::SnippetRepositoryStorageMove, current_user: current_user
+ else
+ render_validation_error!(storage_move)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/gon_helper.rb b/lib/gitlab/gon_helper.rb
index 362da8ea53e..10e8f00874d 100644
--- a/lib/gitlab/gon_helper.rb
+++ b/lib/gitlab/gon_helper.rb
@@ -48,6 +48,7 @@ module Gitlab
push_frontend_feature_flag(:snippets_binary_blob, default_enabled: false)
push_frontend_feature_flag(:usage_data_api, default_enabled: true)
push_frontend_feature_flag(:security_auto_fix, default_enabled: false)
+ push_frontend_feature_flag(:gl_tooltips, default_enabled: :yaml)
# Startup CSS feature is a special one as it can be enabled by means of cookies and params
gon.push({ features: { 'startupCss' => use_startup_css? } }, true)
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 48eb4cc2812..815833b3d36 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -4478,7 +4478,7 @@ msgstr ""
msgid "BillingPlan|Upgrade"
msgstr ""
-msgid "Billing|An email address is only visible for users managed through Group Managed Accounts."
+msgid "Billing|An email address is only visible for users with public emails."
msgstr ""
msgid "Billing|An error occurred while loading billable members list"
@@ -8180,6 +8180,84 @@ msgstr ""
msgid "CreateTokenToCloneLink|create a personal access token"
msgstr ""
+msgid "CreateValueStreamForm|%{name} (default)"
+msgstr ""
+
+msgid "CreateValueStreamForm|Add stage"
+msgstr ""
+
+msgid "CreateValueStreamForm|All default stages are currently visible"
+msgstr ""
+
+msgid "CreateValueStreamForm|Default stages"
+msgstr ""
+
+msgid "CreateValueStreamForm|Editing stage"
+msgstr ""
+
+msgid "CreateValueStreamForm|End event"
+msgstr ""
+
+msgid "CreateValueStreamForm|End event label"
+msgstr ""
+
+msgid "CreateValueStreamForm|End event: "
+msgstr ""
+
+msgid "CreateValueStreamForm|Enter a name for the stage"
+msgstr ""
+
+msgid "CreateValueStreamForm|Enter stage name"
+msgstr ""
+
+msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
+msgstr ""
+
+msgid "CreateValueStreamForm|Name"
+msgstr ""
+
+msgid "CreateValueStreamForm|Name is required"
+msgstr ""
+
+msgid "CreateValueStreamForm|New stage"
+msgstr ""
+
+msgid "CreateValueStreamForm|Please select a start event first"
+msgstr ""
+
+msgid "CreateValueStreamForm|Recover hidden stage"
+msgstr ""
+
+msgid "CreateValueStreamForm|Restore stage"
+msgstr ""
+
+msgid "CreateValueStreamForm|Select end event"
+msgstr ""
+
+msgid "CreateValueStreamForm|Select start event"
+msgstr ""
+
+msgid "CreateValueStreamForm|Stage %{index}"
+msgstr ""
+
+msgid "CreateValueStreamForm|Stage name already exists"
+msgstr ""
+
+msgid "CreateValueStreamForm|Start event"
+msgstr ""
+
+msgid "CreateValueStreamForm|Start event changed, please select a valid end event"
+msgstr ""
+
+msgid "CreateValueStreamForm|Start event label"
+msgstr ""
+
+msgid "CreateValueStreamForm|Start event: "
+msgstr ""
+
+msgid "CreateValueStreamForm|Update stage"
+msgstr ""
+
msgid "Created"
msgstr ""
@@ -8357,57 +8435,21 @@ msgstr ""
msgid "CustomCycleAnalytics|Add stage"
msgstr ""
-msgid "CustomCycleAnalytics|All default stages are currently visible"
-msgstr ""
-
-msgid "CustomCycleAnalytics|Default stages"
-msgstr ""
-
msgid "CustomCycleAnalytics|Editing stage"
msgstr ""
-msgid "CustomCycleAnalytics|End event"
-msgstr ""
-
msgid "CustomCycleAnalytics|End event label"
msgstr ""
-msgid "CustomCycleAnalytics|Enter a name for the stage"
-msgstr ""
-
-msgid "CustomCycleAnalytics|Name"
-msgstr ""
-
msgid "CustomCycleAnalytics|New stage"
msgstr ""
-msgid "CustomCycleAnalytics|Please select a start event first"
-msgstr ""
-
-msgid "CustomCycleAnalytics|Recover hidden stage"
-msgstr ""
-
-msgid "CustomCycleAnalytics|Select end event"
-msgstr ""
-
-msgid "CustomCycleAnalytics|Select start event"
-msgstr ""
-
msgid "CustomCycleAnalytics|Stage name already exists"
msgstr ""
-msgid "CustomCycleAnalytics|Start event"
-msgstr ""
-
-msgid "CustomCycleAnalytics|Start event changed, please select a valid end event"
-msgstr ""
-
msgid "CustomCycleAnalytics|Start event label"
msgstr ""
-msgid "CustomCycleAnalytics|Update stage"
-msgstr ""
-
msgid "Customer Portal"
msgstr ""
@@ -10284,6 +10326,9 @@ msgstr ""
msgid "Edit public deploy key"
msgstr ""
+msgid "Edit sidebar"
+msgstr ""
+
msgid "Edit stage"
msgstr ""
diff --git a/spec/fixtures/api/schemas/public_api/v4/snippet_repository_storage_move.json b/spec/fixtures/api/schemas/public_api/v4/snippet_repository_storage_move.json
new file mode 100644
index 00000000000..f51e7e8edc5
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/snippet_repository_storage_move.json
@@ -0,0 +1,20 @@
+{
+ "type": "object",
+ "required": [
+ "id",
+ "created_at",
+ "state",
+ "source_storage_name",
+ "destination_storage_name",
+ "snippet"
+ ],
+ "properties" : {
+ "id": { "type": "integer" },
+ "created_at": { "type": "date" },
+ "state": { "type": "string" },
+ "source_storage_name": { "type": "string" },
+ "destination_storage_name": { "type": "string" },
+ "snippet": { "type": "object" }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/snippet_repository_storage_moves.json b/spec/fixtures/api/schemas/public_api/v4/snippet_repository_storage_moves.json
new file mode 100644
index 00000000000..292bb335539
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/snippet_repository_storage_moves.json
@@ -0,0 +1,6 @@
+{
+ "type": "array",
+ "items": {
+ "$ref": "./snippet_repository_storage_move.json"
+ }
+}
diff --git a/spec/frontend/boards/components/board_configuration_options_spec.js b/spec/frontend/boards/components/board_configuration_options_spec.js
index e9a1cb6a4e8..d9614c254e2 100644
--- a/spec/frontend/boards/components/board_configuration_options_spec.js
+++ b/spec/frontend/boards/components/board_configuration_options_spec.js
@@ -3,38 +3,30 @@ import BoardConfigurationOptions from '~/boards/components/board_configuration_o
describe('BoardConfigurationOptions', () => {
let wrapper;
- const board = { hide_backlog_list: false, hide_closed_list: false };
const defaultProps = {
- currentBoard: board,
- board,
- isNewForm: false,
+ hideBacklogList: false,
+ hideClosedList: false,
};
- const createComponent = () => {
+ const createComponent = (props = {}) => {
wrapper = shallowMount(BoardConfigurationOptions, {
- propsData: { ...defaultProps },
+ propsData: { ...defaultProps, ...props },
});
};
- beforeEach(() => {
- createComponent();
- });
-
afterEach(() => {
wrapper.destroy();
});
- const backlogListCheckbox = el => el.find('[data-testid="backlog-list-checkbox"]');
- const closedListCheckbox = el => el.find('[data-testid="closed-list-checkbox"]');
+ const backlogListCheckbox = () => wrapper.find('[data-testid="backlog-list-checkbox"]');
+ const closedListCheckbox = () => wrapper.find('[data-testid="closed-list-checkbox"]');
const checkboxAssert = (backlogCheckbox, closedCheckbox) => {
- expect(backlogListCheckbox(wrapper).attributes('checked')).toEqual(
+ expect(backlogListCheckbox().attributes('checked')).toEqual(
backlogCheckbox ? undefined : 'true',
);
- expect(closedListCheckbox(wrapper).attributes('checked')).toEqual(
- closedCheckbox ? undefined : 'true',
- );
+ expect(closedListCheckbox().attributes('checked')).toEqual(closedCheckbox ? undefined : 'true');
};
it.each`
@@ -45,15 +37,28 @@ describe('BoardConfigurationOptions', () => {
${false} | ${false}
`(
'renders two checkbox when one is $backlogCheckboxValue and other is $closedCheckboxValue',
- async ({ backlogCheckboxValue, closedCheckboxValue }) => {
- await wrapper.setData({
+ ({ backlogCheckboxValue, closedCheckboxValue }) => {
+ createComponent({
hideBacklogList: backlogCheckboxValue,
hideClosedList: closedCheckboxValue,
});
-
- return wrapper.vm.$nextTick().then(() => {
- checkboxAssert(backlogCheckboxValue, closedCheckboxValue);
- });
+ checkboxAssert(backlogCheckboxValue, closedCheckboxValue);
},
);
+
+ it('emits a correct value on backlog checkbox change', () => {
+ createComponent();
+
+ backlogListCheckbox().vm.$emit('change');
+
+ expect(wrapper.emitted('update:hideBacklogList')).toEqual([[true]]);
+ });
+
+ it('emits a correct value on closed checkbox change', () => {
+ createComponent();
+
+ closedListCheckbox().vm.$emit('change');
+
+ expect(wrapper.emitted('update:hideClosedList')).toEqual([[true]]);
+ });
});
diff --git a/spec/frontend/boards/components/board_form_spec.js b/spec/frontend/boards/components/board_form_spec.js
index 3b15cbb6b7e..7b143f64e93 100644
--- a/spec/frontend/boards/components/board_form_spec.js
+++ b/spec/frontend/boards/components/board_form_spec.js
@@ -1,19 +1,18 @@
import { shallowMount } from '@vue/test-utils';
-import AxiosMockAdapter from 'axios-mock-adapter';
import { TEST_HOST } from 'jest/helpers/test_constants';
import { GlModal } from '@gitlab/ui';
import waitForPromises from 'helpers/wait_for_promises';
-import axios from '~/lib/utils/axios_utils';
import { visitUrl } from '~/lib/utils/url_utility';
import boardsStore from '~/boards/stores/boards_store';
import BoardForm from '~/boards/components/board_form.vue';
-import BoardConfigurationOptions from '~/boards/components/board_configuration_options.vue';
-import createBoardMutation from '~/boards/graphql/board.mutation.graphql';
+import updateBoardMutation from '~/boards/graphql/board_update.mutation.graphql';
+import createBoardMutation from '~/boards/graphql/board_create.mutation.graphql';
jest.mock('~/lib/utils/url_utility', () => ({
visitUrl: jest.fn().mockName('visitUrlMock'),
+ stripFinalUrlSegment: jest.requireActual('~/lib/utils/url_utility').stripFinalUrlSegment,
}));
const currentBoard = {
@@ -28,18 +27,6 @@ const currentBoard = {
hide_closed_list: false,
};
-const boardDefaults = {
- id: false,
- name: '',
- labels: [],
- milestone_id: undefined,
- assignee: {},
- assignee_id: undefined,
- weight: null,
- hide_backlog_list: false,
- hide_closed_list: false,
-};
-
const defaultProps = {
canAdminBoard: false,
labelsPath: `${TEST_HOST}/labels/path`,
@@ -51,18 +38,21 @@ const endpoints = {
boardsEndpoint: 'test-endpoint',
};
-const mutate = jest.fn().mockResolvedValue({});
+const mutate = jest.fn().mockResolvedValue({
+ data: {
+ createBoard: { board: { id: 'gid://gitlab/Board/123' } },
+ updateBoard: { board: { id: 'gid://gitlab/Board/321' } },
+ },
+});
describe('BoardForm', () => {
let wrapper;
- let axiosMock;
const findModal = () => wrapper.find(GlModal);
const findModalActionPrimary = () => findModal().props('actionPrimary');
const findForm = () => wrapper.find('[data-testid="board-form"]');
const findFormWrapper = () => wrapper.find('[data-testid="board-form-wrapper"]');
const findDeleteConfirmation = () => wrapper.find('[data-testid="delete-confirmation-message"]');
- const findConfigurationOptions = () => wrapper.find(BoardConfigurationOptions);
const findInput = () => wrapper.find('#board-new-name');
const createComponent = (props, data) => {
@@ -86,13 +76,12 @@ describe('BoardForm', () => {
};
beforeEach(() => {
- axiosMock = new AxiosMockAdapter(axios);
+ delete window.location;
});
afterEach(() => {
wrapper.destroy();
wrapper = null;
- axiosMock.restore();
boardsStore.state.currentPage = null;
});
@@ -145,7 +134,7 @@ describe('BoardForm', () => {
});
it('clears the form', () => {
- expect(findConfigurationOptions().props('board')).toEqual(boardDefaults);
+ expect(findInput().element.value).toBe('');
});
it('shows a correct title about creating a board', () => {
@@ -164,18 +153,9 @@ describe('BoardForm', () => {
it('renders form wrapper', () => {
expect(findFormWrapper().exists()).toBe(true);
});
-
- it('passes a true isNewForm prop to BoardConfigurationOptions component', () => {
- expect(findConfigurationOptions().props('isNewForm')).toBe(true);
- });
});
describe('when submitting a create event', () => {
- beforeEach(() => {
- const url = `${endpoints.boardsEndpoint}.json`;
- axiosMock.onPost(url).reply(200, { id: '2', board_path: 'new path' });
- });
-
it('does not call API if board name is empty', async () => {
createComponent({ canAdminBoard: true });
findInput().trigger('keyup.enter', { metaKey: true });
@@ -185,7 +165,8 @@ describe('BoardForm', () => {
expect(mutate).not.toHaveBeenCalled();
});
- it('calls REST and GraphQL API and redirects to correct page', async () => {
+ it('calls a correct GraphQL mutation and redirects to correct page from existing board', async () => {
+ window.location = new URL('https://test/boards/1');
createComponent({ canAdminBoard: true });
findInput().value = 'Test name';
@@ -194,19 +175,40 @@ describe('BoardForm', () => {
await waitForPromises();
- expect(axiosMock.history.post[0].data).toBe(
- JSON.stringify({ board: { ...boardDefaults, name: 'test', label_ids: [''] } }),
- );
+ expect(mutate).toHaveBeenCalledWith({
+ mutation: createBoardMutation,
+ variables: {
+ input: expect.objectContaining({
+ name: 'test',
+ }),
+ },
+ });
+
+ await waitForPromises();
+ expect(visitUrl).toHaveBeenCalledWith('123');
+ });
+
+ it('calls a correct GraphQL mutation and redirects to correct page from boards list', async () => {
+ window.location = new URL('https://test/boards');
+ createComponent({ canAdminBoard: true });
+
+ findInput().value = 'Test name';
+ findInput().trigger('input');
+ findInput().trigger('keyup.enter', { metaKey: true });
+
+ await waitForPromises();
expect(mutate).toHaveBeenCalledWith({
mutation: createBoardMutation,
variables: {
- id: 'gid://gitlab/Board/2',
+ input: expect.objectContaining({
+ name: 'test',
+ }),
},
});
await waitForPromises();
- expect(visitUrl).toHaveBeenCalledWith('new path');
+ expect(visitUrl).toHaveBeenCalledWith('boards/123');
});
});
});
@@ -222,7 +224,7 @@ describe('BoardForm', () => {
});
it('clears the form', () => {
- expect(findConfigurationOptions().props('board')).toEqual(currentBoard);
+ expect(findInput().element.value).toEqual(currentBoard.name);
});
it('shows a correct title about creating a board', () => {
@@ -241,35 +243,28 @@ describe('BoardForm', () => {
it('renders form wrapper', () => {
expect(findFormWrapper().exists()).toBe(true);
});
-
- it('passes a false isNewForm prop to BoardConfigurationOptions component', () => {
- expect(findConfigurationOptions().props('isNewForm')).toBe(false);
- });
});
describe('when submitting an update event', () => {
- beforeEach(() => {
- const url = endpoints.boardsEndpoint;
- axiosMock.onPut(url).reply(200, { board_path: 'new path' });
- });
-
it('calls REST and GraphQL API with correct parameters', async () => {
+ window.location = new URL('https://test/boards/1');
createComponent({ canAdminBoard: true });
findInput().trigger('keyup.enter', { metaKey: true });
await waitForPromises();
- expect(axiosMock.history.put[0].data).toBe(
- JSON.stringify({ board: { ...currentBoard, label_ids: [''] } }),
- );
-
expect(mutate).toHaveBeenCalledWith({
- mutation: createBoardMutation,
+ mutation: updateBoardMutation,
variables: {
- id: `gid://gitlab/Board/${currentBoard.id}`,
+ input: expect.objectContaining({
+ id: `gid://gitlab/Board/${currentBoard.id}`,
+ }),
},
});
+
+ await waitForPromises();
+ expect(visitUrl).toHaveBeenCalledWith('321');
});
});
});
diff --git a/spec/frontend/ide/components/pipelines/list_spec.js b/spec/frontend/ide/components/pipelines/list_spec.js
index 0238fff6aa9..a1fbfd96c31 100644
--- a/spec/frontend/ide/components/pipelines/list_spec.js
+++ b/spec/frontend/ide/components/pipelines/list_spec.js
@@ -1,4 +1,5 @@
-import { shallowMount, createLocalVue } from '@vue/test-utils';
+import { shallowMount } from '@vue/test-utils';
+import Vue from 'vue';
import Vuex from 'vuex';
import { GlLoadingIcon, GlTab } from '@gitlab/ui';
import { TEST_HOST } from 'helpers/test_constants';
@@ -8,8 +9,7 @@ import JobsList from '~/ide/components/jobs/list.vue';
import CiIcon from '~/vue_shared/components/ci_icon.vue';
import IDEServices from '~/ide/services';
-const localVue = createLocalVue();
-localVue.use(Vuex);
+Vue.use(Vuex);
jest.mock('~/ide/services', () => ({
pingUsage: jest.fn(),
@@ -59,9 +59,6 @@ describe('IDE pipelines list', () => {
failedStages: failedStagesGetterMock,
pipelineFailed: () => false,
},
- methods: {
- fetchLatestPipeline: jest.fn(),
- },
},
},
});
@@ -69,7 +66,6 @@ describe('IDE pipelines list', () => {
const createComponent = (state = {}, pipelinesState = {}) => {
wrapper = shallowMount(List, {
- localVue,
store: createStore(state, pipelinesState),
});
};
diff --git a/spec/frontend/tooltips/components/tooltips_spec.js b/spec/frontend/tooltips/components/tooltips_spec.js
index 50848ca2978..0b8c76db11d 100644
--- a/spec/frontend/tooltips/components/tooltips_spec.js
+++ b/spec/frontend/tooltips/components/tooltips_spec.js
@@ -51,6 +51,16 @@ describe('tooltips/components/tooltips.vue', () => {
expect(wrapper.find(GlTooltip).props('target')).toBe(target);
});
+ it('does not attach a tooltip to a target with empty title', async () => {
+ target.setAttribute('title', '');
+
+ wrapper.vm.addTooltips([target]);
+
+ await wrapper.vm.$nextTick();
+
+ expect(wrapper.find(GlTooltip).exists()).toBe(false);
+ });
+
it('does not attach a tooltip twice to the same element', async () => {
wrapper.vm.addTooltips([target]);
wrapper.vm.addTooltips([target]);
diff --git a/spec/frontend/tooltips/index_spec.js b/spec/frontend/tooltips/index_spec.js
index 511003fdb8f..86da1caab3e 100644
--- a/spec/frontend/tooltips/index_spec.js
+++ b/spec/frontend/tooltips/index_spec.js
@@ -42,7 +42,7 @@ describe('tooltips/index.js', () => {
};
beforeEach(() => {
- window.gon.glTooltipsEnabled = true;
+ window.gon.features = { glTooltips: true };
});
afterEach(() => {
@@ -149,7 +149,7 @@ describe('tooltips/index.js', () => {
describe('when glTooltipsEnabled feature flag is disabled', () => {
beforeEach(() => {
- window.gon.glTooltipsEnabled = false;
+ window.gon.features.glTooltips = false;
});
it.each`
diff --git a/spec/requests/api/graphql/user/starred_projects_query_spec.rb b/spec/requests/api/graphql/user/starred_projects_query_spec.rb
index b098058a735..6cb02068f2a 100644
--- a/spec/requests/api/graphql/user/starred_projects_query_spec.rb
+++ b/spec/requests/api/graphql/user/starred_projects_query_spec.rb
@@ -17,7 +17,13 @@ RSpec.describe 'Getting starredProjects of the user' do
let_it_be(:user, reload: true) { create(:user) }
let(:user_fields) { 'starredProjects { nodes { id } }' }
- let(:starred_projects) { graphql_data_at(:user, :starred_projects, :nodes) }
+ let(:current_user) { nil }
+
+ let(:starred_projects) do
+ post_graphql(query, current_user: current_user)
+
+ graphql_data_at(:user, :starred_projects, :nodes)
+ end
before do
project_b.add_reporter(user)
@@ -26,11 +32,13 @@ RSpec.describe 'Getting starredProjects of the user' do
user.toggle_star(project_a)
user.toggle_star(project_b)
user.toggle_star(project_c)
-
- post_graphql(query)
end
- it_behaves_like 'a working graphql query'
+ it_behaves_like 'a working graphql query' do
+ before do
+ post_graphql(query)
+ end
+ end
it 'found only public project' do
expect(starred_projects).to contain_exactly(
@@ -41,10 +49,6 @@ RSpec.describe 'Getting starredProjects of the user' do
context 'the current user is the user' do
let(:current_user) { user }
- before do
- post_graphql(query, current_user: current_user)
- end
-
it 'found all projects' do
expect(starred_projects).to contain_exactly(
a_hash_including('id' => global_id_of(project_a)),
@@ -56,11 +60,10 @@ RSpec.describe 'Getting starredProjects of the user' do
context 'the current user is a member of a private project the user starred' do
let_it_be(:other_user) { create(:user) }
+ let(:current_user) { other_user }
before do
project_b.add_reporter(other_user)
-
- post_graphql(query, current_user: other_user)
end
it 'finds public and member projects' do
@@ -74,7 +77,6 @@ RSpec.describe 'Getting starredProjects of the user' do
context 'the user has a private profile' do
before do
user.update!(private_profile: true)
- post_graphql(query, current_user: current_user)
end
context 'the current user does not have access to view the private profile of the user' do
diff --git a/spec/requests/api/project_repository_storage_moves_spec.rb b/spec/requests/api/project_repository_storage_moves_spec.rb
index 15e69c2aa16..5e200312d1f 100644
--- a/spec/requests/api/project_repository_storage_moves_spec.rb
+++ b/spec/requests/api/project_repository_storage_moves_spec.rb
@@ -3,220 +3,10 @@
require 'spec_helper'
RSpec.describe API::ProjectRepositoryStorageMoves do
- include AccessMatchersForRequest
-
- let_it_be(:user) { create(:admin) }
- let_it_be(:project) { create(:project, :repository).tap { |project| project.track_project_repository } }
- let_it_be(:storage_move) { create(:project_repository_storage_move, :scheduled, container: project) }
-
- shared_examples 'get single project repository storage move' do
- let(:project_repository_storage_move_id) { storage_move.id }
-
- def get_project_repository_storage_move
- get api(url, user)
- end
-
- it 'returns a project repository storage move' do
- get_project_repository_storage_move
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to match_response_schema('public_api/v4/project_repository_storage_move')
- expect(json_response['id']).to eq(storage_move.id)
- expect(json_response['state']).to eq(storage_move.human_state_name)
- end
-
- context 'non-existent project repository storage move' do
- let(:project_repository_storage_move_id) { non_existing_record_id }
-
- it 'returns not found' do
- get_project_repository_storage_move
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
- describe 'permissions' do
- it { expect { get_project_repository_storage_move }.to be_allowed_for(:admin) }
- it { expect { get_project_repository_storage_move }.to be_denied_for(:user) }
- end
- end
-
- shared_examples 'get project repository storage move list' do
- def get_project_repository_storage_moves
- get api(url, user)
- end
-
- it 'returns project repository storage moves' do
- get_project_repository_storage_moves
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to include_pagination_headers
- expect(response).to match_response_schema('public_api/v4/project_repository_storage_moves')
- expect(json_response.size).to eq(1)
- expect(json_response.first['id']).to eq(storage_move.id)
- expect(json_response.first['state']).to eq(storage_move.human_state_name)
- end
-
- it 'avoids N+1 queries', :request_store do
- # prevent `let` from polluting the control
- get_project_repository_storage_moves
-
- control = ActiveRecord::QueryRecorder.new { get_project_repository_storage_moves }
-
- create(:project_repository_storage_move, :scheduled, container: project)
-
- expect { get_project_repository_storage_moves }.not_to exceed_query_limit(control)
- end
-
- it 'returns the most recently created first' do
- storage_move_oldest = create(:project_repository_storage_move, :scheduled, container: project, created_at: 2.days.ago)
- storage_move_middle = create(:project_repository_storage_move, :scheduled, container: project, created_at: 1.day.ago)
-
- get_project_repository_storage_moves
-
- json_ids = json_response.map {|storage_move| storage_move['id'] }
- expect(json_ids).to eq([
- storage_move.id,
- storage_move_middle.id,
- storage_move_oldest.id
- ])
- end
-
- describe 'permissions' do
- it { expect { get_project_repository_storage_moves }.to be_allowed_for(:admin) }
- it { expect { get_project_repository_storage_moves }.to be_denied_for(:user) }
- end
- end
-
- describe 'GET /project_repository_storage_moves' do
- it_behaves_like 'get project repository storage move list' do
- let(:url) { '/project_repository_storage_moves' }
- end
- end
-
- describe 'GET /project_repository_storage_moves/:repository_storage_move_id' do
- it_behaves_like 'get single project repository storage move' do
- let(:url) { "/project_repository_storage_moves/#{project_repository_storage_move_id}" }
- end
- end
-
- describe 'GET /projects/:id/repository_storage_moves' do
- it_behaves_like 'get project repository storage move list' do
- let(:url) { "/projects/#{project.id}/repository_storage_moves" }
- end
- end
-
- describe 'GET /projects/:id/repository_storage_moves/:repository_storage_move_id' do
- it_behaves_like 'get single project repository storage move' do
- let(:url) { "/projects/#{project.id}/repository_storage_moves/#{project_repository_storage_move_id}" }
- end
- end
-
- describe 'POST /projects/:id/repository_storage_moves' do
- let(:url) { "/projects/#{project.id}/repository_storage_moves" }
- let(:destination_storage_name) { 'test_second_storage' }
-
- def create_project_repository_storage_move
- post api(url, user), params: { destination_storage_name: destination_storage_name }
- end
-
- before do
- stub_storage_settings('test_second_storage' => { 'path' => 'tmp/tests/extra_storage' })
- end
-
- it 'schedules a project repository storage move' do
- create_project_repository_storage_move
-
- storage_move = project.repository_storage_moves.last
-
- expect(response).to have_gitlab_http_status(:created)
- expect(response).to match_response_schema('public_api/v4/project_repository_storage_move')
- expect(json_response['id']).to eq(storage_move.id)
- expect(json_response['state']).to eq('scheduled')
- expect(json_response['source_storage_name']).to eq('default')
- expect(json_response['destination_storage_name']).to eq(destination_storage_name)
- end
-
- describe 'permissions' do
- it { expect { create_project_repository_storage_move }.to be_allowed_for(:admin) }
- it { expect { create_project_repository_storage_move }.to be_denied_for(:user) }
- end
-
- context 'destination_storage_name is missing' do
- let(:destination_storage_name) { nil }
-
- it 'schedules a project repository storage move' do
- create_project_repository_storage_move
-
- storage_move = project.repository_storage_moves.last
-
- expect(response).to have_gitlab_http_status(:created)
- expect(response).to match_response_schema('public_api/v4/project_repository_storage_move')
- expect(json_response['id']).to eq(storage_move.id)
- expect(json_response['state']).to eq('scheduled')
- expect(json_response['source_storage_name']).to eq('default')
- expect(json_response['destination_storage_name']).to be_present
- end
- end
- end
-
- describe 'POST /project_repository_storage_moves' do
- let(:source_storage_name) { 'default' }
- let(:destination_storage_name) { 'test_second_storage' }
-
- def create_project_repository_storage_moves
- post api('/project_repository_storage_moves', user), params: {
- source_storage_name: source_storage_name,
- destination_storage_name: destination_storage_name
- }
- end
-
- before do
- stub_storage_settings('test_second_storage' => { 'path' => 'tmp/tests/extra_storage' })
- end
-
- it 'schedules the worker' do
- expect(ProjectScheduleBulkRepositoryShardMovesWorker).to receive(:perform_async).with(source_storage_name, destination_storage_name)
-
- create_project_repository_storage_moves
-
- expect(response).to have_gitlab_http_status(:accepted)
- end
-
- context 'source_storage_name is invalid' do
- let(:destination_storage_name) { 'not-a-real-storage' }
-
- it 'gives an error' do
- create_project_repository_storage_moves
-
- expect(response).to have_gitlab_http_status(:bad_request)
- end
- end
-
- context 'destination_storage_name is missing' do
- let(:destination_storage_name) { nil }
-
- it 'schedules the worker' do
- expect(ProjectScheduleBulkRepositoryShardMovesWorker).to receive(:perform_async).with(source_storage_name, destination_storage_name)
-
- create_project_repository_storage_moves
-
- expect(response).to have_gitlab_http_status(:accepted)
- end
- end
-
- context 'destination_storage_name is invalid' do
- let(:destination_storage_name) { 'not-a-real-storage' }
-
- it 'gives an error' do
- create_project_repository_storage_moves
-
- expect(response).to have_gitlab_http_status(:bad_request)
- end
- end
-
- describe 'normal user' do
- it { expect { create_project_repository_storage_moves }.to be_denied_for(:user) }
- end
+ it_behaves_like 'repository_storage_moves API', 'projects' do
+ let_it_be(:container) { create(:project, :repository).tap { |project| project.track_project_repository } }
+ let_it_be(:storage_move) { create(:project_repository_storage_move, :scheduled, container: container) }
+ let(:repository_storage_move_factory) { :project_repository_storage_move }
+ let(:bulk_worker_klass) { ProjectScheduleBulkRepositoryShardMovesWorker }
end
end
diff --git a/spec/requests/api/snippet_repository_storage_moves_spec.rb b/spec/requests/api/snippet_repository_storage_moves_spec.rb
new file mode 100644
index 00000000000..edb92569823
--- /dev/null
+++ b/spec/requests/api/snippet_repository_storage_moves_spec.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::SnippetRepositoryStorageMoves do
+ it_behaves_like 'repository_storage_moves API', 'snippets' do
+ let_it_be(:container) { create(:snippet, :repository).tap { |snippet| snippet.create_repository } }
+ let_it_be(:storage_move) { create(:snippet_repository_storage_move, :scheduled, container: container) }
+ let(:repository_storage_move_factory) { :snippet_repository_storage_move }
+ let(:bulk_worker_klass) { SnippetScheduleBulkRepositoryShardMovesWorker }
+ end
+end
diff --git a/spec/support/shared_examples/features/wiki/user_views_wiki_sidebar_shared_examples.rb b/spec/support/shared_examples/features/wiki/user_views_wiki_sidebar_shared_examples.rb
index a7ba7a8ad07..9be7d739065 100644
--- a/spec/support/shared_examples/features/wiki/user_views_wiki_sidebar_shared_examples.rb
+++ b/spec/support/shared_examples/features/wiki/user_views_wiki_sidebar_shared_examples.rb
@@ -17,23 +17,55 @@ RSpec.shared_examples 'User views wiki sidebar' do
create(:wiki_page, wiki: wiki, title: 'another', content: 'another')
end
- it 'renders a default sidebar when there is no customized sidebar' do
- visit wiki_path(wiki)
+ context 'when there is no custom sidebar' do
+ before do
+ visit wiki_path(wiki)
+ end
- expect(page).to have_content('another')
- expect(page).not_to have_link('View All Pages')
+ it 'renders a default sidebar' do
+ within('.right-sidebar') do
+ expect(page).to have_content('another')
+ expect(page).not_to have_link('View All Pages')
+ end
+ end
+
+ it 'can create a custom sidebar' do
+ click_on 'Edit sidebar'
+ fill_in :wiki_content, with: 'My custom sidebar'
+ click_on 'Create page'
+
+ within('.right-sidebar') do
+ expect(page).to have_content('My custom sidebar')
+ expect(page).not_to have_content('another')
+ end
+ end
end
- context 'when there is a customized sidebar' do
+ context 'when there is a custom sidebar' do
before do
- create(:wiki_page, wiki: wiki, title: '_sidebar', content: 'My customized sidebar')
- end
+ create(:wiki_page, wiki: wiki, title: '_sidebar', content: 'My custom sidebar')
- it 'renders my customized sidebar instead of the default one' do
visit wiki_path(wiki)
+ end
+
+ it 'renders the custom sidebar instead of the default one' do
+ within('.right-sidebar') do
+ expect(page).to have_content('My custom sidebar')
+ expect(page).not_to have_content('another')
+ end
+ end
+
+ it 'can edit the custom sidebar' do
+ click_on 'Edit sidebar'
+
+ expect(page).to have_field(:wiki_content, with: 'My custom sidebar')
+
+ fill_in :wiki_content, with: 'My other custom sidebar'
+ click_on 'Save changes'
- expect(page).to have_content('My customized sidebar')
- expect(page).not_to have_content('Another')
+ within('.right-sidebar') do
+ expect(page).to have_content('My other custom sidebar')
+ end
end
end
end
diff --git a/spec/support/shared_examples/requests/api/repository_storage_moves_shared_examples.rb b/spec/support/shared_examples/requests/api/repository_storage_moves_shared_examples.rb
new file mode 100644
index 00000000000..b2970fd265d
--- /dev/null
+++ b/spec/support/shared_examples/requests/api/repository_storage_moves_shared_examples.rb
@@ -0,0 +1,219 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'repository_storage_moves API' do |container_type|
+ include AccessMatchersForRequest
+
+ let_it_be(:user) { create(:admin) }
+
+ shared_examples 'get single container repository storage move' do
+ let(:repository_storage_move_id) { storage_move.id }
+
+ def get_container_repository_storage_move
+ get api(url, user)
+ end
+
+ it 'returns a container repository storage move', :aggregate_failures do
+ get_container_repository_storage_move
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_response_schema("public_api/v4/#{container_type.singularize}_repository_storage_move")
+ expect(json_response['id']).to eq(storage_move.id)
+ expect(json_response['state']).to eq(storage_move.human_state_name)
+ end
+
+ context 'non-existent container repository storage move' do
+ let(:repository_storage_move_id) { non_existing_record_id }
+
+ it 'returns not found' do
+ get_container_repository_storage_move
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ describe 'permissions' do
+ it { expect { get_container_repository_storage_move }.to be_allowed_for(:admin) }
+ it { expect { get_container_repository_storage_move }.to be_denied_for(:user) }
+ end
+ end
+
+ shared_examples 'get container repository storage move list' do
+ def get_container_repository_storage_moves
+ get api(url, user)
+ end
+
+ it 'returns container repository storage moves', :aggregate_failures do
+ get_container_repository_storage_moves
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to include_pagination_headers
+ expect(response).to match_response_schema("public_api/v4/#{container_type.singularize}_repository_storage_moves")
+ expect(json_response.size).to eq(1)
+ expect(json_response.first['id']).to eq(storage_move.id)
+ expect(json_response.first['state']).to eq(storage_move.human_state_name)
+ end
+
+ it 'avoids N+1 queries', :request_store do
+ # prevent `let` from polluting the control
+ get_container_repository_storage_moves
+
+ control = ActiveRecord::QueryRecorder.new { get_container_repository_storage_moves }
+
+ create(repository_storage_move_factory, :scheduled, container: container)
+
+ expect { get_container_repository_storage_moves }.not_to exceed_query_limit(control)
+ end
+
+ it 'returns the most recently created first' do
+ storage_move_oldest = create(repository_storage_move_factory, :scheduled, container: container, created_at: 2.days.ago)
+ storage_move_middle = create(repository_storage_move_factory, :scheduled, container: container, created_at: 1.day.ago)
+
+ get_container_repository_storage_moves
+
+ json_ids = json_response.map {|storage_move| storage_move['id'] }
+ expect(json_ids).to eq([
+ storage_move.id,
+ storage_move_middle.id,
+ storage_move_oldest.id
+ ])
+ end
+
+ describe 'permissions' do
+ it { expect { get_container_repository_storage_moves }.to be_allowed_for(:admin) }
+ it { expect { get_container_repository_storage_moves }.to be_denied_for(:user) }
+ end
+ end
+
+ describe "GET /#{container_type}/:id/repository_storage_moves" do
+ it_behaves_like 'get container repository storage move list' do
+ let(:url) { "/#{container_type}/#{container.id}/repository_storage_moves" }
+ end
+ end
+
+ describe "GET /#{container_type}/:id/repository_storage_moves/:repository_storage_move_id" do
+ it_behaves_like 'get single container repository storage move' do
+ let(:url) { "/#{container_type}/#{container.id}/repository_storage_moves/#{repository_storage_move_id}" }
+ end
+ end
+
+ describe "GET /#{container_type.singularize}_repository_storage_moves" do
+ it_behaves_like 'get container repository storage move list' do
+ let(:url) { "/#{container_type.singularize}_repository_storage_moves" }
+ end
+ end
+
+ describe "GET /#{container_type.singularize}_repository_storage_moves/:repository_storage_move_id" do
+ it_behaves_like 'get single container repository storage move' do
+ let(:url) { "/#{container_type.singularize}_repository_storage_moves/#{repository_storage_move_id}" }
+ end
+ end
+
+ describe "POST /#{container_type}/:id/repository_storage_moves" do
+ let(:url) { "/#{container_type}/#{container.id}/repository_storage_moves" }
+ let(:destination_storage_name) { 'test_second_storage' }
+
+ def create_container_repository_storage_move
+ post api(url, user), params: { destination_storage_name: destination_storage_name }
+ end
+
+ before do
+ stub_storage_settings('test_second_storage' => { 'path' => 'tmp/tests/extra_storage' })
+ end
+
+ it 'schedules a container repository storage move', :aggregate_failures do
+ create_container_repository_storage_move
+
+ storage_move = container.repository_storage_moves.last
+
+ expect(response).to have_gitlab_http_status(:created)
+ expect(response).to match_response_schema("public_api/v4/#{container_type.singularize}_repository_storage_move")
+ expect(json_response['id']).to eq(storage_move.id)
+ expect(json_response['state']).to eq('scheduled')
+ expect(json_response['source_storage_name']).to eq('default')
+ expect(json_response['destination_storage_name']).to eq(destination_storage_name)
+ end
+
+ describe 'permissions' do
+ it { expect { create_container_repository_storage_move }.to be_allowed_for(:admin) }
+ it { expect { create_container_repository_storage_move }.to be_denied_for(:user) }
+ end
+
+ context 'destination_storage_name is missing', :aggregate_failures do
+ let(:destination_storage_name) { nil }
+
+ it 'schedules a container repository storage move' do
+ create_container_repository_storage_move
+
+ storage_move = container.repository_storage_moves.last
+
+ expect(response).to have_gitlab_http_status(:created)
+ expect(response).to match_response_schema("public_api/v4/#{container_type.singularize}_repository_storage_move")
+ expect(json_response['id']).to eq(storage_move.id)
+ expect(json_response['state']).to eq('scheduled')
+ expect(json_response['source_storage_name']).to eq('default')
+ expect(json_response['destination_storage_name']).to be_present
+ end
+ end
+ end
+
+ describe "POST /#{container_type.singularize}_repository_storage_moves" do
+ let(:url) { "/#{container_type.singularize}_repository_storage_moves" }
+ let(:source_storage_name) { 'default' }
+ let(:destination_storage_name) { 'test_second_storage' }
+
+ def create_container_repository_storage_moves
+ post api(url, user), params: {
+ source_storage_name: source_storage_name,
+ destination_storage_name: destination_storage_name
+ }
+ end
+
+ before do
+ stub_storage_settings('test_second_storage' => { 'path' => 'tmp/tests/extra_storage' })
+ end
+
+ it 'schedules the worker' do
+ expect(bulk_worker_klass).to receive(:perform_async).with(source_storage_name, destination_storage_name)
+
+ create_container_repository_storage_moves
+
+ expect(response).to have_gitlab_http_status(:accepted)
+ end
+
+ context 'source_storage_name is invalid' do
+ let(:destination_storage_name) { 'not-a-real-storage' }
+
+ it 'gives an error' do
+ create_container_repository_storage_moves
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ end
+ end
+
+ context 'destination_storage_name is missing' do
+ let(:destination_storage_name) { nil }
+
+ it 'schedules the worker' do
+ expect(bulk_worker_klass).to receive(:perform_async).with(source_storage_name, destination_storage_name)
+
+ create_container_repository_storage_moves
+
+ expect(response).to have_gitlab_http_status(:accepted)
+ end
+ end
+
+ context 'destination_storage_name is invalid' do
+ let(:destination_storage_name) { 'not-a-real-storage' }
+
+ it 'gives an error' do
+ create_container_repository_storage_moves
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ end
+ end
+
+ describe 'normal user' do
+ it { expect { create_container_repository_storage_moves }.to be_denied_for(:user) }
+ end
+ end
+end
diff --git a/spec/views/shared/wikis/_sidebar.html.haml_spec.rb b/spec/views/shared/wikis/_sidebar.html.haml_spec.rb
index 3e691862937..70991369506 100644
--- a/spec/views/shared/wikis/_sidebar.html.haml_spec.rb
+++ b/spec/views/shared/wikis/_sidebar.html.haml_spec.rb
@@ -80,4 +80,28 @@ RSpec.describe 'shared/wikis/_sidebar.html.haml' do
end
end
end
+
+ describe 'link to edit the sidebar' do
+ before do
+ allow(view).to receive(:can?).with(anything, :create_wiki, anything).and_return(can_edit)
+
+ render
+ end
+
+ context 'when the user has edit permission' do
+ let(:can_edit) { true }
+
+ it 'renders the link' do
+ expect(rendered).to have_link('Edit sidebar', href: wiki_page_path(wiki, Wiki::SIDEBAR, action: :edit))
+ end
+ end
+
+ context 'when the user does not have edit permission' do
+ let(:can_edit) { false }
+
+ it 'does not render the link' do
+ expect(rendered).not_to have_link('Edit sidebar')
+ end
+ end
+ end
end