From 71786ddc8e28fbd3cb3fcc4b3ff15e5962a1c82e Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Mon, 20 Feb 2023 13:49:51 +0000 Subject: Add latest changes from gitlab-org/gitlab@15-9-stable-ee --- app/assets/images/auth_buttons/authentiq_64.png | Bin 17679 -> 0 bytes app/assets/images/auth_buttons/shibboleth_64.png | Bin 2993 -> 0 bytes app/assets/images/file_icons.svg | 1 - app/assets/images/select2-spinner.gif | Bin 1849 -> 0 bytes app/assets/images/select2.png | Bin 613 -> 0 bytes app/assets/images/select2x2.png | Bin 845 -> 0 bytes .../components/abuse_category_selector.vue | 26 +- .../components/links_to_spam_input.vue | 68 +++ app/assets/javascripts/abuse_reports/index.js | 22 + .../components/database_listbox.vue | 2 +- .../admin/topics/components/topic_select.vue | 91 +-- .../javascripts/airflow/dags/components/dags.vue | 111 ++++ .../alerts_settings/components/alerts_form.vue | 5 +- .../analytics/shared/components/metric_popover.vue | 35 +- .../javascripts/analytics/shared/constants.js | 116 +++- app/assets/javascripts/analytics/shared/utils.js | 7 +- app/assets/javascripts/api/environments_api.js | 15 + app/assets/javascripts/api/groups_api.js | 9 + app/assets/javascripts/api/projects_api.js | 13 + .../javascripts/artifacts/components/app.vue | 65 ++ app/assets/javascripts/artifacts/constants.js | 4 + .../queries/get_build_artifacts_size.query.graphql | 8 + .../queries/get_job_artifacts.query.graphql | 3 +- app/assets/javascripts/artifacts/index.js | 4 +- .../batch_comments/components/draft_note.vue | 27 +- .../batch_comments/components/preview_dropdown.vue | 58 +- .../batch_comments/components/publish_button.vue | 52 -- .../batch_comments/components/review_bar.vue | 5 +- app/assets/javascripts/behaviors/copy_code.js | 2 +- app/assets/javascripts/behaviors/index.js | 2 - .../javascripts/behaviors/markdown/render_math.js | 52 +- app/assets/javascripts/behaviors/select2.js | 30 - app/assets/javascripts/behaviors/shortcuts.js | 5 +- .../javascripts/blob/components/table_contents.vue | 50 +- .../javascripts/blob/notebook/notebook_viewer.vue | 3 +- app/assets/javascripts/blob/openapi/index.js | 11 +- app/assets/javascripts/boards/boards_util.js | 31 +- .../javascripts/boards/components/board_app.vue | 16 +- .../javascripts/boards/components/board_card.vue | 13 +- .../boards/components/board_card_inner.vue | 4 +- .../components/board_card_move_to_position.vue | 48 +- .../javascripts/boards/components/board_column.vue | 20 +- .../boards/components/board_content.vue | 3 + .../boards/components/board_content_sidebar.vue | 13 +- .../boards/components/board_filtered_search.vue | 1 - .../javascripts/boards/components/board_list.vue | 109 +++- .../boards/components/board_list_header.vue | 16 +- .../boards/components/board_top_bar.vue | 44 +- .../boards/components/boards_selector.vue | 38 +- .../components/issue_board_filtered_search.vue | 4 +- .../boards/components/issue_due_date.vue | 2 +- .../components/sidebar/board_sidebar_title.vue | 9 +- app/assets/javascripts/boards/constants.js | 51 +- .../boards/graphql/lists_issues.query.graphql | 12 +- app/assets/javascripts/boards/index.js | 38 +- app/assets/javascripts/boards/stores/actions.js | 4 +- app/assets/javascripts/boards/stores/getters.js | 5 +- app/assets/javascripts/boards/stores/mutations.js | 11 +- .../javascripts/branches/branch_sort_dropdown.js | 6 +- .../branches/components/sort_dropdown.vue | 35 +- .../components/ci_group_variables.vue | 10 +- .../components/ci_project_variables.vue | 10 +- .../components/ci_variable_modal.vue | 106 ++-- .../javascripts/ci/ci_variable_list/constants.js | 11 +- .../ci/ci_variable_list/graphql/settings.js | 23 +- .../javascripts/ci/ci_variable_list/index.js | 4 +- .../components/drawer/pipeline_editor_drawer.vue | 15 +- .../components/editor/ci_editor_header.vue | 25 +- .../file_nav/pipeline_editor_file_nav.vue | 2 +- .../header/pipeline_editor_mini_graph.vue | 4 +- .../components/job_assistant_drawer/constants.js | 7 + .../job_assistant_drawer/job_assistant_drawer.vue | 62 ++ .../components/pipeline_editor_tabs.vue | 10 +- .../ci/pipeline_editor/pipeline_editor_home.vue | 23 + .../pipeline_new/components/pipeline_new_form.vue | 128 ++-- .../ci/reports/codequality_report/constants.js | 12 +- .../admin_new_runner/admin_new_runner_app.vue | 78 +++ .../ci/runner/admin_new_runner/index.js | 32 + .../admin_runner_show/admin_runner_show_app.vue | 73 +-- .../ci/runner/admin_runners/admin_runners_app.vue | 29 +- .../javascripts/ci/runner/admin_runners/index.js | 2 + .../runner/components/cells/runner_status_cell.vue | 1 + .../components/cells/runner_summary_cell.vue | 6 - .../registration_token_reset_dropdown_item.vue | 6 +- .../ci/runner/components/runner_assigned_item.vue | 2 +- .../ci/runner/components/runner_bulk_delete.vue | 38 +- .../ci/runner/components/runner_delete_button.vue | 2 +- .../ci/runner/components/runner_details_tabs.vue | 95 +++ .../ci/runner/components/runner_form_fields.vue | 140 +++++ .../runner/components/runner_job_status_badge.vue | 3 +- .../ci/runner/components/runner_jobs_table.vue | 4 +- .../ci/runner/components/runner_list.vue | 13 +- .../runner/components/runner_list_empty_state.vue | 27 +- .../runner/components/runner_platforms_radio.vue | 76 +++ .../components/runner_platforms_radio_group.vue | 108 ++++ app/assets/javascripts/ci/runner/constants.js | 18 + .../runner/graphql/show/runner_jobs.query.graphql | 9 +- .../group_runner_show/group_runner_show_app.vue | 12 +- .../ci/runner/group_runner_show/index.js | 2 + .../ci/runner/group_runners/group_runners_app.vue | 19 +- .../javascripts/ci/runner/group_runners/index.js | 2 - .../ci/runner/runner_edit/runner_edit_app.vue | 4 +- .../ci_secure_files/components/metadata/button.vue | 54 ++ .../ci_secure_files/components/metadata/modal.vue | 129 ++++ .../ci_secure_files/components/metadata/table.vue | 36 ++ .../components/secure_files_list.vue | 22 + .../components/triggers_list.vue | 40 +- .../javascripts/clusters/agents/constants.js | 8 +- app/assets/javascripts/clusters/clusters_bundle.js | 4 +- app/assets/javascripts/clusters_list/constants.js | 6 +- .../components/dropdown.vue | 48 +- .../components/project_form_group.vue | 2 +- .../components/toolbar_more_dropdown.vue | 113 ++-- .../services/serialization_helpers.js | 1 + .../contributors/components/contributors.vue | 125 ++-- app/assets/javascripts/contributors/index.js | 5 +- .../contacts/components/contact_form_wrapper.vue | 6 +- .../components/organization_form_wrapper.vue | 6 +- app/assets/javascripts/deprecated_notes.js | 33 +- .../components/design_overlay.vue | 3 + .../design_management/components/image.vue | 22 +- .../design_management/components/list/item.vue | 10 +- .../javascripts/design_management/graphql.js | 2 +- .../javascripts/diffs/components/diff_row.vue | 108 +++- .../javascripts/diffs/components/diff_row_utils.js | 54 +- .../javascripts/diffs/components/diff_view.vue | 21 +- .../javascripts/diffs/components/tree_list.vue | 5 +- app/assets/javascripts/dropzone_input.js | 2 +- app/assets/javascripts/editor/schema/ci.json | 20 +- .../environments/components/environment_form.vue | 22 +- .../environments/components/environments_app.vue | 38 +- .../components/new_environment_item.vue | 1 + .../components/stop_stale_environments_modal.vue | 104 ++++ app/assets/javascripts/environments/constants.js | 10 + app/assets/javascripts/environments/edit.js | 1 + .../components/deployment_actions.vue | 31 + .../environments/environment_details/constants.js | 6 + .../environment_details/deployments_table.vue | 5 + .../environments/environment_details/index.vue | 6 +- .../graphql/queries/environment_app.query.graphql | 1 + .../queries/environment_details.query.graphql | 20 + .../javascripts/environments/graphql/resolvers.js | 1 + .../deployment_data_transformation_helper.js | 28 +- app/assets/javascripts/flash.js | 72 +-- .../javascripts/frequent_items/components/app.vue | 14 +- .../components/frequent_items_list_item.vue | 16 +- .../components/frequent_items_search_input.vue | 15 + app/assets/javascripts/gl_form.js | 19 +- app/assets/javascripts/gpg_badges.js | 2 +- app/assets/javascripts/graphql_shared/constants.js | 47 +- .../javascripts/graphql_shared/issuable_client.js | 80 ++- .../javascripts/graphql_shared/possible_types.json | 3 +- app/assets/javascripts/graphql_shared/utils.js | 12 + app/assets/javascripts/groups/components/app.vue | 3 +- .../javascripts/groups/init_transfer_group_form.js | 3 +- .../components/transfer_locations.vue | 18 + app/assets/javascripts/header.js | 7 + .../javascripts/header_search/components/app.vue | 4 +- app/assets/javascripts/header_search/constants.js | 2 + app/assets/javascripts/header_search/index.js | 24 +- .../javascripts/helpers/init_simple_app_helper.js | 39 ++ .../javascripts/ide/components/panes/right.vue | 15 +- .../ide/components/preview/clientside.vue | 191 ------ .../ide/components/preview/navigator.vue | 136 ----- app/assets/javascripts/ide/constants.js | 10 - app/assets/javascripts/ide/index.js | 2 - app/assets/javascripts/ide/init_gitlab_web_ide.js | 10 + app/assets/javascripts/ide/lib/editor_options.js | 9 +- .../lib/gitlab_web_ide/handle_tracking_event.js | 20 + app/assets/javascripts/ide/lib/mirror.js | 3 +- app/assets/javascripts/ide/remote/index.js | 2 + app/assets/javascripts/ide/stores/actions.js | 3 +- app/assets/javascripts/ide/stores/getters.js | 3 - app/assets/javascripts/ide/stores/index.js | 2 - .../ide/stores/modules/clientside/actions.js | 11 - .../ide/stores/modules/clientside/index.js | 6 - app/assets/javascripts/ide/stores/state.js | 2 - .../import_entities/components/import_status.vue | 16 +- .../components/import_actions_cell.vue | 6 +- .../import_groups/components/import_table.vue | 90 ++- .../components/import_target_cell.vue | 26 +- .../import_entities/import_groups/constants.js | 3 + .../components/import_projects_table.vue | 8 +- .../components/provider_repo_table_row.vue | 79 ++- .../import_projects/store/mutations.js | 40 +- .../import_entities/import_projects/utils.js | 2 +- .../incidents/components/incidents_list.vue | 1 + app/assets/javascripts/integrations/constants.js | 16 +- .../edit/components/integration_form.vue | 22 +- .../index/components/integrations_table.vue | 14 +- .../components/invite_members_modal.vue | 55 +- .../components/invite_modal_base.vue | 11 +- .../invite_members/components/project_select.vue | 94 ++- app/assets/javascripts/invite_members/constants.js | 2 + .../invite_members/init_invite_members_modal.js | 3 + .../issuable/components/issuable_by_email.vue | 5 +- .../components/issuable_header_warnings.vue | 6 +- .../issuable/components/issue_milestone.vue | 2 +- .../issuable/components/related_issuable_item.vue | 4 +- .../javascripts/issuable/components/status_box.vue | 4 +- .../issuable/issuable_bulk_update_actions.js | 5 +- .../issuable/issuable_bulk_update_sidebar.js | 3 +- app/assets/javascripts/issuable/issuable_form.js | 50 +- .../issuable/popover/components/issue_popover.vue | 4 +- app/assets/javascripts/issues/constants.js | 21 +- .../dashboard/components/issues_dashboard_app.vue | 135 ++++- .../dashboard/queries/get_issues.query.graphql | 10 +- .../queries/get_issues_counts.query.graphql | 70 +++ .../dashboard/queries/issue.fragment.graphql | 56 ++ app/assets/javascripts/issues/index.js | 2 +- .../components/empty_state_without_any_issues.vue | 14 +- .../list/components/issue_card_time_info.vue | 5 +- .../issues/list/components/issues_list_app.vue | 85 +-- .../issues/list/components/new_issue_dropdown.vue | 127 ---- app/assets/javascripts/issues/list/constants.js | 2 +- app/assets/javascripts/issues/list/graphql.js | 4 +- .../issues/list/has_new_issue_dropdown_mixin.js | 18 + app/assets/javascripts/issues/list/index.js | 2 - .../issues/list/queries/get_issues.query.graphql | 8 +- .../issues/list/queries/issue.fragment.graphql | 4 + .../list/queries/search_labels.query.graphql | 8 +- .../list/queries/search_projects.query.graphql | 3 +- .../javascripts/issues/show/components/app.vue | 23 +- .../issues/show/components/description.vue | 297 ++++++---- .../issues/show/components/fields/description.vue | 20 +- .../issues/show/components/fields/type.vue | 55 +- .../javascripts/issues/show/components/form.vue | 4 +- .../issues/show/components/header_actions.vue | 15 +- .../issues/show/components/incidents/constants.js | 12 + .../components/incidents/create_timeline_event.vue | 10 +- .../components/incidents/edit_timeline_event.vue | 5 +- .../queries/edit_timeline_event.mutation.graphql | 6 + .../show/components/incidents/incident_tabs.vue | 4 +- .../components/incidents/timeline_events_form.vue | 33 +- .../components/incidents/timeline_events_item.vue | 30 +- .../components/incidents/timeline_events_list.vue | 20 +- .../components/incidents/timeline_events_tab.vue | 4 +- .../incidents/timeline_events_tags_popover.vue | 42 ++ .../issues/show/components/incidents/utils.js | 8 + .../show/components/task_list_item_actions.vue | 47 ++ app/assets/javascripts/issues/show/graphql.js | 9 - app/assets/javascripts/issues/show/index.js | 20 +- app/assets/javascripts/issues/show/utils.js | 135 +++++ .../javascripts/jira_connect/subscriptions/api.js | 5 +- .../components/add_namespace_modal/groups_list.vue | 16 +- .../jira_connect/subscriptions/components/app.vue | 4 + .../jira_connect/subscriptions/constants.js | 2 +- .../jira_connect/subscriptions/index.js | 2 + .../pages/sign_in/sign_in_gitlab_com.vue | 2 +- .../subscriptions/pages/sign_in/sign_in_page.vue | 6 +- .../javascripts/jobs/components/job/job_app.vue | 8 + .../jobs/components/job/manual_variables_form.vue | 23 +- .../jobs/components/job/sidebar/sidebar_header.vue | 4 +- .../jobs/components/table/cells/actions_cell.vue | 9 +- .../javascripts/jobs/components/table/constants.js | 2 + app/assets/javascripts/jobs/constants.js | 6 +- app/assets/javascripts/jobs/store/actions.js | 11 +- .../language_switcher/components/app.vue | 2 +- app/assets/javascripts/layout_nav.js | 6 +- app/assets/javascripts/lib/apollo/persist_link.js | 141 +++++ .../javascripts/lib/apollo/persistence_mapper.js | 67 +++ app/assets/javascripts/lib/graphql.js | 41 +- app/assets/javascripts/lib/utils/common_utils.js | 31 +- app/assets/javascripts/lib/utils/http_status.js | 9 +- app/assets/javascripts/lib/utils/scroll_utils.js | 29 +- app/assets/javascripts/lib/utils/select2_utils.js | 25 - app/assets/javascripts/lib/utils/text_markdown.js | 10 +- app/assets/javascripts/listbox/index.js | 10 +- app/assets/javascripts/locale/index.js | 13 +- app/assets/javascripts/main.js | 11 - .../approve_access_request_button.vue | 1 + .../action_buttons/remove_group_link_button.vue | 2 +- .../components/action_dropdowns/constants.js | 1 + .../action_dropdowns/user_action_dropdown.vue | 15 +- .../components/modals/remove_group_link_modal.vue | 1 + .../components/modals/remove_member_modal.vue | 1 + .../components/table/member_action_buttons.vue | 60 -- .../members/components/table/member_actions.vue | 60 ++ .../members/components/table/members_table.vue | 13 +- .../members/components/table/role_dropdown.vue | 3 +- app/assets/javascripts/merge_request.js | 8 +- .../merge_requests/components/compare_app.vue | 134 +++++ .../merge_requests/components/compare_dropdown.vue | 145 +++++ .../merge_requests/components/sticky_header.vue | 6 +- .../components/target_project_dropdown.vue | 87 --- .../components/delete_milestone_modal.vue | 4 +- app/assets/javascripts/mirrors/ssh_mirror.js | 3 +- .../components/incubation_alert.vue | 48 -- .../components/ml_candidate.vue | 17 +- .../components/ml_experiment.vue | 132 +++-- .../ml/experiment_tracking/constants.js | 22 + .../index/components/ml_experiments_index.vue | 85 +++ .../routes/experiments/index/constants.js | 17 + .../routes/experiments/index/index.js | 3 + .../routes/experiments/index/translations.js | 11 + app/assets/javascripts/mr_notes/init.js | 6 +- app/assets/javascripts/mr_notes/init_notes.js | 5 +- .../javascripts/nav/components/new_nav_toggle.vue | 2 +- .../javascripts/nav/components/top_nav_app.vue | 2 +- .../nav/components/top_nav_dropdown_menu.vue | 6 +- .../nav/components/top_nav_menu_sections.vue | 12 +- .../notes/components/attachments_warning.vue | 18 + .../notes/components/comment_field_layout.vue | 17 + .../javascripts/notes/components/comment_form.vue | 5 + .../javascripts/notes/components/note_actions.vue | 52 +- .../javascripts/notes/components/note_header.vue | 2 + .../javascripts/notes/components/noteable_note.vue | 8 +- .../notes/components/sidebar_subscription.vue | 4 +- .../notes/components/toggle_replies_widget.vue | 7 +- app/assets/javascripts/notes/i18n.js | 3 + app/assets/javascripts/notes/index.js | 1 + app/assets/javascripts/notes/stores/actions.js | 10 +- .../components/details/package_versions_list.vue | 62 +- .../components/details/version_row.vue | 68 ++- .../components/functional/delete_package.vue | 62 -- .../components/functional/delete_packages.vue | 76 +++ .../components/list/package_list_row.vue | 27 +- .../components/list/packages_list.vue | 2 +- .../package_registry/constants.js | 14 + .../mutations/destroy_package.mutation.graphql | 5 - .../queries/get_package_details.query.graphql | 4 + .../package_registry/index.js | 2 +- .../package_registry/pages/details.vue | 70 ++- .../package_registry/pages/list.vue | 65 +- .../components/packages_cleanup_policy_form.vue | 28 + .../settings/project/constants.js | 6 + .../shared/components/registry_list.vue | 47 +- .../javascripts/pages/abuse_reports/index.js | 3 + .../application_settings/account_and_limits.js | 57 +- .../admin/application_settings/general/index.js | 4 +- .../pages/admin/application_settings/index.js | 2 - app/assets/javascripts/pages/admin/hooks/index.js | 3 + .../admin/jobs/index/components/cancel_jobs.vue | 37 ++ .../jobs/index/components/cancel_jobs_modal.vue | 66 +++ .../pages/admin/jobs/index/components/constants.js | 15 +- .../jobs/index/components/stop_jobs_modal.vue | 64 -- .../components/table/admin_jobs_table_app.vue | 19 + .../javascripts/pages/admin/jobs/index/index.js | 50 +- .../admin/projects/components/namespace_select.vue | 145 +++-- .../javascripts/pages/admin/projects/index.js | 8 +- .../javascripts/pages/admin/runners/new/index.js | 3 + .../javascripts/pages/dashboard/issues/index.js | 4 +- .../pages/dashboard/merge_requests/index.js | 9 +- .../pages/dashboard/milestones/index/index.js | 13 +- .../pages/dashboard/todos/index/todos.js | 16 +- app/assets/javascripts/pages/groups/edit/index.js | 7 +- .../pages/groups/group_members/index.js | 5 - .../pages/groups/merge_requests/index.js | 10 +- .../javascripts/pages/groups/usage_quotas/index.js | 3 + .../pages/profiles/saved_replies/index.js | 3 + .../pages/projects/airflow/dags/index/index.js | 27 + .../pages/projects/commit/show/index.js | 3 + .../javascripts/pages/projects/edit/index.js | 4 + .../pages/projects/find_file/ref_switcher/index.js | 38 ++ .../find_file/ref_switcher/ref_switcher_utils.js | 28 + .../pages/projects/find_file/show/index.js | 2 + .../projects/forks/new/components/fork_form.vue | 33 +- .../pages/projects/graphs/charts/index.js | 38 ++ .../javascripts/pages/projects/hooks/index.js | 3 +- app/assets/javascripts/pages/projects/index.js | 2 - .../components/included_in_trial_indicator.vue | 15 - .../learn_gitlab/components/learn_gitlab.vue | 146 ----- .../components/learn_gitlab_section_card.vue | 56 -- .../components/learn_gitlab_section_link.vue | 151 ----- .../pages/projects/learn_gitlab/constants/index.js | 133 ----- .../pages/projects/learn_gitlab/index/index.js | 31 - .../merge_requests/creations/new/compare.js | 66 --- .../creations/new/compare_autocomplete.js | 91 --- .../projects/merge_requests/creations/new/index.js | 81 ++- .../creations/new/target_project_dropdown.js | 23 - .../pages/projects/merge_requests/index/index.js | 2 - .../pages/projects/merge_requests/show/index.js | 2 +- .../pages/projects/ml/candidates/show/index.js | 27 +- .../pages/projects/ml/experiments/index/index.js | 24 + .../pages/projects/ml/experiments/show/index.js | 4 +- .../pages/projects/network/show/index.js | 32 + app/assets/javascripts/pages/projects/project.js | 8 - .../pages/projects/project_members/index.js | 5 - .../pages/projects/settings/ci_cd/show/index.js | 3 - .../permissions/components/settings_panel.vue | 68 +-- .../javascripts/pages/projects/show/index.js | 2 + .../pages/search/show/refresh_counts.js | 24 - .../pages/shared/mount_runner_aws_deployments.js | 17 - .../pages/shared/wikis/components/wiki_form.vue | 11 +- app/assets/javascripts/pages/users/show/index.js | 16 + .../performance_bar/components/detailed_metric.vue | 2 +- app/assets/javascripts/persistent_user_callouts.js | 2 + .../pipelines/components/graph/constants.js | 4 + .../pipelines/components/graph/graph_component.vue | 21 +- .../components/graph/graph_component_wrapper.vue | 17 +- .../pipelines/components/graph/job_item.vue | 108 +++- .../pipelines/components/graph/linked_pipeline.vue | 4 +- .../components/graph/linked_pipelines_column.vue | 7 + .../components/graph/stage_column_component.vue | 7 + .../components/jobs_shared/action_component.vue | 26 + .../pipelines/components/parsing_utils.js | 10 + .../components/pipeline_mini_graph/job_item.vue | 15 +- .../components/pipelines_list/pipelines.vue | 2 +- .../components/pipelines_list/pipelines_table.vue | 7 +- app/assets/javascripts/pipelines/constants.js | 1 - .../pipelines/pipeline_details_bundle.js | 7 + app/assets/javascripts/pipelines/pipeline_tabs.js | 2 + .../profile/components/activity_tab.vue | 17 + .../components/contributed_projects_tab.vue | 17 + .../profile/components/followers_tab.vue | 17 + .../profile/components/following_tab.vue | 17 + .../javascripts/profile/components/groups_tab.vue | 17 + .../profile/components/overview_tab.vue | 17 + .../profile/components/personal_projects_tab.vue | 17 + .../profile/components/profile_tabs.vue | 72 +++ .../profile/components/snippets_tab.vue | 17 + .../profile/components/starred_projects_tab.vue | 17 + app/assets/javascripts/profile/index.js | 16 + .../components/diffs_colors_preview.vue | 32 +- app/assets/javascripts/project_select.js | 128 ---- .../javascripts/project_select_combo_button.js | 122 ---- .../commit/components/branches_dropdown.vue | 84 +-- .../projects/commit/components/form_modal.vue | 13 +- .../commit/components/projects_dropdown.vue | 57 +- .../javascripts/projects/commit/store/getters.js | 4 +- .../components/commit_box_pipeline_mini_graph.vue | 4 +- .../queries/get_linked_pipelines.query.graphql | 4 + .../components/report_abuse_dropdown_item.vue | 41 -- .../javascripts/projects/merge_requests/index.js | 18 - .../javascripts/projects/project_name_rules.js | 29 +- app/assets/javascripts/projects/project_new.js | 9 +- .../javascripts/projects/project_visibility.js | 15 - .../javascripts/projects/prune_objects_button.js | 23 + .../projects/prune_unreachable_objects_button.vue | 75 +++ .../components/report_abuse_dropdown_item.vue | 44 ++ .../javascripts/projects/report_abuse/index.js | 25 + .../edit/protections/push_protections.vue | 2 +- .../branch_rules/components/view/constants.js | 12 +- .../branch_rules/components/view/index.vue | 105 ++-- .../settings/branch_rules/mount_branch_rules.js | 2 +- .../queries/branch_rules_details.query.graphql | 47 +- .../settings/repository/branch_rules/app.vue | 53 +- .../branch_rules/components/branch_rule.vue | 4 +- .../settings/repository/branch_rules/constants.js | 22 + app/assets/javascripts/projects/settings/utils.js | 2 +- .../ref/components/ref_results_section.vue | 138 ----- .../javascripts/ref/components/ref_selector.vue | 220 +++---- app/assets/javascripts/ref/constants.js | 4 +- app/assets/javascripts/ref/format_refs.js | 60 ++ .../components/add_issuable_form.vue | 4 +- .../components/related_issuable_input.vue | 4 +- .../components/related_issues_list.vue | 3 +- .../components/related_issues_root.vue | 7 +- app/assets/javascripts/related_issues/constants.js | 55 +- app/assets/javascripts/related_issues/index.js | 5 +- .../releases/components/app_edit_new.vue | 5 +- .../javascripts/releases/components/app_index.vue | 6 +- .../javascripts/releases/components/app_show.vue | 4 + .../releases/components/evidence_block.vue | 5 +- .../releases/components/release_block_assets.vue | 2 +- .../releases/components/releases_empty_state.vue | 49 +- .../releases/release_notification_service.js | 23 + .../releases/stores/modules/edit_new/mutations.js | 2 + .../repository/components/blob_viewers/index.js | 2 +- .../repository/components/fork_info.vue | 36 +- .../repository/components/preview/index.vue | 9 +- .../repository/components/table/row.vue | 2 +- app/assets/javascripts/repository/index.js | 8 +- .../repository/mixins/highlight_mixin.js | 106 ++++ .../repository/utils/ref_switcher_utils.js | 7 +- app/assets/javascripts/rest_api.js | 1 + .../javascripts/saved_replies/components/app.vue | 23 + .../javascripts/saved_replies/components/list.vue | 57 ++ .../saved_replies/components/list_item.vue | 19 + app/assets/javascripts/saved_replies/index.js | 31 + .../javascripts/saved_replies/pages/index.vue | 15 + .../queries/saved_replies.query.graphql | 19 + app/assets/javascripts/saved_replies/routes.js | 8 + app/assets/javascripts/search/index.js | 5 - .../javascripts/search/sidebar/components/app.vue | 14 +- .../search/sidebar/components/checkbox_filter.vue | 81 +++ .../sidebar/components/confidentiality_filter.vue | 9 +- .../search/sidebar/components/language_filter.vue | 122 ++++ .../search/sidebar/components/results_filters.vue | 15 +- .../search/sidebar/components/scope_navigation.vue | 5 + .../search/sidebar/components/status_filter.vue | 9 +- .../sidebar/constants/language_filter_data.js | 18 + app/assets/javascripts/search/sidebar/utils.js | 20 + app/assets/javascripts/search/store/actions.js | 23 +- app/assets/javascripts/search/store/constants.js | 7 +- app/assets/javascripts/search/store/getters.js | 9 + .../javascripts/search/store/mutation_types.js | 4 + app/assets/javascripts/search/store/mutations.js | 9 + app/assets/javascripts/search/store/state.js | 6 + .../javascripts/search/topbar/components/app.vue | 7 +- .../security_configuration/components/app.vue | 4 +- .../security_configuration/components/constants.js | 21 - app/assets/javascripts/service_ping_consent.js | 4 +- .../components/assignees/assignee_avatar.vue | 4 +- .../components/assignees/assignee_avatar_link.vue | 4 +- .../sidebar/components/assignees/assignees.vue | 3 +- .../components/assignees/collapsed_assignee.vue | 3 +- .../assignees/collapsed_assignee_list.vue | 3 +- .../components/assignees/issuable_assignees.vue | 3 +- .../components/assignees/sidebar_assignees.vue | 5 +- .../assignees/sidebar_assignees_widget.vue | 8 +- .../components/assignees/sidebar_participant.vue | 4 +- .../assignees/uncollapsed_assignee_list.vue | 4 +- .../sidebar_confidentiality_content.vue | 4 +- .../confidential/sidebar_confidentiality_form.vue | 11 +- .../components/crm_contacts/crm_contacts.vue | 4 +- .../components/date/sidebar_date_widget.vue | 6 +- .../graphql/issue_labels.query.graphql | 4 +- .../update_test_case_labels.mutation.graphql | 20 + .../labels_select_widget/labels_select_root.vue | 20 +- .../sidebar/components/lock/issuable_lock_form.vue | 4 +- .../components/milestone/milestone_dropdown.vue | 11 +- .../components/move/issuable_move_dropdown.vue | 2 +- .../sidebar/components/move/move_issue_button.vue | 71 +++ .../components/reviewers/reviewer_avatar_link.vue | 3 +- .../sidebar/components/reviewers/reviewers.vue | 3 +- .../components/reviewers/sidebar_reviewers.vue | 10 +- .../reviewers/uncollapsed_reviewer_list.vue | 3 +- .../components/severity/sidebar_severity.vue | 195 ------ .../severity/sidebar_severity_widget.vue | 154 +++++ .../sidebar/components/sidebar_dropdown.vue | 6 +- .../sidebar/components/sidebar_dropdown_widget.vue | 8 +- .../subscriptions/sidebar_subscriptions_widget.vue | 4 +- .../time_tracking/create_timelog_form.vue | 7 +- .../sidebar/components/time_tracking/report.vue | 7 +- .../components/time_tracking/time_tracker.vue | 7 +- app/assets/javascripts/sidebar/constants.js | 50 +- .../javascripts/sidebar/lib/sidebar_move_issue.js | 89 --- app/assets/javascripts/sidebar/mount_sidebar.js | 148 ++++- .../sidebar/queries/move_issue.mutation.graphql | 4 + .../sidebar/services/sidebar_service.js | 4 +- app/assets/javascripts/snippet/snippet_show.js | 2 + .../super_sidebar/components/bottom_bar.vue | 24 - .../super_sidebar/components/counter.vue | 4 +- .../super_sidebar/components/create_menu.vue | 38 ++ .../super_sidebar/components/help_center.vue | 178 ++++++ .../components/merge_request_menu.vue | 40 ++ .../super_sidebar/components/super_sidebar.vue | 11 +- .../super_sidebar/components/user_bar.vue | 36 +- app/assets/javascripts/terms/components/app.vue | 27 +- .../components/inbound_token_access.vue | 258 ++++++++ .../token_access/components/opt_in_jwt.vue | 125 ++++ .../components/outbound_token_access.vue | 260 ++++++++ .../token_access/components/token_access.vue | 235 -------- .../token_access/components/token_access_app.vue | 27 + .../components/token_projects_table.vue | 29 +- app/assets/javascripts/token_access/constants.js | 14 + ...add_project_ci_job_token_scope.mutation.graphql | 7 + ...ove_project_ci_job_token_scope.mutation.graphql | 7 + ...ound_update_ci_job_token_scope.mutation.graphql | 8 + .../mutations/update_opt_in_jwt.mutation.graphql | 8 + .../queries/get_opt_in_jwt_setting.query.graphql | 8 + .../inbound_get_ci_job_token_scope.query.graphql | 8 + ..._projects_with_ci_job_token_scope.query.graphql | 18 + app/assets/javascripts/token_access/index.js | 4 +- .../javascripts/tracking/get_standard_context.js | 2 +- .../usage_quotas/components/usage_quotas_app.vue | 35 ++ app/assets/javascripts/usage_quotas/constants.js | 7 + app/assets/javascripts/usage_quotas/index.js | 23 + .../profile/components/report_abuse_button.vue | 21 +- app/assets/javascripts/users/profile/index.js | 7 +- app/assets/javascripts/users_select/index.js | 2 +- .../components/action_buttons.vue | 69 ++- .../components/approvals/approvals.vue | 45 +- .../components/approvals/approvals_summary.vue | 100 +++- .../approvals/queries/approved_by.query.graphql | 16 + .../components/bold_text.vue | 26 + .../components/extensions/base.vue | 23 +- .../components/mr_widget_pipeline.vue | 12 +- .../components/report_widget_container.vue | 32 +- .../components/states/merge_checks_failed.vue | 18 +- .../components/states/mr_widget_archived.vue | 12 +- .../components/states/mr_widget_checking.vue | 4 +- .../components/states/mr_widget_conflicts.vue | 33 +- .../states/mr_widget_failed_to_merge.vue | 14 +- .../components/states/mr_widget_merging.vue | 10 +- .../components/states/mr_widget_missing_branch.vue | 14 +- .../components/states/mr_widget_not_allowed.vue | 15 +- .../states/mr_widget_pipeline_blocked.vue | 16 +- .../components/states/mr_widget_rebase.vue | 34 +- .../components/states/pipeline_failed.vue | 20 +- .../components/states/ready_to_merge.vue | 14 +- .../components/states/sha_mismatch.vue | 6 +- .../components/states/unresolved_discussions.vue | 12 +- .../components/states/work_in_progress.vue | 36 +- .../components/widget/widget.vue | 32 +- .../vue_merge_request_widget/constants.js | 20 +- .../vue_merge_request_widget/extensions/issues.js | 7 +- .../mr_widget_security_reports.vue | 6 +- .../extensions/terraform/index.js | 2 +- .../extensions/test_report/index.js | 5 +- .../javascripts/vue_merge_request_widget/i18n.js | 2 +- .../vue_merge_request_widget/mappers.js | 3 + .../vue_merge_request_widget/mixins/approvals.js | 13 +- .../vue_merge_request_widget/mr_widget_options.vue | 5 +- .../stores/mr_widget_store.js | 1 + .../components/system_notes/system_note.vue | 2 +- .../components/blob_viewers/rich_viewer.vue | 2 +- .../vue_shared/components/ci_badge_link.vue | 7 +- .../components/entity_select/constants.js | 16 + .../components/entity_select/entity_select.vue | 200 +++++++ .../components/entity_select/group_select.vue | 137 +++++ .../components/entity_select/init_group_selects.js | 48 ++ .../entity_select/init_project_selects.js | 48 ++ .../components/entity_select/project_select.vue | 168 ++++++ .../vue_shared/components/entity_select/utils.js | 15 + .../vue_shared/components/file_icon.vue | 4 +- .../components/file_icon/file_icon_map.js | 610 ------------------- .../javascripts/vue_shared/components/file_row.vue | 7 +- .../vue_shared/components/file_tree.vue | 9 +- .../components/filtered_search_bar/constants.js | 3 +- .../tokens/crm_contact_token.vue | 3 +- .../tokens/crm_organization_token.vue | 3 +- .../filtered_search_bar/tokens/label_token.vue | 18 + .../components/group_select/constants.js | 7 - .../components/group_select/group_select.vue | 234 -------- .../components/group_select/init_group_selects.js | 48 -- .../vue_shared/components/group_select/utils.js | 15 - .../vue_shared/components/header_ci_component.vue | 6 +- .../components/incubation/incubation_alert.vue | 61 ++ .../components/incubation/pagination.vue | 62 ++ .../components/issuable_blocked_icon/constants.js | 3 +- .../issuable_blocked_icon.vue | 15 +- .../vue_shared/components/markdown/field.vue | 6 + .../components/markdown/markdown_editor.vue | 35 +- .../components/new_resource_dropdown/constants.js | 26 + ...jects_with_merge_requests_enabled.query.graphql | 18 + .../search_user_groups_and_projects.query.graphql | 21 + ...user_projects_with_issues_enabled.query.graphql | 15 + ...jects_with_merge_requests_enabled.query.graphql | 15 + .../init_new_resource_dropdown.js | 46 ++ .../new_resource_dropdown.vue | 208 +++++++ .../vue_shared/components/registry/list_item.vue | 4 +- .../runner_aws_deployments.vue | 43 -- .../runner_aws_deployments_modal.vue | 29 - .../components/runner_instructions/constants.js | 1 + .../instructions/runner_aws_instructions.vue | 37 +- .../runner_instructions_modal.vue | 5 +- .../components/source_viewer/components/chunk.vue | 118 ++-- .../source_viewer/components/chunk_deprecated.vue | 133 +++++ .../components/source_viewer/constants.js | 2 + .../components/source_viewer/source_viewer.vue | 213 +------ .../source_viewer/source_viewer_deprecated.vue | 227 +++++++ .../source_viewer/workers/highlight_utils.js | 50 +- .../javascripts/vue_shared/components/url_sync.vue | 20 +- .../components/user_avatar/user_avatar_list.vue | 4 +- .../components/user_select/user_select.vue | 31 +- .../vue_shared/components/web_ide_link.vue | 1 + app/assets/javascripts/vue_shared/constants.js | 6 +- .../issuable/show/components/issuable_body.vue | 1 + .../security_reports/components/constants.js | 12 +- .../vue_shared/security_reports/store/utils.js | 57 +- .../webhooks/components/test_dropdown.vue | 69 +++ app/assets/javascripts/webhooks/index.js | 20 + .../javascripts/whats_new/components/app.vue | 6 +- .../javascripts/whats_new/utils/notification.js | 2 + .../work_items/components/item_state.vue | 1 + .../work_items/components/item_title.vue | 2 +- .../work_items/components/notes/system_note.vue | 6 +- .../components/notes/work_item_add_note.vue | 211 +++++++ .../components/notes/work_item_comment_form.vue | 126 ++++ .../components/notes/work_item_comment_locked.vue | 66 +++ .../components/notes/work_item_discussion.vue | 191 ++++++ .../work_items/components/notes/work_item_note.vue | 159 ++++- .../components/notes/work_item_note_actions.vue | 47 ++ .../components/notes/work_item_note_body.vue | 15 +- .../components/notes/work_item_note_replying.vue | 53 ++ .../components/notes/work_item_note_signed_out.vue | 31 + .../work_items/components/widget_wrapper.vue | 80 +++ .../work_items/components/work_item_assignees.vue | 1 + .../components/work_item_comment_form.vue | 228 ------- .../components/work_item_comment_locked.vue | 66 --- .../components/work_item_created_updated.vue | 115 ++++ .../components/work_item_description.vue | 34 +- .../components/work_item_description_rendered.vue | 1 + .../work_items/components/work_item_detail.vue | 42 +- .../components/work_item_detail_modal.vue | 15 +- .../work_items/components/work_item_due_date.vue | 2 + .../work_items/components/work_item_labels.vue | 46 +- .../components/work_item_links/work_item_links.vue | 155 ++--- .../work_item_links/work_item_links_form.vue | 8 - .../components/work_item_links/work_item_tree.vue | 65 +- .../components/work_item_note_signed_out.vue | 31 - .../work_items/components/work_item_notes.vue | 166 ++++-- .../graphql/add_hierarchy_child.mutation.graphql | 3 + .../javascripts/work_items/graphql/cache_utils.js | 62 ++ .../graphql/create_work_item_note.mutation.graphql | 5 - .../notes/create_work_item_note.mutation.graphql | 18 + .../notes/delete_work_item_notes.mutation.graphql | 7 + .../notes/update_work_item_note.mutation.graphql | 10 + .../work_item_discussion_note.fragment.graphql | 25 + .../graphql/notes/work_item_note.fragment.graphql | 30 + .../work_item_note_created.subscription.graphql | 7 + .../work_item_note_deleted.subscription.graphql | 7 + .../work_item_note_updated.subscription.graphql | 7 + .../graphql/notes/work_item_notes.query.graphql | 27 + .../notes/work_item_notes_by_iid.query.graphql | 32 + .../remove_hierarchy_child.mutation.graphql | 3 + .../work_items/graphql/work_item.fragment.graphql | 5 + .../work_item_metadata_widgets.fragment.graphql | 11 + .../graphql/work_item_note.fragment.graphql | 16 - .../graphql/work_item_notes.query.graphql | 27 - .../graphql/work_item_notes_by_iid.query.graphql | 32 - .../graphql/work_item_widgets.fragment.graphql | 1 + app/assets/javascripts/work_items/index.js | 3 + .../work_items/pages/work_item_root.vue | 4 +- app/assets/javascripts/work_items/utils.js | 25 +- app/assets/stylesheets/framework/common.scss | 6 - app/assets/stylesheets/framework/diffs.scss | 32 +- app/assets/stylesheets/framework/dropdowns.scss | 15 +- app/assets/stylesheets/framework/files.scss | 205 +++---- app/assets/stylesheets/framework/forms.scss | 18 + app/assets/stylesheets/framework/header.scss | 28 - app/assets/stylesheets/framework/images.scss | 3 +- app/assets/stylesheets/framework/mixins.scss | 35 -- app/assets/stylesheets/framework/page_header.scss | 4 - .../framework/secondary_navigation_elements.scss | 15 - app/assets/stylesheets/framework/sidebar.scss | 14 - app/assets/stylesheets/framework/snippets.scss | 1 - .../stylesheets/framework/super_sidebar.scss | 43 ++ app/assets/stylesheets/framework/typography.scss | 3 +- app/assets/stylesheets/framework/variables.scss | 11 +- app/assets/stylesheets/highlight/common.scss | 11 + app/assets/stylesheets/highlight/themes/dark.scss | 29 +- .../stylesheets/highlight/themes/monokai.scss | 29 +- app/assets/stylesheets/highlight/themes/none.scss | 27 +- .../highlight/themes/solarized-dark.scss | 29 +- .../highlight/themes/solarized-light.scss | 18 +- app/assets/stylesheets/highlight/themes/white.scss | 2 +- app/assets/stylesheets/highlight/white_base.scss | 24 +- app/assets/stylesheets/lazy_bundles/select2.scss | 654 --------------------- .../lazy_bundles/select2_overrides.scss | 341 ----------- .../page_bundles/admin/elasticsearch_form.scss | 5 + app/assets/stylesheets/page_bundles/boards.scss | 10 +- app/assets/stylesheets/page_bundles/ci_status.scss | 1 - app/assets/stylesheets/page_bundles/ide.scss | 40 +- app/assets/stylesheets/page_bundles/incidents.scss | 22 +- .../stylesheets/page_bundles/issues_show.scss | 19 + .../stylesheets/page_bundles/merge_requests.scss | 3 +- .../stylesheets/page_bundles/pipeline_editor.scss | 8 + app/assets/stylesheets/page_bundles/profile.scss | 4 + app/assets/stylesheets/page_bundles/search.scss | 32 +- app/assets/stylesheets/page_bundles/settings.scss | 2 +- app/assets/stylesheets/page_bundles/terms.scss | 6 +- app/assets/stylesheets/page_bundles/todos.scss | 19 +- .../stylesheets/page_bundles/work_items.scss | 7 + app/assets/stylesheets/pages/commits.scss | 23 +- app/assets/stylesheets/pages/issues.scss | 6 - app/assets/stylesheets/pages/merge_requests.scss | 12 +- app/assets/stylesheets/pages/notes.scss | 15 +- app/assets/stylesheets/startup/startup-dark.scss | 26 +- .../stylesheets/startup/startup-general.scss | 24 +- app/assets/stylesheets/startup/startup-signin.scss | 2 +- app/assets/stylesheets/utilities.scss | 18 - 754 files changed, 14492 insertions(+), 9241 deletions(-) delete mode 100644 app/assets/images/auth_buttons/authentiq_64.png delete mode 100644 app/assets/images/auth_buttons/shibboleth_64.png delete mode 100644 app/assets/images/file_icons.svg delete mode 100644 app/assets/images/select2-spinner.gif delete mode 100644 app/assets/images/select2.png delete mode 100644 app/assets/images/select2x2.png create mode 100644 app/assets/javascripts/abuse_reports/components/links_to_spam_input.vue create mode 100644 app/assets/javascripts/abuse_reports/index.js create mode 100644 app/assets/javascripts/airflow/dags/components/dags.vue create mode 100644 app/assets/javascripts/api/environments_api.js create mode 100644 app/assets/javascripts/artifacts/components/app.vue create mode 100644 app/assets/javascripts/artifacts/graphql/queries/get_build_artifacts_size.query.graphql delete mode 100644 app/assets/javascripts/batch_comments/components/publish_button.vue delete mode 100644 app/assets/javascripts/behaviors/select2.js create mode 100644 app/assets/javascripts/ci/pipeline_editor/components/job_assistant_drawer/constants.js create mode 100644 app/assets/javascripts/ci/pipeline_editor/components/job_assistant_drawer/job_assistant_drawer.vue create mode 100644 app/assets/javascripts/ci/runner/admin_new_runner/admin_new_runner_app.vue create mode 100644 app/assets/javascripts/ci/runner/admin_new_runner/index.js create mode 100644 app/assets/javascripts/ci/runner/components/runner_details_tabs.vue create mode 100644 app/assets/javascripts/ci/runner/components/runner_form_fields.vue create mode 100644 app/assets/javascripts/ci/runner/components/runner_platforms_radio.vue create mode 100644 app/assets/javascripts/ci/runner/components/runner_platforms_radio_group.vue create mode 100644 app/assets/javascripts/ci_secure_files/components/metadata/button.vue create mode 100644 app/assets/javascripts/ci_secure_files/components/metadata/modal.vue create mode 100644 app/assets/javascripts/ci_secure_files/components/metadata/table.vue create mode 100644 app/assets/javascripts/environments/components/stop_stale_environments_modal.vue create mode 100644 app/assets/javascripts/environments/environment_details/components/deployment_actions.vue create mode 100644 app/assets/javascripts/helpers/init_simple_app_helper.js delete mode 100644 app/assets/javascripts/ide/components/preview/clientside.vue delete mode 100644 app/assets/javascripts/ide/components/preview/navigator.vue create mode 100644 app/assets/javascripts/ide/lib/gitlab_web_ide/handle_tracking_event.js delete mode 100644 app/assets/javascripts/ide/stores/modules/clientside/actions.js delete mode 100644 app/assets/javascripts/ide/stores/modules/clientside/index.js create mode 100644 app/assets/javascripts/issues/dashboard/queries/get_issues_counts.query.graphql create mode 100644 app/assets/javascripts/issues/dashboard/queries/issue.fragment.graphql delete mode 100644 app/assets/javascripts/issues/list/components/new_issue_dropdown.vue create mode 100644 app/assets/javascripts/issues/list/has_new_issue_dropdown_mixin.js create mode 100644 app/assets/javascripts/issues/show/components/incidents/timeline_events_tags_popover.vue create mode 100644 app/assets/javascripts/issues/show/components/task_list_item_actions.vue delete mode 100644 app/assets/javascripts/issues/show/graphql.js create mode 100644 app/assets/javascripts/lib/apollo/persist_link.js create mode 100644 app/assets/javascripts/lib/apollo/persistence_mapper.js delete mode 100644 app/assets/javascripts/lib/utils/select2_utils.js delete mode 100644 app/assets/javascripts/members/components/table/member_action_buttons.vue create mode 100644 app/assets/javascripts/members/components/table/member_actions.vue create mode 100644 app/assets/javascripts/merge_requests/components/compare_app.vue create mode 100644 app/assets/javascripts/merge_requests/components/compare_dropdown.vue delete mode 100644 app/assets/javascripts/merge_requests/components/target_project_dropdown.vue delete mode 100644 app/assets/javascripts/ml/experiment_tracking/components/incubation_alert.vue create mode 100644 app/assets/javascripts/ml/experiment_tracking/constants.js create mode 100644 app/assets/javascripts/ml/experiment_tracking/routes/experiments/index/components/ml_experiments_index.vue create mode 100644 app/assets/javascripts/ml/experiment_tracking/routes/experiments/index/constants.js create mode 100644 app/assets/javascripts/ml/experiment_tracking/routes/experiments/index/index.js create mode 100644 app/assets/javascripts/ml/experiment_tracking/routes/experiments/index/translations.js create mode 100644 app/assets/javascripts/notes/components/attachments_warning.vue delete mode 100644 app/assets/javascripts/packages_and_registries/package_registry/components/functional/delete_package.vue create mode 100644 app/assets/javascripts/packages_and_registries/package_registry/components/functional/delete_packages.vue delete mode 100644 app/assets/javascripts/packages_and_registries/package_registry/graphql/mutations/destroy_package.mutation.graphql create mode 100644 app/assets/javascripts/pages/abuse_reports/index.js create mode 100644 app/assets/javascripts/pages/admin/hooks/index.js create mode 100644 app/assets/javascripts/pages/admin/jobs/index/components/cancel_jobs.vue create mode 100644 app/assets/javascripts/pages/admin/jobs/index/components/cancel_jobs_modal.vue delete mode 100644 app/assets/javascripts/pages/admin/jobs/index/components/stop_jobs_modal.vue create mode 100644 app/assets/javascripts/pages/admin/jobs/index/components/table/admin_jobs_table_app.vue create mode 100644 app/assets/javascripts/pages/admin/runners/new/index.js create mode 100644 app/assets/javascripts/pages/groups/usage_quotas/index.js create mode 100644 app/assets/javascripts/pages/profiles/saved_replies/index.js create mode 100644 app/assets/javascripts/pages/projects/airflow/dags/index/index.js create mode 100644 app/assets/javascripts/pages/projects/find_file/ref_switcher/index.js create mode 100644 app/assets/javascripts/pages/projects/find_file/ref_switcher/ref_switcher_utils.js delete mode 100644 app/assets/javascripts/pages/projects/learn_gitlab/components/included_in_trial_indicator.vue delete mode 100644 app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab.vue delete mode 100644 app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_section_card.vue delete mode 100644 app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_section_link.vue delete mode 100644 app/assets/javascripts/pages/projects/learn_gitlab/constants/index.js delete mode 100644 app/assets/javascripts/pages/projects/learn_gitlab/index/index.js delete mode 100644 app/assets/javascripts/pages/projects/merge_requests/creations/new/compare.js delete mode 100644 app/assets/javascripts/pages/projects/merge_requests/creations/new/compare_autocomplete.js delete mode 100644 app/assets/javascripts/pages/projects/merge_requests/creations/new/target_project_dropdown.js create mode 100644 app/assets/javascripts/pages/projects/ml/experiments/index/index.js delete mode 100644 app/assets/javascripts/pages/search/show/refresh_counts.js delete mode 100644 app/assets/javascripts/pages/shared/mount_runner_aws_deployments.js create mode 100644 app/assets/javascripts/pages/users/show/index.js create mode 100644 app/assets/javascripts/profile/components/activity_tab.vue create mode 100644 app/assets/javascripts/profile/components/contributed_projects_tab.vue create mode 100644 app/assets/javascripts/profile/components/followers_tab.vue create mode 100644 app/assets/javascripts/profile/components/following_tab.vue create mode 100644 app/assets/javascripts/profile/components/groups_tab.vue create mode 100644 app/assets/javascripts/profile/components/overview_tab.vue create mode 100644 app/assets/javascripts/profile/components/personal_projects_tab.vue create mode 100644 app/assets/javascripts/profile/components/profile_tabs.vue create mode 100644 app/assets/javascripts/profile/components/snippets_tab.vue create mode 100644 app/assets/javascripts/profile/components/starred_projects_tab.vue create mode 100644 app/assets/javascripts/profile/index.js delete mode 100644 app/assets/javascripts/project_select.js delete mode 100644 app/assets/javascripts/project_select_combo_button.js delete mode 100644 app/assets/javascripts/projects/merge_requests/components/report_abuse_dropdown_item.vue delete mode 100644 app/assets/javascripts/projects/merge_requests/index.js create mode 100644 app/assets/javascripts/projects/prune_objects_button.js create mode 100644 app/assets/javascripts/projects/prune_unreachable_objects_button.vue create mode 100644 app/assets/javascripts/projects/report_abuse/components/report_abuse_dropdown_item.vue create mode 100644 app/assets/javascripts/projects/report_abuse/index.js create mode 100644 app/assets/javascripts/projects/settings/repository/branch_rules/constants.js delete mode 100644 app/assets/javascripts/ref/components/ref_results_section.vue create mode 100644 app/assets/javascripts/ref/format_refs.js create mode 100644 app/assets/javascripts/releases/release_notification_service.js create mode 100644 app/assets/javascripts/repository/mixins/highlight_mixin.js create mode 100644 app/assets/javascripts/saved_replies/components/app.vue create mode 100644 app/assets/javascripts/saved_replies/components/list.vue create mode 100644 app/assets/javascripts/saved_replies/components/list_item.vue create mode 100644 app/assets/javascripts/saved_replies/index.js create mode 100644 app/assets/javascripts/saved_replies/pages/index.vue create mode 100644 app/assets/javascripts/saved_replies/queries/saved_replies.query.graphql create mode 100644 app/assets/javascripts/saved_replies/routes.js create mode 100644 app/assets/javascripts/search/sidebar/components/checkbox_filter.vue create mode 100644 app/assets/javascripts/search/sidebar/components/language_filter.vue create mode 100644 app/assets/javascripts/search/sidebar/constants/language_filter_data.js create mode 100644 app/assets/javascripts/search/sidebar/utils.js create mode 100644 app/assets/javascripts/sidebar/components/labels/labels_select_widget/graphql/update_test_case_labels.mutation.graphql create mode 100644 app/assets/javascripts/sidebar/components/move/move_issue_button.vue delete mode 100644 app/assets/javascripts/sidebar/components/severity/sidebar_severity.vue create mode 100644 app/assets/javascripts/sidebar/components/severity/sidebar_severity_widget.vue delete mode 100644 app/assets/javascripts/sidebar/lib/sidebar_move_issue.js delete mode 100644 app/assets/javascripts/super_sidebar/components/bottom_bar.vue create mode 100644 app/assets/javascripts/super_sidebar/components/create_menu.vue create mode 100644 app/assets/javascripts/super_sidebar/components/help_center.vue create mode 100644 app/assets/javascripts/super_sidebar/components/merge_request_menu.vue create mode 100644 app/assets/javascripts/token_access/components/inbound_token_access.vue create mode 100644 app/assets/javascripts/token_access/components/opt_in_jwt.vue create mode 100644 app/assets/javascripts/token_access/components/outbound_token_access.vue delete mode 100644 app/assets/javascripts/token_access/components/token_access.vue create mode 100644 app/assets/javascripts/token_access/components/token_access_app.vue create mode 100644 app/assets/javascripts/token_access/constants.js create mode 100644 app/assets/javascripts/token_access/graphql/mutations/inbound_add_project_ci_job_token_scope.mutation.graphql create mode 100644 app/assets/javascripts/token_access/graphql/mutations/inbound_remove_project_ci_job_token_scope.mutation.graphql create mode 100644 app/assets/javascripts/token_access/graphql/mutations/inbound_update_ci_job_token_scope.mutation.graphql create mode 100644 app/assets/javascripts/token_access/graphql/mutations/update_opt_in_jwt.mutation.graphql create mode 100644 app/assets/javascripts/token_access/graphql/queries/get_opt_in_jwt_setting.query.graphql create mode 100644 app/assets/javascripts/token_access/graphql/queries/inbound_get_ci_job_token_scope.query.graphql create mode 100644 app/assets/javascripts/token_access/graphql/queries/inbound_get_projects_with_ci_job_token_scope.query.graphql create mode 100644 app/assets/javascripts/usage_quotas/components/usage_quotas_app.vue create mode 100644 app/assets/javascripts/usage_quotas/constants.js create mode 100644 app/assets/javascripts/usage_quotas/index.js create mode 100644 app/assets/javascripts/vue_merge_request_widget/components/approvals/queries/approved_by.query.graphql create mode 100644 app/assets/javascripts/vue_merge_request_widget/components/bold_text.vue create mode 100644 app/assets/javascripts/vue_merge_request_widget/mappers.js create mode 100644 app/assets/javascripts/vue_shared/components/entity_select/constants.js create mode 100644 app/assets/javascripts/vue_shared/components/entity_select/entity_select.vue create mode 100644 app/assets/javascripts/vue_shared/components/entity_select/group_select.vue create mode 100644 app/assets/javascripts/vue_shared/components/entity_select/init_group_selects.js create mode 100644 app/assets/javascripts/vue_shared/components/entity_select/init_project_selects.js create mode 100644 app/assets/javascripts/vue_shared/components/entity_select/project_select.vue create mode 100644 app/assets/javascripts/vue_shared/components/entity_select/utils.js delete mode 100644 app/assets/javascripts/vue_shared/components/file_icon/file_icon_map.js delete mode 100644 app/assets/javascripts/vue_shared/components/group_select/constants.js delete mode 100644 app/assets/javascripts/vue_shared/components/group_select/group_select.vue delete mode 100644 app/assets/javascripts/vue_shared/components/group_select/init_group_selects.js delete mode 100644 app/assets/javascripts/vue_shared/components/group_select/utils.js create mode 100644 app/assets/javascripts/vue_shared/components/incubation/incubation_alert.vue create mode 100644 app/assets/javascripts/vue_shared/components/incubation/pagination.vue create mode 100644 app/assets/javascripts/vue_shared/components/new_resource_dropdown/constants.js create mode 100644 app/assets/javascripts/vue_shared/components/new_resource_dropdown/graphql/search_user_group_projects_with_merge_requests_enabled.query.graphql create mode 100644 app/assets/javascripts/vue_shared/components/new_resource_dropdown/graphql/search_user_groups_and_projects.query.graphql create mode 100644 app/assets/javascripts/vue_shared/components/new_resource_dropdown/graphql/search_user_projects_with_issues_enabled.query.graphql create mode 100644 app/assets/javascripts/vue_shared/components/new_resource_dropdown/graphql/search_user_projects_with_merge_requests_enabled.query.graphql create mode 100644 app/assets/javascripts/vue_shared/components/new_resource_dropdown/init_new_resource_dropdown.js create mode 100644 app/assets/javascripts/vue_shared/components/new_resource_dropdown/new_resource_dropdown.vue delete mode 100644 app/assets/javascripts/vue_shared/components/runner_aws_deployments/runner_aws_deployments.vue delete mode 100644 app/assets/javascripts/vue_shared/components/runner_aws_deployments/runner_aws_deployments_modal.vue create mode 100644 app/assets/javascripts/vue_shared/components/source_viewer/components/chunk_deprecated.vue create mode 100644 app/assets/javascripts/vue_shared/components/source_viewer/source_viewer_deprecated.vue create mode 100644 app/assets/javascripts/webhooks/components/test_dropdown.vue create mode 100644 app/assets/javascripts/work_items/components/notes/work_item_add_note.vue create mode 100644 app/assets/javascripts/work_items/components/notes/work_item_comment_form.vue create mode 100644 app/assets/javascripts/work_items/components/notes/work_item_comment_locked.vue create mode 100644 app/assets/javascripts/work_items/components/notes/work_item_discussion.vue create mode 100644 app/assets/javascripts/work_items/components/notes/work_item_note_actions.vue create mode 100644 app/assets/javascripts/work_items/components/notes/work_item_note_replying.vue create mode 100644 app/assets/javascripts/work_items/components/notes/work_item_note_signed_out.vue create mode 100644 app/assets/javascripts/work_items/components/widget_wrapper.vue delete mode 100644 app/assets/javascripts/work_items/components/work_item_comment_form.vue delete mode 100644 app/assets/javascripts/work_items/components/work_item_comment_locked.vue create mode 100644 app/assets/javascripts/work_items/components/work_item_created_updated.vue delete mode 100644 app/assets/javascripts/work_items/components/work_item_note_signed_out.vue create mode 100644 app/assets/javascripts/work_items/graphql/add_hierarchy_child.mutation.graphql create mode 100644 app/assets/javascripts/work_items/graphql/cache_utils.js delete mode 100644 app/assets/javascripts/work_items/graphql/create_work_item_note.mutation.graphql create mode 100644 app/assets/javascripts/work_items/graphql/notes/create_work_item_note.mutation.graphql create mode 100644 app/assets/javascripts/work_items/graphql/notes/delete_work_item_notes.mutation.graphql create mode 100644 app/assets/javascripts/work_items/graphql/notes/update_work_item_note.mutation.graphql create mode 100644 app/assets/javascripts/work_items/graphql/notes/work_item_discussion_note.fragment.graphql create mode 100644 app/assets/javascripts/work_items/graphql/notes/work_item_note.fragment.graphql create mode 100644 app/assets/javascripts/work_items/graphql/notes/work_item_note_created.subscription.graphql create mode 100644 app/assets/javascripts/work_items/graphql/notes/work_item_note_deleted.subscription.graphql create mode 100644 app/assets/javascripts/work_items/graphql/notes/work_item_note_updated.subscription.graphql create mode 100644 app/assets/javascripts/work_items/graphql/notes/work_item_notes.query.graphql create mode 100644 app/assets/javascripts/work_items/graphql/notes/work_item_notes_by_iid.query.graphql create mode 100644 app/assets/javascripts/work_items/graphql/remove_hierarchy_child.mutation.graphql delete mode 100644 app/assets/javascripts/work_items/graphql/work_item_note.fragment.graphql delete mode 100644 app/assets/javascripts/work_items/graphql/work_item_notes.query.graphql delete mode 100644 app/assets/javascripts/work_items/graphql/work_item_notes_by_iid.query.graphql delete mode 100644 app/assets/stylesheets/lazy_bundles/select2.scss delete mode 100644 app/assets/stylesheets/lazy_bundles/select2_overrides.scss create mode 100644 app/assets/stylesheets/page_bundles/admin/elasticsearch_form.scss (limited to 'app/assets') diff --git a/app/assets/images/auth_buttons/authentiq_64.png b/app/assets/images/auth_buttons/authentiq_64.png deleted file mode 100644 index 81767bbcc54..00000000000 Binary files a/app/assets/images/auth_buttons/authentiq_64.png and /dev/null differ diff --git a/app/assets/images/auth_buttons/shibboleth_64.png b/app/assets/images/auth_buttons/shibboleth_64.png deleted file mode 100644 index d4c752f9400..00000000000 Binary files a/app/assets/images/auth_buttons/shibboleth_64.png and /dev/null differ diff --git a/app/assets/images/file_icons.svg b/app/assets/images/file_icons.svg deleted file mode 100644 index 8b19f411c7b..00000000000 --- a/app/assets/images/file_icons.svg +++ /dev/null @@ -1 +0,0 @@ -api-blueprintLayer 1Browserslist logoBrowserslist logoCfcucumber-mark-transparent-pipsNVIDIA-LogoDartGroup 3Group 3Asset 3klLayer 1MMocha Logonodemonnpostcss-logo-symbolprettier-icon-darkGroupGroup 2stylelint-icon-whitestylelint-icon-blackTEXTShoudinibadgeBrandVisualStudioCodewolframLanguage diff --git a/app/assets/images/select2-spinner.gif b/app/assets/images/select2-spinner.gif deleted file mode 100644 index 5b33f7e54f4..00000000000 Binary files a/app/assets/images/select2-spinner.gif and /dev/null differ diff --git a/app/assets/images/select2.png b/app/assets/images/select2.png deleted file mode 100644 index 1d804ffb996..00000000000 Binary files a/app/assets/images/select2.png and /dev/null differ diff --git a/app/assets/images/select2x2.png b/app/assets/images/select2x2.png deleted file mode 100644 index 4bdd5c961d4..00000000000 Binary files a/app/assets/images/select2x2.png and /dev/null differ diff --git a/app/assets/javascripts/abuse_reports/components/abuse_category_selector.vue b/app/assets/javascripts/abuse_reports/components/abuse_category_selector.vue index c716afbbcf0..4a7c12e5e51 100644 --- a/app/assets/javascripts/abuse_reports/components/abuse_category_selector.vue +++ b/app/assets/javascripts/abuse_reports/components/abuse_category_selector.vue @@ -18,14 +18,17 @@ export default { reportAbusePath: { default: '', }, + }, + props: { reportedUserId: { - default: '', + type: Number, + required: true, }, reportedFromUrl: { + type: String, + required: false, default: '', }, - }, - props: { showDrawer: { type: Boolean, required: true, @@ -39,8 +42,8 @@ export default { }, categoryOptions: [ { value: 'spam', text: s__("ReportAbuse|They're posting spam.") }, - { value: 'offensive', text: s__("ReportAbuse|They're being offsensive or abusive.") }, - { value: 'phishing', text: s__("ReportAbuse|They're phising.") }, + { value: 'offensive', text: s__("ReportAbuse|They're being offensive or abusive.") }, + { value: 'phishing', text: s__("ReportAbuse|They're phishing.") }, { value: 'crypto', text: s__("ReportAbuse|They're crypto mining.") }, { value: 'credentials', @@ -53,13 +56,22 @@ export default { data() { return { selected: '', + mounted: false, }; }, computed: { drawerOffsetTop() { + // avoid calculating this in advance because it causes layout thrashing + // https://gitlab.com/gitlab-org/gitlab/-/issues/331172#note_1269378396 + if (!this.showDrawer) return '0'; return getContentWrapperHeight('.content-wrapper'); }, }, + mounted() { + // this is required for the component to properly animate + // when it is shown with v-if + this.mounted = true; + }, methods: { closeDrawer() { this.$emit('close-drawer'); @@ -71,7 +83,7 @@ export default { diff --git a/app/assets/javascripts/boards/components/sidebar/board_sidebar_title.vue b/app/assets/javascripts/boards/components/sidebar/board_sidebar_title.vue index 53e574e9942..43a2b13b81c 100644 --- a/app/assets/javascripts/boards/components/sidebar/board_sidebar_title.vue +++ b/app/assets/javascripts/boards/components/sidebar/board_sidebar_title.vue @@ -1,5 +1,5 @@ @@ -315,11 +330,7 @@ export default { class="gl-font-monospace!" spellcheck="false" /> -

+

{{ __('Variable value will be evaluated as raw string.') }}

@@ -340,15 +351,20 @@ export default { data-testid="environment-scope" > - + - + + {{ __('Protect variable') }} - - -

{{ __('Export variable to pipelines running on protected branches and tags only.') }}

@@ -384,9 +412,6 @@ export default { data-testid="ci-variable-masked-checkbox" > {{ __('Mask variable') }} - - -

{{ __('Variable will be masked in job logs.') }} {{ - __('More information') + __('Learn more.') }}

@@ -408,11 +433,8 @@ export default { @change="setVariableRaw" > {{ __('Expand variable reference') }} - - -

- + @@ -428,10 +450,10 @@ export default { data-testid="aws-guidance-tip" @dismiss="dismissTip" > -

+

- + @@ -467,7 +489,7 @@ export default { variant="warning" data-testid="contains-variable-reference" > - + diff --git a/app/assets/javascripts/ci/ci_variable_list/constants.js b/app/assets/javascripts/ci/ci_variable_list/constants.js index 828d0724d93..627ace1b28e 100644 --- a/app/assets/javascripts/ci/ci_variable_list/constants.js +++ b/app/assets/javascripts/ci/ci_variable_list/constants.js @@ -72,14 +72,14 @@ export const AWS_TOKEN_CONSTANTS = [AWS_ACCESS_KEY_ID, AWS_DEFAULT_REGION, AWS_S export const CONTAINS_VARIABLE_REFERENCE_MESSAGE = __( 'Unselect "Expand variable reference" if you want to use the variable value as a raw string.', ); - +export const DEFAULT_EXCEEDS_VARIABLE_LIMIT_TEXT = s__( + 'CiVariables|You have reached the maximum number of variables available. To add new variables, you must reduce the number of defined variables.', +); export const ENVIRONMENT_SCOPE_LINK_TITLE = __('Learn more'); export const EXCEEDS_VARIABLE_LIMIT_TEXT = s__( 'CiVariables|This %{entity} has %{currentVariableCount} defined CI/CD variables. The maximum number of variables per %{entity} is %{maxVariableLimit}. To add new variables, you must reduce the number of defined variables.', ); -export const DEFAULT_EXCEEDS_VARIABLE_LIMIT_TEXT = s__( - 'CiVariables|You have reached the maximum number of variables available. To add new variables, you must reduce the number of defined variables.', -); +export const FLAG_LINK_TITLE = s__('CiVariable|Define a CI/CD variable in the UI'); export const MAXIMUM_VARIABLE_LIMIT_REACHED = s__( 'CiVariables|Maximum number of variables reached.', ); @@ -88,9 +88,6 @@ export const ADD_VARIABLE_ACTION = 'ADD_VARIABLE'; export const EDIT_VARIABLE_ACTION = 'EDIT_VARIABLE'; export const VARIABLE_ACTIONS = [ADD_VARIABLE_ACTION, EDIT_VARIABLE_ACTION]; -export const GRAPHQL_PROJECT_TYPE = 'Project'; -export const GRAPHQL_GROUP_TYPE = 'Group'; - export const ADD_MUTATION_ACTION = 'add'; export const UPDATE_MUTATION_ACTION = 'update'; export const DELETE_MUTATION_ACTION = 'delete'; diff --git a/app/assets/javascripts/ci/ci_variable_list/graphql/settings.js b/app/assets/javascripts/ci/ci_variable_list/graphql/settings.js index 10203383ba0..cafe3df35d0 100644 --- a/app/assets/javascripts/ci/ci_variable_list/graphql/settings.js +++ b/app/assets/javascripts/ci/ci_variable_list/graphql/settings.js @@ -3,14 +3,9 @@ import { convertObjectPropsToCamelCase, convertObjectPropsToSnakeCase, } from '~/lib/utils/common_utils'; +import { TYPENAME_CI_VARIABLE, TYPENAME_GROUP, TYPENAME_PROJECT } from '~/graphql_shared/constants'; import { convertToGraphQLId, getIdFromGraphQLId } from '~/graphql_shared/utils'; -import { - GRAPHQL_GROUP_TYPE, - GRAPHQL_PROJECT_TYPE, - groupString, - instanceString, - projectString, -} from '../constants'; +import { groupString, instanceString, projectString } from '../constants'; import getProjectVariables from './queries/project_variables.query.graphql'; import getGroupVariables from './queries/group_variables.query.graphql'; import getAdminVariables from './queries/variables.query.graphql'; @@ -30,7 +25,7 @@ const mapVariableTypes = (variables = [], kind) => { return { __typename: `Ci${kind}Variable`, ...convertObjectPropsToCamelCase(ciVar), - id: convertToGraphQLId('Ci::Variable', ciVar.id), + id: convertToGraphQLId(TYPENAME_CI_VARIABLE, ciVar.id), variableType: ciVar.variable_type ? ciVar.variable_type.toUpperCase() : ciVar.variableType, }; }); @@ -40,10 +35,10 @@ const prepareProjectGraphQLResponse = ({ data, id, errors = [] }) => { return { errors, project: { - __typename: GRAPHQL_PROJECT_TYPE, - id: convertToGraphQLId(GRAPHQL_PROJECT_TYPE, id), + __typename: TYPENAME_PROJECT, + id: convertToGraphQLId(TYPENAME_PROJECT, id), ciVariables: { - __typename: `Ci${GRAPHQL_PROJECT_TYPE}VariableConnection`, + __typename: 'CiProjectVariableConnection', pageInfo: { __typename: 'PageInfo', hasNextPage: false, @@ -61,10 +56,10 @@ const prepareGroupGraphQLResponse = ({ data, id, errors = [] }) => { return { errors, group: { - __typename: GRAPHQL_GROUP_TYPE, - id: convertToGraphQLId(GRAPHQL_GROUP_TYPE, id), + __typename: TYPENAME_GROUP, + id: convertToGraphQLId(TYPENAME_GROUP, id), ciVariables: { - __typename: `Ci${GRAPHQL_GROUP_TYPE}VariableConnection`, + __typename: `CiGroupVariableConnection`, pageInfo: { __typename: 'PageInfo', hasNextPage: false, diff --git a/app/assets/javascripts/ci/ci_variable_list/index.js b/app/assets/javascripts/ci/ci_variable_list/index.js index 174a59aba42..4270c3c67fc 100644 --- a/app/assets/javascripts/ci/ci_variable_list/index.js +++ b/app/assets/javascripts/ci/ci_variable_list/index.js @@ -21,11 +21,11 @@ const mountCiVariableListApp = (containerEl) => { isGroup, isProject, maskedEnvironmentVariablesLink, + maskableRawRegex, maskableRegex, projectFullPath, projectId, protectedByDefault, - protectedEnvironmentVariablesLink, } = containerEl.dataset; const parsedIsProject = parseBoolean(isProject); @@ -63,10 +63,10 @@ const mountCiVariableListApp = (containerEl) => { isProject: parsedIsProject, isProtectedByDefault, maskedEnvironmentVariablesLink, + maskableRawRegex, maskableRegex, projectFullPath, projectId, - protectedEnvironmentVariablesLink, }, render(createElement) { return createElement(component); diff --git a/app/assets/javascripts/ci/pipeline_editor/components/drawer/pipeline_editor_drawer.vue b/app/assets/javascripts/ci/pipeline_editor/components/drawer/pipeline_editor_drawer.vue index 375db7f3054..ea7201efcd9 100644 --- a/app/assets/javascripts/ci/pipeline_editor/components/drawer/pipeline_editor_drawer.vue +++ b/app/assets/javascripts/ci/pipeline_editor/components/drawer/pipeline_editor_drawer.vue @@ -1,6 +1,8 @@ diff --git a/app/assets/javascripts/ci/pipeline_new/components/pipeline_new_form.vue b/app/assets/javascripts/ci/pipeline_new/components/pipeline_new_form.vue index 5692627abef..8837b7a1917 100644 --- a/app/assets/javascripts/ci/pipeline_new/components/pipeline_new_form.vue +++ b/app/assets/javascripts/ci/pipeline_new/components/pipeline_new_form.vue @@ -16,18 +16,29 @@ import { import * as Sentry from '@sentry/browser'; import { uniqueId } from 'lodash'; import Vue from 'vue'; +import { fetchPolicies } from '~/lib/graphql'; import SafeHtml from '~/vue_shared/directives/safe_html'; import { redirectTo } from '~/lib/utils/url_utility'; import { s__, __, n__ } from '~/locale'; -import { VARIABLE_TYPE, FILE_TYPE, CC_VALIDATION_REQUIRED_ERROR } from '../constants'; +import { + CC_VALIDATION_REQUIRED_ERROR, + CONFIG_VARIABLES_TIMEOUT, + FILE_TYPE, + VARIABLE_TYPE, +} from '../constants'; import createPipelineMutation from '../graphql/mutations/create_pipeline.mutation.graphql'; import ciConfigVariablesQuery from '../graphql/queries/ci_config_variables.graphql'; import filterVariables from '../utils/filter_variables'; import RefsDropdown from './refs_dropdown.vue'; +let pollTimeout; +export const POLLING_INTERVAL = 2000; const i18n = { variablesDescription: s__( - 'Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default.', + 'Pipeline|Specify variable values to be used in this run. The variables specified in the configuration file as well as %{linkStart}CI/CD settings%{linkEnd} are used by default.', + ), + overrideNoteText: s__( + 'CiVariables|Variables specified here are %{boldStart}expanded%{boldEnd} and not %{boldStart}masked.%{boldEnd}', ), defaultError: __('Something went wrong on our end. Please try again.'), refsLoadingErrorTitle: s__('Pipeline|Branches or tags could not be loaded.'), @@ -115,10 +126,11 @@ export default { // https://gitlab.com/gitlab-org/gitlab/-/issues/287815 fullName: this.refParam === this.defaultBranch ? `refs/heads/${this.refParam}` : undefined, }, + configVariablesWithDescription: {}, form: {}, errorTitle: null, error: null, - predefinedValueOptions: {}, + predefinedVariables: null, warnings: [], totalWarnings: 0, isWarningDismissed: false, @@ -128,6 +140,7 @@ export default { }, apollo: { ciConfigVariables: { + fetchPolicy: fetchPolicies.NO_CACHE, query: ciConfigVariablesQuery, // Skip when variables already cached in `form` skip() { @@ -140,46 +153,40 @@ export default { }; }, update({ project }) { - return project?.ciConfigVariables || []; + return project?.ciConfigVariables; }, result({ data }) { - const predefinedVars = data?.project?.ciConfigVariables || []; - const params = {}; - const descriptions = {}; - - predefinedVars.forEach(({ description, key, value, valueOptions }) => { - if (description) { - params[key] = value; - descriptions[key] = description; - this.predefinedValueOptions[key] = valueOptions; - } - }); - - Vue.set(this.form, this.refFullName, { descriptions, variables: [] }); + this.predefinedVariables = data?.project?.ciConfigVariables; - // Add default variables from yml - this.setVariableParams(this.refFullName, VARIABLE_TYPE, params); - - // Add/update variables, e.g. from query string - if (this.variableParams) { - this.setVariableParams(this.refFullName, VARIABLE_TYPE, this.variableParams); + // API cache is empty when predefinedVariables === null, so we need to + // poll while cache values are being populated in the backend. + // After CONFIG_VARIABLES_TIMEOUT ms have passed, we stop polling + // and populate the form regardless. + if (this.isFetchingCiConfigVariables && !pollTimeout) { + pollTimeout = setTimeout(() => { + this.predefinedVariables = []; + this.clearPolling(); + this.populateForm(); + }, CONFIG_VARIABLES_TIMEOUT); } - if (this.fileParams) { - this.setVariableParams(this.refFullName, FILE_TYPE, this.fileParams); + if (!this.isFetchingCiConfigVariables) { + this.clearPolling(); + this.populateForm(); } - - // Adds empty var at the end of the form - this.addEmptyVariable(this.refFullName); }, error(error) { Sentry.captureException(error); }, + pollInterval: POLLING_INTERVAL, }, }, computed: { + isFetchingCiConfigVariables() { + return this.predefinedVariables === null; + }, isLoading() { - return this.$apollo.queries.ciConfigVariables.loading; + return this.$apollo.queries.ciConfigVariables.loading || this.isFetchingCiConfigVariables; }, overMaxWarningsLimit() { return this.totalWarnings > this.maxWarnings; @@ -228,6 +235,48 @@ export default { value: '', }); }, + clearPolling() { + clearTimeout(pollTimeout); + this.$apollo.queries.ciConfigVariables.stopPolling(); + }, + populateForm() { + this.configVariablesWithDescription = this.predefinedVariables.reduce( + (accumulator, { description, key, value, valueOptions }) => { + if (description) { + accumulator.descriptions[key] = description; + accumulator.values[key] = value; + accumulator.options[key] = valueOptions; + } + + return accumulator; + }, + { descriptions: {}, values: {}, options: {} }, + ); + + Vue.set(this.form, this.refFullName, { + descriptions: this.configVariablesWithDescription.descriptions, + variables: [], + }); + + // Add default variables from yml + this.setVariableParams( + this.refFullName, + VARIABLE_TYPE, + this.configVariablesWithDescription.values, + ); + + // Add/update variables, e.g. from query string + if (this.variableParams) { + this.setVariableParams(this.refFullName, VARIABLE_TYPE, this.variableParams); + } + + if (this.fileParams) { + this.setVariableParams(this.refFullName, FILE_TYPE, this.fileParams); + } + + // Adds empty var at the end of the form + this.addEmptyVariable(this.refFullName); + }, setVariable(refValue, type, key, value) { const { variables } = this.form[refValue]; @@ -255,7 +304,7 @@ export default { }); }, shouldShowValuesDropdown(key) { - return this.predefinedValueOptions[key]?.length > 1; + return this.configVariablesWithDescription.options[key]?.length > 1; }, removeVariable(index) { this.variables.splice(index, 1); @@ -362,7 +411,7 @@ export default { - +

- {{ value }} + {{ option }} +
+ + + +
+import { GlSprintf, GlLink, GlModalDirective } from '@gitlab/ui'; +import RunnerInstructionsModal from '~/vue_shared/components/runner_instructions/runner_instructions_modal.vue'; +import RunnerPlatformsRadioGroup from '~/ci/runner/components/runner_platforms_radio_group.vue'; +import RunnerFormFields from '~/ci/runner/components/runner_form_fields.vue'; +import { DEFAULT_PLATFORM, DEFAULT_ACCESS_LEVEL } from '../constants'; + +export default { + name: 'AdminNewRunnerApp', + components: { + GlLink, + GlSprintf, + RunnerInstructionsModal, + RunnerPlatformsRadioGroup, + RunnerFormFields, + }, + directives: { + GlModal: GlModalDirective, + }, + props: { + legacyRegistrationToken: { + type: String, + required: true, + }, + }, + data() { + return { + platform: DEFAULT_PLATFORM, + runner: { + description: '', + maintenanceNote: '', + paused: false, + accessLevel: DEFAULT_ACCESS_LEVEL, + runUntagged: false, + tagList: '', + maximumTimeout: ' ', + }, + }; + }, + modalId: 'runners-legacy-registration-instructions-modal', +}; + + + diff --git a/app/assets/javascripts/ci/runner/admin_new_runner/index.js b/app/assets/javascripts/ci/runner/admin_new_runner/index.js new file mode 100644 index 00000000000..502d9d33b4d --- /dev/null +++ b/app/assets/javascripts/ci/runner/admin_new_runner/index.js @@ -0,0 +1,32 @@ +import Vue from 'vue'; +import VueApollo from 'vue-apollo'; +import createDefaultClient from '~/lib/graphql'; +import AdminNewRunnerApp from './admin_new_runner_app.vue'; + +Vue.use(VueApollo); + +export const initAdminNewRunner = (selector = '#js-admin-new-runner') => { + const el = document.querySelector(selector); + + if (!el) { + return null; + } + + const { legacyRegistrationToken } = el.dataset; + + const apolloProvider = new VueApollo({ + defaultClient: createDefaultClient(), + }); + + return new Vue({ + el, + apolloProvider, + render(h) { + return h(AdminNewRunnerApp, { + props: { + legacyRegistrationToken, + }, + }); + }, + }); +}; diff --git a/app/assets/javascripts/ci/runner/admin_runner_show/admin_runner_show_app.vue b/app/assets/javascripts/ci/runner/admin_runner_show/admin_runner_show_app.vue index 66d790acb00..8d4303778af 100644 --- a/app/assets/javascripts/ci/runner/admin_runner_show/admin_runner_show_app.vue +++ b/app/assets/javascripts/ci/runner/admin_runner_show/admin_runner_show_app.vue @@ -1,53 +1,29 @@ - - - - - - - - - - - +
diff --git a/app/assets/javascripts/ci/runner/admin_runners/admin_runners_app.vue b/app/assets/javascripts/ci/runner/admin_runners/admin_runners_app.vue index 3bd20dff9cc..ce2c511ddd4 100644 --- a/app/assets/javascripts/ci/runner/admin_runners/admin_runners_app.vue +++ b/app/assets/javascripts/ci/runner/admin_runners/admin_runners_app.vue @@ -1,5 +1,5 @@ - + +
diff --git a/app/assets/javascripts/ci_settings_pipeline_triggers/components/triggers_list.vue b/app/assets/javascripts/ci_settings_pipeline_triggers/components/triggers_list.vue index 1f8096da94d..a1b264cfe54 100644 --- a/app/assets/javascripts/ci_settings_pipeline_triggers/components/triggers_list.vue +++ b/app/assets/javascripts/ci_settings_pipeline_triggers/components/triggers_list.vue @@ -8,7 +8,8 @@ import { GlTable, GlTooltipDirective, } from '@gitlab/ui'; -import { s__ } from '~/locale'; +import { __, s__ } from '~/locale'; +import { thWidthPercent } from '~/lib/utils/table_utility'; import ClipboardButton from '~/vue_shared/components/clipboard_button.vue'; import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue'; import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate/tooltip_on_truncate.vue'; @@ -43,43 +44,70 @@ export default { default: () => [], }, }, + data() { + return { + areValuesHidden: true, + }; + }, fields: [ { key: 'token', label: s__('Pipelines|Token'), + thClass: thWidthPercent(70), }, { key: 'description', label: s__('Pipelines|Description'), + thClass: thWidthPercent(15), }, { key: 'owner', label: s__('Pipelines|Owner'), + thClass: thWidthPercent(5), }, { key: 'lastUsed', label: s__('Pipelines|Last Used'), + thClass: thWidthPercent(5), }, { key: 'actions', label: '', tdClass: 'gl-text-right gl-white-space-nowrap', + thClass: thWidthPercent(5), }, ], + computed: { + valuesButtonText() { + return this.areValuesHidden ? __('Reveal values') : __('Hide values'); + }, + hasTriggers() { + return this.triggers.length; + }, + maskedToken() { + return '*'.repeat(47); + }, + }, + methods: { + toggleHiddenState() { + this.areValuesHidden = !this.areValuesHidden; + }, + }, }; diff --git a/app/assets/javascripts/gl_form.js b/app/assets/javascripts/gl_form.js index 2b157fac878..f4008fe3cc9 100644 --- a/app/assets/javascripts/gl_form.js +++ b/app/assets/javascripts/gl_form.js @@ -1,5 +1,6 @@ import autosize from 'autosize'; import $ from 'jquery'; +import { isEmpty } from 'lodash'; import GfmAutoComplete, { defaultAutocompleteConfig } from 'ee_else_ce/gfm_auto_complete'; import { disableButtonIfEmptyField } from '~/lib/utils/common_utils'; import dropzoneInput from './dropzone_input'; @@ -12,14 +13,22 @@ export default class GLForm { * @param {jQuery} form Root element of the GLForm * @param {Object} enableGFM Which autocomplete features should be enabled? * @param {Boolean} forceNew If true, treat the element as a **new** form even if `gfm-form` class already exists. + * @param {Object} gfmDataSources The paths of the autocomplete data sources to use for GfmAutoComplete + * By default, the backend embeds these in the global object gl.GfmAutocomplete.dataSources. + * Use this param to override them. */ - constructor(form, enableGFM = {}, forceNew = false) { + constructor(form, enableGFM = {}, forceNew = false, gfmDataSources = {}) { this.form = form; this.textarea = this.form.find('textarea.js-gfm-input'); this.enableGFM = { ...defaultAutocompleteConfig, ...enableGFM }; // Disable autocomplete for keywords which do not have dataSources available - const dataSources = (gl.GfmAutoComplete && gl.GfmAutoComplete.dataSources) || {}; + let dataSources = (gl.GfmAutoComplete && gl.GfmAutoComplete.dataSources) || {}; + + if (!isEmpty(gfmDataSources)) { + dataSources = gfmDataSources; + } + Object.keys(this.enableGFM).forEach((item) => { if (item !== 'emojis' && !dataSources[item]) { this.enableGFM[item] = false; @@ -29,7 +38,7 @@ export default class GLForm { // Before we start, we should clean up any previous data for this form this.destroy(); // Set up the form - this.setupForm(forceNew); + this.setupForm(dataSources, forceNew); this.form.data('glForm', this); } @@ -46,7 +55,7 @@ export default class GLForm { this.form.data('glForm', null); } - setupForm(forceNew = false) { + setupForm(dataSources, forceNew = false) { const isNewForm = this.form.is(':not(.gfm-form)') || forceNew; this.form.removeClass('js-new-note-form'); if (isNewForm) { @@ -57,7 +66,7 @@ export default class GLForm { this.form.find('.js-note-text'), this.form.find('.js-comment-button, .js-note-new-discussion'), ); - this.autoComplete = new GfmAutoComplete(gl.GfmAutoComplete && gl.GfmAutoComplete.dataSources); + this.autoComplete = new GfmAutoComplete(dataSources); this.autoComplete.setup(this.form.find('.js-gfm-input'), this.enableGFM); this.formDropzone = dropzoneInput(this.form, { parallelUploads: 1 }); diff --git a/app/assets/javascripts/gpg_badges.js b/app/assets/javascripts/gpg_badges.js index 0a4733de65f..ad339155a59 100644 --- a/app/assets/javascripts/gpg_badges.js +++ b/app/assets/javascripts/gpg_badges.js @@ -13,7 +13,7 @@ export default class GpgBadges { return Promise.resolve(); } - const badges = $('.js-loading-gpg-badge'); + const badges = $('.js-loading-signature-badge'); badges.html(loadingIconForLegacyJS()); badges.children().attr('aria-label', __('Loading')); diff --git a/app/assets/javascripts/graphql_shared/constants.js b/app/assets/javascripts/graphql_shared/constants.js index 22fa2912881..3c4ca4c197e 100644 --- a/app/assets/javascripts/graphql_shared/constants.js +++ b/app/assets/javascripts/graphql_shared/constants.js @@ -1,23 +1,28 @@ export const MINIMUM_SEARCH_LENGTH = 3; -export const TYPE_BOARD = 'Board'; -export const TYPE_CI_RUNNER = 'Ci::Runner'; -export const TYPE_CRM_CONTACT = 'CustomerRelations::Contact'; -export const TYPE_CRM_ORGANIZATION = 'CustomerRelations::Organization'; -export const TYPE_DISCUSSION = 'Discussion'; -export const TYPE_EPIC = 'Epic'; -export const TYPE_EPIC_BOARD = 'Boards::EpicBoard'; -export const TYPE_GROUP = 'Group'; -export const TYPE_ISSUE = 'Issue'; -export const TYPE_ITERATION = 'Iteration'; -export const TYPE_ITERATIONS_CADENCE = 'Iterations::Cadence'; -export const TYPE_MERGE_REQUEST = 'MergeRequest'; -export const TYPE_MILESTONE = 'Milestone'; -export const TYPE_NOTE = 'Note'; -export const TYPE_PACKAGES_PACKAGE = 'Packages::Package'; -export const TYPE_PROJECT = 'Project'; -export const TYPE_SCANNER_PROFILE = 'DastScannerProfile'; -export const TYPE_SITE_PROFILE = 'DastSiteProfile'; -export const TYPE_USER = 'User'; -export const TYPE_VULNERABILITY = 'Vulnerability'; -export const TYPE_WORK_ITEM = 'WorkItem'; +export const TYPENAME_BOARD = 'Board'; +export const TYPENAME_CI_BUILD = 'Ci::Build'; +export const TYPENAME_CI_PIPELINE = 'Ci::Pipeline'; +export const TYPENAME_CI_RUNNER = 'Ci::Runner'; +export const TYPENAME_CI_VARIABLE = 'Ci::Variable'; +export const TYPENAME_COMMIT_STATUS = 'CommitStatus'; +export const TYPENAME_CRM_CONTACT = 'CustomerRelations::Contact'; +export const TYPENAME_CRM_ORGANIZATION = 'CustomerRelations::Organization'; +export const TYPENAME_DISCUSSION = 'Discussion'; +export const TYPENAME_EPIC = 'Epic'; +export const TYPENAME_EPIC_BOARD = 'Boards::EpicBoard'; +export const TYPENAME_GROUP = 'Group'; +export const TYPENAME_ISSUE = 'Issue'; +export const TYPENAME_ITERATION = 'Iteration'; +export const TYPENAME_ITERATIONS_CADENCE = 'Iterations::Cadence'; +export const TYPENAME_MERGE_REQUEST = 'MergeRequest'; +export const TYPENAME_MILESTONE = 'Milestone'; +export const TYPENAME_NOTE = 'Note'; +export const TYPENAME_PACKAGES_PACKAGE = 'Packages::Package'; +export const TYPENAME_PROJECT = 'Project'; +export const TYPENAME_SCANNER_PROFILE = 'DastScannerProfile'; +export const TYPENAME_SITE_PROFILE = 'DastSiteProfile'; +export const TYPENAME_USER = 'User'; +export const TYPENAME_VULNERABILITIES_SCANNER = 'Vulnerabilities::Scanner'; +export const TYPENAME_VULNERABILITY = 'Vulnerability'; +export const TYPENAME_WORK_ITEM = 'WorkItem'; diff --git a/app/assets/javascripts/graphql_shared/issuable_client.js b/app/assets/javascripts/graphql_shared/issuable_client.js index 01cc2fc3018..316bc746051 100644 --- a/app/assets/javascripts/graphql_shared/issuable_client.js +++ b/app/assets/javascripts/graphql_shared/issuable_client.js @@ -6,6 +6,8 @@ import getIssueStateQuery from '~/issues/show/queries/get_issue_state.query.grap import createDefaultClient from '~/lib/graphql'; import typeDefs from '~/work_items/graphql/typedefs.graphql'; import { WIDGET_TYPE_NOTES } from '~/work_items/constants'; +import getWorkItemLinksQuery from '~/work_items/graphql/work_item_links.query.graphql'; +import { findHierarchyWidgetChildren } from '~/work_items/utils'; export const config = { typeDefs, @@ -13,7 +15,9 @@ export const config = { // included temporarily until Vuex is removed from boards app dataIdFromObject: (object) => { // eslint-disable-next-line no-underscore-dangle - return object.__typename === 'BoardList' ? object.iid : defaultDataIdFromObject(object); + return object.__typename === 'BoardList' && !window.gon?.features?.apolloBoards + ? object.iid + : defaultDataIdFromObject(object); }, typePolicies: { Project: { @@ -72,6 +76,7 @@ export const config = { }, }; } + return incomingWidget || existingWidget; }); }, @@ -83,12 +88,85 @@ export const config = { nodes: concatPagination(), }, }, + ...(window.gon?.features?.apolloBoards + ? { + BoardList: { + fields: { + issues: { + keyArgs: ['filters'], + }, + }, + }, + IssueConnection: { + merge(existing = { nodes: [] }, incoming, { args }) { + if (!args.after) { + return incoming; + } + return { + ...incoming, + nodes: [...existing.nodes, ...incoming.nodes], + }; + }, + }, + EpicList: { + fields: { + epics: { + keyArgs: ['filters'], + }, + }, + }, + EpicConnection: { + merge(existing = { nodes: [] }, incoming, { args }) { + if (!args.after) { + return incoming; + } + return { + ...incoming, + nodes: [...existing.nodes, ...incoming.nodes], + }; + }, + }, + BoardEpicConnection: { + merge(existing = { nodes: [] }, incoming, { args }) { + if (!args.after) { + return incoming; + } + return { + ...incoming, + nodes: [...existing.nodes, ...incoming.nodes], + }; + }, + }, + } + : {}), }, }, }; export const resolvers = { Mutation: { + addHierarchyChild: (_, { id, workItem }, { cache }) => { + const queryArgs = { query: getWorkItemLinksQuery, variables: { id } }; + const sourceData = cache.readQuery(queryArgs); + + const data = produce(sourceData, (draftState) => { + findHierarchyWidgetChildren(draftState.workItem).push(workItem); + }); + + cache.writeQuery({ ...queryArgs, data }); + }, + removeHierarchyChild: (_, { id, workItem }, { cache }) => { + const queryArgs = { query: getWorkItemLinksQuery, variables: { id } }; + const sourceData = cache.readQuery(queryArgs); + + const data = produce(sourceData, (draftState) => { + const hierarchyChildren = findHierarchyWidgetChildren(draftState.workItem); + const index = hierarchyChildren.findIndex((child) => child.id === workItem.id); + hierarchyChildren.splice(index, 1); + }); + + cache.writeQuery({ ...queryArgs, data }); + }, updateIssueState: (_, { issueType = undefined, isDirty = false }, { cache }) => { const sourceData = cache.readQuery({ query: getIssueStateQuery }); const data = produce(sourceData, (draftData) => { diff --git a/app/assets/javascripts/graphql_shared/possible_types.json b/app/assets/javascripts/graphql_shared/possible_types.json index a622b342c0a..4a5536986bd 100644 --- a/app/assets/javascripts/graphql_shared/possible_types.json +++ b/app/assets/javascripts/graphql_shared/possible_types.json @@ -156,6 +156,7 @@ "WorkItemWidgetRequirementLegacy", "WorkItemWidgetStartAndDueDate", "WorkItemWidgetStatus", + "WorkItemWidgetTestReports", "WorkItemWidgetWeight" ] -} +} \ No newline at end of file diff --git a/app/assets/javascripts/graphql_shared/utils.js b/app/assets/javascripts/graphql_shared/utils.js index 8fb70eb59bd..806e89d6e9f 100644 --- a/app/assets/javascripts/graphql_shared/utils.js +++ b/app/assets/javascripts/graphql_shared/utils.js @@ -104,3 +104,15 @@ export const convertNodeIdsFromGraphQLIds = (nodes) => { return nodes.map((node) => (node.id ? { ...node, id: getIdFromGraphQLId(node.id) } : node)); }; + +/** + * This function takes a GraphQL query data as a required argument and + * the field name to resolve as an optional argument + * and returns resolved field's data or an empty array + * @param {Object} queryData + * @param {String} nodesField (in most cases it will be 'nodes') + * @returns {Array} + */ +export const getNodesOrDefault = (queryData, nodesField = 'nodes') => { + return queryData?.[nodesField] ?? []; +}; diff --git a/app/assets/javascripts/groups/components/app.vue b/app/assets/javascripts/groups/components/app.vue index 46d5341ea97..148bf0a98ee 100644 --- a/app/assets/javascripts/groups/components/app.vue +++ b/app/assets/javascripts/groups/components/app.vue @@ -1,6 +1,7 @@ - - diff --git a/app/assets/javascripts/ide/components/preview/navigator.vue b/app/assets/javascripts/ide/components/preview/navigator.vue deleted file mode 100644 index 852de16d508..00000000000 --- a/app/assets/javascripts/ide/components/preview/navigator.vue +++ /dev/null @@ -1,136 +0,0 @@ - - - diff --git a/app/assets/javascripts/ide/constants.js b/app/assets/javascripts/ide/constants.js index 01ce5fa07ee..1aa64656c30 100644 --- a/app/assets/javascripts/ide/constants.js +++ b/app/assets/javascripts/ide/constants.js @@ -64,7 +64,6 @@ export const rightSidebarViews = { pipelines: { name: 'pipelines-list', keepAlive: true }, jobsDetail: { name: 'jobs-detail', keepAlive: false }, mergeRequestInfo: { name: 'merge-request-info', keepAlive: true }, - clientSidePreview: { name: 'clientside', keepAlive: false }, terminal: { name: 'terminal', keepAlive: true }, }; @@ -101,22 +100,13 @@ export const commitActionTypes = { update: 'update', }; -export const packageJsonPath = 'package.json'; - export const SIDE_LEFT = 'left'; export const SIDE_RIGHT = 'right'; -// Live Preview feature -export const LIVE_PREVIEW_DEBOUNCE = 2000; - // This is the maximum number of files to auto open when opening the Web IDE // from a merge request export const MAX_MR_FILES_AUTO_OPEN = 10; export const DEFAULT_BRANCH = 'main'; -// Ping Usage Metrics Keys -export const PING_USAGE_PREVIEW_KEY = 'web_ide_clientside_preview'; -export const PING_USAGE_PREVIEW_SUCCESS_KEY = 'web_ide_clientside_preview_success'; - export const GITLAB_WEB_IDE_FEEDBACK_ISSUE = 'https://gitlab.com/gitlab-org/gitlab/-/issues/377367'; diff --git a/app/assets/javascripts/ide/index.js b/app/assets/javascripts/ide/index.js index 1347d92b3b7..29c44d2f596 100644 --- a/app/assets/javascripts/ide/index.js +++ b/app/assets/javascripts/ide/index.js @@ -67,10 +67,8 @@ export const initLegacyWebIDE = (el, options = {}) => { forkInfo: el.dataset.forkInfo ? JSON.parse(el.dataset.forkInfo) : null, }); this.init({ - clientsidePreviewEnabled: parseBoolean(el.dataset.clientsidePreviewEnabled), renderWhitespaceInCode: parseBoolean(el.dataset.renderWhitespaceInCode), editorTheme: window.gon?.user_color_scheme || DEFAULT_THEME, - codesandboxBundlerUrl: el.dataset.codesandboxBundlerUrl, environmentsGuidanceAlertDismissed: !parseBoolean(el.dataset.enableEnvironmentsGuidance), previewMarkdownPath: el.dataset.previewMarkdownPath, userPreferencesPath: el.dataset.userPreferencesPath, diff --git a/app/assets/javascripts/ide/init_gitlab_web_ide.js b/app/assets/javascripts/ide/init_gitlab_web_ide.js index d3c64754e8a..4d3cefcb107 100644 --- a/app/assets/javascripts/ide/init_gitlab_web_ide.js +++ b/app/assets/javascripts/ide/init_gitlab_web_ide.js @@ -7,6 +7,7 @@ import csrf from '~/lib/utils/csrf'; import { getBaseConfig } from './lib/gitlab_web_ide/get_base_config'; import { setupRootElement } from './lib/gitlab_web_ide/setup_root_element'; import { GITLAB_WEB_IDE_FEEDBACK_ISSUE } from './constants'; +import { handleTracking } from './lib/gitlab_web_ide/handle_tracking_event'; const buildRemoteIdeURL = (ideRemotePath, remoteHost, remotePathArg) => { const remotePath = cleanLeadingSeparator(remotePathArg); @@ -38,6 +39,9 @@ export const initGitlabWebIDE = async (el) => { filePath, mergeRequest: mrId, forkInfo: forkInfoJSON, + editorFontSrcUrl, + editorFontFormat, + editorFontFamily, } = el.dataset; const rootEl = setupRootElement(el); @@ -64,6 +68,12 @@ export const initGitlabWebIDE = async (el) => { feedbackIssue: GITLAB_WEB_IDE_FEEDBACK_ISSUE, userPreferences: el.dataset.userPreferencesPath, }, + editorFont: { + srcUrl: editorFontSrcUrl, + fontFamily: editorFontFamily, + format: editorFontFormat, + }, + handleTracking, async handleStartRemote({ remoteHost, remotePath, connectionToken }) { const confirmed = await confirmAction( __('Are you sure you want to leave the Web IDE? All unsaved changes will be lost.'), diff --git a/app/assets/javascripts/ide/lib/editor_options.js b/app/assets/javascripts/ide/lib/editor_options.js index 289027c3054..7a516f5e3f5 100644 --- a/app/assets/javascripts/ide/lib/editor_options.js +++ b/app/assets/javascripts/ide/lib/editor_options.js @@ -1,12 +1,5 @@ -import { useNewFonts } from '~/lib/utils/common_utils'; import { getCssVariable } from '~/lib/utils/css_utils'; -const fontOptions = {}; - -if (useNewFonts()) { - fontOptions.fontFamily = getCssVariable('--code-editor-font'); -} - export const defaultEditorOptions = { model: null, readOnly: false, @@ -18,7 +11,7 @@ export const defaultEditorOptions = { wordWrap: 'on', glyphMargin: true, automaticLayout: true, - ...fontOptions, + fontFamily: getCssVariable('--code-editor-font'), }; export const defaultDiffOptions = { diff --git a/app/assets/javascripts/ide/lib/gitlab_web_ide/handle_tracking_event.js b/app/assets/javascripts/ide/lib/gitlab_web_ide/handle_tracking_event.js new file mode 100644 index 00000000000..615dad02386 --- /dev/null +++ b/app/assets/javascripts/ide/lib/gitlab_web_ide/handle_tracking_event.js @@ -0,0 +1,20 @@ +import { snakeCase } from 'lodash'; +import { convertObjectPropsToSnakeCase } from '~/lib/utils/common_utils'; +import Tracking from '~/tracking'; + +export const handleTracking = ({ name, data }) => { + const snakeCaseEventName = snakeCase(name); + + if (data && Object.keys(data).length) { + Tracking.event(undefined, snakeCaseEventName, { + /* See GitLab snowplow schema for a definition of the extra field + * https://docs.gitlab.com/ee/development/snowplow/schemas.html#gitlab_standard. + */ + extra: convertObjectPropsToSnakeCase(data, { + deep: true, + }), + }); + } else { + Tracking.event(undefined, snakeCaseEventName); + } +}; diff --git a/app/assets/javascripts/ide/lib/mirror.js b/app/assets/javascripts/ide/lib/mirror.js index 78990953beb..f437965b25a 100644 --- a/app/assets/javascripts/ide/lib/mirror.js +++ b/app/assets/javascripts/ide/lib/mirror.js @@ -1,3 +1,4 @@ +import { HTTP_STATUS_OK } from '~/lib/utils/http_status'; import { getWebSocketUrl, mergeUrlParams } from '~/lib/utils/url_utility'; import { __ } from '~/locale'; import createDiff from './create_diff'; @@ -26,7 +27,7 @@ const cancellableWait = (time) => { const isErrorResponse = (error) => error && error.code !== 0; -const isErrorPayload = (payload) => payload && payload.status_code !== 200; +const isErrorPayload = (payload) => payload && payload.status_code !== HTTP_STATUS_OK; const getErrorFromResponse = (data) => { if (isErrorResponse(data.error)) { diff --git a/app/assets/javascripts/ide/remote/index.js b/app/assets/javascripts/ide/remote/index.js index fb8db20c0c1..6966786ca4e 100644 --- a/app/assets/javascripts/ide/remote/index.js +++ b/app/assets/javascripts/ide/remote/index.js @@ -1,6 +1,7 @@ import { startRemote } from '@gitlab/web-ide'; import { getBaseConfig, setupRootElement } from '~/ide/lib/gitlab_web_ide'; import { isSameOriginUrl, joinPaths } from '~/lib/utils/url_utility'; +import { handleTracking } from '~/ide/lib/gitlab_web_ide/handle_tracking_event'; /** * @param {Element} rootEl @@ -36,5 +37,6 @@ export const mountRemoteIDE = async (el) => { // TODO Handle error better handleError: visitReturnUrl, handleClose: visitReturnUrl, + handleTracking, }); }; diff --git a/app/assets/javascripts/ide/stores/actions.js b/app/assets/javascripts/ide/stores/actions.js index dc0f3a1d7e9..b7445d3ad0a 100644 --- a/app/assets/javascripts/ide/stores/actions.js +++ b/app/assets/javascripts/ide/stores/actions.js @@ -1,6 +1,7 @@ import { escape } from 'lodash'; import Vue from 'vue'; import { createAlert } from '~/flash'; +import { HTTP_STATUS_NOT_FOUND } from '~/lib/utils/http_status'; import { visitUrl } from '~/lib/utils/url_utility'; import { __, sprintf } from '~/locale'; import { @@ -278,7 +279,7 @@ export const getBranchData = ({ commit, state }, { projectId, branchId, force = resolve(data); }) .catch((e) => { - if (e.response.status === 404) { + if (e.response.status === HTTP_STATUS_NOT_FOUND) { reject(e); } else { createAlert({ diff --git a/app/assets/javascripts/ide/stores/getters.js b/app/assets/javascripts/ide/stores/getters.js index 3c02b1d1da7..c0f666c6652 100644 --- a/app/assets/javascripts/ide/stores/getters.js +++ b/app/assets/javascripts/ide/stores/getters.js @@ -2,7 +2,6 @@ import Api from '~/api'; import { addNumericSuffix } from '~/ide/utils'; import { leftSidebarViews, - packageJsonPath, DEFAULT_PERMISSIONS, PERMISSION_READ_MR, PERMISSION_CREATE_MR, @@ -153,8 +152,6 @@ export const currentBranch = (state, getters) => export const branchName = (_state, getters) => getters.currentBranch && getters.currentBranch.name; -export const packageJson = (state) => state.entries[packageJsonPath]; - export const isOnDefaultBranch = (_state, getters) => getters.currentProject && getters.currentProject.default_branch === getters.branchName; diff --git a/app/assets/javascripts/ide/stores/index.js b/app/assets/javascripts/ide/stores/index.js index b660ff178a2..c2f7126159c 100644 --- a/app/assets/javascripts/ide/stores/index.js +++ b/app/assets/javascripts/ide/stores/index.js @@ -3,7 +3,6 @@ import Vuex from 'vuex'; import * as actions from './actions'; import * as getters from './getters'; import branches from './modules/branches'; -import clientsideModule from './modules/clientside'; import commitModule from './modules/commit'; import editorModule from './modules/editor'; import { setupFileEditorsSync } from './modules/editor/setup'; @@ -29,7 +28,6 @@ export const createStoreOptions = () => ({ branches, fileTemplates: fileTemplates(), rightPane: paneModule(), - clientside: clientsideModule(), router: routerModule, editor: editorModule, }, diff --git a/app/assets/javascripts/ide/stores/modules/clientside/actions.js b/app/assets/javascripts/ide/stores/modules/clientside/actions.js deleted file mode 100644 index 1a8e665867f..00000000000 --- a/app/assets/javascripts/ide/stores/modules/clientside/actions.js +++ /dev/null @@ -1,11 +0,0 @@ -import axios from '~/lib/utils/axios_utils'; - -export const pingUsage = ({ rootGetters }, metricName) => { - const { web_url: projectUrl } = rootGetters.currentProject; - - const url = `${projectUrl}/service_ping/${metricName}`; - - return axios.post(url); -}; - -export default pingUsage; diff --git a/app/assets/javascripts/ide/stores/modules/clientside/index.js b/app/assets/javascripts/ide/stores/modules/clientside/index.js deleted file mode 100644 index b28f7b935a8..00000000000 --- a/app/assets/javascripts/ide/stores/modules/clientside/index.js +++ /dev/null @@ -1,6 +0,0 @@ -import * as actions from './actions'; - -export default () => ({ - namespaced: true, - actions, -}); diff --git a/app/assets/javascripts/ide/stores/state.js b/app/assets/javascripts/ide/stores/state.js index b89d9d38a1a..356bbf28a48 100644 --- a/app/assets/javascripts/ide/stores/state.js +++ b/app/assets/javascripts/ide/stores/state.js @@ -26,10 +26,8 @@ export default () => ({ path: '', entry: {}, }, - clientsidePreviewEnabled: false, renderWhitespaceInCode: false, editorTheme: DEFAULT_THEME, - codesandboxBundlerUrl: null, environmentsGuidanceAlertDismissed: false, environmentsGuidanceAlertDetected: false, previewMarkdownPath: '', diff --git a/app/assets/javascripts/import_entities/components/import_status.vue b/app/assets/javascripts/import_entities/components/import_status.vue index db677c574d1..6dc0b2cec24 100644 --- a/app/assets/javascripts/import_entities/components/import_status.vue +++ b/app/assets/javascripts/import_entities/components/import_status.vue @@ -65,7 +65,9 @@ const STATUS_MAP = { }; function isIncompleteImport(stats) { - return Object.keys(stats.fetched).some((key) => stats.fetched[key] !== stats.imported[key]); + return Object.keys(stats?.fetched ?? []).some( + (key) => stats.fetched[key] !== stats.imported[key], + ); } export default { @@ -91,7 +93,9 @@ export default { computed: { knownStats() { const knownStatisticKeys = Object.keys(STATISTIC_ITEMS); - return Object.keys(this.stats.fetched).filter((key) => knownStatisticKeys.includes(key)); + return Object.keys(this.stats?.fetched ?? []).filter((key) => + knownStatisticKeys.includes(key), + ); }, hasStats() { @@ -142,7 +146,13 @@ export default {