From ee664acb356f8123f4f6b00b73c1e1cf0866c7fb Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Thu, 20 Oct 2022 09:40:42 +0000 Subject: Add latest changes from gitlab-org/gitlab@15-5-stable-ee --- .../components/access_token_table_app.vue | 26 +- .../components/new_access_token_app.vue | 14 +- .../access_tokens/components/tokens_app.vue | 2 +- app/assets/javascripts/access_tokens/index.js | 11 +- .../add_context_commits_modal_wrapper.vue | 4 +- .../add_context_commits_modal/store/actions.js | 6 +- .../components/database_listbox.vue | 2 +- .../admin/broadcast_messages/components/base.vue | 112 ++++ .../components/messages_table.vue | 113 ++++ .../javascripts/admin/broadcast_messages/index.js | 21 + .../admin/deploy_keys/components/table.vue | 4 +- .../admin/statistics_panel/store/actions.js | 4 +- .../admin/users/components/users_table.vue | 4 +- .../components/alert_management_table.vue | 7 +- .../components/alerts_settings_wrapper.vue | 42 +- .../alerts_settings/utils/cache_updates.js | 4 +- .../shared/components/value_stream_metrics.vue | 4 +- .../usage_trends/components/usage_counts.vue | 4 +- app/assets/javascripts/api/projects_api.js | 8 + app/assets/javascripts/api/user_api.js | 4 +- app/assets/javascripts/awards_handler.js | 4 +- .../javascripts/badges/components/badge_form.vue | 14 +- .../badges/components/badge_settings.vue | 8 +- .../stores/modules/batch_comments/actions.js | 12 +- .../stores/modules/batch_comments/getters.js | 19 +- .../javascripts/behaviors/preview_markdown.js | 4 +- .../javascripts/behaviors/shortcuts/keybindings.js | 14 + app/assets/javascripts/blame/blame_redirect.js | 23 + app/assets/javascripts/blob/3d_viewer/index.js | 2 +- .../javascripts/blob/3d_viewer/mesh_object.js | 2 +- .../blob/blob_line_permalink_updater.js | 1 + .../javascripts/blob/components/table_contents.vue | 14 +- .../javascripts/blob/file_template_mediator.js | 4 +- app/assets/javascripts/blob/openapi/index.js | 4 +- app/assets/javascripts/blob/viewer/index.js | 6 +- app/assets/javascripts/blob_edit/blob_bundle.js | 4 +- app/assets/javascripts/blob_edit/edit_blob.js | 6 +- .../boards/components/board_blocked_icon.vue | 207 ------- .../boards/components/board_card_inner.vue | 10 +- .../boards/components/board_filtered_search.vue | 14 + .../javascripts/boards/components/board_form.vue | 7 +- app/assets/javascripts/boards/constants.js | 11 - .../graphql/board_blocking_epics.query.graphql | 17 - .../graphql/board_blocking_issues.query.graphql | 14 - app/assets/javascripts/boards/index.js | 1 + .../javascripts/branches/divergence_graph.js | 4 +- .../components/triggers_list.vue | 29 +- .../components/ci_admin_variables.vue | 58 +- .../components/ci_group_variables.vue | 55 +- .../components/ci_project_variables.vue | 62 +- .../components/ci_variable_table.vue | 3 +- .../components/legacy_ci_variable_settings.vue | 4 +- .../javascripts/ci_variable_list/constants.js | 2 +- .../graphql/queries/group_variables.query.graphql | 8 +- .../queries/project_variables.query.graphql | 8 +- .../graphql/queries/variables.query.graphql | 8 +- .../ci_variable_list/graphql/resolvers.js | 165 ------ .../ci_variable_list/graphql/settings.js | 256 +++++++++ app/assets/javascripts/ci_variable_list/index.js | 8 +- .../javascripts/ci_variable_list/store/actions.js | 12 +- app/assets/javascripts/ci_variable_list/utils.js | 10 + .../agents/components/activity_events_list.vue | 6 +- .../agents/components/activity_history_item.vue | 10 +- app/assets/javascripts/clusters/clusters_bundle.js | 4 +- .../javascripts/clusters_list/store/actions.js | 4 +- .../javascripts/code_navigation/utils/dom_utils.js | 14 +- .../javascripts/code_navigation/utils/index.js | 8 +- .../commit/pipelines/pipelines_table.vue | 11 +- app/assets/javascripts/commit_merge_requests.js | 4 +- .../components/project_form_group.vue | 4 +- .../content_editor/components/content_editor.vue | 20 +- .../components/editor_state_observer.vue | 4 +- .../components/suggestions_dropdown.vue | 264 +++++++++ .../content_editor/components/wrappers/label.vue | 34 ++ .../javascripts/content_editor/constants/index.js | 6 +- .../content_editor/extensions/diagram.js | 5 +- .../extensions/external_keydown_handler.js | 38 ++ .../content_editor/extensions/heading.js | 16 +- .../content_editor/extensions/reference.js | 14 +- .../content_editor/extensions/reference_label.js | 35 ++ .../content_editor/extensions/suggestions.js | 227 ++++++++ .../services/create_content_editor.js | 6 + .../content_editor/services/markdown_serializer.js | 7 +- .../services/serialization_helpers.js | 5 + .../contributors/components/contributors.vue | 2 +- .../javascripts/contributors/stores/actions.js | 4 +- .../crm/contacts/components/contacts_root.vue | 11 +- .../components/organizations_root.vue | 9 +- .../javascripts/cycle_analytics/store/actions.js | 6 +- .../components/deploy_freeze_modal.vue | 2 +- .../javascripts/deploy_freeze/store/actions.js | 8 +- .../javascripts/deploy_freeze/store/mutations.js | 4 +- .../javascripts/deploy_keys/components/app.vue | 8 +- .../deploy_tokens/components/new_deploy_token.vue | 332 +++++++++++ app/assets/javascripts/deploy_tokens/index.js | 33 ++ .../components/design_notes/design_discussion.vue | 4 +- .../components/design_notes/design_reply_form.vue | 71 ++- .../design_management/mixins/all_designs.js | 8 +- .../design_management/pages/design/index.vue | 4 +- .../javascripts/design_management/pages/index.vue | 10 +- .../design_management/utils/cache_update.js | 6 +- app/assets/javascripts/diff.js | 4 +- app/assets/javascripts/diffs/components/app.vue | 10 +- .../javascripts/diffs/components/commit_item.vue | 4 +- .../javascripts/diffs/components/commit_widget.vue | 2 +- .../diffs/components/compare_versions.vue | 2 +- .../diffs/components/diff_expansion_cell.vue | 7 +- .../javascripts/diffs/components/diff_file.vue | 4 +- .../diffs/components/diff_file_header.vue | 2 +- .../javascripts/diffs/components/diff_row_utils.js | 6 +- .../javascripts/diffs/components/diff_view.vue | 18 +- .../javascripts/diffs/mixins/draft_comments.js | 2 +- app/assets/javascripts/diffs/store/actions.js | 11 +- .../source_editor_markdown_livepreview_ext.js | 4 +- app/assets/javascripts/editor/schema/ci.json | 624 +++++++++++++++------ .../components/delete_environment_modal.vue | 6 +- .../environments/components/deployment.vue | 4 +- .../environments/components/edit_environment.vue | 4 +- .../environments/components/empty_state.vue | 45 +- .../components/enable_review_app_modal.vue | 160 +++--- .../components/environment_external_url.vue | 16 +- .../environments/components/environment_folder.vue | 10 +- .../environments/components/environments_app.vue | 60 +- .../components/environments_detail_header.vue | 37 +- .../environments/components/new_environment.vue | 4 +- app/assets/javascripts/environments/constants.js | 31 +- .../graphql/queries/environment_app.query.graphql | 4 +- .../graphql/queries/folder.query.graphql | 4 +- .../javascripts/environments/graphql/resolvers.js | 8 +- .../environments/mixins/environments_mixin.js | 8 +- .../error_tracking/components/error_details.vue | 8 +- .../javascripts/error_tracking/store/actions.js | 4 +- .../error_tracking/store/details/actions.js | 4 +- .../error_tracking/store/list/actions.js | 4 +- .../error_tracking_settings/components/app.vue | 2 +- .../error_tracking_settings/store/actions.js | 4 +- .../components/environments_dropdown.vue | 4 +- .../components/new_environments_dropdown.vue | 4 +- .../feature_flags/store/edit/actions.js | 4 +- .../feature_highlight/feature_highlight_helper.js | 4 +- .../filtered_search/dropdown_ajax_filter.js | 4 +- .../javascripts/filtered_search/dropdown_emoji.js | 4 +- .../filtered_search/dropdown_non_user.js | 4 +- .../filtered_search/filtered_search_manager.js | 4 +- .../filtered_search/visual_token_value.js | 6 +- app/assets/javascripts/flash.js | 2 +- app/assets/javascripts/gpg_badges.js | 4 +- .../grafana_integration/store/actions.js | 4 +- .../javascripts/graphql_shared/issuable_client.js | 52 +- .../javascripts/graphql_shared/possible_types.json | 2 +- .../queries/users_search.query.graphql | 1 + .../users_search_with_mr_permissions.graphql | 6 +- app/assets/javascripts/group.js | 6 +- app/assets/javascripts/groups/components/app.vue | 28 +- .../javascripts/groups/components/groups.vue | 20 +- .../components/new_top_level_group_alert.vue | 40 ++ .../groups/components/overview_tabs.vue | 177 ++++-- .../groups/components/transfer_group_form.vue | 2 +- app/assets/javascripts/groups/constants.js | 25 +- .../javascripts/groups/init_overview_tabs.js | 2 + .../groups/settings/components/access_dropdown.vue | 4 +- app/assets/javascripts/groups_select.js | 12 +- .../javascripts/header_search/components/app.vue | 19 +- .../ide/components/jobs/detail/description.vue | 7 +- .../javascripts/ide/components/jobs/stage.vue | 23 +- .../ide/components/new_dropdown/modal.vue | 4 +- .../javascripts/ide/components/repo_editor.vue | 6 +- app/assets/javascripts/ide/index.js | 4 +- app/assets/javascripts/ide/init_gitlab_web_ide.js | 3 +- app/assets/javascripts/ide/stores/actions.js | 6 +- .../ide/stores/actions/merge_request.js | 6 +- .../javascripts/ide/stores/actions/project.js | 6 +- .../ide/stores/modules/commit/actions.js | 4 +- .../modules/terminal/actions/session_controls.js | 6 +- .../modules/terminal/actions/session_status.js | 4 +- app/assets/javascripts/ide/utils.js | 22 +- .../import_groups/components/import_table.vue | 28 +- .../import_groups/services/status_poller.js | 4 +- .../components/advanced_settings.vue | 51 ++ .../components/import_projects_table.vue | 30 +- .../components/provider_repo_table_row.vue | 6 +- .../import_entities/import_projects/index.js | 1 + .../import_projects/store/actions.js | 29 +- app/assets/javascripts/integrations/constants.js | 2 + .../edit/components/integration_form.vue | 87 ++- .../issuable/auto_width_dropdown_select.js | 56 -- .../components/status_dropdown.vue | 57 ++ .../components/status_select.vue | 58 -- .../components/subscriptions_dropdown.vue | 51 ++ .../issuable/bulk_update_sidebar/constants.js | 22 +- .../issuable/bulk_update_sidebar/index.js | 25 +- .../issuable_bulk_update_sidebar.js | 2 - .../bulk_update_sidebar/subscription_select.js | 28 - .../javascripts/issuable/issuable_context.js | 19 - app/assets/javascripts/issuable/issuable_form.js | 52 -- .../issues/list/components/issues_list_app.vue | 7 +- app/assets/javascripts/issues/list/constants.js | 10 +- .../javascripts/issues/show/components/edited.vue | 33 +- .../issues/show/components/fields/description.vue | 31 +- .../javascripts/issues/show/components/form.vue | 79 ++- .../issues/show/components/header_actions.vue | 2 +- .../show/components/incidents/incident_tabs.vue | 5 +- .../components/incidents/timeline_events_form.vue | 7 + app/assets/javascripts/issues/show/index.js | 1 + .../javascripts/jobs/components/table/constants.js | 19 +- .../jobs/components/table/jobs_table_app.vue | 4 +- app/assets/javascripts/jobs/store/actions.js | 12 +- .../labels/components/promote_label_modal.vue | 4 +- .../javascripts/labels/group_label_subscription.js | 6 +- app/assets/javascripts/labels/label_manager.js | 6 +- app/assets/javascripts/labels/labels_select.js | 6 +- .../labels/project_label_subscription.js | 4 +- app/assets/javascripts/lib/dompurify.js | 13 +- app/assets/javascripts/lib/utils/autosave.js | 40 +- app/assets/javascripts/lib/utils/common_utils.js | 51 +- .../lib/utils/datetime/date_calculation_utility.js | 18 - .../lib/utils/datetime/date_format_utility.js | 26 + app/assets/javascripts/lib/utils/text_markdown.js | 61 +- app/assets/javascripts/lib/utils/text_utility.js | 14 +- app/assets/javascripts/listbox/index.js | 48 +- app/assets/javascripts/logo.js | 2 +- app/assets/javascripts/main.js | 7 +- .../components/filter_sort/sort_dropdown.vue | 6 +- .../members/components/table/members_table.vue | 5 +- app/assets/javascripts/members/utils.js | 5 +- .../components/diff_file_editor.vue | 4 +- .../javascripts/merge_conflicts/store/actions.js | 4 +- app/assets/javascripts/merge_request.js | 6 +- app/assets/javascripts/merge_request_tabs.js | 6 +- .../merge_requests/components/sticky_header.vue | 1 + .../components/promote_milestone_modal.vue | 4 +- app/assets/javascripts/milestones/milestone.js | 4 +- .../javascripts/milestones/milestone_select.js | 2 +- app/assets/javascripts/mirrors/mirror_repos.js | 4 +- app/assets/javascripts/mirrors/ssh_mirror.js | 4 +- .../monitoring/components/dashboard.vue | 8 +- .../javascripts/monitoring/stores/actions.js | 30 +- app/assets/javascripts/mr_notes/index.js | 3 - app/assets/javascripts/mr_notes/init_notes.js | 13 +- app/assets/javascripts/namespaces/leave_by_url.js | 4 +- .../javascripts/nav/components/top_nav_app.vue | 10 + .../javascripts/notebook/cells/output/html.vue | 2 +- .../javascripts/notes/components/comment_form.vue | 9 +- .../notes/components/diff_discussion_header.vue | 19 +- .../notes/components/discussion_counter.vue | 7 +- .../notes/components/discussion_filter.vue | 2 +- .../notes/components/discussion_filter_note.vue | 2 +- .../notes/components/discussion_notes.vue | 2 +- .../javascripts/notes/components/note_actions.vue | 5 +- .../notes/components/note_awards_list.vue | 4 +- .../javascripts/notes/components/note_header.vue | 67 +-- .../notes/components/noteable_discussion.vue | 4 +- .../javascripts/notes/components/noteable_note.vue | 19 +- .../notes/components/notes_activity_header.vue | 38 ++ .../javascripts/notes/components/notes_app.vue | 24 +- .../notes/components/timeline_toggle.vue | 1 + .../notes/components/toggle_replies_widget.vue | 4 +- app/assets/javascripts/notes/discussion_filters.js | 34 -- app/assets/javascripts/notes/i18n.js | 2 +- app/assets/javascripts/notes/index.js | 13 +- .../notes/mixins/diff_line_note_form.js | 6 +- .../notes/mixins/discussion_navigation.js | 156 +----- app/assets/javascripts/notes/mixins/resolvable.js | 4 +- app/assets/javascripts/notes/timeline.js | 16 - .../notes/utils/get_notes_filter_data.js | 21 + .../operation_settings/store/actions.js | 4 +- .../explorer/components/details_page/tags_list.vue | 4 +- .../container_registry/explorer/pages/details.vue | 4 +- .../container_registry/explorer/pages/list.vue | 6 +- .../details/store/actions.js | 10 +- .../list/components/packages_list.vue | 11 +- .../list/components/packages_list_app.vue | 4 +- .../infrastructure_registry/list/stores/actions.js | 12 +- .../components/details/package_title.vue | 18 +- .../components/functional/delete_package.vue | 10 +- .../components/list/packages_list.vue | 11 +- .../package_registry/constants.js | 11 + .../queries/get_package_details.query.graphql | 1 + .../package_registry/pages/details.vue | 60 +- .../package_registry/pages/list.vue | 4 +- .../project/components/cleanup_image_tags.vue | 7 +- .../components/container_expiration_policy.vue | 2 +- .../application_settings/payload_downloader.js | 4 +- .../application_settings/payload_previewer.js | 4 +- .../admin/broadcast_messages/broadcast_message.js | 4 +- .../pages/admin/broadcast_messages/index.js | 9 +- .../javascripts/pages/admin/dashboard/index.js | 3 + .../javascripts/pages/admin/groups/show/index.js | 3 - app/assets/javascripts/pages/admin/index.js | 2 - .../jobs/index/components/stop_jobs_modal.vue | 4 +- .../pages/dashboard/todos/index/todos.js | 6 +- .../pages/groups/merge_requests/index.js | 8 +- .../pages/groups/new/group_path_validator.js | 4 +- app/assets/javascripts/pages/groups/new/index.js | 9 + .../pages/groups/settings/ci_cd/show/index.js | 2 + .../javascripts/pages/groups/settings/index.js | 2 + .../components/bulk_imports_history_app.vue | 4 +- .../new_user_map/components/user_select.vue | 95 ++++ .../pages/import/fogbugz/new_user_map/index.js | 20 +- .../history/components/import_history_app.vue | 4 +- app/assets/javascripts/pages/profiles/index.js | 2 + .../pages/profiles/init_timezone_dropdown.js | 34 ++ .../javascripts/pages/projects/blame/show/index.js | 2 + .../pages/projects/commit/show/index.js | 4 +- .../projects/forks/new/components/fork_form.vue | 4 +- .../forks/new/components/project_namespace.vue | 4 +- .../javascripts/pages/projects/hooks/index.js | 2 + .../creations/new/compare_autocomplete.js | 4 +- .../pages/projects/merge_requests/edit/index.js | 4 +- .../pages/projects/merge_requests/index/index.js | 9 +- .../projects/pipeline_schedules/edit/index.js | 7 +- .../projects/pipeline_schedules/index/index.js | 15 +- .../pages/projects/pipeline_schedules/new/index.js | 7 +- .../shared/components/timezone_dropdown.js | 3 +- app/assets/javascripts/pages/projects/project.js | 4 +- .../pages/projects/settings/ci_cd/show/index.js | 2 + .../javascripts/pages/projects/settings/index.js | 2 + .../projects/settings/repository/show/index.js | 3 + .../permissions/components/settings_panel.vue | 30 +- .../pages/sessions/new/username_validator.js | 4 +- .../pages/shared/wikis/components/wiki_content.vue | 4 +- .../pages/shared/wikis/components/wiki_form.vue | 221 +++----- .../javascripts/pages/users/activity_calendar.js | 6 +- app/assets/javascripts/pdf/index.vue | 17 +- app/assets/javascripts/persistent_user_callout.js | 6 +- .../components/ui/pipeline_editor_empty_state.vue | 48 +- app/assets/javascripts/pipeline_editor/index.js | 3 + .../pipeline_editor/pipeline_editor_app.vue | 4 +- .../pipeline_editor/pipeline_editor_home.vue | 2 +- .../components/legacy_pipeline_new_form.vue | 2 +- .../pipeline_new/components/pipeline_new_form.vue | 254 ++++----- .../mutations/create_pipeline.mutation.graphql | 9 + .../graphql/queries/ci_config_variables.graphql | 11 + .../javascripts/pipeline_new/graphql/resolvers.js | 29 + app/assets/javascripts/pipeline_new/index.js | 14 +- .../components/pipeline_schedules.vue | 134 +++++ .../components/pipeline_schedules_form.vue | 18 + .../table/cells/pipeline_schedule_actions.vue | 66 +++ .../cells/pipeline_schedule_last_pipeline.vue | 32 ++ .../table/cells/pipeline_schedule_next_run.vue | 32 ++ .../table/cells/pipeline_schedule_owner.vue | 29 + .../table/cells/pipeline_schedule_target.vue | 36 ++ .../components/table/pipeline_schedules_table.vue | 95 ++++ .../delete_pipeline_schedule.mutation.graphql | 6 + .../queries/get_pipeline_schedules.query.graphql | 40 ++ .../mount_pipeline_schedules_app.js | 32 ++ .../mount_pipeline_schedules_form_app.js | 32 ++ .../pipeline_wizard/components/widgets/list.vue | 2 +- .../pipelines/components/jobs/failed_jobs_app.vue | 4 +- .../components/jobs/failed_jobs_table.vue | 4 +- .../pipelines/components/jobs/jobs_app.vue | 4 +- .../components/jobs_shared/action_component.vue | 4 +- .../pipeline_mini_graph/pipeline_stage.vue | 4 +- .../pipelines/components/pipeline_tabs.vue | 8 +- .../pipelines_list/pipeline_multi_actions.vue | 11 +- .../components/pipelines_list/pipelines.vue | 14 +- .../pipelines_list/pipelines_manual_actions.vue | 4 +- .../tokens/pipeline_branch_name_token.vue | 4 +- .../tokens/pipeline_tag_name_token.vue | 4 +- .../tokens/pipeline_trigger_author_token.vue | 4 +- .../pipelines/mixins/pipelines_mixin.js | 4 +- .../pipelines/pipeline_details_bundle.js | 16 +- .../pipelines/stores/test_reports/actions.js | 4 +- .../pipelines/stores/test_reports/mutations.js | 4 +- .../profile/account/components/update_username.vue | 6 +- app/assets/javascripts/profile/gl_crop.js | 1 + .../preferences/components/profile_preferences.vue | 16 +- app/assets/javascripts/profile/profile.js | 14 +- app/assets/javascripts/project_select.js | 4 +- .../javascripts/projects/commit/store/actions.js | 4 +- .../components/commit_box_pipeline_mini_graph.vue | 8 +- .../info/components/commit_box_pipeline_status.vue | 4 +- .../javascripts/projects/commits/store/actions.js | 4 +- .../projects/compare/components/app.vue | 46 +- .../compare/components/revision_dropdown.vue | 6 +- .../components/revision_dropdown_legacy.vue | 4 +- app/assets/javascripts/projects/compare/index.js | 3 + .../javascripts/projects/project_find_file.js | 4 +- .../projects/settings/access_dropdown.js | 6 +- .../branch_rules/components/branch_dropdown.vue | 137 ----- .../components/edit/branch_dropdown.vue | 137 +++++ .../branch_rules/components/edit/index.vue | 56 ++ .../components/edit/protections/index.vue | 59 ++ .../edit/protections/merge_protections.vue | 46 ++ .../edit/protections/push_protections.vue | 52 ++ .../branch_rules/components/protections/index.vue | 59 -- .../components/protections/merge_protections.vue | 46 -- .../components/protections/push_protections.vue | 52 -- .../settings/branch_rules/components/rule_edit.vue | 56 -- .../branch_rules/components/view/constants.js | 42 ++ .../branch_rules/components/view/index.vue | 207 +++++++ .../branch_rules/components/view/protection.vue | 99 ++++ .../components/view/protection_row.vue | 110 ++++ .../settings/branch_rules/mount_branch_rules.js | 11 +- .../queries/branch_rules_details.query.graphql | 50 ++ .../settings/components/access_dropdown.vue | 6 +- .../components/default_branch_selector.vue | 38 ++ .../settings/components/transfer_project_form.vue | 170 ++++-- .../queries/current_user_namespace.query.graphql | 9 + ..._where_user_can_transfer_projects.query.graphql | 24 - .../settings/init_transfer_project_form.js | 2 + .../settings/mount_default_branch_selector.js | 22 + .../settings/repository/branch_rules/app.vue | 9 +- .../branch_rules/components/branch_rule.vue | 37 +- .../repository/branch_rules/mount_branch_rules.js | 12 +- app/assets/javascripts/projects/star.js | 6 +- .../commit_pipeline_status_component.vue | 4 +- .../protected_branches/protected_branch_create.js | 6 +- .../protected_branches/protected_branch_edit.js | 6 +- .../protected_tags/protected_tag_edit.js | 4 +- .../javascripts/ref/components/ref_selector.vue | 174 +++--- .../components/related_issues_block.vue | 4 +- .../components/related_issues_root.vue | 12 +- .../javascripts/releases/components/app_index.vue | 4 +- .../javascripts/releases/components/app_show.vue | 4 +- .../releases/components/tag_field_new.vue | 92 ++- .../releases/stores/modules/edit_new/actions.js | 17 +- .../releases/stores/modules/edit_new/getters.js | 1 + .../stores/modules/edit_new/mutation_types.js | 1 + .../releases/stores/modules/edit_new/mutations.js | 4 + .../releases/stores/modules/edit_new/state.js | 2 +- .../components/accessibility_issue_body.vue | 61 -- .../grouped_accessibility_reports_app.vue | 65 --- .../reports/accessibility_report/store/actions.js | 76 --- .../reports/accessibility_report/store/getters.js | 45 -- .../reports/accessibility_report/store/index.js | 17 - .../accessibility_report/store/mutation_types.js | 5 - .../accessibility_report/store/mutations.js | 20 - .../reports/accessibility_report/store/state.js | 28 - .../javascripts/reports/components/issue_body.js | 3 - .../reports/components/report_section.vue | 35 +- .../javascripts/repository/commits_service.js | 4 +- .../repository/components/blob_content_viewer.vue | 4 +- .../repository/components/blob_controls.vue | 34 +- .../repository/components/last_commit.vue | 4 +- .../repository/components/new_directory_modal.vue | 4 +- .../repository/components/table/row.vue | 6 +- .../repository/components/tree_content.vue | 4 +- .../repository/components/upload_blob_modal.vue | 4 +- .../runner/admin_runners/admin_runners_app.vue | 38 +- .../components/cells/runner_actions_cell.vue | 7 +- .../runner/components/cells/runner_owner_cell.vue | 63 +++ .../components/runner_bulk_delete_checkbox.vue | 16 +- .../runner/components/runner_delete_button.vue | 32 +- .../runner/components/runner_details.vue | 7 +- .../components/runner_filtered_search_bar.vue | 1 - .../javascripts/runner/components/runner_list.vue | 44 +- .../runner/components/runner_list_empty_state.vue | 9 +- .../runner/components/runner_membership_toggle.vue | 42 ++ .../runner/components/search_tokens/tag_token.vue | 18 +- app/assets/javascripts/runner/constants.js | 19 +- .../graphql/list/group_runners.query.graphql | 5 +- .../graphql/list/group_runners_count.query.graphql | 3 +- .../graphql/list/list_item_shared.fragment.graphql | 14 + .../javascripts/runner/graphql/list/local_state.js | 22 +- .../runner/group_runners/group_runners_app.vue | 50 +- .../javascripts/runner/group_runners/index.js | 6 +- .../javascripts/runner/runner_search_utils.js | 18 +- app/assets/javascripts/search/index.js | 10 +- .../javascripts/search/sidebar/components/app.vue | 25 +- app/assets/javascripts/search/sidebar/index.js | 9 + app/assets/javascripts/search/store/actions.js | 10 +- .../javascripts/search/topbar/components/app.vue | 47 +- .../search_settings/components/search_settings.vue | 41 +- app/assets/javascripts/search_settings/mount.js | 1 + .../security_configuration/components/app.vue | 11 +- .../components/upgrade_banner.vue | 2 +- app/assets/javascripts/service_ping_consent.js | 4 +- .../set_status_modal/set_status_form.vue | 10 +- .../set_status_modal/set_status_modal_wrapper.vue | 4 +- .../components/assignees/sidebar_assignees.vue | 4 +- .../assignees/sidebar_assignees_widget.vue | 8 +- .../components/assignees/sidebar_participant.vue | 2 +- .../confidential/sidebar_confidentiality_form.vue | 6 +- .../sidebar_confidentiality_widget.vue | 4 +- .../components/crm_contacts/crm_contacts.vue | 4 +- .../components/date/sidebar_date_widget.vue | 8 +- .../sidebar/components/lock/edit_form_buttons.vue | 4 +- .../sidebar/components/lock/issuable_lock_form.vue | 4 +- .../components/reviewers/reviewer_title.vue | 1 + .../components/reviewers/sidebar_reviewers.vue | 8 +- .../components/severity/sidebar_severity.vue | 4 +- .../sidebar/components/sidebar_dropdown_widget.vue | 16 +- .../sidebar/components/sidebar_editable_item.vue | 6 +- .../subscriptions/sidebar_subscriptions_widget.vue | 15 +- .../sidebar/components/time_tracking/report.vue | 6 +- .../time_tracking/sidebar_time_tracking.vue | 2 +- .../components/todo_toggle/sidebar_todo_widget.vue | 8 +- app/assets/javascripts/sidebar/constants.js | 7 + .../javascripts/sidebar/lib/sidebar_move_issue.js | 6 +- app/assets/javascripts/sidebar/mount_sidebar.js | 2 +- .../queries/epic_participants.query.graphql | 2 - .../sidebar/queries/sidebar_details.query.graphql | 9 - .../queries/sidebar_details_mr.query.graphql | 9 - .../sidebar/services/sidebar_service.js | 33 +- app/assets/javascripts/sidebar/sidebar_mediator.js | 8 +- app/assets/javascripts/single_file_diff.js | 4 +- .../javascripts/snippets/components/edit.vue | 4 +- .../snippets/components/snippet_blob_edit.vue | 4 +- .../snippets/components/snippet_blob_view.vue | 4 +- .../snippets/components/snippet_header.vue | 8 +- app/assets/javascripts/task_list.js | 4 +- .../token_access/components/token_access.vue | 32 +- app/assets/javascripts/users_select/index.js | 31 +- .../components/action_buttons.vue | 4 +- .../components/approvals/approvals.vue | 10 +- .../components/deployment/deployment_actions.vue | 6 +- .../deployment/deployment_view_button.vue | 44 +- .../components/extensions/base.vue | 3 +- .../components/extensions/telemetry.js | 2 +- .../components/mr_widget_related_links.vue | 10 - .../components/state_container.vue | 4 +- .../components/states/merge_checks_failed.vue | 3 +- .../states/mr_widget_auto_merge_enabled.vue | 6 +- .../components/states/mr_widget_merged.vue | 4 +- .../components/states/mr_widget_rebase.vue | 6 +- .../components/states/pipeline_failed.vue | 15 +- .../components/states/ready_to_merge.vue | 314 +++++------ .../components/states/work_in_progress.vue | 8 +- .../terraform/mr_widget_terraform_container.vue | 137 ----- .../components/terraform/terraform_plan.vue | 119 ---- .../components/widget/dynamic_content.vue | 98 ++++ .../components/widget/status_icon.vue | 67 +++ .../components/widget/widget.vue | 49 +- .../components/widget/widget_content_row.vue | 68 +++ .../components/widget/widget_content_section.vue | 35 -- .../vue_merge_request_widget/constants.js | 13 + .../vue_merge_request_widget/mr_widget_options.vue | 40 +- .../queries/get_state.query.graphql | 1 + .../stores/get_state_key.js | 16 +- .../stores/mr_widget_store.js | 2 + .../vue_shared/components/ci_badge_link.vue | 20 +- .../color_select_dropdown/color_select_root.vue | 6 +- .../components/confidentiality_badge.vue | 2 +- .../components/filtered_search_bar/constants.js | 6 + .../filtered_search_bar_root.vue | 9 +- .../store/modules/filters/actions.js | 10 +- .../filtered_search_bar/tokens/author_token.vue | 4 +- .../filtered_search_bar/tokens/branch_token.vue | 4 +- .../tokens/crm_contact_token.vue | 4 +- .../tokens/crm_organization_token.vue | 4 +- .../filtered_search_bar/tokens/emoji_token.vue | 4 +- .../filtered_search_bar/tokens/label_token.vue | 4 +- .../filtered_search_bar/tokens/milestone_token.vue | 4 +- .../filtered_search_bar/tokens/release_token.vue | 4 +- .../vue_shared/components/gitlab_version_check.vue | 27 +- .../vue_shared/components/group_select/utils.js | 15 + .../components/issuable_blocked_icon/constants.js | 12 + .../graphql/blocking_epics.query.graphql | 17 + .../graphql/blocking_issues.query.graphql | 14 + .../issuable_blocked_icon.vue | 214 +++++++ .../components/markdown/apply_suggestion.vue | 1 + .../vue_shared/components/markdown/field.vue | 6 +- .../vue_shared/components/markdown/header.vue | 47 +- .../components/markdown/markdown_editor.vue | 216 +++++++ .../components/markdown/suggestion_diff_header.vue | 4 +- .../vue_shared/components/markdown/suggestions.vue | 4 +- .../components/markdown/toolbar_button.vue | 6 + .../components/metric_images/store/actions.js | 10 +- .../vue_shared/components/modal_copy_button.vue | 10 +- .../namespace_select/namespace_select.vue | 208 ------- .../namespace_select_deprecated.vue | 212 +++++++ .../components/notes/placeholder_note.vue | 24 +- .../vue_shared/components/notes/skeleton_note.vue | 2 +- .../vue_shared/components/notes/system_note.vue | 13 +- .../constants.js | 2 +- .../paginated_table_with_search_and_tabs.vue | 2 +- .../components/pagination_bar/pagination_bar.vue | 13 + .../components/registry/history_item.vue | 6 +- .../components/registry/registry_search.vue | 5 + .../labels_select_vue/labels_select_root.vue | 6 + .../sidebar/labels_select_vue/store/actions.js | 6 +- .../sidebar/labels_select_vue/store/mutations.js | 3 +- .../dropdown_contents_create_view.vue | 4 +- .../dropdown_contents_labels_view.vue | 4 +- .../labels_select_widget/labels_select_root.vue | 6 +- .../queries/get_issue_participants.query.graphql | 4 +- .../get_merge_request_reviewers.query.graphql | 2 +- .../queries/get_mr_participants.query.graphql | 4 +- .../source_viewer/components/chunk_line.vue | 34 +- .../components/source_viewer/constants.js | 11 +- .../components/source_viewer/plugins/index.js | 9 +- .../plugins/utils/dependency_linker_util.js | 13 +- .../source_viewer/plugins/utils/gemspec_linker.js | 5 +- .../plugins/utils/package_json_linker.js | 5 +- .../source_viewer/plugins/wrap_bidi_chars.js | 30 + .../source_viewer/plugins/wrap_child_nodes.js | 45 ++ .../source_viewer/plugins/wrap_comments.js | 41 -- .../components/source_viewer/source_viewer.vue | 2 +- .../components/source_viewer/workers/highlight.js | 10 + .../source_viewer/workers/highlight_utils.js | 15 + .../vue_shared/components/timezone_dropdown.vue | 88 --- .../timezone_dropdown/timezone_dropdown.vue | 119 ++++ .../javascripts/vue_shared/components/url_sync.vue | 17 +- .../components/user_avatar/user_avatar_image.vue | 71 ++- .../user_avatar/user_avatar_image_new.vue | 117 ---- .../user_avatar/user_avatar_image_old.vue | 114 ---- .../components/user_avatar/user_avatar_link.vue | 70 ++- .../user_avatar/user_avatar_link_new.vue | 122 ---- .../user_avatar/user_avatar_link_old.vue | 117 ---- .../components/user_avatar/user_avatar_list.vue | 10 +- .../components/user_popover/user_popover.vue | 11 +- .../components/user_select/user_select.vue | 1 + app/assets/javascripts/vue_shared/constants.js | 3 + .../javascripts/vue_shared/directives/safe_html.js | 25 + .../new_namespace/new_namespace_page.vue | 11 + .../merge_request_artifact_download.vue | 4 +- .../security_reports/security_reports_app.vue | 4 +- .../webhooks/components/form_url_app.vue | 134 +++++ .../webhooks/components/form_url_mask_item.vue | 90 +++ app/assets/javascripts/webhooks/index.js | 25 + .../work_items/components/work_item_assignees.vue | 12 +- .../components/work_item_description.vue | 19 +- .../work_items/components/work_item_detail.vue | 151 +++-- .../work_items/components/work_item_due_date.vue | 2 +- .../work_items/components/work_item_labels.vue | 118 ++-- .../work_items/components/work_item_links/index.js | 10 +- .../components/work_item_links/work_item_links.vue | 12 +- .../work_item_links/work_item_links_form.vue | 32 +- .../work_items/components/work_item_milestone.vue | 248 ++++++++ .../work_items/components/work_item_type_icon.vue | 2 +- app/assets/javascripts/work_items/constants.js | 15 +- .../graphql/get_issue_details.query.graphql | 9 + .../work_items/graphql/typedefs.graphql | 16 +- .../work_items/graphql/work_item.fragment.graphql | 1 - .../work_items/graphql/work_item.query.graphql | 9 +- .../work_item_assignees.subscription.graphql | 21 + .../graphql/work_item_dates.subscription.graphql | 1 + .../graphql/work_item_labels.subscription.graphql | 19 + .../graphql/work_item_widgets.fragment.graphql | 16 + app/assets/javascripts/work_items/index.js | 10 +- .../work_items/pages/create_work_item.vue | 43 -- app/assets/stylesheets/_page_specific_files.scss | 7 - .../stylesheets/bootstrap_migration_reset.scss | 4 - .../components/batch_comments/review_bar.scss | 71 --- .../stylesheets/components/dashboard_skeleton.scss | 78 --- .../stylesheets/components/date_time_picker.scss | 5 - .../components/design_management/design.scss | 193 ------- .../design_management/design_list_item.scss | 19 - .../stylesheets/components/feature_highlight.scss | 5 - .../stylesheets/components/milestone_combobox.scss | 5 - .../stylesheets/components/related_items_list.scss | 41 -- .../stylesheets/components/release_block.scss | 3 - .../components/release_block_milestone_info.scss | 6 - .../stylesheets/components/shortcuts_help.scss | 29 + app/assets/stylesheets/framework.scss | 4 - app/assets/stylesheets/framework/blocks.scss | 1 - app/assets/stylesheets/framework/calendar.scss | 8 + .../stylesheets/framework/ci_variable_list.scss | 77 --- app/assets/stylesheets/framework/diffs.scss | 247 +------- app/assets/stylesheets/framework/dropdowns.scss | 1 + app/assets/stylesheets/framework/flash.scss | 27 +- app/assets/stylesheets/framework/flex_grid.scss | 52 -- app/assets/stylesheets/framework/gfm.scss | 6 +- app/assets/stylesheets/framework/lists.scss | 7 +- .../stylesheets/framework/markdown_area.scss | 29 +- app/assets/stylesheets/framework/memory_graph.scss | 4 - app/assets/stylesheets/framework/tables.scss | 16 - app/assets/stylesheets/framework/timeline.scss | 26 +- app/assets/stylesheets/framework/toggle.scss | 131 ----- app/assets/stylesheets/framework/typography.scss | 12 - app/assets/stylesheets/framework/variables.scss | 21 +- app/assets/stylesheets/framework/wells.scss | 9 - app/assets/stylesheets/highlight/themes/dark.scss | 2 + .../stylesheets/highlight/themes/monokai.scss | 2 + app/assets/stylesheets/highlight/themes/none.scss | 4 + .../highlight/themes/solarized-dark.scss | 2 + .../highlight/themes/solarized-light.scss | 4 + app/assets/stylesheets/highlight/white_base.scss | 2 + app/assets/stylesheets/lazy_bundles/gridstack.scss | 1 + .../stylesheets/page_bundles/admin/geo_nodes.scss | 45 ++ .../page_bundles/admin/geo_replicable.scss | 18 + .../stylesheets/page_bundles/cluster_agents.scss | 13 + app/assets/stylesheets/page_bundles/clusters.scss | 22 + .../stylesheets/page_bundles/graph_charts.scss | 27 + app/assets/stylesheets/page_bundles/ide.scss | 7 - app/assets/stylesheets/page_bundles/incidents.scss | 73 +++ .../stylesheets/page_bundles/issues_show.scss | 214 +++++++ .../stylesheets/page_bundles/merge_requests.scss | 323 ++++++++++- app/assets/stylesheets/page_bundles/milestone.scss | 35 +- .../stylesheets/page_bundles/operations.scss | 80 +++ .../page_bundles/pipeline_schedules.scss | 96 ++-- app/assets/stylesheets/page_bundles/profile.scss | 58 ++ app/assets/stylesheets/page_bundles/project.scss | 8 - .../stylesheets/page_bundles/prometheus.scss | 113 ++++ app/assets/stylesheets/page_bundles/releases.scss | 12 + app/assets/stylesheets/page_bundles/tree.scss | 207 +++++++ .../stylesheets/page_bundles/work_items.scss | 19 + app/assets/stylesheets/pages/clusters.scss | 32 -- app/assets/stylesheets/pages/deploy_keys.scss | 4 - app/assets/stylesheets/pages/environment_logs.scss | 54 -- app/assets/stylesheets/pages/events.scss | 4 + app/assets/stylesheets/pages/help.scss | 40 -- app/assets/stylesheets/pages/issuable.scss | 126 +---- app/assets/stylesheets/pages/issues.scss | 5 +- app/assets/stylesheets/pages/notes.scss | 336 +++++++++-- app/assets/stylesheets/pages/profile.scss | 105 ---- app/assets/stylesheets/pages/projects.scss | 63 +-- app/assets/stylesheets/pages/prometheus.scss | 114 ---- app/assets/stylesheets/pages/search.scss | 19 - app/assets/stylesheets/pages/service_desk.scss | 7 - app/assets/stylesheets/pages/settings.scss | 25 - app/assets/stylesheets/pages/tree.scss | 246 -------- app/assets/stylesheets/startup/startup-dark.scss | 27 +- .../stylesheets/startup/startup-general.scss | 22 +- app/assets/stylesheets/startup/startup-signin.scss | 9 +- app/assets/stylesheets/themes/_dark.scss | 10 +- .../stylesheets/themes/dark_mode_overrides.scss | 5 +- app/assets/stylesheets/utilities.scss | 131 +---- app/components/pajamas/alert_component.rb | 8 +- .../pajamas/progress_component.html.haml | 2 + app/components/pajamas/progress_component.rb | 12 + .../admin/broadcast_messages_controller.rb | 3 + app/controllers/admin/groups_controller.rb | 11 - .../admin/impersonation_tokens_controller.rb | 19 +- app/controllers/admin/runners_controller.rb | 7 - app/controllers/application_controller.rb | 1 - app/controllers/autocomplete_controller.rb | 20 +- app/controllers/boards/application_controller.rb | 23 - app/controllers/boards/issues_controller.rb | 162 ------ app/controllers/boards/lists_controller.rb | 103 ---- app/controllers/concerns/access_tokens_actions.rb | 16 +- .../concerns/authenticates_with_two_factor.rb | 5 + app/controllers/concerns/boards_actions.rb | 59 +- app/controllers/concerns/boards_responses.rb | 94 ---- app/controllers/concerns/import/github_oauth.rb | 100 ++++ .../concerns/issuable_collections_action.rb | 5 +- .../concerns/multiple_boards_actions.rb | 93 --- app/controllers/concerns/preview_markdown.rb | 16 +- .../concerns/product_analytics_tracking.rb | 9 +- app/controllers/concerns/registrations_tracking.rb | 15 + app/controllers/concerns/sends_blob.rb | 22 +- app/controllers/concerns/wiki_actions.rb | 6 +- app/controllers/groups/application_controller.rb | 4 + app/controllers/groups/boards_controller.rb | 15 - app/controllers/groups/runners_controller.rb | 16 +- .../groups/settings/access_tokens_controller.rb | 6 + app/controllers/groups_controller.rb | 6 +- app/controllers/ide_controller.rb | 5 +- app/controllers/import/bulk_imports_controller.rb | 8 +- app/controllers/import/github_controller.rb | 89 +-- app/controllers/import/github_groups_controller.rb | 57 ++ .../jira_connect/public_keys_controller.rb | 24 + app/controllers/oauth/applications_controller.rb | 1 - app/controllers/oauth/authorizations_controller.rb | 1 - app/controllers/omniauth_callbacks_controller.rb | 11 + .../profiles/personal_access_tokens_controller.rb | 6 + app/controllers/profiles/preferences_controller.rb | 4 +- .../profiles/two_factor_auths_controller.rb | 60 +- app/controllers/projects/application_controller.rb | 4 +- .../projects/autocomplete_sources_controller.rb | 7 +- app/controllers/projects/blame_controller.rb | 3 + app/controllers/projects/boards_controller.rb | 18 +- app/controllers/projects/compare_controller.rb | 11 +- app/controllers/projects/deploy_keys_controller.rb | 6 +- .../projects/google_cloud/databases_controller.rb | 25 +- .../timeline_events_controller.rb | 16 + app/controllers/projects/incidents_controller.rb | 2 - app/controllers/projects/issues_controller.rb | 47 +- .../projects/merge_requests/diffs_controller.rb | 1 + .../projects/merge_requests_controller.rb | 9 +- app/controllers/projects/milestones_controller.rb | 14 +- .../projects/pages_domains_controller.rb | 19 +- .../projects/pipeline_schedules_controller.rb | 5 + .../projects/product_analytics_controller.rb | 4 +- .../projects/protected_refs_controller.rb | 1 - .../projects/settings/access_tokens_controller.rb | 6 + app/controllers/projects/snippets_controller.rb | 2 +- .../projects/web_ide_terminals_controller.rb | 2 + app/controllers/projects_controller.rb | 10 +- .../registrations/welcome_controller.rb | 7 +- app/controllers/registrations_controller.rb | 12 +- app/controllers/search_controller.rb | 4 + app/controllers/sessions_controller.rb | 4 +- .../users/namespace_callouts_controller.rb | 17 - app/controllers/users_controller.rb | 5 +- .../pages_domains/pages_domain_created_event.rb | 18 + .../pages_domains/pages_domain_deleted_event.rb | 18 + .../pages_domains/pages_domain_updated_event.rb | 18 + .../projects/project_attributes_changed_event.rb | 29 + .../projects/project_features_changed_event.rb | 22 + app/finders/ci/runners_finder.rb | 6 + .../clusters/agent_authorizations_finder.rb | 36 +- .../groups/accepting_group_transfers_finder.rb | 7 +- app/finders/labels_finder.rb | 2 +- app/finders/packages/group_packages_finder.rb | 2 +- app/finders/packages/helm/packages_finder.rb | 2 +- app/finders/packages/nuget/package_finder.rb | 2 +- app/finders/packages/package_finder.rb | 2 +- app/finders/packages/packages_finder.rb | 2 +- app/finders/personal_access_tokens_finder.rb | 42 ++ .../award_emoji_votes_batch_loader.rb | 21 + app/graphql/gitlab_schema.rb | 13 + app/graphql/graphql_triggers.rb | 20 + .../alert_management/create_alert_issue.rb | 4 +- app/graphql/mutations/ci/job/artifacts_destroy.rb | 21 +- app/graphql/mutations/ci/pipeline_schedule/base.rb | 21 + .../mutations/ci/pipeline_schedule/delete.rb | 27 + .../mutations/ci/project_ci_cd_settings_update.rb | 11 +- app/graphql/mutations/ci/runner/update.rb | 2 + .../mutations/work_items/update_arguments.rb | 3 + app/graphql/mutations/issues/create.rb | 8 +- .../mutations/namespace/package_settings/update.rb | 30 + app/graphql/mutations/packages/bulk_destroy.rb | 43 ++ app/graphql/mutations/packages/destroy_files.rb | 4 +- app/graphql/mutations/work_items/update_widgets.rb | 60 -- app/graphql/resolvers/base_issues_resolver.rb | 2 +- app/graphql/resolvers/bulk_labels_resolver.rb | 27 + app/graphql/resolvers/ci/all_jobs_resolver.rb | 17 + .../resolvers/ci/runner_projects_resolver.rb | 4 +- app/graphql/resolvers/concerns/looks_ahead.rb | 27 +- .../resolvers/concerns/resolves_merge_requests.rb | 4 +- app/graphql/resolvers/down_votes_count_resolver.rb | 15 + .../project_pipeline_schedules_resolver.rb | 17 + .../resolvers/projects/branch_rules_resolver.rb | 8 +- app/graphql/resolvers/projects_resolver.rb | 4 +- app/graphql/resolvers/up_votes_count_resolver.rb | 15 + app/graphql/resolvers/work_items_resolver.rb | 26 +- app/graphql/types/ci/ci_cd_setting_type.rb | 11 +- app/graphql/types/ci/config_variable_type.rb | 4 + app/graphql/types/ci/job_type.rb | 18 +- .../types/ci/pipeline_schedule_status_enum.rb | 12 + app/graphql/types/ci/pipeline_schedule_type.rb | 45 ++ .../types/ci/runner_membership_filter_enum.rb | 7 + app/graphql/types/environment_type.rb | 4 +- app/graphql/types/issue_type.rb | 19 +- app/graphql/types/merge_request_type.rb | 23 +- .../merge_requests/detailed_merge_status_enum.rb | 3 + app/graphql/types/mutation_type.rb | 4 +- .../types/namespace/package_settings_type.rb | 49 +- app/graphql/types/notes/note_type.rb | 2 +- .../permission_types/ci/pipeline_schedules.rb | 17 + app/graphql/types/project_type.rb | 6 + app/graphql/types/projects/branch_rule_type.rb | 9 + app/graphql/types/query_type.rb | 6 + app/graphql/types/subscription_type.rb | 8 + app/graphql/types/work_items/widget_interface.rb | 3 + .../work_items/widgets/labels_update_input_type.rb | 20 + app/helpers/application_helper.rb | 7 +- app/helpers/application_settings_helper.rb | 3 +- app/helpers/boards_helper.rb | 25 +- app/helpers/ci/pipeline_editor_helper.rb | 12 +- app/helpers/ci/pipelines_helper.rb | 3 +- app/helpers/compare_helper.rb | 3 +- app/helpers/events_helper.rb | 48 ++ app/helpers/form_helper.rb | 23 +- app/helpers/groups_helper.rb | 7 +- app/helpers/hooks_helper.rb | 7 + app/helpers/ide_helper.rb | 32 +- app/helpers/issuables_helper.rb | 4 +- app/helpers/issues_helper.rb | 9 + app/helpers/markup_helper.rb | 77 +-- app/helpers/milestones_helper.rb | 26 + app/helpers/nav_helper.rb | 2 +- app/helpers/projects_helper.rb | 16 + app/helpers/recaptcha_helper.rb | 18 + app/helpers/releases_helper.rb | 2 +- app/helpers/search_helper.rb | 34 ++ app/helpers/selects_helper.rb | 5 - app/helpers/sessions_helper.rb | 2 +- app/helpers/time_helper.rb | 6 +- app/helpers/timeboxes_helper.rb | 12 +- app/helpers/todos_helper.rb | 26 +- app/helpers/users/callouts_helper.rb | 4 +- app/helpers/users_helper.rb | 15 + app/helpers/wiki_helper.rb | 10 +- app/mailers/emails/profile.rb | 24 + app/mailers/previews/notify_preview.rb | 16 + app/models/application_setting.rb | 46 +- app/models/application_setting_implementation.rb | 3 +- app/models/award_emoji.rb | 4 + app/models/bulk_imports/entity.rb | 23 +- app/models/bulk_imports/export_status.rb | 14 +- app/models/bulk_imports/failure.rb | 20 + app/models/bulk_imports/tracker.rb | 2 + app/models/ci/build.rb | 49 +- app/models/ci/build_metadata.rb | 5 +- app/models/ci/job_token/project_scope_link.rb | 5 + app/models/ci/job_token/scope.rb | 2 +- app/models/ci/pipeline.rb | 54 +- app/models/ci/pipeline_metadata.rb | 14 + app/models/ci/runner.rb | 38 +- app/models/ci/secure_file.rb | 39 ++ .../clusters/agents/implicit_authorization.rb | 2 +- app/models/concerns/approvable.rb | 4 +- app/models/concerns/atomic_internal_id.rb | 17 + app/models/concerns/boards/listable.rb | 2 +- app/models/concerns/cache_markdown_field.rb | 2 + app/models/concerns/ci/metadatable.rb | 2 +- app/models/concerns/ci/partitionable.rb | 27 + app/models/concerns/counter_attribute.rb | 63 ++- app/models/concerns/has_wiki.rb | 2 +- .../concerns/integrations/base_data_fields.rb | 2 - app/models/concerns/integrations/has_web_hook.rb | 2 +- app/models/concerns/issuable.rb | 44 +- app/models/concerns/participable.rb | 12 +- app/models/concerns/routable.rb | 3 + app/models/concerns/timebox.rb | 92 +-- app/models/deploy_key.rb | 1 + app/models/deployment.rb | 21 +- app/models/diff_viewer/server_side.rb | 3 + app/models/environment.rb | 18 +- app/models/event.rb | 10 +- app/models/group.rb | 6 +- app/models/group_group_link.rb | 2 +- app/models/group_label.rb | 1 + app/models/hooks/project_hook.rb | 7 - app/models/hooks/service_hook.rb | 2 +- app/models/hooks/web_hook.rb | 23 +- app/models/incident_management/timeline_event.rb | 8 +- .../incident_management/timeline_event_tag.rb | 20 + .../incident_management/timeline_event_tag_link.rb | 11 + app/models/integration.rb | 4 +- app/models/integrations/datadog.rb | 153 +++-- app/models/integrations/harbor.rb | 71 +-- app/models/issue.rb | 18 +- app/models/iteration.rb | 6 + app/models/jira_connect/public_key.rb | 48 ++ app/models/jira_connect_installation.rb | 19 + app/models/jira_import_state.rb | 2 +- app/models/label.rb | 8 + app/models/member.rb | 3 +- app/models/members/member_role.rb | 11 +- app/models/merge_request.rb | 32 +- app/models/merge_request_diff_file.rb | 16 +- app/models/milestone.rb | 91 ++- app/models/ml/candidate_param.rb | 1 + app/models/ml/experiment.rb | 8 +- app/models/namespace.rb | 4 + app/models/namespace/aggregation_schedule.rb | 13 +- app/models/namespace/detail.rb | 4 + app/models/namespace/package_setting.rb | 6 + app/models/note.rb | 9 +- app/models/notification_recipient.rb | 2 - app/models/packages/package.rb | 7 +- app/models/packages/rpm/repository_file.rb | 25 + app/models/pages/lookup_path.rb | 4 +- app/models/personal_access_token.rb | 9 +- app/models/preloaders/labels_preloader.rb | 2 + .../preloaders/project_root_ancestor_preloader.rb | 3 +- app/models/project.rb | 57 +- app/models/project_authorization.rb | 39 +- app/models/project_ci_cd_setting.rb | 4 - app/models/project_group_link.rb | 2 +- app/models/project_label.rb | 1 + app/models/project_setting.rb | 1 + app/models/project_statistics.rb | 73 +-- .../projects/build_artifacts_size_refresh.rb | 4 +- app/models/protected_branch.rb | 4 + app/models/protected_branch/merge_access_level.rb | 2 + app/models/protected_branch/push_access_level.rb | 2 + app/models/repository.rb | 40 +- app/models/resource_label_event.rb | 2 +- app/models/snippet.rb | 2 +- app/models/tree.rb | 5 +- app/models/user.rb | 91 +-- app/models/user_detail.rb | 43 +- app/models/user_preference.rb | 2 +- app/models/users/banned_user.rb | 2 +- app/models/users/callout.rb | 3 +- app/models/users/namespace_callout.rb | 33 -- app/models/users/phone_number_validation.rb | 41 ++ app/models/users/project_callout.rb | 6 +- app/models/users/user_follow_user.rb | 15 + app/models/wiki.rb | 172 ++++-- app/models/wiki_page.rb | 17 +- app/policies/ci/runner_policy.rb | 11 +- app/policies/group_label_policy.rb | 2 +- app/policies/group_policy.rb | 20 +- app/policies/issuable_policy.rb | 12 +- app/policies/issue_policy.rb | 4 + app/policies/namespaces/user_namespace_policy.rb | 2 + app/policies/note_policy.rb | 3 +- app/policies/project_label_policy.rb | 2 +- app/policies/project_policy.rb | 7 +- app/policies/todo_policy.rb | 2 +- app/presenters/ci/build_runner_presenter.rb | 4 +- app/presenters/ci/pipeline_presenter.rb | 2 +- app/presenters/deploy_key_presenter.rb | 9 + app/presenters/event_presenter.rb | 2 + app/presenters/key_presenter.rb | 22 + app/serializers/board_serializer.rb | 5 - app/serializers/board_simple_entity.rb | 8 - app/serializers/current_board_entity.rb | 10 - app/serializers/current_board_serializer.rb | 5 - app/serializers/group_access_token_entity.rb | 2 +- app/serializers/import/github_org_entity.rb | 8 + app/serializers/import/github_org_serializer.rb | 7 + app/serializers/issue_entity.rb | 4 + app/serializers/merge_request_noteable_entity.rb | 2 +- app/serializers/merge_request_user_entity.rb | 4 + app/serializers/project_access_token_entity.rb | 2 +- app/serializers/user_serializer.rb | 2 +- app/services/admin/set_feature_flag_service.rb | 85 +++ .../alert_management/create_alert_issue_service.rb | 2 +- .../project_recalculate_service.rb | 7 +- app/services/boards/issues/list_service.rb | 2 +- app/services/boards/lists/generate_service.rb | 39 -- app/services/boards/lists/list_service.rb | 20 +- .../create_pipeline_trackers_service.rb | 6 +- app/services/bulk_imports/create_service.rb | 2 + .../repository_bundle_export_service.rb | 8 +- .../bulk_imports/uploads_export_service.rb | 5 +- app/services/ci/after_requeue_job_service.rb | 2 +- app/services/ci/create_pipeline_service.rb | 4 +- app/services/ci/generate_kubeconfig_service.rb | 12 +- app/services/ci/job_artifacts/delete_service.rb | 18 +- app/services/ci/parse_dotenv_artifact_service.rb | 2 +- .../pipeline_artifacts/coverage_report_service.rb | 11 +- .../create_code_quality_mr_diff_report_service.rb | 11 +- .../destroy_all_expired_service.rb | 32 +- app/services/ci/process_build_service.rb | 2 + app/services/ci/runners/register_runner_service.rb | 2 +- app/services/ci/unlock_artifacts_service.rb | 6 +- .../clusters/applications/destroy_service.rb | 23 - .../clusters/applications/uninstall_service.rb | 29 - .../concerns/users/participable_service.rb | 2 + .../concerns/work_items/widgetable_service.rb | 12 +- .../google_cloud/enable_cloudsql_service.rb | 6 +- .../groups/import_export/import_service.rb | 2 + .../import/github/cancel_project_import_service.rb | 36 ++ app/services/import/github_service.rb | 28 +- .../incidents/create_service.rb | 12 +- .../prepare_update_service.rb | 2 +- .../timeline_events/create_service.rb | 1 - .../timeline_events/destroy_service.rb | 2 - .../timeline_events/update_service.rb | 2 - app/services/issuable/import_csv/base_service.rb | 2 +- app/services/issuable/process_assignees.rb | 10 +- app/services/issuable_base_service.rb | 47 +- app/services/issues/base_service.rb | 13 + app/services/issues/clone_service.rb | 11 +- app/services/issues/create_service.rb | 23 +- app/services/issues/import_csv_service.rb | 4 + app/services/issues/move_service.rb | 11 +- app/services/issues/update_service.rb | 10 - .../jira_connect/create_asymmetric_jwt_service.rb | 51 ++ app/services/labels/promote_service.rb | 4 +- app/services/members/create_service.rb | 4 +- app/services/members/destroy_service.rb | 25 +- app/services/merge_requests/approval_service.rb | 6 +- app/services/merge_requests/base_service.rb | 5 + app/services/merge_requests/close_service.rb | 5 + .../mark_reviewer_reviewed_service.rb | 2 + app/services/merge_requests/merge_base_service.rb | 4 +- app/services/merge_requests/merge_service.rb | 24 +- app/services/merge_requests/mergeability/logger.rb | 16 +- .../merge_requests/push_options_handler_service.rb | 14 +- .../merge_requests/request_review_service.rb | 1 + .../merge_requests/update_assignees_service.rb | 12 +- app/services/merge_requests/update_service.rb | 17 +- .../ml/experiment_tracking/candidate_repository.rb | 85 +++ .../experiment_tracking/experiment_repository.rb | 30 + .../namespaces/package_settings/update_service.rb | 8 +- app/services/notes/create_service.rb | 38 +- app/services/notification_service.rb | 15 + app/services/onboarding/progress_service.rb | 2 +- .../packages/debian/create_package_file_service.rb | 14 +- .../mark_packages_for_destruction_service.rb | 79 +++ app/services/packages/rpm/parse_package_service.rb | 84 +++ .../rpm/repository_metadata/base_builder.rb | 30 +- .../rpm/repository_metadata/build_primary_xml.rb | 73 +++ .../rpm/repository_metadata/build_repomd_xml.rb | 5 +- .../pages_domains/create_acme_order_service.rb | 10 +- app/services/pages_domains/create_service.rb | 34 ++ app/services/pages_domains/delete_service.rb | 32 ++ app/services/pages_domains/update_service.rb | 34 ++ .../personal_access_tokens/revoke_service.rb | 3 +- app/services/projects/autocomplete_service.rb | 20 +- app/services/projects/blame_service.rb | 8 +- .../cleanup_tags_base_service.rb | 17 - .../container_repository/cleanup_tags_service.rb | 110 ++-- .../gitlab/cleanup_tags_service.rb | 3 - .../third_party/cleanup_tags_service.rb | 106 ++++ app/services/projects/destroy_service.rb | 2 +- app/services/projects/import_service.rb | 6 +- app/services/projects/update_service.rb | 40 +- app/services/releases/create_service.rb | 8 +- app/services/releases/destroy_service.rb | 4 +- app/services/releases/update_service.rb | 10 +- .../resource_access_tokens/create_service.rb | 13 +- app/services/search_service.rb | 10 + app/services/users/build_service.rb | 2 + .../users/dismiss_namespace_callout_service.rb | 11 - .../users/refresh_authorized_projects_service.rb | 4 +- app/services/web_hook_service.rb | 3 +- app/services/web_hooks/log_execution_service.rb | 2 +- app/services/work_items/create_service.rb | 12 +- app/services/work_items/update_service.rb | 21 +- app/services/work_items/widgets/base_service.rb | 5 +- .../widgets/labels_service/update_service.rb | 15 + app/uploaders/job_artifact_uploader.rb | 1 + app/uploaders/object_storage/cdn.rb | 10 + app/uploaders/object_storage/cdn/google_cdn.rb | 4 +- .../packages/rpm/repository_file_uploader.rb | 33 ++ .../json_schemas/build_metadata_secrets.json | 3 +- .../json_schemas/ci_secure_file_metadata.json | 22 + ...ge_request_predictions_suggested_reviewers.json | 2 +- .../_account_and_limit.html.haml | 14 +- .../admin/application_settings/_ci_cd.html.haml | 3 +- .../admin/application_settings/_eks.html.haml | 2 +- .../admin/application_settings/_email.html.haml | 2 +- .../_external_authorization_service_form.html.haml | 2 +- .../admin/application_settings/_floc.html.haml | 2 +- .../admin/application_settings/_gitaly.html.haml | 4 +- .../admin/application_settings/_gitpod.html.haml | 2 +- .../application_settings/_help_page.html.haml | 2 +- .../_import_export_limits.html.haml | 4 +- .../application_settings/_ip_limits.html.haml | 2 +- .../application_settings/_issue_limits.html.haml | 2 +- .../_jira_connect_application_key.html.haml | 2 +- .../application_settings/_localization.html.haml | 2 +- .../_network_rate_limits.html.haml | 2 +- .../application_settings/_note_limits.html.haml | 4 +- .../admin/application_settings/_outbound.html.haml | 2 +- .../_package_registry.html.haml | 8 +- .../admin/application_settings/_pages.html.haml | 2 +- .../application_settings/_performance.html.haml | 2 +- .../_performance_bar.html.haml | 2 +- .../_pipeline_limits.html.haml | 2 +- .../application_settings/_prometheus.html.haml | 2 +- .../_protected_paths.html.haml | 2 +- .../admin/application_settings/_registry.html.haml | 2 +- .../_repository_mirrors_form.html.haml | 2 +- .../_repository_storage.html.haml | 2 +- .../admin/application_settings/_sentry.html.haml | 2 +- .../_sidekiq_job_limits.html.haml | 4 +- .../admin/application_settings/_signin.html.haml | 2 +- .../admin/application_settings/_snowplow.html.haml | 2 +- .../application_settings/_sourcegraph.html.haml | 2 +- .../admin/application_settings/_terms.html.haml | 2 +- .../_third_party_offers.html.haml | 2 +- .../admin/application_settings/_usage.html.haml | 2 +- .../_user_restrictions.html.haml | 6 + .../_users_api_limits.html.haml | 4 +- .../application_settings/_whats_new.html.haml | 2 +- .../appearances/preview_sign_in.html.haml | 4 +- .../admin/application_settings/ci_cd.html.haml | 19 +- .../admin/application_settings/general.html.haml | 4 +- .../service_usage_data.html.haml | 39 +- app/views/admin/applications/_form.html.haml | 2 +- app/views/admin/background_jobs/show.html.haml | 3 +- .../admin/broadcast_messages/_table.html.haml | 38 ++ app/views/admin/broadcast_messages/index.html.haml | 63 +-- app/views/admin/dashboard/index.html.haml | 4 +- app/views/admin/deploy_keys/edit.html.haml | 4 +- app/views/admin/deploy_keys/new.html.haml | 7 +- app/views/admin/groups/_form.html.haml | 4 +- app/views/admin/groups/_group.html.haml | 3 +- app/views/admin/groups/show.html.haml | 177 +++--- app/views/admin/hooks/edit.html.haml | 2 +- app/views/admin/hooks/index.html.haml | 2 +- .../admin/impersonation_tokens/index.html.haml | 13 +- app/views/admin/projects/_projects.html.haml | 45 +- app/views/admin/projects/show.html.haml | 1 - app/views/admin/users/_projects.html.haml | 24 +- app/views/admin/users/_user_detail_note.html.haml | 6 +- app/views/admin/users/projects.html.haml | 68 +-- app/views/admin/users/show.html.haml | 220 ++++---- app/views/award_emoji/_awards_block.html.haml | 2 +- app/views/ci/variables/_index.html.haml | 8 +- .../ci/variables/_url_query_variable_row.html.haml | 4 +- app/views/ci/variables/_variable_row.html.haml | 6 +- app/views/clusters/clusters/_health.html.haml | 4 +- app/views/clusters/clusters/index.html.haml | 1 + app/views/clusters/clusters/user/_form.html.haml | 2 +- app/views/devise/registrations/new.html.haml | 2 +- app/views/devise/sessions/_new_ldap.html.haml | 8 +- app/views/devise/shared/_omniauth_box.html.haml | 8 +- app/views/devise/shared/_tabs_ldap.html.haml | 2 +- app/views/discussions/_discussion.html.haml | 22 +- app/views/events/event/_common.html.haml | 2 +- ...ort_group_from_another_instance_panel.html.haml | 6 +- .../groups/_import_group_from_file_panel.html.haml | 4 +- app/views/groups/_personalize.html.haml | 2 +- app/views/groups/boards/index.html.haml | 2 +- app/views/groups/merge_requests.html.haml | 30 +- app/views/groups/milestones/_form.html.haml | 4 +- app/views/groups/new.html.haml | 2 +- app/views/groups/projects.html.haml | 71 +-- .../groups/settings/_pages_settings.html.haml | 4 +- .../groups/settings/access_tokens/index.html.haml | 18 +- app/views/groups/settings/ci_cd/_form.html.haml | 4 +- app/views/groups/settings/ci_cd/show.html.haml | 2 +- .../groups/settings/integrations/index.html.haml | 9 +- app/views/groups/show.html.haml | 3 - app/views/help/index.html.haml | 8 +- app/views/help/instance_configuration.html.haml | 2 +- app/views/help/show.html.haml | 2 +- app/views/import/_githubish_status.html.haml | 4 +- app/views/import/fogbugz/new_user_map.html.haml | 30 +- app/views/import/github/status.html.haml | 5 +- app/views/layouts/_flash.html.haml | 18 +- app/views/layouts/_head.html.haml | 2 +- app/views/layouts/fullscreen.html.haml | 11 +- app/views/layouts/header/_default.html.haml | 2 +- app/views/layouts/header/_gitlab_version.html.haml | 2 +- app/views/layouts/header/_help_dropdown.html.haml | 3 +- app/views/layouts/header/_new_dropdown.html.haml | 2 +- app/views/layouts/nav/sidebar/_admin.html.haml | 32 +- app/views/layouts/nav/sidebar/_profile.html.haml | 26 +- app/views/layouts/notify.html.haml | 2 +- app/views/layouts/terms.html.haml | 2 +- .../notify/access_token_revoked_email.html.haml | 7 + .../notify/access_token_revoked_email.text.erb | 5 + .../notify/project_was_exported_email.html.haml | 10 +- app/views/notify/project_was_moved_email.html.haml | 20 +- .../project_was_not_exported_email.html.haml | 4 +- app/views/notify/repository_push_email.text.haml | 2 +- .../request_review_merge_request_email.html.haml | 2 +- .../send_unsubscribed_notification.html.haml | 2 +- .../two_factor_otp_attempt_failed_email.html.haml | 51 ++ .../two_factor_otp_attempt_failed_email.text.haml | 7 + app/views/notify/unknown_sign_in_email.html.haml | 2 +- app/views/notify/unknown_sign_in_email.text.haml | 2 +- app/views/profiles/active_sessions/index.html.haml | 2 +- app/views/profiles/audit_log.html.haml | 2 +- app/views/profiles/chat_names/index.html.haml | 2 +- app/views/profiles/emails/index.html.haml | 6 +- app/views/profiles/gpg_keys/_form.html.haml | 4 +- app/views/profiles/gpg_keys/index.html.haml | 3 +- app/views/profiles/keys/_form.html.haml | 4 +- app/views/profiles/keys/_key_details.html.haml | 51 +- app/views/profiles/keys/index.html.haml | 3 +- app/views/profiles/notifications/show.html.haml | 2 +- app/views/profiles/passwords/edit.html.haml | 9 +- app/views/profiles/passwords/new.html.haml | 4 +- app/views/profiles/preferences/show.html.haml | 4 + app/views/profiles/show.html.haml | 51 +- app/views/profiles/two_factor_auths/show.html.haml | 8 + app/views/projects/_fork_suggestion.html.haml | 5 +- app/views/projects/_home_panel.html.haml | 2 +- app/views/projects/_new_project_fields.html.haml | 2 +- app/views/projects/_transfer.html.haml | 2 +- app/views/projects/artifacts/browse.html.haml | 1 + app/views/projects/artifacts/file.html.haml | 1 + app/views/projects/blame/show.html.haml | 3 +- app/views/projects/blob/_blob.html.haml | 2 +- app/views/projects/blob/_editor.html.haml | 16 +- .../projects/blob/_pipeline_tour_success.html.haml | 2 +- .../projects/blob/_template_selectors.html.haml | 12 +- app/views/projects/blob/preview.html.haml | 2 +- app/views/projects/blob/show.html.haml | 1 + app/views/projects/boards/index.html.haml | 2 +- app/views/projects/branch_rules/_show.html.haml | 2 +- app/views/projects/buttons/_clone.html.haml | 8 +- .../projects/buttons/_download_links.html.haml | 2 +- app/views/projects/buttons/_fork.html.haml | 2 +- app/views/projects/buttons/_star.html.haml | 14 +- app/views/projects/cleanup/_show.html.haml | 4 +- app/views/projects/cluster_agents/show.html.haml | 1 + app/views/projects/commit/_signature.html.haml | 2 +- .../projects/commit/_signature_badge.html.haml | 2 +- app/views/projects/commits/_commit.html.haml | 4 +- app/views/projects/commits/show.html.haml | 2 +- app/views/projects/compare/show.html.haml | 2 +- app/views/projects/default_branch/_show.html.haml | 4 +- app/views/projects/deploy_keys/edit.html.haml | 2 +- .../projects/deployments/_deployment.html.haml | 2 +- app/views/projects/deployments/_rollback.haml | 7 +- app/views/projects/edit.html.haml | 2 +- app/views/projects/environments/metrics.html.haml | 2 + app/views/projects/find_file/show.html.haml | 1 + app/views/projects/graphs/charts.html.haml | 1 + app/views/projects/hooks/edit.html.haml | 2 +- app/views/projects/hooks/index.html.haml | 4 +- app/views/projects/incidents/show.html.haml | 1 + app/views/projects/issues/_discussion.html.haml | 3 + app/views/projects/issues/_issue.html.haml | 5 - .../projects/issues/_work_item_links.html.haml | 2 +- .../_service_desk_info_content.html.haml | 2 +- app/views/projects/issues/show.html.haml | 1 + app/views/projects/jobs/_user.html.haml | 2 +- .../merge_requests/_awards_block.html.haml | 5 +- .../_close_reopen_draft_report_toggle.html.haml | 5 +- .../merge_requests/_discussion_filter.html.haml | 2 - .../merge_requests/_merge_request.html.haml | 11 +- .../projects/merge_requests/_nav_btns.html.haml | 7 +- .../projects/merge_requests/_widget.html.haml | 1 + app/views/projects/merge_requests/show.html.haml | 6 +- app/views/projects/milestones/_form.html.haml | 2 + .../mirrors/_authentication_method.html.haml | 10 +- app/views/projects/mirrors/_mirror_repos.html.haml | 2 +- app/views/projects/network/_head.html.haml | 2 +- app/views/projects/pages/_destroy.haml | 18 +- app/views/projects/pages/new.html.haml | 11 +- .../projects/pipeline_schedules/_form.html.haml | 2 +- .../_pipeline_schedule.html.haml | 6 +- .../projects/pipeline_schedules/edit.html.haml | 5 +- .../projects/pipeline_schedules/index.html.haml | 34 +- .../projects/pipeline_schedules/new.html.haml | 5 +- app/views/projects/pipelines/_info.html.haml | 13 +- app/views/projects/pipelines/new.html.haml | 1 + .../_project_fields_form.html.haml | 2 +- .../_create_protected_branch.html.haml | 4 +- .../shared/_create_protected_branch.html.haml | 4 +- .../protected_branches/shared/_dropdown.html.haml | 8 +- .../shared/_create_protected_tag.html.haml | 8 +- app/views/projects/releases/index.html.haml | 1 + app/views/projects/releases/show.html.haml | 1 + app/views/projects/repositories/_feed.html.haml | 18 - .../projects/runners/_shared_runners.html.haml | 2 +- .../settings/access_tokens/index.html.haml | 18 +- .../projects/settings/branch_rules/index.html.haml | 6 +- .../settings/ci_cd/_autodevops_form.html.haml | 2 +- app/views/projects/settings/ci_cd/_badge.html.haml | 18 +- app/views/projects/settings/ci_cd/_form.html.haml | 2 +- app/views/projects/settings/ci_cd/show.html.haml | 3 +- .../projects/settings/integrations/index.html.haml | 11 +- .../settings/merge_requests/show.html.haml | 5 +- app/views/projects/show.html.haml | 1 + app/views/projects/snippets/show.html.haml | 2 +- app/views/projects/starrers/_starrer.html.haml | 4 +- app/views/projects/tags/new.html.haml | 20 +- app/views/projects/tree/show.html.haml | 1 + app/views/projects/triggers/_index.html.haml | 18 +- app/views/projects/work_items/index.html.haml | 2 + app/views/registrations/welcome/show.html.haml | 6 +- app/views/search/_results.html.haml | 37 +- app/views/search/_results_list.html.haml | 18 + app/views/search/_results_status.html.haml | 26 +- .../search/_results_status_horiz_nav.html.haml | 22 + .../search/_results_status_vert_nav.html.haml | 23 + app/views/search/results/_snippet_title.html.haml | 2 +- app/views/search/results/_wiki_blob.html.haml | 2 +- app/views/search/show.html.haml | 3 +- app/views/shared/_clone_panel.html.haml | 4 +- app/views/shared/_commit_well.html.haml | 4 - app/views/shared/_custom_attributes.html.haml | 19 +- app/views/shared/_file_highlight.html.haml | 3 +- app/views/shared/access_tokens/_form.html.haml | 5 +- app/views/shared/blob/_markdown_buttons.html.haml | 20 +- .../deploy_keys/_project_group_form.html.haml | 2 +- app/views/shared/deploy_tokens/_form.html.haml | 2 +- app/views/shared/deploy_tokens/_index.html.haml | 20 +- .../doorkeeper/applications/_index.html.haml | 2 +- .../shared/issuable/_bulk_update_sidebar.html.haml | 12 +- app/views/shared/issuable/_feed_buttons.html.haml | 8 +- app/views/shared/issuable/_form.html.haml | 4 +- .../shared/issuable/_label_page_create.html.haml | 4 +- .../shared/issuable/_milestone_dropdown.html.haml | 4 - app/views/shared/issuable/_search_bar.html.haml | 9 +- app/views/shared/issuable/_sidebar.html.haml | 4 +- .../shared/issuable/_sidebar_assignees.html.haml | 2 +- .../shared/issuable/_sidebar_reviewers.html.haml | 5 +- app/views/shared/issuable/_sort_dropdown.html.haml | 2 +- .../shared/issue_type/_details_content.html.haml | 6 +- .../shared/issue_type/_details_header.html.haml | 7 +- app/views/shared/issue_type/_emoji_block.html.haml | 4 +- app/views/shared/labels/_form.html.haml | 6 +- app/views/shared/members/_member.html.haml | 2 +- app/views/shared/members/_requests.html.haml | 2 +- app/views/shared/milestones/_issuables.html.haml | 28 +- .../shared/milestones/_participants_tab.html.haml | 8 +- app/views/shared/notes/_note.html.haml | 15 +- app/views/shared/projects/_project.html.haml | 12 +- app/views/shared/projects/_search_form.html.haml | 2 +- .../shared/runners/_runner_description.html.haml | 12 +- .../runners/_shared_runners_description.html.haml | 7 +- app/views/shared/snippets/_snippet.html.haml | 25 +- app/views/shared/tokens/_scopes_form.html.haml | 3 +- app/views/shared/users/_user.html.haml | 2 +- app/views/shared/web_hooks/_form.html.haml | 13 +- app/views/shared/web_hooks/_hook_errors.html.haml | 12 +- app/views/shared/web_hooks/_index.html.haml | 25 +- app/views/shared/wikis/pages.html.haml | 4 +- app/views/snippets/show.html.haml | 2 +- app/workers/all_queues.yml | 126 +++-- app/workers/bulk_import_worker.rb | 5 +- app/workers/bulk_imports/entity_worker.rb | 26 +- app/workers/bulk_imports/export_request_worker.rb | 89 ++- app/workers/bulk_imports/pipeline_worker.rb | 54 +- app/workers/ci/cancel_pipeline_worker.rb | 1 + .../ci/parse_secure_file_metadata_worker.rb | 15 + .../ci/pipeline_success_unlock_artifacts_worker.rb | 4 +- .../clusters/applications/uninstall_worker.rb | 6 +- app/workers/concerns/application_worker.rb | 10 +- .../gitlab/github_import/object_importer.rb | 34 +- .../concerns/gitlab/github_import/stage_methods.rb | 4 + .../experiments/record_conversion_event_worker.rb | 22 - .../attachments/import_issue_worker.rb | 23 + .../attachments/import_merge_request_worker.rb | 23 + .../attachments/import_note_worker.rb | 23 + .../attachments/import_release_worker.rb | 23 + .../gitlab/github_import/import_issue_worker.rb | 4 + .../import_release_attachments_worker.rb | 6 +- .../stage/import_attachments_worker.rb | 9 +- .../stage/import_issue_events_worker.rb | 14 +- .../stage/import_issues_and_diff_notes_worker.rb | 2 +- .../github_import/stage/import_notes_worker.rb | 2 +- .../stage/import_repository_worker.rb | 18 + .../pager_duty/process_incident_worker.rb | 2 +- .../incident_management/process_alert_worker_v2.rb | 4 +- .../merge_requests/delete_source_branch_worker.rb | 6 +- .../namespaces/onboarding_issue_created_worker.rb | 24 - .../onboarding_pipeline_created_worker.rb | 24 - .../namespaces/onboarding_progress_worker.rb | 25 - .../namespaces/onboarding_user_added_worker.rb | 21 - app/workers/onboarding/issue_created_worker.rb | 27 + app/workers/onboarding/pipeline_created_worker.rb | 27 + app/workers/onboarding/progress_worker.rb | 28 + app/workers/onboarding/user_added_worker.rb | 24 + app/workers/process_commit_worker.rb | 24 +- 1403 files changed, 18173 insertions(+), 11414 deletions(-) create mode 100644 app/assets/javascripts/admin/broadcast_messages/components/base.vue create mode 100644 app/assets/javascripts/admin/broadcast_messages/components/messages_table.vue create mode 100644 app/assets/javascripts/admin/broadcast_messages/index.js create mode 100644 app/assets/javascripts/blame/blame_redirect.js delete mode 100644 app/assets/javascripts/boards/components/board_blocked_icon.vue delete mode 100644 app/assets/javascripts/boards/graphql/board_blocking_epics.query.graphql delete mode 100644 app/assets/javascripts/boards/graphql/board_blocking_issues.query.graphql delete mode 100644 app/assets/javascripts/ci_variable_list/graphql/resolvers.js create mode 100644 app/assets/javascripts/ci_variable_list/graphql/settings.js create mode 100644 app/assets/javascripts/content_editor/components/suggestions_dropdown.vue create mode 100644 app/assets/javascripts/content_editor/components/wrappers/label.vue create mode 100644 app/assets/javascripts/content_editor/extensions/external_keydown_handler.js create mode 100644 app/assets/javascripts/content_editor/extensions/reference_label.js create mode 100644 app/assets/javascripts/content_editor/extensions/suggestions.js create mode 100644 app/assets/javascripts/deploy_tokens/components/new_deploy_token.vue create mode 100644 app/assets/javascripts/deploy_tokens/index.js create mode 100644 app/assets/javascripts/groups/components/new_top_level_group_alert.vue create mode 100644 app/assets/javascripts/import_entities/import_projects/components/advanced_settings.vue delete mode 100644 app/assets/javascripts/issuable/auto_width_dropdown_select.js create mode 100644 app/assets/javascripts/issuable/bulk_update_sidebar/components/status_dropdown.vue delete mode 100644 app/assets/javascripts/issuable/bulk_update_sidebar/components/status_select.vue create mode 100644 app/assets/javascripts/issuable/bulk_update_sidebar/components/subscriptions_dropdown.vue delete mode 100644 app/assets/javascripts/issuable/bulk_update_sidebar/subscription_select.js create mode 100644 app/assets/javascripts/notes/components/notes_activity_header.vue delete mode 100644 app/assets/javascripts/notes/discussion_filters.js delete mode 100644 app/assets/javascripts/notes/timeline.js create mode 100644 app/assets/javascripts/notes/utils/get_notes_filter_data.js create mode 100644 app/assets/javascripts/pages/admin/dashboard/index.js delete mode 100644 app/assets/javascripts/pages/admin/groups/show/index.js create mode 100644 app/assets/javascripts/pages/import/fogbugz/new_user_map/components/user_select.vue create mode 100644 app/assets/javascripts/pages/profiles/init_timezone_dropdown.js create mode 100644 app/assets/javascripts/pipeline_new/graphql/mutations/create_pipeline.mutation.graphql create mode 100644 app/assets/javascripts/pipeline_new/graphql/queries/ci_config_variables.graphql create mode 100644 app/assets/javascripts/pipeline_new/graphql/resolvers.js create mode 100644 app/assets/javascripts/pipeline_schedules/components/pipeline_schedules.vue create mode 100644 app/assets/javascripts/pipeline_schedules/components/pipeline_schedules_form.vue create mode 100644 app/assets/javascripts/pipeline_schedules/components/table/cells/pipeline_schedule_actions.vue create mode 100644 app/assets/javascripts/pipeline_schedules/components/table/cells/pipeline_schedule_last_pipeline.vue create mode 100644 app/assets/javascripts/pipeline_schedules/components/table/cells/pipeline_schedule_next_run.vue create mode 100644 app/assets/javascripts/pipeline_schedules/components/table/cells/pipeline_schedule_owner.vue create mode 100644 app/assets/javascripts/pipeline_schedules/components/table/cells/pipeline_schedule_target.vue create mode 100644 app/assets/javascripts/pipeline_schedules/components/table/pipeline_schedules_table.vue create mode 100644 app/assets/javascripts/pipeline_schedules/graphql/mutations/delete_pipeline_schedule.mutation.graphql create mode 100644 app/assets/javascripts/pipeline_schedules/graphql/queries/get_pipeline_schedules.query.graphql create mode 100644 app/assets/javascripts/pipeline_schedules/mount_pipeline_schedules_app.js create mode 100644 app/assets/javascripts/pipeline_schedules/mount_pipeline_schedules_form_app.js delete mode 100644 app/assets/javascripts/projects/settings/branch_rules/components/branch_dropdown.vue create mode 100644 app/assets/javascripts/projects/settings/branch_rules/components/edit/branch_dropdown.vue create mode 100644 app/assets/javascripts/projects/settings/branch_rules/components/edit/index.vue create mode 100644 app/assets/javascripts/projects/settings/branch_rules/components/edit/protections/index.vue create mode 100644 app/assets/javascripts/projects/settings/branch_rules/components/edit/protections/merge_protections.vue create mode 100644 app/assets/javascripts/projects/settings/branch_rules/components/edit/protections/push_protections.vue delete mode 100644 app/assets/javascripts/projects/settings/branch_rules/components/protections/index.vue delete mode 100644 app/assets/javascripts/projects/settings/branch_rules/components/protections/merge_protections.vue delete mode 100644 app/assets/javascripts/projects/settings/branch_rules/components/protections/push_protections.vue delete mode 100644 app/assets/javascripts/projects/settings/branch_rules/components/rule_edit.vue create mode 100644 app/assets/javascripts/projects/settings/branch_rules/components/view/constants.js create mode 100644 app/assets/javascripts/projects/settings/branch_rules/components/view/index.vue create mode 100644 app/assets/javascripts/projects/settings/branch_rules/components/view/protection.vue create mode 100644 app/assets/javascripts/projects/settings/branch_rules/components/view/protection_row.vue create mode 100644 app/assets/javascripts/projects/settings/branch_rules/queries/branch_rules_details.query.graphql create mode 100644 app/assets/javascripts/projects/settings/components/default_branch_selector.vue create mode 100644 app/assets/javascripts/projects/settings/graphql/queries/current_user_namespace.query.graphql delete mode 100644 app/assets/javascripts/projects/settings/graphql/queries/search_namespaces_where_user_can_transfer_projects.query.graphql create mode 100644 app/assets/javascripts/projects/settings/mount_default_branch_selector.js delete mode 100644 app/assets/javascripts/reports/accessibility_report/components/accessibility_issue_body.vue delete mode 100644 app/assets/javascripts/reports/accessibility_report/grouped_accessibility_reports_app.vue delete mode 100644 app/assets/javascripts/reports/accessibility_report/store/actions.js delete mode 100644 app/assets/javascripts/reports/accessibility_report/store/getters.js delete mode 100644 app/assets/javascripts/reports/accessibility_report/store/index.js delete mode 100644 app/assets/javascripts/reports/accessibility_report/store/mutation_types.js delete mode 100644 app/assets/javascripts/reports/accessibility_report/store/mutations.js delete mode 100644 app/assets/javascripts/reports/accessibility_report/store/state.js create mode 100644 app/assets/javascripts/runner/components/cells/runner_owner_cell.vue create mode 100644 app/assets/javascripts/runner/components/runner_membership_toggle.vue delete mode 100644 app/assets/javascripts/sidebar/queries/sidebar_details.query.graphql delete mode 100644 app/assets/javascripts/sidebar/queries/sidebar_details_mr.query.graphql delete mode 100644 app/assets/javascripts/vue_merge_request_widget/components/terraform/mr_widget_terraform_container.vue delete mode 100644 app/assets/javascripts/vue_merge_request_widget/components/terraform/terraform_plan.vue create mode 100644 app/assets/javascripts/vue_merge_request_widget/components/widget/dynamic_content.vue create mode 100644 app/assets/javascripts/vue_merge_request_widget/components/widget/status_icon.vue create mode 100644 app/assets/javascripts/vue_merge_request_widget/components/widget/widget_content_row.vue delete mode 100644 app/assets/javascripts/vue_merge_request_widget/components/widget/widget_content_section.vue create mode 100644 app/assets/javascripts/vue_shared/components/group_select/utils.js create mode 100644 app/assets/javascripts/vue_shared/components/issuable_blocked_icon/constants.js create mode 100644 app/assets/javascripts/vue_shared/components/issuable_blocked_icon/graphql/blocking_epics.query.graphql create mode 100644 app/assets/javascripts/vue_shared/components/issuable_blocked_icon/graphql/blocking_issues.query.graphql create mode 100644 app/assets/javascripts/vue_shared/components/issuable_blocked_icon/issuable_blocked_icon.vue create mode 100644 app/assets/javascripts/vue_shared/components/markdown/markdown_editor.vue delete mode 100644 app/assets/javascripts/vue_shared/components/namespace_select/namespace_select.vue create mode 100644 app/assets/javascripts/vue_shared/components/namespace_select/namespace_select_deprecated.vue create mode 100644 app/assets/javascripts/vue_shared/components/source_viewer/plugins/wrap_bidi_chars.js create mode 100644 app/assets/javascripts/vue_shared/components/source_viewer/plugins/wrap_child_nodes.js delete mode 100644 app/assets/javascripts/vue_shared/components/source_viewer/plugins/wrap_comments.js create mode 100644 app/assets/javascripts/vue_shared/components/source_viewer/workers/highlight.js create mode 100644 app/assets/javascripts/vue_shared/components/source_viewer/workers/highlight_utils.js delete mode 100644 app/assets/javascripts/vue_shared/components/timezone_dropdown.vue create mode 100644 app/assets/javascripts/vue_shared/components/timezone_dropdown/timezone_dropdown.vue delete mode 100644 app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_image_new.vue delete mode 100644 app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_image_old.vue delete mode 100644 app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_link_new.vue delete mode 100644 app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_link_old.vue create mode 100644 app/assets/javascripts/vue_shared/directives/safe_html.js create mode 100644 app/assets/javascripts/webhooks/components/form_url_app.vue create mode 100644 app/assets/javascripts/webhooks/components/form_url_mask_item.vue create mode 100644 app/assets/javascripts/webhooks/index.js create mode 100644 app/assets/javascripts/work_items/components/work_item_milestone.vue create mode 100644 app/assets/javascripts/work_items/graphql/get_issue_details.query.graphql create mode 100644 app/assets/javascripts/work_items/graphql/work_item_assignees.subscription.graphql create mode 100644 app/assets/javascripts/work_items/graphql/work_item_labels.subscription.graphql delete mode 100644 app/assets/stylesheets/components/batch_comments/review_bar.scss delete mode 100644 app/assets/stylesheets/components/dashboard_skeleton.scss delete mode 100644 app/assets/stylesheets/components/date_time_picker.scss delete mode 100644 app/assets/stylesheets/components/design_management/design.scss delete mode 100644 app/assets/stylesheets/components/design_management/design_list_item.scss delete mode 100644 app/assets/stylesheets/components/feature_highlight.scss delete mode 100644 app/assets/stylesheets/components/milestone_combobox.scss delete mode 100644 app/assets/stylesheets/components/release_block.scss delete mode 100644 app/assets/stylesheets/components/release_block_milestone_info.scss create mode 100644 app/assets/stylesheets/components/shortcuts_help.scss delete mode 100644 app/assets/stylesheets/framework/ci_variable_list.scss delete mode 100644 app/assets/stylesheets/framework/flex_grid.scss delete mode 100644 app/assets/stylesheets/framework/memory_graph.scss delete mode 100644 app/assets/stylesheets/framework/toggle.scss create mode 100644 app/assets/stylesheets/lazy_bundles/gridstack.scss create mode 100644 app/assets/stylesheets/page_bundles/admin/geo_nodes.scss create mode 100644 app/assets/stylesheets/page_bundles/admin/geo_replicable.scss create mode 100644 app/assets/stylesheets/page_bundles/cluster_agents.scss create mode 100644 app/assets/stylesheets/page_bundles/clusters.scss create mode 100644 app/assets/stylesheets/page_bundles/graph_charts.scss create mode 100644 app/assets/stylesheets/page_bundles/incidents.scss create mode 100644 app/assets/stylesheets/page_bundles/operations.scss create mode 100644 app/assets/stylesheets/page_bundles/prometheus.scss create mode 100644 app/assets/stylesheets/page_bundles/releases.scss create mode 100644 app/assets/stylesheets/page_bundles/tree.scss delete mode 100644 app/assets/stylesheets/pages/clusters.scss delete mode 100644 app/assets/stylesheets/pages/deploy_keys.scss delete mode 100644 app/assets/stylesheets/pages/environment_logs.scss delete mode 100644 app/assets/stylesheets/pages/help.scss delete mode 100644 app/assets/stylesheets/pages/prometheus.scss delete mode 100644 app/assets/stylesheets/pages/service_desk.scss delete mode 100644 app/assets/stylesheets/pages/tree.scss create mode 100644 app/components/pajamas/progress_component.html.haml create mode 100644 app/components/pajamas/progress_component.rb delete mode 100644 app/controllers/boards/application_controller.rb delete mode 100644 app/controllers/boards/issues_controller.rb delete mode 100644 app/controllers/boards/lists_controller.rb delete mode 100644 app/controllers/concerns/boards_responses.rb create mode 100644 app/controllers/concerns/import/github_oauth.rb delete mode 100644 app/controllers/concerns/multiple_boards_actions.rb create mode 100644 app/controllers/concerns/registrations_tracking.rb create mode 100644 app/controllers/import/github_groups_controller.rb create mode 100644 app/controllers/jira_connect/public_keys_controller.rb create mode 100644 app/controllers/projects/incident_management/timeline_events_controller.rb delete mode 100644 app/controllers/users/namespace_callouts_controller.rb create mode 100644 app/events/pages_domains/pages_domain_created_event.rb create mode 100644 app/events/pages_domains/pages_domain_deleted_event.rb create mode 100644 app/events/pages_domains/pages_domain_updated_event.rb create mode 100644 app/events/projects/project_attributes_changed_event.rb create mode 100644 app/events/projects/project_features_changed_event.rb create mode 100644 app/graphql/batch_loaders/award_emoji_votes_batch_loader.rb create mode 100644 app/graphql/mutations/ci/pipeline_schedule/base.rb create mode 100644 app/graphql/mutations/ci/pipeline_schedule/delete.rb create mode 100644 app/graphql/mutations/packages/bulk_destroy.rb delete mode 100644 app/graphql/mutations/work_items/update_widgets.rb create mode 100644 app/graphql/resolvers/bulk_labels_resolver.rb create mode 100644 app/graphql/resolvers/ci/all_jobs_resolver.rb create mode 100644 app/graphql/resolvers/down_votes_count_resolver.rb create mode 100644 app/graphql/resolvers/project_pipeline_schedules_resolver.rb create mode 100644 app/graphql/resolvers/up_votes_count_resolver.rb create mode 100644 app/graphql/types/ci/pipeline_schedule_status_enum.rb create mode 100644 app/graphql/types/ci/pipeline_schedule_type.rb create mode 100644 app/graphql/types/permission_types/ci/pipeline_schedules.rb create mode 100644 app/graphql/types/work_items/widgets/labels_update_input_type.rb create mode 100644 app/helpers/milestones_helper.rb create mode 100644 app/models/ci/pipeline_metadata.rb create mode 100644 app/models/incident_management/timeline_event_tag.rb create mode 100644 app/models/incident_management/timeline_event_tag_link.rb create mode 100644 app/models/jira_connect/public_key.rb create mode 100644 app/models/packages/rpm/repository_file.rb delete mode 100644 app/models/users/namespace_callout.rb create mode 100644 app/models/users/phone_number_validation.rb create mode 100644 app/presenters/deploy_key_presenter.rb create mode 100644 app/presenters/key_presenter.rb delete mode 100644 app/serializers/board_serializer.rb delete mode 100644 app/serializers/board_simple_entity.rb delete mode 100644 app/serializers/current_board_entity.rb delete mode 100644 app/serializers/current_board_serializer.rb create mode 100644 app/serializers/import/github_org_entity.rb create mode 100644 app/serializers/import/github_org_serializer.rb create mode 100644 app/services/admin/set_feature_flag_service.rb delete mode 100644 app/services/boards/lists/generate_service.rb delete mode 100644 app/services/clusters/applications/destroy_service.rb delete mode 100644 app/services/clusters/applications/uninstall_service.rb create mode 100644 app/services/import/github/cancel_project_import_service.rb create mode 100644 app/services/jira_connect/create_asymmetric_jwt_service.rb create mode 100644 app/services/ml/experiment_tracking/candidate_repository.rb create mode 100644 app/services/ml/experiment_tracking/experiment_repository.rb create mode 100644 app/services/packages/mark_packages_for_destruction_service.rb create mode 100644 app/services/packages/rpm/parse_package_service.rb create mode 100644 app/services/pages_domains/create_service.rb create mode 100644 app/services/pages_domains/delete_service.rb create mode 100644 app/services/pages_domains/update_service.rb create mode 100644 app/services/projects/container_repository/third_party/cleanup_tags_service.rb delete mode 100644 app/services/users/dismiss_namespace_callout_service.rb create mode 100644 app/services/work_items/widgets/labels_service/update_service.rb create mode 100644 app/uploaders/packages/rpm/repository_file_uploader.rb create mode 100644 app/validators/json_schemas/ci_secure_file_metadata.json create mode 100644 app/views/admin/application_settings/_user_restrictions.html.haml create mode 100644 app/views/admin/broadcast_messages/_table.html.haml create mode 100644 app/views/notify/access_token_revoked_email.html.haml create mode 100644 app/views/notify/access_token_revoked_email.text.erb create mode 100644 app/views/notify/two_factor_otp_attempt_failed_email.html.haml create mode 100644 app/views/notify/two_factor_otp_attempt_failed_email.text.haml delete mode 100644 app/views/projects/merge_requests/_discussion_filter.html.haml delete mode 100644 app/views/projects/repositories/_feed.html.haml create mode 100644 app/views/search/_results_list.html.haml create mode 100644 app/views/search/_results_status_horiz_nav.html.haml create mode 100644 app/views/search/_results_status_vert_nav.html.haml delete mode 100644 app/views/shared/_commit_well.html.haml create mode 100644 app/workers/ci/parse_secure_file_metadata_worker.rb delete mode 100644 app/workers/experiments/record_conversion_event_worker.rb create mode 100644 app/workers/gitlab/github_import/attachments/import_issue_worker.rb create mode 100644 app/workers/gitlab/github_import/attachments/import_merge_request_worker.rb create mode 100644 app/workers/gitlab/github_import/attachments/import_note_worker.rb create mode 100644 app/workers/gitlab/github_import/attachments/import_release_worker.rb delete mode 100644 app/workers/namespaces/onboarding_issue_created_worker.rb delete mode 100644 app/workers/namespaces/onboarding_pipeline_created_worker.rb delete mode 100644 app/workers/namespaces/onboarding_progress_worker.rb delete mode 100644 app/workers/namespaces/onboarding_user_added_worker.rb create mode 100644 app/workers/onboarding/issue_created_worker.rb create mode 100644 app/workers/onboarding/pipeline_created_worker.rb create mode 100644 app/workers/onboarding/progress_worker.rb create mode 100644 app/workers/onboarding/user_added_worker.rb (limited to 'app') diff --git a/app/assets/javascripts/access_tokens/components/access_token_table_app.vue b/app/assets/javascripts/access_tokens/components/access_token_table_app.vue index 461b2dad479..57a237c3e84 100644 --- a/app/assets/javascripts/access_tokens/components/access_token_table_app.vue +++ b/app/assets/javascripts/access_tokens/components/access_token_table_app.vue @@ -45,16 +45,34 @@ export default { 'initialActiveAccessTokens', 'noActiveTokensMessage', 'showRole', + 'information', ], data() { return { - activeAccessTokens: this.initialActiveAccessTokens, + activeAccessTokens: convertObjectPropsToCamelCase(this.initialActiveAccessTokens, { + deep: true, + }), currentPage: INITIAL_PAGE, }; }, computed: { filteredFields() { - return this.showRole ? FIELDS : FIELDS.filter((field) => field.key !== 'role'); + const ignoredFields = []; + + // Show 'action' column only when there are no active tokens or when some of them have a revokePath + const showAction = + this.activeAccessTokens.length === 0 || + this.activeAccessTokens.some((token) => token.revokePath); + + if (!showAction) { + ignoredFields.push('action'); + } + + if (!this.showRole) { + ignoredFields.push('role'); + } + + return FIELDS.filter(({ key }) => !ignoredFields.includes(key)); }, header() { return sprintf(this.$options.i18n.header, { @@ -100,6 +118,10 @@ export default {
{{ header }}
+

+ {{ information }} +

+ convertObjectPropsToCamelCase(event.detail, { deep: true }); + export default { EVENT_ERROR, EVENT_SUCCESS, @@ -54,8 +57,8 @@ export default { /** @type {HTMLFormElement} */ this.form = document.querySelector(FORM_SELECTOR); - /** @type {HTMLInputElement} */ - this.submitButton = this.form.querySelector('input[type=submit]'); + /** @type {HTMLButtonElement} */ + this.submitButton = this.form.querySelector('[type=submit]'); }, methods: { beforeDisplayResults() { @@ -68,20 +71,21 @@ export default { onError(event) { this.beforeDisplayResults(); - const [{ errors }] = event.detail; + const [{ errors }] = convertEventDetail(event); this.errors = errors; this.submitButton.classList.remove('disabled'); + this.submitButton.removeAttribute('disabled'); }, onSuccess(event) { this.beforeDisplayResults(); - const [{ new_token: newToken }] = event.detail; + const [{ newToken }] = convertEventDetail(event); this.newToken = newToken; this.infoAlert = createAlert({ message: this.alertInfoMessage, variant: VARIANT_INFO }); - // Selectively reset all input fields except for the date picker and submit. + // Selectively reset all input fields except for the date picker. // The form token creation is not controlled by Vue. this.form.querySelectorAll('input[type=text]:not([id$=expires_at])').forEach((el) => { el.value = ''; diff --git a/app/assets/javascripts/access_tokens/components/tokens_app.vue b/app/assets/javascripts/access_tokens/components/tokens_app.vue index 10d4d62d803..1f72f5e19e2 100644 --- a/app/assets/javascripts/access_tokens/components/tokens_app.vue +++ b/app/assets/javascripts/access_tokens/components/tokens_app.vue @@ -79,7 +79,7 @@ export default { diff --git a/app/assets/javascripts/import_entities/import_projects/components/provider_repo_table_row.vue b/app/assets/javascripts/import_entities/import_projects/components/provider_repo_table_row.vue index e4090a378e1..458e0fb1cb1 100644 --- a/app/assets/javascripts/import_entities/import_projects/components/provider_repo_table_row.vue +++ b/app/assets/javascripts/import_entities/import_projects/components/provider_repo_table_row.vue @@ -43,6 +43,10 @@ export default { type: Array, required: true, }, + optionalStages: { + type: Object, + required: true, + }, }, computed: { @@ -177,7 +181,7 @@ export default { v-if="isImportNotStarted" type="button" data-qa-selector="import_button" - @click="fetchImport(repo.importSource.id)" + @click="fetchImport({ repoId: repo.importSource.id, optionalStages })" > {{ importButtonText }} diff --git a/app/assets/javascripts/import_entities/import_projects/index.js b/app/assets/javascripts/import_entities/import_projects/index.js index 5146a0eb461..4daa9e8a1b8 100644 --- a/app/assets/javascripts/import_entities/import_projects/index.js +++ b/app/assets/javascripts/import_entities/import_projects/index.js @@ -42,6 +42,7 @@ export function initPropsFromElement(element) { providerTitle: element.dataset.provider, filterable: parseBoolean(element.dataset.filterable), paginatable: parseBoolean(element.dataset.paginatable), + optionalStages: JSON.parse(element.dataset.optionalStages), }; } diff --git a/app/assets/javascripts/import_entities/import_projects/store/actions.js b/app/assets/javascripts/import_entities/import_projects/store/actions.js index 92be028b8a9..a30c14f9d28 100644 --- a/app/assets/javascripts/import_entities/import_projects/store/actions.js +++ b/app/assets/javascripts/import_entities/import_projects/store/actions.js @@ -1,5 +1,5 @@ import Visibility from 'visibilityjs'; -import createFlash from '~/flash'; +import { createAlert } from '~/flash'; import axios from '~/lib/utils/axios_utils'; import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils'; import httpStatusCodes from '~/lib/utils/http_status'; @@ -43,11 +43,14 @@ const restartJobsPolling = () => { const setImportTarget = ({ commit }, { repoId, importTarget }) => commit(types.SET_IMPORT_TARGET, { repoId, importTarget }); -const importAll = ({ state, dispatch }) => { +const importAll = ({ state, dispatch }, config = {}) => { return Promise.all( - state.repositories - .filter(isProjectImportable) - .map((r) => dispatch('fetchImport', r.importSource.id)), + state.repositories.filter(isProjectImportable).map((r) => + dispatch('fetchImport', { + repoId: r.importSource.id, + optionalStages: config?.optionalStages, + }), + ), ); }; @@ -73,7 +76,7 @@ const fetchReposFactory = ({ reposPath = isRequired() }) => ({ state, commit }) if (hasRedirectInError(e)) { redirectToUrlInError(e); } else if (tooManyRequests(e)) { - createFlash({ + createAlert({ message: sprintf(s__('ImportProjects|%{provider} rate limit exceeded. Try again later'), { provider: capitalizeFirstCharacter(provider), }), @@ -81,7 +84,7 @@ const fetchReposFactory = ({ reposPath = isRequired() }) => ({ state, commit }) commit(types.RECEIVE_REPOS_ERROR); } else { - createFlash({ + createAlert({ message: sprintf(s__('ImportProjects|Requesting your %{provider} repositories failed'), { provider, }), @@ -92,7 +95,10 @@ const fetchReposFactory = ({ reposPath = isRequired() }) => ({ state, commit }) }); }; -const fetchImportFactory = (importPath = isRequired()) => ({ state, commit, getters }, repoId) => { +const fetchImportFactory = (importPath = isRequired()) => ( + { state, commit, getters }, + { repoId, optionalStages }, +) => { const { ciCdOnly } = state; const importTarget = getters.getImportTarget(repoId); @@ -105,6 +111,7 @@ const fetchImportFactory = (importPath = isRequired()) => ({ state, commit, gett ci_cd_only: ciCdOnly, new_name: newName, target_namespace: targetNamespace, + ...(Object.keys(optionalStages).length ? { optional_stages: optionalStages } : {}), }) .then(({ data }) => { commit(types.RECEIVE_IMPORT_SUCCESS, { @@ -124,7 +131,7 @@ const fetchImportFactory = (importPath = isRequired()) => ({ state, commit, gett ) : s__('ImportProjects|Importing the project failed'); - createFlash({ + createAlert({ message: flashMessage, }); @@ -149,7 +156,7 @@ export const fetchJobsFactory = (jobsPath = isRequired()) => ({ state, commit, d if (hasRedirectInError(e)) { redirectToUrlInError(e); } else { - createFlash({ + createAlert({ message: s__('ImportProjects|Update of imported projects with realtime changes failed'), }); } @@ -177,7 +184,7 @@ const fetchNamespacesFactory = (namespacesPath = isRequired()) => ({ commit }) = commit(types.RECEIVE_NAMESPACES_SUCCESS, convertObjectPropsToCamelCase(data, { deep: true })), ) .catch(() => { - createFlash({ + createAlert({ message: s__('ImportProjects|Requesting namespaces failed'), }); diff --git a/app/assets/javascripts/integrations/constants.js b/app/assets/javascripts/integrations/constants.js index 437bcc39886..2806b785816 100644 --- a/app/assets/javascripts/integrations/constants.js +++ b/app/assets/javascripts/integrations/constants.js @@ -91,3 +91,5 @@ export const placeholderForType = { [INTEGRATION_TYPE_SLACK]: __('#general, #development'), [INTEGRATION_TYPE_MATTERMOST]: __('my-channel'), }; + +export const INTEGRATION_FORM_TYPE_SLACK = 'gitlab_slack_application'; diff --git a/app/assets/javascripts/integrations/edit/components/integration_form.vue b/app/assets/javascripts/integrations/edit/components/integration_form.vue index 7a6f1a953a8..15f76c16516 100644 --- a/app/assets/javascripts/integrations/edit/components/integration_form.vue +++ b/app/assets/javascripts/integrations/edit/components/integration_form.vue @@ -14,12 +14,14 @@ import { I18N_FETCH_TEST_SETTINGS_DEFAULT_ERROR_MESSAGE, I18N_DEFAULT_ERROR_MESSAGE, I18N_SUCCESSFUL_CONNECTION_MESSAGE, + INTEGRATION_FORM_TYPE_SLACK, integrationLevels, integrationFormSectionComponents, billingPlanNames, } from '~/integrations/constants'; import { refreshCurrentPage } from '~/lib/utils/url_utility'; import csrf from '~/lib/utils/csrf'; +import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin'; import { testIntegrationSettings } from '../api'; import ActiveCheckbox from './active_checkbox.vue'; import ConfirmationModal from './confirmation_modal.vue'; @@ -65,6 +67,7 @@ export default { GlModal: GlModalDirective, SafeHtml, }, + mixins: [glFeatureFlagsMixin()], inject: { helpHtml: { default: '', @@ -101,6 +104,9 @@ export default { return Boolean(this.isSaving || this.isResetting || this.isTesting); }, hasSections() { + if (this.hasSlackNotificationsDisabled) { + return false; + } return this.customState.sections.length !== 0; }, fieldsWithoutSection() { @@ -108,6 +114,24 @@ export default { ? this.propsSource.fields.filter((field) => !field.section) : this.propsSource.fields; }, + hasFieldsWithoutSection() { + if (this.hasSlackNotificationsDisabled) { + return false; + } + return this.fieldsWithoutSection.length; + }, + isSlackIntegration() { + return this.propsSource.type === INTEGRATION_FORM_TYPE_SLACK; + }, + hasSlackNotificationsDisabled() { + return this.isSlackIntegration && !this.glFeatures.integrationSlackAppNotifications; + }, + showHelpHtml() { + if (this.isSlackIntegration) { + return this.helpHtml; + } + return !this.hasSections && this.helpHtml; + }, }, methods: { ...mapActions(['setOverride', 'requestJiraIssueTypes']), @@ -227,6 +251,31 @@ export default { @change="setOverride" /> +
+ +
+
+ +
+
+ + +
+
+ -
-
- -
- -
- - - +
+
-
+ -
-
+
+
-
+
diff --git a/app/assets/javascripts/issuable/auto_width_dropdown_select.js b/app/assets/javascripts/issuable/auto_width_dropdown_select.js deleted file mode 100644 index 243d82f55aa..00000000000 --- a/app/assets/javascripts/issuable/auto_width_dropdown_select.js +++ /dev/null @@ -1,56 +0,0 @@ -import $ from 'jquery'; -import { loadCSSFile } from '../lib/utils/css_utils'; - -let instanceCount = 0; - -class AutoWidthDropdownSelect { - constructor(selectElement) { - this.$selectElement = $(selectElement); - this.dropdownClass = `js-auto-width-select-dropdown-${instanceCount}`; - instanceCount += 1; - } - - init() { - const { dropdownClass } = this; - import(/* webpackChunkName: 'select2' */ 'select2/select2') - .then(() => { - // eslint-disable-next-line promise/no-nesting - loadCSSFile(gon.select2_css_path) - .then(() => { - this.$selectElement.select2({ - dropdownCssClass: dropdownClass, - ...AutoWidthDropdownSelect.selectOptions(this.dropdownClass), - }); - }) - .catch(() => {}); - }) - .catch(() => {}); - - return this; - } - - static selectOptions(dropdownClass) { - return { - dropdownCss() { - let resultantWidth = 'auto'; - const $dropdown = $(`.${dropdownClass}`); - - // We have to look at the parent because - // `offsetParent` on a `display: none;` is `null` - const offsetParentWidth = $(this).parent().offsetParent().width(); - // Reset any width to let it naturally flow - $dropdown.css('width', 'auto'); - if ($dropdown.outerWidth(false) > offsetParentWidth) { - resultantWidth = offsetParentWidth; - } - - return { - width: resultantWidth, - maxWidth: offsetParentWidth, - }; - }, - }; - } -} - -export default AutoWidthDropdownSelect; diff --git a/app/assets/javascripts/issuable/bulk_update_sidebar/components/status_dropdown.vue b/app/assets/javascripts/issuable/bulk_update_sidebar/components/status_dropdown.vue new file mode 100644 index 00000000000..ba94932289e --- /dev/null +++ b/app/assets/javascripts/issuable/bulk_update_sidebar/components/status_dropdown.vue @@ -0,0 +1,57 @@ + + diff --git a/app/assets/javascripts/issuable/bulk_update_sidebar/components/status_select.vue b/app/assets/javascripts/issuable/bulk_update_sidebar/components/status_select.vue deleted file mode 100644 index 9509399e91d..00000000000 --- a/app/assets/javascripts/issuable/bulk_update_sidebar/components/status_select.vue +++ /dev/null @@ -1,58 +0,0 @@ - - diff --git a/app/assets/javascripts/issuable/bulk_update_sidebar/components/subscriptions_dropdown.vue b/app/assets/javascripts/issuable/bulk_update_sidebar/components/subscriptions_dropdown.vue new file mode 100644 index 00000000000..8774b065c22 --- /dev/null +++ b/app/assets/javascripts/issuable/bulk_update_sidebar/components/subscriptions_dropdown.vue @@ -0,0 +1,51 @@ + + diff --git a/app/assets/javascripts/issuable/bulk_update_sidebar/constants.js b/app/assets/javascripts/issuable/bulk_update_sidebar/constants.js index ad15b25f9cf..68133ceb3c7 100644 --- a/app/assets/javascripts/issuable/bulk_update_sidebar/constants.js +++ b/app/assets/javascripts/issuable/bulk_update_sidebar/constants.js @@ -1,17 +1,23 @@ import { __ } from '~/locale'; -export const ISSUE_STATUS_MODIFIERS = { - REOPEN: 'reopen', - CLOSE: 'close', -}; - -export const ISSUE_STATUS_SELECT_OPTIONS = [ +export const statusDropdownOptions = [ { - value: ISSUE_STATUS_MODIFIERS.REOPEN, text: __('Open'), + value: 'reopen', }, { - value: ISSUE_STATUS_MODIFIERS.CLOSE, text: __('Closed'), + value: 'close', + }, +]; + +export const subscriptionsDropdownOptions = [ + { + text: __('Subscribe'), + value: 'subscribe', + }, + { + text: __('Unsubscribe'), + value: 'unsubscribe', }, ]; diff --git a/app/assets/javascripts/issuable/bulk_update_sidebar/index.js b/app/assets/javascripts/issuable/bulk_update_sidebar/index.js index 967996b859e..4657771353f 100644 --- a/app/assets/javascripts/issuable/bulk_update_sidebar/index.js +++ b/app/assets/javascripts/issuable/bulk_update_sidebar/index.js @@ -1,5 +1,6 @@ import Vue from 'vue'; -import StatusSelect from './components/status_select.vue'; +import StatusDropdown from './components/status_dropdown.vue'; +import SubscriptionsDropdown from './components/subscriptions_dropdown.vue'; import issuableBulkUpdateActions from './issuable_bulk_update_actions'; import IssuableBulkUpdateSidebar from './issuable_bulk_update_sidebar'; @@ -14,8 +15,8 @@ export function initBulkUpdateSidebar(prefixId) { new IssuableBulkUpdateSidebar(); // eslint-disable-line no-new } -export function initIssueStatusSelect() { - const el = document.querySelector('.js-issue-status'); +export function initStatusDropdown() { + const el = document.querySelector('.js-status-dropdown'); if (!el) { return null; @@ -23,7 +24,21 @@ export function initIssueStatusSelect() { return new Vue({ el, - name: 'StatusSelectRoot', - render: (createElement) => createElement(StatusSelect), + name: 'StatusDropdownRoot', + render: (createElement) => createElement(StatusDropdown), + }); +} + +export function initSubscriptionsDropdown() { + const el = document.querySelector('.js-subscriptions-dropdown'); + + if (!el) { + return null; + } + + return new Vue({ + el, + name: 'SubscriptionsDropdownRoot', + render: (createElement) => createElement(SubscriptionsDropdown), }); } diff --git a/app/assets/javascripts/issuable/bulk_update_sidebar/issuable_bulk_update_sidebar.js b/app/assets/javascripts/issuable/bulk_update_sidebar/issuable_bulk_update_sidebar.js index 8a55176fed0..a33c6ae8030 100644 --- a/app/assets/javascripts/issuable/bulk_update_sidebar/issuable_bulk_update_sidebar.js +++ b/app/assets/javascripts/issuable/bulk_update_sidebar/issuable_bulk_update_sidebar.js @@ -5,7 +5,6 @@ import issuableEventHub from '~/issues/list/eventhub'; import LabelsSelect from '~/labels/labels_select'; import MilestoneSelect from '~/milestones/milestone_select'; import IssuableBulkUpdateActions from './issuable_bulk_update_actions'; -import subscriptionSelect from './subscription_select'; const HIDDEN_CLASS = 'hidden'; const DISABLED_CONTENT_CLASS = 'disabled-content'; @@ -52,7 +51,6 @@ export default class IssuableBulkUpdateSidebar { initDropdowns() { new LabelsSelect(); new MilestoneSelect(); - subscriptionSelect(); // Checking IS_EE and using ee_else_ce is odd, but we do it here to satisfy // the import/no-unresolved lint rule when FOSS_ONLY=1, even though at diff --git a/app/assets/javascripts/issuable/bulk_update_sidebar/subscription_select.js b/app/assets/javascripts/issuable/bulk_update_sidebar/subscription_select.js deleted file mode 100644 index b12ac776b4f..00000000000 --- a/app/assets/javascripts/issuable/bulk_update_sidebar/subscription_select.js +++ /dev/null @@ -1,28 +0,0 @@ -import $ from 'jquery'; -import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown'; -import { __ } from '~/locale'; - -export default function subscriptionSelect() { - $('.js-subscription-event').each((i, element) => { - const fieldName = $(element).data('fieldName'); - - return initDeprecatedJQueryDropdown($(element), { - selectable: true, - fieldName, - toggleLabel(selected, el, instance) { - let label = __('Subscription'); - const $item = instance.dropdown.find('.is-active'); - if ($item.length) { - label = $item.text(); - } - return label; - }, - clicked(options) { - return options.e.preventDefault(); - }, - id(obj, el) { - return $(el).data('id'); - }, - }); - }); -} diff --git a/app/assets/javascripts/issuable/issuable_context.js b/app/assets/javascripts/issuable/issuable_context.js index 37001d00a27..8c2e2a5df67 100644 --- a/app/assets/javascripts/issuable/issuable_context.js +++ b/app/assets/javascripts/issuable/issuable_context.js @@ -1,7 +1,6 @@ import { GlBreakpointInstance as bp } from '@gitlab/ui/dist/utils'; import $ from 'jquery'; import { setCookie } from '~/lib/utils/common_utils'; -import { loadCSSFile } from '~/lib/utils/css_utils'; import UsersSelect from '~/users_select'; export default class IssuableContext { @@ -9,24 +8,6 @@ export default class IssuableContext { this.userSelect = new UsersSelect(currentUser); this.reviewersSelect = new UsersSelect(currentUser, '.js-reviewer-search'); - const $select2 = $('select.select2'); - - if ($select2.length) { - import(/* webpackChunkName: 'select2' */ 'select2/select2') - .then(() => { - // eslint-disable-next-line promise/no-nesting - loadCSSFile(gon.select2_css_path) - .then(() => { - $select2.select2({ - width: 'resolve', - dropdownAutoWidth: true, - }); - }) - .catch(() => {}); - }) - .catch(() => {}); - } - $('.issuable-sidebar .inline-update').on('change', 'select', function onClickSelect() { return $(this).submit(); }); diff --git a/app/assets/javascripts/issuable/issuable_form.js b/app/assets/javascripts/issuable/issuable_form.js index 81bf7ca6ccc..e8ba99e0e9e 100644 --- a/app/assets/javascripts/issuable/issuable_form.js +++ b/app/assets/javascripts/issuable/issuable_form.js @@ -2,10 +2,7 @@ import $ from 'jquery'; import Pikaday from 'pikaday'; import GfmAutoComplete from 'ee_else_ce/gfm_auto_complete'; import Autosave from '~/autosave'; -import AutoWidthDropdownSelect from '~/issuable/auto_width_dropdown_select'; -import { loadCSSFile } from '~/lib/utils/css_utils'; import { parsePikadayDate, pikadayToString } from '~/lib/utils/datetime_utility'; -import { select2AxiosTransport } from '~/lib/utils/select2_utils'; import { queryToObject, objectToQuery } from '~/lib/utils/url_utility'; import UsersSelect from '~/users_select'; import ZenMode from '~/zen_mode'; @@ -118,12 +115,6 @@ export default class IssuableForm { }); calendar.setDate(parsePikadayDate($issuableDueDate.val())); } - - this.$targetBranchSelect = $('.js-target-branch-select', this.form); - - if (this.$targetBranchSelect.length) { - this.initTargetBranchDropdown(); - } } initAutosave() { @@ -214,47 +205,4 @@ export default class IssuableForm { addWip() { this.titleField.val(`Draft: ${this.titleField.val()}`); } - - initTargetBranchDropdown() { - import(/* webpackChunkName: 'select2' */ 'select2/select2') - .then(() => { - // eslint-disable-next-line promise/no-nesting - loadCSSFile(gon.select2_css_path) - .then(() => { - this.$targetBranchSelect.select2({ - ...AutoWidthDropdownSelect.selectOptions('js-target-branch-select'), - ajax: { - url: this.$targetBranchSelect.data('endpoint'), - dataType: 'JSON', - quietMillis: 250, - data(search) { - return { - search, - }; - }, - results({ results }) { - return { - // `data` keys are translated so we can't just access them with a string based key - results: results[Object.keys(results)[0]].map((name) => ({ - id: name, - text: name, - })), - }; - }, - transport: select2AxiosTransport, - }, - initSelection(el, callback) { - const val = el.val(); - - callback({ - id: val, - text: val, - }); - }, - }); - }) - .catch(() => {}); - }) - .catch(() => {}); - } } diff --git a/app/assets/javascripts/issues/list/components/issues_list_app.vue b/app/assets/javascripts/issues/list/components/issues_list_app.vue index 0b424d105b9..acb6aa93f0f 100644 --- a/app/assets/javascripts/issues/list/components/issues_list_app.vue +++ b/app/assets/javascripts/issues/list/components/issues_list_app.vue @@ -247,8 +247,8 @@ export default { }, defaultWorkItemTypes() { return this.isWorkItemsEnabled - ? defaultWorkItemTypes.concat(WORK_ITEM_TYPE_ENUM_TASK) - : defaultWorkItemTypes; + ? defaultWorkItemTypes + : defaultWorkItemTypes.filter((type) => type !== WORK_ITEM_TYPE_ENUM_TASK); }, typeTokenOptions() { return this.isWorkItemsEnabled @@ -563,7 +563,8 @@ export default { if (!this.hasInitBulkEdit) { const bulkUpdateSidebar = await import('~/issuable/bulk_update_sidebar'); bulkUpdateSidebar.initBulkUpdateSidebar('issuable_'); - bulkUpdateSidebar.initIssueStatusSelect(); + bulkUpdateSidebar.initStatusDropdown(); + bulkUpdateSidebar.initSubscriptionsDropdown(); const usersSelect = await import('~/users_select'); const UsersSelect = usersSelect.default; diff --git a/app/assets/javascripts/issues/list/constants.js b/app/assets/javascripts/issues/list/constants.js index 27738d7a3e6..9fe8899ab39 100644 --- a/app/assets/javascripts/issues/list/constants.js +++ b/app/assets/javascripts/issues/list/constants.js @@ -7,11 +7,13 @@ import { FILTER_UPCOMING, OPERATOR_IS, OPERATOR_IS_NOT, + TOKEN_TYPE_HEALTH, } from '~/vue_shared/components/filtered_search_bar/constants'; import { WORK_ITEM_TYPE_ENUM_INCIDENT, WORK_ITEM_TYPE_ENUM_ISSUE, WORK_ITEM_TYPE_ENUM_TEST_CASE, + WORK_ITEM_TYPE_ENUM_TASK, } from '~/work_items/constants'; export const i18n = { @@ -147,14 +149,16 @@ export const TOKEN_TYPE_EPIC = 'epic_id'; export const TOKEN_TYPE_WEIGHT = 'weight'; export const TOKEN_TYPE_CONTACT = 'crm_contact'; export const TOKEN_TYPE_ORGANIZATION = 'crm_organization'; -export const TOKEN_TYPE_HEALTH = 'health_status'; -export const TYPE_TOKEN_TASK_OPTION = { icon: 'task-done', title: 'task', value: 'task' }; +export const TYPE_TOKEN_TASK_OPTION = { icon: 'issue-type-task', title: 'task', value: 'task' }; +// This should be consistent with Issue::TYPES_FOR_LIST in the backend +// https://gitlab.com/gitlab-org/gitlab/-/blob/1379c2d7bffe2a8d809f23ac5ef9b4114f789c07/app/models/issue.rb#L48 export const defaultWorkItemTypes = [ WORK_ITEM_TYPE_ENUM_ISSUE, WORK_ITEM_TYPE_ENUM_INCIDENT, WORK_ITEM_TYPE_ENUM_TEST_CASE, + WORK_ITEM_TYPE_ENUM_TASK, ]; export const defaultTypeTokenOptions = [ @@ -327,10 +331,12 @@ export const filters = { [TOKEN_TYPE_HEALTH]: { [API_PARAM]: { [NORMAL_FILTER]: 'healthStatus', + [SPECIAL_FILTER]: 'healthStatus', }, [URL_PARAM]: { [OPERATOR_IS]: { [NORMAL_FILTER]: 'health_status', + [SPECIAL_FILTER]: 'health_status', }, }, }, diff --git a/app/assets/javascripts/issues/show/components/edited.vue b/app/assets/javascripts/issues/show/components/edited.vue index 4c5f783cd66..5138a4530e9 100644 --- a/app/assets/javascripts/issues/show/components/edited.vue +++ b/app/assets/javascripts/issues/show/components/edited.vue @@ -1,10 +1,11 @@ @@ -46,7 +54,26 @@ export default {