From 859a6fb938bb9ee2a317c46dfa4fcc1af49608f0 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Thu, 18 Feb 2021 10:34:06 +0000 Subject: Add latest changes from gitlab-org/gitlab@13-9-stable-ee --- app/assets/images/auth_buttons/openid_64.png | Bin 0 -> 1918 bytes .../mailers/in_product_marketing/create-0.png | Bin 0 -> 10275 bytes .../mailers/in_product_marketing/create-1.png | Bin 0 -> 39565 bytes .../mailers/in_product_marketing/create-2.png | Bin 0 -> 15793 bytes .../in_product_marketing/gitlab-logo-gray-rgb.png | Bin 0 -> 42439 bytes .../images/mailers/in_product_marketing/team-0.png | Bin 0 -> 42448 bytes .../images/mailers/in_product_marketing/team-1.png | Bin 0 -> 62019 bytes .../images/mailers/in_product_marketing/team-2.png | Bin 0 -> 54468 bytes .../mailers/in_product_marketing/trial-0.png | Bin 0 -> 50665 bytes .../mailers/in_product_marketing/trial-1.png | Bin 0 -> 8676 bytes .../mailers/in_product_marketing/trial-2.png | Bin 0 -> 47411 bytes .../mailers/in_product_marketing/verify-0.png | Bin 0 -> 15366 bytes .../mailers/in_product_marketing/verify-1.png | Bin 0 -> 60722 bytes .../mailers/in_product_marketing/verify-2.png | Bin 0 -> 57506 bytes .../javascripts/actioncable_connection_monitor.js | 142 ++++++ app/assets/javascripts/actioncable_consumer.js | 9 +- app/assets/javascripts/activities.js | 2 +- .../add_context_commits_modal_wrapper.vue | 7 +- .../javascripts/add_context_commits_modal/index.js | 2 +- .../add_context_commits_modal/store/actions.js | 4 +- .../cohorts/components/usage_ping_disabled.vue | 48 -- .../admin/statistics_panel/components/app.vue | 6 +- .../javascripts/admin/statistics_panel/index.js | 2 +- .../admin/statistics_panel/store/actions.js | 2 +- .../admin/users/components/actions/activate.vue | 44 ++ .../admin/users/components/actions/approve.vue | 21 + .../admin/users/components/actions/block.vue | 53 +++ .../admin/users/components/actions/deactivate.vue | 60 +++ .../admin/users/components/actions/delete.vue | 25 + .../actions/delete_with_contributions.vue | 25 + .../admin/users/components/actions/index.js | 21 + .../admin/users/components/actions/reject.vue | 21 + .../actions/shared/shared_delete_action.vue | 43 ++ .../admin/users/components/actions/unblock.vue | 44 ++ .../admin/users/components/actions/unlock.vue | 42 ++ .../admin/users/components/usage_ping_disabled.vue | 48 ++ .../admin/users/components/user_actions.vue | 119 +++++ .../admin/users/components/user_avatar.vue | 30 +- .../admin/users/components/user_date.vue | 29 ++ .../admin/users/components/users_table.vue | 18 +- app/assets/javascripts/admin/users/constants.js | 21 + app/assets/javascripts/admin/users/index.js | 25 +- app/assets/javascripts/admin/users/tabs.js | 23 + app/assets/javascripts/admin/users/utils.js | 7 + .../alert_management/components/alert_details.vue | 380 --------------- .../components/alert_management_table.vue | 18 +- .../alert_management/components/alert_metrics.vue | 56 --- .../alert_management/components/alert_sidebar.vue | 82 ---- .../alert_management/components/alert_status.vue | 119 ----- .../components/alert_summary_row.vue | 18 - .../components/sidebar/sidebar_assignee.vue | 38 -- .../components/sidebar/sidebar_assignees.vue | 299 ------------ .../components/sidebar/sidebar_header.vue | 41 -- .../components/sidebar/sidebar_status.vue | 120 ----- .../components/sidebar/sidebar_todo.vue | 149 ------ .../components/system_notes/system_note.vue | 48 -- .../javascripts/alert_management/constants.js | 31 +- app/assets/javascripts/alert_management/details.js | 69 --- .../graphql/fragments/detail_item.fragment.graphql | 30 -- .../mutations/alert_set_assignees.mutation.graphql | 25 - .../mutations/alert_todo_create.mutation.graphql | 10 - .../create_issue_from_alert.mutation.graphql | 8 - .../toggle_sidebar_status.mutation.graphql | 3 - .../graphql/queries/details.query.graphql | 11 - .../graphql/queries/sidebar_status.query.graphql | 3 - app/assets/javascripts/alert_management/list.js | 4 +- app/assets/javascripts/alert_management/router.js | 13 - .../components/alerts_service_form.vue | 187 -------- .../javascripts/alerts_service_settings/index.js | 39 -- .../components/alert_mapping_builder.vue | 77 +-- .../components/alerts_settings_form.vue | 47 +- .../components/alerts_settings_wrapper.vue | 26 +- .../components/mocks/gitlabFields.json | 112 ----- .../components/mocks/parsedMapping.json | 78 +-- app/assets/javascripts/alerts_settings/graphql.js | 2 +- .../create_http_integration.mutation.graphql | 18 +- app/assets/javascripts/alerts_settings/index.js | 12 +- .../utils/mapping_transformations.js | 61 +++ .../instance_statistics/components/app.vue | 6 +- .../components/instance_counts.vue | 6 +- .../components/instance_statistics_count_chart.vue | 8 +- .../components/projects_and_groups_chart.vue | 4 +- .../instance_statistics/components/users_chart.vue | 4 +- app/assets/javascripts/api.js | 60 +-- app/assets/javascripts/api/user_api.js | 4 +- ...test_artifact_application_setting.query.graphql | 5 + app/assets/javascripts/artifacts_settings/index.js | 2 +- .../keep_latest_artifact_checkbox.vue | 57 ++- app/assets/javascripts/authentication/mount_2fa.js | 2 +- .../two_factor_auth/components/recovery_codes.vue | 6 +- .../javascripts/authentication/u2f/authenticate.js | 2 +- .../javascripts/authentication/u2f/register.js | 2 +- app/assets/javascripts/awards_handler.js | 14 +- .../javascripts/badges/components/badge_form.vue | 6 +- .../javascripts/badges/components/badge_list.vue | 4 +- .../badges/components/badge_list_row.vue | 2 +- .../badges/components/badge_settings.vue | 2 +- app/assets/javascripts/badges/store/actions.js | 2 +- app/assets/javascripts/badges/store/index.js | 2 +- app/assets/javascripts/badges/store/mutations.js | 2 +- .../batch_comments/components/draft_note.vue | 11 +- .../batch_comments/components/drafts_count.vue | 2 +- .../batch_comments/components/preview_dropdown.vue | 2 +- .../batch_comments/components/preview_item.vue | 19 +- .../batch_comments/components/publish_button.vue | 2 +- .../stores/modules/batch_comments/actions.js | 28 +- .../stores/modules/batch_comments/index.js | 4 +- app/assets/javascripts/behaviors/autosize.js | 12 +- .../behaviors/collapse_sidebar_on_window_resize.js | 2 +- .../javascripts/behaviors/copy_to_clipboard.js | 2 +- app/assets/javascripts/behaviors/gl_emoji.js | 12 +- app/assets/javascripts/behaviors/index.js | 38 +- .../behaviors/markdown/editor_extensions.js | 63 ++- .../javascripts/behaviors/markdown/marks/bold.js | 2 +- .../javascripts/behaviors/markdown/marks/code.js | 2 +- .../behaviors/markdown/marks/inline_html.js | 2 +- .../javascripts/behaviors/markdown/marks/italic.js | 2 +- .../javascripts/behaviors/markdown/marks/link.js | 2 +- .../javascripts/behaviors/markdown/marks/math.js | 2 +- .../behaviors/markdown/nodes/blockquote.js | 2 +- .../behaviors/markdown/nodes/bullet_list.js | 2 +- .../behaviors/markdown/nodes/heading.js | 2 +- .../behaviors/markdown/nodes/horizontal_rule.js | 2 +- .../javascripts/behaviors/markdown/nodes/image.js | 2 +- .../behaviors/markdown/nodes/list_item.js | 2 +- .../behaviors/markdown/nodes/paragraph.js | 2 +- .../behaviors/markdown/nodes/playable.js | 2 +- .../behaviors/markdown/nodes/table_header_row.js | 2 +- .../javascripts/behaviors/markdown/nodes/text.js | 2 +- .../javascripts/behaviors/markdown/render_gfm.js | 4 +- .../javascripts/behaviors/markdown/render_math.js | 2 +- .../behaviors/markdown/render_mermaid.js | 2 +- .../javascripts/behaviors/preview_markdown.js | 2 +- app/assets/javascripts/behaviors/quick_submit.js | 2 +- app/assets/javascripts/behaviors/secret_values.js | 2 +- .../javascripts/behaviors/shortcuts/keybindings.js | 9 +- .../javascripts/behaviors/shortcuts/shortcuts.js | 88 ++-- .../behaviors/shortcuts/shortcuts_help.vue | 525 +++++++++++++++++++++ .../behaviors/shortcuts/shortcuts_issuable.js | 8 +- .../behaviors/shortcuts/shortcuts_wiki.js | 2 +- app/assets/javascripts/blob/3d_viewer/index.js | 4 +- .../javascripts/blob/balsamiq/balsamiq_viewer.js | 2 +- app/assets/javascripts/blob/balsamiq_viewer.js | 2 +- app/assets/javascripts/blob/blob_file_dropzone.js | 6 +- .../javascripts/blob/components/blob_header.vue | 4 +- .../blob/components/blob_header_filepath.vue | 4 +- .../javascripts/blob/components/constants.js | 2 +- .../javascripts/blob/file_template_mediator.js | 8 +- .../javascripts/blob/file_template_selector.js | 2 + .../template_selectors/ci_syntax_yaml_selector.js | 2 +- .../blob/template_selectors/ci_yaml_selector.js | 2 +- .../blob/template_selectors/dockerfile_selector.js | 4 +- .../blob/template_selectors/gitignore_selector.js | 2 +- .../blob/template_selectors/license_selector.js | 3 +- .../metrics_dashboard_selector.js | 2 +- .../blob/template_selectors/type_selector.js | 2 +- app/assets/javascripts/blob/viewer/index.js | 6 +- app/assets/javascripts/blob_edit/blob_bundle.js | 6 +- app/assets/javascripts/blob_edit/edit_blob.js | 10 +- app/assets/javascripts/boards/boards_util.js | 14 +- .../components/board_add_new_column_trigger.vue | 21 + .../boards/components/board_assignee_dropdown.vue | 196 -------- .../javascripts/boards/components/board_card.vue | 7 +- .../boards/components/board_card_layout.vue | 26 +- .../components/board_card_layout_deprecated.vue | 102 ++++ .../javascripts/boards/components/board_column.vue | 18 +- .../boards/components/board_column_deprecated.vue | 16 +- .../components/board_configuration_options.vue | 6 + .../boards/components/board_content.vue | 12 +- .../javascripts/boards/components/board_form.vue | 26 +- .../javascripts/boards/components/board_list.vue | 10 +- .../boards/components/board_list_deprecated.vue | 20 +- .../boards/components/board_list_header.vue | 43 +- .../components/board_list_header_deprecated.vue | 41 +- .../boards/components/board_new_issue.vue | 6 +- .../components/board_new_issue_deprecated.vue | 4 +- .../boards/components/board_settings_sidebar.vue | 19 +- .../javascripts/boards/components/board_sidebar.js | 67 +-- .../boards/components/boards_selector.vue | 38 +- .../components/boards_selector_deprecated.vue | 357 ++++++++++++++ .../boards/components/issue_card_inner.vue | 10 +- .../components/issue_card_inner_deprecated.vue | 6 +- .../boards/components/issue_due_date.vue | 4 +- .../boards/components/issue_time_estimate.vue | 2 +- .../boards/components/modal/empty_state.vue | 2 +- .../javascripts/boards/components/modal/filters.js | 2 +- .../javascripts/boards/components/modal/footer.vue | 4 +- .../javascripts/boards/components/modal/header.vue | 4 +- .../javascripts/boards/components/modal/index.vue | 8 +- .../javascripts/boards/components/modal/list.vue | 2 +- .../boards/components/modal/lists_dropdown.vue | 2 +- .../javascripts/boards/components/modal/tabs.vue | 2 +- .../boards/components/new_list_dropdown.js | 41 +- .../boards/components/project_select.vue | 2 +- .../components/project_select_deprecated.vue | 4 +- .../components/sidebar/board_sidebar_due_date.vue | 20 +- .../sidebar/board_sidebar_issue_title.vue | 62 ++- .../sidebar/board_sidebar_labels_select.vue | 8 +- .../sidebar/board_sidebar_milestone_select.vue | 86 ++-- .../sidebar/board_sidebar_subscription.vue | 2 +- .../javascripts/boards/components/toggle_focus.vue | 52 ++ app/assets/javascripts/boards/constants.js | 20 + .../javascripts/boards/filtered_search_boards.js | 8 +- .../javascripts/boards/filters/due_date_filters.js | 2 +- .../boards/graphql/group_milestones.query.graphql | 17 - .../graphql/project_milestones.query.graphql | 17 + app/assets/javascripts/boards/index.js | 50 +- app/assets/javascripts/boards/models/issue.js | 6 +- app/assets/javascripts/boards/models/iteration.js | 9 + app/assets/javascripts/boards/models/list.js | 11 +- .../boards/mount_multiple_boards_switcher.js | 20 +- app/assets/javascripts/boards/stores/actions.js | 105 +++-- .../javascripts/boards/stores/boards_store.js | 22 +- app/assets/javascripts/boards/stores/getters.js | 10 +- app/assets/javascripts/boards/stores/index.js | 4 +- .../javascripts/boards/stores/mutation_types.js | 7 +- app/assets/javascripts/boards/stores/mutations.js | 34 +- app/assets/javascripts/boards/stores/state.js | 4 + app/assets/javascripts/boards/toggle_focus.js | 48 +- .../branches/components/divergence_graph.vue | 2 +- .../javascripts/branches/divergence_graph.js | 2 +- app/assets/javascripts/build_artifacts.js | 4 +- app/assets/javascripts/captcha/captcha_modal.vue | 110 +++++ .../javascripts/captcha/init_recaptcha_script.js | 48 ++ .../javascripts/ci_lint/components/ci_lint.vue | 2 +- .../components/triggers_list.vue | 2 +- .../ci_settings_pipeline_triggers/index.js | 2 +- .../ci_variable_list/ci_variable_list.js | 4 +- .../components/ci_variable_modal.vue | 4 +- .../components/ci_variable_popover.vue | 4 +- app/assets/javascripts/ci_variable_list/index.js | 2 +- .../javascripts/ci_variable_list/store/actions.js | 4 +- .../ci_variable_list/store/mutations.js | 2 +- app/assets/javascripts/clone_panel.js | 5 + app/assets/javascripts/clusters/clusters_bundle.js | 16 +- .../clusters/components/application_row.vue | 5 +- .../clusters/components/applications.vue | 22 +- .../components/fluentd_output_settings.vue | 2 +- .../components/ingress_modsecurity_settings.vue | 6 +- .../clusters/components/knative_domain_editor.vue | 4 +- .../components/remove_cluster_confirmation.vue | 88 ++-- .../javascripts/clusters/stores/clusters_store.js | 2 +- .../clusters_list/components/clusters.vue | 6 +- .../javascripts/clusters_list/store/actions.js | 8 +- .../javascripts/clusters_list/store/index.js | 4 +- .../javascripts/code_navigation/components/app.vue | 2 +- app/assets/javascripts/code_navigation/index.js | 2 +- .../javascripts/code_navigation/store/actions.js | 2 +- .../javascripts/code_navigation/store/index.js | 2 +- .../commit/pipelines/pipelines_bundle.js | 28 +- .../commit/pipelines/pipelines_table.vue | 19 +- app/assets/javascripts/commits.js | 2 +- app/assets/javascripts/compare_autocomplete.js | 8 +- .../components/project_form_group.vue | 4 +- app/assets/javascripts/contextual_sidebar.js | 4 +- .../contributors/components/contributors.vue | 10 +- .../javascripts/contributors/stores/index.js | 6 +- .../components/cluster_form_dropdown.vue | 8 +- .../eks_cluster/components/create_eks_cluster.vue | 2 +- .../components/eks_cluster_configuration_form.vue | 4 +- .../components/service_credentials_form.vue | 14 +- .../eks_cluster/services/aws_services_facade.js | 2 +- .../create_cluster/eks_cluster/store/actions.js | 8 +- .../create_cluster/eks_cluster/store/index.js | 10 +- .../gke_cluster/components/gke_dropdown_mixin.js | 4 +- .../components/gke_project_id_dropdown.vue | 2 +- .../create_cluster/gke_cluster/index.js | 7 +- .../create_cluster/gke_cluster/store/actions.js | 2 +- .../create_cluster/init_create_cluster.js | 2 +- .../create_cluster/store/cluster_dropdown/index.js | 2 +- .../javascripts/create_merge_request_dropdown.js | 10 +- .../components/custom_metrics_form.vue | 4 +- .../components/custom_metrics_form_fields.vue | 6 +- .../cycle_analytics/components/banner.vue | 2 +- .../cycle_analytics/cycle_analytics_bundle.js | 12 +- .../cycle_analytics/cycle_analytics_store.js | 2 +- .../components/deploy_freeze_modal.vue | 4 +- .../components/deploy_freeze_settings.vue | 2 +- .../javascripts/deploy_freeze/store/actions.js | 2 +- .../javascripts/deploy_keys/components/app.vue | 2 +- .../javascripts/deploy_keys/components/key.vue | 4 +- .../deploy_keys/components/keys_panel.vue | 2 +- .../deprecated_jquery_dropdown/gl_dropdown.js | 11 +- .../gl_dropdown_filter.js | 2 +- .../components/design_notes/design_discussion.vue | 12 +- .../components/design_notes/design_note.vue | 10 +- .../components/design_notes/design_reply_form.vue | 4 +- .../components/design_overlay.vue | 4 +- .../components/design_presentation.vue | 2 +- .../components/design_sidebar.vue | 10 +- .../components/design_todo_button.vue | 4 +- .../design_management/components/image.vue | 2 +- .../design_management/components/list/item.vue | 23 +- .../design_management/components/toolbar/index.vue | 4 +- .../javascripts/design_management/graphql.js | 10 +- app/assets/javascripts/design_management/index.js | 2 +- .../design_management/mixins/all_designs.js | 2 +- .../design_management/pages/design/index.vue | 24 +- .../javascripts/design_management/pages/index.vue | 47 +- .../javascripts/design_management/router/routes.js | 2 +- .../design_management/utils/cache_update.js | 2 +- .../design_management/utils/error_messages.js | 8 +- .../design_management/utils/tracking.js | 2 +- app/assets/javascripts/diff.js | 6 +- app/assets/javascripts/diffs/components/app.vue | 50 +- .../javascripts/diffs/components/commit_item.vue | 12 +- .../diffs/components/compare_versions.vue | 12 +- .../diffs/components/diff_comment_cell.vue | 2 +- .../javascripts/diffs/components/diff_content.vue | 24 +- .../diffs/components/diff_discussion_reply.vue | 11 +- .../diffs/components/diff_discussions.vue | 2 +- .../diffs/components/diff_expansion_cell.vue | 2 +- .../javascripts/diffs/components/diff_file.vue | 65 ++- .../diffs/components/diff_file_header.vue | 77 ++- .../javascripts/diffs/components/diff_file_row.vue | 4 +- .../diffs/components/diff_gutter_avatars.vue | 2 +- .../diffs/components/diff_line_note_form.vue | 20 +- .../javascripts/diffs/components/diff_row.vue | 23 +- .../javascripts/diffs/components/diff_row_utils.js | 4 +- .../javascripts/diffs/components/diff_stats.vue | 2 +- .../javascripts/diffs/components/diff_view.vue | 28 +- .../diffs/components/image_diff_overlay.vue | 4 +- .../diffs/components/inline_diff_table_row.vue | 2 +- .../diffs/components/inline_diff_view.vue | 8 +- .../javascripts/diffs/components/no_changes.vue | 2 +- .../diffs/components/parallel_diff_table_row.vue | 4 +- .../diffs/components/parallel_diff_view.vue | 6 +- .../diffs/components/settings_dropdown.vue | 4 +- .../javascripts/diffs/components/tree_list.vue | 2 +- app/assets/javascripts/diffs/i18n.js | 7 +- app/assets/javascripts/diffs/index.js | 7 +- app/assets/javascripts/diffs/store/actions.js | 46 +- app/assets/javascripts/diffs/store/getters.js | 19 +- .../diffs/store/getters_versions_dropdowns.js | 2 +- .../javascripts/diffs/store/modules/diff_state.js | 1 + app/assets/javascripts/diffs/store/mutations.js | 19 +- app/assets/javascripts/diffs/store/utils.js | 2 +- app/assets/javascripts/diffs/utils/diff_file.js | 6 + app/assets/javascripts/diffs/utils/file_reviews.js | 25 +- app/assets/javascripts/diffs/utils/performance.js | 2 +- app/assets/javascripts/diffs/utils/suggestions.js | 28 ++ app/assets/javascripts/diffs/utils/uuids.js | 2 +- .../javascripts/dirty_submit/dirty_submit_form.js | 2 +- app/assets/javascripts/droplab/drop_down.js | 2 +- app/assets/javascripts/droplab/drop_lab.js | 4 +- app/assets/javascripts/dropzone_input.js | 10 +- app/assets/javascripts/due_date_select.js | 6 +- app/assets/javascripts/editor/constants.js | 5 + app/assets/javascripts/editor/editor_lite.js | 221 ++++++--- .../editor/extensions/editor_ci_schema_ext.js | 2 +- app/assets/javascripts/emoji/index.js | 256 +++++----- .../environments/components/canary_ingress.vue | 2 +- .../components/canary_update_modal.vue | 2 +- .../components/confirm_rollback_modal.vue | 2 +- .../environments/components/container.vue | 29 +- .../environments/components/deploy_board.vue | 11 +- .../components/enable_review_app_modal.vue | 2 +- .../components/environment_actions.vue | 2 +- .../environments/components/environment_delete.vue | 5 +- .../environments/components/environment_item.vue | 16 +- .../components/environment_monitoring.vue | 2 +- .../components/environment_rollback.vue | 2 +- .../environments/components/environment_stop.vue | 3 +- .../environments/components/environments_app.vue | 38 +- .../environments/components/environments_table.vue | 25 +- .../components/stop_environment_modal.vue | 2 +- .../folder/environments_folder_bundle.js | 4 +- .../folder/environments_folder_view.vue | 26 +- app/assets/javascripts/environments/index.js | 6 +- .../environments/mixins/environments_mixin.js | 14 +- .../mixins/environments_pagination_api_mixin.js | 66 +++ .../environments/stores/environments_store.js | 2 +- .../error_tracking/components/error_details.vue | 12 +- .../components/error_tracking_list.vue | 12 +- app/assets/javascripts/error_tracking/details.js | 4 +- app/assets/javascripts/error_tracking/list.js | 2 +- .../javascripts/error_tracking/store/actions.js | 4 +- .../error_tracking/store/details/actions.js | 4 +- .../javascripts/error_tracking/store/index.js | 10 +- .../error_tracking/store/list/actions.js | 4 +- .../error_tracking/store/list/mutations.js | 4 +- .../error_tracking_settings/components/app.vue | 4 +- .../components/error_tracking_form.vue | 2 +- .../error_tracking_settings/store/actions.js | 4 +- .../error_tracking_settings/store/index.js | 2 +- .../error_tracking_settings/store/mutations.js | 2 +- .../feature_flags/components/edit_feature_flag.vue | 4 +- .../components/environments_dropdown.vue | 4 +- .../feature_flags/components/feature_flags.vue | 19 +- .../feature_flags/components/feature_flags_tab.vue | 64 ++- .../components/feature_flags_table.vue | 2 +- .../javascripts/feature_flags/components/form.vue | 35 +- .../components/new_environments_dropdown.vue | 4 +- .../feature_flags/components/new_feature_flag.vue | 13 +- .../components/strategies/gitlab_user_list.vue | 2 +- .../components/strategies/parameter_form_group.vue | 2 +- .../feature_flags/components/strategy.vue | 4 +- .../components/strategy_parameters.vue | 2 +- app/assets/javascripts/feature_flags/edit.js | 2 +- app/assets/javascripts/feature_flags/new.js | 2 +- .../feature_flags/store/edit/actions.js | 4 +- .../javascripts/feature_flags/store/edit/index.js | 2 +- .../feature_flags/store/edit/mutations.js | 4 +- .../feature_flags/store/gitlab_user_list/index.js | 4 +- .../store/gitlab_user_list/mutations.js | 2 +- .../feature_flags/store/index/actions.js | 2 +- .../javascripts/feature_flags/store/index/index.js | 2 +- .../feature_flags/store/index/mutations.js | 2 +- .../javascripts/feature_flags/store/new/actions.js | 2 +- .../javascripts/feature_flags/store/new/index.js | 2 +- .../javascripts/feature_highlight/constants.js | 1 + .../feature_highlight/feature_highlight.js | 59 --- .../feature_highlight/feature_highlight_helper.js | 28 +- .../feature_highlight/feature_highlight_options.js | 12 - .../feature_highlight_popover.vue | 101 ++++ app/assets/javascripts/feature_highlight/index.js | 28 ++ .../filtered_search/available_dropdown_mappings.js | 10 +- .../filtered_search/dropdown_ajax_filter.js | 6 +- .../javascripts/filtered_search/dropdown_emoji.js | 6 +- .../javascripts/filtered_search/dropdown_hint.js | 4 +- .../filtered_search/dropdown_non_user.js | 6 +- .../filtered_search/dropdown_operator.js | 2 +- .../javascripts/filtered_search/dropdown_utils.js | 2 +- .../filtered_search/filtered_search_dropdown.js | 2 +- .../filtered_search_dropdown_manager.js | 4 +- .../filtered_search/filtered_search_manager.js | 26 +- .../filtered_search_visual_tokens.js | 2 +- .../issuable_filtered_search_token_keys.js | 2 +- .../filtered_search/recent_searches_root.js | 19 +- .../recent_searches_storage_keys.js | 2 + .../services/recent_searches_service.js | 2 +- .../filtered_search/visual_token_value.js | 6 +- .../javascripts/frequent_items/components/app.vue | 6 +- .../components/frequent_items_list.vue | 2 +- .../components/frequent_items_list_item.vue | 2 +- .../components/frequent_items_search_input.vue | 22 +- app/assets/javascripts/frequent_items/index.js | 2 +- .../javascripts/frequent_items/store/actions.js | 4 +- app/assets/javascripts/frequent_items/utils.js | 2 +- app/assets/javascripts/gfm_auto_complete.js | 145 +++--- app/assets/javascripts/gl_form.js | 4 +- app/assets/javascripts/gpg_badges.js | 4 +- .../components/grafana_integration.vue | 4 +- .../javascripts/grafana_integration/index.js | 2 +- .../grafana_integration/store/actions.js | 4 +- .../javascripts/grafana_integration/store/index.js | 2 +- .../fragments/alert_note.fragment.graphql | 2 +- .../mutations/alert_status_update.mutation.graphql | 17 + .../mutations/update_alert_status.mutation.graphql | 17 - .../queries/get_alerts.query.graphql | 2 + app/assets/javascripts/group.js | 4 +- app/assets/javascripts/group_label_subscription.js | 4 +- .../components/shared_runners_form.vue | 2 +- app/assets/javascripts/groups/components/app.vue | 6 +- .../javascripts/groups/components/group_item.vue | 20 +- .../javascripts/groups/components/groups.vue | 2 +- .../groups/components/invite_members_banner.vue | 2 +- .../javascripts/groups/components/item_actions.vue | 2 +- .../javascripts/groups/groups_filterable_list.js | 2 +- app/assets/javascripts/groups/index.js | 14 +- .../javascripts/groups/members/components/app.vue | 40 -- app/assets/javascripts/groups/members/constants.js | 4 - app/assets/javascripts/groups/members/index.js | 43 -- app/assets/javascripts/groups/members/utils.js | 47 +- app/assets/javascripts/groups/transfer_dropdown.js | 2 +- app/assets/javascripts/groups_select.js | 4 +- app/assets/javascripts/header.js | 8 +- app/assets/javascripts/helpers/avatar_helper.js | 2 +- .../javascripts/ide/components/activity_bar.vue | 10 +- .../ide/components/branches/search_list.vue | 4 +- .../ide/components/commit_sidebar/actions.vue | 17 +- .../components/commit_sidebar/editor_header.vue | 4 +- .../ide/components/commit_sidebar/form.vue | 93 ++-- .../ide/components/commit_sidebar/list.vue | 2 +- .../ide/components/commit_sidebar/list_item.vue | 10 +- .../commit_sidebar/new_merge_request_option.vue | 2 +- .../ide/components/commit_sidebar/radio_group.vue | 2 +- .../javascripts/ide/components/error_message.vue | 2 +- .../javascripts/ide/components/file_row_extra.vue | 4 +- .../ide/components/file_templates/dropdown.vue | 2 +- app/assets/javascripts/ide/components/ide.vue | 20 +- .../javascripts/ide/components/ide_review.vue | 4 +- .../javascripts/ide/components/ide_side_bar.vue | 8 +- .../javascripts/ide/components/ide_sidebar_nav.vue | 5 +- .../javascripts/ide/components/ide_status_bar.vue | 6 +- .../javascripts/ide/components/ide_status_list.vue | 4 +- app/assets/javascripts/ide/components/ide_tree.vue | 6 +- .../javascripts/ide/components/ide_tree_list.vue | 4 +- .../javascripts/ide/components/jobs/detail.vue | 6 +- .../javascripts/ide/components/jobs/list.vue | 2 +- .../ide/components/merge_requests/list.vue | 6 +- .../javascripts/ide/components/nav_dropdown.vue | 2 +- .../ide/components/nav_dropdown_button.vue | 2 +- app/assets/javascripts/ide/components/nav_form.vue | 2 +- .../ide/components/new_dropdown/index.vue | 7 +- .../ide/components/new_dropdown/modal.vue | 2 +- .../ide/components/new_dropdown/upload.vue | 2 +- .../javascripts/ide/components/panes/right.vue | 6 +- .../javascripts/ide/components/pipelines/list.vue | 9 +- .../ide/components/preview/clientside.vue | 12 +- .../ide/components/preview/navigator.vue | 3 +- .../ide/components/repo_commit_section.vue | 4 +- .../javascripts/ide/components/repo_editor.vue | 18 +- app/assets/javascripts/ide/components/repo_tab.vue | 4 +- .../ide/components/terminal/session.vue | 4 +- .../ide/components/terminal/terminal.vue | 4 +- .../terminal_sync/terminal_sync_status.vue | 2 +- app/assets/javascripts/ide/constants.js | 11 + app/assets/javascripts/ide/ide_router.js | 4 +- app/assets/javascripts/ide/index.js | 10 +- app/assets/javascripts/ide/lib/common/model.js | 4 +- app/assets/javascripts/ide/lib/create_diff.js | 2 +- app/assets/javascripts/ide/lib/diff/controller.js | 4 +- app/assets/javascripts/ide/lib/editor.js | 12 +- app/assets/javascripts/ide/lib/errors.js | 4 +- app/assets/javascripts/ide/lib/languages/index.js | 2 +- app/assets/javascripts/ide/lib/mirror.js | 2 +- app/assets/javascripts/ide/lib/themes/index.js | 6 +- app/assets/javascripts/ide/services/index.js | 2 +- app/assets/javascripts/ide/stores/actions.js | 14 +- app/assets/javascripts/ide/stores/actions/file.js | 8 +- .../ide/stores/actions/merge_request.js | 150 +++--- .../javascripts/ide/stores/actions/project.js | 2 +- app/assets/javascripts/ide/stores/actions/tree.js | 4 +- app/assets/javascripts/ide/stores/getters.js | 9 +- app/assets/javascripts/ide/stores/index.js | 16 +- .../ide/stores/modules/branches/actions.js | 2 +- .../ide/stores/modules/branches/index.js | 2 +- .../ide/stores/modules/commit/actions.js | 18 +- .../ide/stores/modules/commit/constants.js | 9 +- .../ide/stores/modules/commit/getters.js | 4 +- .../javascripts/ide/stores/modules/commit/index.js | 4 +- .../javascripts/ide/stores/modules/editor/index.js | 2 +- .../javascripts/ide/stores/modules/editor/setup.js | 2 +- .../ide/stores/modules/file_templates/actions.js | 4 +- .../ide/stores/modules/file_templates/getters.js | 2 +- .../ide/stores/modules/file_templates/index.js | 2 +- .../ide/stores/modules/merge_requests/actions.js | 2 +- .../ide/stores/modules/merge_requests/index.js | 2 +- .../ide/stores/modules/pipelines/actions.js | 6 +- .../ide/stores/modules/pipelines/index.js | 4 +- .../javascripts/ide/stores/modules/router/index.js | 4 +- .../ide/stores/modules/terminal/actions/checks.js | 6 +- .../modules/terminal/actions/session_controls.js | 6 +- .../modules/terminal/actions/session_status.js | 4 +- .../ide/stores/modules/terminal/messages.js | 2 +- .../ide/stores/modules/terminal_sync/actions.js | 2 +- .../ide/stores/modules/terminal_sync/index.js | 2 +- app/assets/javascripts/ide/stores/mutations.js | 6 +- .../javascripts/ide/stores/mutations/file.js | 4 +- .../ide/stores/plugins/terminal_sync.js | 4 +- app/assets/javascripts/ide/stores/utils.js | 2 +- app/assets/javascripts/ide/utils.js | 4 +- .../image_diff/helpers/init_image_diff.js | 2 +- app/assets/javascripts/image_diff/image_diff.js | 2 +- .../javascripts/image_diff/replaced_image_diff.js | 2 +- .../import_groups/components/import_table.vue | 212 ++++++--- .../import_groups/graphql/client_factory.js | 61 ++- .../bulk_import_source_groups.query.graphql | 14 +- .../graphql/services/source_groups_manager.js | 10 + .../graphql/services/status_poller.js | 85 ++-- .../import_entities/import_groups/index.js | 17 +- .../components/import_projects_table.vue | 36 +- .../components/provider_repo_table_row.vue | 61 +-- .../import_entities/import_projects/index.js | 2 +- .../import_projects/store/actions.js | 12 +- .../import_entities/import_projects/store/index.js | 2 +- .../import_projects/store/mutations.js | 2 +- .../incidents/components/incidents_list.vue | 20 +- .../components/incidents_settings_tabs.vue | 4 +- .../incidents_settings_service.js | 2 +- app/assets/javascripts/init_changes_dropdown.js | 2 +- app/assets/javascripts/init_issuable_sidebar.js | 8 +- app/assets/javascripts/init_labels.js | 2 +- .../edit/components/active_checkbox.vue | 2 +- .../edit/components/confirmation_modal.vue | 2 +- .../integrations/edit/components/dynamic_field.vue | 6 +- .../edit/components/integration_form.vue | 183 +++---- .../edit/components/jira_issues_fields.vue | 41 +- .../edit/components/jira_trigger_fields.vue | 2 +- .../edit/components/override_dropdown.vue | 2 +- .../edit/components/reset_confirmation_modal.vue | 2 +- .../edit/components/trigger_fields.vue | 4 +- app/assets/javascripts/integrations/edit/index.js | 22 +- .../javascripts/integrations/edit/store/actions.js | 15 + .../integrations/edit/store/mutation_types.js | 4 + .../integrations/edit/store/mutations.js | 9 + .../javascripts/integrations/edit/store/state.js | 3 + .../integrations/integration_settings_form.js | 55 ++- .../components/invite_member_modal.vue | 5 +- .../components/invite_member_trigger.vue | 2 +- .../invite_member/init_invite_member_modal.js | 2 +- .../components/invite_members_modal.vue | 9 +- .../components/members_token_select.vue | 4 +- .../invite_members/init_invite_members_modal.js | 4 +- .../issuable/components/issuable_by_email.vue | 169 +++++++ .../javascripts/issuable/init_issuable_by_email.js | 35 ++ .../javascripts/issuable_bulk_update_actions.js | 3 +- .../javascripts/issuable_bulk_update_sidebar.js | 16 +- app/assets/javascripts/issuable_context.js | 4 +- .../issuable_create/components/issuable_form.vue | 3 +- app/assets/javascripts/issuable_form.js | 6 +- app/assets/javascripts/issuable_index.js | 28 -- .../issuable_init_bulk_update_sidebar.js | 2 +- .../issuable_list/components/issuable_item.vue | 34 +- .../components/issuable_list_root.vue | 9 +- .../issuable_list/components/issuable_tabs.vue | 7 +- .../issuable_show/components/issuable_body.vue | 2 +- .../components/issuable_description.vue | 2 +- .../components/issuable_edit_form.vue | 2 +- .../issuable_show/components/issuable_header.vue | 12 +- .../components/issuable_show_root.vue | 2 +- .../issuable_show/components/issuable_title.vue | 2 +- .../components/issuable_sidebar_root.vue | 2 +- .../queries/issue_sidebar.query.graphql | 1 + .../issuable_suggestions/components/app.vue | 2 +- .../issuable_suggestions/components/item.vue | 4 +- .../javascripts/issuable_suggestions/index.js | 2 +- app/assets/javascripts/issue.js | 6 +- .../javascripts/issue_show/components/app.vue | 15 +- .../issue_show/components/description.vue | 8 +- .../issue_show/components/edit_actions.vue | 2 +- .../issue_show/components/fields/description.vue | 4 +- .../components/fields/description_template.vue | 10 +- .../issue_show/components/fields/title.vue | 2 + .../javascripts/issue_show/components/form.vue | 15 +- .../issue_show/components/header_actions.vue | 6 +- .../components/incidents/incident_tabs.vue | 8 +- .../javascripts/issue_show/components/title.vue | 2 +- app/assets/javascripts/issue_show/incident.js | 2 +- app/assets/javascripts/issue_show/issue.js | 1 + .../javascripts/issue_show/utils/parse_data.js | 2 +- app/assets/javascripts/issue_status_select.js | 2 +- .../issues_list/components/issuable.vue | 13 +- .../issues_list/components/issuables_list_app.vue | 18 +- .../components/jira_issues_list_root.vue | 4 +- app/assets/javascripts/issues_list/index.js | 2 +- app/assets/javascripts/jira_connect/api.js | 20 +- .../javascripts/jira_connect/components/app.vue | 66 ++- .../jira_connect/components/groups_list.vue | 74 +-- .../jira_connect/components/groups_list_item.vue | 47 +- app/assets/javascripts/jira_connect/index.js | 97 ++-- app/assets/javascripts/jira_connect/store/index.js | 5 +- .../jira_import/components/jira_import_form.vue | 27 +- .../queries/search_project_members.query.graphql | 13 + .../jobs/components/artifacts_block.vue | 29 +- .../javascripts/jobs/components/empty_state.vue | 2 +- .../jobs/components/environments_block.vue | 6 +- .../javascripts/jobs/components/erased_block.vue | 20 +- app/assets/javascripts/jobs/components/job_app.vue | 29 +- .../jobs/components/job_container_item.vue | 4 +- .../jobs/components/job_log_controllers.vue | 4 - .../jobs/components/log/duration_badge.vue | 9 +- .../jobs/components/log/line_header.vue | 2 +- .../jobs/components/manual_variables_form.vue | 2 +- app/assets/javascripts/jobs/components/sidebar.vue | 29 +- .../jobs/components/sidebar_detail_row.vue | 14 +- .../components/sidebar_job_details_container.vue | 24 +- .../jobs/components/stages_dropdown.vue | 2 +- .../javascripts/jobs/components/stuck_block.vue | 2 +- .../javascripts/jobs/components/trigger_block.vue | 55 ++- app/assets/javascripts/jobs/index.js | 2 - app/assets/javascripts/jobs/store/actions.js | 10 +- app/assets/javascripts/jobs/store/getters.js | 10 +- app/assets/javascripts/jobs/store/index.js | 2 +- app/assets/javascripts/label_manager.js | 9 +- app/assets/javascripts/labels_select.js | 14 +- app/assets/javascripts/lib/graphql.js | 23 +- app/assets/javascripts/lib/utils/array_utility.js | 20 + app/assets/javascripts/lib/utils/axios_utils.js | 2 +- app/assets/javascripts/lib/utils/color_utils.js | 20 + app/assets/javascripts/lib/utils/common_utils.js | 16 +- app/assets/javascripts/lib/utils/constants.js | 6 + .../javascripts/lib/utils/datetime_utility.js | 157 +++++- app/assets/javascripts/lib/utils/number_utils.js | 2 +- app/assets/javascripts/lib/utils/poll.js | 2 +- .../javascripts/lib/utils/poll_until_complete.js | 2 +- app/assets/javascripts/lib/utils/sticky.js | 12 - app/assets/javascripts/lib/utils/text_markdown.js | 2 +- .../lib/utils/unit_format/formatter_factory.js | 3 +- app/assets/javascripts/lib/utils/url_utility.js | 58 +++ app/assets/javascripts/lib/utils/webpack.js | 5 +- .../logs/components/environment_logs.vue | 15 +- .../logs/components/log_advanced_filters.vue | 2 +- .../logs/components/log_simple_filters.vue | 4 +- app/assets/javascripts/logs/stores/actions.js | 4 +- app/assets/javascripts/logs/stores/mutations.js | 2 +- app/assets/javascripts/logs/stores/state.js | 2 +- app/assets/javascripts/main.js | 25 +- app/assets/javascripts/manual_ordering.js | 4 +- app/assets/javascripts/members.js | 4 +- .../access_request_action_buttons.vue | 4 +- .../approve_access_request_button.vue | 2 +- .../action_buttons/invite_action_buttons.vue | 2 +- .../components/action_buttons/leave_button.vue | 2 +- .../action_buttons/remove_group_link_button.vue | 3 +- .../action_buttons/remove_member_button.vue | 2 +- .../action_buttons/resend_invite_button.vue | 2 +- .../action_buttons/user_action_buttons.vue | 4 +- app/assets/javascripts/members/components/app.vue | 40 ++ .../members/components/avatars/user_avatar.vue | 7 +- .../filter_sort/filter_sort_container.vue | 2 +- .../filter_sort/members_filtered_search_bar.vue | 6 +- .../components/filter_sort/sort_dropdown.vue | 4 +- .../members/components/modals/leave_modal.vue | 2 +- .../components/modals/remove_group_link_modal.vue | 3 +- .../components/table/member_action_buttons.vue | 6 +- .../members/components/table/member_avatar.vue | 4 +- .../members/components/table/members_table.vue | 20 +- .../components/table/members_table_cell.vue | 8 +- app/assets/javascripts/members/constants.js | 5 + app/assets/javascripts/members/index.js | 43 ++ app/assets/javascripts/members/store/actions.js | 6 +- app/assets/javascripts/members/store/index.js | 4 +- app/assets/javascripts/members/store/mutations.js | 18 +- app/assets/javascripts/members/utils.js | 62 ++- .../merge_conflicts/components/diff_file_editor.js | 11 +- .../components/inline_conflict_lines.js | 5 +- .../components/parallel_conflict_lines.js | 3 + .../merge_conflicts/merge_conflict_store.js | 2 +- .../merge_conflicts/merge_conflicts_bundle.js | 8 +- app/assets/javascripts/merge_request.js | 8 +- .../merge_request/components/status_box.vue | 6 +- app/assets/javascripts/merge_request_tabs.js | 76 ++- app/assets/javascripts/milestone.js | 4 +- app/assets/javascripts/milestone_select.js | 29 +- .../components/milestone_results_section.vue | 7 +- app/assets/javascripts/mirrors/mirror_repos.js | 4 +- app/assets/javascripts/mirrors/ssh_mirror.js | 4 +- .../monitoring/components/alert_widget.vue | 11 +- .../monitoring/components/alert_widget_form.vue | 8 +- .../monitoring/components/charts/anomaly.vue | 4 +- .../monitoring/components/charts/column.vue | 4 +- .../monitoring/components/charts/gauge.vue | 2 +- .../monitoring/components/charts/heatmap.vue | 2 +- .../monitoring/components/charts/options.js | 2 +- .../monitoring/components/charts/single_stat.vue | 16 +- .../components/charts/stacked_column.vue | 4 +- .../monitoring/components/charts/time_series.vue | 12 +- .../components/create_dashboard_modal.vue | 2 +- .../monitoring/components/dashboard.vue | 31 +- .../components/dashboard_actions_menu.vue | 10 +- .../monitoring/components/dashboard_header.vue | 15 +- .../monitoring/components/dashboard_panel.vue | 28 +- .../components/dashboard_panel_builder.vue | 2 +- .../monitoring/components/dashboards_dropdown.vue | 2 +- .../components/duplicate_dashboard_modal.vue | 2 +- .../monitoring/components/embeds/embed_group.vue | 4 +- .../monitoring/components/embeds/metric_embed.vue | 4 +- .../monitoring/components/links_section.vue | 6 +- .../monitoring/components/refresh_button.vue | 4 +- .../monitoring/components/variables_section.vue | 4 +- app/assets/javascripts/monitoring/constants.js | 2 +- .../javascripts/monitoring/monitoring_app.js | 23 +- .../monitoring/pages/panel_new_page.vue | 4 +- .../javascripts/monitoring/requests/index.js | 2 +- .../javascripts/monitoring/stores/actions.js | 24 +- .../javascripts/monitoring/stores/mutations.js | 8 +- app/assets/javascripts/monitoring/stores/state.js | 4 +- app/assets/javascripts/monitoring/stores/utils.js | 8 +- .../monitoring/stores/variable_mapping.js | 2 +- app/assets/javascripts/monitoring/utils.js | 12 +- app/assets/javascripts/mr_notes/index.js | 13 +- app/assets/javascripts/mr_notes/init_notes.js | 4 +- app/assets/javascripts/mr_notes/stores/index.js | 2 +- .../mr_popover/components/mr_popover.vue | 2 +- app/assets/javascripts/mr_popover/index.js | 2 +- app/assets/javascripts/namespace_select.js | 4 +- app/assets/javascripts/namespaces/leave_by_url.js | 4 +- app/assets/javascripts/network/branch_graph.js | 2 +- app/assets/javascripts/notebook/cells/markdown.vue | 2 +- app/assets/javascripts/notes.js | 33 +- .../notes/components/comment_field_layout.vue | 2 +- .../javascripts/notes/components/comment_form.vue | 90 ++-- .../notes/components/diff_discussion_header.vue | 6 +- .../notes/components/diff_with_note.vue | 4 +- .../notes/components/discussion_actions.vue | 2 +- .../notes/components/discussion_counter.vue | 2 +- .../notes/components/discussion_filter.vue | 2 +- .../notes/components/discussion_navigator.vue | 2 +- .../notes/components/discussion_notes.vue | 14 +- .../discussion_notes_replies_wrapper.vue | 11 +- .../components/email_participants_warning.vue | 2 +- .../notes/components/multiline_comment_form.vue | 2 +- .../javascripts/notes/components/note_actions.vue | 117 +++-- .../notes/components/note_actions/reply_button.vue | 29 +- .../notes/components/note_awards_list.vue | 2 +- .../javascripts/notes/components/note_body.vue | 38 +- .../javascripts/notes/components/note_form.vue | 91 ++-- .../javascripts/notes/components/note_header.vue | 30 +- .../notes/components/noteable_discussion.vue | 63 +-- .../javascripts/notes/components/noteable_note.vue | 24 +- .../javascripts/notes/components/notes_app.vue | 47 +- .../notes/components/sort_discussion.vue | 2 +- .../notes/components/timeline_toggle.vue | 2 +- .../notes/components/toggle_replies_widget.vue | 25 +- app/assets/javascripts/notes/index.js | 2 +- app/assets/javascripts/notes/mixins/autosave.js | 2 +- .../notes/mixins/diff_line_note_form.js | 2 +- app/assets/javascripts/notes/stores/actions.js | 50 +- app/assets/javascripts/notes/stores/getters.js | 2 + .../javascripts/notes/stores/modules/index.js | 3 +- .../javascripts/notes/stores/mutation_types.js | 1 + app/assets/javascripts/notes/stores/mutations.js | 38 +- app/assets/javascripts/notes/stores/utils.js | 4 +- .../components/custom_notifications_modal.vue | 128 +++++ .../components/notifications_dropdown.vue | 196 ++++++++ .../components/notifications_dropdown_item.vue | 42 ++ app/assets/javascripts/notifications/constants.js | 58 +++ app/assets/javascripts/notifications/index.js | 44 ++ app/assets/javascripts/notifications_dropdown.js | 2 +- app/assets/javascripts/notifications_form.js | 4 +- app/assets/javascripts/onboarding_issues/index.js | 128 ----- .../components/form_group/dashboard_timezone.vue | 2 +- .../components/form_group/external_dashboard.vue | 2 +- .../components/metrics_settings.vue | 8 +- app/assets/javascripts/operation_settings/index.js | 2 +- .../operation_settings/store/actions.js | 4 +- .../javascripts/operation_settings/store/index.js | 2 +- .../packages/details/components/app.vue | 14 +- .../details/components/installation_commands.vue | 4 +- .../packages/details/components/package_files.vue | 4 +- .../details/components/package_history.vue | 6 +- .../packages/details/components/package_title.vue | 10 +- app/assets/javascripts/packages/details/index.js | 2 +- .../javascripts/packages/details/store/actions.js | 2 +- .../packages/list/components/package_search.vue | 50 ++ .../packages/list/components/package_title.vue | 2 +- .../packages/list/components/packages_filter.vue | 21 - .../packages/list/components/packages_list.vue | 8 +- .../packages/list/components/packages_list_app.vue | 89 ++-- .../packages/list/components/packages_sort.vue | 60 --- .../list/components/tokens/package_type_token.vue | 26 + app/assets/javascripts/packages/list/constants.js | 9 +- .../packages/list/packages_list_app_bundle.js | 4 +- .../javascripts/packages/list/stores/actions.js | 11 +- .../javascripts/packages/list/stores/getters.js | 2 +- .../packages/list/stores/mutation_types.js | 1 - .../javascripts/packages/list/stores/mutations.js | 10 +- .../javascripts/packages/list/stores/state.js | 5 +- .../shared/components/package_list_row.vue | 10 +- .../packages/shared/components/package_tags.vue | 4 +- .../shared/components/packages_list_loader.vue | 4 +- .../settings/group/bundle.js | 8 + .../group/components/group_settings_app.vue | 131 ++++- .../settings/group/components/maven_settings.vue | 113 +++++ .../settings/group/constants.js | 31 ++ ...update_group_packages_settings.mutation.graphql | 9 + .../get_group_packages_settings.query.graphql | 8 + .../settings/group/graphql/utils/cache_update.js | 22 + .../group/graphql/utils/optimistic_responses.js | 11 + app/assets/javascripts/pager.js | 2 +- .../pages/admin/abuse_reports/abuse_reports.js | 2 +- .../javascripts/pages/admin/abuse_reports/index.js | 2 +- .../admin/application_settings/general/index.js | 6 +- .../pages/admin/application_settings/index.js | 6 +- .../application_settings/payload_previewer.js | 2 +- .../admin/broadcast_messages/broadcast_message.js | 4 +- .../pages/admin/clusters/index/index.js | 2 +- .../javascripts/pages/admin/clusters/show/index.js | 2 +- .../javascripts/pages/admin/cohorts/index.js | 22 - .../javascripts/pages/admin/groups/new/index.js | 2 +- app/assets/javascripts/pages/admin/index.js | 2 +- .../pages/admin/integrations/edit/index.js | 3 - .../jobs/index/components/stop_jobs_modal.vue | 2 +- .../javascripts/pages/admin/jobs/index/index.js | 3 +- .../javascripts/pages/admin/projects/index.js | 2 +- .../pages/admin/projects/index/index.js | 5 +- .../javascripts/pages/admin/runners/index.js | 5 +- .../javascripts/pages/admin/services/edit/index.js | 3 - .../admin/users/components/delete_user_modal.vue | 58 ++- .../admin/users/components/user_modal_manager.vue | 30 +- app/assets/javascripts/pages/admin/users/index.js | 14 +- .../javascripts/pages/dashboard/issues/index.js | 6 +- .../pages/dashboard/merge_requests/index.js | 4 +- .../index/components/customize_homepage_banner.vue | 2 +- .../pages/dashboard/todos/index/todos.js | 8 +- .../javascripts/pages/groups/boards/index.js | 2 +- .../javascripts/pages/groups/clusters/index.js | 2 +- .../pages/groups/clusters/index/index.js | 2 +- app/assets/javascripts/pages/groups/edit/index.js | 12 +- .../pages/groups/group_members/index.js | 26 +- .../javascripts/pages/groups/issues/index.js | 8 +- .../pages/groups/merge_requests/index.js | 6 +- .../pages/groups/milestones/show/index.js | 5 +- .../pages/groups/new/group_path_validator.js | 4 +- app/assets/javascripts/pages/groups/new/index.js | 2 +- .../pages/groups/settings/badges/index.js | 2 +- .../pages/groups/settings/ci_cd/show/index.js | 9 +- .../groups/settings/integrations/edit/index.js | 3 - .../pages/groups/settings/repository/show/index.js | 2 +- .../pages/groups/shared/group_details.js | 19 +- .../javascripts/pages/groups/shared/group_tabs.js | 4 +- app/assets/javascripts/pages/help/index/index.js | 2 +- .../javascripts/pages/import/bulk_imports/index.js | 4 - .../pages/import/bulk_imports/status/index.js | 4 + .../shared/components/delete_milestone_modal.vue | 4 +- .../shared/components/promote_milestone_modal.vue | 4 +- .../shared/delete_milestone_modal_init.js | 3 +- app/assets/javascripts/pages/oauth/index.js | 3 + .../pages/profiles/accounts/show/index.js | 2 +- app/assets/javascripts/pages/profiles/index.js | 3 + .../javascripts/pages/profiles/index/index.js | 2 +- .../pages/profiles/notifications/show/index.js | 4 +- .../javascripts/pages/profiles/show/index.js | 6 +- .../pages/profiles/two_factor_auths/index.js | 2 +- .../javascripts/pages/projects/activity/index.js | 6 +- .../projects/alert_management/details/index.js | 2 +- .../pages/projects/artifacts/browse/index.js | 2 +- .../pages/projects/artifacts/file/index.js | 2 +- .../javascripts/pages/projects/blame/show/index.js | 2 +- .../javascripts/pages/projects/blob/show/index.js | 6 +- .../javascripts/pages/projects/boards/index.js | 2 +- .../pages/projects/clusters/index/index.js | 8 +- .../pages/projects/clusters/new/index.js | 4 +- .../pages/projects/clusters/show/index.js | 2 +- .../pages/projects/commit/pipelines/index.js | 4 +- .../pages/projects/commit/show/index.js | 23 +- .../pages/projects/commits/show/index.js | 2 +- .../pages/projects/compare/index/index.js | 3 + .../pages/projects/compare/show/index.js | 2 +- .../javascripts/pages/projects/edit/index.js | 48 +- .../pages/projects/edit/mount_search_settings.js | 12 - .../pages/projects/environments/index/index.js | 2 +- .../pages/projects/environments/show/index.js | 2 +- .../pages/projects/find_file/show/index.js | 16 +- .../forks/new/components/fork_groups_list.vue | 7 +- .../forks/new/components/fork_groups_list_item.vue | 27 +- .../javascripts/pages/projects/forks/new/index.js | 6 +- .../pages/projects/incidents/show/index.js | 6 +- app/assets/javascripts/pages/projects/index.js | 2 +- app/assets/javascripts/pages/projects/init_blob.js | 6 +- app/assets/javascripts/pages/projects/init_form.js | 4 +- .../javascripts/pages/projects/issues/form.js | 4 +- .../pages/projects/issues/index/index.js | 14 +- .../issues/service_desk/filtered_search.js | 2 +- .../pages/projects/issues/service_desk/index.js | 2 +- .../javascripts/pages/projects/issues/show.js | 23 +- .../pages/projects/issues/show/index.js | 6 +- .../javascripts/pages/projects/jobs/index/index.js | 19 +- .../labels/components/promote_label_modal.vue | 4 +- .../pages/projects/labels/index/index.js | 7 +- .../learn_gitlab/components/learn_gitlab_a.vue | 27 ++ .../learn_gitlab/components/learn_gitlab_b.vue | 27 ++ .../pages/projects/learn_gitlab/constants/index.js | 12 + .../pages/projects/learn_gitlab/index/index.js | 25 + .../projects/merge_requests/conflicts/index.js | 2 +- .../projects/merge_requests/creations/index.js | 2 +- .../merge_requests/creations/new/compare.js | 4 +- .../projects/merge_requests/creations/new/index.js | 26 +- .../merge_requests/edit/check_form_state.js | 24 + .../pages/projects/merge_requests/edit/index.js | 6 +- .../pages/projects/merge_requests/index/index.js | 9 +- .../projects/merge_requests/init_merge_request.js | 2 +- .../merge_requests/init_merge_request_show.js | 14 +- .../pages/projects/merge_requests/show/index.js | 10 +- .../pages/projects/milestones/show/index.js | 2 +- app/assets/javascripts/pages/projects/new/index.js | 4 +- .../shared/components/interval_pattern_input.vue | 2 +- .../components/pipeline_schedules_callout.vue | 6 +- .../pipeline_schedules/shared/init_form.js | 6 +- .../pages/projects/pipelines/new/index.js | 2 +- .../projects/product_analytics/graphs/index.js | 2 +- app/assets/javascripts/pages/projects/project.js | 15 +- .../pages/projects/project_members/index.js | 92 +++- .../pages/projects/releases/edit/index.js | 8 +- .../pages/projects/releases/index/index.js | 2 +- .../pages/projects/releases/new/index.js | 8 +- .../pages/projects/releases/show/index.js | 2 +- .../pages/projects/security/configuration/index.js | 3 + .../javascripts/pages/projects/serverless/index.js | 6 +- .../pages/projects/services/edit/index.js | 4 +- .../pages/projects/settings/ci_cd/show/index.js | 11 +- .../projects/settings/operations/show/index.js | 6 +- .../pages/projects/settings/repository/form.js | 10 +- .../projects/settings/repository/show/index.js | 2 +- .../components/project_feature_setting.vue | 11 +- .../permissions/components/settings_panel.vue | 97 ++-- .../permissions/mixins/settings_pannel_mixin.js | 1 + .../javascripts/pages/projects/show/index.js | 27 +- .../javascripts/pages/projects/tags/index/index.js | 10 +- .../javascripts/pages/projects/tags/new/index.js | 2 +- .../pages/projects/tags/releases/index.js | 2 +- .../javascripts/pages/projects/tags/remove_tag.js | 2 +- .../javascripts/pages/projects/tags/show/index.js | 10 +- .../javascripts/pages/projects/wikis/index.js | 2 +- .../javascripts/pages/registrations/new/index.js | 2 +- app/assets/javascripts/pages/search/show/index.js | 4 +- app/assets/javascripts/pages/search/show/search.js | 54 --- app/assets/javascripts/pages/sessions/new/index.js | 6 +- .../pages/sessions/new/username_validator.js | 4 +- .../pages/shared/mount_runner_instructions.js | 32 ++ app/assets/javascripts/pages/shared/wikis/index.js | 8 +- .../javascripts/pages/users/activity_calendar.js | 8 +- app/assets/javascripts/pages/users/user_tabs.js | 16 +- .../performance_bar/components/add_request.vue | 2 +- .../performance_bar/components/detailed_metric.vue | 21 +- .../components/performance_bar_app.vue | 17 +- app/assets/javascripts/performance_bar/index.js | 5 +- .../performance_bar/performance_bar_log.js | 2 +- .../services/performance_bar_service.js | 2 +- app/assets/javascripts/persistent_user_callout.js | 4 +- .../components/commit/commit_section.vue | 114 +++++ .../components/editor/ci_config_merged_preview.vue | 100 ++++ .../components/editor/text_editor.vue | 52 ++ .../components/header/pipeline_editor_header.vue | 30 ++ .../components/header/validation_segment.vue | 84 ++++ .../components/info/validation_segment.vue | 84 ---- .../components/lint/ci_lint_results.vue | 6 +- .../components/lint/ci_lint_results_param.vue | 2 +- .../components/pipeline_editor_tabs.vue | 121 +++++ .../pipeline_editor/components/text_editor.vue | 46 -- .../ui/confirm_unsaved_changes_dialog.vue | 26 + .../javascripts/pipeline_editor/constants.js | 14 + .../mutations/commit_ci_file.mutation.graphql | 2 +- .../graphql/queries/ci_config.graphql | 1 + .../graphql/queries/client/commit_sha.graphql | 3 + app/assets/javascripts/pipeline_editor/index.js | 36 +- .../pipeline_editor/pipeline_editor_app.vue | 269 ++++------- .../pipeline_editor/pipeline_editor_home.vue | 60 +++ .../pipeline_new/components/pipeline_new_form.vue | 45 +- .../javascripts/pipelines/components/dag/dag.vue | 10 +- .../pipelines/components/dag/dag_graph.vue | 6 +- .../components/graph/action_component.vue | 5 +- .../pipelines/components/graph/constants.js | 6 + .../pipelines/components/graph/graph_component.vue | 21 +- .../components/graph/graph_component_legacy.vue | 6 +- .../components/graph/job_group_dropdown.vue | 2 +- .../pipelines/components/graph/job_item.vue | 9 +- .../components/graph/job_name_component.vue | 2 +- .../pipelines/components/graph/linked_pipeline.vue | 5 +- .../components/graph/linked_pipelines_column.vue | 32 +- .../graph/linked_pipelines_column_legacy.vue | 2 +- .../components/graph/stage_column_component.vue | 26 +- .../graph/stage_column_component_legacy.vue | 4 +- .../components/graph_shared/drawing_utils.js | 4 +- .../components/graph_shared/links_inner.vue | 22 +- .../components/graph_shared/links_layer.vue | 6 +- .../pipelines/components/header_component.vue | 8 +- .../components/legacy_header_component.vue | 132 ------ .../components/pipeline_graph/pipeline_graph.vue | 28 +- .../components/pipelines_list/empty_state.vue | 45 +- .../pipelines_list/pipeline_stop_modal.vue | 4 +- .../components/pipelines_list/pipeline_url.vue | 9 + .../components/pipelines_list/pipelines.vue | 44 +- .../pipelines_list/pipelines_actions.vue | 68 ++- .../pipelines_list/pipelines_filtered_search.vue | 2 +- .../components/pipelines_list/pipelines_table.vue | 4 +- .../pipelines_list/pipelines_table_row.vue | 123 +---- .../pipelines/components/pipelines_list/stage.vue | 139 ++++-- .../tokens/pipeline_branch_name_token.vue | 2 +- .../tokens/pipeline_tag_name_token.vue | 2 +- .../components/test_reports/test_case_details.vue | 40 +- .../components/test_reports/test_reports.vue | 2 +- .../components/test_reports/test_suite_table.vue | 11 +- .../components/test_reports/test_summary_table.vue | 2 +- .../javascripts/pipelines/mixins/pipelines.js | 188 -------- .../pipelines/mixins/pipelines_mixin.js | 217 +++++++++ .../pipelines/pipeline_details_bundle.js | 110 +---- .../javascripts/pipelines/pipeline_details_dag.js | 2 +- .../pipelines/pipeline_details_graph.js | 2 +- .../pipelines/pipeline_details_mediator.js | 2 +- .../javascripts/pipelines/pipelines_index.js | 6 +- .../pipelines/services/pipelines_service.js | 2 +- .../pipelines/stores/test_reports/actions.js | 12 +- .../pipelines/stores/test_reports/getters.js | 12 +- .../pipelines/stores/test_reports/index.js | 2 +- .../pipelines/stores/test_reports/state.js | 3 +- .../pipelines/stores/test_reports/utils.js | 19 +- app/assets/javascripts/pipelines/utils.js | 6 +- app/assets/javascripts/popovers/index.js | 2 +- .../account/components/delete_account_modal.vue | 2 +- .../profile/account/components/update_username.vue | 4 +- app/assets/javascripts/profile/account/index.js | 5 +- .../preferences/components/profile_preferences.vue | 105 ++++- .../javascripts/profile/preferences/constants.js | 22 + .../preferences/profile_preferences_bundle.js | 20 +- app/assets/javascripts/profile/profile.js | 5 +- app/assets/javascripts/project_find_file.js | 6 +- .../javascripts/project_label_subscription.js | 6 +- app/assets/javascripts/project_select.js | 4 +- .../commit/components/branches_dropdown.vue | 2 + .../projects/commit/components/form_modal.vue | 5 +- .../projects/commit/components/form_trigger.vue | 5 +- .../javascripts/projects/commit/constants.js | 9 + app/assets/javascripts/projects/commit/index.js | 11 + .../commit/init_cherry_pick_commit_modal.js | 51 ++ .../commit/init_cherry_pick_commit_trigger.js | 20 + .../projects/commit/init_revert_commit_modal.js | 4 +- .../projects/commit/init_revert_commit_trigger.js | 8 +- .../javascripts/projects/commit/store/actions.js | 4 +- .../javascripts/projects/commit_box/info/index.js | 4 +- .../projects/commits/components/author_select.vue | 6 +- .../javascripts/projects/commits/store/actions.js | 8 +- .../projects/compare/components/app.vue | 89 ++++ .../compare/components/revision_dropdown.vue | 145 ++++++ app/assets/javascripts/projects/compare/index.js | 33 ++ .../projects/components/project_delete_button.vue | 4 +- .../projects/components/shared/delete_button.vue | 4 +- .../components/app.vue | 6 +- .../experiment_new_project_creation/index.js | 2 +- .../javascripts/projects/members/constants.js | 1 + app/assets/javascripts/projects/members/utils.js | 8 + .../projects/pipelines/charts/components/app.vue | 203 +------- .../charts/components/ci_cd_analytics_charts.vue | 50 ++ .../charts/components/pipeline_charts.vue | 233 +++++++-- .../projects/pipelines/charts/constants.js | 2 + .../projects/settings/access_dropdown.js | 87 ++-- .../settings/components/shared_runners_toggle.vue | 2 +- .../settings/mount_shared_runners_toggle.js | 2 +- .../components/service_desk_root.vue | 67 +-- .../components/service_desk_setting.vue | 20 +- .../projects/settings_service_desk/event_hub.js | 3 - .../projects/settings_service_desk/index.js | 70 ++- .../services/service_desk_service.js | 23 - .../commit_pipeline_status_component.vue | 6 +- .../prometheus_alerts/components/reset_key.vue | 4 +- .../prometheus_metrics/custom_metrics.js | 6 +- .../prometheus_metrics/prometheus_metrics.js | 2 +- .../protected_branches/protected_branch_create.js | 10 +- .../protected_branches/protected_branch_edit.js | 6 +- app/assets/javascripts/protected_tags/constants.js | 3 + .../protected_tag_access_dropdown.js | 2 +- .../protected_tags/protected_tag_create.js | 4 +- .../protected_tags/protected_tag_edit.js | 9 +- .../javascripts/ref/components/ref_selector.vue | 4 +- app/assets/javascripts/ref/stores/mutations.js | 4 +- .../registry/explorer/components/delete_image.vue | 76 +++ .../components/details_page/delete_modal.vue | 37 +- .../components/details_page/details_header.vue | 36 +- .../components/details_page/empty_state.vue | 44 ++ .../components/details_page/empty_tags_state.vue | 33 -- .../components/details_page/status_alert.vue | 50 ++ .../explorer/components/details_page/tags_list.vue | 13 +- .../components/details_page/tags_list_row.vue | 10 +- .../components/list_page/image_list_row.vue | 5 +- .../components/list_page/registry_header.vue | 6 +- .../registry/explorer/constants/details.js | 64 ++- .../registry/explorer/constants/list.js | 10 +- ...et_container_repositories_details.query.graphql | 19 +- app/assets/javascripts/registry/explorer/index.js | 18 +- .../registry/explorer/pages/details.vue | 157 ++++-- .../javascripts/registry/explorer/pages/list.vue | 129 +++-- app/assets/javascripts/registry/explorer/router.js | 4 +- .../settings/components/registry_settings_app.vue | 2 +- .../registry/settings/components/settings_form.vue | 6 +- .../registry/settings/registry_settings_bundle.js | 4 +- .../components/add_issuable_form.vue | 4 +- .../components/related_issuable_input.vue | 2 +- .../components/related_issues_block.vue | 6 +- .../components/related_issues_list.vue | 4 +- .../components/related_issues_root.vue | 6 +- .../components/related_merge_requests.vue | 2 +- .../related_merge_requests/store/actions.js | 4 +- .../related_merge_requests/store/index.js | 2 +- .../releases/components/app_edit_new.vue | 8 +- .../javascripts/releases/components/app_index.vue | 4 +- .../releases/components/asset_links_form.vue | 4 +- .../releases/components/evidence_block.vue | 6 +- .../releases/components/release_block.vue | 4 +- .../releases/components/release_block_assets.vue | 2 +- .../releases/components/release_block_footer.vue | 2 +- .../releases/components/release_block_header.vue | 19 +- .../components/releases_pagination_graphql.vue | 2 +- .../components/releases_pagination_rest.vue | 2 +- .../releases/components/tag_field_existing.vue | 4 +- .../releases/components/tag_field_new.vue | 2 +- .../releases/stores/modules/detail/actions.js | 6 +- .../releases/stores/modules/detail/mutations.js | 2 +- .../releases/stores/modules/list/actions.js | 8 +- .../releases/stores/modules/list/index.js | 2 +- app/assets/javascripts/releases/util.js | 2 +- .../grouped_accessibility_reports_app.vue | 2 +- .../reports/accessibility_report/store/actions.js | 4 +- .../reports/accessibility_report/store/getters.js | 2 +- .../components/codequality_issue_body.vue | 2 +- .../grouped_codequality_reports_app.vue | 18 +- .../reports/codequality_report/store/actions.js | 19 +- .../reports/codequality_report/store/getters.js | 4 +- .../reports/codequality_report/store/mutations.js | 5 +- .../reports/codequality_report/store/state.js | 2 + .../store/utils/codequality_comparison.js | 4 +- .../reports/components/grouped_issues_list.vue | 2 +- .../components/grouped_test_reports_app.vue | 16 +- .../javascripts/reports/components/issue_body.js | 2 +- .../reports/components/report_section.vue | 2 +- .../reports/components/test_issue_body.vue | 2 +- app/assets/javascripts/reports/store/actions.js | 2 +- .../repository/components/breadcrumbs.vue | 2 +- .../repository/components/last_commit.vue | 4 +- .../repository/components/preview/index.vue | 2 +- .../repository/components/table/index.vue | 2 +- .../repository/components/table/row.vue | 4 +- .../repository/components/tree_content.vue | 4 +- app/assets/javascripts/repository/graphql.js | 4 +- app/assets/javascripts/repository/index.js | 12 +- .../javascripts/repository/mixins/preload.js | 2 +- app/assets/javascripts/repository/pages/index.vue | 2 +- app/assets/javascripts/repository/pages/tree.vue | 2 +- app/assets/javascripts/repository/router.js | 2 +- app/assets/javascripts/right_sidebar.js | 4 +- .../search/highlight_blob_search_result.js | 4 +- app/assets/javascripts/search/index.js | 15 +- .../javascripts/search/sidebar/components/app.vue | 4 +- .../search/sidebar/components/radio_filter.vue | 2 +- .../javascripts/search/sort/components/app.vue | 103 ++++ app/assets/javascripts/search/sort/constants.js | 19 + app/assets/javascripts/search/sort/index.js | 27 ++ app/assets/javascripts/search/store/actions.js | 2 +- .../javascripts/search/topbar/components/app.vue | 73 +++ .../search/topbar/components/group_filter.vue | 5 +- .../search/topbar/components/project_filter.vue | 5 +- .../topbar/components/searchable_dropdown.vue | 2 +- app/assets/javascripts/search/topbar/index.js | 31 +- app/assets/javascripts/search_autocomplete.js | 6 +- .../search_settings/components/search_settings.vue | 52 +- app/assets/javascripts/search_settings/index.js | 27 +- app/assets/javascripts/search_settings/mount.js | 23 + .../security_configuration/components/app.vue | 23 + .../components/configuration_table.vue | 97 ++++ .../components/features_constants.js | 112 +++++ .../components/manage_sast.vue | 57 +++ .../security_configuration/components/upgrade.vue | 26 + .../graphql/configure_sast.mutation.graphql | 6 + .../javascripts/security_configuration/index.js | 29 ++ .../self_monitor/components/self_monitor_form.vue | 9 +- app/assets/javascripts/self_monitor/index.js | 2 +- .../javascripts/self_monitor/store/actions.js | 4 +- app/assets/javascripts/self_monitor/store/index.js | 2 +- app/assets/javascripts/sentry/sentry_config.js | 2 +- .../javascripts/sentry_error_stack_trace/index.js | 2 +- .../javascripts/serverless/components/area.vue | 2 +- .../serverless/components/environment_row.vue | 2 +- .../serverless/components/function_details.vue | 4 +- .../serverless/components/function_row.vue | 2 +- .../serverless/components/functions.vue | 28 +- .../javascripts/serverless/serverless_bundle.js | 2 +- app/assets/javascripts/serverless/store/actions.js | 6 +- .../javascripts/serverless/survey_banner.vue | 2 +- .../components/user_availability_status.vue | 26 - .../set_status_modal/set_status_modal_wrapper.vue | 12 +- app/assets/javascripts/set_status_modal/utils.js | 6 +- app/assets/javascripts/settings_panels.js | 25 +- app/assets/javascripts/shared/milestones/form.js | 2 +- .../components/assignees/assignee_avatar_link.vue | 54 ++- .../sidebar/components/assignees/assignees.vue | 16 +- .../components/assignees/assignees_realtime.vue | 2 +- .../components/assignees/collapsed_assignee.vue | 14 +- .../assignees/collapsed_assignee_list.vue | 37 +- .../components/assignees/issuable_assignees.vue | 10 +- .../components/assignees/sidebar_assignees.vue | 18 +- .../assignees/sidebar_assignees_widget.vue | 403 ++++++++++++++++ .../assignees/uncollapsed_assignee_list.vue | 7 +- .../components/assignees/user_name_with_status.vue | 40 ++ .../confidential/confidential_issue_sidebar.vue | 2 +- .../sidebar/components/confidential/edit_form.vue | 2 +- .../components/confidential/edit_form_buttons.vue | 4 +- .../sidebar/components/labels/sidebar_labels.vue | 2 +- .../sidebar/components/lock/edit_form_buttons.vue | 4 +- .../sidebar/components/lock/issuable_lock_form.vue | 2 +- .../components/reviewers/reviewer_avatar_link.vue | 4 +- .../sidebar/components/reviewers/reviewers.vue | 6 +- .../components/reviewers/sidebar_reviewers.vue | 8 +- .../reviewers/uncollapsed_reviewer_list.vue | 128 ++--- .../components/severity/sidebar_severity.vue | 2 +- .../sidebar/components/sidebar_editable_item.vue | 95 ++++ .../subscriptions/sidebar_subscriptions.vue | 2 +- .../components/subscriptions/subscriptions.vue | 15 +- .../components/time_tracking/help_state.vue | 2 +- .../time_tracking/sidebar_time_tracking.vue | 7 +- .../components/time_tracking/time_tracker.vue | 13 +- .../sidebar/components/todo_toggle/todo.vue | 4 +- app/assets/javascripts/sidebar/constants.js | 16 + .../javascripts/sidebar/lib/sidebar_move_issue.js | 2 +- .../javascripts/sidebar/mount_milestone_sidebar.js | 2 +- app/assets/javascripts/sidebar/mount_sidebar.js | 56 ++- .../queries/reviewer_rereview.mutation.graphql | 5 + .../sidebar/services/sidebar_service.js | 15 +- app/assets/javascripts/sidebar/sidebar_bundle.js | 2 +- app/assets/javascripts/sidebar/sidebar_mediator.js | 16 +- .../javascripts/sidebar/stores/sidebar_store.js | 8 + app/assets/javascripts/single_file_diff.js | 8 +- app/assets/javascripts/snippet/snippet_edit.js | 4 +- app/assets/javascripts/snippet/snippet_show.js | 4 +- .../javascripts/snippets/components/edit.vue | 81 +++- .../snippets/components/embed_dropdown.vue | 2 +- .../javascripts/snippets/components/show.vue | 14 +- .../components/snippet_blob_actions_edit.vue | 2 +- .../snippets/components/snippet_blob_edit.vue | 8 +- .../snippets/components/snippet_blob_view.vue | 4 +- .../components/snippet_description_edit.vue | 2 +- .../snippets/components/snippet_header.vue | 6 +- .../components/snippet_visibility_edit.vue | 2 +- app/assets/javascripts/snippets/index.js | 2 +- app/assets/javascripts/snippets/mixins/snippets.js | 8 +- .../mutations/createSnippet.mutation.graphql | 2 + .../mutations/updateSnippet.mutation.graphql | 3 + app/assets/javascripts/snippets/utils/blob.js | 4 +- app/assets/javascripts/snippets/utils/error.js | 15 + app/assets/javascripts/star.js | 4 +- .../static_site_editor/components/edit_area.vue | 12 +- .../static_site_editor/components/edit_drawer.vue | 7 +- .../components/edit_meta_modal.vue | 5 +- .../static_site_editor/graphql/index.js | 4 +- .../static_site_editor/image_repository.js | 2 +- app/assets/javascripts/static_site_editor/index.js | 2 +- .../javascripts/static_site_editor/pages/home.vue | 8 +- .../static_site_editor/pages/success.vue | 2 +- .../services/submit_content_changes.js | 2 +- app/assets/javascripts/subscription_select.js | 2 +- app/assets/javascripts/task_list.js | 2 +- .../templates/issuable_template_selector.js | 27 +- app/assets/javascripts/terminal/terminal.js | 2 +- .../terraform/components/states_table.vue | 62 ++- .../terraform/components/states_table_actions.vue | 80 +++- .../terraform/components/terraform_list.vue | 2 +- .../graphql/fragments/state.fragment.graphql | 5 + .../mutations/add_data_to_state.mutation.graphql | 3 + .../javascripts/terraform/graphql/resolvers.js | 45 ++ app/assets/javascripts/terraform/index.js | 14 +- app/assets/javascripts/toggle_buttons.js | 2 +- app/assets/javascripts/tooltips/index.js | 94 ++-- app/assets/javascripts/ui_development_kit.js | 2 +- app/assets/javascripts/usage_ping_consent.js | 2 +- .../user_lists/components/edit_user_list.vue | 2 +- .../user_lists/components/new_user_list.vue | 2 +- .../user_lists/components/user_list.vue | 2 +- .../javascripts/user_lists/store/edit/index.js | 2 +- .../javascripts/user_lists/store/new/index.js | 2 +- .../javascripts/user_lists/store/show/index.js | 2 +- .../javascripts/user_lists/store/show/mutations.js | 2 +- app/assets/javascripts/users_select/index.js | 19 +- .../components/approvals/approvals.vue | 4 +- .../components/approvals/approvals_summary.vue | 4 +- .../components/artifacts_list_app.vue | 2 +- .../components/deployment/deployment.vue | 2 +- .../components/deployment/deployment_actions.vue | 6 +- .../components/deployment/deployment_info.vue | 2 +- .../components/deployment/memory_usage.vue | 4 +- .../components/mr_widget_header.vue | 10 +- .../components/mr_widget_how_to_merge_modal.vue | 2 +- .../components/mr_widget_pipeline.vue | 37 +- .../components/mr_widget_pipeline_container.vue | 2 +- .../components/mr_widget_status_icon.vue | 3 +- .../components/mr_widget_suggest_pipeline.vue | 2 +- .../states/mr_widget_auto_merge_enabled.vue | 28 +- .../states/mr_widget_auto_merge_failed.vue | 4 +- .../components/states/mr_widget_conflicts.vue | 4 +- .../states/mr_widget_failed_to_merge.vue | 14 +- .../components/states/mr_widget_merged.vue | 21 +- .../components/states/mr_widget_missing_branch.vue | 2 +- .../components/states/mr_widget_rebase.vue | 25 +- .../components/states/nothing_to_merge.vue | 27 +- .../components/states/pipeline_failed.vue | 26 +- .../components/states/ready_to_merge.vue | 45 +- .../components/states/unresolved_discussions.vue | 2 +- .../components/states/work_in_progress.vue | 6 +- .../terraform/mr_widget_terraform_container.vue | 13 +- .../components/terraform/terraform_plan.vue | 38 +- .../javascripts/vue_merge_request_widget/index.js | 8 +- .../mixins/ready_to_merge.js | 3 + .../vue_merge_request_widget/mr_widget_options.vue | 63 +-- .../queries/get_state.query.graphql | 2 + .../states/auto_merge_enabled.fragment.graphql | 1 + .../states/auto_merge_enabled.query.graphql | 1 - .../queries/states/ready_to_merge.fragment.graphql | 1 + .../stores/artifacts_list/actions.js | 2 +- .../stores/artifacts_list/index.js | 2 +- .../stores/mr_widget_store.js | 24 +- .../alert_details/components/alert_details.vue | 392 +++++++++++++++ .../alert_details/components/alert_metrics.vue | 56 +++ .../alert_details/components/alert_sidebar.vue | 86 ++++ .../alert_details/components/alert_status.vue | 125 +++++ .../alert_details/components/alert_summary_row.vue | 18 + .../components/sidebar/sidebar_assignee.vue | 38 ++ .../components/sidebar/sidebar_assignees.vue | 299 ++++++++++++ .../components/sidebar/sidebar_header.vue | 41 ++ .../components/sidebar/sidebar_status.vue | 120 +++++ .../components/sidebar/sidebar_todo.vue | 149 ++++++ .../components/system_notes/system_note.vue | 48 ++ .../vue_shared/alert_details/constants.js | 31 ++ .../fragments/alert_detail_item.fragment.graphql | 30 ++ .../mutations/alert_issue_create.mutation.graphql | 8 + .../mutations/alert_set_assignees.mutation.graphql | 25 + .../alert_sidebar_status.mutation.graphql | 3 + .../mutations/alert_todo_create.mutation.graphql | 10 + .../graphql/queries/alert_details.query.graphql | 11 + .../queries/alert_sidebar_status.query.graphql | 3 + .../javascripts/vue_shared/alert_details/index.js | 83 ++++ .../javascripts/vue_shared/alert_details/router.js | 13 + .../vue_shared/components/actions_button.vue | 3 +- .../vue_shared/components/alert_details_table.vue | 2 +- .../vue_shared/components/awards_list.vue | 4 +- .../vue_shared/components/blob_viewers/mixins.js | 2 +- .../components/blob_viewers/rich_viewer.vue | 2 +- .../components/blob_viewers/simple_viewer.vue | 2 +- .../vue_shared/components/clone_dropdown.vue | 2 +- .../components/color_picker/color_picker.vue | 61 ++- .../javascripts/vue_shared/components/commit.vue | 8 +- .../components/content_viewer/content_viewer.vue | 4 +- .../content_viewer/viewers/image_viewer.vue | 8 +- .../content_viewer/viewers/markdown_viewer.vue | 3 +- .../date_time_picker/date_time_picker.vue | 3 +- .../date_time_picker/date_time_picker_input.vue | 2 +- .../components/diff_viewer/diff_viewer.vue | 4 +- .../viewers/image_diff/onion_skin_viewer.vue | 2 +- .../viewers/image_diff/swipe_viewer.vue | 2 +- .../diff_viewer/viewers/image_diff_viewer.vue | 6 +- .../components/diff_viewer/viewers/renamed.vue | 4 +- .../components/dismissible_feedback_alert.vue | 2 +- .../components/dropdown/dropdown_button.vue | 6 +- .../vue_shared/components/editor_lite.vue | 5 +- .../vue_shared/components/file_finder/index.vue | 4 +- .../vue_shared/components/file_finder/item.vue | 4 +- .../vue_shared/components/file_icon.vue | 10 +- .../javascripts/vue_shared/components/file_row.vue | 5 +- .../filtered_search_bar_root.vue | 9 +- .../store/modules/filters/actions.js | 2 +- .../store/modules/filters/index.js | 2 +- .../filtered_search_bar/tokens/label_token.vue | 5 +- .../filtered_search_bar/tokens/milestone_token.vue | 2 +- .../components/gfm_autocomplete/utils.js | 4 +- .../vue_shared/components/gl_modal_vuex.vue | 7 +- .../vue_shared/components/header_ci_component.vue | 10 +- .../vue_shared/components/help_popover.vue | 40 +- .../issuable/issuable_header_warnings.vue | 2 +- .../components/issue/issue_milestone.vue | 2 +- .../components/issue/related_issuable_item.vue | 6 +- .../vue_shared/components/markdown/field.vue | 17 +- .../vue_shared/components/markdown/header.vue | 5 +- .../components/markdown/suggestion_diff.vue | 2 +- .../components/markdown/suggestion_diff_header.vue | 9 +- .../vue_shared/components/markdown/suggestions.vue | 16 +- .../vue_shared/components/markdown/toolbar.vue | 4 +- .../vue_shared/components/modal_copy_button.vue | 3 +- .../vue_shared/components/navigation_tabs.vue | 2 +- .../vue_shared/components/notes/system_note.vue | 8 +- .../paginated_table_with_search_and_tabs.vue | 8 +- .../project_selector/project_list_item.vue | 2 +- .../project_selector/project_selector.vue | 2 +- .../components/registry/code_instruction.vue | 2 +- .../vue_shared/components/registry/list_item.vue | 16 +- .../components/registry/registry_search.vue | 90 ++++ .../rich_content_editor/rich_content_editor.vue | 2 +- .../services/build_custom_renderer.js | 8 +- .../rich_content_editor/services/editor_service.js | 6 +- .../services/renderers/render_html_block.js | 4 +- .../rich_content_editor/services/sanitize_html.js | 2 +- .../components/runner_instructions/constants.js | 18 + .../queries/get_runner_platforms.query.graphql | 20 + .../graphql/queries/get_runner_setup.query.graphql | 16 + .../runner_instructions/runner_instructions.vue | 261 ++++++++++ .../components/settings/settings_block.vue | 45 ++ .../sidebar/collapsed_grouped_date_picker.vue | 2 +- .../vue_shared/components/sidebar/date_picker.vue | 6 +- .../components/sidebar/labels_select/base.vue | 17 +- .../sidebar/labels_select_vue/dropdown_button.vue | 2 +- .../labels_select_vue/dropdown_contents.vue | 2 +- .../dropdown_contents_create_view.vue | 2 +- .../dropdown_contents_labels_view.vue | 2 +- .../sidebar/labels_select_vue/dropdown_title.vue | 2 +- .../sidebar/labels_select_vue/dropdown_value.vue | 2 +- .../labels_select_vue/labels_select_root.vue | 19 +- .../sidebar/labels_select_vue/store/actions.js | 2 +- .../sidebar/labels_select_vue/store/mutations.js | 2 +- .../components/sidebar/multiselect_dropdown.vue | 2 +- .../queries/getIssueParticipants.query.graphql | 13 - .../queries/get_issue_participants.query.graphql | 19 + .../queries/get_mr_participants.query.graphql | 19 + .../queries/updateAssignees.mutation.graphql | 17 - .../update_issue_assignees.mutation.graphql | 21 + .../queries/update_mr_assignees.mutation.graphql | 21 + .../vue_shared/components/split_button.vue | 2 +- .../vue_shared/components/stacked_progress_bar.vue | 2 +- .../vue_shared/components/timezone_dropdown.vue | 2 +- .../vue_shared/components/todo_button.vue | 2 +- .../vue_shared/components/toggle_button.vue | 88 ---- .../vue_shared/components/tooltip_on_truncate.vue | 2 +- .../components/upload_dropzone/upload_dropzone.vue | 2 +- .../components/user_popover/user_popover.vue | 14 +- .../vue_shared/components/web_ide_link.vue | 2 +- .../vue_shared/directives/validation.js | 2 +- .../vue_shared/mixins/ci_pagination_api_mixin.js | 67 --- .../vue_shared/mixins/related_issuable_mixin.js | 2 +- .../javascripts/vue_shared/plugins/global_toast.js | 2 +- .../vue_shared/security_reports/constants.js | 6 + .../security_reports/security_reports_app.vue | 108 +---- .../vue_shared/security_reports/store/getters.js | 2 +- .../vue_shared/security_reports/store/index.js | 4 +- .../security_reports/store/modules/sast/actions.js | 2 +- .../security_reports/store/modules/sast/index.js | 4 +- .../store/modules/sast/mutations.js | 2 +- .../store/modules/secret_detection/index.js | 4 +- .../vue_shared/security_reports/store/utils.js | 2 +- .../javascripts/vuex_shared/modules/modal/index.js | 4 +- .../webpack_non_compiled_placeholder.js | 24 + .../javascripts/whats_new/components/app.vue | 6 +- app/assets/javascripts/whats_new/store/actions.js | 2 +- app/assets/javascripts/zen_mode.js | 2 +- app/assets/stylesheets/_page_specific_files.scss | 1 - .../components/batch_comments/review_bar.scss | 2 +- .../design_management/design_list_item.scss | 5 - app/assets/stylesheets/framework.scss | 1 - app/assets/stylesheets/framework/awards.scss | 2 +- app/assets/stylesheets/framework/buttons.scss | 23 - app/assets/stylesheets/framework/carousel.scss | 202 -------- .../stylesheets/framework/ci_variable_list.scss | 10 - app/assets/stylesheets/framework/common.scss | 2 +- .../stylesheets/framework/contextual_sidebar.scss | 2 +- app/assets/stylesheets/framework/diffs.scss | 4 - app/assets/stylesheets/framework/dropdowns.scss | 24 +- .../stylesheets/framework/feature_highlight.scss | 51 +- app/assets/stylesheets/framework/files.scss | 38 +- app/assets/stylesheets/framework/filters.scss | 9 + app/assets/stylesheets/framework/header.scss | 24 +- app/assets/stylesheets/framework/icons.scss | 48 +- app/assets/stylesheets/framework/mixins.scss | 7 - app/assets/stylesheets/framework/sidebar.scss | 2 +- app/assets/stylesheets/framework/tables.scss | 3 - app/assets/stylesheets/framework/typography.scss | 7 +- app/assets/stylesheets/framework/variables.scss | 23 +- app/assets/stylesheets/mailer.scss | 23 +- .../page_bundles/_ide_theme_overrides.scss | 22 +- .../stylesheets/page_bundles/_pipeline_mixins.scss | 6 +- ...application_settings_metrics_and_profiling.scss | 3 + .../stylesheets/page_bundles/admin/jobs_index.scss | 5 + app/assets/stylesheets/page_bundles/boards.scss | 41 ++ app/assets/stylesheets/page_bundles/ide.scss | 65 ++- app/assets/stylesheets/page_bundles/import.scss | 29 -- .../stylesheets/page_bundles/jira_connect.scss | 6 - .../stylesheets/page_bundles/merge_requests.scss | 1 - .../stylesheets/page_bundles/oncall_schedules.scss | 12 - app/assets/stylesheets/page_bundles/pipelines.scss | 11 +- app/assets/stylesheets/page_bundles/signup.scss | 4 + app/assets/stylesheets/pages/admin.scss | 18 - app/assets/stylesheets/pages/commits.scss | 5 - app/assets/stylesheets/pages/editor.scss | 13 - app/assets/stylesheets/pages/groups.scss | 1 - app/assets/stylesheets/pages/issuable.scss | 13 +- app/assets/stylesheets/pages/issues.scss | 28 +- app/assets/stylesheets/pages/labels.scss | 2 +- app/assets/stylesheets/pages/login.scss | 3 +- app/assets/stylesheets/pages/merge_requests.scss | 20 +- app/assets/stylesheets/pages/note_form.scss | 6 +- app/assets/stylesheets/pages/notes.scss | 58 +-- app/assets/stylesheets/pages/profile.scss | 20 +- app/assets/stylesheets/pages/projects.scss | 18 +- app/assets/stylesheets/pages/tree.scss | 4 +- app/assets/stylesheets/startup/startup-dark.scss | 2 +- .../stylesheets/startup/startup-general.scss | 3 +- app/assets/stylesheets/startup/startup-signin.scss | 5 +- app/assets/stylesheets/utilities.scss | 16 +- .../admin/application_settings_controller.rb | 2 + app/controllers/admin/cohorts_controller.rb | 14 +- app/controllers/admin/users_controller.rb | 21 + app/controllers/application_controller.rb | 2 +- app/controllers/autocomplete_controller.rb | 2 +- app/controllers/chaos_controller.rb | 9 + app/controllers/concerns/boards_actions.rb | 14 +- app/controllers/concerns/boards_responses.rb | 6 +- app/controllers/concerns/comment_and_close_flag.rb | 11 + app/controllers/concerns/integrations_actions.rb | 4 - app/controllers/concerns/membership_actions.rb | 24 +- .../concerns/multiple_boards_actions.rb | 1 + app/controllers/concerns/notes_actions.rb | 9 +- app/controllers/concerns/redis_tracking.rb | 16 +- app/controllers/concerns/service_params.rb | 1 + app/controllers/concerns/snippets_actions.rb | 2 +- app/controllers/concerns/spammable_actions.rb | 57 +-- app/controllers/concerns/wiki_actions.rb | 3 +- app/controllers/dashboard_controller.rb | 19 +- app/controllers/graphql_controller.rb | 5 + app/controllers/groups/boards_controller.rb | 27 +- .../groups/email_campaigns_controller.rb | 61 +++ .../settings/packages_and_registries_controller.rb | 7 + app/controllers/groups_controller.rb | 5 +- app/controllers/help_controller.rb | 11 +- app/controllers/import/bulk_imports_controller.rb | 27 +- app/controllers/invites_controller.rb | 16 +- app/controllers/jira_connect/users_controller.rb | 2 +- .../profiles/notifications_controller.rb | 2 +- app/controllers/profiles/preferences_controller.rb | 25 +- app/controllers/projects/badges_controller.rb | 4 +- app/controllers/projects/blob_controller.rb | 2 +- app/controllers/projects/boards_controller.rb | 22 + app/controllers/projects/branches_controller.rb | 6 +- .../daily_build_group_report_results_controller.rb | 20 +- .../projects/ci/pipeline_editor_controller.rb | 1 + .../ci/prometheus_metrics/histograms_controller.rb | 25 + app/controllers/projects/commit_controller.rb | 4 + app/controllers/projects/discussions_controller.rb | 2 +- app/controllers/projects/forks_controller.rb | 8 +- app/controllers/projects/issues_controller.rb | 15 +- app/controllers/projects/jobs_controller.rb | 3 - .../projects/learn_gitlab_controller.rb | 19 + .../merge_requests/application_controller.rb | 2 +- .../merge_requests/creations_controller.rb | 2 - .../projects/merge_requests/diffs_controller.rb | 5 +- .../projects/merge_requests_controller.rb | 35 +- app/controllers/projects/notes_controller.rb | 17 + .../projects/pipelines/tests_controller.rb | 6 +- app/controllers/projects/pipelines_controller.rb | 29 +- .../projects/project_members_controller.rb | 4 + .../projects/security/configuration_controller.rb | 23 + app/controllers/projects/services_controller.rb | 2 +- .../projects/settings/ci_cd_controller.rb | 4 +- .../projects/settings/repository_controller.rb | 1 - app/controllers/projects/templates_controller.rb | 4 +- app/controllers/projects_controller.rb | 38 +- .../registrations/experience_levels_controller.rb | 10 +- .../registrations/welcome_controller.rb | 19 +- app/controllers/registrations_controller.rb | 6 + .../repositories/git_http_controller.rb | 2 + app/controllers/search_controller.rb | 7 +- app/controllers/snippets/notes_controller.rb | 2 +- app/controllers/users_controller.rb | 53 ++- app/controllers/whats_new_controller.rb | 11 +- app/experiments/application_experiment.rb | 45 +- app/experiments/members/invite_email_experiment.rb | 18 + app/experiments/new_project_readme_experiment.rb | 45 ++ app/experiments/strategy/round_robin.rb | 78 +++ app/finders/autocomplete/users_finder.rb | 10 +- app/finders/ci/jobs_finder.rb | 7 +- .../daily_build_group_report_results_finder.rb | 88 ++++ app/finders/concerns/packages/finder_helper.rb | 33 ++ app/finders/container_repositories_finder.rb | 9 +- app/finders/deployments_finder.rb | 85 ++-- app/finders/labels_finder.rb | 6 +- app/finders/license_template_finder.rb | 5 + app/finders/merge_request/metrics_finder.rb | 65 +++ .../merge_requests/oldest_per_commit_finder.rb | 33 ++ app/finders/packages/group_packages_finder.rb | 30 +- app/finders/packages/nuget/package_finder.rb | 2 +- app/finders/packages/packages_finder.rb | 21 +- .../repositories/commits_with_trailer_finder.rb | 82 ++++ app/finders/repositories/previous_tag_finder.rb | 51 ++ app/finders/template_finder.rb | 16 + app/finders/terraform/states_finder.rb | 28 ++ app/finders/user_recent_events_finder.rb | 43 +- app/graphql/mutations/alert_management/base.rb | 2 +- .../alert_management/http_integration/create.rb | 19 +- .../http_integration/http_integration_base.rb | 7 + .../alert_management/http_integration/update.rb | 4 +- .../prometheus_integration/create.rb | 8 +- app/graphql/mutations/boards/lists/base.rb | 28 -- app/graphql/mutations/boards/lists/base_create.rb | 55 +++ app/graphql/mutations/boards/lists/create.rb | 51 +- app/graphql/mutations/branches/create.rb | 10 +- app/graphql/mutations/commits/create.rb | 10 +- .../concerns/mutations/can_mutate_spammable.rb | 83 ++++ .../concerns/mutations/resolves_resource_parent.rb | 4 +- .../mutations/spammable_mutation_fields.rb | 24 - .../container_expiration_policies/update.rb | 10 +- .../mutations/discussions/toggle_resolve.rb | 2 +- app/graphql/mutations/issues/create.rb | 8 +- app/graphql/mutations/jira_import/import_users.rb | 16 +- app/graphql/mutations/jira_import/start.rb | 16 +- app/graphql/mutations/merge_requests/create.rb | 10 +- .../mutations/merge_requests/reviewer_rereview.rb | 27 ++ app/graphql/mutations/merge_requests/update.rb | 11 +- app/graphql/mutations/notes/create/base.rb | 15 + app/graphql/mutations/releases/base.rb | 8 +- app/graphql/mutations/releases/create.rb | 2 +- app/graphql/mutations/releases/delete.rb | 2 +- app/graphql/mutations/releases/update.rb | 2 +- .../security/ci_configuration/configure_sast.rb | 46 ++ app/graphql/mutations/snippets/create.rb | 41 +- .../mutations/snippets/service_compatibility.rb | 23 + app/graphql/mutations/snippets/update.rb | 48 +- app/graphql/mutations/todos/create.rb | 2 +- app/graphql/mutations/todos/mark_all_done.rb | 6 +- app/graphql/mutations/todos/mark_done.rb | 4 +- app/graphql/mutations/todos/restore.rb | 4 +- app/graphql/mutations/todos/restore_many.rb | 10 +- .../get_container_repositories.query.graphql | 19 +- app/graphql/resolvers/base_resolver.rb | 2 +- app/graphql/resolvers/board_lists_resolver.rb | 7 +- app/graphql/resolvers/board_resolver.rb | 2 +- app/graphql/resolvers/boards_resolver.rb | 2 +- app/graphql/resolvers/ci/config_resolver.rb | 8 +- .../resolvers/container_repositories_resolver.rb | 9 +- app/graphql/resolvers/group_labels_resolver.rb | 17 + app/graphql/resolvers/labels_resolver.rb | 46 ++ app/graphql/resolvers/package_details_resolver.rb | 4 +- app/graphql/resolvers/packages_resolver.rb | 2 +- .../resolvers/project_merge_requests_resolver.rb | 33 ++ app/graphql/resolvers/snippets/blobs_resolver.rb | 5 +- app/graphql/resolvers/terraform/states_resolver.rb | 18 +- app/graphql/types/access_level_type.rb | 4 +- .../instance_statistics/measurement_type.rb | 6 +- .../sidekiq_queues/delete_jobs_response_type.rb | 6 +- .../alert_management/alert_status_counts_type.rb | 4 +- app/graphql/types/alert_management/alert_type.rb | 44 +- .../types/alert_management/integration_type.rb | 14 +- app/graphql/types/award_emojis/award_emoji_type.rb | 12 +- app/graphql/types/base_enum.rb | 2 +- app/graphql/types/base_field.rb | 2 +- app/graphql/types/board_list_type.rb | 16 +- app/graphql/types/board_type.rb | 10 +- .../types/boards/board_issue_input_base_type.rb | 12 +- app/graphql/types/boards/board_issue_input_type.rb | 4 +- app/graphql/types/branch_type.rb | 4 +- app/graphql/types/ci/analytics_type.rb | 22 +- app/graphql/types/ci/application_setting_type.rb | 14 + app/graphql/types/ci/ci_cd_setting_type.rb | 3 +- app/graphql/types/ci/config/config_type.rb | 8 +- app/graphql/types/ci/config/group_type.rb | 6 +- app/graphql/types/ci/config/need_type.rb | 2 +- app/graphql/types/ci/config/stage_type.rb | 4 +- app/graphql/types/ci/detailed_status_type.rb | 21 +- app/graphql/types/ci/group_type.rb | 8 +- app/graphql/types/ci/job_artifact_type.rb | 4 +- app/graphql/types/ci/job_type.rb | 12 +- app/graphql/types/ci/pipeline_type.rb | 52 +- app/graphql/types/ci/runner_architecture_type.rb | 4 +- app/graphql/types/ci/runner_platform_type.rb | 6 +- app/graphql/types/ci/runner_setup_type.rb | 4 +- app/graphql/types/ci/stage_type.rb | 6 +- app/graphql/types/ci/status_action_type.rb | 10 +- .../sast/analyzers_entity_input_type.rb | 23 + .../ci_configuration/sast/analyzers_entity_type.rb | 28 ++ .../ci_configuration/sast/entity_input_type.rb | 22 + .../types/ci_configuration/sast/entity_type.rb | 37 ++ .../types/ci_configuration/sast/input_type.rb | 24 + .../ci_configuration/sast/options_entity_type.rb | 19 + app/graphql/types/ci_configuration/sast/type.rb | 22 + .../sast/ui_component_size_enum.rb | 16 + app/graphql/types/commit_action_type.rb | 14 +- app/graphql/types/commit_type.rb | 28 +- .../types/container_expiration_policy_type.rb | 18 +- .../types/container_repository_details_type.rb | 2 +- .../types/container_repository_sort_enum.rb | 11 + app/graphql/types/container_repository_type.rb | 2 +- app/graphql/types/countable_connection_type.rb | 2 +- app/graphql/types/current_user_todos.rb | 4 +- app/graphql/types/custom_emoji_type.rb | 8 +- .../design_management/design_at_version_type.rb | 4 +- .../design_management/design_collection_type.rb | 16 +- .../types/design_management/design_fields.rb | 18 +- app/graphql/types/design_management/design_type.rb | 2 +- .../types/design_management/version_type.rb | 10 +- app/graphql/types/design_management_type.rb | 4 +- app/graphql/types/diff_paths_input_type.rb | 4 +- app/graphql/types/diff_refs_type.rb | 6 +- app/graphql/types/diff_stats_summary_type.rb | 8 +- app/graphql/types/diff_stats_type.rb | 6 +- app/graphql/types/environment_type.rb | 10 +- .../error_tracking/sentry_detailed_error_type.rb | 56 +-- .../error_tracking/sentry_error_collection_type.rb | 8 +- .../error_tracking/sentry_error_frequency_type.rb | 4 +- .../sentry_error_stack_trace_context_type.rb | 4 +- .../sentry_error_stack_trace_entry_type.rb | 10 +- .../sentry_error_stack_trace_type.rb | 6 +- .../types/error_tracking/sentry_error_tags_type.rb | 4 +- .../types/error_tracking/sentry_error_type.rb | 34 +- app/graphql/types/event_action_enum.rb | 12 + app/graphql/types/event_type.rb | 36 ++ app/graphql/types/eventable_type.rb | 9 + app/graphql/types/evidence_type.rb | 8 +- app/graphql/types/global_id_type.rb | 2 +- app/graphql/types/grafana_integration_type.rb | 10 +- app/graphql/types/group_invitation_type.rb | 2 +- app/graphql/types/group_member_type.rb | 2 +- app/graphql/types/group_type.rb | 57 +-- app/graphql/types/invitation_interface.rb | 14 +- app/graphql/types/issue_type.rb | 80 ++-- app/graphql/types/jira_import_type.rb | 14 +- app/graphql/types/jira_user_type.rb | 12 +- app/graphql/types/jira_users_mapping_input_type.rb | 4 +- app/graphql/types/label_type.rb | 10 +- app/graphql/types/member_interface.rb | 14 +- app/graphql/types/merge_request_connection_type.rb | 2 +- app/graphql/types/merge_request_state_enum.rb | 2 +- .../types/merge_request_state_event_enum.rb | 16 + app/graphql/types/merge_request_type.rb | 146 +++--- app/graphql/types/metadata_type.rb | 4 +- app/graphql/types/metrics/dashboard_type.rb | 6 +- .../types/metrics/dashboards/annotation_type.rb | 10 +- app/graphql/types/milestone_state_enum.rb | 7 +- app/graphql/types/milestone_stats_type.rb | 4 +- app/graphql/types/milestone_type.rb | 26 +- app/graphql/types/mutation_type.rb | 3 +- app/graphql/types/namespace_type.rb | 24 +- app/graphql/types/notes/diff_position_type.rb | 22 +- app/graphql/types/notes/discussion_type.rb | 20 +- app/graphql/types/notes/note_type.rb | 26 +- app/graphql/types/notes/noteable_type.rb | 4 +- .../types/packages/composer/details_type.rb | 16 - .../types/packages/composer/metadatum_type.rb | 4 +- app/graphql/types/packages/metadata_type.rb | 23 + app/graphql/types/packages/package_type.rb | 19 +- app/graphql/types/packages/package_type_enum.rb | 2 +- .../packages/package_without_versions_type.rb | 44 ++ app/graphql/types/project_invitation_type.rb | 2 +- app/graphql/types/project_member_type.rb | 2 +- app/graphql/types/project_statistics_type.rb | 18 +- app/graphql/types/project_type.rb | 175 +++---- app/graphql/types/projects/service_type.rb | 4 +- app/graphql/types/projects/service_type_enum.rb | 2 +- .../types/projects/services/jira_project_type.rb | 6 +- .../types/projects/services/jira_service_type.rb | 2 +- app/graphql/types/prometheus_alert_type.rb | 4 +- app/graphql/types/query_type.rb | 57 ++- app/graphql/types/range_input_type.rb | 4 +- app/graphql/types/release_asset_link_input_type.rb | 8 +- app/graphql/types/release_asset_link_type.rb | 12 +- app/graphql/types/release_assets_input_type.rb | 2 +- app/graphql/types/release_assets_type.rb | 6 +- app/graphql/types/release_links_type.rb | 14 +- app/graphql/types/release_source_type.rb | 4 +- app/graphql/types/release_type.rb | 26 +- app/graphql/types/repository_type.rb | 8 +- app/graphql/types/resolvable_interface.rb | 8 +- app/graphql/types/root_storage_statistics_type.rb | 18 +- app/graphql/types/snippet_type.rb | 30 +- .../types/snippets/blob_action_input_type.rb | 8 +- app/graphql/types/snippets/blob_type.rb | 24 +- app/graphql/types/snippets/blob_viewer_type.rb | 14 +- app/graphql/types/task_completion_status.rb | 4 +- app/graphql/types/terraform/state_type.rb | 14 +- app/graphql/types/terraform/state_version_type.rb | 14 +- app/graphql/types/todo_type.rb | 20 +- app/graphql/types/tree/blob_type.rb | 8 +- app/graphql/types/tree/entry_type.rb | 12 +- app/graphql/types/tree/submodule_type.rb | 4 +- app/graphql/types/tree/tree_entry_type.rb | 4 +- app/graphql/types/tree/tree_type.rb | 8 +- app/graphql/types/user_status_type.rb | 6 +- app/graphql/types/user_type.rb | 41 +- app/helpers/analytics/cycle_analytics_helper.rb | 11 + app/helpers/analytics/unique_visits_helper.rb | 1 - app/helpers/application_helper.rb | 2 +- app/helpers/application_settings_helper.rb | 24 +- app/helpers/auth_helper.rb | 2 +- app/helpers/blob_helper.rb | 40 +- app/helpers/boards_helper.rb | 20 +- app/helpers/ci/jobs_helper.rb | 1 - app/helpers/commits_helper.rb | 54 +-- app/helpers/container_registry_helper.rb | 2 +- app/helpers/diff_helper.rb | 28 +- app/helpers/enable_search_settings_helper.rb | 9 + app/helpers/events_helper.rb | 4 +- app/helpers/external_link_helper.rb | 2 +- app/helpers/groups/group_members_helper.rb | 14 +- app/helpers/groups_helper.rb | 23 + app/helpers/in_product_marketing_helper.rb | 350 ++++++++++++++ app/helpers/invite_members_helper.rb | 10 +- .../issuables_description_templates_helper.rb | 47 ++ app/helpers/issuables_helper.rb | 73 +-- app/helpers/jira_connect_helper.rb | 10 +- app/helpers/labels_helper.rb | 42 +- app/helpers/learn_gitlab_helper.rb | 60 +++ app/helpers/merge_requests_helper.rb | 6 - app/helpers/nav_helper.rb | 2 +- app/helpers/notes_helper.rb | 6 +- app/helpers/notifications_helper.rb | 9 + app/helpers/notify_helper.rb | 26 + app/helpers/operations_helper.rb | 2 +- app/helpers/projects/alert_management_helper.rb | 7 +- app/helpers/projects/project_members_helper.rb | 26 + app/helpers/projects_helper.rb | 37 +- app/helpers/search_helper.rb | 21 + app/helpers/services_helper.rb | 7 + app/helpers/sorting_helper.rb | 21 +- app/helpers/sorting_titles_values_helper.rb | 8 - app/helpers/stat_anchors_helper.rb | 4 +- app/helpers/tree_helper.rb | 45 -- app/helpers/user_callouts_helper.rb | 5 + app/helpers/users_helper.rb | 23 +- app/mailers/emails/in_product_marketing.rb | 34 ++ app/mailers/emails/members.rb | 2 + app/mailers/emails/merge_requests.rb | 7 + app/mailers/notify.rb | 2 + app/models/active_session.rb | 25 +- app/models/application_setting.rb | 50 ++ app/models/application_setting_implementation.rb | 17 +- app/models/audit_event.rb | 9 +- app/models/board.rb | 8 + app/models/bulk_imports/entity.rb | 15 + app/models/ci/bridge.rb | 6 +- app/models/ci/build.rb | 65 +-- app/models/ci/build_dependencies.rb | 2 +- app/models/ci/build_trace_chunk.rb | 20 +- app/models/ci/build_trace_chunks/fog.rb | 10 +- app/models/ci/build_trace_section.rb | 1 + app/models/ci/daily_build_group_report_result.rb | 5 + app/models/ci/job_artifact.rb | 10 + app/models/ci/pipeline.rb | 36 +- app/models/ci/pipeline_artifact.rb | 25 +- app/models/ci/pipeline_schedule.rb | 2 +- app/models/ci/processable.rb | 56 +++ app/models/ci/resource.rb | 6 +- app/models/ci/resource_group.rb | 10 +- app/models/ci/stage.rb | 2 +- app/models/clusters/agent.rb | 1 + app/models/clusters/agent_token.rb | 1 + app/models/clusters/applications/cert_manager.rb | 2 + app/models/clusters/applications/crossplane.rb | 2 + app/models/clusters/applications/ingress.rb | 2 + app/models/clusters/applications/jupyter.rb | 2 + app/models/clusters/applications/knative.rb | 2 + app/models/clusters/applications/runner.rb | 2 +- app/models/clusters/platforms/kubernetes.rb | 8 +- app/models/commit.rb | 2 +- app/models/commit_status.rb | 34 +- .../concerns/analytics/cycle_analytics/stage.rb | 19 + app/models/concerns/atomic_internal_id.rb | 44 +- app/models/concerns/cacheable_attributes.rb | 2 +- app/models/concerns/can_move_repository_storage.rb | 21 +- app/models/concerns/enums/ci/pipeline.rb | 8 +- app/models/concerns/featurable.rb | 3 - app/models/concerns/has_repository.rb | 9 - app/models/concerns/nullify_if_blank.rb | 48 ++ .../concerns/optimized_issuable_label_filter.rb | 4 +- .../concerns/packages/debian/architecture.rb | 6 + app/models/concerns/packages/debian/component.rb | 31 ++ .../concerns/packages/debian/component_file.rb | 101 ++++ .../concerns/packages/debian/distribution.rb | 10 + app/models/concerns/protected_ref.rb | 16 +- .../repositories/can_housekeep_repository.rb | 4 + app/models/concerns/repository_storage_movable.rb | 24 +- app/models/concerns/spammable.rb | 11 + .../suppress_composite_primary_key_warning.rb | 19 + .../token_authenticatable_strategies/encrypted.rb | 10 +- app/models/concerns/triggerable_hooks.rb | 3 +- app/models/container_repository.rb | 1 + app/models/custom_emoji.rb | 9 +- app/models/deployment.rb | 18 +- app/models/deployment_merge_request.rb | 2 + app/models/design_management/design.rb | 11 - app/models/event.rb | 6 +- app/models/experiment.rb | 8 + app/models/group.rb | 14 +- app/models/issue.rb | 2 +- app/models/issue_assignee.rb | 2 + app/models/issue_link.rb | 4 +- app/models/label.rb | 2 +- app/models/license_template.rb | 9 +- app/models/merge_request.rb | 87 +++- app/models/merge_request/metrics.rb | 8 + app/models/merge_request_context_commit.rb | 3 + .../merge_request_context_commit_diff_file.rb | 2 + app/models/merge_request_diff.rb | 25 +- app/models/merge_request_diff_commit.rb | 27 +- app/models/merge_request_diff_file.rb | 2 + app/models/merge_request_reviewer.rb | 9 + app/models/milestone_release.rb | 2 + app/models/namespace.rb | 57 +-- app/models/namespaces/traversal/recursive.rb | 61 +++ app/models/note.rb | 6 +- app/models/onboarding_progress.rb | 26 +- app/models/operations/feature_flag.rb | 26 + app/models/packages/composer/cache_file.rb | 23 + app/models/packages/composer/metadatum.rb | 3 + app/models/packages/debian/group_component.rb | 9 + app/models/packages/debian/group_component_file.rb | 9 + app/models/packages/debian/project_component.rb | 9 + .../packages/debian/project_component_file.rb | 9 + app/models/packages/debian/project_distribution.rb | 3 + app/models/packages/debian/publication.rb | 24 + app/models/packages/package.rb | 28 +- app/models/packages/package_file.rb | 4 - app/models/packages/rubygems/metadatum.rb | 24 + app/models/pages/lookup_path.rb | 14 +- app/models/pages/virtual_domain.rb | 11 +- app/models/pages_deployment.rb | 8 + app/models/project.rb | 56 ++- app/models/project_authorization.rb | 1 + app/models/project_ci_cd_setting.rb | 5 + app/models/project_pages_metadatum.rb | 3 + app/models/project_services/alerts_service.rb | 28 -- .../project_services/chat_notification_service.rb | 26 +- app/models/project_services/confluence_service.rb | 4 +- app/models/project_services/datadog_service.rb | 40 +- app/models/project_services/jira_service.rb | 22 +- app/models/project_services/jira_tracker_data.rb | 9 + .../project_services/mock_deployment_service.rb | 38 -- app/models/project_setting.rb | 2 +- app/models/project_statistics.rb | 1 + app/models/protected_branch/push_access_level.rb | 2 +- app/models/push_event_payload.rb | 2 + app/models/readme_blob.rb | 17 - app/models/release.rb | 1 + app/models/repository.rb | 64 +-- app/models/repository_language.rb | 2 + app/models/service.rb | 19 +- app/models/snippet.rb | 2 +- app/models/terraform/state.rb | 2 + app/models/terraform/state_version.rb | 6 +- app/models/token_with_iv.rb | 23 + app/models/u2f_registration.rb | 16 +- app/models/user.rb | 34 +- app/models/user_callout.rb | 20 +- app/models/user_interacted_project.rb | 2 + app/models/user_status.rb | 16 + app/models/users/user_follow_user.rb | 7 + app/models/vulnerability.rb | 10 +- app/models/wiki.rb | 11 +- app/policies/application_setting_policy.rb | 5 + app/policies/event_policy.rb | 9 + app/policies/project_policy.rb | 17 +- app/presenters/ci/build_presenter.rb | 2 + app/presenters/ci/build_runner_presenter.rb | 18 +- .../pipeline_artifacts/code_coverage_presenter.rb | 2 +- .../code_quality_mr_diff_presenter.rb | 25 + app/presenters/ci/pipeline_presenter.rb | 3 + app/presenters/dev_ops_report/metric_presenter.rb | 148 ++++++ app/presenters/dev_ops_score/metric_presenter.rb | 148 ------ app/presenters/gitlab/whats_new/item_presenter.rb | 22 - app/presenters/project_presenter.rb | 4 +- app/serializers/README.md | 2 +- app/serializers/admin/user_entity.rb | 1 + app/serializers/admin/user_serializer.rb | 2 +- app/serializers/base_discussion_entity.rb | 1 + app/serializers/build_details_entity.rb | 2 +- app/serializers/ci/codequality_mr_diff_entity.rb | 7 + .../ci/codequality_mr_diff_report_serializer.rb | 7 + app/serializers/ci/pipeline_entity.rb | 124 +++++ app/serializers/concerns/user_status_tooltip.rb | 4 + app/serializers/diff_file_metadata_entity.rb | 1 + app/serializers/diffs_entity.rb | 4 +- app/serializers/group_child_entity.rb | 2 +- app/serializers/group_group_link_entity.rb | 50 -- app/serializers/group_group_link_serializer.rb | 5 - .../group_link/group_group_link_entity.rb | 25 + .../group_link/group_group_link_serializer.rb | 7 + app/serializers/group_link/group_link_entity.rb | 34 ++ .../group_link/project_group_link_entity.rb | 22 + .../group_link/project_group_link_serializer.rb | 7 + app/serializers/member_entity.rb | 4 + app/serializers/merge_request_basic_entity.rb | 2 +- .../merge_request_sidebar_extras_entity.rb | 8 +- app/serializers/merge_request_user_entity.rb | 13 + app/serializers/merge_request_widget_entity.rb | 4 + app/serializers/pipeline_details_entity.rb | 2 +- app/serializers/pipeline_entity.rb | 122 ----- .../http_integrations/update_service.rb | 15 +- .../process_prometheus_alert_service.rb | 121 +---- .../application_settings/update_service.rb | 2 +- .../recalculate_for_user_range_service.rb | 2 +- app/services/boards/create_service.rb | 8 +- app/services/boards/list_service.rb | 8 +- app/services/boards/lists/base_create_service.rb | 71 +++ app/services/boards/lists/create_service.rb | 63 +-- app/services/boards/visits/create_service.rb | 1 + app/services/bulk_create_integration_service.rb | 10 - app/services/bulk_import_service.rb | 2 + .../captcha/captcha_verification_service.rb | 43 ++ app/services/ci/create_job_artifacts_service.rb | 9 + app/services/ci/create_pipeline_service.rb | 1 - .../ci/daily_build_group_report_result_service.rb | 3 +- .../generate_codequality_mr_diff_report_service.rb | 30 ++ .../ci/generate_coverage_reports_service.rb | 2 +- .../pipeline_artifacts/coverage_report_service.rb | 2 +- .../create_code_quality_mr_diff_report_service.rb | 38 ++ app/services/ci/pipeline_trigger_service.rb | 17 + app/services/ci/process_build_service.rb | 2 +- app/services/ci/process_pipeline_service.rb | 13 +- .../observe_histograms_service.rb | 57 +++ .../assign_resource_from_resource_group_service.rb | 4 +- .../kubernetes/configure_istio_ingress_service.rb | 2 +- .../concerns/alert_management/alert_processing.rb | 133 ++++++ .../concerns/integrations/project_test_data.rb | 22 +- app/services/concerns/spam_check_methods.rb | 39 -- .../concerns/update_repository_storage_methods.rb | 19 +- .../cleanup_service.rb | 15 +- app/services/deployments/create_service.rb | 8 + .../design_management/move_designs_service.rb | 7 - app/services/discussions/resolve_service.rb | 8 +- app/services/discussions/unresolve_service.rb | 21 + app/services/draft_notes/publish_service.rb | 6 + app/services/feature_flags/base_service.rb | 1 - app/services/git/branch_hooks_service.rb | 44 +- app/services/git/wiki_push_service.rb | 9 + .../groups/import_export/export_service.rb | 56 ++- .../groups/import_export/import_service.rb | 52 +- app/services/groups/open_issues_count_service.rb | 64 +++ app/services/issuable_base_service.rb | 29 +- app/services/issue_rebalancing_service.rb | 37 +- app/services/issues/close_service.rb | 2 +- app/services/issues/create_service.rb | 16 +- app/services/issues/update_service.rb | 17 +- app/services/jira/requests/base.rb | 8 +- app/services/members/update_service.rb | 6 +- app/services/merge_requests/add_context_service.rb | 3 +- app/services/merge_requests/approval_service.rb | 1 + app/services/merge_requests/base_service.rb | 2 +- app/services/merge_requests/build_service.rb | 48 +- .../merge_requests/create_from_issue_service.rb | 1 + .../mark_reviewer_reviewed_service.rb | 19 + app/services/merge_requests/merge_service.rb | 6 +- .../merge_requests/mergeability_check_service.rb | 6 + app/services/merge_requests/post_merge_service.rb | 31 ++ .../reload_merge_head_diff_service.rb | 50 ++ .../merge_requests/remove_approval_service.rb | 1 + .../merge_requests/request_review_service.rb | 28 ++ app/services/merge_requests/update_service.rb | 59 ++- .../in_product_marketing_emails_service.rb | 112 +++++ app/services/notes/create_service.rb | 13 +- .../notification_recipients/build_service.rb | 4 + .../builder/request_review.rb | 21 + app/services/notification_service.rb | 12 + app/services/packages/create_package_service.rb | 7 +- .../packages/debian/create_distribution_service.rb | 75 +++ .../debian/destroy_distribution_service.rb | 33 ++ .../packages/debian/update_distribution_service.rb | 80 ++++ .../generic/create_package_file_service.rb | 5 +- .../maven/find_or_create_package_service.rb | 19 +- app/services/pages/delete_service.rb | 8 +- .../pages/migrate_from_legacy_storage_service.rb | 79 ++++ ...migrate_legacy_storage_to_deployment_service.rb | 5 +- app/services/pages/zip_directory_service.rb | 53 +-- app/services/projects/alerting/notify_service.rb | 94 +--- app/services/projects/branches_by_mode_service.rb | 88 ++++ app/services/projects/cleanup_service.rb | 2 +- .../container_repository/cleanup_tags_service.rb | 1 + app/services/projects/create_service.rb | 20 +- app/services/projects/fork_service.rb | 11 +- .../projects/import_export/export_service.rb | 6 +- app/services/projects/update_pages_service.rb | 4 + app/services/projects/update_service.rb | 18 +- app/services/quick_actions/interpret_service.rb | 9 + app/services/repositories/changelog_service.rb | 115 +++++ app/services/repositories/housekeeping_service.rb | 2 +- .../resource_access_tokens/create_service.rb | 9 +- .../resource_access_tokens/revoke_service.rb | 8 + .../resource_events/base_change_timebox_service.rb | 7 +- .../resource_events/change_milestone_service.rb | 4 +- .../ci_configuration/sast_create_service.rb | 66 +++ .../ci_configuration/sast_parser_service.rb | 127 +++++ app/services/snippets/base_service.rb | 4 - app/services/snippets/create_service.rb | 22 +- app/services/snippets/update_service.rb | 19 +- app/services/spam/spam_action_service.rb | 93 +++- app/services/spam/spam_params.rb | 32 ++ app/services/suggestions/apply_service.rb | 8 +- app/services/suggestions/create_service.rb | 2 + app/services/system_hooks_service.rb | 36 +- app/services/system_note_service.rb | 11 +- .../system_notes/merge_requests_service.rb | 20 +- app/services/terraform/remote_state_handler.rb | 22 +- app/services/test_hooks/system_service.rb | 3 +- app/services/todo_service.rb | 8 +- app/services/users/approve_service.rb | 8 +- app/services/users/batch_status_cleaner_service.rb | 22 + .../users/refresh_authorized_projects_service.rb | 14 +- app/services/users/reject_service.rb | 14 + app/uploaders/packages/composer/cache_uploader.rb | 26 + .../packages/debian/component_file_uploader.rb | 27 ++ app/uploaders/terraform/state_uploader.rb | 4 + .../application_setting_kroki_formats.json | 10 + app/validators/json_schemas/git_trailers.json | 9 + .../nested_attributes_duplicates_validator.rb | 40 ++ app/validators/variable_duplicates_validator.rb | 34 -- app/views/abuse_reports/new.html.haml | 2 +- .../admin/abuse_reports/_abuse_report.html.haml | 2 +- app/views/admin/appearances/_form.html.haml | 8 +- .../_system_header_footer_form.html.haml | 8 +- .../admin/appearances/preview_sign_in.html.haml | 4 +- .../admin/application_settings/_abuse.html.haml | 2 +- .../_account_and_limit.html.haml | 16 +- .../admin/application_settings/_ci_cd.html.haml | 26 +- .../application_settings/_diff_limits.html.haml | 2 +- .../admin/application_settings/_eks.html.haml | 6 +- .../admin/application_settings/_email.html.haml | 2 +- .../_external_authorization_service_form.html.haml | 14 +- .../admin/application_settings/_gitaly.html.haml | 6 +- .../admin/application_settings/_gitpod.html.haml | 2 +- .../admin/application_settings/_grafana.html.haml | 2 +- .../application_settings/_help_page.html.haml | 6 +- .../_import_export_limits.html.haml | 12 +- .../_initial_branch_name.html.haml | 2 +- .../application_settings/_ip_limits.html.haml | 14 +- .../application_settings/_issue_limits.html.haml | 2 +- .../admin/application_settings/_kroki.html.haml | 10 +- .../application_settings/_note_limits.html.haml | 12 + .../admin/application_settings/_outbound.html.haml | 2 +- .../_package_registry.html.haml | 12 +- .../admin/application_settings/_pages.html.haml | 4 +- .../application_settings/_performance.html.haml | 6 +- .../_performance_bar.html.haml | 2 +- .../admin/application_settings/_plantuml.html.haml | 2 +- .../application_settings/_prometheus.html.haml | 2 +- .../_protected_paths.html.haml | 6 +- .../admin/application_settings/_realtime.html.haml | 2 +- .../admin/application_settings/_registry.html.haml | 16 +- .../_repository_check.html.haml | 6 +- .../_repository_static_objects.html.haml | 4 +- .../admin/application_settings/_signin.html.haml | 8 +- .../admin/application_settings/_signup.html.haml | 12 +- .../admin/application_settings/_snowplow.html.haml | 6 +- .../application_settings/_sourcegraph.html.haml | 2 +- .../admin/application_settings/_spam.html.haml | 12 +- .../admin/application_settings/_terminal.html.haml | 2 +- .../admin/application_settings/_terms.html.haml | 2 +- .../_visibility_and_access.html.haml | 8 +- .../application_settings/ci/_header.html.haml | 15 +- .../admin/application_settings/ci_cd.html.haml | 2 +- .../admin/application_settings/general.html.haml | 1 - .../application_settings/integrations.html.haml | 4 +- .../metrics_and_profiling.html.haml | 2 + .../admin/application_settings/network.html.haml | 11 + .../application_settings/preferences.html.haml | 12 +- .../admin/application_settings/reporting.html.haml | 4 +- .../application_settings/repository.html.haml | 10 +- app/views/admin/applications/_form.html.haml | 6 +- app/views/admin/applications/index.html.haml | 53 ++- app/views/admin/applications/show.html.haml | 4 +- app/views/admin/broadcast_messages/_form.html.haml | 8 +- app/views/admin/cohorts/_cohorts_table.html.haml | 35 -- app/views/admin/cohorts/index.html.haml | 7 - app/views/admin/dashboard/index.html.haml | 118 +++-- app/views/admin/groups/_form.html.haml | 2 +- app/views/admin/groups/_group.html.haml | 4 +- app/views/admin/hooks/_form.html.haml | 19 +- app/views/admin/jobs/index.html.haml | 1 + app/views/admin/labels/_form.html.haml | 6 +- app/views/admin/projects/_projects.html.haml | 4 +- app/views/admin/projects/index.html.haml | 2 +- app/views/admin/projects/show.html.haml | 4 +- app/views/admin/runners/index.html.haml | 6 +- app/views/admin/users/_access_levels.html.haml | 2 +- app/views/admin/users/_admin_notes.html.haml | 2 +- app/views/admin/users/_cohorts.html.haml | 4 + app/views/admin/users/_cohorts_table.html.haml | 35 ++ app/views/admin/users/_form.html.haml | 18 +- app/views/admin/users/_head.html.haml | 3 +- app/views/admin/users/_user.html.haml | 4 +- app/views/admin/users/_user_detail.html.haml | 7 +- app/views/admin/users/_users.html.haml | 88 ++++ app/views/admin/users/index.html.haml | 99 +--- app/views/admin/users/show.html.haml | 42 +- app/views/authentication/_authenticate.html.haml | 2 +- app/views/authentication/_register.html.haml | 6 +- app/views/ci/group_variables/_content.html.haml | 2 +- app/views/ci/group_variables/_index.html.haml | 21 +- .../ci/group_variables/_variable_header.html.haml | 8 +- app/views/ci/runner/_how_to_setup_runner.html.haml | 2 + app/views/ci/variables/_content.html.haml | 12 +- app/views/ci/variables/_header.html.haml | 3 +- app/views/ci/variables/_index.html.haml | 2 +- app/views/dashboard/_activity_head.html.haml | 7 +- app/views/dashboard/issues.atom.builder | 2 + app/views/dashboard/milestones/index.html.haml | 13 +- .../projects/_starred_empty_state.html.haml | 4 +- app/views/dashboard/projects/index.atom.builder | 2 + app/views/dashboard/projects/index.html.haml | 2 +- app/views/dashboard/todos/_todo.html.haml | 6 +- app/views/dashboard/todos/index.html.haml | 4 +- app/views/devise/confirmations/new.html.haml | 2 +- app/views/devise/passwords/edit.html.haml | 6 +- app/views/devise/passwords/new.html.haml | 5 +- app/views/devise/sessions/_new_base.html.haml | 4 +- app/views/devise/sessions/_new_ldap.html.haml | 6 +- app/views/devise/sessions/two_factor.html.haml | 2 +- app/views/devise/shared/_omniauth_box.html.haml | 2 +- app/views/devise/shared/_signup_box.html.haml | 10 +- .../shared/_signup_omniauth_provider_list.haml | 2 +- app/views/discussions/_notes.html.haml | 2 - .../doorkeeper/applications/_delete_form.html.haml | 2 +- app/views/doorkeeper/applications/_form.html.haml | 4 +- app/views/doorkeeper/applications/index.html.haml | 4 +- app/views/doorkeeper/applications/show.html.haml | 4 +- app/views/events/_event.atom.builder | 2 + app/views/groups/_home_panel.html.haml | 6 +- ...ort_group_from_another_instance_panel.html.haml | 13 +- app/views/groups/_invite_members_modal.html.haml | 2 +- .../groups/_invite_members_side_nav_link.html.haml | 3 - app/views/groups/_new_group_fields.html.haml | 4 +- app/views/groups/edit.html.haml | 1 + app/views/groups/group_members/index.html.haml | 8 +- app/views/groups/issues.atom.builder | 2 + app/views/groups/milestones/index.html.haml | 15 +- app/views/groups/projects.html.haml | 8 +- .../groups/registry/repositories/index.html.haml | 7 +- app/views/groups/runners/_group_runners.html.haml | 4 +- app/views/groups/runners/_runner.html.haml | 5 +- app/views/groups/settings/_advanced.html.haml | 4 +- app/views/groups/settings/_export.html.haml | 6 +- app/views/groups/settings/_general.html.haml | 2 +- .../groups/settings/_pages_settings.html.haml | 2 +- .../groups/settings/_permanent_deletion.html.haml | 2 +- app/views/groups/settings/_permissions.html.haml | 2 +- .../settings/ci_cd/_auto_devops_form.html.haml | 2 +- app/views/groups/settings/ci_cd/_form.html.haml | 6 +- app/views/groups/settings/ci_cd/show.html.haml | 2 +- .../packages_and_registries/index.html.haml | 2 +- .../repository/_initial_branch_name.html.haml | 2 +- app/views/groups/show.atom.builder | 2 + app/views/groups/show.html.haml | 7 +- .../groups/sidebar/_packages_settings.html.haml | 5 + app/views/help/_shortcuts.html.haml | 347 -------------- app/views/help/shortcuts.js.haml | 3 - app/views/import/bulk_imports/status.html.haml | 8 +- app/views/issues/_issue.atom.builder | 2 + app/views/issues/_issues_calendar.ics.ruby | 2 + .../jira_connect/subscriptions/index.html.haml | 24 +- app/views/layouts/_head.html.haml | 3 + app/views/layouts/_matomo.html.haml | 1 + app/views/layouts/_page.html.haml | 3 +- app/views/layouts/_startup_css.haml | 2 +- app/views/layouts/admin.html.haml | 5 + ...devise_experimental_onboarding_issues.html.haml | 12 - .../header/_current_user_dropdown.html.haml | 27 +- .../header/_current_user_dropdown_item.html.haml | 12 + app/views/layouts/header/_default.html.haml | 42 +- app/views/layouts/header/_help_dropdown.html.haml | 2 +- .../header/_whats_new_dropdown_item.html.haml | 5 + app/views/layouts/jira_connect.html.haml | 1 - app/views/layouts/nav/_breadcrumbs.html.haml | 2 +- app/views/layouts/nav/sidebar/_admin.html.haml | 10 +- app/views/layouts/nav/sidebar/_group.html.haml | 30 +- app/views/layouts/nav/sidebar/_profile.html.haml | 2 +- app/views/layouts/nav/sidebar/_project.html.haml | 37 +- .../nav/sidebar/_project_security_link.html.haml | 21 + app/views/layouts/profile.html.haml | 1 + app/views/layouts/signup_onboarding.html.haml | 12 + app/views/layouts/welcome.html.haml | 4 +- app/views/layouts/xml.atom.builder | 2 + .../notify/in_product_marketing_email.html.haml | 204 ++++++++ .../notify/in_product_marketing_email.text.erb | 23 + app/views/notify/member_invited_email.html.haml | 50 +- .../provisioned_member_access_granted_email.erb | 14 - .../provisioned_member_access_granted_email.haml | 24 - ...ovisioned_member_access_granted_email.html.haml | 25 + ...rovisioned_member_access_granted_email.text.erb | 15 + .../request_review_merge_request_email.html.haml | 2 + .../request_review_merge_request_email.text.erb | 1 + app/views/profiles/_email_settings.html.haml | 2 +- app/views/profiles/_name.html.haml | 4 +- app/views/profiles/accounts/_providers.html.haml | 24 +- app/views/profiles/accounts/show.html.haml | 25 +- app/views/profiles/emails/index.html.haml | 16 +- app/views/profiles/keys/_key.html.haml | 61 +-- app/views/profiles/keys/_key_details.html.haml | 2 +- app/views/profiles/keys/index.html.haml | 4 +- .../notifications/_email_settings.html.haml | 4 + .../notifications/_group_settings.html.haml | 6 +- .../notifications/_project_settings.html.haml | 6 +- app/views/profiles/notifications/show.html.haml | 6 +- app/views/profiles/passwords/edit.html.haml | 6 +- app/views/profiles/passwords/new.html.haml | 6 +- .../personal_access_tokens/index.html.haml | 23 +- app/views/profiles/preferences/show.html.haml | 21 +- app/views/profiles/preferences/update.js.erb | 20 - app/views/profiles/show.html.haml | 76 +-- app/views/profiles/two_factor_auths/show.html.haml | 5 +- app/views/projects/_activity.html.haml | 23 +- app/views/projects/_export.html.haml | 36 +- app/views/projects/_files.html.haml | 2 +- app/views/projects/_find_file_link.html.haml | 2 +- app/views/projects/_fork_suggestion.html.haml | 21 +- app/views/projects/_home_panel.html.haml | 10 +- app/views/projects/_import_project_pane.html.haml | 2 +- app/views/projects/_invite_members_link.html.haml | 4 + app/views/projects/_invite_members_modal.html.haml | 2 +- .../_invite_members_side_nav_link.html.haml | 3 - app/views/projects/_issuable_by_email.html.haml | 49 -- app/views/projects/_last_push.html.haml | 2 +- .../_merge_request_merge_checks_settings.html.haml | 1 + ..._merge_request_merge_options_settings.html.haml | 2 +- ...ge_request_merge_suggestions_settings.html.haml | 2 +- .../projects/_merge_request_settings.html.haml | 3 +- app/views/projects/_new_project_fields.html.haml | 7 +- app/views/projects/_new_project_push_tip.html.haml | 2 +- app/views/projects/_project_templates.html.haml | 6 +- app/views/projects/_remove.html.haml | 3 +- app/views/projects/_remove_fork.html.haml | 1 + .../projects/_service_desk_settings.html.haml | 2 +- app/views/projects/_stat_anchor_list.html.haml | 2 +- app/views/projects/_transfer.html.haml | 9 +- app/views/projects/_visibility_modal.html.haml | 4 +- app/views/projects/_wiki.html.haml | 2 +- app/views/projects/artifacts/_artifact.html.haml | 12 +- app/views/projects/blob/_breadcrumb.html.haml | 8 +- app/views/projects/blob/_editor.html.haml | 6 +- app/views/projects/blob/_header.html.haml | 8 +- app/views/projects/blob/_viewer_switcher.html.haml | 6 +- app/views/projects/branches/_branch.html.haml | 22 +- app/views/projects/branches/index.html.haml | 5 +- app/views/projects/buttons/_clone.html.haml | 17 +- app/views/projects/buttons/_download.html.haml | 2 +- .../projects/buttons/_download_links.html.haml | 2 +- app/views/projects/buttons/_fork.html.haml | 10 +- app/views/projects/buttons/_remove_tag.html.haml | 2 +- app/views/projects/buttons/_xcode_link.html.haml | 2 - app/views/projects/ci/builds/_build.html.haml | 44 +- app/views/projects/cleanup/_show.html.haml | 7 +- app/views/projects/commit/_change.html.haml | 31 +- app/views/projects/commit/_commit_box.html.haml | 14 +- app/views/projects/commit/_commit_modal.html.haml | 26 - .../projects/commit/_signature_badge.html.haml | 2 +- app/views/projects/commit/pipelines.html.haml | 4 + app/views/projects/commit/show.html.haml | 6 +- app/views/projects/commits/_commit.atom.builder | 2 + app/views/projects/commits/_commit.html.haml | 2 +- app/views/projects/commits/show.atom.builder | 2 + app/views/projects/commits/show.html.haml | 4 +- app/views/projects/compare/_form.html.haml | 3 - app/views/projects/compare/index.html.haml | 6 +- app/views/projects/default_branch/_show.html.haml | 8 +- app/views/projects/deployments/_rollback.haml | 6 +- app/views/projects/diffs/_diffs.html.haml | 7 +- app/views/projects/diffs/_file.html.haml | 4 +- .../projects/diffs/viewers/_collapsed.html.haml | 4 +- app/views/projects/edit.html.haml | 39 +- app/views/projects/empty.html.haml | 3 + app/views/projects/environments/index.html.haml | 1 - app/views/projects/forks/new.html.haml | 2 +- app/views/projects/graphs/charts.html.haml | 4 +- app/views/projects/graphs/show.html.haml | 2 +- app/views/projects/issues/_new_branch.html.haml | 6 +- .../projects/issues/import_csv/_button.html.haml | 2 +- app/views/projects/issues/index.atom.builder | 2 + app/views/projects/issues/index.html.haml | 4 +- app/views/projects/jobs/_table.html.haml | 4 +- app/views/projects/jobs/index.html.haml | 3 - app/views/projects/learn_gitlab/index.html.haml | 4 + .../_close_reopen_draft_report_toggle.html.haml | 2 +- .../projects/merge_requests/_commits.html.haml | 2 +- .../merge_requests/_merge_request.html.haml | 2 +- .../projects/merge_requests/_mr_title.html.haml | 10 +- .../conflicts/_submit_form.html.haml | 2 +- .../components/_diff_file_editor.html.haml | 4 +- app/views/projects/merge_requests/index.html.haml | 4 +- app/views/projects/merge_requests/show.html.haml | 13 +- .../widget/_commit_change_content.html.haml | 4 +- app/views/projects/milestones/_form.html.haml | 4 +- app/views/projects/milestones/index.html.haml | 19 +- .../mirrors/_authentication_method.html.haml | 4 +- app/views/projects/mirrors/_mirror_repos.html.haml | 2 +- .../projects/mirrors/_mirror_repos_form.html.haml | 2 +- app/views/projects/network/show.html.haml | 6 +- app/views/projects/new.html.haml | 2 +- app/views/projects/no_repo.html.haml | 8 +- app/views/projects/notes/_actions.html.haml | 14 +- .../notes/_more_actions_dropdown.html.haml | 7 +- app/views/projects/pages/_use.html.haml | 7 +- .../projects/pipeline_schedules/_form.html.haml | 4 +- .../_pipeline_schedule.html.haml | 8 +- .../projects/pipeline_schedules/index.html.haml | 2 +- app/views/projects/pipelines/_info.html.haml | 3 + app/views/projects/pipelines/_with_tabs.html.haml | 18 +- app/views/projects/pipelines/show.html.haml | 2 +- app/views/projects/project_members/index.html.haml | 55 ++- .../_create_protected_branch.html.haml | 4 +- .../protected_branches/shared/_index.html.haml | 2 +- .../shared/_protected_branch.html.haml | 4 +- .../protected_tags/shared/_index.html.haml | 2 +- .../protected_tags/shared/_tags_list.html.haml | 1 - .../projects/registry/repositories/index.html.haml | 7 +- .../projects/runners/_group_runners.html.haml | 4 +- app/views/projects/runners/_runner.html.haml | 14 +- .../projects/runners/_shared_runners.html.haml | 4 +- .../projects/runners/_specific_runners.html.haml | 8 +- .../projects/security/configuration/show.html.haml | 4 + app/views/projects/services/_form.html.haml | 19 +- .../projects/services/prometheus/_top.html.haml | 2 +- app/views/projects/settings/_archive.html.haml | 10 +- app/views/projects/settings/_general.html.haml | 12 +- .../settings/ci_cd/_autodevops_form.html.haml | 2 +- app/views/projects/settings/ci_cd/_form.html.haml | 151 ++---- app/views/projects/settings/ci_cd/show.html.haml | 27 +- .../projects/settings/integrations/show.html.haml | 2 +- .../operations/_alert_management.html.haml | 2 +- .../settings/operations/_error_tracking.html.haml | 2 +- .../settings/operations/_tracing.html.haml | 4 +- app/views/projects/show.atom.builder | 2 + app/views/projects/show.html.haml | 3 + app/views/projects/tags/_tag.atom.builder | 2 + app/views/projects/tags/_tag.html.haml | 2 +- app/views/projects/tags/index.atom.builder | 2 + app/views/projects/tags/index.html.haml | 4 +- app/views/projects/tags/releases/edit.html.haml | 4 +- app/views/projects/tags/show.html.haml | 8 +- app/views/projects/tree/_readme.html.haml | 10 - app/views/projects/tree/_tree_content.html.haml | 24 - app/views/projects/tree/_tree_header.html.haml | 5 - app/views/projects/tree/_tree_row.html.haml | 27 -- .../tree/_truncated_notice_tree_row.html.haml | 7 - app/views/projects/triggers/_form.html.haml | 2 +- app/views/projects/triggers/_index.html.haml | 71 +-- app/views/registrations/welcome/show.html.haml | 11 +- app/views/search/_filter.html.haml | 14 - app/views/search/_form.html.haml | 20 - app/views/search/_results.html.haml | 4 +- app/views/search/_results_status.html.haml | 6 +- app/views/search/_sort_dropdown.html.haml | 14 - app/views/search/opensearch.xml.erb | 9 + app/views/search/results/_issuable.html.haml | 2 +- app/views/search/show.html.haml | 7 +- app/views/sent_notifications/unsubscribe.html.haml | 2 +- app/views/shared/_auto_devops_callout.html.haml | 2 +- .../shared/_commit_message_container.html.haml | 2 +- app/views/shared/_email_with_badge.html.haml | 4 +- app/views/shared/_file_picker_button.html.haml | 2 +- app/views/shared/_issuable_meta_data.html.haml | 8 +- app/views/shared/_label.html.haml | 8 +- app/views/shared/_milestone_expired.html.haml | 6 +- app/views/shared/_new_commit_form.html.haml | 2 +- app/views/shared/_no_ssh.html.haml | 2 +- app/views/shared/_project_limit.html.haml | 2 +- app/views/shared/_search_settings.html.haml | 6 +- app/views/shared/_service_settings.html.haml | 15 +- app/views/shared/access_tokens/_form.html.haml | 2 +- app/views/shared/access_tokens/_table.html.haml | 2 +- app/views/shared/boards/_show.html.haml | 5 +- .../shared/boards/components/_sidebar.html.haml | 2 +- .../boards/components/sidebar/_assignee.html.haml | 36 +- app/views/shared/deploy_keys/_form.html.haml | 12 +- app/views/shared/deploy_keys/_index.html.haml | 6 +- .../deploy_keys/_project_group_form.html.haml | 12 +- app/views/shared/deploy_tokens/_form.html.haml | 25 +- app/views/shared/deploy_tokens/_index.html.haml | 2 +- .../deploy_tokens/_new_deploy_token.html.haml | 12 +- app/views/shared/deploy_tokens/_table.html.haml | 2 +- .../shared/empty_states/_deploy_keys.html.haml | 4 +- app/views/shared/empty_states/_issues.html.haml | 2 +- .../shared/empty_states/_milestones.html.haml | 7 + .../shared/empty_states/_profile_tabs.html.haml | 5 +- app/views/shared/empty_states/_snippets.html.haml | 4 +- app/views/shared/integrations/_form.html.haml | 11 +- .../issuable/_board_create_list_dropdown.html.haml | 4 +- .../shared/issuable/_bulk_update_sidebar.html.haml | 29 +- app/views/shared/issuable/_feed_buttons.html.haml | 4 +- app/views/shared/issuable/_form.html.haml | 8 +- .../shared/issuable/_label_page_create.html.haml | 4 +- app/views/shared/issuable/_search_bar.html.haml | 11 +- app/views/shared/issuable/_sidebar.html.haml | 6 +- .../shared/issuable/_sidebar_assignees.html.haml | 2 +- app/views/shared/issuable/_sidebar_todo.html.haml | 4 +- .../shared/issuable/csv_export/_button.html.haml | 2 +- .../issuable/form/_template_selector.html.haml | 4 +- app/views/shared/issuable/form/_title.html.haml | 2 +- .../shared/issue_type/_details_header.html.haml | 8 +- app/views/shared/milestones/_labels_tab.html.haml | 4 +- app/views/shared/milestones/_milestone.html.haml | 4 +- app/views/shared/milestones/_sidebar.html.haml | 2 +- app/views/shared/notes/_comment_button.html.haml | 8 +- app/views/shared/notes/_edit_form.html.haml | 6 +- app/views/shared/notes/_form.html.haml | 2 +- app/views/shared/notes/_notes_with_form.html.haml | 3 - .../shared/notifications/_new_button.html.haml | 6 +- .../_update_protected_branch.html.haml | 4 +- app/views/shared/ssh_keys/_key_delete.html.haml | 6 + app/views/shared/users/_user.html.haml | 13 + app/views/shared/users/index.html.haml | 20 + app/views/shared/web_hooks/_form.html.haml | 49 +- app/views/shared/web_hooks/_hook.html.haml | 4 +- app/views/shared/web_hooks/_test_button.html.haml | 2 +- app/views/shared/wikis/_sidebar.html.haml | 2 +- app/views/users/show.atom.builder | 2 + app/views/users/show.html.haml | 49 +- app/workers/all_queues.yml | 71 ++- app/workers/authorized_projects_worker.rb | 2 +- app/workers/build_coverage_worker.rb | 14 - app/workers/build_finished_worker.rb | 6 +- app/workers/build_hooks_worker.rb | 3 +- app/workers/build_trace_sections_worker.rb | 14 - app/workers/bulk_import_worker.rb | 4 + app/workers/bulk_imports/entity_worker.rb | 10 + app/workers/ci/build_report_result_worker.rb | 18 - .../create_quality_report_worker.rb | 20 + .../concerns/git_garbage_collect_methods.rb | 135 ++++++ .../cleanup_container_repository_worker.rb | 5 +- app/workers/git_garbage_collect_worker.rb | 118 +---- app/workers/issuable_export_csv_worker.rb | 25 +- app/workers/jira_connect/sync_builds_worker.rb | 1 - .../jira_connect/sync_deployments_worker.rb | 1 - .../jira_connect/sync_feature_flags_worker.rb | 1 - app/workers/merge_request_cleanup_refs_worker.rb | 2 + .../in_product_marketing_emails_worker.rb | 17 + .../packages/composer/cache_cleanup_worker.rb | 30 ++ app/workers/pages_remove_worker.rb | 4 +- app/workers/pages_transfer_worker.rb | 2 +- app/workers/pipeline_hooks_worker.rb | 3 +- app/workers/post_receive.rb | 2 + app/workers/projects/git_garbage_collect_worker.rb | 37 ++ .../schedule_merge_request_cleanup_refs_worker.rb | 1 + app/workers/user_status_cleanup/batch_worker.rb | 33 ++ app/workers/wikis/git_garbage_collect_worker.rb | 20 + 2581 files changed, 28047 insertions(+), 16549 deletions(-) create mode 100644 app/assets/images/auth_buttons/openid_64.png create mode 100644 app/assets/images/mailers/in_product_marketing/create-0.png create mode 100644 app/assets/images/mailers/in_product_marketing/create-1.png create mode 100644 app/assets/images/mailers/in_product_marketing/create-2.png create mode 100644 app/assets/images/mailers/in_product_marketing/gitlab-logo-gray-rgb.png create mode 100644 app/assets/images/mailers/in_product_marketing/team-0.png create mode 100644 app/assets/images/mailers/in_product_marketing/team-1.png create mode 100644 app/assets/images/mailers/in_product_marketing/team-2.png create mode 100644 app/assets/images/mailers/in_product_marketing/trial-0.png create mode 100644 app/assets/images/mailers/in_product_marketing/trial-1.png create mode 100644 app/assets/images/mailers/in_product_marketing/trial-2.png create mode 100644 app/assets/images/mailers/in_product_marketing/verify-0.png create mode 100644 app/assets/images/mailers/in_product_marketing/verify-1.png create mode 100644 app/assets/images/mailers/in_product_marketing/verify-2.png create mode 100644 app/assets/javascripts/actioncable_connection_monitor.js delete mode 100644 app/assets/javascripts/admin/cohorts/components/usage_ping_disabled.vue create mode 100644 app/assets/javascripts/admin/users/components/actions/activate.vue create mode 100644 app/assets/javascripts/admin/users/components/actions/approve.vue create mode 100644 app/assets/javascripts/admin/users/components/actions/block.vue create mode 100644 app/assets/javascripts/admin/users/components/actions/deactivate.vue create mode 100644 app/assets/javascripts/admin/users/components/actions/delete.vue create mode 100644 app/assets/javascripts/admin/users/components/actions/delete_with_contributions.vue create mode 100644 app/assets/javascripts/admin/users/components/actions/index.js create mode 100644 app/assets/javascripts/admin/users/components/actions/reject.vue create mode 100644 app/assets/javascripts/admin/users/components/actions/shared/shared_delete_action.vue create mode 100644 app/assets/javascripts/admin/users/components/actions/unblock.vue create mode 100644 app/assets/javascripts/admin/users/components/actions/unlock.vue create mode 100644 app/assets/javascripts/admin/users/components/usage_ping_disabled.vue create mode 100644 app/assets/javascripts/admin/users/components/user_actions.vue create mode 100644 app/assets/javascripts/admin/users/components/user_date.vue create mode 100644 app/assets/javascripts/admin/users/tabs.js create mode 100644 app/assets/javascripts/admin/users/utils.js delete mode 100644 app/assets/javascripts/alert_management/components/alert_details.vue delete mode 100644 app/assets/javascripts/alert_management/components/alert_metrics.vue delete mode 100644 app/assets/javascripts/alert_management/components/alert_sidebar.vue delete mode 100644 app/assets/javascripts/alert_management/components/alert_status.vue delete mode 100644 app/assets/javascripts/alert_management/components/alert_summary_row.vue delete mode 100644 app/assets/javascripts/alert_management/components/sidebar/sidebar_assignee.vue delete mode 100644 app/assets/javascripts/alert_management/components/sidebar/sidebar_assignees.vue delete mode 100644 app/assets/javascripts/alert_management/components/sidebar/sidebar_header.vue delete mode 100644 app/assets/javascripts/alert_management/components/sidebar/sidebar_status.vue delete mode 100644 app/assets/javascripts/alert_management/components/sidebar/sidebar_todo.vue delete mode 100644 app/assets/javascripts/alert_management/components/system_notes/system_note.vue delete mode 100644 app/assets/javascripts/alert_management/details.js delete mode 100644 app/assets/javascripts/alert_management/graphql/fragments/detail_item.fragment.graphql delete mode 100644 app/assets/javascripts/alert_management/graphql/mutations/alert_set_assignees.mutation.graphql delete mode 100644 app/assets/javascripts/alert_management/graphql/mutations/alert_todo_create.mutation.graphql delete mode 100644 app/assets/javascripts/alert_management/graphql/mutations/create_issue_from_alert.mutation.graphql delete mode 100644 app/assets/javascripts/alert_management/graphql/mutations/toggle_sidebar_status.mutation.graphql delete mode 100644 app/assets/javascripts/alert_management/graphql/queries/details.query.graphql delete mode 100644 app/assets/javascripts/alert_management/graphql/queries/sidebar_status.query.graphql delete mode 100644 app/assets/javascripts/alert_management/router.js delete mode 100644 app/assets/javascripts/alerts_service_settings/components/alerts_service_form.vue delete mode 100644 app/assets/javascripts/alerts_service_settings/index.js delete mode 100644 app/assets/javascripts/alerts_settings/components/mocks/gitlabFields.json create mode 100644 app/assets/javascripts/alerts_settings/utils/mapping_transformations.js create mode 100644 app/assets/javascripts/artifacts_settings/graphql/queries/get_keep_latest_artifact_application_setting.query.graphql create mode 100644 app/assets/javascripts/behaviors/shortcuts/shortcuts_help.vue create mode 100644 app/assets/javascripts/boards/components/board_add_new_column_trigger.vue delete mode 100644 app/assets/javascripts/boards/components/board_assignee_dropdown.vue create mode 100644 app/assets/javascripts/boards/components/board_card_layout_deprecated.vue create mode 100644 app/assets/javascripts/boards/components/boards_selector_deprecated.vue create mode 100644 app/assets/javascripts/boards/components/toggle_focus.vue delete mode 100644 app/assets/javascripts/boards/graphql/group_milestones.query.graphql create mode 100644 app/assets/javascripts/boards/graphql/project_milestones.query.graphql create mode 100644 app/assets/javascripts/boards/models/iteration.js create mode 100644 app/assets/javascripts/captcha/captcha_modal.vue create mode 100644 app/assets/javascripts/captcha/init_recaptcha_script.js create mode 100644 app/assets/javascripts/diffs/utils/suggestions.js create mode 100644 app/assets/javascripts/environments/mixins/environments_pagination_api_mixin.js create mode 100644 app/assets/javascripts/feature_highlight/constants.js delete mode 100644 app/assets/javascripts/feature_highlight/feature_highlight.js delete mode 100644 app/assets/javascripts/feature_highlight/feature_highlight_options.js create mode 100644 app/assets/javascripts/feature_highlight/feature_highlight_popover.vue create mode 100644 app/assets/javascripts/feature_highlight/index.js create mode 100644 app/assets/javascripts/graphql_shared/mutations/alert_status_update.mutation.graphql delete mode 100644 app/assets/javascripts/graphql_shared/mutations/update_alert_status.mutation.graphql delete mode 100644 app/assets/javascripts/groups/members/components/app.vue delete mode 100644 app/assets/javascripts/groups/members/index.js create mode 100644 app/assets/javascripts/issuable/components/issuable_by_email.vue create mode 100644 app/assets/javascripts/issuable/init_issuable_by_email.js create mode 100644 app/assets/javascripts/jira_import/queries/search_project_members.query.graphql create mode 100644 app/assets/javascripts/lib/utils/array_utility.js create mode 100644 app/assets/javascripts/members/components/app.vue create mode 100644 app/assets/javascripts/members/index.js create mode 100644 app/assets/javascripts/notifications/components/custom_notifications_modal.vue create mode 100644 app/assets/javascripts/notifications/components/notifications_dropdown.vue create mode 100644 app/assets/javascripts/notifications/components/notifications_dropdown_item.vue create mode 100644 app/assets/javascripts/notifications/constants.js create mode 100644 app/assets/javascripts/notifications/index.js delete mode 100644 app/assets/javascripts/onboarding_issues/index.js create mode 100644 app/assets/javascripts/packages/list/components/package_search.vue delete mode 100644 app/assets/javascripts/packages/list/components/packages_filter.vue delete mode 100644 app/assets/javascripts/packages/list/components/packages_sort.vue create mode 100644 app/assets/javascripts/packages/list/components/tokens/package_type_token.vue create mode 100644 app/assets/javascripts/packages_and_registries/settings/group/components/maven_settings.vue create mode 100644 app/assets/javascripts/packages_and_registries/settings/group/constants.js create mode 100644 app/assets/javascripts/packages_and_registries/settings/group/graphql/mutations/update_group_packages_settings.mutation.graphql create mode 100644 app/assets/javascripts/packages_and_registries/settings/group/graphql/queries/get_group_packages_settings.query.graphql create mode 100644 app/assets/javascripts/packages_and_registries/settings/group/graphql/utils/cache_update.js create mode 100644 app/assets/javascripts/packages_and_registries/settings/group/graphql/utils/optimistic_responses.js delete mode 100644 app/assets/javascripts/pages/admin/cohorts/index.js delete mode 100644 app/assets/javascripts/pages/import/bulk_imports/index.js create mode 100644 app/assets/javascripts/pages/import/bulk_imports/status/index.js create mode 100644 app/assets/javascripts/pages/oauth/index.js create mode 100644 app/assets/javascripts/pages/projects/compare/index/index.js delete mode 100644 app/assets/javascripts/pages/projects/edit/mount_search_settings.js create mode 100644 app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_a.vue create mode 100644 app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_b.vue create mode 100644 app/assets/javascripts/pages/projects/learn_gitlab/constants/index.js create mode 100644 app/assets/javascripts/pages/projects/learn_gitlab/index/index.js create mode 100644 app/assets/javascripts/pages/projects/merge_requests/edit/check_form_state.js create mode 100644 app/assets/javascripts/pages/projects/security/configuration/index.js delete mode 100644 app/assets/javascripts/pages/search/show/search.js create mode 100644 app/assets/javascripts/pages/shared/mount_runner_instructions.js create mode 100644 app/assets/javascripts/pipeline_editor/components/commit/commit_section.vue create mode 100644 app/assets/javascripts/pipeline_editor/components/editor/ci_config_merged_preview.vue create mode 100644 app/assets/javascripts/pipeline_editor/components/editor/text_editor.vue create mode 100644 app/assets/javascripts/pipeline_editor/components/header/pipeline_editor_header.vue create mode 100644 app/assets/javascripts/pipeline_editor/components/header/validation_segment.vue delete mode 100644 app/assets/javascripts/pipeline_editor/components/info/validation_segment.vue create mode 100644 app/assets/javascripts/pipeline_editor/components/pipeline_editor_tabs.vue delete mode 100644 app/assets/javascripts/pipeline_editor/components/text_editor.vue create mode 100644 app/assets/javascripts/pipeline_editor/components/ui/confirm_unsaved_changes_dialog.vue create mode 100644 app/assets/javascripts/pipeline_editor/graphql/queries/client/commit_sha.graphql create mode 100644 app/assets/javascripts/pipeline_editor/pipeline_editor_home.vue delete mode 100644 app/assets/javascripts/pipelines/components/legacy_header_component.vue delete mode 100644 app/assets/javascripts/pipelines/mixins/pipelines.js create mode 100644 app/assets/javascripts/pipelines/mixins/pipelines_mixin.js create mode 100644 app/assets/javascripts/profile/preferences/constants.js create mode 100644 app/assets/javascripts/projects/commit/index.js create mode 100644 app/assets/javascripts/projects/commit/init_cherry_pick_commit_modal.js create mode 100644 app/assets/javascripts/projects/commit/init_cherry_pick_commit_trigger.js create mode 100644 app/assets/javascripts/projects/compare/components/app.vue create mode 100644 app/assets/javascripts/projects/compare/components/revision_dropdown.vue create mode 100644 app/assets/javascripts/projects/compare/index.js create mode 100644 app/assets/javascripts/projects/members/constants.js create mode 100644 app/assets/javascripts/projects/members/utils.js create mode 100644 app/assets/javascripts/projects/pipelines/charts/components/ci_cd_analytics_charts.vue delete mode 100644 app/assets/javascripts/projects/settings_service_desk/event_hub.js delete mode 100644 app/assets/javascripts/projects/settings_service_desk/services/service_desk_service.js create mode 100644 app/assets/javascripts/protected_tags/constants.js create mode 100644 app/assets/javascripts/registry/explorer/components/delete_image.vue create mode 100644 app/assets/javascripts/registry/explorer/components/details_page/empty_state.vue delete mode 100644 app/assets/javascripts/registry/explorer/components/details_page/empty_tags_state.vue create mode 100644 app/assets/javascripts/registry/explorer/components/details_page/status_alert.vue create mode 100644 app/assets/javascripts/search/sort/components/app.vue create mode 100644 app/assets/javascripts/search/sort/constants.js create mode 100644 app/assets/javascripts/search/sort/index.js create mode 100644 app/assets/javascripts/search/topbar/components/app.vue create mode 100644 app/assets/javascripts/search_settings/mount.js create mode 100644 app/assets/javascripts/security_configuration/components/app.vue create mode 100644 app/assets/javascripts/security_configuration/components/configuration_table.vue create mode 100644 app/assets/javascripts/security_configuration/components/features_constants.js create mode 100644 app/assets/javascripts/security_configuration/components/manage_sast.vue create mode 100644 app/assets/javascripts/security_configuration/components/upgrade.vue create mode 100644 app/assets/javascripts/security_configuration/graphql/configure_sast.mutation.graphql create mode 100644 app/assets/javascripts/security_configuration/index.js delete mode 100644 app/assets/javascripts/set_status_modal/components/user_availability_status.vue create mode 100644 app/assets/javascripts/sidebar/components/assignees/sidebar_assignees_widget.vue create mode 100644 app/assets/javascripts/sidebar/components/assignees/user_name_with_status.vue create mode 100644 app/assets/javascripts/sidebar/components/sidebar_editable_item.vue create mode 100644 app/assets/javascripts/sidebar/constants.js create mode 100644 app/assets/javascripts/sidebar/queries/reviewer_rereview.mutation.graphql create mode 100644 app/assets/javascripts/snippets/utils/error.js create mode 100644 app/assets/javascripts/terraform/graphql/mutations/add_data_to_state.mutation.graphql create mode 100644 app/assets/javascripts/terraform/graphql/resolvers.js create mode 100644 app/assets/javascripts/vue_shared/alert_details/components/alert_details.vue create mode 100644 app/assets/javascripts/vue_shared/alert_details/components/alert_metrics.vue create mode 100644 app/assets/javascripts/vue_shared/alert_details/components/alert_sidebar.vue create mode 100644 app/assets/javascripts/vue_shared/alert_details/components/alert_status.vue create mode 100644 app/assets/javascripts/vue_shared/alert_details/components/alert_summary_row.vue create mode 100644 app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_assignee.vue create mode 100644 app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_assignees.vue create mode 100644 app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_header.vue create mode 100644 app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_status.vue create mode 100644 app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_todo.vue create mode 100644 app/assets/javascripts/vue_shared/alert_details/components/system_notes/system_note.vue create mode 100644 app/assets/javascripts/vue_shared/alert_details/constants.js create mode 100644 app/assets/javascripts/vue_shared/alert_details/graphql/fragments/alert_detail_item.fragment.graphql create mode 100644 app/assets/javascripts/vue_shared/alert_details/graphql/mutations/alert_issue_create.mutation.graphql create mode 100644 app/assets/javascripts/vue_shared/alert_details/graphql/mutations/alert_set_assignees.mutation.graphql create mode 100644 app/assets/javascripts/vue_shared/alert_details/graphql/mutations/alert_sidebar_status.mutation.graphql create mode 100644 app/assets/javascripts/vue_shared/alert_details/graphql/mutations/alert_todo_create.mutation.graphql create mode 100644 app/assets/javascripts/vue_shared/alert_details/graphql/queries/alert_details.query.graphql create mode 100644 app/assets/javascripts/vue_shared/alert_details/graphql/queries/alert_sidebar_status.query.graphql create mode 100644 app/assets/javascripts/vue_shared/alert_details/index.js create mode 100644 app/assets/javascripts/vue_shared/alert_details/router.js create mode 100644 app/assets/javascripts/vue_shared/components/registry/registry_search.vue create mode 100644 app/assets/javascripts/vue_shared/components/runner_instructions/constants.js create mode 100644 app/assets/javascripts/vue_shared/components/runner_instructions/graphql/queries/get_runner_platforms.query.graphql create mode 100644 app/assets/javascripts/vue_shared/components/runner_instructions/graphql/queries/get_runner_setup.query.graphql create mode 100644 app/assets/javascripts/vue_shared/components/runner_instructions/runner_instructions.vue create mode 100644 app/assets/javascripts/vue_shared/components/settings/settings_block.vue delete mode 100644 app/assets/javascripts/vue_shared/components/sidebar/queries/getIssueParticipants.query.graphql create mode 100644 app/assets/javascripts/vue_shared/components/sidebar/queries/get_issue_participants.query.graphql create mode 100644 app/assets/javascripts/vue_shared/components/sidebar/queries/get_mr_participants.query.graphql delete mode 100644 app/assets/javascripts/vue_shared/components/sidebar/queries/updateAssignees.mutation.graphql create mode 100644 app/assets/javascripts/vue_shared/components/sidebar/queries/update_issue_assignees.mutation.graphql create mode 100644 app/assets/javascripts/vue_shared/components/sidebar/queries/update_mr_assignees.mutation.graphql delete mode 100644 app/assets/javascripts/vue_shared/components/toggle_button.vue delete mode 100644 app/assets/javascripts/vue_shared/mixins/ci_pagination_api_mixin.js create mode 100644 app/assets/javascripts/webpack_non_compiled_placeholder.js delete mode 100644 app/assets/stylesheets/framework/carousel.scss create mode 100644 app/assets/stylesheets/page_bundles/admin/application_settings_metrics_and_profiling.scss create mode 100644 app/assets/stylesheets/page_bundles/admin/jobs_index.scss delete mode 100644 app/assets/stylesheets/pages/admin.scss create mode 100644 app/controllers/concerns/comment_and_close_flag.rb create mode 100644 app/controllers/groups/email_campaigns_controller.rb create mode 100644 app/controllers/projects/ci/prometheus_metrics/histograms_controller.rb create mode 100644 app/controllers/projects/learn_gitlab_controller.rb create mode 100644 app/controllers/projects/security/configuration_controller.rb create mode 100644 app/experiments/members/invite_email_experiment.rb create mode 100644 app/experiments/new_project_readme_experiment.rb create mode 100644 app/experiments/strategy/round_robin.rb create mode 100644 app/finders/ci/testing/daily_build_group_report_results_finder.rb create mode 100644 app/finders/merge_request/metrics_finder.rb create mode 100644 app/finders/merge_requests/oldest_per_commit_finder.rb create mode 100644 app/finders/repositories/commits_with_trailer_finder.rb create mode 100644 app/finders/repositories/previous_tag_finder.rb create mode 100644 app/finders/terraform/states_finder.rb delete mode 100644 app/graphql/mutations/boards/lists/base.rb create mode 100644 app/graphql/mutations/boards/lists/base_create.rb create mode 100644 app/graphql/mutations/concerns/mutations/can_mutate_spammable.rb delete mode 100644 app/graphql/mutations/concerns/mutations/spammable_mutation_fields.rb create mode 100644 app/graphql/mutations/merge_requests/reviewer_rereview.rb create mode 100644 app/graphql/mutations/security/ci_configuration/configure_sast.rb create mode 100644 app/graphql/mutations/snippets/service_compatibility.rb create mode 100644 app/graphql/resolvers/group_labels_resolver.rb create mode 100644 app/graphql/resolvers/labels_resolver.rb create mode 100644 app/graphql/types/ci/application_setting_type.rb create mode 100644 app/graphql/types/ci_configuration/sast/analyzers_entity_input_type.rb create mode 100644 app/graphql/types/ci_configuration/sast/analyzers_entity_type.rb create mode 100644 app/graphql/types/ci_configuration/sast/entity_input_type.rb create mode 100644 app/graphql/types/ci_configuration/sast/entity_type.rb create mode 100644 app/graphql/types/ci_configuration/sast/input_type.rb create mode 100644 app/graphql/types/ci_configuration/sast/options_entity_type.rb create mode 100644 app/graphql/types/ci_configuration/sast/type.rb create mode 100644 app/graphql/types/ci_configuration/sast/ui_component_size_enum.rb create mode 100644 app/graphql/types/container_repository_sort_enum.rb create mode 100644 app/graphql/types/event_action_enum.rb create mode 100644 app/graphql/types/event_type.rb create mode 100644 app/graphql/types/eventable_type.rb create mode 100644 app/graphql/types/merge_request_state_event_enum.rb delete mode 100644 app/graphql/types/packages/composer/details_type.rb create mode 100644 app/graphql/types/packages/metadata_type.rb create mode 100644 app/graphql/types/packages/package_without_versions_type.rb create mode 100644 app/helpers/analytics/cycle_analytics_helper.rb create mode 100644 app/helpers/enable_search_settings_helper.rb create mode 100644 app/helpers/in_product_marketing_helper.rb create mode 100644 app/helpers/issuables_description_templates_helper.rb create mode 100644 app/helpers/learn_gitlab_helper.rb create mode 100644 app/mailers/emails/in_product_marketing.rb create mode 100644 app/models/concerns/nullify_if_blank.rb create mode 100644 app/models/concerns/packages/debian/component.rb create mode 100644 app/models/concerns/packages/debian/component_file.rb create mode 100644 app/models/concerns/suppress_composite_primary_key_warning.rb create mode 100644 app/models/namespaces/traversal/recursive.rb create mode 100644 app/models/packages/composer/cache_file.rb create mode 100644 app/models/packages/debian/group_component.rb create mode 100644 app/models/packages/debian/group_component_file.rb create mode 100644 app/models/packages/debian/project_component.rb create mode 100644 app/models/packages/debian/project_component_file.rb create mode 100644 app/models/packages/debian/publication.rb create mode 100644 app/models/packages/rubygems/metadatum.rb delete mode 100644 app/models/project_services/alerts_service.rb delete mode 100644 app/models/project_services/mock_deployment_service.rb delete mode 100644 app/models/readme_blob.rb create mode 100644 app/models/token_with_iv.rb create mode 100644 app/models/users/user_follow_user.rb create mode 100644 app/policies/application_setting_policy.rb create mode 100644 app/policies/event_policy.rb create mode 100644 app/presenters/ci/pipeline_artifacts/code_quality_mr_diff_presenter.rb create mode 100644 app/presenters/dev_ops_report/metric_presenter.rb delete mode 100644 app/presenters/dev_ops_score/metric_presenter.rb delete mode 100644 app/presenters/gitlab/whats_new/item_presenter.rb create mode 100644 app/serializers/ci/codequality_mr_diff_entity.rb create mode 100644 app/serializers/ci/codequality_mr_diff_report_serializer.rb create mode 100644 app/serializers/ci/pipeline_entity.rb delete mode 100644 app/serializers/group_group_link_entity.rb delete mode 100644 app/serializers/group_group_link_serializer.rb create mode 100644 app/serializers/group_link/group_group_link_entity.rb create mode 100644 app/serializers/group_link/group_group_link_serializer.rb create mode 100644 app/serializers/group_link/group_link_entity.rb create mode 100644 app/serializers/group_link/project_group_link_entity.rb create mode 100644 app/serializers/group_link/project_group_link_serializer.rb delete mode 100644 app/serializers/pipeline_entity.rb create mode 100644 app/services/boards/lists/base_create_service.rb create mode 100644 app/services/captcha/captcha_verification_service.rb create mode 100644 app/services/ci/generate_codequality_mr_diff_report_service.rb create mode 100644 app/services/ci/pipeline_artifacts/create_code_quality_mr_diff_report_service.rb create mode 100644 app/services/ci/prometheus_metrics/observe_histograms_service.rb create mode 100644 app/services/concerns/alert_management/alert_processing.rb delete mode 100644 app/services/concerns/spam_check_methods.rb create mode 100644 app/services/discussions/unresolve_service.rb create mode 100644 app/services/groups/open_issues_count_service.rb create mode 100644 app/services/merge_requests/mark_reviewer_reviewed_service.rb create mode 100644 app/services/merge_requests/reload_merge_head_diff_service.rb create mode 100644 app/services/merge_requests/request_review_service.rb create mode 100644 app/services/namespaces/in_product_marketing_emails_service.rb create mode 100644 app/services/notification_recipients/builder/request_review.rb create mode 100644 app/services/packages/debian/create_distribution_service.rb create mode 100644 app/services/packages/debian/destroy_distribution_service.rb create mode 100644 app/services/packages/debian/update_distribution_service.rb create mode 100644 app/services/pages/migrate_from_legacy_storage_service.rb create mode 100644 app/services/projects/branches_by_mode_service.rb create mode 100644 app/services/repositories/changelog_service.rb create mode 100644 app/services/security/ci_configuration/sast_create_service.rb create mode 100644 app/services/security/ci_configuration/sast_parser_service.rb create mode 100644 app/services/spam/spam_params.rb create mode 100644 app/services/users/batch_status_cleaner_service.rb create mode 100644 app/uploaders/packages/composer/cache_uploader.rb create mode 100644 app/uploaders/packages/debian/component_file_uploader.rb create mode 100644 app/validators/json_schemas/application_setting_kroki_formats.json create mode 100644 app/validators/json_schemas/git_trailers.json create mode 100644 app/validators/nested_attributes_duplicates_validator.rb delete mode 100644 app/validators/variable_duplicates_validator.rb create mode 100644 app/views/admin/application_settings/_note_limits.html.haml delete mode 100644 app/views/admin/cohorts/_cohorts_table.html.haml delete mode 100644 app/views/admin/cohorts/index.html.haml create mode 100644 app/views/admin/users/_cohorts.html.haml create mode 100644 app/views/admin/users/_cohorts_table.html.haml create mode 100644 app/views/admin/users/_users.html.haml delete mode 100644 app/views/groups/_invite_members_side_nav_link.html.haml create mode 100644 app/views/groups/sidebar/_packages_settings.html.haml delete mode 100644 app/views/help/_shortcuts.html.haml delete mode 100644 app/views/help/shortcuts.js.haml delete mode 100644 app/views/layouts/devise_experimental_onboarding_issues.html.haml create mode 100644 app/views/layouts/header/_current_user_dropdown_item.html.haml create mode 100644 app/views/layouts/header/_whats_new_dropdown_item.html.haml create mode 100644 app/views/layouts/nav/sidebar/_project_security_link.html.haml create mode 100644 app/views/layouts/signup_onboarding.html.haml create mode 100644 app/views/notify/in_product_marketing_email.html.haml create mode 100644 app/views/notify/in_product_marketing_email.text.erb delete mode 100644 app/views/notify/provisioned_member_access_granted_email.erb delete mode 100644 app/views/notify/provisioned_member_access_granted_email.haml create mode 100644 app/views/notify/provisioned_member_access_granted_email.html.haml create mode 100644 app/views/notify/provisioned_member_access_granted_email.text.erb create mode 100644 app/views/notify/request_review_merge_request_email.html.haml create mode 100644 app/views/notify/request_review_merge_request_email.text.erb delete mode 100644 app/views/profiles/preferences/update.js.erb create mode 100644 app/views/projects/_invite_members_link.html.haml delete mode 100644 app/views/projects/_invite_members_side_nav_link.html.haml delete mode 100644 app/views/projects/_issuable_by_email.html.haml delete mode 100644 app/views/projects/buttons/_xcode_link.html.haml delete mode 100644 app/views/projects/commit/_commit_modal.html.haml create mode 100644 app/views/projects/learn_gitlab/index.html.haml create mode 100644 app/views/projects/security/configuration/show.html.haml delete mode 100644 app/views/projects/tree/_readme.html.haml delete mode 100644 app/views/projects/tree/_tree_content.html.haml delete mode 100644 app/views/projects/tree/_tree_row.html.haml delete mode 100644 app/views/projects/tree/_truncated_notice_tree_row.html.haml delete mode 100644 app/views/search/_filter.html.haml delete mode 100644 app/views/search/_form.html.haml delete mode 100644 app/views/search/_sort_dropdown.html.haml create mode 100644 app/views/search/opensearch.xml.erb create mode 100644 app/views/shared/empty_states/_milestones.html.haml create mode 100644 app/views/shared/ssh_keys/_key_delete.html.haml create mode 100644 app/views/shared/users/_user.html.haml create mode 100644 app/views/shared/users/index.html.haml delete mode 100644 app/workers/build_coverage_worker.rb delete mode 100644 app/workers/build_trace_sections_worker.rb delete mode 100644 app/workers/ci/build_report_result_worker.rb create mode 100644 app/workers/ci/pipeline_artifacts/create_quality_report_worker.rb create mode 100644 app/workers/concerns/git_garbage_collect_methods.rb create mode 100644 app/workers/namespaces/in_product_marketing_emails_worker.rb create mode 100644 app/workers/packages/composer/cache_cleanup_worker.rb create mode 100644 app/workers/projects/git_garbage_collect_worker.rb create mode 100644 app/workers/user_status_cleanup/batch_worker.rb create mode 100644 app/workers/wikis/git_garbage_collect_worker.rb (limited to 'app') diff --git a/app/assets/images/auth_buttons/openid_64.png b/app/assets/images/auth_buttons/openid_64.png new file mode 100644 index 00000000000..7b53d129f95 Binary files /dev/null and b/app/assets/images/auth_buttons/openid_64.png differ diff --git a/app/assets/images/mailers/in_product_marketing/create-0.png b/app/assets/images/mailers/in_product_marketing/create-0.png new file mode 100644 index 00000000000..7fc992f14f2 Binary files /dev/null and b/app/assets/images/mailers/in_product_marketing/create-0.png differ diff --git a/app/assets/images/mailers/in_product_marketing/create-1.png b/app/assets/images/mailers/in_product_marketing/create-1.png new file mode 100644 index 00000000000..0315ffefb31 Binary files /dev/null and b/app/assets/images/mailers/in_product_marketing/create-1.png differ diff --git a/app/assets/images/mailers/in_product_marketing/create-2.png b/app/assets/images/mailers/in_product_marketing/create-2.png new file mode 100644 index 00000000000..619f9fcd659 Binary files /dev/null and b/app/assets/images/mailers/in_product_marketing/create-2.png differ diff --git a/app/assets/images/mailers/in_product_marketing/gitlab-logo-gray-rgb.png b/app/assets/images/mailers/in_product_marketing/gitlab-logo-gray-rgb.png new file mode 100644 index 00000000000..31083af512e Binary files /dev/null and b/app/assets/images/mailers/in_product_marketing/gitlab-logo-gray-rgb.png differ diff --git a/app/assets/images/mailers/in_product_marketing/team-0.png b/app/assets/images/mailers/in_product_marketing/team-0.png new file mode 100644 index 00000000000..f10ae998efa Binary files /dev/null and b/app/assets/images/mailers/in_product_marketing/team-0.png differ diff --git a/app/assets/images/mailers/in_product_marketing/team-1.png b/app/assets/images/mailers/in_product_marketing/team-1.png new file mode 100644 index 00000000000..cd68464e6e8 Binary files /dev/null and b/app/assets/images/mailers/in_product_marketing/team-1.png differ diff --git a/app/assets/images/mailers/in_product_marketing/team-2.png b/app/assets/images/mailers/in_product_marketing/team-2.png new file mode 100644 index 00000000000..b199c659943 Binary files /dev/null and b/app/assets/images/mailers/in_product_marketing/team-2.png differ diff --git a/app/assets/images/mailers/in_product_marketing/trial-0.png b/app/assets/images/mailers/in_product_marketing/trial-0.png new file mode 100644 index 00000000000..3b0d7a8ecd8 Binary files /dev/null and b/app/assets/images/mailers/in_product_marketing/trial-0.png differ diff --git a/app/assets/images/mailers/in_product_marketing/trial-1.png b/app/assets/images/mailers/in_product_marketing/trial-1.png new file mode 100644 index 00000000000..3a30b2acaee Binary files /dev/null and b/app/assets/images/mailers/in_product_marketing/trial-1.png differ diff --git a/app/assets/images/mailers/in_product_marketing/trial-2.png b/app/assets/images/mailers/in_product_marketing/trial-2.png new file mode 100644 index 00000000000..95bd965b49f Binary files /dev/null and b/app/assets/images/mailers/in_product_marketing/trial-2.png differ diff --git a/app/assets/images/mailers/in_product_marketing/verify-0.png b/app/assets/images/mailers/in_product_marketing/verify-0.png new file mode 100644 index 00000000000..04b6f172b37 Binary files /dev/null and b/app/assets/images/mailers/in_product_marketing/verify-0.png differ diff --git a/app/assets/images/mailers/in_product_marketing/verify-1.png b/app/assets/images/mailers/in_product_marketing/verify-1.png new file mode 100644 index 00000000000..8997e8ba575 Binary files /dev/null and b/app/assets/images/mailers/in_product_marketing/verify-1.png differ diff --git a/app/assets/images/mailers/in_product_marketing/verify-2.png b/app/assets/images/mailers/in_product_marketing/verify-2.png new file mode 100644 index 00000000000..93c99dee246 Binary files /dev/null and b/app/assets/images/mailers/in_product_marketing/verify-2.png differ diff --git a/app/assets/javascripts/actioncable_connection_monitor.js b/app/assets/javascripts/actioncable_connection_monitor.js new file mode 100644 index 00000000000..fc4e436c7fb --- /dev/null +++ b/app/assets/javascripts/actioncable_connection_monitor.js @@ -0,0 +1,142 @@ +/* eslint-disable no-restricted-globals */ + +import { logger } from '@rails/actioncable'; + +// This is based on https://github.com/rails/rails/blob/5a477890c809d4a17dc0dede43c6b8cef81d8175/actioncable/app/javascript/action_cable/connection_monitor.js +// so that we can take advantage of the improved reconnection logic. We can remove this once we upgrade @rails/actioncable to a version that includes this. + +// Responsible for ensuring the cable connection is in good health by validating the heartbeat pings sent from the server, and attempting +// revival reconnections if things go astray. Internal class, not intended for direct user manipulation. + +const now = () => new Date().getTime(); + +const secondsSince = (time) => (now() - time) / 1000; +class ConnectionMonitor { + constructor(connection) { + this.visibilityDidChange = this.visibilityDidChange.bind(this); + this.connection = connection; + this.reconnectAttempts = 0; + } + + start() { + if (!this.isRunning()) { + this.startedAt = now(); + delete this.stoppedAt; + this.startPolling(); + addEventListener('visibilitychange', this.visibilityDidChange); + logger.log( + `ConnectionMonitor started. stale threshold = ${this.constructor.staleThreshold} s`, + ); + } + } + + stop() { + if (this.isRunning()) { + this.stoppedAt = now(); + this.stopPolling(); + removeEventListener('visibilitychange', this.visibilityDidChange); + logger.log('ConnectionMonitor stopped'); + } + } + + isRunning() { + return this.startedAt && !this.stoppedAt; + } + + recordPing() { + this.pingedAt = now(); + } + + recordConnect() { + this.reconnectAttempts = 0; + this.recordPing(); + delete this.disconnectedAt; + logger.log('ConnectionMonitor recorded connect'); + } + + recordDisconnect() { + this.disconnectedAt = now(); + logger.log('ConnectionMonitor recorded disconnect'); + } + + // Private + + startPolling() { + this.stopPolling(); + this.poll(); + } + + stopPolling() { + clearTimeout(this.pollTimeout); + } + + poll() { + this.pollTimeout = setTimeout(() => { + this.reconnectIfStale(); + this.poll(); + }, this.getPollInterval()); + } + + getPollInterval() { + const { staleThreshold, reconnectionBackoffRate } = this.constructor; + const backoff = (1 + reconnectionBackoffRate) ** Math.min(this.reconnectAttempts, 10); + const jitterMax = this.reconnectAttempts === 0 ? 1.0 : reconnectionBackoffRate; + const jitter = jitterMax * Math.random(); + return staleThreshold * 1000 * backoff * (1 + jitter); + } + + reconnectIfStale() { + if (this.connectionIsStale()) { + logger.log( + `ConnectionMonitor detected stale connection. reconnectAttempts = ${ + this.reconnectAttempts + }, time stale = ${secondsSince(this.refreshedAt)} s, stale threshold = ${ + this.constructor.staleThreshold + } s`, + ); + this.reconnectAttempts += 1; + if (this.disconnectedRecently()) { + logger.log( + `ConnectionMonitor skipping reopening recent disconnect. time disconnected = ${secondsSince( + this.disconnectedAt, + )} s`, + ); + } else { + logger.log('ConnectionMonitor reopening'); + this.connection.reopen(); + } + } + } + + get refreshedAt() { + return this.pingedAt ? this.pingedAt : this.startedAt; + } + + connectionIsStale() { + return secondsSince(this.refreshedAt) > this.constructor.staleThreshold; + } + + disconnectedRecently() { + return ( + this.disconnectedAt && secondsSince(this.disconnectedAt) < this.constructor.staleThreshold + ); + } + + visibilityDidChange() { + if (document.visibilityState === 'visible') { + setTimeout(() => { + if (this.connectionIsStale() || !this.connection.isOpen()) { + logger.log( + `ConnectionMonitor reopening stale connection on visibilitychange. visibilityState = ${document.visibilityState}`, + ); + this.connection.reopen(); + } + }, 200); + } + } +} + +ConnectionMonitor.staleThreshold = 6; // Server::Connections::BEAT_INTERVAL * 2 (missed two pings) +ConnectionMonitor.reconnectionBackoffRate = 0.15; + +export default ConnectionMonitor; diff --git a/app/assets/javascripts/actioncable_consumer.js b/app/assets/javascripts/actioncable_consumer.js index 5658ffc1a38..aeb61e61a3d 100644 --- a/app/assets/javascripts/actioncable_consumer.js +++ b/app/assets/javascripts/actioncable_consumer.js @@ -1,3 +1,10 @@ import { createConsumer } from '@rails/actioncable'; +import ConnectionMonitor from './actioncable_connection_monitor'; -export default createConsumer(); +const consumer = createConsumer(); + +if (consumer.connection) { + consumer.connection.monitor = new ConnectionMonitor(consumer.connection); +} + +export default consumer; diff --git a/app/assets/javascripts/activities.js b/app/assets/javascripts/activities.js index 6b9f46dcfb6..5064d9ee2d2 100644 --- a/app/assets/javascripts/activities.js +++ b/app/assets/javascripts/activities.js @@ -2,8 +2,8 @@ import $ from 'jquery'; import Cookies from 'js-cookie'; -import Pager from './pager'; import { localTimeAgo } from './lib/utils/datetime_utility'; +import Pager from './pager'; export default class Activities { constructor(container = '') { diff --git a/app/assets/javascripts/add_context_commits_modal/components/add_context_commits_modal_wrapper.vue b/app/assets/javascripts/add_context_commits_modal/components/add_context_commits_modal_wrapper.vue index c58ded3f1f5..5d074698ea4 100644 --- a/app/assets/javascripts/add_context_commits_modal/components/add_context_commits_modal_wrapper.vue +++ b/app/assets/javascripts/add_context_commits_modal/components/add_context_commits_modal_wrapper.vue @@ -1,10 +1,11 @@ - diff --git a/app/assets/javascripts/admin/statistics_panel/components/app.vue b/app/assets/javascripts/admin/statistics_panel/components/app.vue index 29077d926cf..1f0db422807 100644 --- a/app/assets/javascripts/admin/statistics_panel/components/app.vue +++ b/app/assets/javascripts/admin/statistics_panel/components/app.vue @@ -1,6 +1,6 @@