diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-12-23 18:09:54 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-12-23 18:09:54 +0300 |
commit | 9dbca64417abbec779a219b9e0df9d289d945032 (patch) | |
tree | 3721592153aa2c991a4a5fe686eb4471dabd98b4 | |
parent | 5c9f6c66fabf22927e862b2b60362e4ea25b250b (diff) |
Add latest changes from gitlab-org/gitlab@master
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 |