From d9ab72d6080f594d0b3cae15f14b3ef2c6c638cb Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Wed, 20 Oct 2021 08:43:02 +0000 Subject: Add latest changes from gitlab-org/gitlab@14-4-stable-ee --- app/assets/images/logos/zentao.svg | 14 + app/assets/javascripts/access_tokens/index.js | 2 +- .../admin/users/components/actions/delete.vue | 4 +- .../actions/delete_with_contributions.vue | 4 +- .../actions/shared/shared_delete_action.vue | 4 +- .../users/components/modals/delete_user_modal.vue | 18 +- .../admin/users/components/user_actions.vue | 6 +- .../shared/components/projects_dropdown_filter.vue | 91 +- .../javascripts/analytics/shared/constants.js | 1 + app/assets/javascripts/analytics/shared/utils.js | 62 + app/assets/javascripts/api.js | 4 +- app/assets/javascripts/api/bulk_imports_api.js | 7 + app/assets/javascripts/artifacts_settings/index.js | 2 +- .../javascripts/behaviors/markdown/nodes/emoji.js | 12 + .../javascripts/behaviors/markdown/nodes/image.js | 2 +- .../javascripts/behaviors/preview_markdown.js | 2 +- app/assets/javascripts/behaviors/requires_input.js | 14 - .../javascripts/behaviors/shortcuts/keybindings.js | 7 + .../behaviors/shortcuts/shortcuts_navigation.js | 14 + .../javascripts/blob/components/blob_content.vue | 6 + .../javascripts/blob/file_template_mediator.js | 6 +- app/assets/javascripts/boards/boards_util.js | 7 +- .../boards/components/board_add_new_column.vue | 4 +- .../components/board_add_new_column_trigger.vue | 25 +- .../boards/components/board_card_inner.vue | 4 +- .../boards/components/board_content_sidebar.vue | 64 +- .../boards/components/board_list_header.vue | 4 +- app/assets/javascripts/boards/graphql.js | 22 + .../boards/graphql/issue.fragment.graphql | 4 + .../boards/graphql/lists_issues.query.graphql | 2 + app/assets/javascripts/boards/index.js | 21 +- app/assets/javascripts/boards/stores/actions.js | 17 +- .../javascripts/boards/stores/mutation_types.js | 1 + app/assets/javascripts/boards/stores/mutations.js | 4 + app/assets/javascripts/boards/stores/state.js | 1 + app/assets/javascripts/ci_lint/index.js | 4 +- .../clusters/agents/components/show.vue | 159 +++ .../clusters/agents/components/token_table.vue | 122 ++ .../javascripts/clusters/agents/constants.js | 1 + .../fragments/cluster_agent_token.fragment.graphql | 11 + .../queries/get_cluster_agent.query.graphql | 34 + app/assets/javascripts/clusters/agents/index.js | 30 + .../javascripts/clusters_list/clusters_util.js | 8 + .../clusters_list/components/agent_empty_state.vue | 119 ++ .../clusters_list/components/agent_table.vue | 152 +++ .../clusters_list/components/agents.vue | 156 +++ .../components/available_agents_dropdown.vue | 83 ++ .../components/install_agent_modal.vue | 259 ++++ app/assets/javascripts/clusters_list/constants.js | 85 +- .../mutations/create_agent.mutation.graphql | 8 + .../mutations/create_agent_token.mutation.graphql | 9 + .../queries/agent_configurations.query.graphql | 15 + .../graphql/queries/get_agents.query.graphql | 47 + app/assets/javascripts/clusters_list/index.js | 5 + .../javascripts/clusters_list/load_agents.js | 44 + app/assets/javascripts/comment_type_toggle.js | 71 - .../content_editor/components/top_toolbar.vue | 9 + .../content_editor/components/wrappers/details.vue | 33 + .../components/wrappers/frontmatter.vue | 32 + .../content_editor/content_editor.stories.js | 2 +- .../extensions/code_block_highlight.js | 3 +- .../content_editor/extensions/color_chip.js | 73 + .../content_editor/extensions/details.js | 36 + .../content_editor/extensions/details_content.js | 25 + .../content_editor/extensions/frontmatter.js | 20 + .../content_editor/extensions/math_inline.js | 35 + .../content_editor/extensions/table_of_contents.js | 51 + .../content_editor/extensions/word_break.js | 29 + .../services/create_content_editor.js | 14 + .../content_editor/services/markdown_serializer.js | 40 + .../components/eks_cluster_configuration_form.vue | 12 +- .../components/gke_network_dropdown.vue | 2 +- .../components/gke_subnetwork_dropdown.vue | 2 +- .../javascripts/create_merge_request_dropdown.js | 4 +- .../cycle_analytics/components/base.vue | 16 +- .../cycle_analytics/components/filter_bar.vue | 1 - .../cycle_analytics/components/stage_table.vue | 3 + .../javascripts/cycle_analytics/constants.js | 2 +- app/assets/javascripts/cycle_analytics/index.js | 1 + .../javascripts/cycle_analytics/store/actions.js | 20 +- .../javascripts/cycle_analytics/store/getters.js | 8 + .../cycle_analytics/store/mutation_types.js | 1 + .../javascripts/cycle_analytics/store/mutations.js | 21 +- .../javascripts/cycle_analytics/store/state.js | 11 + app/assets/javascripts/cycle_analytics/utils.js | 30 +- app/assets/javascripts/dependency_proxy.js | 5 - .../components/deploy_freeze_modal.vue | 2 +- app/assets/javascripts/deprecated_notes.js | 73 +- .../design_management/pages/design/index.vue | 2 +- .../javascripts/design_management/pages/index.vue | 2 +- .../design_management/utils/cache_update.js | 2 +- .../design_management/utils/error_messages.js | 72 +- app/assets/javascripts/diffs/components/app.vue | 15 + .../diffs/components/compare_versions.vue | 1 + .../javascripts/diffs/components/diff_row.vue | 13 +- .../javascripts/diffs/components/tree_list.vue | 2 +- .../javascripts/diffs/utils/tree_worker_utils.js | 107 ++ app/assets/javascripts/diffs/utils/workers.js | 107 -- .../javascripts/diffs/workers/tree_worker.js | 2 +- app/assets/javascripts/droplab/constants.js | 9 - app/assets/javascripts/droplab/drop_down.js | 174 --- app/assets/javascripts/droplab/drop_lab.js | 160 --- app/assets/javascripts/droplab/hook.js | 15 - app/assets/javascripts/droplab/hook_button.js | 60 - app/assets/javascripts/droplab/hook_input.js | 117 -- app/assets/javascripts/droplab/keyboard.js | 122 -- app/assets/javascripts/droplab/plugins/ajax.js | 54 - .../javascripts/droplab/plugins/ajax_filter.js | 113 -- app/assets/javascripts/droplab/plugins/filter.js | 96 -- .../javascripts/droplab/plugins/input_setter.js | 50 - app/assets/javascripts/droplab/utils.js | 40 - .../extensions/source_editor_ci_schema_ext.js | 10 +- app/assets/javascripts/editor/schema/NOTICE | 6 + app/assets/javascripts/editor/schema/ci.json | 1444 ++++++++++++++++++++ .../environments/components/environment_delete.vue | 28 +- .../components/environment_external_url.vue | 15 +- .../environments/components/environment_item.vue | 98 +- .../components/environment_monitoring.vue | 26 +- .../environments/components/environment_pin.vue | 16 +- .../components/environment_rollback.vue | 18 +- .../environments/components/environment_stop.vue | 19 +- .../components/environment_terminal_button.vue | 26 +- .../environments/components/environments_table.vue | 2 +- .../folder/environments_folder_bundle.js | 2 +- .../error_tracking/components/error_details.vue | 22 +- .../error_tracking/queries/details.query.graphql | 1 + .../error_tracking_settings/components/app.vue | 31 +- .../javascripts/error_tracking_settings/index.js | 2 + app/assets/javascripts/experimentation/utils.js | 8 +- .../feature_flags/components/edit_feature_flag.vue | 16 +- .../javascripts/feature_flags/components/form.vue | 2 +- .../components/strategies/flexible_rollout.vue | 2 +- app/assets/javascripts/feature_flags/edit.js | 2 + .../filtered_search/dropdown_ajax_filter.js | 2 +- .../javascripts/filtered_search/dropdown_emoji.js | 4 +- .../javascripts/filtered_search/dropdown_hint.js | 2 +- .../filtered_search/dropdown_non_user.js | 4 +- .../filtered_search/dropdown_operator.js | 2 +- .../filtered_search/droplab/constants.js | 9 + .../filtered_search/droplab/drop_down.js | 174 +++ .../filtered_search/droplab/drop_lab_deprecated.js | 170 +++ .../javascripts/filtered_search/droplab/hook.js | 15 + .../filtered_search/droplab/hook_button.js | 60 + .../filtered_search/droplab/hook_input.js | 117 ++ .../filtered_search/droplab/keyboard.js | 122 ++ .../filtered_search/droplab/plugins/ajax.js | 54 + .../filtered_search/droplab/plugins/ajax_filter.js | 114 ++ .../filtered_search/droplab/plugins/filter.js | 96 ++ .../droplab/plugins/input_setter.js | 50 + .../javascripts/filtered_search/droplab/utils.js | 40 + .../filtered_search_dropdown_manager.js | 2 +- .../components/frequent_items_list_item.vue | 7 +- .../fragments/milestone.fragment.graphql | 6 + .../javascripts/header_search/components/app.vue | 15 +- .../header_search_autocomplete_items.vue | 74 + app/assets/javascripts/header_search/constants.js | 8 + app/assets/javascripts/header_search/index.js | 4 +- .../javascripts/header_search/store/actions.js | 14 + .../javascripts/header_search/store/getters.js | 32 + .../javascripts/header_search/store/index.js | 10 +- .../header_search/store/mutation_types.js | 4 + .../javascripts/header_search/store/mutations.js | 12 + .../javascripts/header_search/store/state.js | 5 +- .../components/commit_sidebar/success_message.vue | 6 +- .../javascripts/ide/components/jobs/detail.vue | 14 +- .../ide/components/preview/navigator.vue | 2 +- .../ide/stores/modules/commit/getters.js | 9 +- .../ide/stores/modules/pipelines/actions.js | 1 + app/assets/javascripts/ide/stores/utils.js | 2 +- .../import_entities/components/pagination_bar.vue | 90 ++ app/assets/javascripts/integrations/constants.js | 23 + .../edit/components/active_checkbox.vue | 3 +- .../integrations/edit/components/dynamic_field.vue | 5 +- .../edit/components/integration_form.vue | 10 +- .../edit/components/jira_issues_fields.vue | 10 +- .../edit/components/jira_trigger_fields.vue | 5 +- .../edit/components/override_dropdown.vue | 2 +- .../javascripts/integrations/edit/constants.js | 17 - .../integrations/integration_settings_form.js | 46 +- .../overrides/components/integration_overrides.vue | 19 +- .../components/invite_members_modal.vue | 13 +- .../utils/response_message_parser.js | 5 +- .../issuable/components/csv_export_modal.vue | 69 +- .../components/csv_import_export_buttons.vue | 9 +- .../issuable/components/csv_import_modal.vue | 68 +- app/assets/javascripts/issuable_form.js | 6 +- .../issuable_list/components/issuable_item.vue | 239 ++-- .../components/issuable_list_root.vue | 124 +- .../issuable_suggestions/components/app.vue | 2 +- .../issuable_suggestions/components/item.vue | 35 +- .../javascripts/issuable_suggestions/index.js | 7 +- .../issue_show/components/locked_warning.vue | 37 +- .../components/issue_card_time_info.vue | 17 +- .../issues_list/components/issues_list_app.vue | 49 +- .../issues_list/components/new_issue_dropdown.vue | 124 ++ app/assets/javascripts/issues_list/index.js | 6 +- .../queries/search_projects.query.graphql | 12 + app/assets/javascripts/jobs/components/job_app.vue | 30 +- .../jobs/components/job_log_controllers.vue | 4 +- .../jobs/components/log/collapsible_section.vue | 10 +- app/assets/javascripts/jobs/components/log/log.vue | 18 +- .../jobs/components/table/cells/actions_cell.vue | 20 +- app/assets/javascripts/jobs/store/actions.js | 62 +- app/assets/javascripts/jobs/store/getters.js | 7 +- .../javascripts/jobs/store/mutation_types.js | 14 +- app/assets/javascripts/jobs/store/mutations.js | 56 +- app/assets/javascripts/jobs/store/state.js | 20 +- app/assets/javascripts/jobs/store/utils.js | 18 +- app/assets/javascripts/jobs/utils.js | 9 + ...ppress_network_errors_during_navigation_link.js | 36 + app/assets/javascripts/lib/graphql.js | 2 + app/assets/javascripts/lib/logger/hello.js | 29 +- app/assets/javascripts/lib/utils/axios_utils.js | 8 +- app/assets/javascripts/lib/utils/color_utils.js | 19 + app/assets/javascripts/lib/utils/common_utils.js | 6 +- app/assets/javascripts/lib/utils/constants.js | 4 + .../lib/utils/datetime/date_format_utility.js | 29 +- app/assets/javascripts/lib/utils/datetime_range.js | 12 +- .../javascripts/lib/utils/is_navigating_away.js | 23 + app/assets/javascripts/lib/utils/regexp.js | 8 +- app/assets/javascripts/lib/utils/text_utility.js | 15 + app/assets/javascripts/lib/utils/url_utility.js | 29 + .../logs/components/environment_logs.vue | 2 +- app/assets/javascripts/logs/stores/state.js | 2 +- app/assets/javascripts/main.js | 3 +- .../action_buttons/remove_member_button.vue | 4 +- .../action_buttons/user_action_buttons.vue | 11 +- .../members/components/modals/leave_modal.vue | 19 +- .../components/modals/remove_member_modal.vue | 24 +- .../members/components/table/expires_at.vue | 66 - .../members/components/table/members_table.vue | 87 +- app/assets/javascripts/members/constants.js | 22 +- .../components/inline_conflict_lines.vue | 6 +- .../components/parallel_conflict_lines.vue | 6 +- app/assets/javascripts/merge_request.js | 8 +- app/assets/javascripts/mr_popover/index.js | 7 +- app/assets/javascripts/namespace_select.js | 58 - app/assets/javascripts/notebook/cells/markdown.vue | 9 +- .../notes/components/comment_type_dropdown.vue | 8 +- .../notes/components/discussion_notes.vue | 7 + .../javascripts/notes/components/note_actions.vue | 6 +- .../javascripts/notes/components/note_body.vue | 13 +- .../javascripts/notes/components/note_form.vue | 1 + .../javascripts/notes/components/note_header.vue | 11 +- .../notes/components/noteable_discussion.vue | 6 + .../javascripts/notes/components/noteable_note.vue | 15 +- .../javascripts/notes/components/notes_app.vue | 1 + app/assets/javascripts/notes/stores/actions.js | 4 +- app/assets/javascripts/notes/stores/getters.js | 11 + app/assets/javascripts/notifications/constants.js | 2 +- .../details/components/additional_metadata.vue | 94 -- .../packages/details/components/app.vue | 292 ---- .../details/components/composer_installation.vue | 65 - .../details/components/conan_installation.vue | 59 - .../packages/details/components/dependency_row.vue | 35 - .../packages/details/components/file_sha.vue | 41 - .../details/components/installation_commands.vue | 55 - .../details/components/installation_title.vue | 38 - .../details/components/maven_installation.vue | 153 --- .../details/components/npm_installation.vue | 103 -- .../details/components/nuget_installation.vue | 58 - .../packages/details/components/package_files.vue | 165 --- .../details/components/package_history.vue | 168 --- .../packages/details/components/package_title.vue | 113 -- .../details/components/pypi_installation.vue | 71 - .../javascripts/packages/details/constants.js | 55 - app/assets/javascripts/packages/details/index.js | 32 - .../javascripts/packages/details/store/actions.js | 59 - .../javascripts/packages/details/store/getters.js | 140 -- .../javascripts/packages/details/store/index.js | 18 - .../packages/details/store/mutation_types.js | 3 - .../packages/details/store/mutations.js | 17 - app/assets/javascripts/packages/details/utils.js | 10 - .../javascripts/packages/shared/constants.js | 5 +- .../dependency_proxy/app.vue | 105 ++ .../dependency_proxy/graphql/index.js | 14 + .../get_dependency_proxy_details.query.graphql | 10 + .../dependency_proxy/index.js | 26 + .../components/details_title.vue | 82 -- .../components/terraform_installation.vue | 65 - .../details/components/app.vue | 240 ++++ .../details/components/details_title.vue | 82 ++ .../details/components/file_sha.vue | 41 + .../details/components/package_files.vue | 165 +++ .../details/components/package_history.vue | 165 +++ .../details/components/terraform_installation.vue | 65 + .../infrastructure_registry/details/constants.js | 5 + .../details/store/actions.js | 59 + .../details/store/getters.js | 3 + .../infrastructure_registry/details/store/index.js | 18 + .../details/store/mutation_types.js | 3 + .../details/store/mutations.js | 17 + .../infrastructure_registry/details_app_bundle.js | 4 +- .../components/details/metadata/nuget.vue | 15 +- .../components/details/npm_installation.vue | 30 +- .../components/details/package_history.vue | 19 +- .../package_registry/components/list/app.vue | 134 ++ .../components/list/package_list_row.vue | 151 ++ .../components/list/package_search.vue | 81 +- .../components/list/packages_list_app.vue | 132 -- .../components/list/publish_method.vue | 61 + .../package_registry/constants.js | 12 +- .../fragments/package_data.fragment.graphql | 27 + .../graphql/queries/get_packages.query.graphql | 27 + .../package_registry/pages/list.js | 10 +- .../settings/group/bundle.js | 1 + .../group/components/dependency_proxy_settings.vue | 110 ++ .../group/components/duplicates_settings.vue | 2 + .../group/components/group_settings_app.vue | 167 +-- .../group/components/packages_settings.vue | 139 ++ .../settings/group/constants.js | 8 +- ...date_dependency_proxy_settings.mutation.graphql | 8 + .../get_group_packages_settings.query.graphql | 3 + .../settings/group/graphql/utils/cache_update.js | 13 +- .../group/graphql/utils/optimistic_responses.js | 12 + .../project/components/registry_settings_app.vue | 2 +- .../settings/project/constants.js | 1 + .../packages_and_registries/shared/constants.js | 2 + .../metrics_and_profiling/usage_statistics.js | 2 +- .../admin/projects/components/namespace_select.vue | 143 ++ .../javascripts/pages/admin/projects/index.js | 38 +- .../pages/admin/serverless/domains/index.js | 17 - .../javascripts/pages/admin/topics/edit/index.js | 8 + .../javascripts/pages/admin/topics/new/index.js | 8 + .../pages/groups/dependency_proxies/index.js | 14 +- .../pages/groups/group_members/index.js | 2 +- .../pages/groups/packages/index/index.js | 13 +- .../components/bulk_imports_history_app.vue | 176 +++ .../pages/import/bulk_imports/history/index.js | 15 + .../bulk_imports/history/utils/error_messages.js | 3 + app/assets/javascripts/pages/profiles/index.js | 2 + .../pages/profiles/password_prompt/constants.js | 9 + .../pages/profiles/password_prompt/index.js | 58 + .../password_prompt/password_prompt_modal.vue | 82 ++ .../pages/projects/cluster_agents/show/index.js | 3 + .../pages/projects/clusters/index/index.js | 2 +- .../pages/projects/new/components/app.vue | 124 -- .../components/new_project_push_tip_popover.vue | 66 - .../new/components/new_project_url_select.vue | 98 -- app/assets/javascripts/pages/projects/new/index.js | 66 +- ...es_where_user_can_create_projects.query.graphql | 14 - .../projects/packages/packages/index/index.js | 11 +- .../shared/components/timezone_dropdown.js | 34 +- .../pages/projects/project_members/index.js | 2 +- .../javascripts/pages/projects/wikis/diff/index.js | 3 + .../javascripts/pages/projects/wikis/edit/index.js | 3 + .../pages/projects/wikis/git_access/index.js | 3 + .../javascripts/pages/projects/wikis/index.js | 6 +- .../javascripts/pages/projects/wikis/show/index.js | 3 + .../pages/sessions/new/oauth_remember_me.js | 2 +- .../pages/shared/mount_runner_instructions.js | 7 +- .../javascripts/pages/shared/wikis/async_edit.js | 11 + app/assets/javascripts/pages/shared/wikis/edit.js | 88 ++ app/assets/javascripts/pages/shared/wikis/index.js | 92 -- app/assets/javascripts/pages/shared/wikis/wikis.js | 6 + .../components/performance_bar_app.vue | 21 + app/assets/javascripts/persistent_user_callouts.js | 1 + .../components/editor/text_editor.vue | 15 +- .../header/pipeline_editor_mini_graph.vue | 49 + .../components/header/pipeline_status.vue | 31 +- .../components/ui/pipeline_editor_empty_state.vue | 14 +- .../graphql/queries/client/pipeline.graphql | 19 + .../pipeline_editor/pipeline_editor_home.vue | 7 +- .../pipelines/components/graph/job_item.vue | 12 +- .../pipelines_list/pipeline_multi_actions.vue | 7 +- .../pipelines_list/pipeline_stop_modal.vue | 19 +- .../pipelines_list/pipelines_artifacts.vue | 14 +- .../components/pipelines_list/tokens/constants.js | 24 +- app/assets/javascripts/profile/profile.js | 1 + .../javascripts/projects/new/components/app.vue | 124 ++ .../components/new_project_push_tip_popover.vue | 66 + .../new/components/new_project_url_select.vue | 163 +++ app/assets/javascripts/projects/new/event_hub.js | 3 + app/assets/javascripts/projects/new/index.js | 66 + ...es_where_user_can_create_projects.query.graphql | 14 + app/assets/javascripts/projects/project_new.js | 58 +- .../projects/settings/access_dropdown.js | 53 +- .../projects/settings/api/access_dropdown_api.js | 45 + .../settings/components/access_dropdown.vue | 409 ++++++ .../projects/settings/init_access_dropdown.js | 39 + .../prometheus_alerts/components/reset_key.vue | 36 +- .../components/details_page/tags_list_row.vue | 45 +- .../registry/explorer/constants/common.js | 3 +- .../registry/explorer/constants/details.js | 6 +- .../registry/explorer/constants/list.js | 2 +- app/assets/javascripts/registry/explorer/index.js | 4 + .../javascripts/registry/explorer/pages/list.vue | 5 +- .../components/add_issuable_form.vue | 18 +- .../related_issues/components/issue_token.vue | 15 +- .../components/related_issuable_input.vue | 27 +- .../components/related_issues_block.vue | 3 +- .../components/related_issues_list.vue | 6 +- .../components/related_merge_requests.vue | 14 +- .../releases/components/release_block.vue | 10 +- app/assets/javascripts/releases/mount_show.js | 7 +- .../components/codequality_issue_body.vue | 9 +- .../grouped_codequality_reports_app.vue | 6 +- .../reports/codequality_report/store/getters.js | 34 +- .../store/utils/codequality_parser.js | 10 +- .../grouped_test_reports_app.vue | 6 +- .../javascripts/repository/commits_service.js | 65 + .../repository/components/blob_content_viewer.vue | 76 +- .../repository/components/blob_edit.vue | 16 +- .../repository/components/blob_viewers/index.js | 9 +- .../components/blob_viewers/video_viewer.vue | 15 + .../repository/components/breadcrumbs.vue | 45 +- .../repository/components/fork_suggestion.vue | 45 + .../repository/components/new_directory_modal.vue | 183 +++ .../repository/components/preview/index.vue | 11 +- .../repository/components/table/index.vue | 45 +- .../repository/components/table/row.vue | 58 +- .../repository/components/tree_content.vue | 22 +- .../repository/components/upload_blob_modal.vue | 1 + app/assets/javascripts/repository/constants.js | 7 + app/assets/javascripts/repository/index.js | 1 + .../repository/queries/blob_info.query.graphql | 5 + app/assets/javascripts/repository/router.js | 21 +- app/assets/javascripts/rest_api.js | 1 + app/assets/javascripts/right_sidebar.js | 2 +- .../runner/admin_runners/admin_runners_app.vue | 29 +- .../components/cells/runner_actions_cell.vue | 20 +- .../runner/components/cells/runner_name_cell.vue | 44 - .../components/cells/runner_summary_cell.vue | 35 + .../runner/components/cells/runner_type_cell.vue | 25 +- .../javascripts/runner/components/runner_list.vue | 14 +- .../javascripts/runner/components/runner_name.vue | 18 + .../components/runner_state_locked_badge.vue | 25 + .../components/runner_state_paused_badge.vue | 25 + .../runner/components/runner_type_badge.vue | 19 +- .../runner/components/runner_type_help.vue | 60 - app/assets/javascripts/runner/constants.js | 8 + .../runner/graphql/get_group_runners.query.graphql | 7 +- .../runner/graphql/get_runners.query.graphql | 1 + .../runner/group_runners/group_runners_app.vue | 33 +- .../search_settings/components/search_settings.vue | 58 +- .../javascripts/search_settings/constants.js | 3 + .../components/feature_card.vue | 1 + .../assignees/uncollapsed_assignee_list.vue | 8 +- .../sidebar/components/labels/sidebar_labels.vue | 33 +- .../components/participants/participants.vue | 4 +- .../components/reviewers/reviewer_avatar_link.vue | 2 +- .../reviewers/uncollapsed_reviewer_list.vue | 5 +- .../components/time_tracking/comparison_pane.vue | 12 +- .../components/time_tracking/spent_only_pane.vue | 31 +- .../sidebar/components/todo_toggle/todo.vue | 2 +- app/assets/javascripts/sidebar/constants.js | 15 + app/assets/javascripts/sidebar/mount_sidebar.js | 2 + .../components/snippet_description_view.vue | 7 +- .../snippets/components/snippet_header.vue | 70 +- app/assets/javascripts/snippets/index.js | 2 + app/assets/javascripts/token_access/index.js | 2 +- app/assets/javascripts/tracking/constants.js | 5 +- .../javascripts/tracking/get_standard_context.js | 4 +- app/assets/javascripts/tracking/tracking.js | 13 +- app/assets/javascripts/tracking/utils.js | 8 +- app/assets/javascripts/user_popovers.js | 1 + .../components/approvals/approvals_summary.vue | 10 +- .../components/extensions/actions.vue | 70 + .../components/extensions/base.vue | 137 +- .../components/extensions/container.js | 53 +- .../components/extensions/index.js | 6 +- .../components/extensions/status_icon.vue | 61 + .../components/mr_widget_header.vue | 14 +- .../components/mr_widget_how_to_merge_modal.vue | 22 +- .../components/mr_widget_pipeline_container.vue | 5 +- .../components/states/commits_header.vue | 43 +- .../components/states/ready_to_merge.vue | 37 +- .../components/states/work_in_progress.vue | 6 +- .../vue_merge_request_widget/constants.js | 97 ++ .../vue_merge_request_widget/extensions/issues.js | 29 +- .../mixins/ready_to_merge.js | 2 +- .../vue_merge_request_widget/mr_widget_options.vue | 32 +- .../stores/mr_widget_store.js | 52 +- .../vue_merge_request_widget/stores/state_maps.js | 10 +- .../vue_shared/components/blob_viewers/mixins.js | 5 + .../components/blob_viewers/simple_viewer.vue | 15 +- .../components/color_picker/color_picker.vue | 4 +- .../content_viewer/viewers/markdown_viewer.vue | 2 +- .../components/dismissible_feedback_alert.vue | 23 +- .../components/dropdown_keyboard_navigation.vue | 81 ++ .../queries/epic.fragment.graphql | 15 + .../queries/search_epics.query.graphql | 16 + .../filtered_search_bar/tokens/base_token.vue | 29 +- .../filtered_search_bar/tokens/epic_token.vue | 138 +- .../components/issue/issue_assignees.vue | 5 +- .../components/issue/related_issuable_item.vue | 13 +- .../components/markdown/apply_suggestion.vue | 18 +- .../vue_shared/components/markdown/field.vue | 2 +- .../components/markdown/suggestion_diff.vue | 4 +- .../components/markdown/suggestion_diff_header.vue | 87 +- .../vue_shared/components/markdown/suggestions.vue | 12 +- .../components/notes/placeholder_note.vue | 13 +- .../components/oncall_schedules_list.vue | 74 - .../project_selector/project_list_item.stories.js | 34 + .../project_selector/project_list_item.vue | 5 +- .../components/sidebar/copyable_field.vue | 2 +- .../sidebar/labels_select_vue/store/mutations.js | 9 +- .../sidebar/labels_select_widget/constants.js | 2 + .../labels_select_widget/dropdown_contents.vue | 114 +- .../dropdown_contents_create_view.vue | 54 +- .../dropdown_contents_labels_view.vue | 137 +- .../graphql/epic_labels.query.graphql | 15 + .../graphql/group_labels.query.graphql | 12 + .../labels_select_widget/labels_select_root.vue | 97 +- .../sidebar/todo_toggle/todo_button.stories.js | 2 +- .../components/upload_dropzone/upload_dropzone.vue | 2 +- .../user_deletion_obstacles/constants.js | 5 + .../user_deletion_obstacles_list.stories.js | 37 + .../user_deletion_obstacles_list.vue | 91 ++ .../components/user_deletion_obstacles/utils.js | 19 + .../components/user_popover/user_popover.vue | 22 +- .../vue_shared/components/web_ide_link.vue | 10 +- .../vue_shared/directives/validation.js | 17 +- .../components/manage_via_mr.vue | 1 + .../security_reports/security_reports_app.vue | 6 +- .../security_reports/store/modules/sast/actions.js | 3 +- .../store/modules/secret_detection/actions.js | 3 +- app/assets/stylesheets/_page_specific_files.scss | 2 - app/assets/stylesheets/application_dark.scss | 72 +- app/assets/stylesheets/bootstrap_migration.scss | 2 +- .../components/batch_comments/review_bar.scss | 53 - .../stylesheets/components/content_editor.scss | 53 +- .../components/design_management/design.scss | 5 - .../design_management/design_version_dropdown.scss | 3 - .../stylesheets/components/project_list_item.scss | 24 - app/assets/stylesheets/framework.scss | 1 - app/assets/stylesheets/framework/banner.scss | 40 - app/assets/stylesheets/framework/blocks.scss | 66 +- app/assets/stylesheets/framework/buttons.scss | 23 - app/assets/stylesheets/framework/common.scss | 16 - .../stylesheets/framework/contextual_sidebar.scss | 2 +- app/assets/stylesheets/framework/diffs.scss | 23 +- app/assets/stylesheets/framework/dropdowns.scss | 38 +- app/assets/stylesheets/framework/forms.scss | 8 - app/assets/stylesheets/framework/job_log.scss | 8 +- .../stylesheets/framework/markdown_area.scss | 4 + app/assets/stylesheets/framework/media_object.scss | 4 - app/assets/stylesheets/framework/mixins.scss | 10 +- app/assets/stylesheets/framework/modal.scss | 37 - app/assets/stylesheets/framework/panels.scss | 4 - .../framework/secondary_navigation_elements.scss | 2 +- app/assets/stylesheets/framework/selects.scss | 12 - app/assets/stylesheets/framework/sidebar.scss | 15 - app/assets/stylesheets/framework/snippets.scss | 5 - app/assets/stylesheets/framework/sortable.scss | 55 - app/assets/stylesheets/framework/tables.scss | 1 + app/assets/stylesheets/framework/typography.scss | 20 +- app/assets/stylesheets/framework/variables.scss | 3 +- app/assets/stylesheets/framework/zen.scss | 9 - .../stylesheets/page_bundles/_ide_mixins.scss | 2 +- .../page_bundles/_ide_theme_overrides.scss | 9 +- app/assets/stylesheets/page_bundles/build.scss | 6 +- .../stylesheets/page_bundles/merge_requests.scss | 9 + app/assets/stylesheets/page_bundles/pipeline.scss | 14 +- app/assets/stylesheets/page_bundles/signup.scss | 8 - app/assets/stylesheets/page_bundles/wiki.scss | 2 +- app/assets/stylesheets/pages/ci_projects.scss | 54 - app/assets/stylesheets/pages/clusters.scss | 151 -- app/assets/stylesheets/pages/commits.scss | 5 - app/assets/stylesheets/pages/environment_logs.scss | 4 +- app/assets/stylesheets/pages/issuable.scss | 147 +- app/assets/stylesheets/pages/issues.scss | 95 +- .../pages/issues/issue_count_badge.scss | 10 - app/assets/stylesheets/pages/login.scss | 11 +- app/assets/stylesheets/pages/merge_requests.scss | 49 +- app/assets/stylesheets/pages/note_form.scss | 6 - app/assets/stylesheets/pages/notes.scss | 44 +- app/assets/stylesheets/pages/notifications.scss | 5 - app/assets/stylesheets/pages/pages.scss | 12 - app/assets/stylesheets/pages/profile.scss | 48 +- .../stylesheets/pages/profiles/preferences.scss | 16 - app/assets/stylesheets/pages/projects.scss | 16 - app/assets/stylesheets/pages/prometheus.scss | 232 ---- app/assets/stylesheets/pages/settings.scss | 31 - app/assets/stylesheets/pages/tree.scss | 5 - app/assets/stylesheets/startup/startup-dark.scss | 172 ++- .../stylesheets/startup/startup-general.scss | 71 +- app/assets/stylesheets/startup/startup-signin.scss | 44 +- app/assets/stylesheets/themes/_dark.scss | 53 +- .../stylesheets/themes/dark_mode_overrides.scss | 116 ++ app/assets/stylesheets/themes/theme_helper.scss | 4 +- app/controllers/admin/dashboard_controller.rb | 9 +- .../admin/instance_review_controller.rb | 2 +- .../admin/serverless/domains_controller.rb | 78 -- app/controllers/admin/topics/avatars_controller.rb | 14 + app/controllers/admin/topics_controller.rb | 57 + app/controllers/application_controller.rb | 30 +- app/controllers/concerns/group_tree.rb | 9 +- app/controllers/concerns/issuable_actions.rb | 6 +- app/controllers/concerns/notes_actions.rb | 2 +- app/controllers/concerns/one_trust_csp.rb | 19 + .../concerns/registry/connection_errors_handler.rb | 38 + app/controllers/dashboard/projects_controller.rb | 2 +- app/controllers/graphql_controller.rb | 8 + app/controllers/groups/boards_controller.rb | 1 + .../dependency_proxy/application_controller.rb | 32 +- .../dependency_proxy_for_containers_controller.rb | 46 +- app/controllers/groups/group_members_controller.rb | 22 +- app/controllers/groups/packages_controller.rb | 4 + .../groups/registry/repositories_controller.rb | 1 + app/controllers/groups/runners_controller.rb | 14 +- .../groups/settings/ci_cd_controller.rb | 5 + app/controllers/health_controller.rb | 2 + app/controllers/help_controller.rb | 1 - app/controllers/import/bulk_imports_controller.rb | 24 +- app/controllers/import/url_controller.rb | 20 + .../jira_connect/app_descriptor_controller.rb | 1 + .../jira_connect/application_controller.rb | 4 + app/controllers/jira_connect/events_controller.rb | 31 +- app/controllers/metrics_controller.rb | 1 + app/controllers/profiles/passwords_controller.rb | 25 +- .../profiles/two_factor_auths_controller.rb | 2 - app/controllers/profiles_controller.rb | 3 +- .../projects/alerting/notifications_controller.rb | 12 + app/controllers/projects/badges_controller.rb | 5 +- app/controllers/projects/blob_controller.rb | 1 + app/controllers/projects/boards_controller.rb | 1 + app/controllers/projects/branches_controller.rb | 5 + .../daily_build_group_report_results_controller.rb | 2 +- .../projects/ci/pipeline_editor_controller.rb | 3 +- .../projects/cluster_agents_controller.rb | 19 + .../projects/google_cloud_controller.rb | 16 + app/controllers/projects/issues_controller.rb | 2 +- app/controllers/projects/jobs_controller.rb | 5 +- .../projects/merge_requests_controller.rb | 20 +- .../projects/packages/packages_controller.rb | 4 + .../projects/project_members_controller.rb | 22 +- .../projects/registry/repositories_controller.rb | 3 +- .../projects/security/configuration_controller.rb | 2 +- .../projects/serverless/functions_controller.rb | 2 +- .../projects/settings/ci_cd_controller.rb | 5 + app/controllers/projects/tags_controller.rb | 12 +- app/controllers/projects/tree_controller.rb | 2 + .../projects/usage_quotas_controller.rb | 1 + app/controllers/projects_controller.rb | 15 +- app/controllers/registrations_controller.rb | 6 + .../repositories/git_http_controller.rb | 7 +- app/controllers/search_controller.rb | 6 + app/controllers/sessions_controller.rb | 1 + app/controllers/uploads_controller.rb | 5 +- .../new_project_sast_enabled_experiment.rb | 15 + .../ci/pipelines_for_merge_request_finder.rb | 17 +- app/finders/clusters/agents_finder.rb | 28 + app/finders/concerns/packages/finder_helper.rb | 6 + app/finders/error_tracking/errors_finder.rb | 7 +- app/finders/issuable_finder.rb | 7 +- app/finders/issuables/label_filter.rb | 42 +- app/finders/issues_finder.rb | 13 + app/finders/members_finder.rb | 15 +- app/finders/packages/group_packages_finder.rb | 4 +- .../members/effective_access_level_finder.rb | 2 +- app/finders/projects/topics_finder.rb | 29 + app/finders/projects_finder.rb | 4 +- app/finders/tags_finder.rb | 5 +- app/graphql/mutations/ci/runner/delete.rb | 2 +- .../mutations/clusters/agent_tokens/create.rb | 69 + .../mutations/clusters/agent_tokens/delete.rb | 35 + app/graphql/mutations/clusters/agents/create.rb | 38 + app/graphql/mutations/clusters/agents/delete.rb | 39 + .../customer_relations/contacts/create.rb | 69 + .../customer_relations/contacts/update.rb | 61 + .../customer_relations/organizations/create.rb | 2 +- .../customer_relations/organizations/update.rb | 2 +- .../dependency_proxy/group_settings/update.rb | 49 + app/graphql/mutations/issues/create.rb | 5 +- .../resolvers/board_list_issues_resolver.rb | 5 +- app/graphql/resolvers/board_list_resolver.rb | 35 + .../resolvers/clusters/agent_tokens_resolver.rb | 25 + app/graphql/resolvers/clusters/agents_resolver.rb | 35 + .../resolvers/concerns/issue_resolver_arguments.rb | 9 +- app/graphql/resolvers/concerns/search_arguments.rb | 18 + app/graphql/resolvers/issues_resolver.rb | 3 +- .../resolvers/kas/agent_configurations_resolver.rb | 32 + .../resolvers/kas/agent_connections_resolver.rb | 41 + app/graphql/resolvers/project_pipeline_resolver.rb | 17 +- .../resolvers/project_pipelines_resolver.rb | 2 + app/graphql/types/base_field.rb | 4 +- app/graphql/types/board_list_type.rb | 15 +- app/graphql/types/ci/runner_status_enum.rb | 15 +- app/graphql/types/ci/runner_type.rb | 15 + app/graphql/types/ci/runner_web_url_edge.rb | 31 + app/graphql/types/clusters/agent_token_type.rb | 52 + app/graphql/types/clusters/agent_type.rb | 67 + app/graphql/types/concerns/find_closest.rb | 14 +- .../container_expiration_policy_older_than_enum.rb | 1 + .../types/container_repository_details_type.rb | 6 + app/graphql/types/container_repository_type.rb | 6 + .../types/customer_relations/contact_type.rb | 2 +- .../types/customer_relations/organization_type.rb | 2 +- .../error_tracking/sentry_detailed_error_type.rb | 3 + app/graphql/types/group_type.rb | 4 + app/graphql/types/issue_type.rb | 3 + .../issues/negated_issue_filter_input_type.rb | 4 + app/graphql/types/kas/agent_configuration_type.rb | 17 + app/graphql/types/kas/agent_connection_type.rb | 32 + app/graphql/types/kas/agent_metadata_type.rb | 33 + .../merge_requests/interacts_with_merge_request.rb | 2 +- app/graphql/types/milestone_wildcard_id_enum.rb | 2 +- app/graphql/types/mutation_type.rb | 7 + app/graphql/types/packages/nuget/metadatum_type.rb | 6 +- app/graphql/types/packages/package_type.rb | 7 + app/graphql/types/permission_types/ci/runner.rb | 13 + app/graphql/types/project_type.rb | 20 + app/graphql/types/query_type.rb | 4 + app/helpers/application_settings_helper.rb | 15 +- app/helpers/avatars_helper.rb | 4 + app/helpers/ci/jobs_helper.rb | 2 +- app/helpers/ci/runners_helper.rb | 2 +- app/helpers/commits_helper.rb | 9 + app/helpers/feature_flags_helper.rb | 11 +- app/helpers/groups_helper.rb | 4 +- app/helpers/hooks_helper.rb | 9 + app/helpers/integrations_helper.rb | 9 - app/helpers/issuables_helper.rb | 2 +- app/helpers/issues_helper.rb | 5 +- app/helpers/one_trust_helper.rb | 10 + app/helpers/packages_helper.rb | 2 + app/helpers/projects/cluster_agents_helper.rb | 10 + app/helpers/projects_helper.rb | 7 +- app/helpers/routing/pseudonymization_helper.rb | 7 +- app/helpers/search_helper.rb | 4 +- app/helpers/startupjs_helper.rb | 7 + app/helpers/tab_helper.rb | 77 +- app/helpers/time_zone_helper.rb | 2 + app/helpers/timeboxes_helper.rb | 13 - app/helpers/user_callouts_helper.rb | 6 + app/helpers/workhorse_helper.rb | 9 + .../analytics/cycle_analytics/issue_stage_event.rb | 5 + .../cycle_analytics/merge_request_stage_event.rb | 5 + app/models/application_setting.rb | 10 +- app/models/application_setting_implementation.rb | 7 + app/models/audit_event.rb | 2 +- app/models/award_emoji.rb | 2 - app/models/bulk_import.rb | 11 +- app/models/bulk_imports/entity.rb | 14 +- app/models/bulk_imports/export.rb | 2 +- app/models/bulk_imports/export_status.rb | 2 +- .../bulk_imports/file_transfer/base_config.rb | 32 +- .../bulk_imports/file_transfer/group_config.rb | 6 +- .../bulk_imports/file_transfer/project_config.rb | 15 +- app/models/bulk_imports/tracker.rb | 2 + app/models/ci/bridge.rb | 2 +- app/models/ci/build.rb | 72 +- app/models/ci/build_metadata.rb | 4 +- app/models/ci/build_need.rb | 2 - app/models/ci/build_runner_session.rb | 2 - app/models/ci/build_trace_chunk.rb | 2 - app/models/ci/build_trace_metadata.rb | 11 +- app/models/ci/job_token/project_scope_link.rb | 2 +- app/models/ci/job_token/scope.rb | 11 +- app/models/ci/pipeline.rb | 31 +- app/models/ci/processable.rb | 3 +- app/models/ci/resource_group.rb | 32 + app/models/ci/runner.rb | 26 +- app/models/ci/runner_namespace.rb | 1 - app/models/ci/runner_project.rb | 1 - app/models/ci/stage.rb | 2 - app/models/clusters/agents/group_authorization.rb | 4 +- .../clusters/agents/implicit_authorization.rb | 5 +- .../clusters/agents/project_authorization.rb | 4 + app/models/clusters/applications/runner.rb | 2 +- app/models/clusters/integrations/elastic_stack.rb | 2 + app/models/clusters/integrations/prometheus.rb | 2 + app/models/commit.rb | 2 +- app/models/commit_status.rb | 3 + .../concerns/analytics/cycle_analytics/stage.rb | 3 +- .../analytics/cycle_analytics/stage_event_model.rb | 54 + app/models/concerns/avatarable.rb | 3 +- app/models/concerns/bulk_insert_safe.rb | 12 +- app/models/concerns/checksummable.rb | 6 +- app/models/concerns/ci/has_status.rb | 1 + app/models/concerns/ci/metadatable.rb | 1 + app/models/concerns/enums/ci/commit_status.rb | 1 + app/models/concerns/has_repository.rb | 4 +- .../concerns/integrations/has_data_fields.rb | 1 - app/models/concerns/issue_available_features.rb | 3 +- .../concerns/packages/debian/distribution.rb | 10 - app/models/concerns/restricted_signup.rb | 42 +- app/models/concerns/routable.rb | 3 +- app/models/concerns/ttl_expirable.rb | 20 + .../concerns/vulnerability_finding_helpers.rb | 9 + app/models/container_expiration_policy.rb | 1 + app/models/custom_emoji.rb | 2 +- app/models/customer_relations/contact.rb | 3 +- app/models/customer_relations/organization.rb | 2 +- app/models/dependency_proxy/blob.rb | 5 +- .../dependency_proxy/image_ttl_group_policy.rb | 2 + app/models/dependency_proxy/manifest.rb | 5 +- app/models/deployment.rb | 62 +- app/models/environment.rb | 15 +- app/models/environment_status.rb | 10 +- app/models/error_tracking/error.rb | 15 +- app/models/error_tracking/error_event.rb | 4 + .../project_error_tracking_setting.rb | 25 + app/models/group.rb | 20 +- app/models/instance_configuration.rb | 12 +- app/models/integrations/open_project.rb | 20 - .../integrations/open_project_tracker_data.rb | 18 - app/models/integrations/unify_circuit.rb | 11 +- app/models/issue.rb | 44 +- app/models/lfs_object.rb | 2 +- app/models/loose_foreign_keys/deleted_record.rb | 44 - app/models/member.rb | 25 +- app/models/members/group_member.rb | 8 +- app/models/members/project_member.rb | 14 +- app/models/merge_request.rb | 32 +- app/models/merge_request_diff.rb | 2 +- app/models/metrics/dashboard/annotation.rb | 6 +- app/models/namespace.rb | 94 +- app/models/namespace/root_storage_statistics.rb | 2 +- app/models/namespaces/user_namespace.rb | 2 +- app/models/note.rb | 4 +- app/models/operations/feature_flag.rb | 37 +- app/models/operations/feature_flag_scope.rb | 66 - app/models/packages/composer/cache_file.rb | 4 +- app/models/packages/helm/file_metadatum.rb | 2 +- app/models/pages_domain.rb | 13 +- app/models/preloaders/merge_requests_preloader.rb | 19 - app/models/product_analytics_event.rb | 2 - app/models/project.rb | 83 +- app/models/project_setting.rb | 4 - app/models/project_statistics.rb | 3 +- app/models/projects/project_topic.rb | 2 +- app/models/projects/topic.rb | 20 + app/models/protected_branch.rb | 2 + app/models/release.rb | 1 + app/models/repository.rb | 10 +- app/models/upload.rb | 12 +- app/models/user.rb | 35 +- app/models/user_callout.rb | 3 +- app/models/user_detail.rb | 7 +- app/models/user_highest_role.rb | 8 +- app/models/user_preference.rb | 1 - app/models/users/credit_card_validation.rb | 13 + app/policies/ci/resource_group_policy.rb | 7 + app/policies/clusters/agent_policy.rb | 9 + app/policies/clusters/agent_token_policy.rb | 9 + app/policies/group_policy.rb | 5 +- app/policies/list_policy.rb | 5 + app/policies/namespace_policy.rb | 29 +- .../namespaces/project_namespace_policy.rb | 9 + app/policies/namespaces/user_namespace_policy.rb | 28 + app/policies/project_policy.rb | 3 + app/presenters/README.md | 95 +- app/presenters/alert_management/alert_presenter.rb | 6 +- app/presenters/award_emoji_presenter.rb | 2 +- app/presenters/blob_presenter.rb | 2 +- app/presenters/blobs/unfold_presenter.rb | 2 + app/presenters/board_presenter.rb | 2 +- app/presenters/ci/bridge_presenter.rb | 3 + app/presenters/ci/build_metadata_presenter.rb | 3 +- app/presenters/ci/build_presenter.rb | 2 + app/presenters/ci/group_variable_presenter.rb | 2 +- app/presenters/ci/legacy_stage_presenter.rb | 2 +- app/presenters/ci/pipeline_presenter.rb | 7 +- app/presenters/ci/processable_presenter.rb | 1 + app/presenters/ci/runner_presenter.rb | 5 +- app/presenters/ci/stage_presenter.rb | 2 +- app/presenters/ci/trigger_presenter.rb | 3 +- app/presenters/ci/variable_presenter.rb | 2 +- app/presenters/clusterable_presenter.rb | 2 +- app/presenters/clusters/cluster_presenter.rb | 41 +- app/presenters/clusters/integration_presenter.rb | 2 +- app/presenters/commit_presenter.rb | 2 +- app/presenters/commit_status_presenter.rb | 23 +- app/presenters/dev_ops_report/metric_presenter.rb | 2 + app/presenters/environment_presenter.rb | 2 +- app/presenters/event_presenter.rb | 3 +- app/presenters/gitlab/blame_presenter.rb | 2 +- app/presenters/group_clusterable_presenter.rb | 5 +- app/presenters/group_member_presenter.rb | 2 + app/presenters/instance_clusterable_presenter.rb | 5 +- app/presenters/invitation_presenter.rb | 2 +- app/presenters/issue_presenter.rb | 3 +- app/presenters/label_presenter.rb | 4 +- app/presenters/member_presenter.rb | 2 +- app/presenters/members_presenter.rb | 2 +- app/presenters/merge_request_presenter.rb | 6 +- app/presenters/milestone_presenter.rb | 2 +- app/presenters/pages_domain_presenter.rb | 4 +- app/presenters/project_clusterable_presenter.rb | 5 +- app/presenters/project_hook_presenter.rb | 2 +- app/presenters/project_member_presenter.rb | 2 + app/presenters/project_presenter.rb | 5 +- .../import_export/project_export_presenter.rb | 10 +- .../projects/settings/deploy_keys_presenter.rb | 2 +- app/presenters/prometheus_alert_presenter.rb | 2 +- app/presenters/release_presenter.rb | 6 +- app/presenters/releases/evidence_presenter.rb | 2 +- app/presenters/search_service_presenter.rb | 3 +- app/presenters/sentry_error_presenter.rb | 2 +- app/presenters/service_hook_presenter.rb | 2 +- app/presenters/snippet_blob_presenter.rb | 2 + app/presenters/snippet_presenter.rb | 5 +- app/presenters/terraform/modules_presenter.rb | 2 +- app/presenters/todo_presenter.rb | 2 +- app/presenters/tree_entry_presenter.rb | 2 +- app/presenters/user_presenter.rb | 2 +- app/presenters/web_hook_log_presenter.rb | 2 +- app/serializers/feature_flag_entity.rb | 4 +- app/serializers/feature_flag_scope_entity.rb | 12 - app/serializers/member_entity.rb | 6 + app/serializers/merge_request_metrics_helper.rb | 28 + .../merge_request_poll_cached_widget_entity.rb | 25 +- app/serializers/merge_request_widget_entity.rb | 5 +- app/services/base_project_service.rb | 10 + app/services/boards/issues/list_service.rb | 2 +- app/services/bulk_import_service.rb | 70 - app/services/bulk_imports/create_service.rb | 83 ++ app/services/bulk_imports/file_export_service.rb | 42 + .../bulk_imports/get_importable_data_service.rb | 45 + .../bulk_imports/relation_export_service.rb | 57 +- app/services/bulk_imports/tree_export_service.rb | 43 + .../bulk_imports/uploads_export_service.rb | 49 + app/services/ci/archive_trace_service.rb | 11 +- app/services/ci/destroy_pipeline_service.rb | 3 + app/services/ci/pipelines/add_job_service.rb | 10 +- app/services/ci/pipelines/hook_service.rb | 34 + app/services/ci/process_pipeline_service.rb | 37 - app/services/ci/queue/build_queue_service.rb | 2 +- app/services/ci/register_job_service.rb | 57 +- .../assign_resource_from_resource_group_service.rb | 2 +- app/services/ci/retry_build_service.rb | 9 +- app/services/ci/retry_pipeline_service.rb | 9 +- .../ci/stuck_builds/drop_pending_service.rb | 42 + .../ci/stuck_builds/drop_running_service.rb | 31 + .../ci/stuck_builds/drop_scheduled_service.rb | 23 + app/services/ci/stuck_builds/drop_service.rb | 62 - app/services/ci/update_build_state_service.rb | 2 + app/services/ci/update_pending_build_service.rb | 2 +- .../clusters/agent_tokens/create_service.rb | 31 + app/services/clusters/agents/create_service.rb | 29 + app/services/clusters/agents/delete_service.rb | 23 + .../agents/refresh_authorization_service.rb | 2 +- app/services/concerns/rate_limited_service.rb | 93 ++ .../cleanup_service.rb | 6 +- .../customer_relations/contacts/base_service.rb | 17 + .../customer_relations/contacts/create_service.rb | 41 + .../customer_relations/contacts/update_service.rb | 24 + .../organizations/base_service.rb | 2 +- .../organizations/create_service.rb | 4 +- .../dependency_proxy/auth_token_service.rb | 12 +- .../find_or_create_blob_service.rb | 4 +- .../find_or_create_manifest_service.rb | 10 +- .../group_settings/update_service.rb | 37 + .../deployments/older_deployments_drop_service.rb | 12 +- app/services/error_tracking/list_issues_service.rb | 9 +- app/services/feature_flags/base_service.rb | 8 + app/services/feature_flags/create_service.rb | 2 - app/services/feature_flags/destroy_service.rb | 2 - app/services/feature_flags/hook_service.rb | 28 + app/services/feature_flags/update_service.rb | 24 +- app/services/groups/transfer_service.rb | 14 + .../import/validate_remote_git_endpoint_service.rb | 76 ++ app/services/issuable/import_csv/base_service.rb | 9 +- app/services/issues/clone_service.rb | 22 +- app/services/issues/close_service.rb | 19 +- app/services/issues/create_service.rb | 4 + app/services/issues/move_service.rb | 22 +- .../relative_position_rebalancing_service.rb | 6 +- app/services/issues/reopen_service.rb | 15 +- .../mergeability/check_base_service.rb | 36 + .../mergeability/check_ci_status_service.rb | 22 + .../mergeability/run_checks_service.rb | 54 + app/services/merge_requests/update_service.rb | 2 +- .../dashboard/annotations/create_service.rb | 6 +- .../dashboard/annotations/delete_service.rb | 4 +- .../users_starred_dashboards/create_service.rb | 4 +- .../packages/composer/create_package_service.rb | 4 - app/services/projects/after_rename_service.rb | 8 +- .../cache_tags_created_at_service.rb | 70 + .../container_repository/cleanup_tags_service.rb | 176 ++- app/services/projects/create_service.rb | 6 + app/services/projects/destroy_service.rb | 24 + .../projects/group_links/update_service.rb | 22 +- app/services/projects/import_service.rb | 23 +- app/services/projects/overwrite_project_service.rb | 4 +- app/services/projects/participants_service.rb | 13 +- app/services/projects/transfer_service.rb | 45 +- app/services/projects/update_pages_service.rb | 10 +- app/services/projects/update_service.rb | 33 +- app/services/search/global_service.rb | 2 +- .../ci_configuration/base_create_service.rb | 6 +- .../ci_configuration/sast_create_service.rb | 17 +- app/services/service_ping/submit_service.rb | 2 +- app/services/terraform/remote_state_handler.rb | 4 +- .../user_project_access_changed_service.rb | 2 +- app/services/users/update_service.rb | 22 +- .../users/upsert_credit_card_validation_service.rb | 17 + app/uploaders/dependency_proxy/file_uploader.rb | 1 + .../admin/application_settings/_abuse.html.haml | 2 - .../_account_and_limit.html.haml | 18 +- .../admin/application_settings/_ci_cd.html.haml | 7 + .../application_settings/_files_limits.html.haml | 34 - .../application_settings/_help_page.html.haml | 13 +- .../admin/application_settings/_mailgun.html.haml | 2 +- .../_network_rate_limits.html.haml | 33 + .../_package_registry_limits.html.haml | 32 - .../application_settings/_performance.html.haml | 17 +- .../admin/application_settings/_snowplow.html.haml | 2 +- .../admin/application_settings/_spam.html.haml | 49 +- .../admin/application_settings/_terminal.html.haml | 2 +- .../admin/application_settings/_usage.html.haml | 22 +- .../appearances/preview_sign_in.html.haml | 7 +- .../admin/application_settings/general.html.haml | 3 +- .../metrics_and_profiling.html.haml | 2 +- .../admin/application_settings/network.html.haml | 19 +- .../admin/application_settings/reporting.html.haml | 7 +- .../_security_newsletter_callout.html.haml | 14 + app/views/admin/dashboard/index.html.haml | 1 + app/views/admin/hook_logs/_index.html.haml | 40 +- app/views/admin/projects/index.html.haml | 35 +- app/views/admin/projects/show.html.haml | 11 +- app/views/admin/runners/show.html.haml | 2 +- app/views/admin/serverless/domains/_form.html.haml | 99 -- app/views/admin/serverless/domains/index.html.haml | 25 - app/views/admin/sessions/_new_base.html.haml | 2 +- app/views/admin/topics/_form.html.haml | 40 + app/views/admin/topics/_topic.html.haml | 17 + app/views/admin/topics/edit.html.haml | 4 + app/views/admin/topics/index.html.haml | 19 + app/views/admin/topics/new.html.haml | 4 + app/views/admin/users/_access_levels.html.haml | 24 +- app/views/admin/users/_form.html.haml | 6 +- app/views/admin/users/_head.html.haml | 17 +- app/views/admin/users/show.html.haml | 3 +- app/views/authentication/_authenticate.html.haml | 3 + app/views/authentication/_register.html.haml | 4 + .../clusters/_advanced_settings_tab.html.haml | 5 +- app/views/clusters/clusters/_details_tab.html.haml | 5 +- app/views/clusters/clusters/_health_tab.html.haml | 5 +- .../clusters/clusters/_integrations_tab.html.haml | 8 +- app/views/clusters/clusters/_namespace.html.haml | 3 +- app/views/clusters/clusters/aws/_new.html.haml | 4 +- app/views/clusters/clusters/show.html.haml | 17 +- app/views/dashboard/_activity_head.html.haml | 14 +- app/views/dashboard/_groups_head.html.haml | 10 +- app/views/devise/confirmations/almost_there.haml | 11 +- .../_confirmation_instructions_secondary.text.erb | 2 +- app/views/devise/passwords/edit.html.haml | 4 +- app/views/devise/registrations/new.html.haml | 1 + app/views/devise/sessions/_new_base.html.haml | 8 +- app/views/devise/sessions/_new_crowd.html.haml | 2 +- app/views/devise/sessions/_new_ldap.html.haml | 2 +- app/views/devise/sessions/new.html.haml | 1 + app/views/devise/shared/_omniauth_box.html.haml | 10 +- app/views/devise/shared/_signup_box.html.haml | 1 + .../shared/_signup_omniauth_provider_list.haml | 8 +- .../devise/shared/_signup_omniauth_providers.haml | 2 +- .../shared/_signup_omniauth_providers_top.haml | 2 +- app/views/groups/_group_admin_settings.html.haml | 2 +- app/views/groups/_home_panel.html.haml | 12 +- ...ort_group_from_another_instance_panel.html.haml | 13 +- app/views/groups/dependency_proxies/_url.html.haml | 12 - app/views/groups/dependency_proxies/show.html.haml | 31 +- app/views/groups/edit.html.haml | 7 +- app/views/groups/issues.html.haml | 2 +- .../groups/registry/repositories/index.html.haml | 3 +- app/views/groups/runners/_runner.html.haml | 2 +- app/views/groups/settings/_general.html.haml | 3 +- app/views/groups/settings/_lfs.html.haml | 4 +- app/views/groups/settings/_permissions.html.haml | 6 +- .../groups/settings/_two_factor_auth.html.haml | 10 +- .../packages_and_registries/show.html.haml | 5 +- .../instance_configuration/_gitlab_pages.html.haml | 2 +- .../instance_configuration/_rate_limits.html.haml | 1 + app/views/import/_githubish_status.html.haml | 2 +- app/views/import/bitbucket_server/new.html.haml | 2 +- app/views/import/bulk_imports/history.html.haml | 6 + app/views/import/fogbugz/new.html.haml | 2 +- app/views/import/fogbugz/new_user_map.html.haml | 2 +- app/views/import/gitea/new.html.haml | 2 +- app/views/import/github/new.html.haml | 2 +- app/views/import/gitlab_projects/new.html.haml | 2 +- app/views/import/manifest/new.html.haml | 2 +- app/views/import/phabricator/new.html.haml | 2 +- app/views/layouts/_one_trust.html.haml | 16 + app/views/layouts/_page.html.haml | 1 + app/views/layouts/_startup_js.html.haml | 22 +- app/views/layouts/header/_default.html.haml | 3 +- app/views/layouts/nav/_breadcrumbs.html.haml | 3 +- app/views/layouts/nav/sidebar/_admin.html.haml | 13 +- app/views/layouts/nav/sidebar/_profile.html.haml | 2 +- app/views/profiles/_email_settings.html.haml | 3 + app/views/profiles/passwords/edit.html.haml | 10 +- app/views/profiles/passwords/new.html.haml | 10 +- app/views/profiles/show.html.haml | 8 +- app/views/profiles/two_factor_auths/show.html.haml | 2 +- app/views/projects/_files.html.haml | 3 +- app/views/projects/_home_panel.html.haml | 9 +- app/views/projects/_import_project_pane.html.haml | 2 +- app/views/projects/_new_project_fields.html.haml | 46 +- app/views/projects/blob/show.html.haml | 1 + app/views/projects/branches/index.html.haml | 24 +- app/views/projects/branches/new.html.haml | 1 + .../projects/ci/pipeline_editor/show.html.haml | 2 + app/views/projects/cluster_agents/show.html.haml | 4 + app/views/projects/commits/_commit.html.haml | 10 +- .../projects/deployments/_deployment.html.haml | 2 +- app/views/projects/feature_flags/edit.html.haml | 8 +- app/views/projects/google_cloud/index.html.haml | 83 ++ app/views/projects/hook_logs/_index.html.haml | 42 +- app/views/projects/hook_logs/show.html.haml | 4 +- app/views/projects/issues/_nav_btns.html.haml | 5 +- .../projects/issues/_related_branches.html.haml | 4 +- .../projects/issues/_related_issues.html.haml | 1 - .../issues/_related_issues_block.html.haml | 5 - .../projects/merge_requests/_mr_title.html.haml | 10 +- .../projects/merge_requests/_nav_btns.html.haml | 6 +- .../projects/merge_requests/_widget.html.haml | 2 +- .../merge_requests/conflicts/show.html.haml | 2 +- app/views/projects/merge_requests/show.html.haml | 2 + app/views/projects/mirrors/_mirror_repos.html.haml | 4 +- .../projects/mirrors/_mirror_repos_push.html.haml | 2 +- app/views/projects/pipelines/_with_tabs.html.haml | 6 +- .../projects/product_analytics/test.html.haml | 1 + .../projects/registry/repositories/index.html.haml | 3 +- .../settings/operations/_error_tracking.html.haml | 1 + app/views/projects/snippets/show.html.haml | 2 +- app/views/projects/tags/index.html.haml | 3 + app/views/projects/tags/new.html.haml | 1 + app/views/projects/tree/show.html.haml | 1 + app/views/projects/usage_quotas/index.html.haml | 2 +- app/views/search/results/_issuable.html.haml | 7 +- app/views/shared/_import_form.html.haml | 11 +- app/views/shared/_milestones_filter.html.haml | 28 +- app/views/shared/_web_ide_path.html.haml | 4 + app/views/shared/boards/_show.html.haml | 2 +- app/views/shared/builds/_build_output.html.haml | 2 +- app/views/shared/builds/_tabs.html.haml | 41 +- app/views/shared/deploy_tokens/_form.html.haml | 1 - app/views/shared/empty_states/_topics.html.haml | 7 + .../shared/errors/_gitaly_unavailable.html.haml | 8 + .../hook_logs/_recent_deliveries_table.html.haml | 34 + app/views/shared/hook_logs/_status_label.html.haml | 2 +- app/views/shared/integrations/_tabs.html.haml | 23 +- app/views/shared/issuable/_nav.html.haml | 24 +- app/views/shared/issuable/_search_bar.html.haml | 2 +- app/views/shared/issuable/_sidebar.html.haml | 11 +- app/views/shared/issuable/nav_links/_all.html.haml | 5 +- app/views/shared/issue_type/_emoji_block.html.haml | 2 +- app/views/shared/milestones/_sidebar.html.haml | 6 +- app/views/shared/notes/_comment_button.html.haml | 29 +- app/views/shared/notes/_hints.html.haml | 56 +- app/views/shared/notes/_notes_with_form.html.haml | 1 + app/views/shared/topics/_search_form.html.haml | 7 + app/views/shared/web_hooks/_hook.html.haml | 6 +- app/views/shared/wikis/edit.html.haml | 2 +- app/views/snippets/show.html.haml | 2 +- app/views/users/show.html.haml | 10 +- app/workers/all_queues.yml | 100 +- .../project_recalculate_per_user_worker.rb | 25 + .../project_recalculate_worker.rb | 4 +- .../user_refresh_from_replica_worker.rb | 2 - .../user_refresh_over_user_range_worker.rb | 5 +- app/workers/bulk_import_worker.rb | 2 +- app/workers/bulk_imports/export_request_worker.rb | 5 +- app/workers/bulk_imports/pipeline_worker.rb | 32 +- app/workers/ci/build_finished_worker.rb | 10 +- .../ci/create_downstream_pipeline_worker.rb | 19 + app/workers/ci/delete_unit_tests_worker.rb | 2 +- .../pipeline_artifacts/expire_artifacts_worker.rb | 2 +- app/workers/ci/stuck_builds/drop_running_worker.rb | 34 + .../ci/stuck_builds/drop_scheduled_worker.rb | 34 + app/workers/cleanup_container_repository_worker.rb | 4 +- .../concerns/dependency_proxy/cleanup_worker.rb | 63 + .../gitlab/github_import/object_importer.rb | 11 +- app/workers/concerns/worker_attributes.rb | 8 +- .../cleanup_container_repository_worker.rb | 17 +- app/workers/container_expiration_policy_worker.rb | 2 - app/workers/create_note_diff_file_worker.rb | 6 +- .../database/drop_detached_partitions_worker.rb | 2 +- .../dependency_proxy/cleanup_blob_worker.rb | 40 + .../dependency_proxy/cleanup_manifest_worker.rb | 40 + .../image_ttl_group_policy_worker.rb | 70 + app/workers/expire_build_artifacts_worker.rb | 2 +- .../expire_build_instance_artifacts_worker.rb | 2 +- app/workers/expire_job_cache_worker.rb | 8 +- .../github_import/stage/finish_import_worker.rb | 28 +- .../github_import/stage/import_base_data_worker.rb | 16 + .../stage/import_pull_requests_worker.rb | 16 + .../stage/import_repository_worker.rb | 11 + app/workers/issue_placement_worker.rb | 2 +- .../in_product_marketing_emails_worker.rb | 2 +- .../namespaces/onboarding_issue_created_worker.rb | 2 +- .../onboarding_pipeline_created_worker.rb | 2 +- .../namespaces/onboarding_progress_worker.rb | 2 +- .../namespaces/onboarding_user_added_worker.rb | 2 +- .../packages/composer/cache_cleanup_worker.rb | 14 +- .../packages/composer/cache_update_worker.rb | 12 +- .../debian/generate_distribution_worker.rb | 2 +- app/workers/pages_remove_worker.rb | 16 - app/workers/pipeline_hooks_worker.rb | 7 +- app/workers/pipeline_process_worker.rb | 2 +- app/workers/run_pipeline_schedule_worker.rb | 11 +- app/workers/stuck_ci_jobs_worker.rb | 21 +- 1196 files changed, 19229 insertions(+), 10182 deletions(-) create mode 100644 app/assets/images/logos/zentao.svg create mode 100644 app/assets/javascripts/api/bulk_imports_api.js create mode 100644 app/assets/javascripts/boards/graphql.js create mode 100644 app/assets/javascripts/clusters/agents/components/show.vue create mode 100644 app/assets/javascripts/clusters/agents/components/token_table.vue create mode 100644 app/assets/javascripts/clusters/agents/constants.js create mode 100644 app/assets/javascripts/clusters/agents/graphql/fragments/cluster_agent_token.fragment.graphql create mode 100644 app/assets/javascripts/clusters/agents/graphql/queries/get_cluster_agent.query.graphql create mode 100644 app/assets/javascripts/clusters/agents/index.js create mode 100644 app/assets/javascripts/clusters_list/clusters_util.js create mode 100644 app/assets/javascripts/clusters_list/components/agent_empty_state.vue create mode 100644 app/assets/javascripts/clusters_list/components/agent_table.vue create mode 100644 app/assets/javascripts/clusters_list/components/agents.vue create mode 100644 app/assets/javascripts/clusters_list/components/available_agents_dropdown.vue create mode 100644 app/assets/javascripts/clusters_list/components/install_agent_modal.vue create mode 100644 app/assets/javascripts/clusters_list/graphql/mutations/create_agent.mutation.graphql create mode 100644 app/assets/javascripts/clusters_list/graphql/mutations/create_agent_token.mutation.graphql create mode 100644 app/assets/javascripts/clusters_list/graphql/queries/agent_configurations.query.graphql create mode 100644 app/assets/javascripts/clusters_list/graphql/queries/get_agents.query.graphql create mode 100644 app/assets/javascripts/clusters_list/load_agents.js delete mode 100644 app/assets/javascripts/comment_type_toggle.js create mode 100644 app/assets/javascripts/content_editor/components/wrappers/details.vue create mode 100644 app/assets/javascripts/content_editor/components/wrappers/frontmatter.vue create mode 100644 app/assets/javascripts/content_editor/extensions/color_chip.js create mode 100644 app/assets/javascripts/content_editor/extensions/details.js create mode 100644 app/assets/javascripts/content_editor/extensions/details_content.js create mode 100644 app/assets/javascripts/content_editor/extensions/frontmatter.js create mode 100644 app/assets/javascripts/content_editor/extensions/math_inline.js create mode 100644 app/assets/javascripts/content_editor/extensions/table_of_contents.js create mode 100644 app/assets/javascripts/content_editor/extensions/word_break.js delete mode 100644 app/assets/javascripts/dependency_proxy.js create mode 100644 app/assets/javascripts/diffs/utils/tree_worker_utils.js delete mode 100644 app/assets/javascripts/diffs/utils/workers.js delete mode 100644 app/assets/javascripts/droplab/constants.js delete mode 100644 app/assets/javascripts/droplab/drop_down.js delete mode 100644 app/assets/javascripts/droplab/drop_lab.js delete mode 100644 app/assets/javascripts/droplab/hook.js delete mode 100644 app/assets/javascripts/droplab/hook_button.js delete mode 100644 app/assets/javascripts/droplab/hook_input.js delete mode 100644 app/assets/javascripts/droplab/keyboard.js delete mode 100644 app/assets/javascripts/droplab/plugins/ajax.js delete mode 100644 app/assets/javascripts/droplab/plugins/ajax_filter.js delete mode 100644 app/assets/javascripts/droplab/plugins/filter.js delete mode 100644 app/assets/javascripts/droplab/plugins/input_setter.js delete mode 100644 app/assets/javascripts/droplab/utils.js create mode 100644 app/assets/javascripts/editor/schema/NOTICE create mode 100644 app/assets/javascripts/editor/schema/ci.json create mode 100644 app/assets/javascripts/filtered_search/droplab/constants.js create mode 100644 app/assets/javascripts/filtered_search/droplab/drop_down.js create mode 100644 app/assets/javascripts/filtered_search/droplab/drop_lab_deprecated.js create mode 100644 app/assets/javascripts/filtered_search/droplab/hook.js create mode 100644 app/assets/javascripts/filtered_search/droplab/hook_button.js create mode 100644 app/assets/javascripts/filtered_search/droplab/hook_input.js create mode 100644 app/assets/javascripts/filtered_search/droplab/keyboard.js create mode 100644 app/assets/javascripts/filtered_search/droplab/plugins/ajax.js create mode 100644 app/assets/javascripts/filtered_search/droplab/plugins/ajax_filter.js create mode 100644 app/assets/javascripts/filtered_search/droplab/plugins/filter.js create mode 100644 app/assets/javascripts/filtered_search/droplab/plugins/input_setter.js create mode 100644 app/assets/javascripts/filtered_search/droplab/utils.js create mode 100644 app/assets/javascripts/graphql_shared/fragments/milestone.fragment.graphql create mode 100644 app/assets/javascripts/header_search/components/header_search_autocomplete_items.vue create mode 100644 app/assets/javascripts/import_entities/components/pagination_bar.vue create mode 100644 app/assets/javascripts/integrations/constants.js delete mode 100644 app/assets/javascripts/integrations/edit/constants.js create mode 100644 app/assets/javascripts/issues_list/components/new_issue_dropdown.vue create mode 100644 app/assets/javascripts/issues_list/queries/search_projects.query.graphql create mode 100644 app/assets/javascripts/lib/apollo/suppress_network_errors_during_navigation_link.js create mode 100644 app/assets/javascripts/lib/utils/is_navigating_away.js delete mode 100644 app/assets/javascripts/members/components/table/expires_at.vue delete mode 100644 app/assets/javascripts/namespace_select.js delete mode 100644 app/assets/javascripts/packages/details/components/additional_metadata.vue delete mode 100644 app/assets/javascripts/packages/details/components/app.vue delete mode 100644 app/assets/javascripts/packages/details/components/composer_installation.vue delete mode 100644 app/assets/javascripts/packages/details/components/conan_installation.vue delete mode 100644 app/assets/javascripts/packages/details/components/dependency_row.vue delete mode 100644 app/assets/javascripts/packages/details/components/file_sha.vue delete mode 100644 app/assets/javascripts/packages/details/components/installation_commands.vue delete mode 100644 app/assets/javascripts/packages/details/components/installation_title.vue delete mode 100644 app/assets/javascripts/packages/details/components/maven_installation.vue delete mode 100644 app/assets/javascripts/packages/details/components/npm_installation.vue delete mode 100644 app/assets/javascripts/packages/details/components/nuget_installation.vue delete mode 100644 app/assets/javascripts/packages/details/components/package_files.vue delete mode 100644 app/assets/javascripts/packages/details/components/package_history.vue delete mode 100644 app/assets/javascripts/packages/details/components/package_title.vue delete mode 100644 app/assets/javascripts/packages/details/components/pypi_installation.vue delete mode 100644 app/assets/javascripts/packages/details/constants.js delete mode 100644 app/assets/javascripts/packages/details/index.js delete mode 100644 app/assets/javascripts/packages/details/store/actions.js delete mode 100644 app/assets/javascripts/packages/details/store/getters.js delete mode 100644 app/assets/javascripts/packages/details/store/index.js delete mode 100644 app/assets/javascripts/packages/details/store/mutation_types.js delete mode 100644 app/assets/javascripts/packages/details/store/mutations.js delete mode 100644 app/assets/javascripts/packages/details/utils.js create mode 100644 app/assets/javascripts/packages_and_registries/dependency_proxy/app.vue create mode 100644 app/assets/javascripts/packages_and_registries/dependency_proxy/graphql/index.js create mode 100644 app/assets/javascripts/packages_and_registries/dependency_proxy/graphql/queries/get_dependency_proxy_details.query.graphql create mode 100644 app/assets/javascripts/packages_and_registries/dependency_proxy/index.js delete mode 100644 app/assets/javascripts/packages_and_registries/infrastructure_registry/components/details_title.vue delete mode 100644 app/assets/javascripts/packages_and_registries/infrastructure_registry/components/terraform_installation.vue create mode 100644 app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/app.vue create mode 100644 app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/details_title.vue create mode 100644 app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/file_sha.vue create mode 100644 app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/package_files.vue create mode 100644 app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/package_history.vue create mode 100644 app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/terraform_installation.vue create mode 100644 app/assets/javascripts/packages_and_registries/infrastructure_registry/details/constants.js create mode 100644 app/assets/javascripts/packages_and_registries/infrastructure_registry/details/store/actions.js create mode 100644 app/assets/javascripts/packages_and_registries/infrastructure_registry/details/store/getters.js create mode 100644 app/assets/javascripts/packages_and_registries/infrastructure_registry/details/store/index.js create mode 100644 app/assets/javascripts/packages_and_registries/infrastructure_registry/details/store/mutation_types.js create mode 100644 app/assets/javascripts/packages_and_registries/infrastructure_registry/details/store/mutations.js create mode 100644 app/assets/javascripts/packages_and_registries/package_registry/components/list/app.vue create mode 100644 app/assets/javascripts/packages_and_registries/package_registry/components/list/package_list_row.vue delete mode 100644 app/assets/javascripts/packages_and_registries/package_registry/components/list/packages_list_app.vue create mode 100644 app/assets/javascripts/packages_and_registries/package_registry/components/list/publish_method.vue create mode 100644 app/assets/javascripts/packages_and_registries/package_registry/graphql/fragments/package_data.fragment.graphql create mode 100644 app/assets/javascripts/packages_and_registries/package_registry/graphql/queries/get_packages.query.graphql create mode 100644 app/assets/javascripts/packages_and_registries/settings/group/components/dependency_proxy_settings.vue create mode 100644 app/assets/javascripts/packages_and_registries/settings/group/components/packages_settings.vue create mode 100644 app/assets/javascripts/packages_and_registries/settings/group/graphql/mutations/update_dependency_proxy_settings.mutation.graphql create mode 100644 app/assets/javascripts/pages/admin/projects/components/namespace_select.vue delete mode 100644 app/assets/javascripts/pages/admin/serverless/domains/index.js create mode 100644 app/assets/javascripts/pages/admin/topics/edit/index.js create mode 100644 app/assets/javascripts/pages/admin/topics/new/index.js create mode 100644 app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue create mode 100644 app/assets/javascripts/pages/import/bulk_imports/history/index.js create mode 100644 app/assets/javascripts/pages/import/bulk_imports/history/utils/error_messages.js create mode 100644 app/assets/javascripts/pages/profiles/password_prompt/constants.js create mode 100644 app/assets/javascripts/pages/profiles/password_prompt/index.js create mode 100644 app/assets/javascripts/pages/profiles/password_prompt/password_prompt_modal.vue create mode 100644 app/assets/javascripts/pages/projects/cluster_agents/show/index.js delete mode 100644 app/assets/javascripts/pages/projects/new/components/app.vue delete mode 100644 app/assets/javascripts/pages/projects/new/components/new_project_push_tip_popover.vue delete mode 100644 app/assets/javascripts/pages/projects/new/components/new_project_url_select.vue delete mode 100644 app/assets/javascripts/pages/projects/new/queries/search_namespaces_where_user_can_create_projects.query.graphql create mode 100644 app/assets/javascripts/pages/projects/wikis/diff/index.js create mode 100644 app/assets/javascripts/pages/projects/wikis/edit/index.js create mode 100644 app/assets/javascripts/pages/projects/wikis/git_access/index.js create mode 100644 app/assets/javascripts/pages/projects/wikis/show/index.js create mode 100644 app/assets/javascripts/pages/shared/wikis/async_edit.js create mode 100644 app/assets/javascripts/pages/shared/wikis/edit.js delete mode 100644 app/assets/javascripts/pages/shared/wikis/index.js create mode 100644 app/assets/javascripts/pipeline_editor/components/header/pipeline_editor_mini_graph.vue create mode 100644 app/assets/javascripts/projects/new/components/app.vue create mode 100644 app/assets/javascripts/projects/new/components/new_project_push_tip_popover.vue create mode 100644 app/assets/javascripts/projects/new/components/new_project_url_select.vue create mode 100644 app/assets/javascripts/projects/new/event_hub.js create mode 100644 app/assets/javascripts/projects/new/index.js create mode 100644 app/assets/javascripts/projects/new/queries/search_namespaces_where_user_can_create_projects.query.graphql create mode 100644 app/assets/javascripts/projects/settings/api/access_dropdown_api.js create mode 100644 app/assets/javascripts/projects/settings/components/access_dropdown.vue create mode 100644 app/assets/javascripts/projects/settings/init_access_dropdown.js create mode 100644 app/assets/javascripts/repository/commits_service.js create mode 100644 app/assets/javascripts/repository/components/blob_viewers/video_viewer.vue create mode 100644 app/assets/javascripts/repository/components/fork_suggestion.vue create mode 100644 app/assets/javascripts/repository/components/new_directory_modal.vue delete mode 100644 app/assets/javascripts/runner/components/cells/runner_name_cell.vue create mode 100644 app/assets/javascripts/runner/components/cells/runner_summary_cell.vue create mode 100644 app/assets/javascripts/runner/components/runner_name.vue create mode 100644 app/assets/javascripts/runner/components/runner_state_locked_badge.vue create mode 100644 app/assets/javascripts/runner/components/runner_state_paused_badge.vue delete mode 100644 app/assets/javascripts/runner/components/runner_type_help.vue create mode 100644 app/assets/javascripts/vue_merge_request_widget/components/extensions/actions.vue create mode 100644 app/assets/javascripts/vue_merge_request_widget/components/extensions/status_icon.vue create mode 100644 app/assets/javascripts/vue_shared/components/dropdown_keyboard_navigation.vue create mode 100644 app/assets/javascripts/vue_shared/components/filtered_search_bar/queries/epic.fragment.graphql create mode 100644 app/assets/javascripts/vue_shared/components/filtered_search_bar/queries/search_epics.query.graphql delete mode 100644 app/assets/javascripts/vue_shared/components/oncall_schedules_list.vue create mode 100644 app/assets/javascripts/vue_shared/components/project_selector/project_list_item.stories.js create mode 100644 app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/graphql/epic_labels.query.graphql create mode 100644 app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/graphql/group_labels.query.graphql create mode 100644 app/assets/javascripts/vue_shared/components/user_deletion_obstacles/constants.js create mode 100644 app/assets/javascripts/vue_shared/components/user_deletion_obstacles/user_deletion_obstacles_list.stories.js create mode 100644 app/assets/javascripts/vue_shared/components/user_deletion_obstacles/user_deletion_obstacles_list.vue create mode 100644 app/assets/javascripts/vue_shared/components/user_deletion_obstacles/utils.js delete mode 100644 app/assets/stylesheets/components/design_management/design_version_dropdown.scss delete mode 100644 app/assets/stylesheets/components/project_list_item.scss delete mode 100644 app/assets/stylesheets/framework/banner.scss delete mode 100644 app/assets/stylesheets/pages/ci_projects.scss delete mode 100644 app/assets/stylesheets/pages/issues/issue_count_badge.scss create mode 100644 app/assets/stylesheets/themes/dark_mode_overrides.scss delete mode 100644 app/controllers/admin/serverless/domains_controller.rb create mode 100644 app/controllers/admin/topics/avatars_controller.rb create mode 100644 app/controllers/admin/topics_controller.rb create mode 100644 app/controllers/concerns/one_trust_csp.rb create mode 100644 app/controllers/concerns/registry/connection_errors_handler.rb create mode 100644 app/controllers/import/url_controller.rb create mode 100644 app/controllers/projects/cluster_agents_controller.rb create mode 100644 app/controllers/projects/google_cloud_controller.rb create mode 100644 app/experiments/new_project_sast_enabled_experiment.rb create mode 100644 app/finders/clusters/agents_finder.rb create mode 100644 app/finders/projects/topics_finder.rb create mode 100644 app/graphql/mutations/clusters/agent_tokens/create.rb create mode 100644 app/graphql/mutations/clusters/agent_tokens/delete.rb create mode 100644 app/graphql/mutations/clusters/agents/create.rb create mode 100644 app/graphql/mutations/clusters/agents/delete.rb create mode 100644 app/graphql/mutations/customer_relations/contacts/create.rb create mode 100644 app/graphql/mutations/customer_relations/contacts/update.rb create mode 100644 app/graphql/mutations/dependency_proxy/group_settings/update.rb create mode 100644 app/graphql/resolvers/board_list_resolver.rb create mode 100644 app/graphql/resolvers/clusters/agent_tokens_resolver.rb create mode 100644 app/graphql/resolvers/clusters/agents_resolver.rb create mode 100644 app/graphql/resolvers/concerns/search_arguments.rb create mode 100644 app/graphql/resolvers/kas/agent_configurations_resolver.rb create mode 100644 app/graphql/resolvers/kas/agent_connections_resolver.rb create mode 100644 app/graphql/types/ci/runner_web_url_edge.rb create mode 100644 app/graphql/types/clusters/agent_token_type.rb create mode 100644 app/graphql/types/clusters/agent_type.rb create mode 100644 app/graphql/types/kas/agent_configuration_type.rb create mode 100644 app/graphql/types/kas/agent_connection_type.rb create mode 100644 app/graphql/types/kas/agent_metadata_type.rb create mode 100644 app/graphql/types/permission_types/ci/runner.rb create mode 100644 app/helpers/one_trust_helper.rb create mode 100644 app/helpers/projects/cluster_agents_helper.rb create mode 100644 app/models/concerns/analytics/cycle_analytics/stage_event_model.rb create mode 100644 app/models/concerns/ttl_expirable.rb delete mode 100644 app/models/integrations/open_project.rb delete mode 100644 app/models/integrations/open_project_tracker_data.rb delete mode 100644 app/models/operations/feature_flag_scope.rb delete mode 100644 app/models/preloaders/merge_requests_preloader.rb create mode 100644 app/policies/ci/resource_group_policy.rb create mode 100644 app/policies/clusters/agent_policy.rb create mode 100644 app/policies/clusters/agent_token_policy.rb create mode 100644 app/policies/list_policy.rb create mode 100644 app/policies/namespaces/project_namespace_policy.rb create mode 100644 app/policies/namespaces/user_namespace_policy.rb delete mode 100644 app/serializers/feature_flag_scope_entity.rb create mode 100644 app/serializers/merge_request_metrics_helper.rb delete mode 100644 app/services/bulk_import_service.rb create mode 100644 app/services/bulk_imports/create_service.rb create mode 100644 app/services/bulk_imports/file_export_service.rb create mode 100644 app/services/bulk_imports/get_importable_data_service.rb create mode 100644 app/services/bulk_imports/tree_export_service.rb create mode 100644 app/services/bulk_imports/uploads_export_service.rb create mode 100644 app/services/ci/pipelines/hook_service.rb create mode 100644 app/services/ci/stuck_builds/drop_pending_service.rb create mode 100644 app/services/ci/stuck_builds/drop_running_service.rb create mode 100644 app/services/ci/stuck_builds/drop_scheduled_service.rb delete mode 100644 app/services/ci/stuck_builds/drop_service.rb create mode 100644 app/services/clusters/agent_tokens/create_service.rb create mode 100644 app/services/clusters/agents/create_service.rb create mode 100644 app/services/clusters/agents/delete_service.rb create mode 100644 app/services/concerns/rate_limited_service.rb create mode 100644 app/services/customer_relations/contacts/base_service.rb create mode 100644 app/services/customer_relations/contacts/create_service.rb create mode 100644 app/services/customer_relations/contacts/update_service.rb create mode 100644 app/services/dependency_proxy/group_settings/update_service.rb create mode 100644 app/services/feature_flags/hook_service.rb create mode 100644 app/services/import/validate_remote_git_endpoint_service.rb create mode 100644 app/services/merge_requests/mergeability/check_base_service.rb create mode 100644 app/services/merge_requests/mergeability/check_ci_status_service.rb create mode 100644 app/services/merge_requests/mergeability/run_checks_service.rb create mode 100644 app/services/projects/container_repository/cache_tags_created_at_service.rb delete mode 100644 app/views/admin/application_settings/_files_limits.html.haml create mode 100644 app/views/admin/application_settings/_network_rate_limits.html.haml delete mode 100644 app/views/admin/application_settings/_package_registry_limits.html.haml create mode 100644 app/views/admin/dashboard/_security_newsletter_callout.html.haml delete mode 100644 app/views/admin/serverless/domains/_form.html.haml delete mode 100644 app/views/admin/serverless/domains/index.html.haml create mode 100644 app/views/admin/topics/_form.html.haml create mode 100644 app/views/admin/topics/_topic.html.haml create mode 100644 app/views/admin/topics/edit.html.haml create mode 100644 app/views/admin/topics/index.html.haml create mode 100644 app/views/admin/topics/new.html.haml delete mode 100644 app/views/groups/dependency_proxies/_url.html.haml create mode 100644 app/views/import/bulk_imports/history.html.haml create mode 100644 app/views/layouts/_one_trust.html.haml create mode 100644 app/views/projects/cluster_agents/show.html.haml create mode 100644 app/views/projects/google_cloud/index.html.haml delete mode 100644 app/views/projects/issues/_related_issues_block.html.haml create mode 100644 app/views/shared/_web_ide_path.html.haml create mode 100644 app/views/shared/empty_states/_topics.html.haml create mode 100644 app/views/shared/errors/_gitaly_unavailable.html.haml create mode 100644 app/views/shared/hook_logs/_recent_deliveries_table.html.haml create mode 100644 app/views/shared/topics/_search_form.html.haml create mode 100644 app/workers/authorized_project_update/project_recalculate_per_user_worker.rb create mode 100644 app/workers/ci/create_downstream_pipeline_worker.rb create mode 100644 app/workers/ci/stuck_builds/drop_running_worker.rb create mode 100644 app/workers/ci/stuck_builds/drop_scheduled_worker.rb create mode 100644 app/workers/concerns/dependency_proxy/cleanup_worker.rb create mode 100644 app/workers/dependency_proxy/cleanup_blob_worker.rb create mode 100644 app/workers/dependency_proxy/cleanup_manifest_worker.rb create mode 100644 app/workers/dependency_proxy/image_ttl_group_policy_worker.rb delete mode 100644 app/workers/pages_remove_worker.rb (limited to 'app') diff --git a/app/assets/images/logos/zentao.svg b/app/assets/images/logos/zentao.svg new file mode 100644 index 00000000000..d2115b72aee --- /dev/null +++ b/app/assets/images/logos/zentao.svg @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/app/assets/javascripts/access_tokens/index.js b/app/assets/javascripts/access_tokens/index.js index 7f5f0403de6..2cd3a8f12ee 100644 --- a/app/assets/javascripts/access_tokens/index.js +++ b/app/assets/javascripts/access_tokens/index.js @@ -49,7 +49,7 @@ export const initProjectsField = () => { { default: createDefaultClient }, ]) => { const apolloProvider = new VueApollo({ - defaultClient: createDefaultClient(), + defaultClient: createDefaultClient({}, { assumeImmutableResults: true }), }); Vue.use(VueApollo); diff --git a/app/assets/javascripts/admin/users/components/actions/delete.vue b/app/assets/javascripts/admin/users/components/actions/delete.vue index a0f4a4bf382..e6dde5898e7 100644 --- a/app/assets/javascripts/admin/users/components/actions/delete.vue +++ b/app/assets/javascripts/admin/users/components/actions/delete.vue @@ -14,7 +14,7 @@ export default { type: Object, required: true, }, - oncallSchedules: { + userDeletionObstacles: { type: Array, required: false, default: () => [], @@ -29,7 +29,7 @@ export default { :username="username" :paths="paths" :delete-path="paths.delete" - :oncall-schedules="oncallSchedules" + :user-deletion-obstacles="userDeletionObstacles" > diff --git a/app/assets/javascripts/admin/users/components/actions/delete_with_contributions.vue b/app/assets/javascripts/admin/users/components/actions/delete_with_contributions.vue index 02fd3efafa1..bd920a91516 100644 --- a/app/assets/javascripts/admin/users/components/actions/delete_with_contributions.vue +++ b/app/assets/javascripts/admin/users/components/actions/delete_with_contributions.vue @@ -14,7 +14,7 @@ export default { type: Object, required: true, }, - oncallSchedules: { + userDeletionObstacles: { type: Array, required: false, default: () => [], @@ -29,7 +29,7 @@ export default { :username="username" :paths="paths" :delete-path="paths.deleteWithContributions" - :oncall-schedules="oncallSchedules" + :user-deletion-obstacles="userDeletionObstacles" > diff --git a/app/assets/javascripts/admin/users/components/actions/shared/shared_delete_action.vue b/app/assets/javascripts/admin/users/components/actions/shared/shared_delete_action.vue index a1589c9d46d..c9f29b55dbf 100644 --- a/app/assets/javascripts/admin/users/components/actions/shared/shared_delete_action.vue +++ b/app/assets/javascripts/admin/users/components/actions/shared/shared_delete_action.vue @@ -22,7 +22,7 @@ export default { type: String, required: true, }, - oncallSchedules: { + userDeletionObstacles: { type: Array, required: true, }, @@ -34,7 +34,7 @@ export default { 'data-delete-user-url': this.deletePath, 'data-gl-modal-action': this.modalType, 'data-username': this.username, - 'data-oncall-schedules': JSON.stringify(this.oncallSchedules), + 'data-user-deletion-obstacles': JSON.stringify(this.userDeletionObstacles), }; }, }, diff --git a/app/assets/javascripts/admin/users/components/modals/delete_user_modal.vue b/app/assets/javascripts/admin/users/components/modals/delete_user_modal.vue index 413163c8536..ed90343777d 100644 --- a/app/assets/javascripts/admin/users/components/modals/delete_user_modal.vue +++ b/app/assets/javascripts/admin/users/components/modals/delete_user_modal.vue @@ -2,7 +2,7 @@ import { GlModal, GlButton, GlFormInput, GlSprintf } from '@gitlab/ui'; import * as Sentry from '@sentry/browser'; import { s__, sprintf } from '~/locale'; -import OncallSchedulesList from '~/vue_shared/components/oncall_schedules_list.vue'; +import UserDeletionObstaclesList from '~/vue_shared/components/user_deletion_obstacles/user_deletion_obstacles_list.vue'; export default { components: { @@ -10,7 +10,7 @@ export default { GlButton, GlFormInput, GlSprintf, - OncallSchedulesList, + UserDeletionObstaclesList, }, props: { title: { @@ -45,7 +45,7 @@ export default { type: String, required: true, }, - oncallSchedules: { + userDeletionObstacles: { type: String, required: false, default: '[]', @@ -66,9 +66,9 @@ export default { canSubmit() { return this.enteredUsername === this.username; }, - schedules() { + obstacles() { try { - return JSON.parse(this.oncallSchedules); + return JSON.parse(this.userDeletionObstacles); } catch (e) { Sentry.captureException(e); } @@ -112,12 +112,16 @@ export default {

- +

diff --git a/app/assets/javascripts/admin/users/components/user_actions.vue b/app/assets/javascripts/admin/users/components/user_actions.vue index c076e0bedf0..4f4e2947341 100644 --- a/app/assets/javascripts/admin/users/components/user_actions.vue +++ b/app/assets/javascripts/admin/users/components/user_actions.vue @@ -9,6 +9,7 @@ import { } from '@gitlab/ui'; import { convertArrayToCamelCase } from '~/lib/utils/common_utils'; import { capitalizeFirstCharacter } from '~/lib/utils/text_utility'; +import { parseUserDeletionObstacles } from '~/vue_shared/components/user_deletion_obstacles/utils'; import { I18N_USER_ACTIONS } from '../constants'; import { generateUserPaths } from '../utils'; import Actions from './actions'; @@ -72,6 +73,9 @@ export default { href: this.userPaths.edit, }; }, + obstaclesForUserDeletion() { + return parseUserDeletionObstacles(this.user); + }, }, methods: { isLdapAction(action) { @@ -141,7 +145,7 @@ export default { :key="action" :paths="userPaths" :username="user.name" - :oncall-schedules="user.oncallSchedules" + :user-deletion-obstacles="obstaclesForUserDeletion" :data-testid="`delete-${action}`" > {{ $options.i18n[action] }} diff --git a/app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue b/app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue index a490111e13b..0bdb45d35c9 100644 --- a/app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue +++ b/app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue @@ -15,6 +15,8 @@ import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants'; import { n__, s__, __ } from '~/locale'; import getProjects from '../graphql/projects.query.graphql'; +const sortByProjectName = (projects = []) => projects.sort((a, b) => a.name.localeCompare(b.name)); + export default { name: 'ProjectsDropdownFilter', components: { @@ -88,6 +90,9 @@ export default { selectedProjectIds() { return this.selectedProjects.map((p) => p.id); }, + hasSelectedProjects() { + return Boolean(this.selectedProjects.length); + }, availableProjects() { return filterBySearchTerm(this.projects, this.searchTerm); }, @@ -95,6 +100,12 @@ export default { const { loading, availableProjects } = this; return !loading && !availableProjects.length; }, + selectedItems() { + return sortByProjectName(this.selectedProjects); + }, + unselectedItems() { + return this.availableProjects.filter(({ id }) => !this.selectedProjectIds.includes(id)); + }, }, watch: { searchTerm() { @@ -105,44 +116,53 @@ export default { this.search(); }, methods: { + handleUpdatedSelectedProjects() { + this.$emit('selected', this.selectedProjects); + }, search: debounce(function debouncedSearch() { this.fetchData(); }, DEFAULT_DEBOUNCE_AND_THROTTLE_MS), - getSelectedProjects(selectedProject, isMarking) { - return isMarking + getSelectedProjects(selectedProject, isSelected) { + return isSelected ? this.selectedProjects.concat([selectedProject]) : this.selectedProjects.filter((project) => project.id !== selectedProject.id); }, singleSelectedProject(selectedObj, isMarking) { return isMarking ? [selectedObj] : []; }, - setSelectedProjects(selectedObj, isMarking) { + setSelectedProjects(project) { this.selectedProjects = this.multiSelect - ? this.getSelectedProjects(selectedObj, isMarking) - : this.singleSelectedProject(selectedObj, isMarking); + ? this.getSelectedProjects(project, !this.isProjectSelected(project)) + : this.singleSelectedProject(project, !this.isProjectSelected(project)); }, - onClick({ project, isSelected }) { - this.setSelectedProjects(project, !isSelected); - this.$emit('selected', this.selectedProjects); + onClick(project) { + this.setSelectedProjects(project); + this.handleUpdatedSelectedProjects(); }, - onMultiSelectClick({ project, isSelected }) { - this.setSelectedProjects(project, !isSelected); + onMultiSelectClick(project) { + this.setSelectedProjects(project); this.isDirty = true; }, - onSelected(ev) { + onSelected(project) { if (this.multiSelect) { - this.onMultiSelectClick(ev); + this.onMultiSelectClick(project); } else { - this.onClick(ev); + this.onClick(project); } }, onHide() { if (this.multiSelect && this.isDirty) { - this.$emit('selected', this.selectedProjects); + this.handleUpdatedSelectedProjects(); } this.searchTerm = ''; this.isDirty = false; }, + onClearAll() { + if (this.hasSelectedProjects) { + this.isDirty = true; + } + this.selectedProjects = []; + }, fetchData() { this.loading = true; @@ -168,8 +188,8 @@ export default { this.projects = nodes; }); }, - isProjectSelected(id) { - return this.selectedProjects ? this.selectedProjectIds.includes(id) : false; + isProjectSelected(project) { + return this.selectedProjectIds.includes(project.id); }, getEntityId(project) { return getIdFromGraphQLId(project.id); @@ -182,6 +202,10 @@ export default { ref="projectsDropdown" class="dropdown dropdown-projects" toggle-class="gl-shadow-none" + :show-clear-all="hasSelectedProjects" + show-highlighted-items-title + highlighted-items-title-class="gl-p-3" + @clear-all.stop="onClearAll" @hide="onHide" > +
{ @@ -7,3 +8,64 @@ export const filterBySearchTerm = (data = [], searchTerm = '', filterByKey = 'na }; export const toYmd = (date) => dateFormat(date, dateFormats.isoDate); + +/** + * Takes a url and extracts query parameters used for the shared + * filter bar + * + * @param {string} url The URL to extract query parameters from + * @returns {Object} + */ +export const extractFilterQueryParameters = (url = '') => { + const { + source_branch_name = null, + target_branch_name = null, + author_username = null, + milestone_title = null, + assignee_username = [], + label_name = [], + } = urlQueryToFilter(url); + + return { + selectedSourceBranch: source_branch_name, + selectedTargetBranch: target_branch_name, + selectedAuthor: author_username, + selectedMilestone: milestone_title, + selectedAssigneeList: assignee_username, + selectedLabelList: label_name, + }; +}; + +/** + * Takes a url and extracts sorting and pagination query parameters into an object + * + * @param {string} url The URL to extract query parameters from + * @returns {Object} + */ +export const extractPaginationQueryParameters = (url = '') => { + const { sort, direction, page } = urlQueryToFilter(url); + return { + sort: sort?.value || null, + direction: direction?.value || null, + page: page?.value || null, + }; +}; + +export const getDataZoomOption = ({ + totalItems = 0, + maxItemsPerPage = 40, + dataZoom = [{ type: 'slider', bottom: 10, start: 0 }], +}) => { + if (totalItems <= maxItemsPerPage) { + return {}; + } + + const intervalEnd = Math.ceil((maxItemsPerPage / totalItems) * 100); + + return dataZoom.map((item) => { + return { + ...item, + end: intervalEnd, + }; + }); +}; diff --git a/app/assets/javascripts/api.js b/app/assets/javascripts/api.js index 01e463c1965..adf3e122a64 100644 --- a/app/assets/javascripts/api.js +++ b/app/assets/javascripts/api.js @@ -499,10 +499,10 @@ const Api = { return axios.put(url, params); }, - applySuggestionBatch(ids) { + applySuggestionBatch(ids, message) { const url = Api.buildUrl(Api.applySuggestionBatchPath); - return axios.put(url, { ids }); + return axios.put(url, { ids, commit_message: message }); }, commitPipelines(projectId, sha) { diff --git a/app/assets/javascripts/api/bulk_imports_api.js b/app/assets/javascripts/api/bulk_imports_api.js new file mode 100644 index 00000000000..d636cfdff0b --- /dev/null +++ b/app/assets/javascripts/api/bulk_imports_api.js @@ -0,0 +1,7 @@ +import { buildApiUrl } from '~/api/api_utils'; +import axios from '~/lib/utils/axios_utils'; + +const BULK_IMPORT_ENTITIES_PATH = '/api/:version/bulk_imports/entities'; + +export const getBulkImportsHistory = (params) => + axios.get(buildApiUrl(BULK_IMPORT_ENTITIES_PATH), { params }); diff --git a/app/assets/javascripts/artifacts_settings/index.js b/app/assets/javascripts/artifacts_settings/index.js index 531b42bc185..5c9f1c3129c 100644 --- a/app/assets/javascripts/artifacts_settings/index.js +++ b/app/assets/javascripts/artifacts_settings/index.js @@ -6,7 +6,7 @@ import createDefaultClient from '~/lib/graphql'; Vue.use(VueApollo); const apolloProvider = new VueApollo({ - defaultClient: createDefaultClient(), + defaultClient: createDefaultClient({}, { assumeImmutableResults: true }), }); export default (containerId = 'js-artifacts-settings-app') => { diff --git a/app/assets/javascripts/behaviors/markdown/nodes/emoji.js b/app/assets/javascripts/behaviors/markdown/nodes/emoji.js index 367a06ad3c1..9d0890aa1b4 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/emoji.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/emoji.js @@ -26,6 +26,18 @@ export default class Emoji extends Node { moji: el.textContent, }), }, + { + tag: 'img.emoji', + getAttrs: (el) => { + const name = el.getAttribute('title').replace(/^:|:$/g, ''); + + return { + name, + title: name, + moji: name, + }; + }, + }, ], toDOM: (node) => [ 'gl-emoji', diff --git a/app/assets/javascripts/behaviors/markdown/nodes/image.js b/app/assets/javascripts/behaviors/markdown/nodes/image.js index ade5839d10b..4cc28c45739 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/image.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/image.js @@ -29,7 +29,7 @@ export default class Image extends BaseImage { }, // Matches HTML generated by Banzai::Filter::ImageLazyLoadFilter { - tag: 'img[src]', + tag: 'img[src]:not(.emoji)', getAttrs: (el) => { const imageSrc = el.src; const imageUrl = diff --git a/app/assets/javascripts/behaviors/preview_markdown.js b/app/assets/javascripts/behaviors/preview_markdown.js index a1911585f80..a548b283142 100644 --- a/app/assets/javascripts/behaviors/preview_markdown.js +++ b/app/assets/javascripts/behaviors/preview_markdown.js @@ -81,7 +81,7 @@ MarkdownPreview.prototype.fetchMarkdownPreview = function (text, url, success) { }) .catch(() => createFlash({ - message: __('An error occurred while fetching markdown preview'), + message: __('An error occurred while fetching Markdown preview'), }), ); }; diff --git a/app/assets/javascripts/behaviors/requires_input.js b/app/assets/javascripts/behaviors/requires_input.js index b1227fb3533..59905035257 100644 --- a/app/assets/javascripts/behaviors/requires_input.js +++ b/app/assets/javascripts/behaviors/requires_input.js @@ -38,23 +38,9 @@ $.fn.requiresInput = function requiresInput() { $form.on('change input', fieldSelector, requireInput); }; -// Hide or Show the help block when creating a new project -// based on the option selected -function hideOrShowHelpBlock(form) { - const selected = $('.js-select-namespace option:selected'); - if (selected.length && selected.data('optionsParent') === 'groups') { - form.find('.form-text.text-muted').hide(); - } else if (selected.length) { - form.find('.form-text.text-muted').show(); - } -} - $(() => { $('form.js-requires-input').each((i, el) => { const $form = $(el); - $form.requiresInput(); - hideOrShowHelpBlock($form); - $('.select2.js-select-namespace').change(() => hideOrShowHelpBlock($form)); }); }); diff --git a/app/assets/javascripts/behaviors/shortcuts/keybindings.js b/app/assets/javascripts/behaviors/shortcuts/keybindings.js index ebf2ab0381e..b27dccabdf8 100644 --- a/app/assets/javascripts/behaviors/shortcuts/keybindings.js +++ b/app/assets/javascripts/behaviors/shortcuts/keybindings.js @@ -306,6 +306,12 @@ export const GO_TO_PROJECT_WIKI = { defaultKeys: ['g w'], // eslint-disable-line @gitlab/require-i18n-strings }; +export const GO_TO_PROJECT_WEBIDE = { + id: 'project.goToWebIDE', + description: __('Open in Web IDE'), + defaultKeys: ['.'], +}; + export const PROJECT_FILES_MOVE_SELECTION_UP = { id: 'projectFiles.moveSelectionUp', description: __('Move selection up'), @@ -549,6 +555,7 @@ export const PROJECT_SHORTCUTS_GROUP = { GO_TO_PROJECT_KUBERNETES, GO_TO_PROJECT_SNIPPETS, GO_TO_PROJECT_WIKI, + GO_TO_PROJECT_WEBIDE, ], }; diff --git a/app/assets/javascripts/behaviors/shortcuts/shortcuts_navigation.js b/app/assets/javascripts/behaviors/shortcuts/shortcuts_navigation.js index b188d3b0ec3..7d8e4dd490c 100644 --- a/app/assets/javascripts/behaviors/shortcuts/shortcuts_navigation.js +++ b/app/assets/javascripts/behaviors/shortcuts/shortcuts_navigation.js @@ -1,4 +1,5 @@ import Mousetrap from 'mousetrap'; +import { visitUrl, constructWebIDEPath } from '~/lib/utils/url_utility'; import findAndFollowLink from '../../lib/utils/navigation_utility'; import { keysFor, @@ -18,6 +19,7 @@ import { GO_TO_PROJECT_KUBERNETES, GO_TO_PROJECT_ENVIRONMENTS, GO_TO_PROJECT_METRICS, + GO_TO_PROJECT_WEBIDE, NEW_ISSUE, } from './keybindings'; import Shortcuts from './shortcuts'; @@ -58,6 +60,18 @@ export default class ShortcutsNavigation extends Shortcuts { findAndFollowLink('.shortcuts-environments'), ); Mousetrap.bind(keysFor(GO_TO_PROJECT_METRICS), () => findAndFollowLink('.shortcuts-metrics')); + Mousetrap.bind(keysFor(GO_TO_PROJECT_WEBIDE), ShortcutsNavigation.navigateToWebIDE); Mousetrap.bind(keysFor(NEW_ISSUE), () => findAndFollowLink('.shortcuts-new-issue')); } + + static navigateToWebIDE() { + const path = constructWebIDEPath({ + sourceProjectFullPath: window.gl.mrWidgetData?.source_project_full_path, + targetProjectFullPath: window.gl.mrWidgetData?.target_project_full_path, + iid: window.gl.mrWidgetData?.iid, + }); + if (path) { + visitUrl(path); + } + } } diff --git a/app/assets/javascripts/blob/components/blob_content.vue b/app/assets/javascripts/blob/components/blob_content.vue index 1a74675100b..213e026c41f 100644 --- a/app/assets/javascripts/blob/components/blob_content.vue +++ b/app/assets/javascripts/blob/components/blob_content.vue @@ -41,6 +41,11 @@ export default { type: Object, required: true, }, + hideLineNumbers: { + type: Boolean, + required: false, + default: false, + }, }, computed: { viewer() { @@ -80,6 +85,7 @@ export default { :is-raw-content="isRawContent" :file-name="blob.name" :type="activeViewer.fileType" + :hide-line-numbers="hideLineNumbers" data-qa-selector="file_content" /> diff --git a/app/assets/javascripts/blob/file_template_mediator.js b/app/assets/javascripts/blob/file_template_mediator.js index 136457c115d..991f98c89e7 100644 --- a/app/assets/javascripts/blob/file_template_mediator.js +++ b/app/assets/javascripts/blob/file_template_mediator.js @@ -247,7 +247,11 @@ export default class FileTemplateMediator { } setFilename(name) { - this.$filenameInput.val(name).trigger('change'); + const input = this.$filenameInput.get(0); + if (name !== undefined && input.value !== name) { + input.value = name; + input.dispatchEvent(new Event('change')); + } } getSelected() { diff --git a/app/assets/javascripts/boards/boards_util.js b/app/assets/javascripts/boards/boards_util.js index d113a1d39d8..c10241d00d7 100644 --- a/app/assets/javascripts/boards/boards_util.js +++ b/app/assets/javascripts/boards/boards_util.js @@ -43,7 +43,9 @@ export function formatListIssues(listIssues) { let sortedIssues = list.issues.edges.map((issueNode) => ({ ...issueNode.node, })); - sortedIssues = sortBy(sortedIssues, 'relativePosition'); + if (list.listType !== ListType.closed) { + sortedIssues = sortBy(sortedIssues, 'relativePosition'); + } return { ...map, @@ -146,7 +148,8 @@ export function getMoveData(state, params) { } export function moveItemListHelper(item, fromList, toList) { - const updatedItem = item; + const updatedItem = cloneDeep(item); + if ( toList.listType === ListType.label && !updatedItem.labels.find((label) => label.id === toList.label.id) diff --git a/app/assets/javascripts/boards/components/board_add_new_column.vue b/app/assets/javascripts/boards/components/board_add_new_column.vue index 22ad619e76b..c5411ec313a 100644 --- a/app/assets/javascripts/boards/components/board_add_new_column.vue +++ b/app/assets/javascripts/boards/components/board_add_new_column.vue @@ -52,6 +52,8 @@ export default { }, setSelectedItem(selectedId) { + this.selectedId = selectedId; + const label = this.labels.find(({ id }) => id === selectedId); if (!selectedId || !label) { this.selectedLabel = null; @@ -87,8 +89,8 @@ export default { diff --git a/app/assets/javascripts/cycle_analytics/components/filter_bar.vue b/app/assets/javascripts/cycle_analytics/components/filter_bar.vue index 5140b05e189..016fea354fe 100644 --- a/app/assets/javascripts/cycle_analytics/components/filter_bar.vue +++ b/app/assets/javascripts/cycle_analytics/components/filter_bar.vue @@ -79,7 +79,6 @@ export default { title: __('Assignees'), type: 'assignees', token: AuthorToken, - defaultAuthors: [], initialAuthors: this.assigneesData, unique: false, operators: OPERATOR_IS_ONLY, diff --git a/app/assets/javascripts/cycle_analytics/components/stage_table.vue b/app/assets/javascripts/cycle_analytics/components/stage_table.vue index 8a2667a4ab1..fc4dfafb809 100644 --- a/app/assets/javascripts/cycle_analytics/components/stage_table.vue +++ b/app/assets/javascripts/cycle_analytics/components/stage_table.vue @@ -194,6 +194,9 @@ export default { > + diff --git a/app/assets/javascripts/jobs/components/log/log.vue b/app/assets/javascripts/jobs/components/log/log.vue index 0134e5dafe8..ef95d79b8ab 100644 --- a/app/assets/javascripts/jobs/components/log/log.vue +++ b/app/assets/javascripts/jobs/components/log/log.vue @@ -10,10 +10,10 @@ export default { }, computed: { ...mapState([ - 'traceEndpoint', - 'trace', - 'isTraceComplete', - 'isScrolledToBottomBeforeReceivingTrace', + 'jobLogEndpoint', + 'jobLog', + 'isJobLogComplete', + 'isScrolledToBottomBeforeReceivingJobLog', ]), }, updated() { @@ -39,7 +39,7 @@ export default { * In order to scroll the page down after `v-html` has finished, we need to use setTimeout */ handleScrollDown() { - if (this.isScrolledToBottomBeforeReceivingTrace) { + if (this.isScrolledToBottomBeforeReceivingJobLog) { setTimeout(() => { this.scrollBottom(); }, 0); @@ -50,18 +50,18 @@ export default {