From 9f46488805e86b1bc341ea1620b866016c2ce5ed Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Wed, 20 May 2020 14:34:42 +0000 Subject: Add latest changes from gitlab-org/gitlab@13-0-stable-ee --- .../access_tokens/components/expires_at_field.vue | 14 + app/assets/javascripts/access_tokens/index.js | 12 + app/assets/javascripts/actioncable_consumer.js | 3 + .../alert_management/components/alert_details.vue | 236 +++++ .../components/alert_management_list.vue | 303 ++++++ .../javascripts/alert_management/constants.js | 46 + app/assets/javascripts/alert_management/details.js | 47 + .../graphql/fragments/detailItem.fragment.graphql | 11 + .../graphql/fragments/listItem.fragment.graphql | 9 + .../graphql/mutations/update_alert_status.graphql | 9 + .../graphql/queries/details.query.graphql | 11 + .../graphql/queries/getAlerts.query.graphql | 11 + app/assets/javascripts/alert_management/list.js | 55 + .../javascripts/alert_management/services/index.js | 7 + .../components/alerts_service_form.vue | 4 +- app/assets/javascripts/api.js | 57 +- app/assets/javascripts/autosave.js | 13 +- app/assets/javascripts/awards_handler.js | 8 +- .../javascripts/behaviors/copy_to_clipboard.js | 3 +- .../behaviors/markdown/marks/inline_html.js | 4 +- .../behaviors/markdown/paste_markdown_table.js | 3 +- .../javascripts/behaviors/markdown/render_gfm.js | 2 +- .../behaviors/markdown/render_mermaid.js | 12 +- .../behaviors/markdown/render_metrics.js | 27 +- .../behaviors/shortcuts/shortcuts_blob.js | 2 +- .../javascripts/blob/blob_fork_suggestion.js | 2 +- .../javascripts/blob/components/blob_content.vue | 17 +- .../blob/components/blob_content_error.vue | 71 +- .../blob/components/blob_edit_header.vue | 4 +- .../javascripts/blob/components/blob_header.vue | 2 +- .../blob/components/blob_header_filepath.vue | 14 +- .../components/blob_header_viewer_switcher.vue | 2 +- .../javascripts/blob/components/constants.js | 56 +- .../suggest_gitlab_ci_yml/components/popover.vue | 3 - app/assets/javascripts/blob/utils.js | 19 +- app/assets/javascripts/boards/components/board.js | 3 - .../javascripts/boards/components/board_column.vue | 6 +- .../javascripts/boards/components/board_form.vue | 8 +- .../javascripts/boards/components/board_sidebar.js | 5 +- .../boards/components/boards_selector.vue | 6 - .../boards/components/issue_card_inner.vue | 4 - app/assets/javascripts/boards/constants.js | 8 + .../javascripts/boards/filtered_search_boards.js | 2 +- .../boards/icons/fullscreen_collapse.svg | 1 + .../javascripts/boards/icons/fullscreen_expand.svg | 1 + app/assets/javascripts/boards/index.js | 116 +- .../boards/mixins/sortable_default_options.js | 5 +- app/assets/javascripts/boards/models/assignee.js | 2 +- app/assets/javascripts/boards/models/issue.js | 28 +- app/assets/javascripts/boards/models/list.js | 87 +- .../boards/queries/board_list.fragment.graphql | 5 + .../queries/board_list_shared.fragment.graphql | 15 + .../boards/queries/group_board.query.graphql | 13 + .../boards/queries/project_board.query.graphql | 13 + .../javascripts/boards/stores/boards_store.js | 114 +- app/assets/javascripts/boards/stores/state.js | 4 +- app/assets/javascripts/boards/toggle_focus.js | 46 +- app/assets/javascripts/broadcast_notification.js | 4 +- .../ci_variable_list/ajax_variable_list.js | 4 +- .../components/ci_variable_modal.vue | 8 + .../javascripts/ci_variable_list/constants.js | 2 +- app/assets/javascripts/ci_variable_list/index.js | 4 +- .../javascripts/ci_variable_list/store/actions.js | 4 + .../ci_variable_list/store/mutation_types.js | 1 + .../ci_variable_list/store/mutations.js | 4 + .../javascripts/ci_variable_list/store/state.js | 1 + .../javascripts/close_reopen_report_toggle.js | 2 +- app/assets/javascripts/clusters/clusters_bundle.js | 13 +- .../clusters/components/applications.vue | 73 +- .../components/fluentd_output_settings.vue | 241 +++++ .../components/ingress_modsecurity_settings.vue | 4 +- .../components/remove_cluster_confirmation.vue | 4 +- app/assets/javascripts/clusters/constants.js | 2 + app/assets/javascripts/clusters/event_hub.js | 4 +- .../clusters/services/clusters_service.js | 1 + .../javascripts/clusters/stores/clusters_store.js | 19 + .../clusters_list/components/clusters.vue | 162 +-- app/assets/javascripts/clusters_list/constants.js | 3 +- .../javascripts/clusters_list/store/actions.js | 33 +- .../clusters_list/store/mutation_types.js | 1 + .../javascripts/clusters_list/store/mutations.js | 10 +- .../javascripts/clusters_list/store/state.js | 6 +- .../javascripts/code_navigation/components/app.vue | 8 +- .../code_navigation/components/popover.vue | 33 +- .../javascripts/code_navigation/store/actions.js | 9 +- .../javascripts/code_navigation/store/mutations.js | 3 +- .../javascripts/code_navigation/store/state.js | 1 + app/assets/javascripts/comment_type_toggle.js | 2 +- app/assets/javascripts/commit/image_file.js | 5 +- app/assets/javascripts/commons/index.js | 1 - app/assets/javascripts/compare_autocomplete.js | 5 +- .../components/dropdown.vue | 2 +- .../components/eks_cluster_configuration_form.vue | 6 +- .../components/service_credentials_form.vue | 6 +- .../components/gke_project_id_dropdown.vue | 4 +- app/assets/javascripts/create_item_dropdown.js | 8 +- .../javascripts/create_merge_request_dropdown.js | 2 +- .../cycle_analytics/cycle_analytics_store.js | 2 +- app/assets/javascripts/deploy_keys/eventhub.js | 4 +- .../design_management/components/app.vue | 3 + .../design_management/components/delete_button.vue | 64 ++ .../components/design_destroyer.vue | 66 ++ .../components/design_note_pin.vue | 61 ++ .../components/design_notes/design_discussion.vue | 169 +++ .../components/design_notes/design_note.vue | 148 +++ .../components/design_notes/design_reply_form.vue | 137 +++ .../components/design_overlay.vue | 279 +++++ .../components/design_presentation.vue | 314 ++++++ .../design_management/components/design_scaler.vue | 65 ++ .../design_management/components/image.vue | 110 ++ .../design_management/components/list/item.vue | 174 +++ .../design_management/components/toolbar/index.vue | 126 +++ .../components/toolbar/pagination.vue | 83 ++ .../components/toolbar/pagination_button.vue | 48 + .../design_management/components/upload/button.vue | 58 + .../components/upload/design_dropzone.vue | 134 +++ .../components/upload/design_version_dropdown.vue | 76 ++ .../javascripts/design_management/constants.js | 14 + .../javascripts/design_management/graphql.js | 45 + .../graphql/fragments/design.fragment.graphql | 22 + .../graphql/fragments/designList.fragment.graphql | 8 + .../graphql/fragments/designNote.fragment.graphql | 28 + .../graphql/fragments/diffRefs.fragment.graphql | 5 + .../fragments/note_permissions.fragment.graphql | 3 + .../graphql/fragments/version.fragment.graphql | 4 + .../mutations/createImageDiffNote.mutation.graphql | 21 + .../graphql/mutations/createNote.mutation.graphql | 10 + .../mutations/destroyDesign.mutation.graphql | 10 + .../mutations/updateImageDiffNote.mutation.graphql | 10 + .../update_active_discussion.mutation.graphql | 3 + .../graphql/mutations/update_note.mutation.graphql | 10 + .../mutations/uploadDesign.mutation.graphql | 21 + .../queries/active_discussion.query.graphql | 6 + .../graphql/queries/appData.query.graphql | 4 + .../queries/design_permissions.query.graphql | 10 + .../graphql/queries/getDesign.query.graphql | 31 + .../graphql/queries/get_design_list.query.graphql | 26 + .../design_management/graphql/typedefs.graphql | 12 + app/assets/javascripts/design_management/index.js | 58 + .../design_management/mixins/all_designs.js | 49 + .../design_management/mixins/all_versions.js | 62 ++ .../design_management/pages/design/index.vue | 400 +++++++ .../javascripts/design_management/pages/index.vue | 323 ++++++ .../design_management/router/constants.js | 3 + .../javascripts/design_management/router/index.js | 22 + .../javascripts/design_management/router/routes.js | 44 + .../design_management/utils/cache_update.js | 272 +++++ .../utils/design_management_utils.js | 125 +++ .../design_management/utils/error_messages.js | 95 ++ .../design_management/utils/tracking.js | 28 + .../diff_notes/components/comment_resolve_btn.js | 21 +- .../diff_notes/components/jump_to_discussion.js | 11 +- app/assets/javascripts/diffs/components/app.vue | 23 + .../javascripts/diffs/components/commit_item.vue | 75 ++ .../diffs/components/diff_discussions.vue | 8 +- .../javascripts/diffs/components/diff_file.vue | 4 +- .../diffs/components/diff_file_header.vue | 6 +- .../javascripts/diffs/components/edit_button.vue | 36 +- .../javascripts/diffs/components/no_changes.vue | 6 +- app/assets/javascripts/diffs/store/actions.js | 80 ++ .../diffs/store/getters_versions_dropdowns.js | 5 +- .../javascripts/diffs/store/mutation_types.js | 2 + app/assets/javascripts/diffs/store/mutations.js | 5 + app/assets/javascripts/diffs/store/utils.js | 53 +- app/assets/javascripts/dropzone_input.js | 6 +- app/assets/javascripts/editor/editor_lite.js | 4 + .../components/confirm_rollback_modal.vue | 10 +- .../environments/components/container.vue | 34 +- .../components/delete_environment_modal.vue | 2 +- .../environments/components/environment_item.vue | 13 +- .../environments/components/environments_app.vue | 33 +- .../environments/components/environments_table.vue | 33 +- .../components/stop_environment_modal.vue | 2 +- app/assets/javascripts/environments/event_hub.js | 4 +- .../folder/environments_folder_bundle.js | 2 +- .../folder/environments_folder_view.vue | 28 +- app/assets/javascripts/environments/index.js | 2 +- .../environments/mixins/canary_callout_mixin.js | 23 +- .../environments/mixins/container_mixin.js | 34 - .../environments/mixins/environment_item_mixin.js | 13 - .../environments/mixins/environments_app_mixin.js | 32 - .../mixins/environments_folder_view_mixin.js | 29 - .../mixins/environments_table_mixin.js | 10 - .../environments/stores/environments_store.js | 20 +- .../components/error_tracking_list.vue | 6 +- .../error_tracking/components/stacktrace_entry.vue | 4 +- .../javascripts/error_tracking/store/actions.js | 2 +- .../javascripts/filtered_search/constants.js | 5 + .../filtered_search/dropdown_operator.js | 10 +- .../javascripts/filtered_search/event_hub.js | 4 +- .../filtered_search/filtered_search_dropdown.js | 41 + .../filtered_search_dropdown_manager.js | 2 +- .../filtered_search/filtered_search_manager.js | 17 +- .../stores/recent_searches_store.js | 14 +- .../filtered_search/visual_token_value.js | 4 +- app/assets/javascripts/flash.js | 6 +- .../javascripts/frequent_items/components/app.vue | 2 +- app/assets/javascripts/frequent_items/event_hub.js | 4 +- app/assets/javascripts/gfm_auto_complete.js | 18 +- app/assets/javascripts/gl_dropdown.js | 15 +- app/assets/javascripts/gl_form.js | 8 +- app/assets/javascripts/groups/components/app.vue | 7 +- app/assets/javascripts/groups/event_hub.js | 4 +- app/assets/javascripts/groups/new_group_child.js | 2 +- app/assets/javascripts/header.js | 23 +- app/assets/javascripts/helpers/avatar_helper.js | 5 +- .../javascripts/helpers/event_hub_factory.js | 20 + .../ide/components/commit_sidebar/actions.vue | 4 +- .../components/commit_sidebar/editor_header.vue | 6 +- .../ide/components/commit_sidebar/form.vue | 37 +- .../ide/components/commit_sidebar/list.vue | 18 +- app/assets/javascripts/ide/components/ide.vue | 24 +- .../javascripts/ide/components/ide_review.vue | 2 +- .../javascripts/ide/components/ide_side_bar.vue | 2 +- app/assets/javascripts/ide/components/ide_tree.vue | 18 +- .../javascripts/ide/components/jobs/detail.vue | 4 +- app/assets/javascripts/ide/components/nav_form.vue | 4 +- .../ide/components/new_dropdown/index.vue | 7 +- .../ide/components/new_dropdown/modal.vue | 112 +- .../ide/components/panes/collapsible_sidebar.vue | 3 +- .../javascripts/ide/components/pipelines/list.vue | 11 +- .../ide/components/repo_commit_section.vue | 29 +- .../javascripts/ide/components/repo_editor.vue | 32 +- .../javascripts/ide/components/resizable_panel.vue | 31 +- app/assets/javascripts/ide/constants.js | 1 + app/assets/javascripts/ide/eventhub.js | 4 +- app/assets/javascripts/ide/lib/diff/diff.js | 13 +- app/assets/javascripts/ide/lib/editor.js | 3 + app/assets/javascripts/ide/lib/languages/index.js | 5 + app/assets/javascripts/ide/lib/languages/vue.js | 306 ++++++ app/assets/javascripts/ide/lib/themes/index.js | 20 + app/assets/javascripts/ide/lib/themes/monokai.js | 169 +++ app/assets/javascripts/ide/lib/themes/none.js | 17 + .../javascripts/ide/lib/themes/solarized_dark.js | 1110 ++++++++++++++++++++ .../javascripts/ide/lib/themes/solarized_light.js | 1101 +++++++++++++++++++ app/assets/javascripts/ide/services/index.js | 8 +- app/assets/javascripts/ide/stores/actions.js | 20 +- .../javascripts/ide/stores/actions/project.js | 6 +- app/assets/javascripts/ide/stores/actions/tree.js | 2 +- .../ide/stores/modules/commit/actions.js | 36 +- .../javascripts/ide/stores/mutation_types.js | 3 - app/assets/javascripts/ide/stores/mutations.js | 19 - .../javascripts/ide/stores/mutations/project.js | 4 +- .../javascripts/ide/stores/mutations/tree.js | 5 +- app/assets/javascripts/ide/stores/state.js | 2 - app/assets/javascripts/ide/stores/utils.js | 43 + app/assets/javascripts/ide/utils.js | 16 + .../javascripts/image_diff/helpers/badge_helper.js | 4 +- .../image_diff/helpers/comment_indicator_helper.js | 4 +- .../javascripts/image_diff/helpers/dom_helper.js | 11 +- app/assets/javascripts/image_diff/image_diff.js | 6 +- .../javascripts/import_projects/event_hub.js | 4 +- app/assets/javascripts/importer_status.js | 6 +- .../integrations/edit/components/active_toggle.vue | 11 +- .../edit/components/integration_form.vue | 50 + .../edit/components/jira_trigger_fields.vue | 99 ++ .../edit/components/trigger_fields.vue | 73 ++ .../javascripts/integrations/edit/event_hub.js | 4 +- app/assets/javascripts/integrations/edit/index.js | 40 +- .../javascripts/issuable_bulk_update_actions.js | 8 +- .../javascripts/issuable_bulk_update_sidebar.js | 2 +- .../queries/issue_sidebar.query.graphql | 15 + .../components/issuable_list_root_app.vue | 96 ++ app/assets/javascripts/issuables_list/eventhub.js | 6 +- app/assets/javascripts/issuables_list/index.js | 55 +- .../queries/get_issues_list_details.query.graphql | 22 + app/assets/javascripts/issue.js | 58 +- .../javascripts/issue_show/components/app.vue | 13 +- .../issue_show/components/fields/description.vue | 32 +- app/assets/javascripts/issue_show/event_hub.js | 4 +- .../jira_import/components/jira_import_app.vue | 70 +- .../jira_import/components/jira_import_form.vue | 23 +- .../components/jira_import_progress.vue | 5 +- .../jira_import/components/jira_import_setup.vue | 6 +- app/assets/javascripts/jira_import/index.js | 1 + .../queries/get_jira_import_details.query.graphql | 2 +- app/assets/javascripts/jira_import/utils.js | 49 + .../jobs/components/environments_block.vue | 8 +- app/assets/javascripts/jobs/store/actions.js | 4 +- app/assets/javascripts/jobs/store/state.js | 2 +- app/assets/javascripts/labels_select.js | 50 +- app/assets/javascripts/lib/graphql.js | 1 + .../javascripts/lib/utils/datetime_utility.js | 13 + app/assets/javascripts/lib/utils/downloader.js | 20 + app/assets/javascripts/lib/utils/keycodes.js | 3 + app/assets/javascripts/lib/utils/keys.js | 4 + app/assets/javascripts/lib/utils/text_markdown.js | 7 +- app/assets/javascripts/lib/utils/url_utility.js | 66 +- app/assets/javascripts/line_highlighter.js | 9 +- app/assets/javascripts/locale/sprintf.js | 2 +- app/assets/javascripts/main.js | 5 +- app/assets/javascripts/member_expiration_date.js | 3 - app/assets/javascripts/merge_request_tabs.js | 4 +- app/assets/javascripts/milestone_select.js | 41 +- .../milestones/project_milestone_combobox.vue | 228 ++++ app/assets/javascripts/mirrors/ssh_mirror.js | 4 +- .../monitoring/components/alert_widget.vue | 286 +++++ .../monitoring/components/alert_widget_form.vue | 307 ++++++ .../monitoring/components/charts/anomaly.vue | 6 +- .../monitoring/components/charts/heatmap.vue | 2 +- .../monitoring/components/charts/time_series.vue | 13 +- .../monitoring/components/dashboard.vue | 277 +++-- .../monitoring/components/dashboard_panel.vue | 393 +++++++ .../monitoring/components/dashboards_dropdown.vue | 55 +- .../monitoring/components/embeds/metric_embed.vue | 8 +- .../monitoring/components/panel_type.vue | 324 ------ .../components/variables/custom_variable.vue | 50 + .../components/variables/text_variable.vue | 39 + .../monitoring/components/variables_section.vue | 56 + app/assets/javascripts/monitoring/constants.js | 84 ++ .../javascripts/monitoring/monitoring_bundle.js | 2 +- .../monitoring/monitoring_bundle_with_alerts.js | 13 + .../monitoring/services/alerts_service.js | 32 + .../javascripts/monitoring/stores/actions.js | 84 +- .../javascripts/monitoring/stores/getters.js | 28 + .../monitoring/stores/mutation_types.js | 10 +- .../javascripts/monitoring/stores/mutations.js | 36 +- app/assets/javascripts/monitoring/stores/state.js | 17 + app/assets/javascripts/monitoring/stores/utils.js | 2 + .../monitoring/stores/variable_mapping.js | 167 +++ app/assets/javascripts/monitoring/utils.js | 201 +++- app/assets/javascripts/monitoring/validators.js | 44 + app/assets/javascripts/namespace_select.js | 8 +- app/assets/javascripts/new_branch_form.js | 5 +- app/assets/javascripts/notebook/cells/markdown.vue | 34 +- .../javascripts/notebook/cells/output/index.vue | 3 + app/assets/javascripts/notes.js | 19 +- .../javascripts/notes/components/comment_form.vue | 83 +- .../notes/components/discussion_counter.vue | 19 +- .../javascripts/notes/components/note_form.vue | 6 +- .../javascripts/notes/components/note_header.vue | 93 +- .../javascripts/notes/components/noteable_note.vue | 10 +- .../javascripts/notes/components/notes_app.vue | 5 +- app/assets/javascripts/notes/index.js | 4 +- .../notes/mixins/discussion_navigation.js | 2 +- app/assets/javascripts/notes/stores/actions.js | 17 +- app/assets/javascripts/notes/stores/getters.js | 2 + app/assets/javascripts/notes/stores/index.js | 6 +- .../javascripts/notes/stores/modules/index.js | 2 + .../javascripts/notes/stores/mutation_types.js | 1 + app/assets/javascripts/notes/stores/mutations.js | 4 + .../admin/application_settings/general/index.js | 2 +- .../pages/admin/impersonation_tokens/index.js | 4 +- .../index/components/delete_project_modal.vue | 8 +- .../admin/users/components/delete_user_modal.vue | 8 +- .../shared/components/delete_milestone_modal.vue | 2 +- .../shared/components/promote_milestone_modal.vue | 2 +- .../pages/milestones/shared/event_hub.js | 4 +- .../pages/profiles/personal_access_tokens/index.js | 4 +- .../projects/alert_management/details/index.js | 5 + .../pages/projects/alert_management/index/index.js | 5 + .../javascripts/pages/projects/blob/new/index.js | 11 +- .../javascripts/pages/projects/blob/show/index.js | 7 +- .../pages/projects/environments/metrics/index.js | 2 +- .../pages/projects/issues/index/index.js | 5 +- .../javascripts/pages/projects/issues/show.js | 10 + .../labels/components/promote_label_modal.vue | 4 +- .../javascripts/pages/projects/labels/event_hub.js | 4 +- .../shared/components/interval_pattern_input.vue | 139 ++- .../components/pipeline_schedules_callout.vue | 3 +- .../pipeline_schedules/shared/init_form.js | 4 +- .../pages/projects/pipelines/dag/index.js | 2 + .../pages/projects/pipelines/index/index.js | 1 + .../pages/projects/settings/access_tokens/index.js | 3 + .../permissions/components/settings_panel.vue | 49 +- .../wikis/components/delete_wiki_modal.vue | 5 +- .../javascripts/pages/projects/wikis/wikis.js | 13 + .../pages/search/init_filtered_search.js | 2 +- .../performance_bar/components/detailed_metric.vue | 4 +- app/assets/javascripts/persistent_user_callout.js | 5 + .../components/graph/job_group_dropdown.vue | 4 +- .../components/graph/job_name_component.vue | 4 +- .../components/graph/stage_column_component.vue | 4 +- .../javascripts/pipelines/components/pipelines.vue | 44 +- .../components/pipelines_filtered_search.vue | 91 ++ .../pipelines/components/pipelines_table_row.vue | 5 +- .../javascripts/pipelines/components/stage.vue | 2 +- .../components/test_reports/test_reports.vue | 3 +- .../components/test_reports/test_summary.vue | 9 +- .../components/test_reports/test_summary_table.vue | 18 +- .../tokens/pipeline_branch_name_token.vue | 70 ++ .../tokens/pipeline_trigger_author_token.vue | 114 ++ app/assets/javascripts/pipelines/constants.js | 10 + .../pipelines/pipeline_details_bundle.js | 65 +- .../pipelines/services/pipelines_service.js | 14 +- .../javascripts/pipelines/stores/pipeline_store.js | 2 +- .../account/components/delete_account_modal.vue | 2 +- .../profile/account/components/update_username.vue | 10 +- app/assets/javascripts/project_select.js | 23 +- .../projects/commits/components/author_select.vue | 1 + .../javascripts/projects/commits/store/actions.js | 6 +- .../projects/pipelines/charts/components/app.vue | 3 + .../registry/explorer/components/image_list.vue | 124 +++ .../javascripts/registry/explorer/constants.js | 44 +- app/assets/javascripts/registry/explorer/index.js | 2 +- .../registry/explorer/pages/details.vue | 168 ++- .../javascripts/registry/explorer/pages/index.vue | 39 +- .../javascripts/registry/explorer/pages/list.vue | 172 ++- app/assets/javascripts/registry/explorer/router.js | 12 +- .../registry/explorer/stores/actions.js | 11 +- .../javascripts/registry/explorer/stores/index.js | 1 + .../registry/settings/registry_settings_bundle.js | 2 +- .../javascripts/registry/settings/store/getters.js | 1 + .../registry/settings/store/mutations.js | 2 +- .../shared/components/expiration_policy_fields.vue | 116 +- .../javascripts/registry/shared/constants.js | 32 +- .../javascripts/releases/components/app_edit.vue | 74 +- .../javascripts/releases/components/app_index.vue | 11 +- .../releases/components/asset_links_form.vue | 2 +- .../releases/components/evidence_block.vue | 8 +- .../releases/components/release_block_footer.vue | 7 +- .../releases/components/release_block_header.vue | 13 +- .../releases/components/release_block_metadata.vue | 15 +- .../components/release_block_milestone_info.vue | 12 +- .../releases/stores/modules/detail/actions.js | 11 +- .../stores/modules/detail/mutation_types.js | 1 + .../releases/stores/modules/detail/mutations.js | 4 + .../releases/stores/modules/detail/state.js | 4 + .../components/accessibility_issue_body.vue | 30 +- .../grouped_accessibility_reports_app.vue | 64 ++ .../reports/accessibility_report/store/actions.js | 79 ++ .../reports/accessibility_report/store/getters.js | 48 + .../reports/accessibility_report/store/index.js | 16 + .../accessibility_report/store/mutation_types.js | 5 + .../accessibility_report/store/mutations.js | 20 + .../reports/accessibility_report/store/state.js | 28 + .../reports/components/grouped_issues_list.vue | 93 ++ .../components/grouped_test_reports_app.vue | 15 +- .../reports/components/issue_status_icon.vue | 3 +- .../reports/components/report_section.vue | 2 +- app/assets/javascripts/reports/constants.js | 3 + app/assets/javascripts/reports/store/mutations.js | 3 +- .../repository/components/breadcrumbs.vue | 2 +- .../repository/components/last_commit.vue | 5 +- .../repository/components/table/row.vue | 5 +- .../repository/queries/commit.fragment.graphql | 1 + .../queries/pathLastCommit.query.graphql | 1 + app/assets/javascripts/repository/router.js | 21 +- app/assets/javascripts/repository/utils/commit.js | 1 + app/assets/javascripts/right_sidebar.js | 3 +- app/assets/javascripts/search_autocomplete.js | 4 +- .../javascripts/serverless/components/area.vue | 4 +- app/assets/javascripts/serverless/event_hub.js | 4 +- .../javascripts/set_status_modal/event_hub.js | 4 +- .../sidebar/components/assignees/assignees.vue | 4 +- .../components/assignees/assignees_realtime.vue | 75 ++ .../components/assignees/sidebar_assignees.vue | 24 + .../assignees/uncollapsed_assignee_list.vue | 2 +- .../confidential/confidential_issue_sidebar.vue | 23 +- .../components/confidential/edit_form_buttons.vue | 7 +- .../components/participants/participants.vue | 18 +- .../javascripts/sidebar/lib/sidebar_move_issue.js | 4 +- app/assets/javascripts/sidebar/mount_sidebar.js | 21 +- .../javascripts/sidebar/stores/sidebar_store.js | 4 + app/assets/javascripts/snippet/snippet_bundle.js | 24 +- .../javascripts/snippets/components/edit.vue | 18 +- .../snippets/components/snippet_blob_edit.vue | 6 +- .../snippets/components/snippet_blob_view.vue | 36 +- .../components/snippet_description_edit.vue | 4 +- .../components/snippet_description_view.vue | 21 + .../snippets/components/snippet_header.vue | 40 +- .../snippets/components/snippet_title.vue | 10 +- .../fragments/snippetBase.fragment.graphql | 2 + .../static_site_editor/components/app.vue | 3 + .../static_site_editor/components/edit_area.vue | 51 +- .../components/publish_toolbar.vue | 15 +- .../components/saved_changes_message.vue | 7 +- .../components/skeleton_loader.vue | 19 + .../components/static_site_editor.vue | 95 -- .../javascripts/static_site_editor/constants.js | 7 +- .../static_site_editor/graphql/index.js | 39 + .../submit_content_changes.mutation.graphql | 7 + .../graphql/queries/app_data.query.graphql | 9 + .../queries/saved_content_meta.query.graphql | 3 + .../graphql/queries/source_content.query.graphql | 9 + .../static_site_editor/graphql/resolvers/file.js | 11 + .../graphql/resolvers/submit_content_changes.js | 24 + .../static_site_editor/graphql/typedefs.graphql | 43 + app/assets/javascripts/static_site_editor/index.js | 33 +- .../javascripts/static_site_editor/pages/home.vue | 120 +++ .../static_site_editor/pages/success.vue | 35 + .../static_site_editor/router/constants.js | 2 + .../javascripts/static_site_editor/router/index.js | 15 + .../static_site_editor/router/routes.js | 21 + .../services/submit_content_changes.js | 15 +- .../static_site_editor/store/actions.js | 37 - .../static_site_editor/store/getters.js | 2 - .../javascripts/static_site_editor/store/index.js | 19 - .../static_site_editor/store/mutation_types.js | 8 - .../static_site_editor/store/mutations.js | 36 - .../javascripts/static_site_editor/store/state.js | 23 - app/assets/javascripts/syntax_highlight.js | 13 +- app/assets/javascripts/terminal/terminal.js | 13 +- app/assets/javascripts/tracking.js | 47 +- app/assets/javascripts/tree.js | 5 +- app/assets/javascripts/users_select.js | 774 -------------- app/assets/javascripts/users_select/constants.js | 18 + app/assets/javascripts/users_select/index.js | 764 ++++++++++++++ app/assets/javascripts/users_select/utils.js | 27 + .../components/deployment/deployment_info.vue | 2 +- .../components/mr_collapsible_extension.vue | 2 +- .../components/mr_widget_header.vue | 4 +- .../components/mr_widget_pipeline.vue | 15 +- .../components/mr_widget_pipeline_container.vue | 3 +- .../components/mr_widget_terraform_plan.vue | 19 +- .../components/states/commits_header.vue | 4 +- .../states/mr_widget_auto_merge_enabled.vue | 3 +- .../components/states/mr_widget_closed.vue | 2 +- .../components/states/mr_widget_conflicts.vue | 4 +- .../components/states/mr_widget_merged.vue | 2 +- .../components/states/mr_widget_pipeline_tour.vue | 21 +- .../components/states/ready_to_merge.vue | 25 +- .../components/states/squash_before_merge.vue | 2 +- .../vue_merge_request_widget/event_hub.js | 4 +- .../mixins/ready_to_merge.js | 6 + .../vue_merge_request_widget/mr_widget_options.vue | 19 +- .../stores/get_state_key.js | 2 +- .../stores/mr_widget_store.js | 16 +- .../vue_shared/components/awards_list.vue | 17 +- .../components/blob_viewers/rich_viewer.vue | 6 +- .../components/blob_viewers/simple_viewer.vue | 3 +- .../javascripts/vue_shared/components/ci_icon.vue | 2 +- .../vue_shared/components/clipboard_button.vue | 1 + .../vue_shared/components/clone_dropdown.vue | 16 +- .../vue_shared/components/code_block.vue | 21 +- .../javascripts/vue_shared/components/commit.vue | 2 +- .../components/content_viewer/content_viewer.vue | 12 + .../components/content_viewer/lib/viewer_utils.js | 4 +- .../content_viewer/viewers/markdown_viewer.vue | 30 +- .../date_time_picker/date_time_picker.vue | 16 +- .../vue_shared/components/file_finder/item.vue | 4 +- .../components/file_icon/file_icon_map.js | 2 + .../javascripts/vue_shared/components/file_row.vue | 13 - .../vue_shared/components/form/title.vue | 1 + .../vue_shared/components/gl_mentions.vue | 2 +- .../vue_shared/components/identicon.vue | 2 +- .../vue_shared/components/issue/issue_warning.vue | 6 +- .../components/issue/related_issuable_item.vue | 40 +- .../vue_shared/components/markdown/field.vue | 4 +- .../vue_shared/components/markdown/field_view.vue | 19 + .../vue_shared/components/recaptcha_eventhub.js | 4 +- .../components/rich_content_editor/constants.js | 37 + .../rich_content_editor/rich_content_editor.vue | 65 ++ .../rich_content_editor/toolbar_item.vue | 20 + .../rich_content_editor/toolbar_service.js | 32 + .../components/sidebar/labels_select/base.vue | 7 - .../sidebar/labels_select/dropdown_button.vue | 6 - .../sidebar/labels_select/dropdown_value.vue | 6 - .../sidebar/labels_select_vue/constants.js | 5 + .../sidebar/labels_select_vue/dropdown_button.vue | 28 +- .../dropdown_contents_create_view.vue | 44 +- .../dropdown_contents_labels_view.vue | 66 +- .../sidebar/labels_select_vue/dropdown_value.vue | 8 +- .../sidebar/labels_select_vue/label_item.vue | 52 + .../labels_select_vue/labels_select_root.vue | 73 +- .../sidebar/labels_select_vue/store/getters.js | 22 +- .../sidebar/labels_select_vue/store/mutations.js | 26 +- .../sidebar/labels_select_vue/store/state.js | 4 +- .../badges/gitlab_team_member_badge.vue | 27 - .../components/user_avatar/user_avatar_svg.vue | 38 - .../vue_shared/mixins/ci_pagination_api_mixin.js | 29 +- 561 files changed, 16714 insertions(+), 3610 deletions(-) create mode 100644 app/assets/javascripts/access_tokens/components/expires_at_field.vue create mode 100644 app/assets/javascripts/access_tokens/index.js create mode 100644 app/assets/javascripts/actioncable_consumer.js create mode 100644 app/assets/javascripts/alert_management/components/alert_details.vue create mode 100644 app/assets/javascripts/alert_management/components/alert_management_list.vue create mode 100644 app/assets/javascripts/alert_management/constants.js create mode 100644 app/assets/javascripts/alert_management/details.js create mode 100644 app/assets/javascripts/alert_management/graphql/fragments/detailItem.fragment.graphql create mode 100644 app/assets/javascripts/alert_management/graphql/fragments/listItem.fragment.graphql create mode 100644 app/assets/javascripts/alert_management/graphql/mutations/update_alert_status.graphql create mode 100644 app/assets/javascripts/alert_management/graphql/queries/details.query.graphql create mode 100644 app/assets/javascripts/alert_management/graphql/queries/getAlerts.query.graphql create mode 100644 app/assets/javascripts/alert_management/list.js create mode 100644 app/assets/javascripts/alert_management/services/index.js create mode 100644 app/assets/javascripts/boards/icons/fullscreen_collapse.svg create mode 100644 app/assets/javascripts/boards/icons/fullscreen_expand.svg create mode 100644 app/assets/javascripts/boards/queries/board_list.fragment.graphql create mode 100644 app/assets/javascripts/boards/queries/board_list_shared.fragment.graphql create mode 100644 app/assets/javascripts/boards/queries/group_board.query.graphql create mode 100644 app/assets/javascripts/boards/queries/project_board.query.graphql create mode 100644 app/assets/javascripts/clusters/components/fluentd_output_settings.vue create mode 100644 app/assets/javascripts/design_management/components/app.vue create mode 100644 app/assets/javascripts/design_management/components/delete_button.vue create mode 100644 app/assets/javascripts/design_management/components/design_destroyer.vue create mode 100644 app/assets/javascripts/design_management/components/design_note_pin.vue create mode 100644 app/assets/javascripts/design_management/components/design_notes/design_discussion.vue create mode 100644 app/assets/javascripts/design_management/components/design_notes/design_note.vue create mode 100644 app/assets/javascripts/design_management/components/design_notes/design_reply_form.vue create mode 100644 app/assets/javascripts/design_management/components/design_overlay.vue create mode 100644 app/assets/javascripts/design_management/components/design_presentation.vue create mode 100644 app/assets/javascripts/design_management/components/design_scaler.vue create mode 100644 app/assets/javascripts/design_management/components/image.vue create mode 100644 app/assets/javascripts/design_management/components/list/item.vue create mode 100644 app/assets/javascripts/design_management/components/toolbar/index.vue create mode 100644 app/assets/javascripts/design_management/components/toolbar/pagination.vue create mode 100644 app/assets/javascripts/design_management/components/toolbar/pagination_button.vue create mode 100644 app/assets/javascripts/design_management/components/upload/button.vue create mode 100644 app/assets/javascripts/design_management/components/upload/design_dropzone.vue create mode 100644 app/assets/javascripts/design_management/components/upload/design_version_dropdown.vue create mode 100644 app/assets/javascripts/design_management/constants.js create mode 100644 app/assets/javascripts/design_management/graphql.js create mode 100644 app/assets/javascripts/design_management/graphql/fragments/design.fragment.graphql create mode 100644 app/assets/javascripts/design_management/graphql/fragments/designList.fragment.graphql create mode 100644 app/assets/javascripts/design_management/graphql/fragments/designNote.fragment.graphql create mode 100644 app/assets/javascripts/design_management/graphql/fragments/diffRefs.fragment.graphql create mode 100644 app/assets/javascripts/design_management/graphql/fragments/note_permissions.fragment.graphql create mode 100644 app/assets/javascripts/design_management/graphql/fragments/version.fragment.graphql create mode 100644 app/assets/javascripts/design_management/graphql/mutations/createImageDiffNote.mutation.graphql create mode 100644 app/assets/javascripts/design_management/graphql/mutations/createNote.mutation.graphql create mode 100644 app/assets/javascripts/design_management/graphql/mutations/destroyDesign.mutation.graphql create mode 100644 app/assets/javascripts/design_management/graphql/mutations/updateImageDiffNote.mutation.graphql create mode 100644 app/assets/javascripts/design_management/graphql/mutations/update_active_discussion.mutation.graphql create mode 100644 app/assets/javascripts/design_management/graphql/mutations/update_note.mutation.graphql create mode 100644 app/assets/javascripts/design_management/graphql/mutations/uploadDesign.mutation.graphql create mode 100644 app/assets/javascripts/design_management/graphql/queries/active_discussion.query.graphql create mode 100644 app/assets/javascripts/design_management/graphql/queries/appData.query.graphql create mode 100644 app/assets/javascripts/design_management/graphql/queries/design_permissions.query.graphql create mode 100644 app/assets/javascripts/design_management/graphql/queries/getDesign.query.graphql create mode 100644 app/assets/javascripts/design_management/graphql/queries/get_design_list.query.graphql create mode 100644 app/assets/javascripts/design_management/graphql/typedefs.graphql create mode 100644 app/assets/javascripts/design_management/index.js create mode 100644 app/assets/javascripts/design_management/mixins/all_designs.js create mode 100644 app/assets/javascripts/design_management/mixins/all_versions.js create mode 100644 app/assets/javascripts/design_management/pages/design/index.vue create mode 100644 app/assets/javascripts/design_management/pages/index.vue create mode 100644 app/assets/javascripts/design_management/router/constants.js create mode 100644 app/assets/javascripts/design_management/router/index.js create mode 100644 app/assets/javascripts/design_management/router/routes.js create mode 100644 app/assets/javascripts/design_management/utils/cache_update.js create mode 100644 app/assets/javascripts/design_management/utils/design_management_utils.js create mode 100644 app/assets/javascripts/design_management/utils/error_messages.js create mode 100644 app/assets/javascripts/design_management/utils/tracking.js delete mode 100644 app/assets/javascripts/environments/mixins/container_mixin.js delete mode 100644 app/assets/javascripts/environments/mixins/environment_item_mixin.js delete mode 100644 app/assets/javascripts/environments/mixins/environments_app_mixin.js delete mode 100644 app/assets/javascripts/environments/mixins/environments_folder_view_mixin.js delete mode 100644 app/assets/javascripts/environments/mixins/environments_table_mixin.js create mode 100644 app/assets/javascripts/helpers/event_hub_factory.js create mode 100644 app/assets/javascripts/ide/lib/languages/index.js create mode 100644 app/assets/javascripts/ide/lib/languages/vue.js create mode 100644 app/assets/javascripts/ide/lib/themes/monokai.js create mode 100644 app/assets/javascripts/ide/lib/themes/none.js create mode 100644 app/assets/javascripts/ide/lib/themes/solarized_dark.js create mode 100644 app/assets/javascripts/ide/lib/themes/solarized_light.js create mode 100644 app/assets/javascripts/integrations/edit/components/integration_form.vue create mode 100644 app/assets/javascripts/integrations/edit/components/jira_trigger_fields.vue create mode 100644 app/assets/javascripts/integrations/edit/components/trigger_fields.vue create mode 100644 app/assets/javascripts/issuable_sidebar/queries/issue_sidebar.query.graphql create mode 100644 app/assets/javascripts/issuables_list/components/issuable_list_root_app.vue create mode 100644 app/assets/javascripts/issuables_list/queries/get_issues_list_details.query.graphql create mode 100644 app/assets/javascripts/lib/utils/downloader.js create mode 100644 app/assets/javascripts/lib/utils/keys.js create mode 100644 app/assets/javascripts/milestones/project_milestone_combobox.vue create mode 100644 app/assets/javascripts/monitoring/components/alert_widget.vue create mode 100644 app/assets/javascripts/monitoring/components/alert_widget_form.vue create mode 100644 app/assets/javascripts/monitoring/components/dashboard_panel.vue delete mode 100644 app/assets/javascripts/monitoring/components/panel_type.vue create mode 100644 app/assets/javascripts/monitoring/components/variables/custom_variable.vue create mode 100644 app/assets/javascripts/monitoring/components/variables/text_variable.vue create mode 100644 app/assets/javascripts/monitoring/components/variables_section.vue create mode 100644 app/assets/javascripts/monitoring/monitoring_bundle_with_alerts.js create mode 100644 app/assets/javascripts/monitoring/services/alerts_service.js create mode 100644 app/assets/javascripts/monitoring/stores/variable_mapping.js create mode 100644 app/assets/javascripts/monitoring/validators.js create mode 100644 app/assets/javascripts/pages/projects/alert_management/details/index.js create mode 100644 app/assets/javascripts/pages/projects/alert_management/index/index.js create mode 100644 app/assets/javascripts/pages/projects/pipelines/dag/index.js create mode 100644 app/assets/javascripts/pages/projects/settings/access_tokens/index.js create mode 100644 app/assets/javascripts/pipelines/components/pipelines_filtered_search.vue create mode 100644 app/assets/javascripts/pipelines/components/tokens/pipeline_branch_name_token.vue create mode 100644 app/assets/javascripts/pipelines/components/tokens/pipeline_trigger_author_token.vue create mode 100644 app/assets/javascripts/registry/explorer/components/image_list.vue create mode 100644 app/assets/javascripts/reports/accessibility_report/grouped_accessibility_reports_app.vue create mode 100644 app/assets/javascripts/reports/accessibility_report/store/actions.js create mode 100644 app/assets/javascripts/reports/accessibility_report/store/getters.js create mode 100644 app/assets/javascripts/reports/accessibility_report/store/index.js create mode 100644 app/assets/javascripts/reports/accessibility_report/store/mutation_types.js create mode 100644 app/assets/javascripts/reports/accessibility_report/store/mutations.js create mode 100644 app/assets/javascripts/reports/accessibility_report/store/state.js create mode 100644 app/assets/javascripts/reports/components/grouped_issues_list.vue create mode 100644 app/assets/javascripts/sidebar/components/assignees/assignees_realtime.vue create mode 100644 app/assets/javascripts/snippets/components/snippet_description_view.vue create mode 100644 app/assets/javascripts/static_site_editor/components/app.vue create mode 100644 app/assets/javascripts/static_site_editor/components/skeleton_loader.vue delete mode 100644 app/assets/javascripts/static_site_editor/components/static_site_editor.vue create mode 100644 app/assets/javascripts/static_site_editor/graphql/index.js create mode 100644 app/assets/javascripts/static_site_editor/graphql/mutations/submit_content_changes.mutation.graphql create mode 100644 app/assets/javascripts/static_site_editor/graphql/queries/app_data.query.graphql create mode 100644 app/assets/javascripts/static_site_editor/graphql/queries/saved_content_meta.query.graphql create mode 100644 app/assets/javascripts/static_site_editor/graphql/queries/source_content.query.graphql create mode 100644 app/assets/javascripts/static_site_editor/graphql/resolvers/file.js create mode 100644 app/assets/javascripts/static_site_editor/graphql/resolvers/submit_content_changes.js create mode 100644 app/assets/javascripts/static_site_editor/graphql/typedefs.graphql create mode 100644 app/assets/javascripts/static_site_editor/pages/home.vue create mode 100644 app/assets/javascripts/static_site_editor/pages/success.vue create mode 100644 app/assets/javascripts/static_site_editor/router/constants.js create mode 100644 app/assets/javascripts/static_site_editor/router/index.js create mode 100644 app/assets/javascripts/static_site_editor/router/routes.js delete mode 100644 app/assets/javascripts/static_site_editor/store/actions.js delete mode 100644 app/assets/javascripts/static_site_editor/store/getters.js delete mode 100644 app/assets/javascripts/static_site_editor/store/index.js delete mode 100644 app/assets/javascripts/static_site_editor/store/mutation_types.js delete mode 100644 app/assets/javascripts/static_site_editor/store/mutations.js delete mode 100644 app/assets/javascripts/static_site_editor/store/state.js delete mode 100644 app/assets/javascripts/users_select.js create mode 100644 app/assets/javascripts/users_select/constants.js create mode 100644 app/assets/javascripts/users_select/index.js create mode 100644 app/assets/javascripts/users_select/utils.js create mode 100644 app/assets/javascripts/vue_shared/components/markdown/field_view.vue create mode 100644 app/assets/javascripts/vue_shared/components/rich_content_editor/constants.js create mode 100644 app/assets/javascripts/vue_shared/components/rich_content_editor/rich_content_editor.vue create mode 100644 app/assets/javascripts/vue_shared/components/rich_content_editor/toolbar_item.vue create mode 100644 app/assets/javascripts/vue_shared/components/rich_content_editor/toolbar_service.js create mode 100644 app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/constants.js create mode 100644 app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/label_item.vue delete mode 100644 app/assets/javascripts/vue_shared/components/user_avatar/badges/gitlab_team_member_badge.vue delete mode 100644 app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_svg.vue (limited to 'app/assets/javascripts') diff --git a/app/assets/javascripts/access_tokens/components/expires_at_field.vue b/app/assets/javascripts/access_tokens/components/expires_at_field.vue new file mode 100644 index 00000000000..d0932ad80e1 --- /dev/null +++ b/app/assets/javascripts/access_tokens/components/expires_at_field.vue @@ -0,0 +1,14 @@ + + + diff --git a/app/assets/javascripts/access_tokens/index.js b/app/assets/javascripts/access_tokens/index.js new file mode 100644 index 00000000000..9bdb2940956 --- /dev/null +++ b/app/assets/javascripts/access_tokens/index.js @@ -0,0 +1,12 @@ +import Vue from 'vue'; +import ExpiresAtField from './components/expires_at_field.vue'; + +const initExpiresAtField = () => { + // eslint-disable-next-line no-new + new Vue({ + el: document.querySelector('.js-access-tokens-expires-at'), + components: { ExpiresAtField }, + }); +}; + +export default initExpiresAtField; diff --git a/app/assets/javascripts/actioncable_consumer.js b/app/assets/javascripts/actioncable_consumer.js new file mode 100644 index 00000000000..5658ffc1a38 --- /dev/null +++ b/app/assets/javascripts/actioncable_consumer.js @@ -0,0 +1,3 @@ +import { createConsumer } from '@rails/actioncable'; + +export default createConsumer(); diff --git a/app/assets/javascripts/alert_management/components/alert_details.vue b/app/assets/javascripts/alert_management/components/alert_details.vue new file mode 100644 index 00000000000..89db7db77d5 --- /dev/null +++ b/app/assets/javascripts/alert_management/components/alert_details.vue @@ -0,0 +1,236 @@ + + diff --git a/app/assets/javascripts/alert_management/components/alert_management_list.vue b/app/assets/javascripts/alert_management/components/alert_management_list.vue new file mode 100644 index 00000000000..74fc19ff3d4 --- /dev/null +++ b/app/assets/javascripts/alert_management/components/alert_management_list.vue @@ -0,0 +1,303 @@ + + diff --git a/app/assets/javascripts/alert_management/constants.js b/app/assets/javascripts/alert_management/constants.js new file mode 100644 index 00000000000..9df01d9d0b5 --- /dev/null +++ b/app/assets/javascripts/alert_management/constants.js @@ -0,0 +1,46 @@ +import { s__ } from '~/locale'; + +export const ALERTS_SEVERITY_LABELS = { + CRITICAL: s__('AlertManagement|Critical'), + HIGH: s__('AlertManagement|High'), + MEDIUM: s__('AlertManagement|Medium'), + LOW: s__('AlertManagement|Low'), + INFO: s__('AlertManagement|Info'), + UNKNOWN: s__('AlertManagement|Unknown'), +}; + +export const ALERTS_STATUS = { + OPEN: 'OPEN', + TRIGGERED: 'TRIGGERED', + ACKNOWLEDGED: 'ACKNOWLEDGED', + RESOLVED: 'RESOLVED', + ALL: 'ALL', +}; + +export const ALERTS_STATUS_TABS = [ + { + title: s__('AlertManagement|Open'), + status: ALERTS_STATUS.OPEN, + filters: [ALERTS_STATUS.TRIGGERED, ALERTS_STATUS.ACKNOWLEDGED], + }, + { + title: s__('AlertManagement|Triggered'), + status: ALERTS_STATUS.TRIGGERED, + filters: [ALERTS_STATUS.TRIGGERED], + }, + { + title: s__('AlertManagement|Acknowledged'), + status: ALERTS_STATUS.ACKNOWLEDGED, + filters: [ALERTS_STATUS.ACKNOWLEDGED], + }, + { + title: s__('AlertManagement|Resolved'), + status: ALERTS_STATUS.RESOLVED, + filters: [ALERTS_STATUS.RESOLVED], + }, + { + title: s__('AlertManagement|All alerts'), + status: ALERTS_STATUS.ALL, + filters: [ALERTS_STATUS.TRIGGERED, ALERTS_STATUS.ACKNOWLEDGED, ALERTS_STATUS.RESOLVED], + }, +]; diff --git a/app/assets/javascripts/alert_management/details.js b/app/assets/javascripts/alert_management/details.js new file mode 100644 index 00000000000..d3523e0a29d --- /dev/null +++ b/app/assets/javascripts/alert_management/details.js @@ -0,0 +1,47 @@ +import Vue from 'vue'; +import VueApollo from 'vue-apollo'; +import createDefaultClient from '~/lib/graphql'; +import { defaultDataIdFromObject } from 'apollo-cache-inmemory'; +import AlertDetails from './components/alert_details.vue'; + +Vue.use(VueApollo); + +export default selector => { + const domEl = document.querySelector(selector); + const { alertId, projectPath, newIssuePath } = domEl.dataset; + + const apolloProvider = new VueApollo({ + defaultClient: createDefaultClient( + {}, + { + cacheConfig: { + dataIdFromObject: object => { + // eslint-disable-next-line no-underscore-dangle + if (object.__typename === 'AlertManagementAlert') { + return object.iid; + } + return defaultDataIdFromObject(object); + }, + }, + }, + ), + }); + + // eslint-disable-next-line no-new + new Vue({ + el: selector, + apolloProvider, + components: { + AlertDetails, + }, + render(createElement) { + return createElement('alert-details', { + props: { + alertId, + projectPath, + newIssuePath, + }, + }); + }, + }); +}; diff --git a/app/assets/javascripts/alert_management/graphql/fragments/detailItem.fragment.graphql b/app/assets/javascripts/alert_management/graphql/fragments/detailItem.fragment.graphql new file mode 100644 index 00000000000..df802616e97 --- /dev/null +++ b/app/assets/javascripts/alert_management/graphql/fragments/detailItem.fragment.graphql @@ -0,0 +1,11 @@ +#import "./listItem.fragment.graphql" + +fragment AlertDetailItem on AlertManagementAlert { + ...AlertListItem + createdAt + monitoringTool + service + description + updatedAt + details +} diff --git a/app/assets/javascripts/alert_management/graphql/fragments/listItem.fragment.graphql b/app/assets/javascripts/alert_management/graphql/fragments/listItem.fragment.graphql new file mode 100644 index 00000000000..fffe07b0cfd --- /dev/null +++ b/app/assets/javascripts/alert_management/graphql/fragments/listItem.fragment.graphql @@ -0,0 +1,9 @@ +fragment AlertListItem on AlertManagementAlert { + iid + title + severity + status + startedAt + endedAt + eventCount +} diff --git a/app/assets/javascripts/alert_management/graphql/mutations/update_alert_status.graphql b/app/assets/javascripts/alert_management/graphql/mutations/update_alert_status.graphql new file mode 100644 index 00000000000..009ae0b2930 --- /dev/null +++ b/app/assets/javascripts/alert_management/graphql/mutations/update_alert_status.graphql @@ -0,0 +1,9 @@ +mutation ($projectPath: ID!, $status: AlertManagementStatus!, $iid: String!) { + updateAlertStatus(input: { iid: $iid, status: $status, projectPath: $projectPath }) { + errors + alert { + iid, + status, + } + } +} diff --git a/app/assets/javascripts/alert_management/graphql/queries/details.query.graphql b/app/assets/javascripts/alert_management/graphql/queries/details.query.graphql new file mode 100644 index 00000000000..7c77715fad2 --- /dev/null +++ b/app/assets/javascripts/alert_management/graphql/queries/details.query.graphql @@ -0,0 +1,11 @@ +#import "../fragments/detailItem.fragment.graphql" + +query alertDetails($fullPath: ID!, $alertId: String) { + project(fullPath: $fullPath) { + alertManagementAlerts(iid: $alertId) { + nodes { + ...AlertDetailItem + } + } + } +} diff --git a/app/assets/javascripts/alert_management/graphql/queries/getAlerts.query.graphql b/app/assets/javascripts/alert_management/graphql/queries/getAlerts.query.graphql new file mode 100644 index 00000000000..54b66389d5b --- /dev/null +++ b/app/assets/javascripts/alert_management/graphql/queries/getAlerts.query.graphql @@ -0,0 +1,11 @@ +#import "../fragments/listItem.fragment.graphql" + +query getAlerts($projectPath: ID!, $statuses: [AlertManagementStatus!]) { + project(fullPath: $projectPath) { + alertManagementAlerts(statuses: $statuses) { + nodes { + ...AlertListItem + } + } + } +} diff --git a/app/assets/javascripts/alert_management/list.js b/app/assets/javascripts/alert_management/list.js new file mode 100644 index 00000000000..cae6a536b56 --- /dev/null +++ b/app/assets/javascripts/alert_management/list.js @@ -0,0 +1,55 @@ +import Vue from 'vue'; +import VueApollo from 'vue-apollo'; +import createDefaultClient from '~/lib/graphql'; +import { defaultDataIdFromObject } from 'apollo-cache-inmemory'; +import { parseBoolean } from '~/lib/utils/common_utils'; +import AlertManagementList from './components/alert_management_list.vue'; + +Vue.use(VueApollo); + +export default () => { + const selector = '#js-alert_management'; + + const domEl = document.querySelector(selector); + const { projectPath, enableAlertManagementPath, emptyAlertSvgPath } = domEl.dataset; + let { alertManagementEnabled, userCanEnableAlertManagement } = domEl.dataset; + + alertManagementEnabled = parseBoolean(alertManagementEnabled); + userCanEnableAlertManagement = parseBoolean(userCanEnableAlertManagement); + + const apolloProvider = new VueApollo({ + defaultClient: createDefaultClient( + {}, + { + cacheConfig: { + dataIdFromObject: object => { + // eslint-disable-next-line no-underscore-dangle + if (object.__typename === 'AlertManagementAlert') { + return object.iid; + } + return defaultDataIdFromObject(object); + }, + }, + }, + ), + }); + + return new Vue({ + el: selector, + apolloProvider, + components: { + AlertManagementList, + }, + render(createElement) { + return createElement('alert-management-list', { + props: { + projectPath, + enableAlertManagementPath, + emptyAlertSvgPath, + alertManagementEnabled, + userCanEnableAlertManagement, + }, + }); + }, + }); +}; diff --git a/app/assets/javascripts/alert_management/services/index.js b/app/assets/javascripts/alert_management/services/index.js new file mode 100644 index 00000000000..787603d3e7a --- /dev/null +++ b/app/assets/javascripts/alert_management/services/index.js @@ -0,0 +1,7 @@ +import axios from '~/lib/utils/axios_utils'; + +export default { + getAlertManagementList({ endpoint }) { + return axios.get(endpoint); + }, +}; diff --git a/app/assets/javascripts/alerts_service_settings/components/alerts_service_form.vue b/app/assets/javascripts/alerts_service_settings/components/alerts_service_form.vue index 785598142fe..410c5c00e8a 100644 --- a/app/assets/javascripts/alerts_service_settings/components/alerts_service_form.vue +++ b/app/assets/javascripts/alerts_service_settings/components/alerts_service_form.vue @@ -6,7 +6,7 @@ import { GlModal, GlModalDirective, } from '@gitlab/ui'; -import { escape as esc } from 'lodash'; +import { escape } from 'lodash'; import ClipboardButton from '~/vue_shared/components/clipboard_button.vue'; import ToggleButton from '~/vue_shared/components/toggle_button.vue'; import axios from '~/lib/utils/axios_utils'; @@ -65,7 +65,7 @@ export default { 'AlertService|%{linkStart}Learn more%{linkEnd} about configuring this endpoint to receive alerts.', ), { - linkStart: ``, linkEnd: '', diff --git a/app/assets/javascripts/api.js b/app/assets/javascripts/api.js index 6301f6a3910..e527659a939 100644 --- a/app/assets/javascripts/api.js +++ b/app/assets/javascripts/api.js @@ -23,6 +23,8 @@ const Api = { projectMergeRequestVersionsPath: '/api/:version/projects/:id/merge_requests/:mrid/versions', projectRunnersPath: '/api/:version/projects/:id/runners', projectProtectedBranchesPath: '/api/:version/projects/:id/protected_branches', + projectSearchPath: '/api/:version/projects/:id/search', + projectMilestonesPath: '/api/:version/projects/:id/milestones', mergeRequestsPath: '/api/:version/merge_requests', groupLabelsPath: '/groups/:namespace_path/-/labels', issuableTemplatePath: '/:namespace_path/:project_path/templates/:type/:key', @@ -46,6 +48,7 @@ const Api = { mergeRequestsPipeline: '/api/:version/projects/:id/merge_requests/:merge_request_iid/pipelines', adminStatisticsPath: '/api/:version/application/statistics', pipelineSinglePath: '/api/:version/projects/:id/pipelines/:pipeline_id', + pipelinesPath: '/api/:version/projects/:id/pipelines/', environmentsPath: '/api/:version/projects/:id/environments', rawFilePath: '/api/:version/projects/:id/repository/files/:path/raw', @@ -74,13 +77,11 @@ const Api = { const url = Api.buildUrl(Api.groupsPath); return axios .get(url, { - params: Object.assign( - { - search: query, - per_page: DEFAULT_PER_PAGE, - }, - options, - ), + params: { + search: query, + per_page: DEFAULT_PER_PAGE, + ...options, + }, }) .then(({ data }) => { callback(data); @@ -247,6 +248,23 @@ const Api = { .then(({ data }) => data); }, + projectSearch(id, options = {}) { + const url = Api.buildUrl(Api.projectSearchPath).replace(':id', encodeURIComponent(id)); + + return axios.get(url, { + params: { + search: options.search, + scope: options.scope, + }, + }); + }, + + projectMilestones(id) { + const url = Api.buildUrl(Api.projectMilestonesPath).replace(':id', encodeURIComponent(id)); + + return axios.get(url); + }, + mergeRequests(params = {}) { const url = Api.buildUrl(Api.mergeRequestsPath); @@ -281,7 +299,7 @@ const Api = { }; return axios .get(url, { - params: Object.assign({}, defaults, options), + params: { ...defaults, ...options }, }) .then(({ data }) => callback(data)) .catch(() => flash(__('Something went wrong while fetching projects'))); @@ -364,13 +382,11 @@ const Api = { users(query, options) { const url = Api.buildUrl(this.usersPath); return axios.get(url, { - params: Object.assign( - { - search: query, - per_page: DEFAULT_PER_PAGE, - }, - options, - ), + params: { + search: query, + per_page: DEFAULT_PER_PAGE, + ...options, + }, }); }, @@ -401,7 +417,7 @@ const Api = { }; return axios .get(url, { - params: Object.assign({}, defaults, options), + params: { ...defaults, ...options }, }) .then(({ data }) => callback(data)) .catch(() => flash(__('Something went wrong while fetching projects'))); @@ -502,6 +518,15 @@ const Api = { return axios.get(url); }, + // Return all pipelines for a project or filter by query params + pipelines(id, options = {}) { + const url = Api.buildUrl(this.pipelinesPath).replace(':id', encodeURIComponent(id)); + + return axios.get(url, { + params: options, + }); + }, + environments(id) { const url = Api.buildUrl(this.environmentsPath).replace(':id', encodeURIComponent(id)); return axios.get(url); diff --git a/app/assets/javascripts/autosave.js b/app/assets/javascripts/autosave.js index 07d79ea1c70..5f50fcc112e 100644 --- a/app/assets/javascripts/autosave.js +++ b/app/assets/javascripts/autosave.js @@ -3,7 +3,7 @@ import AccessorUtilities from './lib/utils/accessor'; export default class Autosave { - constructor(field, key, fallbackKey) { + constructor(field, key, fallbackKey, lockVersion) { this.field = field; this.isLocalStorageAvailable = AccessorUtilities.isLocalStorageAccessSafe(); @@ -12,6 +12,8 @@ export default class Autosave { } this.key = `autosave/${key}`; this.fallbackKey = fallbackKey; + this.lockVersionKey = `${this.key}/lockVersion`; + this.lockVersion = lockVersion; this.field.data('autosave', this); this.restore(); this.field.on('input', () => this.save()); @@ -40,6 +42,11 @@ export default class Autosave { } } + getSavedLockVersion() { + if (!this.isLocalStorageAvailable) return; + return window.localStorage.getItem(this.lockVersionKey); + } + save() { if (!this.field.length) return; @@ -49,6 +56,9 @@ export default class Autosave { if (this.fallbackKey) { window.localStorage.setItem(this.fallbackKey, text); } + if (this.lockVersion !== undefined) { + window.localStorage.setItem(this.lockVersionKey, this.lockVersion); + } return window.localStorage.setItem(this.key, text); } @@ -58,6 +68,7 @@ export default class Autosave { reset() { if (!this.isLocalStorageAvailable) return; + window.localStorage.removeItem(this.lockVersionKey); window.localStorage.removeItem(this.fallbackKey); return window.localStorage.removeItem(this.key); } diff --git a/app/assets/javascripts/awards_handler.js b/app/assets/javascripts/awards_handler.js index 67164997bd8..8381b050900 100644 --- a/app/assets/javascripts/awards_handler.js +++ b/app/assets/javascripts/awards_handler.js @@ -1,7 +1,7 @@ /* eslint-disable class-methods-use-this, @gitlab/require-i18n-strings */ import $ from 'jquery'; -import _ from 'underscore'; +import { uniq } from 'lodash'; import { GlBreakpointInstance as bp } from '@gitlab/ui/dist/utils'; import Cookies from 'js-cookie'; import { __ } from './locale'; @@ -513,7 +513,7 @@ export class AwardsHandler { addEmojiToFrequentlyUsedList(emoji) { if (this.emoji.isEmojiNameValid(emoji)) { - this.frequentlyUsedEmojis = _.uniq(this.getFrequentlyUsedEmojis().concat(emoji)); + this.frequentlyUsedEmojis = uniq(this.getFrequentlyUsedEmojis().concat(emoji)); Cookies.set('frequently_used_emojis', this.frequentlyUsedEmojis.join(','), { expires: 365 }); } } @@ -522,9 +522,7 @@ export class AwardsHandler { return ( this.frequentlyUsedEmojis || (() => { - const frequentlyUsedEmojis = _.uniq( - (Cookies.get('frequently_used_emojis') || '').split(','), - ); + const frequentlyUsedEmojis = uniq((Cookies.get('frequently_used_emojis') || '').split(',')); this.frequentlyUsedEmojis = frequentlyUsedEmojis.filter(inputName => this.emoji.isEmojiNameValid(inputName), ); diff --git a/app/assets/javascripts/behaviors/copy_to_clipboard.js b/app/assets/javascripts/behaviors/copy_to_clipboard.js index c3541e62568..48bcba7bcca 100644 --- a/app/assets/javascripts/behaviors/copy_to_clipboard.js +++ b/app/assets/javascripts/behaviors/copy_to_clipboard.js @@ -17,10 +17,11 @@ function showTooltip(target, title) { } function genericSuccess(e) { - showTooltip(e.trigger, __('Copied')); // Clear the selection and blur the trigger so it loses its border e.clearSelection(); $(e.trigger).blur(); + + showTooltip(e.trigger, __('Copied')); } /** diff --git a/app/assets/javascripts/behaviors/markdown/marks/inline_html.js b/app/assets/javascripts/behaviors/markdown/marks/inline_html.js index 7e020139fe7..f8465111959 100644 --- a/app/assets/javascripts/behaviors/markdown/marks/inline_html.js +++ b/app/assets/javascripts/behaviors/markdown/marks/inline_html.js @@ -1,7 +1,7 @@ /* eslint-disable class-methods-use-this */ import { Mark } from 'tiptap'; -import { escape as esc } from 'lodash'; +import { escape } from 'lodash'; // Transforms generated HTML back to GFM for Banzai::Filter::MarkdownFilter export default class InlineHTML extends Mark { @@ -35,7 +35,7 @@ export default class InlineHTML extends Mark { mixable: true, open(state, mark) { return `<${mark.attrs.tag}${ - mark.attrs.title ? ` title="${state.esc(esc(mark.attrs.title))}"` : '' + mark.attrs.title ? ` title="${state.esc(escape(mark.attrs.title))}"` : '' }>`; }, close(state, mark) { diff --git a/app/assets/javascripts/behaviors/markdown/paste_markdown_table.js b/app/assets/javascripts/behaviors/markdown/paste_markdown_table.js index 665a7216424..278dd857ab8 100644 --- a/app/assets/javascripts/behaviors/markdown/paste_markdown_table.js +++ b/app/assets/javascripts/behaviors/markdown/paste_markdown_table.js @@ -47,7 +47,8 @@ export default class PasteMarkdownTable { const htmlData = this.data.getData('text/html'); this.doc = new DOMParser().parseFromString(htmlData, 'text/html'); - const tables = this.doc.querySelectorAll('table'); + // Avoid formatting lines that were copied from a diff + const tables = this.doc.querySelectorAll('table:not(.diff-wrap-lines)'); // We're only looking for exactly one table. If there happens to be // multiple tables, it's possible an application copied data into diff --git a/app/assets/javascripts/behaviors/markdown/render_gfm.js b/app/assets/javascripts/behaviors/markdown/render_gfm.js index 137cc7b4669..01627b7206d 100644 --- a/app/assets/javascripts/behaviors/markdown/render_gfm.js +++ b/app/assets/javascripts/behaviors/markdown/render_gfm.js @@ -16,7 +16,7 @@ $.fn.renderGFM = function renderGFM() { renderMath(this.find('.js-render-math')); renderMermaid(this.find('.js-render-mermaid')); highlightCurrentUser(this.find('.gfm-project_member').get()); - initUserPopovers(this.find('.gfm-project_member').get()); + initUserPopovers(this.find('.js-user-link').get()); initMRPopovers(this.find('.gfm-merge_request').get()); renderMetrics(this.find('.js-render-metrics').get()); return this; diff --git a/app/assets/javascripts/behaviors/markdown/render_mermaid.js b/app/assets/javascripts/behaviors/markdown/render_mermaid.js index fe63ebd470d..057cdb6cc4c 100644 --- a/app/assets/javascripts/behaviors/markdown/render_mermaid.js +++ b/app/assets/javascripts/behaviors/markdown/render_mermaid.js @@ -24,13 +24,23 @@ let mermaidModule = {}; function importMermaidModule() { return import(/* webpackChunkName: 'mermaid' */ 'mermaid') .then(mermaid => { + let theme = 'neutral'; + + if ( + window.gon?.user_color_scheme === 'dark' && + // if on the Web IDE page + document.querySelector('.ide') + ) { + theme = 'dark'; + } + mermaid.initialize({ // mermaid core options mermaid: { startOnLoad: false, }, // mermaidAPI options - theme: 'neutral', + theme, flowchart: { useMaxWidth: true, htmlLabels: false, diff --git a/app/assets/javascripts/behaviors/markdown/render_metrics.js b/app/assets/javascripts/behaviors/markdown/render_metrics.js index 9260a89bd52..37cbce46b6f 100644 --- a/app/assets/javascripts/behaviors/markdown/render_metrics.js +++ b/app/assets/javascripts/behaviors/markdown/render_metrics.js @@ -1,15 +1,12 @@ import Vue from 'vue'; -import EmbedGroup from '~/monitoring/components/embeds/embed_group.vue'; import { createStore } from '~/monitoring/stores/embed_group/'; // TODO: Handle copy-pasting - https://gitlab.com/gitlab-org/gitlab-foss/issues/64369. export default function renderMetrics(elements) { if (!elements.length) { - return; + return Promise.resolve(); } - const EmbedGroupComponent = Vue.extend(EmbedGroup); - const wrapperList = []; elements.forEach(element => { @@ -31,14 +28,20 @@ export default function renderMetrics(elements) { element.parentNode.removeChild(element); }); - wrapperList.forEach(wrapper => { - // eslint-disable-next-line no-new - new EmbedGroupComponent({ - el: wrapper, - store: createStore(), - propsData: { - urls: wrapper.urls, - }, + return import( + /* webpackChunkName: 'gfm_metrics' */ '~/monitoring/components/embeds/embed_group.vue' + ).then(({ default: EmbedGroup }) => { + const EmbedGroupComponent = Vue.extend(EmbedGroup); + + wrapperList.forEach(wrapper => { + // eslint-disable-next-line no-new + new EmbedGroupComponent({ + el: wrapper, + store: createStore(), + propsData: { + urls: wrapper.urls, + }, + }); }); }); } diff --git a/app/assets/javascripts/behaviors/shortcuts/shortcuts_blob.js b/app/assets/javascripts/behaviors/shortcuts/shortcuts_blob.js index d5d8edd5ac0..c35a073b291 100644 --- a/app/assets/javascripts/behaviors/shortcuts/shortcuts_blob.js +++ b/app/assets/javascripts/behaviors/shortcuts/shortcuts_blob.js @@ -22,7 +22,7 @@ function eventHasModifierKeys(event) { export default class ShortcutsBlob extends Shortcuts { constructor(opts) { - const options = Object.assign({}, defaults, opts); + const options = { ...defaults, ...opts }; super(options.skipResetBindings); this.options = options; diff --git a/app/assets/javascripts/blob/blob_fork_suggestion.js b/app/assets/javascripts/blob/blob_fork_suggestion.js index 476b9405a9e..44dfbfcfe1c 100644 --- a/app/assets/javascripts/blob/blob_fork_suggestion.js +++ b/app/assets/javascripts/blob/blob_fork_suggestion.js @@ -17,7 +17,7 @@ const defaults = { class BlobForkSuggestion { constructor(options) { - this.elementMap = Object.assign({}, defaults, options); + this.elementMap = { ...defaults, ...options }; this.onOpenButtonClick = this.onOpenButtonClick.bind(this); this.onCancelButtonClick = this.onCancelButtonClick.bind(this); } diff --git a/app/assets/javascripts/blob/components/blob_content.vue b/app/assets/javascripts/blob/components/blob_content.vue index 7d5d48cfc31..4f433bd8dfd 100644 --- a/app/assets/javascripts/blob/components/blob_content.vue +++ b/app/assets/javascripts/blob/components/blob_content.vue @@ -3,12 +3,19 @@ import { GlLoadingIcon } from '@gitlab/ui'; import { RichViewer, SimpleViewer } from '~/vue_shared/components/blob_viewers'; import BlobContentError from './blob_content_error.vue'; +import { BLOB_RENDER_EVENT_LOAD, BLOB_RENDER_EVENT_SHOW_SOURCE } from './constants'; + export default { components: { GlLoadingIcon, BlobContentError, }, props: { + blob: { + type: Object, + required: false, + default: () => ({}), + }, content: { type: String, default: '', @@ -37,6 +44,8 @@ export default { return this.activeViewer.renderError; }, }, + BLOB_RENDER_EVENT_LOAD, + BLOB_RENDER_EVENT_SHOW_SOURCE, };