From f61bb2a16a514b71bf33aabbbb999d6732016a24 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Tue, 20 Apr 2021 14:36:54 +0000 Subject: Add latest changes from gitlab-org/gitlab@13-11-stable-ee --- app/assets/images/learn_gitlab/issue_created.svg | 65 +++ app/assets/images/learn_gitlab/section_deploy.svg | 16 + app/assets/images/learn_gitlab/section_plan.svg | 1 + .../images/learn_gitlab/section_workspace.svg | 1 + app/assets/javascripts/access_tokens/index.js | 16 +- app/assets/javascripts/activities.js | 33 +- .../admin/statistics_panel/constants.js | 2 +- .../admin/users/components/user_date.vue | 29 - .../admin/users/components/users_table.vue | 2 +- app/assets/javascripts/admin/users/constants.js | 2 - app/assets/javascripts/admin/users/new.js | 55 ++ .../components/alert_management_empty_state.vue | 2 +- app/assets/javascripts/alert_management/list.js | 4 +- .../components/alert_mapping_builder.vue | 18 +- .../components/alerts_integrations_list.vue | 19 +- .../components/alerts_settings_form.vue | 430 +++++++++------ .../components/alerts_settings_wrapper.vue | 123 +++-- .../javascripts/alerts_settings/constants.js | 94 ++-- app/assets/javascripts/alerts_settings/index.js | 40 +- .../alerts_settings/utils/error_messages.js | 8 +- .../usage_trends/components/charts_config.js | 2 +- .../usage_trends/components/usage_counts.vue | 2 +- app/assets/javascripts/api.js | 30 +- app/assets/javascripts/api/user_api.js | 3 +- app/assets/javascripts/awards_handler.js | 2 +- app/assets/javascripts/badges/components/badge.vue | 7 +- .../batch_comments/components/preview_item.vue | 14 +- .../batch_comments/mixins/resolved_status.js | 16 +- .../behaviors/deprecated_remove_row_behavior.js | 15 + .../behaviors/markdown/render_mermaid.js | 54 +- .../javascripts/behaviors/shortcuts/keybindings.js | 594 ++++++++++++++++++++- .../javascripts/behaviors/shortcuts/shortcuts.js | 65 ++- .../behaviors/shortcuts/shortcuts_blob.js | 3 +- .../behaviors/shortcuts/shortcuts_find_file.js | 20 +- .../behaviors/shortcuts/shortcuts_help.vue | 8 +- .../behaviors/shortcuts/shortcuts_issuable.js | 29 +- .../behaviors/shortcuts/shortcuts_navigation.js | 70 ++- .../behaviors/shortcuts/shortcuts_network.js | 21 +- .../behaviors/shortcuts/shortcuts_toggle.vue | 6 +- .../behaviors/shortcuts/shortcuts_wiki.js | 3 +- .../javascripts/blob/components/blob_content.vue | 7 + .../javascripts/blob/file_template_selector.js | 26 +- app/assets/javascripts/blob/stl_viewer.js | 4 +- .../suggest_gitlab_ci_yml/components/popover.vue | 1 - app/assets/javascripts/blob_edit/edit_blob.js | 4 +- app/assets/javascripts/boards/boards_util.js | 33 +- .../boards/components/board_add_new_column.vue | 56 +- .../components/board_add_new_column_form.vue | 119 +++-- .../components/board_add_new_column_trigger.vue | 4 +- .../boards/components/board_blocked_icon.vue | 192 +++++++ .../boards/components/board_card_inner.vue | 28 +- .../components/board_card_loading_skeleton.vue | 26 + .../boards/components/board_content.vue | 29 +- .../boards/components/board_content_sidebar.vue | 96 ++++ .../boards/components/board_extra_actions.vue | 57 -- .../javascripts/boards/components/board_form.vue | 33 +- .../javascripts/boards/components/board_list.vue | 2 +- .../boards/components/board_list_deprecated.vue | 7 +- .../boards/components/board_list_header.vue | 1 + .../boards/components/board_new_issue.vue | 15 +- .../components/board_new_issue_deprecated.vue | 2 +- .../boards/components/board_settings_sidebar.vue | 8 +- .../boards/components/config_toggle.vue | 12 +- .../boards/components/filtered_search.vue | 54 -- .../boards/components/modal/empty_state.vue | 84 --- .../javascripts/boards/components/modal/filters.js | 27 - .../javascripts/boards/components/modal/footer.vue | 80 --- .../javascripts/boards/components/modal/header.vue | 80 --- .../javascripts/boards/components/modal/index.vue | 151 ------ .../javascripts/boards/components/modal/list.vue | 141 ----- .../boards/components/modal/lists_dropdown.vue | 49 -- .../javascripts/boards/components/modal/tabs.vue | 42 -- .../components/sidebar/board_editable_item.vue | 4 +- .../components/sidebar/board_sidebar_due_date.vue | 7 +- .../sidebar/board_sidebar_issue_title.vue | 169 ------ .../sidebar/board_sidebar_labels_select.vue | 12 +- .../sidebar/board_sidebar_milestone_select.vue | 19 +- .../sidebar/board_sidebar_subscription.vue | 18 +- .../sidebar/board_sidebar_time_tracker.vue | 25 + .../components/sidebar/board_sidebar_title.vue | 169 ++++++ .../javascripts/boards/components/toggle_focus.vue | 4 +- app/assets/javascripts/boards/config_toggle.js | 5 +- app/assets/javascripts/boards/constants.js | 29 + app/assets/javascripts/boards/ee_functions.js | 1 - app/assets/javascripts/boards/filtered_search.js | 25 - .../graphql/board_blocking_issues.query.graphql | 16 + .../boards/graphql/issue.fragment.graphql | 4 + .../issue_set_subscription.mutation.graphql | 2 +- .../graphql/issue_set_title.mutation.graphql | 2 +- app/assets/javascripts/boards/index.js | 71 +-- .../javascripts/boards/mixins/board_new_issue.js | 6 + .../javascripts/boards/mixins/modal_footer.js | 1 - .../javascripts/boards/mixins/modal_mixins.js | 12 - app/assets/javascripts/boards/stores/actions.js | 306 +++++++---- app/assets/javascripts/boards/stores/getters.js | 12 +- .../javascripts/boards/stores/modal_store.js | 95 ---- .../javascripts/boards/stores/mutation_types.js | 15 +- app/assets/javascripts/boards/stores/mutations.js | 70 +-- .../javascripts/branches/branch_sort_dropdown.js | 25 + .../branches/components/sort_dropdown.vue | 88 +++ .../javascripts/branches/divergence_graph.js | 8 +- .../javascripts/captcha/apollo_captcha_link.js | 37 ++ .../javascripts/ci_lint/components/ci_lint.vue | 6 +- .../components/triggers_list.vue | 10 +- .../components/ci_variable_modal.vue | 16 +- .../components/ci_variable_popover.vue | 2 +- .../components/ci_variable_table.vue | 7 +- app/assets/javascripts/ci_variable_list/index.js | 9 +- .../clusters/components/application_row.vue | 13 +- app/assets/javascripts/clusters/constants.js | 1 + .../javascripts/clusters/forms/show/index.js | 5 +- .../clusters/services/application_state_machine.js | 4 + .../components/node_error_help_text.vue | 2 +- .../commit/pipelines/pipelines_bundle.js | 4 +- .../commit/pipelines/pipelines_table.vue | 33 +- app/assets/javascripts/commits.js | 2 +- .../content_editor/components/content_editor.vue | 18 + app/assets/javascripts/content_editor/constants.js | 5 + .../extensions/code_block_highlight.js | 38 ++ app/assets/javascripts/content_editor/index.js | 2 + .../content_editor/services/create_editor.js | 60 +++ .../content_editor/services/markdown_serializer.js | 73 +++ .../contributors/components/contributors.vue | 11 +- app/assets/javascripts/contributors/index.js | 9 +- .../javascripts/contributors/stores/index.js | 6 +- .../javascripts/contributors/stores/state.js | 4 +- .../javascripts/create_merge_request_dropdown.js | 30 +- app/assets/javascripts/delete_label_modal.js | 16 + .../components/deploy_freeze_modal.vue | 28 +- .../components/deploy_freeze_table.vue | 35 +- .../javascripts/deploy_freeze/store/actions.js | 47 +- .../deploy_freeze/store/mutation_types.js | 1 + .../javascripts/deploy_freeze/store/mutations.js | 11 +- .../javascripts/deploy_freeze/store/state.js | 2 + .../deploy_tokens/components/revoke_button.vue | 81 +++ .../deploy_tokens/init_revoke_button.js | 26 + .../gl_dropdown_filter.js | 23 +- .../design_management/components/delete_button.vue | 2 +- .../components/design_notes/design_note.vue | 7 +- .../design_management/components/design_scaler.vue | 16 +- .../design_management/components/list/item.vue | 3 +- .../components/toolbar/design_navigation.vue | 24 +- .../design_management/components/toolbar/index.vue | 8 +- .../design_management/components/upload/button.vue | 3 +- app/assets/javascripts/design_management/index.js | 4 +- .../design_management/pages/design/index.vue | 5 +- .../javascripts/design_management/pages/index.vue | 7 +- app/assets/javascripts/diffs/components/app.vue | 73 +-- .../javascripts/diffs/components/commit_item.vue | 61 +-- .../diffs/components/compare_versions.vue | 52 +- .../diffs/components/diff_discussions.vue | 1 + .../javascripts/diffs/components/diff_file.vue | 8 +- .../diffs/components/diff_file_header.vue | 18 +- .../diffs/components/diff_line_note_form.vue | 36 +- .../javascripts/diffs/components/diff_row.vue | 40 +- .../diffs/components/image_diff_overlay.vue | 1 + .../diffs/components/inline_diff_table_row.vue | 7 +- .../diffs/components/parallel_diff_table_row.vue | 14 + app/assets/javascripts/diffs/index.js | 4 + app/assets/javascripts/diffs/store/actions.js | 93 ++-- app/assets/javascripts/diffs/store/getters.js | 12 +- .../javascripts/diffs/store/modules/diff_state.js | 6 +- .../javascripts/diffs/store/modules/index.js | 6 +- app/assets/javascripts/diffs/store/mutations.js | 9 +- app/assets/javascripts/diffs/store/utils.js | 17 +- .../javascripts/diffs/utils/interoperability.js | 49 ++ app/assets/javascripts/droplab/drop_lab.js | 15 +- app/assets/javascripts/droplab/hook_button.js | 2 + .../extensions/editor_lite_extension_base.js | 76 ++- app/assets/javascripts/emoji/awards_app/index.js | 43 ++ .../javascripts/emoji/awards_app/store/actions.js | 51 ++ .../javascripts/emoji/awards_app/store/index.js | 20 + .../emoji/awards_app/store/mutation_types.js | 6 + .../emoji/awards_app/store/mutations.js | 23 + app/assets/javascripts/emoji/components/picker.vue | 3 + app/assets/javascripts/ensure_data.js | 56 ++ .../components/enable_review_app_modal.vue | 19 +- .../components/environment_rollback.vue | 1 + app/assets/javascripts/environments/index.js | 1 + .../error_tracking/components/error_details.vue | 2 +- .../components/error_tracking_actions.vue | 2 + .../components/error_tracking_form.vue | 6 +- .../error_tracking_settings/store/getters.js | 4 +- .../experimentation/components/experiment.vue | 15 + .../javascripts/experimentation/constants.js | 2 + app/assets/javascripts/experimentation/utils.js | 18 + .../components/feature_flags_table.vue | 8 +- .../javascripts/feature_flags/components/form.vue | 19 +- .../feature_flags/components/strategy.vue | 1 + .../feature_flags/components/user_lists_table.vue | 7 +- .../feature_highlight_popover.vue | 1 - .../javascripts/filtered_search/dropdown_emoji.js | 8 +- .../filtered_search/dropdown_non_user.js | 8 +- .../filtered_search/filtered_search_manager.js | 7 +- app/assets/javascripts/flash.js | 74 +-- app/assets/javascripts/gfm_auto_complete.js | 31 +- .../components/grafana_integration.vue | 4 +- app/assets/javascripts/graphql_shared/constants.js | 2 + .../graphql_shared/fragments/epic.fragment.graphql | 11 - .../fragments/user_availability.fragment.graphql | 5 + .../queries/users_search.query.graphql | 4 +- app/assets/javascripts/group.js | 6 +- .../javascripts/groups/components/group_item.vue | 14 +- app/assets/javascripts/header.js | 4 + .../ide/components/cannot_push_code_alert.vue | 40 ++ app/assets/javascripts/ide/components/ide.vue | 13 +- .../javascripts/ide/components/ide_status_mr.vue | 2 +- .../ide/components/jobs/detail/scroll_button.vue | 1 + .../ide/components/merge_requests/list.vue | 4 +- .../ide/components/nav_dropdown_button.vue | 4 +- app/assets/javascripts/ide/components/nav_form.vue | 2 +- app/assets/javascripts/ide/constants.js | 2 +- app/assets/javascripts/ide/index.js | 1 + app/assets/javascripts/ide/lib/editor_options.js | 2 + app/assets/javascripts/ide/lib/languages/README.md | 10 +- app/assets/javascripts/ide/messages.js | 12 +- .../ide/stores/actions/merge_request.js | 6 +- app/assets/javascripts/ide/stores/getters.js | 38 +- .../javascripts/ide/stores/mutation_types.js | 2 +- .../import_entities/components/import_status.vue | 27 +- .../javascripts/import_entities/constants.js | 58 +- .../components/provider_repo_table_row.vue | 2 +- .../components/incidents_settings_tabs.vue | 5 +- .../integrations/edit/components/dynamic_field.vue | 11 +- .../edit/components/jira_issues_fields.vue | 54 +- .../edit/components/jira_trigger_fields.vue | 147 ++++- .../edit/components/jira_upgrade_cta.vue | 51 ++ .../edit/components/trigger_fields.vue | 4 +- app/assets/javascripts/integrations/edit/index.js | 9 +- .../index/components/integrations_list.vue | 59 ++ .../index/components/integrations_table.vue | 95 ++++ app/assets/javascripts/integrations/index/index.js | 23 + .../components/invite_member_modal.vue | 4 +- .../components/invite_member_trigger.vue | 8 +- .../invite_member/init_invite_member_modal.js | 12 +- .../invite_member/init_invite_member_trigger.js | 6 +- .../components/invite_members_modal.vue | 19 +- .../components/invite_members_trigger.vue | 71 ++- app/assets/javascripts/invite_members/constants.js | 2 + .../issuable/components/csv_export_modal.vue | 16 +- .../components/csv_import_export_buttons.vue | 31 +- .../issuable/components/issuable_by_email.vue | 6 +- .../issuable/init_csv_import_export_buttons.js | 11 +- .../javascripts/issuable_bulk_update_actions.js | 4 +- .../javascripts/issuable_bulk_update_sidebar.js | 23 +- app/assets/javascripts/issuable_index.js | 2 +- .../issuable_list/components/issuable_item.vue | 6 +- .../components/issuable_list_root.vue | 30 +- .../issuable_list/components/issuable_tabs.vue | 13 +- .../issuable_show/components/issuable_body.vue | 5 + .../components/issuable_edit_form.vue | 8 + .../components/issuable_show_root.vue | 6 + .../issuable_show/components/issuable_title.vue | 7 +- .../queries/issue_sidebar.query.graphql | 16 - .../components/info_popover.vue | 41 ++ .../javascripts/issuable_type_selector/index.js | 16 + .../javascripts/issue_show/components/app.vue | 2 +- .../issue_show/components/edit_actions.vue | 12 +- .../issue_show/components/header_actions.vue | 25 +- .../javascripts/issue_show/components/title.vue | 7 +- .../issues_list/components/issuables_list_app.vue | 3 + .../issues_list/components/issues_list_app.vue | 363 ++++++++++++- app/assets/javascripts/issues_list/constants.js | 188 +++++++ app/assets/javascripts/issues_list/index.js | 39 ++ app/assets/javascripts/jira_connect/api.js | 24 +- .../javascripts/jira_connect/components/app.vue | 64 ++- .../jira_connect/components/group_item_name.vue | 34 ++ .../jira_connect/components/groups_list.vue | 96 ++-- .../jira_connect/components/groups_list_item.vue | 41 +- .../jira_connect/components/subscriptions_list.vue | 109 ++++ app/assets/javascripts/jira_connect/index.js | 54 +- app/assets/javascripts/jira_connect/utils.js | 40 ++ .../javascripts/jobs/components/commit_block.vue | 9 +- .../jobs/components/job_container_item.vue | 2 +- .../jobs/components/job_log_controllers.vue | 20 +- .../jobs/components/manual_variables_form.vue | 22 +- app/assets/javascripts/jobs/components/sidebar.vue | 3 +- .../components/sidebar_job_details_container.vue | 4 +- .../jobs/components/stages_dropdown.vue | 14 +- .../table/graphql/queries/get_jobs.query.graphql | 52 ++ .../javascripts/jobs/components/table/index.js | 33 ++ .../jobs/components/table/jobs_table.vue | 67 +++ .../jobs/components/table/jobs_table_app.vue | 85 +++ .../jobs/components/table/jobs_table_tabs.vue | 66 +++ app/assets/javascripts/labels_select.js | 33 +- app/assets/javascripts/lib/graphql.js | 2 + app/assets/javascripts/lib/utils/color_utils.js | 12 + app/assets/javascripts/lib/utils/common_utils.js | 13 + .../javascripts/lib/utils/datetime_utility.js | 76 ++- app/assets/javascripts/lib/utils/forms.js | 94 ++++ app/assets/javascripts/lib/utils/text_markdown.js | 4 +- app/assets/javascripts/lib/utils/webpack.js | 6 - app/assets/javascripts/main.js | 55 +- .../approve_access_request_button.vue | 7 +- .../action_buttons/invite_action_buttons.vue | 1 + .../action_buttons/remove_group_link_button.vue | 7 +- .../action_buttons/remove_member_button.vue | 28 +- .../action_buttons/resend_invite_button.vue | 7 +- .../action_buttons/user_action_buttons.vue | 10 +- app/assets/javascripts/members/components/app.vue | 14 +- .../members/components/avatars/user_avatar.vue | 3 +- .../filter_sort/filter_sort_container.vue | 10 +- .../filter_sort/members_filtered_search_bar.vue | 7 +- .../components/filter_sort/sort_dropdown.vue | 10 +- .../members/components/modals/leave_modal.vue | 23 +- .../components/modals/remove_group_link_modal.vue | 19 +- .../components/table/expiration_datepicker.vue | 7 +- .../members/components/table/members_table.vue | 13 +- .../components/table/members_table_cell.vue | 3 +- .../members/components/table/role_dropdown.vue | 7 +- app/assets/javascripts/members/index.js | 32 +- app/assets/javascripts/members/store/index.js | 1 + app/assets/javascripts/members/store/state.js | 6 - .../components/diff_file_editor.vue | 32 +- .../components/inline_conflict_lines.vue | 25 +- .../components/parallel_conflict_lines.vue | 17 +- .../javascripts/merge_conflicts/constants.js | 1 + .../merge_conflict_resolver_app.vue | 129 +++-- .../merge_conflicts/merge_conflict_service.js | 16 - .../merge_conflicts/merge_conflict_store.js | 432 --------------- .../merge_conflicts/merge_conflicts_bundle.js | 92 +--- .../mixins/line_conflict_actions.js | 7 - .../javascripts/merge_conflicts/store/actions.js | 5 + .../javascripts/merge_conflicts/store/getters.js | 2 +- .../merge_request/components/status_box.vue | 2 +- app/assets/javascripts/merge_request_tabs.js | 2 +- app/assets/javascripts/milestone_select.js | 12 +- .../javascripts/mini_pipeline_graph_dropdown.js | 113 ---- .../monitoring/components/dashboard_header.vue | 7 +- .../components/dashboard_panel_builder.vue | 7 +- .../components/duplicate_dashboard_form.vue | 2 +- .../monitoring/components/links_section.vue | 2 +- .../monitoring/components/refresh_button.vue | 8 +- app/assets/javascripts/mr_notes/init_notes.js | 8 +- app/assets/javascripts/mr_notes/stores/actions.js | 35 +- .../javascripts/mr_notes/stores/modules/index.js | 4 +- .../javascripts/mr_notes/stores/mutation_types.js | 2 + .../javascripts/mr_notes/stores/mutations.js | 6 + .../components/lock_popovers.vue | 77 +++ .../namespaces/cascading_settings/index.js | 15 + app/assets/javascripts/notes.js | 31 +- .../javascripts/notes/components/comment_form.vue | 128 +++-- .../notes/components/discussion_navigator.vue | 13 +- .../notes/components/discussion_notes.vue | 2 + .../discussion_resolve_with_issue_button.vue | 7 +- .../javascripts/notes/components/note_actions.vue | 29 +- .../notes/components/note_attachment.vue | 2 +- .../javascripts/notes/components/note_form.vue | 10 +- .../javascripts/notes/components/noteable_note.vue | 26 +- .../javascripts/notes/components/notes_app.vue | 7 + .../notes/components/sort_discussion.vue | 11 +- app/assets/javascripts/notes/mixins/resolvable.js | 17 +- app/assets/javascripts/notes/stores/getters.js | 27 +- .../components/metrics_settings.vue | 4 +- .../packages/list/components/package_search.vue | 30 +- .../packages/list/components/package_title.vue | 10 +- .../packages/list/components/packages_list_app.vue | 63 ++- app/assets/javascripts/packages/list/constants.js | 4 + .../packages/list/packages_list_app_bundle.js | 8 - app/assets/javascripts/packages/list/utils.js | 4 +- .../shared/components/package_icon_and_name.vue | 17 + .../shared/components/package_list_row.vue | 22 +- .../javascripts/packages/shared/constants.js | 1 + app/assets/javascripts/packages/shared/utils.js | 16 +- .../components/infrastructure_icon_and_name.vue | 17 + .../components/infrastructure_search.vue | 45 ++ .../components/infrastructure_title.vue | 53 ++ .../infrastructure_registry/list_app_bundle.js | 33 ++ .../settings/group/components/maven_settings.vue | 4 + .../settings/group/constants.js | 1 + .../packages_and_registries/shared/constants.js | 1 + .../packages_and_registries/shared/utils.js | 29 + app/assets/javascripts/pager.js | 20 +- .../javascripts/pages/admin/abuse_reports/index.js | 3 + app/assets/javascripts/pages/admin/admin.js | 13 - .../general/components/signup_checkbox.vue | 50 ++ .../general/components/signup_form.vue | 417 +++++++++++++++ .../admin/application_settings/general/index.js | 26 +- .../pages/admin/application_settings/gitpod.js | 24 + .../pages/admin/application_settings/index.js | 4 +- .../application_settings/signup_restrictions.js | 31 ++ .../pages/admin/application_settings/utils.js | 21 + .../pages/admin/broadcast_messages/index.js | 6 +- .../javascripts/pages/admin/groups/new/index.js | 4 +- .../javascripts/pages/admin/labels/edit/index.js | 2 +- .../javascripts/pages/admin/labels/index/index.js | 3 + .../javascripts/pages/admin/labels/new/index.js | 2 +- .../javascripts/pages/admin/runners/index.js | 12 - .../javascripts/pages/admin/runners/index/index.js | 12 + .../javascripts/pages/admin/runners/show/index.js | 3 + .../javascripts/pages/admin/services/edit/index.js | 6 +- .../javascripts/pages/admin/spam_logs/index.js | 3 + .../admin/users/components/delete_user_modal.vue | 4 +- .../javascripts/pages/admin/users/new/index.js | 52 +- .../javascripts/pages/dashboard/activity/index.js | 3 +- .../pages/dashboard/todos/index/todos.js | 35 +- app/assets/javascripts/pages/groups/edit/index.js | 2 + .../pages/groups/group_members/index.js | 5 + .../javascripts/pages/groups/labels/index/index.js | 2 + .../groups/new/fetch_group_path_availability.js | 11 +- .../pages/groups/new/group_path_validator.js | 9 +- app/assets/javascripts/pages/groups/new/index.js | 6 +- .../pages/groups/settings/ci_cd/show/index.js | 3 - .../javascripts/pages/groups/settings/index.js | 5 + .../pages/groups/settings/integrations/index.js | 3 + .../settings/packages_and_registries/index.js | 3 - .../pages/groups/settings/repository/show/index.js | 3 - .../javascripts/pages/profiles/show/index.js | 135 +++-- .../javascripts/pages/projects/blob/show/index.js | 23 +- .../pages/projects/branches/index/index.js | 11 +- .../projects/forks/new/components/fork_form.vue | 7 + .../javascripts/pages/projects/hooks/index.js | 3 + .../javascripts/pages/projects/issues/form.js | 2 + .../pages/projects/issues/index/index.js | 7 +- .../javascripts/pages/projects/issues/show.js | 14 +- .../javascripts/pages/projects/jobs/index/index.js | 34 +- .../javascripts/pages/projects/jobs/show/index.js | 2 +- .../pages/projects/labels/index/index.js | 2 + .../learn_gitlab/components/learn_gitlab_a.vue | 64 ++- .../learn_gitlab/components/learn_gitlab_b.vue | 6 +- .../components/learn_gitlab_info_card.vue | 2 +- .../components/learn_gitlab_section_card.vue | 52 ++ .../components/learn_gitlab_section_link.vue | 43 ++ .../pages/projects/learn_gitlab/constants/index.js | 50 +- .../merge_requests/init_merge_request_show.js | 14 +- .../infrastructure_registry/index/index.js | 3 + .../javascripts/pages/projects/pages/index.js | 3 + .../javascripts/pages/projects/path_locks/index.js | 3 + .../shared/components/interval_pattern_input.vue | 2 +- app/assets/javascripts/pages/projects/project.js | 17 +- .../pages/projects/project_members/index.js | 5 + .../pages/projects/settings/ci_cd/show/index.js | 3 - .../javascripts/pages/projects/settings/index.js | 5 + .../projects/settings/integrations/show/index.js | 3 + .../projects/settings/operations/show/index.js | 5 - .../projects/settings/repository/show/index.js | 3 - .../components/project_feature_setting.vue | 7 + .../permissions/components/settings_panel.vue | 87 ++- .../javascripts/pages/projects/tags/index/index.js | 2 + .../pages/shared/mount_runner_instructions.js | 9 +- .../pages/shared/wikis/components/wiki_form.vue | 253 +++++++++ app/assets/javascripts/pages/shared/wikis/index.js | 23 + app/assets/javascripts/pages/shared/wikis/wikis.js | 75 --- .../javascripts/pages/users/activity_calendar.js | 2 +- .../performance_bar/components/detailed_metric.vue | 98 +++- .../components/performance_bar_app.vue | 19 +- .../components/request_selector.vue | 4 +- .../performance_bar/components/request_warning.vue | 4 +- .../javascripts/performance_bar/constants.js | 17 + app/assets/javascripts/performance_bar/index.js | 32 +- .../stores/performance_bar_store.js | 13 +- app/assets/javascripts/persistent_user_callouts.js | 2 + .../code_snippet_alert/code_snippet_alert.vue | 42 ++ .../components/code_snippet_alert/constants.js | 11 + .../components/commit/commit_form.vue | 2 +- .../components/editor/ci_config_merged_preview.vue | 76 +-- .../components/editor/text_editor.vue | 2 +- .../components/file_nav/branch_switcher.vue | 65 +++ .../file_nav/pipeline_editor_file_nav.vue | 21 + .../components/header/pipeline_editor_header.vue | 15 +- .../components/header/pipeline_status.vue | 34 +- .../components/header/validation_segment.vue | 59 +- .../pipeline_editor/components/lint/ci_lint.vue | 12 +- .../components/lint/ci_lint_results.vue | 30 +- .../components/pipeline_editor_tabs.vue | 75 ++- .../pipeline_editor/components/ui/editor_tab.vue | 66 ++- .../javascripts/pipeline_editor/constants.js | 11 +- .../graphql/queries/available_branches.graphql | 9 + .../graphql/queries/client/app_status.graphql | 3 + .../graphql/queries/client/pipeline.graphql | 3 +- .../pipeline_editor/graphql/resolvers.js | 24 +- app/assets/javascripts/pipeline_editor/index.js | 21 +- .../pipeline_editor/pipeline_editor_app.vue | 90 +++- .../pipeline_editor/pipeline_editor_home.vue | 9 +- .../pipeline_new/components/pipeline_new_form.vue | 15 +- .../javascripts/pipelines/components/dag/dag.vue | 4 + .../components/graph/action_component.vue | 103 ---- .../pipelines/components/graph/constants.js | 9 + .../pipelines/components/graph/graph_component.vue | 72 ++- .../components/graph/graph_component_legacy.vue | 2 +- .../components/graph/graph_component_wrapper.vue | 56 +- .../components/graph/graph_view_selector.vue | 85 +++ .../components/graph/job_group_dropdown.vue | 37 +- .../pipelines/components/graph/job_item.vue | 112 +++- .../components/graph/job_name_component.vue | 38 -- .../pipelines/components/graph/linked_pipeline.vue | 3 +- .../components/graph/linked_pipelines_column.vue | 19 +- .../graph/linked_pipelines_column_legacy.vue | 2 +- .../components/graph/stage_column_component.vue | 67 ++- .../graph/stage_column_component_legacy.vue | 4 +- .../pipelines/components/graph/utils.js | 16 +- .../pipelines/components/graph_shared/api.js | 2 +- .../components/graph_shared/links_inner.vue | 26 +- .../components/graph_shared/links_layer.vue | 2 +- .../pipelines/components/header_component.vue | 8 +- .../components/jobs_shared/action_component.vue | 103 ++++ .../components/jobs_shared/job_name_component.vue | 38 ++ .../notification/pipeline_notification.vue | 90 ++++ .../pipelines/components/parsing_utils.js | 26 + .../components/pipeline_graph/job_pill.vue | 9 +- .../components/pipeline_graph/pipeline_graph.vue | 218 +++----- .../components/pipelines_list/blank_state.vue | 30 -- .../components/pipelines_list/empty_state.vue | 39 +- .../components/pipelines_list/job_item.vue | 190 +++++++ .../components/pipelines_list/nav_controls.vue | 28 +- .../pipelines_list/pipeline_mini_graph.vue | 2 +- .../components/pipelines_list/pipeline_stage.vue | 4 +- .../pipelines_list/pipeline_triggerer.vue | 10 +- .../components/pipelines_list/pipeline_url.vue | 10 +- .../components/pipelines_list/pipelines.vue | 14 +- .../pipelines_list/pipelines_ci_templates.vue | 143 +++++ .../components/pipelines_list/pipelines_table.vue | 38 -- .../pipelines_list/pipelines_table_row.vue | 269 ---------- .../components/pipelines_list/time_ago.vue | 74 +-- .../components/test_reports/test_summary.vue | 1 + .../pipelines/components/unwrapping_utils.js | 48 +- app/assets/javascripts/pipelines/constants.js | 3 + .../dismiss_pipeline_notification.graphql | 5 + .../graphql/queries/get_dag_vis_data.query.graphql | 1 + .../queries/get_user_callouts.query.graphql | 13 + .../pipelines/mixins/pipelines_mixin.js | 2 +- .../pipelines/pipeline_details_bundle.js | 40 +- .../javascripts/pipelines/pipeline_details_dag.js | 7 +- .../pipelines/pipeline_details_graph.js | 13 +- .../pipelines/pipeline_details_header.js | 8 +- .../pipelines/pipeline_details_notification.js | 29 + .../pipelines/pipeline_shared_client.js | 11 + .../javascripts/pipelines/pipelines_index.js | 6 + app/assets/javascripts/pipelines/utils.js | 8 + .../commit/components/commit_comments_button.vue | 42 ++ .../commit/components/commit_options_dropdown.vue | 107 ++++ .../projects/commit/components/form_modal.vue | 8 +- .../projects/commit/components/form_trigger.vue | 35 -- .../javascripts/projects/commit/constants.js | 2 - app/assets/javascripts/projects/commit/index.js | 8 +- .../commit/init_cherry_pick_commit_modal.js | 1 + .../commit/init_cherry_pick_commit_trigger.js | 20 - .../projects/commit/init_commit_comments_button.js | 18 + .../commit/init_commit_options_dropdown.js | 35 ++ .../projects/commit/init_revert_commit_trigger.js | 20 - .../javascripts/projects/commit/store/actions.js | 4 +- .../javascripts/projects/commit_box/info/index.js | 16 +- .../projects/commit_box/info/load_branches.js | 3 +- .../projects/compare/components/app_legacy.vue | 27 +- .../projects/compare/components/repo_dropdown.vue | 9 +- .../compare/components/revision_dropdown.vue | 59 +- .../components/revision_dropdown_legacy.vue | 13 +- .../components/app.vue | 32 +- .../components/welcome.vue | 3 +- .../experiment_new_project_creation/constants.js | 1 + .../projects/pipelines/charts/components/app.vue | 36 +- .../components/ci_cd_analytics_area_chart.vue | 6 +- .../charts/components/ci_cd_analytics_charts.vue | 4 + .../javascripts/projects/pipelines/charts/index.js | 6 +- .../javascripts/registry/explorer/pages/list.vue | 30 +- .../registry/settings/components/settings_form.vue | 14 +- .../releases/components/app_edit_new.vue | 14 +- .../javascripts/releases/components/app_index.vue | 4 +- .../javascripts/releases/components/app_show.vue | 56 +- .../releases/components/asset_links_form.vue | 6 +- .../releases/components/release_block_header.vue | 7 +- .../components/release_block_milestone_info.vue | 2 +- .../components/releases_pagination_graphql.vue | 4 +- .../components/releases_pagination_rest.vue | 4 +- .../releases/components/releases_sort.vue | 4 +- .../javascripts/releases/components/tag_field.vue | 2 +- .../releases/components/tag_field_existing.vue | 2 +- .../releases/components/tag_field_new.vue | 6 +- app/assets/javascripts/releases/mount_edit.js | 4 +- app/assets/javascripts/releases/mount_index.js | 8 +- app/assets/javascripts/releases/mount_new.js | 4 +- app/assets/javascripts/releases/mount_show.js | 28 +- .../releases/stores/modules/detail/actions.js | 187 ------- .../releases/stores/modules/detail/getters.js | 105 ---- .../releases/stores/modules/detail/index.js | 12 - .../stores/modules/detail/mutation_types.js | 22 - .../releases/stores/modules/detail/mutations.js | 98 ---- .../releases/stores/modules/detail/state.js | 51 -- .../releases/stores/modules/edit_new/actions.js | 187 +++++++ .../releases/stores/modules/edit_new/getters.js | 105 ++++ .../releases/stores/modules/edit_new/index.js | 12 + .../stores/modules/edit_new/mutation_types.js | 22 + .../releases/stores/modules/edit_new/mutations.js | 98 ++++ .../releases/stores/modules/edit_new/state.js | 51 ++ .../releases/stores/modules/index/actions.js | 109 ++++ .../releases/stores/modules/index/index.js | 10 + .../stores/modules/index/mutation_types.js | 4 + .../releases/stores/modules/index/mutations.js | 46 ++ .../releases/stores/modules/index/state.js | 25 + .../releases/stores/modules/list/actions.js | 109 ---- .../releases/stores/modules/list/index.js | 10 - .../releases/stores/modules/list/mutation_types.js | 4 - .../releases/stores/modules/list/mutations.js | 46 -- .../releases/stores/modules/list/state.js | 25 - .../grouped_accessibility_reports_app.vue | 1 + .../grouped_codequality_reports_app.vue | 3 +- .../reports/components/grouped_issues_list.vue | 4 +- .../javascripts/reports/components/issues_list.vue | 4 +- .../reports/components/report_section.vue | 23 +- .../javascripts/reports/components/summary_row.vue | 2 +- app/assets/javascripts/reports/constants.js | 2 +- .../grouped_test_report/components/modal.vue | 21 +- .../components/test_issue_body.vue | 18 +- .../grouped_test_reports_app.vue | 31 +- .../reports/grouped_test_report/store/actions.js | 2 +- .../grouped_test_report/store/mutation_types.js | 2 +- .../reports/grouped_test_report/store/mutations.js | 19 +- .../reports/grouped_test_report/store/state.js | 14 +- .../reports/grouped_test_report/store/utils.js | 9 + .../repository/components/blob_content_viewer.vue | 100 ++++ .../repository/components/breadcrumbs.vue | 53 +- .../components/directory_download_links.vue | 12 +- .../repository/components/table/row.vue | 22 +- .../repository/components/tree_action_link.vue | 28 - .../repository/components/upload_blob_modal.vue | 8 +- app/assets/javascripts/repository/index.js | 42 +- app/assets/javascripts/repository/pages/blob.vue | 22 + .../repository/queries/blob_info.query.graphql | 30 ++ app/assets/javascripts/repository/router.js | 20 + .../javascripts/runner/runner_details/constants.js | 3 + .../javascripts/runner/runner_details/index.js | 23 + .../runner/runner_details/runner_details_app.vue | 20 + .../javascripts/search/sidebar/components/app.vue | 4 +- .../javascripts/search/sort/components/app.vue | 1 + .../javascripts/search/topbar/components/app.vue | 6 +- .../topbar/components/searchable_dropdown.vue | 8 +- .../javascripts/search_settings/constants.js | 2 +- .../components/manage_sast.vue | 2 +- .../set_status_modal/set_status_modal_wrapper.vue | 65 ++- .../components/assignees/assignee_avatar_link.vue | 4 +- .../components/assignees/assignees_realtime.vue | 25 +- .../components/assignees/issuable_assignees.vue | 37 +- .../components/assignees/sidebar_assignees.vue | 1 + .../assignees/sidebar_assignees_widget.vue | 296 +++++----- .../assignees/sidebar_invite_members.vue | 51 ++ .../components/assignees/sidebar_participant.vue | 39 ++ .../assignees/uncollapsed_assignee_list.vue | 6 +- .../confidential/sidebar_confidentiality_form.vue | 11 +- .../sidebar_confidentiality_widget.vue | 17 +- .../sidebar/components/copy_email_to_clipboard.vue | 35 +- .../due_date/sidebar_due_date_widget.vue | 203 +++++++ .../reference/sidebar_reference_widget.vue | 41 +- .../reviewers/uncollapsed_reviewer_list.vue | 8 +- .../sidebar/components/sidebar_editable_item.vue | 38 +- app/assets/javascripts/sidebar/constants.js | 9 + app/assets/javascripts/sidebar/mount_sidebar.js | 105 +++- .../sidebar/queries/issue_due_date.query.graphql | 10 + .../update_epic_subscription.mutation.graphql | 8 + .../queries/update_epic_title.mutation.graphql | 8 + .../queries/update_issue_due_date.mutation.graphql | 9 + .../javascripts/snippets/components/edit.vue | 54 +- .../snippets/components/embed_dropdown.vue | 1 + .../mutations/createSnippet.mutation.graphql | 2 - .../mutations/updateSnippet.mutation.graphql | 3 - .../static_site_editor/graphql/index.js | 4 +- .../javascripts/tags/components/sort_dropdown.vue | 77 +++ app/assets/javascripts/tags/index.js | 24 + app/assets/javascripts/tooltips/index.js | 5 +- app/assets/javascripts/tracking.js | 34 +- .../user_lists/components/user_list.vue | 1 + app/assets/javascripts/users_select/index.js | 11 +- .../deployment/deployment_action_button.vue | 1 + .../components/mr_widget_pipeline.vue | 38 +- .../states/mr_widget_auto_merge_enabled.vue | 8 +- .../components/states/mr_widget_conflicts.vue | 57 +- .../components/states/mr_widget_merged.vue | 2 + .../components/states/ready_to_merge.vue | 56 +- .../components/states/squash_before_merge.vue | 3 +- .../vue_merge_request_widget/mr_widget_options.vue | 3 +- .../queries/get_state.query.graphql | 9 +- .../queries/states/ready_to_merge.fragment.graphql | 12 +- .../stores/mr_widget_store.js | 3 +- .../alert_details/components/alert_details.vue | 7 +- .../alert_details/components/alert_sidebar.vue | 5 - .../alert_details/components/alert_status.vue | 23 +- .../components/sidebar/sidebar_status.vue | 24 +- .../vue_shared/alert_details/constants.js | 11 + .../javascripts/vue_shared/alert_details/index.js | 4 +- .../vue_shared/components/alert_details_table.vue | 8 + .../vue_shared/components/awards_list.vue | 21 +- .../vue_shared/components/blob_viewers/mixins.js | 10 + .../components/blob_viewers/simple_viewer.vue | 54 +- .../vue_shared/components/clone_dropdown.vue | 2 + .../vue_shared/components/delete_label_modal.vue | 81 +++ .../vue_shared/components/deprecated_modal.vue | 146 ----- .../vue_shared/components/file_finder/index.vue | 3 +- .../components/file_icon/file_icon_map.js | 18 +- .../filtered_search_bar_root.vue | 3 +- .../filtered_search_bar/tokens/author_token.vue | 10 +- .../filtered_search_bar/tokens/emoji_token.vue | 105 ++++ .../filtered_search_bar/tokens/epic_token.vue | 133 +++++ .../filtered_search_bar/tokens/label_token.vue | 31 +- .../vue_shared/components/gl_toggle_vuex.vue | 49 -- .../vue_shared/components/header_ci_component.vue | 8 +- .../vue_shared/components/help_popover.vue | 17 +- .../vue_shared/components/lib/utils/props_utils.js | 35 ++ .../components/markdown/apply_suggestion.vue | 3 + .../vue_shared/components/markdown/field.vue | 29 + .../vue_shared/components/markdown/header.vue | 21 +- .../components/markdown/suggestion_diff_header.vue | 10 +- .../vue_shared/components/markdown/toolbar.vue | 24 +- .../vue_shared/components/modal_copy_button.vue | 1 + .../vue_shared/components/notes/system_note.vue | 7 +- .../components/oncall_schedules_list.vue | 70 +++ .../vue_shared/components/recaptcha_eventhub.js | 21 - .../vue_shared/components/recaptcha_modal.vue | 90 ---- .../components/registry/registry_search.vue | 45 +- .../vue_shared/components/remove_member_modal.vue | 45 +- .../rich_content_editor/toolbar_item.vue | 6 +- .../queries/get_runner_platforms.query.graphql | 8 +- .../graphql/queries/get_runner_setup.query.graphql | 14 +- .../runner_instructions/runner_instructions.vue | 246 +-------- .../runner_instructions_modal.vue | 249 +++++++++ .../components/sidebar/copyable_field.vue | 88 +++ .../components/sidebar/issuable_move_dropdown.vue | 1 + .../labels_select_vue/labels_select_root.vue | 48 +- .../components/sidebar/multiselect_dropdown.vue | 3 + .../queries/get_issue_participants.query.graphql | 3 + .../queries/get_mr_participants.query.graphql | 3 + .../update_issue_assignees.mutation.graphql | 3 + .../queries/update_mr_assignees.mutation.graphql | 3 + .../javascripts/vue_shared/components/url_sync.vue | 20 +- .../vue_shared/components/user_date.vue | 29 + .../components/user_popover/user_popover.vue | 25 +- app/assets/javascripts/vue_shared/constants.js | 2 + .../mixins/recaptcha_modal_implementor.js | 36 -- .../security_report_download_paths.query.graphql | 1 + .../security_reports/security_reports_app.vue | 2 + .../javascripts/whats_new/components/app.vue | 58 +- app/assets/javascripts/whats_new/index.js | 6 +- app/assets/javascripts/whats_new/store/actions.js | 10 +- .../javascripts/whats_new/utils/notification.js | 13 +- app/assets/stylesheets/_page_specific_files.scss | 1 - app/assets/stylesheets/application_dark.scss | 57 ++ .../stylesheets/components/feature_highlight.scss | 9 + app/assets/stylesheets/fontawesome_custom.scss | 43 -- app/assets/stylesheets/framework/awards.scss | 43 +- .../stylesheets/framework/ci_variable_list.scss | 23 - app/assets/stylesheets/framework/common.scss | 10 - app/assets/stylesheets/framework/diffs.scss | 4 - app/assets/stylesheets/framework/dropdowns.scss | 14 +- app/assets/stylesheets/framework/editor-lite.scss | 50 ++ app/assets/stylesheets/framework/emojis.scss | 13 +- app/assets/stylesheets/framework/filters.scss | 19 +- app/assets/stylesheets/framework/header.scss | 12 +- app/assets/stylesheets/framework/modal.scss | 8 - app/assets/stylesheets/framework/page_header.scss | 25 +- .../stylesheets/framework/responsive_tables.scss | 2 +- .../framework/secondary_navigation_elements.scss | 2 +- app/assets/stylesheets/framework/sidebar.scss | 13 - app/assets/stylesheets/framework/spinner.scss | 4 +- app/assets/stylesheets/framework/typography.scss | 80 ++- app/assets/stylesheets/framework/variables.scss | 17 +- app/assets/stylesheets/highlight/common.scss | 28 + app/assets/stylesheets/highlight/themes/dark.scss | 4 + .../stylesheets/highlight/themes/monokai.scss | 4 + app/assets/stylesheets/highlight/themes/none.scss | 4 + .../highlight/themes/solarized-dark.scss | 4 + .../highlight/themes/solarized-light.scss | 4 + app/assets/stylesheets/highlight/white_base.scss | 4 + .../lazy_bundles/select2_overrides.scss | 56 +- .../page_bundles/alert_management_settings.scss | 1 - app/assets/stylesheets/page_bundles/boards.scss | 117 +--- app/assets/stylesheets/page_bundles/build.scss | 38 +- app/assets/stylesheets/page_bundles/ci_status.scss | 14 - .../stylesheets/page_bundles/jira_connect.scss | 59 +- .../stylesheets/page_bundles/learn_gitlab.scss | 8 + .../stylesheets/page_bundles/merge_requests.scss | 33 +- app/assets/stylesheets/page_bundles/pipeline.scss | 18 +- app/assets/stylesheets/pages/commits.scss | 8 +- app/assets/stylesheets/pages/editor.scss | 2 +- app/assets/stylesheets/pages/events.scss | 19 +- app/assets/stylesheets/pages/groups.scss | 15 - app/assets/stylesheets/pages/help.scss | 7 - app/assets/stylesheets/pages/issuable.scss | 45 +- app/assets/stylesheets/pages/issues.scss | 5 +- app/assets/stylesheets/pages/labels.scss | 3 +- app/assets/stylesheets/pages/login.scss | 3 +- app/assets/stylesheets/pages/merge_requests.scss | 4 +- app/assets/stylesheets/pages/note_form.scss | 1 - app/assets/stylesheets/pages/notes.scss | 20 + app/assets/stylesheets/pages/notifications.scss | 4 - app/assets/stylesheets/pages/projects.scss | 11 +- app/assets/stylesheets/pages/runners.scss | 56 -- app/assets/stylesheets/pages/settings.scss | 4 - app/assets/stylesheets/pages/tree.scss | 2 +- app/assets/stylesheets/performance_bar.scss | 2 +- app/assets/stylesheets/print.scss | 8 + app/assets/stylesheets/themes/_dark.scss | 3 + app/assets/stylesheets/themes/theme_light.scss | 46 -- 790 files changed, 15075 insertions(+), 8229 deletions(-) create mode 100644 app/assets/images/learn_gitlab/issue_created.svg create mode 100644 app/assets/images/learn_gitlab/section_deploy.svg create mode 100644 app/assets/images/learn_gitlab/section_plan.svg create mode 100644 app/assets/images/learn_gitlab/section_workspace.svg delete mode 100644 app/assets/javascripts/admin/users/components/user_date.vue create mode 100644 app/assets/javascripts/admin/users/new.js create mode 100644 app/assets/javascripts/behaviors/deprecated_remove_row_behavior.js create mode 100644 app/assets/javascripts/boards/components/board_blocked_icon.vue create mode 100644 app/assets/javascripts/boards/components/board_card_loading_skeleton.vue create mode 100644 app/assets/javascripts/boards/components/board_content_sidebar.vue delete mode 100644 app/assets/javascripts/boards/components/board_extra_actions.vue delete mode 100644 app/assets/javascripts/boards/components/filtered_search.vue delete mode 100644 app/assets/javascripts/boards/components/modal/empty_state.vue delete mode 100644 app/assets/javascripts/boards/components/modal/filters.js delete mode 100644 app/assets/javascripts/boards/components/modal/footer.vue delete mode 100644 app/assets/javascripts/boards/components/modal/header.vue delete mode 100644 app/assets/javascripts/boards/components/modal/index.vue delete mode 100644 app/assets/javascripts/boards/components/modal/list.vue delete mode 100644 app/assets/javascripts/boards/components/modal/lists_dropdown.vue delete mode 100644 app/assets/javascripts/boards/components/modal/tabs.vue delete mode 100644 app/assets/javascripts/boards/components/sidebar/board_sidebar_issue_title.vue create mode 100644 app/assets/javascripts/boards/components/sidebar/board_sidebar_time_tracker.vue create mode 100644 app/assets/javascripts/boards/components/sidebar/board_sidebar_title.vue delete mode 100644 app/assets/javascripts/boards/filtered_search.js create mode 100644 app/assets/javascripts/boards/graphql/board_blocking_issues.query.graphql create mode 100644 app/assets/javascripts/boards/mixins/board_new_issue.js delete mode 100644 app/assets/javascripts/boards/mixins/modal_footer.js delete mode 100644 app/assets/javascripts/boards/mixins/modal_mixins.js delete mode 100644 app/assets/javascripts/boards/stores/modal_store.js create mode 100644 app/assets/javascripts/branches/branch_sort_dropdown.js create mode 100644 app/assets/javascripts/branches/components/sort_dropdown.vue create mode 100644 app/assets/javascripts/captcha/apollo_captcha_link.js create mode 100644 app/assets/javascripts/content_editor/components/content_editor.vue create mode 100644 app/assets/javascripts/content_editor/constants.js create mode 100644 app/assets/javascripts/content_editor/extensions/code_block_highlight.js create mode 100644 app/assets/javascripts/content_editor/index.js create mode 100644 app/assets/javascripts/content_editor/services/create_editor.js create mode 100644 app/assets/javascripts/content_editor/services/markdown_serializer.js create mode 100644 app/assets/javascripts/delete_label_modal.js create mode 100644 app/assets/javascripts/deploy_tokens/components/revoke_button.vue create mode 100644 app/assets/javascripts/deploy_tokens/init_revoke_button.js create mode 100644 app/assets/javascripts/diffs/utils/interoperability.js create mode 100644 app/assets/javascripts/emoji/awards_app/index.js create mode 100644 app/assets/javascripts/emoji/awards_app/store/actions.js create mode 100644 app/assets/javascripts/emoji/awards_app/store/index.js create mode 100644 app/assets/javascripts/emoji/awards_app/store/mutation_types.js create mode 100644 app/assets/javascripts/emoji/awards_app/store/mutations.js create mode 100644 app/assets/javascripts/ensure_data.js create mode 100644 app/assets/javascripts/experimentation/components/experiment.vue create mode 100644 app/assets/javascripts/graphql_shared/constants.js delete mode 100644 app/assets/javascripts/graphql_shared/fragments/epic.fragment.graphql create mode 100644 app/assets/javascripts/graphql_shared/fragments/user_availability.fragment.graphql create mode 100644 app/assets/javascripts/ide/components/cannot_push_code_alert.vue create mode 100644 app/assets/javascripts/integrations/edit/components/jira_upgrade_cta.vue create mode 100644 app/assets/javascripts/integrations/index/components/integrations_list.vue create mode 100644 app/assets/javascripts/integrations/index/components/integrations_table.vue create mode 100644 app/assets/javascripts/integrations/index/index.js delete mode 100644 app/assets/javascripts/issuable_sidebar/queries/issue_sidebar.query.graphql create mode 100644 app/assets/javascripts/issuable_type_selector/components/info_popover.vue create mode 100644 app/assets/javascripts/issuable_type_selector/index.js create mode 100644 app/assets/javascripts/jira_connect/components/group_item_name.vue create mode 100644 app/assets/javascripts/jira_connect/components/subscriptions_list.vue create mode 100644 app/assets/javascripts/jobs/components/table/graphql/queries/get_jobs.query.graphql create mode 100644 app/assets/javascripts/jobs/components/table/index.js create mode 100644 app/assets/javascripts/jobs/components/table/jobs_table.vue create mode 100644 app/assets/javascripts/jobs/components/table/jobs_table_app.vue create mode 100644 app/assets/javascripts/jobs/components/table/jobs_table_tabs.vue delete mode 100644 app/assets/javascripts/merge_conflicts/merge_conflict_service.js delete mode 100644 app/assets/javascripts/merge_conflicts/merge_conflict_store.js delete mode 100644 app/assets/javascripts/merge_conflicts/mixins/line_conflict_actions.js delete mode 100644 app/assets/javascripts/mini_pipeline_graph_dropdown.js create mode 100644 app/assets/javascripts/namespaces/cascading_settings/components/lock_popovers.vue create mode 100644 app/assets/javascripts/namespaces/cascading_settings/index.js create mode 100644 app/assets/javascripts/packages/shared/components/package_icon_and_name.vue create mode 100644 app/assets/javascripts/packages_and_registries/infrastructure_registry/components/infrastructure_icon_and_name.vue create mode 100644 app/assets/javascripts/packages_and_registries/infrastructure_registry/components/infrastructure_search.vue create mode 100644 app/assets/javascripts/packages_and_registries/infrastructure_registry/components/infrastructure_title.vue create mode 100644 app/assets/javascripts/packages_and_registries/infrastructure_registry/list_app_bundle.js create mode 100644 app/assets/javascripts/packages_and_registries/shared/constants.js create mode 100644 app/assets/javascripts/packages_and_registries/shared/utils.js create mode 100644 app/assets/javascripts/pages/admin/application_settings/general/components/signup_checkbox.vue create mode 100644 app/assets/javascripts/pages/admin/application_settings/general/components/signup_form.vue create mode 100644 app/assets/javascripts/pages/admin/application_settings/gitpod.js create mode 100644 app/assets/javascripts/pages/admin/application_settings/signup_restrictions.js create mode 100644 app/assets/javascripts/pages/admin/application_settings/utils.js create mode 100644 app/assets/javascripts/pages/admin/labels/index/index.js delete mode 100644 app/assets/javascripts/pages/admin/runners/index.js create mode 100644 app/assets/javascripts/pages/admin/runners/index/index.js create mode 100644 app/assets/javascripts/pages/admin/runners/show/index.js create mode 100644 app/assets/javascripts/pages/admin/spam_logs/index.js create mode 100644 app/assets/javascripts/pages/groups/settings/index.js create mode 100644 app/assets/javascripts/pages/groups/settings/integrations/index.js create mode 100644 app/assets/javascripts/pages/projects/hooks/index.js create mode 100644 app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_section_card.vue create mode 100644 app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_section_link.vue create mode 100644 app/assets/javascripts/pages/projects/packages/infrastructure_registry/index/index.js create mode 100644 app/assets/javascripts/pages/projects/pages/index.js create mode 100644 app/assets/javascripts/pages/projects/path_locks/index.js create mode 100644 app/assets/javascripts/pages/projects/settings/index.js create mode 100644 app/assets/javascripts/pages/shared/wikis/components/wiki_form.vue create mode 100644 app/assets/javascripts/performance_bar/constants.js create mode 100644 app/assets/javascripts/pipeline_editor/components/code_snippet_alert/code_snippet_alert.vue create mode 100644 app/assets/javascripts/pipeline_editor/components/code_snippet_alert/constants.js create mode 100644 app/assets/javascripts/pipeline_editor/components/file_nav/branch_switcher.vue create mode 100644 app/assets/javascripts/pipeline_editor/components/file_nav/pipeline_editor_file_nav.vue create mode 100644 app/assets/javascripts/pipeline_editor/graphql/queries/available_branches.graphql create mode 100644 app/assets/javascripts/pipeline_editor/graphql/queries/client/app_status.graphql delete mode 100644 app/assets/javascripts/pipelines/components/graph/action_component.vue create mode 100644 app/assets/javascripts/pipelines/components/graph/graph_view_selector.vue delete mode 100644 app/assets/javascripts/pipelines/components/graph/job_name_component.vue create mode 100644 app/assets/javascripts/pipelines/components/jobs_shared/action_component.vue create mode 100644 app/assets/javascripts/pipelines/components/jobs_shared/job_name_component.vue create mode 100644 app/assets/javascripts/pipelines/components/notification/pipeline_notification.vue delete mode 100644 app/assets/javascripts/pipelines/components/pipelines_list/blank_state.vue create mode 100644 app/assets/javascripts/pipelines/components/pipelines_list/job_item.vue create mode 100644 app/assets/javascripts/pipelines/components/pipelines_list/pipelines_ci_templates.vue delete mode 100644 app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table_row.vue create mode 100644 app/assets/javascripts/pipelines/graphql/mutations/dismiss_pipeline_notification.graphql create mode 100644 app/assets/javascripts/pipelines/graphql/queries/get_user_callouts.query.graphql create mode 100644 app/assets/javascripts/pipelines/pipeline_details_notification.js create mode 100644 app/assets/javascripts/pipelines/pipeline_shared_client.js create mode 100644 app/assets/javascripts/projects/commit/components/commit_comments_button.vue create mode 100644 app/assets/javascripts/projects/commit/components/commit_options_dropdown.vue delete mode 100644 app/assets/javascripts/projects/commit/components/form_trigger.vue delete mode 100644 app/assets/javascripts/projects/commit/init_cherry_pick_commit_trigger.js create mode 100644 app/assets/javascripts/projects/commit/init_commit_comments_button.js create mode 100644 app/assets/javascripts/projects/commit/init_commit_options_dropdown.js delete mode 100644 app/assets/javascripts/projects/commit/init_revert_commit_trigger.js create mode 100644 app/assets/javascripts/projects/experiment_new_project_creation/constants.js delete mode 100644 app/assets/javascripts/releases/stores/modules/detail/actions.js delete mode 100644 app/assets/javascripts/releases/stores/modules/detail/getters.js delete mode 100644 app/assets/javascripts/releases/stores/modules/detail/index.js delete mode 100644 app/assets/javascripts/releases/stores/modules/detail/mutation_types.js delete mode 100644 app/assets/javascripts/releases/stores/modules/detail/mutations.js delete mode 100644 app/assets/javascripts/releases/stores/modules/detail/state.js create mode 100644 app/assets/javascripts/releases/stores/modules/edit_new/actions.js create mode 100644 app/assets/javascripts/releases/stores/modules/edit_new/getters.js create mode 100644 app/assets/javascripts/releases/stores/modules/edit_new/index.js create mode 100644 app/assets/javascripts/releases/stores/modules/edit_new/mutation_types.js create mode 100644 app/assets/javascripts/releases/stores/modules/edit_new/mutations.js create mode 100644 app/assets/javascripts/releases/stores/modules/edit_new/state.js create mode 100644 app/assets/javascripts/releases/stores/modules/index/actions.js create mode 100644 app/assets/javascripts/releases/stores/modules/index/index.js create mode 100644 app/assets/javascripts/releases/stores/modules/index/mutation_types.js create mode 100644 app/assets/javascripts/releases/stores/modules/index/mutations.js create mode 100644 app/assets/javascripts/releases/stores/modules/index/state.js delete mode 100644 app/assets/javascripts/releases/stores/modules/list/actions.js delete mode 100644 app/assets/javascripts/releases/stores/modules/list/index.js delete mode 100644 app/assets/javascripts/releases/stores/modules/list/mutation_types.js delete mode 100644 app/assets/javascripts/releases/stores/modules/list/mutations.js delete mode 100644 app/assets/javascripts/releases/stores/modules/list/state.js create mode 100644 app/assets/javascripts/repository/components/blob_content_viewer.vue delete mode 100644 app/assets/javascripts/repository/components/tree_action_link.vue create mode 100644 app/assets/javascripts/repository/pages/blob.vue create mode 100644 app/assets/javascripts/repository/queries/blob_info.query.graphql create mode 100644 app/assets/javascripts/runner/runner_details/constants.js create mode 100644 app/assets/javascripts/runner/runner_details/index.js create mode 100644 app/assets/javascripts/runner/runner_details/runner_details_app.vue create mode 100644 app/assets/javascripts/sidebar/components/assignees/sidebar_invite_members.vue create mode 100644 app/assets/javascripts/sidebar/components/assignees/sidebar_participant.vue create mode 100644 app/assets/javascripts/sidebar/components/due_date/sidebar_due_date_widget.vue create mode 100644 app/assets/javascripts/sidebar/queries/issue_due_date.query.graphql create mode 100644 app/assets/javascripts/sidebar/queries/update_epic_subscription.mutation.graphql create mode 100644 app/assets/javascripts/sidebar/queries/update_epic_title.mutation.graphql create mode 100644 app/assets/javascripts/sidebar/queries/update_issue_due_date.mutation.graphql create mode 100644 app/assets/javascripts/tags/components/sort_dropdown.vue create mode 100644 app/assets/javascripts/tags/index.js create mode 100644 app/assets/javascripts/vue_shared/components/delete_label_modal.vue delete mode 100644 app/assets/javascripts/vue_shared/components/deprecated_modal.vue create mode 100644 app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/emoji_token.vue create mode 100644 app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/epic_token.vue delete mode 100644 app/assets/javascripts/vue_shared/components/gl_toggle_vuex.vue create mode 100644 app/assets/javascripts/vue_shared/components/lib/utils/props_utils.js create mode 100644 app/assets/javascripts/vue_shared/components/oncall_schedules_list.vue delete mode 100644 app/assets/javascripts/vue_shared/components/recaptcha_eventhub.js delete mode 100644 app/assets/javascripts/vue_shared/components/recaptcha_modal.vue create mode 100644 app/assets/javascripts/vue_shared/components/runner_instructions/runner_instructions_modal.vue create mode 100644 app/assets/javascripts/vue_shared/components/sidebar/copyable_field.vue create mode 100644 app/assets/javascripts/vue_shared/components/user_date.vue delete mode 100644 app/assets/javascripts/vue_shared/mixins/recaptcha_modal_implementor.js create mode 100644 app/assets/stylesheets/components/feature_highlight.scss delete mode 100644 app/assets/stylesheets/fontawesome_custom.scss delete mode 100644 app/assets/stylesheets/pages/runners.scss (limited to 'app/assets') diff --git a/app/assets/images/learn_gitlab/issue_created.svg b/app/assets/images/learn_gitlab/issue_created.svg new file mode 100644 index 00000000000..01652b97fc0 --- /dev/null +++ b/app/assets/images/learn_gitlab/issue_created.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/assets/images/learn_gitlab/section_deploy.svg b/app/assets/images/learn_gitlab/section_deploy.svg new file mode 100644 index 00000000000..187956a66db --- /dev/null +++ b/app/assets/images/learn_gitlab/section_deploy.svg @@ -0,0 +1,16 @@ + + + + Group + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/app/assets/images/learn_gitlab/section_plan.svg b/app/assets/images/learn_gitlab/section_plan.svg new file mode 100644 index 00000000000..2348e837e5f --- /dev/null +++ b/app/assets/images/learn_gitlab/section_plan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/images/learn_gitlab/section_workspace.svg b/app/assets/images/learn_gitlab/section_workspace.svg new file mode 100644 index 00000000000..5cb7fd36ddd --- /dev/null +++ b/app/assets/images/learn_gitlab/section_workspace.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/javascripts/access_tokens/index.js b/app/assets/javascripts/access_tokens/index.js index 43d56295f78..7f5f0403de6 100644 --- a/app/assets/javascripts/access_tokens/index.js +++ b/app/assets/javascripts/access_tokens/index.js @@ -1,20 +1,10 @@ import Vue from 'vue'; import createFlash from '~/flash'; +import { parseRailsFormFields } from '~/lib/utils/forms'; import { __ } from '~/locale'; import ExpiresAtField from './components/expires_at_field.vue'; -const getInputAttrs = (el) => { - const input = el.querySelector('input'); - - return { - id: input.id, - name: input.name, - value: input.value, - placeholder: input.placeholder, - }; -}; - export const initExpiresAtField = () => { const el = document.querySelector('.js-access-tokens-expires-at'); @@ -22,7 +12,7 @@ export const initExpiresAtField = () => { return null; } - const inputAttrs = getInputAttrs(el); + const { expiresAt: inputAttrs } = parseRailsFormFields(el); return new Vue({ el, @@ -43,7 +33,7 @@ export const initProjectsField = () => { return null; } - const inputAttrs = getInputAttrs(el); + const { projects: inputAttrs } = parseRailsFormFields(el); if (window.gon.features.personalAccessTokensScopedToProjects) { return new Promise((resolve) => { diff --git a/app/assets/javascripts/activities.js b/app/assets/javascripts/activities.js index 5064d9ee2d2..b671d038ce8 100644 --- a/app/assets/javascripts/activities.js +++ b/app/assets/javascripts/activities.js @@ -2,14 +2,20 @@ import $ from 'jquery'; import Cookies from 'js-cookie'; +import createFlash from '~/flash'; +import { s__ } from '~/locale'; import { localTimeAgo } from './lib/utils/datetime_utility'; import Pager from './pager'; export default class Activities { - constructor(container = '') { - this.container = container; + constructor(containerSelector = '') { + this.containerSelector = containerSelector; + this.containerEl = this.containerSelector + ? document.querySelector(this.containerSelector) + : undefined; + this.$contentList = $('.content_list'); - Pager.init(20, true, false, (data) => data, this.updateTooltips, this.container); + this.loadActivities(); $('.event-filter-link').on('click', (e) => { e.preventDefault(); @@ -18,13 +24,30 @@ export default class Activities { }); } + loadActivities() { + Pager.init({ + limit: 20, + preload: true, + prepareData: (data) => data, + successCallback: () => this.updateTooltips(), + errorCallback: () => + createFlash({ + message: s__( + 'Activity|An error occured while retrieving activity. Reload the page to try again.', + ), + parent: this.containerEl, + }), + container: this.containerSelector, + }); + } + updateTooltips() { localTimeAgo($('.js-timeago', '.content_list')); } reloadActivities() { - $('.content_list').html(''); - Pager.init(20, true, false, (data) => data, this.updateTooltips, this.container); + this.$contentList.html(''); + this.loadActivities(); } toggleFilter(sender) { diff --git a/app/assets/javascripts/admin/statistics_panel/constants.js b/app/assets/javascripts/admin/statistics_panel/constants.js index 2dce19a3894..de413b2e7f0 100644 --- a/app/assets/javascripts/admin/statistics_panel/constants.js +++ b/app/assets/javascripts/admin/statistics_panel/constants.js @@ -3,7 +3,7 @@ import { s__ } from '~/locale'; const statisticsLabels = { forks: s__('AdminStatistics|Forks'), issues: s__('AdminStatistics|Issues'), - mergeRequests: s__('AdminStatistics|Merge Requests'), + mergeRequests: s__('AdminStatistics|Merge requests'), notes: s__('AdminStatistics|Notes'), snippets: s__('AdminStatistics|Snippets'), sshKeys: s__('AdminStatistics|SSH Keys'), diff --git a/app/assets/javascripts/admin/users/components/user_date.vue b/app/assets/javascripts/admin/users/components/user_date.vue deleted file mode 100644 index 38dddbf72c2..00000000000 --- a/app/assets/javascripts/admin/users/components/user_date.vue +++ /dev/null @@ -1,29 +0,0 @@ - - diff --git a/app/assets/javascripts/admin/users/components/users_table.vue b/app/assets/javascripts/admin/users/components/users_table.vue index 8962068601c..8b41a063abc 100644 --- a/app/assets/javascripts/admin/users/components/users_table.vue +++ b/app/assets/javascripts/admin/users/components/users_table.vue @@ -1,9 +1,9 @@ diff --git a/app/assets/javascripts/alerts_settings/constants.js b/app/assets/javascripts/alerts_settings/constants.js index ce6cf61b5dd..4a180ed2bc0 100644 --- a/app/assets/javascripts/alerts_settings/constants.js +++ b/app/assets/javascripts/alerts_settings/constants.js @@ -10,96 +10,118 @@ export const i18n = { selectType: { label: s__('AlertSettings|Select integration type'), enterprise: s__( - 'AlertSettings|In free versions of GitLab, only one integration for each type can be added. %{linkStart}Upgrade your subscription%{linkEnd} to add additional integrations.', + 'AlertSettings|Free versions of GitLab are limited to one integration per type. To add more, %{linkStart}upgrade your subscription%{linkEnd}.', ), }, nameIntegration: { label: s__('AlertSettings|Name integration'), placeholder: s__('AlertSettings|Enter integration name'), activeToggle: __('Active'), + error: __("Name can't be blank"), + }, + enableIntegration: { + label: s__('AlertSettings|Enable integration'), + help: s__( + 'AlertSettings|A webhook URL and authorization key is generated for the integration. After you save the integration, both are visible under the “View credentials” tab.', + ), }, setupCredentials: { help: s__( - "AlertSettings|Utilize the URL and authorization key below to authorize an external service to send alerts to GitLab. Review your external service's documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint.", + 'AlertSettings|Use the URL and authorization key below to configure how an external service sends alerts to GitLab. %{linkStart}How do I configure the endpoint?%{linkEnd}', ), prometheusHelp: s__( - 'AlertSettings|Utilize the URL and authorization key below to authorize Prometheus to send alerts to GitLab. Review the Prometheus documentation to learn where to add these details, and the %{linkStart}GitLab documentation%{linkEnd} to learn more about configuring your endpoint.', + 'AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint.', ), webhookUrl: s__('AlertSettings|Webhook URL'), authorizationKey: s__('AlertSettings|Authorization key'), reset: s__('AlertSettings|Reset Key'), }, - setSamplePayload: { - label: s__('AlertSettings|Sample alert payload (optional)'), - testPayloadHelpHttp: s__( - 'AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This payload can be used to create a custom mapping (optional).', - ), - testPayloadHelp: s__( - 'AlertSettings|Provide an example payload from the monitoring tool you intend to integrate with. This will allow you to send an alert to an active GitLab alerting point.', + mapFields: { + label: s__('AlertSettings|Customize alert payload mapping (optional)'), + help: s__( + 'AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the "Parse payload fields" button to continue.', ), placeholder: s__('AlertSettings|{ "events": [{ "application": "Name of application" }] }'), - resetHeader: s__('AlertSettings|Reset the mapping'), - resetBody: s__( - "AlertSettings|If you edit the payload, the stored mapping will be reset, and you'll need to re-map the fields.", - ), - resetOk: s__('AlertSettings|Proceed with editing'), editPayload: s__('AlertSettings|Edit payload'), - parsePayload: s__('AlertSettings|Parse payload for custom mapping'), + parsePayload: s__('AlertSettings|Parse payload fields'), payloadParsedSucessMsg: s__( 'AlertSettings|Sample payload has been parsed. You can now map the fields.', ), + resetHeader: s__('AlertSettings|Reset the mapping'), + resetBody: s__('AlertSettings|If you edit the payload, you must re-map the fields again.'), + resetOk: s__('AlertSettings|Proceed with editing'), + mapIntro: s__( + 'AlertSettings|You can map default GitLab alert fields to your payload keys in the dropdowns below.', + ), }, - mapFields: { - label: s__('AlertSettings|Customize alert payload mapping (optional)'), - intro: s__( - 'AlertSettings|If you intend to create a custom mapping, provide an example payload from your monitoring tool and click "parse payload fields" button to continue. The sample payload is required for completing the custom mapping; if you want to skip the mapping step, progress straight to saving your integration.', + testPayload: { + help: s__( + 'AlertSettings|Enter an example payload from your selected monitoring tool. This supports sending alerts to a GitLab endpoint.', ), + placeholder: s__('AlertSettings|{ "events": [{ "application": "Name of application" }] }'), + modalTitle: s__('AlertSettings|The form has unsaved changes'), + modalBody: s__('AlertSettings|The form has unsaved changes. How would you like to proceed?'), + savedAndTest: s__('AlertSettings|Save integration & send'), + proceedWithoutSave: s__('AlertSettings|Send without saving'), + cancel: __('Cancel'), }, prometheusFormUrl: { label: s__('AlertSettings|Prometheus API base URL'), - help: s__('AlertSettings|URL cannot be blank and must start with http or https'), + help: s__('AlertSettings|URL cannot be blank and must start with http: or https:.'), + blankUrlError: __('URL cannot be blank'), + invalidUrlError: __('URL is invalid'), }, restKeyInfo: { label: s__( - 'AlertSettings|Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in.', + 'AlertSettings|If you reset the authorization key for this project, you must update the key in every enabled alert source.', ), }, }, saveIntegration: s__('AlertSettings|Save integration'), - changesSaved: s__('AlertSettings|Your integration was successfully updated.'), + saveAndTestIntegration: s__('AlertSettings|Save & create test alert'), cancelAndClose: __('Cancel and close'), - send: s__('AlertSettings|Send'), + send: __('Send'), copy: __('Copy'), + integrationCreated: { + title: s__('AlertSettings|Integration successfully saved'), + successMsg: s__( + 'AlertSettings|GitLab has created a URL and authorization key for your integration. You can use them to set up a webhook and authorize your endpoint to send alerts to GitLab.', + ), + btnCaption: s__('AlertSettings|View URL and authorization key'), + }, + changesSaved: s__('AlertsIntegrations|The integration is saved.'), + integrationRemoved: s__('AlertsIntegrations|The integration is deleted.'), + alertSent: s__('AlertsIntegrations|The test alert should now be visible in your alerts list.'), + addNewIntegration: s__('AlertSettings|Add new integration'), }; export const integrationSteps = { selectType: 'SELECT_TYPE', nameIntegration: 'NAME_INTEGRATION', - setPrometheusApiUrl: 'SET_PROMETHEUS_API_URL', - setSamplePayload: 'SET_SAMPLE_PAYLOAD', + enableHttpIntegration: 'ENABLE_HTTP_INTEGRATION', + enablePrometheusIntegration: 'ENABLE_PROMETHEUS_INTEGRATION', customizeMapping: 'CUSTOMIZE_MAPPING', }; export const createStepNumbers = { [integrationSteps.selectType]: 1, [integrationSteps.nameIntegration]: 2, - [integrationSteps.setPrometheusApiUrl]: 2, - [integrationSteps.setSamplePayload]: 3, + [integrationSteps.enableHttpIntegration]: 3, + [integrationSteps.enablePrometheusIntegration]: 2, [integrationSteps.customizeMapping]: 4, }; export const editStepNumbers = { - [integrationSteps.selectType]: 1, [integrationSteps.nameIntegration]: 1, - [integrationSteps.setPrometheusApiUrl]: null, - [integrationSteps.setSamplePayload]: 2, + [integrationSteps.enableHttpIntegration]: 2, + [integrationSteps.enablePrometheusIntegration]: null, [integrationSteps.customizeMapping]: 3, }; export const integrationTypes = { none: { value: '', text: s__('AlertSettings|Select integration type') }, http: { value: 'HTTP', text: s__('AlertSettings|HTTP Endpoint') }, - prometheus: { value: 'PROMETHEUS', text: s__('AlertSettings|External Prometheus') }, + prometheus: { value: 'PROMETHEUS', text: s__('AlertSettings|Prometheus') }, }; export const typeSet = { @@ -127,4 +149,10 @@ export const mappingFields = { fallback: 'fallback', }; -export const viewCredentialsTabIndex = 1; +export const tabIndices = { + configureDetails: 0, + viewCredentials: 1, + sendTestAlert: 2, +}; + +export const testAlertModalId = 'confirmSendTestAlert'; diff --git a/app/assets/javascripts/alerts_settings/index.js b/app/assets/javascripts/alerts_settings/index.js index 321af9fedb6..953a867b2b7 100644 --- a/app/assets/javascripts/alerts_settings/index.js +++ b/app/assets/javascripts/alerts_settings/index.js @@ -3,12 +3,15 @@ import Vue from 'vue'; import { parseBoolean } from '~/lib/utils/common_utils'; import AlertSettingsWrapper from './components/alerts_settings_wrapper.vue'; import apolloProvider from './graphql'; +import getCurrentIntegrationQuery from './graphql/queries/get_current_integration.query.graphql'; -apolloProvider.clients.defaultClient.cache.writeData({ +apolloProvider.clients.defaultClient.cache.writeQuery({ + query: getCurrentIntegrationQuery, data: { currentIntegration: null, }, }); + Vue.use(GlToast); export default (el) => { @@ -16,23 +19,7 @@ export default (el) => { return null; } - const { - prometheusActivated, - prometheusUrl, - prometheusAuthorizationKey, - prometheusFormPath, - prometheusResetKeyPath, - prometheusApiUrl, - activated: activatedStr, - alertsSetupUrl, - alertsUsageUrl, - formPath, - authorizationKey, - url, - projectPath, - multiIntegrations, - alertFields, - } = el.dataset; + const { alertsUsageUrl, projectPath, multiIntegrations, alertFields } = el.dataset; return new Vue({ el, @@ -40,22 +27,7 @@ export default (el) => { AlertSettingsWrapper, }, provide: { - prometheus: { - active: parseBoolean(prometheusActivated), - url: prometheusUrl, - token: prometheusAuthorizationKey, - prometheusFormPath, - prometheusResetKeyPath, - prometheusApiUrl, - }, - generic: { - alertsSetupUrl, - alertsUsageUrl, - active: parseBoolean(activatedStr), - formPath, - token: authorizationKey, - url, - }, + alertsUsageUrl, projectPath, multiIntegrations: parseBoolean(multiIntegrations), }, diff --git a/app/assets/javascripts/alerts_settings/utils/error_messages.js b/app/assets/javascripts/alerts_settings/utils/error_messages.js index e380257f983..9a0644b4e22 100644 --- a/app/assets/javascripts/alerts_settings/utils/error_messages.js +++ b/app/assets/javascripts/alerts_settings/utils/error_messages.js @@ -1,4 +1,4 @@ -import { s__ } from '~/locale'; +import { s__, __ } from '~/locale'; export const DELETE_INTEGRATION_ERROR = s__( 'AlertsIntegrations|The integration could not be deleted. Please try again.', @@ -19,3 +19,9 @@ export const RESET_INTEGRATION_TOKEN_ERROR = s__( export const INTEGRATION_PAYLOAD_TEST_ERROR = s__( 'AlertsIntegrations|Integration payload is invalid.', ); + +export const INTEGRATION_INACTIVE_PAYLOAD_TEST_ERROR = s__( + 'AlertsIntegrations|The integration is currently inactive. Enable the integration to send the test alert.', +); + +export const DEFAULT_ERROR = __('Something went wrong on our end.'); diff --git a/app/assets/javascripts/analytics/usage_trends/components/charts_config.js b/app/assets/javascripts/analytics/usage_trends/components/charts_config.js index 014f823cdc4..ea11ecb0c5b 100644 --- a/app/assets/javascripts/analytics/usage_trends/components/charts_config.js +++ b/app/assets/javascripts/analytics/usage_trends/components/charts_config.js @@ -83,7 +83,7 @@ export default [ 'UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again.', ), noDataMessage, - chartTitle: s__('UsageTrends|Issues & Merge Requests'), + chartTitle: s__('UsageTrends|Issues & merge requests'), yAxisTitle: s__('UsageTrends|Items'), xAxisTitle: s__('UsageTrends|Month'), queries: [ diff --git a/app/assets/javascripts/analytics/usage_trends/components/usage_counts.vue b/app/assets/javascripts/analytics/usage_trends/components/usage_counts.vue index 0630cca93ae..80ad36d0519 100644 --- a/app/assets/javascripts/analytics/usage_trends/components/usage_counts.vue +++ b/app/assets/javascripts/analytics/usage_trends/components/usage_counts.vue @@ -45,7 +45,7 @@ export default { projects: s__('UsageTrends|Projects'), groups: s__('UsageTrends|Groups'), issues: s__('UsageTrends|Issues'), - mergeRequests: s__('UsageTrends|Merge Requests'), + mergeRequests: s__('UsageTrends|Merge requests'), pipelines: s__('UsageTrends|Pipelines'), }, loadCountsError: s__('Could not load usage counts. Please refresh the page to try again.'), diff --git a/app/assets/javascripts/api.js b/app/assets/javascripts/api.js index 48005787d81..516235657cb 100644 --- a/app/assets/javascripts/api.js +++ b/app/assets/javascripts/api.js @@ -44,7 +44,7 @@ const Api = { projectMilestonesPath: '/api/:version/projects/:id/milestones', projectIssuePath: '/api/:version/projects/:id/issues/:issue_iid', mergeRequestsPath: '/api/:version/merge_requests', - groupLabelsPath: '/groups/:namespace_path/-/labels', + groupLabelsPath: '/api/:version/groups/:namespace_path/labels', issuableTemplatePath: '/:namespace_path/:project_path/templates/:type/:key', issuableTemplatesPath: '/:namespace_path/:project_path/templates/:type', projectTemplatePath: '/api/:version/projects/:id/templates/:type/:key', @@ -79,6 +79,7 @@ const Api = { issuePath: '/api/:version/projects/:id/issues/:issue_iid', tagsPath: '/api/:version/projects/:id/repository/tags', freezePeriodsPath: '/api/:version/projects/:id/freeze_periods', + freezePeriodPath: '/api/:version/projects/:id/freeze_periods/:freeze_period_id', usageDataIncrementCounterPath: '/api/:version/usage_data/increment_counter', usageDataIncrementUniqueUsersPath: '/api/:version/usage_data/increment_unique_users', featureFlagUserLists: '/api/:version/projects/:id/feature_flags_user_lists', @@ -282,7 +283,7 @@ const Api = { }, /** - * Get all Merge Requests for a project, eventually filtering based on + * Get all merge requests for a project, eventually filtering based on * supplied parameters * @param projectPath * @param params @@ -306,7 +307,7 @@ const Api = { return axios.post(url, options); }, - // Return Merge Request for project + // Return merge request for project projectMergeRequest(projectPath, mergeRequestId, params = {}) { const url = Api.buildUrl(Api.projectMergeRequestPath) .replace(':id', encodeURIComponent(projectPath)) @@ -401,18 +402,29 @@ const Api = { newLabel(namespacePath, projectPath, data, callback) { let url; + let payload; if (projectPath) { url = Api.buildUrl(Api.projectLabelsPath) .replace(':namespace_path', namespacePath) .replace(':project_path', projectPath); + payload = { + label: data, + }; } else { url = Api.buildUrl(Api.groupLabelsPath).replace(':namespace_path', namespacePath); + + // groupLabelsPath uses public API which accepts + // `name` and `color` props. + payload = { + name: data.title, + color: data.color, + }; } return axios .post(url, { - label: data, + ...payload, }) .then((res) => callback(res.data)) .catch((e) => callback(e.response.data)); @@ -784,7 +796,7 @@ const Api = { return axios.delete(url, { data }); }, - getRawFile(id, path, params = { ref: 'master' }) { + getRawFile(id, path, params = {}) { const url = Api.buildUrl(this.rawFilePath) .replace(':id', encodeURIComponent(id)) .replace(':path', encodeURIComponent(path)); @@ -832,6 +844,14 @@ const Api = { return axios.post(url, freezePeriod); }, + updateFreezePeriod(id, freezePeriod = {}) { + const url = Api.buildUrl(this.freezePeriodPath) + .replace(':id', encodeURIComponent(id)) + .replace(':freeze_period_id', encodeURIComponent(freezePeriod.id)); + + return axios.put(url, freezePeriod); + }, + trackRedisCounterEvent(event) { if (!gon.features?.usageDataApi) { return null; diff --git a/app/assets/javascripts/api/user_api.js b/app/assets/javascripts/api/user_api.js index 5efc7063efa..27901120c53 100644 --- a/app/assets/javascripts/api/user_api.js +++ b/app/assets/javascripts/api/user_api.js @@ -55,12 +55,13 @@ export function getUserProjects(userId, query, options, callback) { .catch(() => flash(__('Something went wrong while fetching projects'))); } -export function updateUserStatus({ emoji, message, availability }) { +export function updateUserStatus({ emoji, message, availability, clearStatusAfter }) { const url = buildApiUrl(USER_POST_STATUS_PATH); return axios.put(url, { emoji, message, availability, + clear_status_after: clearStatusAfter, }); } diff --git a/app/assets/javascripts/awards_handler.js b/app/assets/javascripts/awards_handler.js index dbdc7e43d2d..3a2f2078e44 100644 --- a/app/assets/javascripts/awards_handler.js +++ b/app/assets/javascripts/awards_handler.js @@ -446,7 +446,7 @@ export class AwardsHandler { createAwardButtonForVotesBlock(votesBlock, emojiName) { const buttonHtml = ` - diff --git a/app/assets/javascripts/badges/components/badge.vue b/app/assets/javascripts/badges/components/badge.vue index 9e5d70075f3..309af368df9 100644 --- a/app/assets/javascripts/badges/components/badge.vue +++ b/app/assets/javascripts/badges/components/badge.vue @@ -1,7 +1,11 @@ @@ -62,51 +88,64 @@ export default { class="board-inner gl-display-flex gl-flex-direction-column gl-relative gl-h-full gl-rounded-base gl-bg-white" >

{{ $options.i18n.newList }}

-
- -
-
+
+
+

+ {{ $options.i18n.scope }} +

+

{{ $options.i18n.scopeDescription }}

+
-

{{ formDescription }}

+ -
- - -
{{ $options.i18n.noneSelected }}
-
-
+ + + - - - + -
- - - - - -
+
+ + + + + +
- -

{{ $options.i18n.noResults }}

-
+ +

{{ $options.i18n.noResults }}

+
+
+
diff --git a/app/assets/javascripts/boards/components/board_blocked_icon.vue b/app/assets/javascripts/boards/components/board_blocked_icon.vue new file mode 100644 index 00000000000..0f92e714752 --- /dev/null +++ b/app/assets/javascripts/boards/components/board_blocked_icon.vue @@ -0,0 +1,192 @@ + + diff --git a/app/assets/javascripts/boards/components/board_card_inner.vue b/app/assets/javascripts/boards/components/board_card_inner.vue index d4d6b17a589..9ff2cdd76d0 100644 --- a/app/assets/javascripts/boards/components/board_card_inner.vue +++ b/app/assets/javascripts/boards/components/board_card_inner.vue @@ -10,6 +10,7 @@ import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate.vue'; import UserAvatarLink from '../../vue_shared/components/user_avatar/user_avatar_link.vue'; import { ListType } from '../constants'; import eventHub from '../eventhub'; +import BoardBlockedIcon from './board_blocked_icon.vue'; import IssueDueDate from './issue_due_date.vue'; import IssueTimeEstimate from './issue_time_estimate.vue'; @@ -22,6 +23,7 @@ export default { IssueDueDate, IssueTimeEstimate, IssueCardWeight: () => import('ee_component/boards/components/issue_card_weight.vue'), + BoardBlockedIcon, }, directives: { GlTooltip: GlTooltipDirective, @@ -52,7 +54,7 @@ export default { }; }, computed: { - ...mapState(['isShowingLabels']), + ...mapState(['isShowingLabels', 'issuableType']), ...mapGetters(['isEpicBoard']), cappedAssignees() { // e.g. maxRender is 4, @@ -114,7 +116,7 @@ export default { }, }, methods: { - ...mapActions(['performSearch']), + ...mapActions(['performSearch', 'setError']), isIndexLessThanlimit(index) { return index < this.limitBeforeCounter; }, @@ -164,14 +166,12 @@ export default {
diff --git a/app/assets/javascripts/boards/components/board_card_loading_skeleton.vue b/app/assets/javascripts/boards/components/board_card_loading_skeleton.vue new file mode 100644 index 00000000000..15bff1226a6 --- /dev/null +++ b/app/assets/javascripts/boards/components/board_card_loading_skeleton.vue @@ -0,0 +1,26 @@ + + + diff --git a/app/assets/javascripts/boards/components/board_content.vue b/app/assets/javascripts/boards/components/board_content.vue index e9c4237d759..a4b1e6adacf 100644 --- a/app/assets/javascripts/boards/components/board_content.vue +++ b/app/assets/javascripts/boards/components/board_content.vue @@ -17,21 +17,20 @@ export default { gon.features?.graphqlBoardLists || gon.features?.epicBoards ? BoardColumn : BoardColumnDeprecated, - BoardContentSidebar: () => import('ee_component/boards/components/board_content_sidebar.vue'), + BoardContentSidebar: () => import('~/boards/components/board_content_sidebar.vue'), + EpicBoardContentSidebar: () => + import('ee_component/boards/components/epic_board_content_sidebar.vue'), EpicsSwimlanes: () => import('ee_component/boards/components/epics_swimlanes.vue'), GlAlert, }, mixins: [glFeatureFlagMixin()], + inject: ['canAdminList'], props: { lists: { type: Array, required: false, default: () => [], }, - canAdminList: { - type: Boolean, - required: true, - }, disabled: { type: Boolean, required: true, @@ -69,7 +68,7 @@ export default { }, }, methods: { - ...mapActions(['moveList']), + ...mapActions(['moveList', 'unsetError']), afterFormEnters() { const el = this.canDragColumns ? this.$refs.list.$el : this.$refs.list; el.scrollTo({ left: el.scrollWidth, behavior: 'smooth' }); @@ -99,8 +98,8 @@ export default { diff --git a/app/assets/javascripts/boards/components/board_content_sidebar.vue b/app/assets/javascripts/boards/components/board_content_sidebar.vue new file mode 100644 index 00000000000..46359cc2bca --- /dev/null +++ b/app/assets/javascripts/boards/components/board_content_sidebar.vue @@ -0,0 +1,96 @@ + + + diff --git a/app/assets/javascripts/boards/components/board_extra_actions.vue b/app/assets/javascripts/boards/components/board_extra_actions.vue deleted file mode 100644 index b802ccc7882..00000000000 --- a/app/assets/javascripts/boards/components/board_extra_actions.vue +++ /dev/null @@ -1,57 +0,0 @@ - - - diff --git a/app/assets/javascripts/boards/components/board_form.vue b/app/assets/javascripts/boards/components/board_form.vue index d8504dcfb0f..78da4137d69 100644 --- a/app/assets/javascripts/boards/components/board_form.vue +++ b/app/assets/javascripts/boards/components/board_form.vue @@ -107,7 +107,7 @@ export default { }; }, computed: { - ...mapGetters(['isEpicBoard', 'isGroupBoard', 'isProjectBoard']), + ...mapGetters(['isIssueBoard', 'isGroupBoard', 'isProjectBoard']), isNewForm() { return this.currentPage === formType.new; }, @@ -127,7 +127,7 @@ export default { if (this.isDeleteForm) { return 'danger'; } - return 'info'; + return 'confirm'; }, title() { if (this.readonly) { @@ -163,6 +163,9 @@ export default { currentMutation() { return this.board.id ? updateBoardMutation : createBoardMutation; }, + deleteMutation() { + return destroyBoardMutation; + }, baseMutationVariables() { const { board } = this; const variables = { @@ -182,7 +185,7 @@ export default { groupPath: this.isGroupBoard ? this.fullPath : undefined, }; }, - boardScopeMutationVariables() { + issueBoardScopeMutationVariables() { /* eslint-disable @gitlab/require-i18n-strings */ return { weight: this.board.weight, @@ -193,13 +196,18 @@ export default { this.board.milestone?.id || this.board.milestone?.id === 0 ? convertToGraphQLId('Milestone', this.board.milestone.id) : null, - labelIds: this.board.labels.map(fullLabelId), iterationId: this.board.iteration_id ? convertToGraphQLId('Iteration', this.board.iteration_id) : null, }; /* eslint-enable @gitlab/require-i18n-strings */ }, + boardScopeMutationVariables() { + return { + labelIds: this.board.labels.map(fullLabelId), + ...(this.isIssueBoard && this.issueBoardScopeMutationVariables), + }; + }, mutationVariables() { return { ...this.baseMutationVariables, @@ -239,17 +247,20 @@ export default { return this.boardUpdateResponse(response.data); }, + async deleteBoard() { + await this.$apollo.mutate({ + mutation: this.deleteMutation, + variables: { + id: fullBoardId(this.board.id), + }, + }); + }, async submit() { if (this.board.name.length === 0) return; this.isLoading = true; if (this.isDeleteForm) { try { - await this.$apollo.mutate({ - mutation: destroyBoardMutation, - variables: { - id: fullBoardId(this.board.id), - }, - }); + await this.deleteBoard(); visitUrl(this.rootPath); } catch { Flash(this.$options.i18n.deleteErrorMessage); @@ -324,7 +335,7 @@ export default { /> {{ __('Submit issue') }}{{ __('Create issue') }} -import { mapActions } from 'vuex'; -import { historyPushState } from '~/lib/utils/common_utils'; -import { setUrlParams } from '~/lib/utils/url_utility'; -import { __ } from '~/locale'; -import FilteredSearch from '~/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue'; - -export default { - i18n: { - search: __('Search'), - }, - components: { FilteredSearch }, - props: { - search: { - type: String, - required: false, - default: '', - }, - }, - computed: { - initialSearch() { - return [{ type: 'filtered-search-term', value: { data: this.search } }]; - }, - }, - methods: { - ...mapActions(['performSearch']), - handleSearch(filters) { - let itemValue = ''; - const [item] = filters; - - if (filters.length === 0) { - itemValue = ''; - } else { - itemValue = item?.value?.data; - } - - historyPushState(setUrlParams({ search: itemValue }, window.location.href)); - - this.performSearch(); - }, - }, -}; - - - diff --git a/app/assets/javascripts/boards/components/modal/empty_state.vue b/app/assets/javascripts/boards/components/modal/empty_state.vue deleted file mode 100644 index 486b012e3d2..00000000000 --- a/app/assets/javascripts/boards/components/modal/empty_state.vue +++ /dev/null @@ -1,84 +0,0 @@ - - - diff --git a/app/assets/javascripts/boards/components/modal/filters.js b/app/assets/javascripts/boards/components/modal/filters.js deleted file mode 100644 index 2fb38a549f3..00000000000 --- a/app/assets/javascripts/boards/components/modal/filters.js +++ /dev/null @@ -1,27 +0,0 @@ -import FilteredSearchContainer from '../../../filtered_search/container'; -import FilteredSearchBoards from '../../filtered_search_boards'; - -export default { - name: 'modal-filters', - props: { - store: { - type: Object, - required: true, - }, - }, - mounted() { - FilteredSearchContainer.container = this.$el; - - this.filteredSearch = new FilteredSearchBoards(this.store); - this.filteredSearch.setup(); - this.filteredSearch.removeTokens(); - this.filteredSearch.handleInputPlaceholder(); - this.filteredSearch.toggleClearSearchButton(); - }, - destroyed() { - this.filteredSearch.cleanup(); - FilteredSearchContainer.container = document; - this.store.path = ''; - }, - template: '#js-board-modal-filter', -}; diff --git a/app/assets/javascripts/boards/components/modal/footer.vue b/app/assets/javascripts/boards/components/modal/footer.vue deleted file mode 100644 index 05e1219bc70..00000000000 --- a/app/assets/javascripts/boards/components/modal/footer.vue +++ /dev/null @@ -1,80 +0,0 @@ - - diff --git a/app/assets/javascripts/boards/components/modal/header.vue b/app/assets/javascripts/boards/components/modal/header.vue deleted file mode 100644 index c3a71e7177a..00000000000 --- a/app/assets/javascripts/boards/components/modal/header.vue +++ /dev/null @@ -1,80 +0,0 @@ - - diff --git a/app/assets/javascripts/boards/components/modal/index.vue b/app/assets/javascripts/boards/components/modal/index.vue deleted file mode 100644 index 5af90c1ee66..00000000000 --- a/app/assets/javascripts/boards/components/modal/index.vue +++ /dev/null @@ -1,151 +0,0 @@ - - diff --git a/app/assets/javascripts/boards/components/modal/list.vue b/app/assets/javascripts/boards/components/modal/list.vue deleted file mode 100644 index e66cae0ce18..00000000000 --- a/app/assets/javascripts/boards/components/modal/list.vue +++ /dev/null @@ -1,141 +0,0 @@ - - diff --git a/app/assets/javascripts/boards/components/modal/lists_dropdown.vue b/app/assets/javascripts/boards/components/modal/lists_dropdown.vue deleted file mode 100644 index 2065568d275..00000000000 --- a/app/assets/javascripts/boards/components/modal/lists_dropdown.vue +++ /dev/null @@ -1,49 +0,0 @@ - - diff --git a/app/assets/javascripts/boards/components/modal/tabs.vue b/app/assets/javascripts/boards/components/modal/tabs.vue deleted file mode 100644 index 0b717f516db..00000000000 --- a/app/assets/javascripts/boards/components/modal/tabs.vue +++ /dev/null @@ -1,42 +0,0 @@ - - diff --git a/app/assets/javascripts/boards/components/sidebar/board_editable_item.vue b/app/assets/javascripts/boards/components/sidebar/board_editable_item.vue index 61863bbe2a9..352a25ef6d9 100644 --- a/app/assets/javascripts/boards/components/sidebar/board_editable_item.vue +++ b/app/assets/javascripts/boards/components/sidebar/board_editable_item.vue @@ -98,14 +98,14 @@ export default { {{ __('Edit') }} -
+
{{ __('None') }}
diff --git a/app/assets/javascripts/boards/components/sidebar/board_sidebar_due_date.vue b/app/assets/javascripts/boards/components/sidebar/board_sidebar_due_date.vue index 6d928337396..13e1e232676 100644 --- a/app/assets/javascripts/boards/components/sidebar/board_sidebar_due_date.vue +++ b/app/assets/javascripts/boards/components/sidebar/board_sidebar_due_date.vue @@ -18,16 +18,16 @@ export default { }; }, computed: { - ...mapGetters(['activeIssue', 'projectPathForActiveIssue']), + ...mapGetters(['activeBoardItem', 'projectPathForActiveIssue']), hasDueDate() { - return this.activeIssue.dueDate != null; + return this.activeBoardItem.dueDate != null; }, parsedDueDate() { if (!this.hasDueDate) { return null; } - return parsePikadayDate(this.activeIssue.dueDate); + return parsePikadayDate(this.activeBoardItem.dueDate); }, formattedDueDate() { if (!this.hasDueDate) { @@ -69,6 +69,7 @@ export default { -import { GlAlert, GlButton, GlForm, GlFormGroup, GlFormInput } from '@gitlab/ui'; -import { mapGetters, mapActions } from 'vuex'; -import BoardEditableItem from '~/boards/components/sidebar/board_editable_item.vue'; -import createFlash from '~/flash'; -import { joinPaths } from '~/lib/utils/url_utility'; -import { __ } from '~/locale'; -import autofocusonshow from '~/vue_shared/directives/autofocusonshow'; - -export default { - components: { - GlForm, - GlAlert, - GlButton, - GlFormGroup, - GlFormInput, - BoardEditableItem, - }, - directives: { - autofocusonshow, - }, - data() { - return { - title: '', - loading: false, - showChangesAlert: false, - }; - }, - computed: { - ...mapGetters({ issue: 'activeIssue' }), - pendingChangesStorageKey() { - return this.getPendingChangesKey(this.issue); - }, - projectPath() { - const referencePath = this.issue.referencePath || ''; - return referencePath.slice(0, referencePath.indexOf('#')); - }, - validationState() { - return Boolean(this.title); - }, - }, - watch: { - issue: { - handler(updatedIssue, formerIssue) { - if (formerIssue?.title !== this.title) { - localStorage.setItem(this.getPendingChangesKey(formerIssue), this.title); - } - - this.title = updatedIssue.title; - this.setPendingState(); - }, - immediate: true, - }, - }, - methods: { - ...mapActions(['setActiveIssueTitle']), - getPendingChangesKey(issue) { - if (!issue) { - return ''; - } - - return joinPaths( - window.location.pathname.slice(1), - String(issue.id), - 'issue-title-pending-changes', - ); - }, - async setPendingState() { - const pendingChanges = localStorage.getItem(this.pendingChangesStorageKey); - - if (pendingChanges) { - this.title = pendingChanges; - this.showChangesAlert = true; - await this.$nextTick(); - this.$refs.sidebarItem.expand(); - } else { - this.showChangesAlert = false; - } - }, - cancel() { - this.title = this.issue.title; - this.$refs.sidebarItem.collapse(); - this.showChangesAlert = false; - localStorage.removeItem(this.pendingChangesStorageKey); - }, - async setTitle() { - this.$refs.sidebarItem.collapse(); - - if (!this.title || this.title === this.issue.title) { - return; - } - - try { - this.loading = true; - await this.setActiveIssueTitle({ title: this.title, projectPath: this.projectPath }); - localStorage.removeItem(this.pendingChangesStorageKey); - this.showChangesAlert = false; - } catch (e) { - this.title = this.issue.title; - createFlash({ message: this.$options.i18n.updateTitleError }); - } finally { - this.loading = false; - } - }, - handleOffClick() { - if (this.title !== this.issue.title) { - this.showChangesAlert = true; - localStorage.setItem(this.pendingChangesStorageKey, this.title); - } else { - this.$refs.sidebarItem.collapse(); - } - }, - }, - i18n: { - issueTitlePlaceholder: __('Issue title'), - submitButton: __('Save changes'), - cancelButton: __('Cancel'), - updateTitleError: __('An error occurred when updating the issue title'), - invalidFeedback: __('An issue title is required'), - reviewYourChanges: __('Changes to the title have not been saved'), - }, -}; - - - diff --git a/app/assets/javascripts/boards/components/sidebar/board_sidebar_labels_select.vue b/app/assets/javascripts/boards/components/sidebar/board_sidebar_labels_select.vue index 55b1596ee18..f78be83cd82 100644 --- a/app/assets/javascripts/boards/components/sidebar/board_sidebar_labels_select.vue +++ b/app/assets/javascripts/boards/components/sidebar/board_sidebar_labels_select.vue @@ -21,9 +21,9 @@ export default { }; }, computed: { - ...mapGetters(['activeIssue', 'projectPathForActiveIssue']), + ...mapGetters(['activeBoardItem', 'projectPathForActiveIssue']), selectedLabels() { - const { labels = [] } = this.activeIssue; + const { labels = [] } = this.activeBoardItem; return labels.map((label) => ({ ...label, @@ -31,7 +31,7 @@ export default { })); }, issueLabels() { - const { labels = [] } = this.activeIssue; + const { labels = [] } = this.activeBoardItem; return labels.map((label) => ({ ...label, @@ -40,7 +40,7 @@ export default { }, }, methods: { - ...mapActions(['setActiveIssueLabels']), + ...mapActions(['setActiveBoardItemLabels']), async setLabels(payload) { this.loading = true; this.$refs.sidebarItem.collapse(); @@ -52,7 +52,7 @@ export default { .map((label) => label.id); const input = { addLabelIds, removeLabelIds, projectPath: this.projectPathForActiveIssue }; - await this.setActiveIssueLabels(input); + await this.setActiveBoardItemLabels(input); } catch (e) { createFlash({ message: __('An error occurred while updating labels.') }); } finally { @@ -65,7 +65,7 @@ export default { try { const removeLabelIds = [getIdFromGraphQLId(id)]; const input = { removeLabelIds, projectPath: this.projectPathForActiveIssue }; - await this.setActiveIssueLabels(input); + await this.setActiveBoardItemLabels(input); } catch (e) { createFlash({ message: __('An error occurred when removing the label.') }); } finally { diff --git a/app/assets/javascripts/boards/components/sidebar/board_sidebar_milestone_select.vue b/app/assets/javascripts/boards/components/sidebar/board_sidebar_milestone_select.vue index 829f1c72806..ad225c7bf5c 100644 --- a/app/assets/javascripts/boards/components/sidebar/board_sidebar_milestone_select.vue +++ b/app/assets/javascripts/boards/components/sidebar/board_sidebar_milestone_select.vue @@ -56,20 +56,20 @@ export default { }, }, computed: { - ...mapGetters(['activeIssue']), + ...mapGetters(['activeBoardItem']), hasMilestone() { - return this.activeIssue.milestone !== null; + return this.activeBoardItem.milestone !== null; }, groupFullPath() { - const { referencePath = '' } = this.activeIssue; + const { referencePath = '' } = this.activeBoardItem; return referencePath.slice(0, referencePath.indexOf('/')); }, projectPath() { - const { referencePath = '' } = this.activeIssue; + const { referencePath = '' } = this.activeBoardItem; return referencePath.slice(0, referencePath.indexOf('#')); }, dropdownText() { - return this.activeIssue.milestone?.title ?? this.$options.i18n.noMilestone; + return this.activeBoardItem.milestone?.title ?? this.$options.i18n.noMilestone; }, }, methods: { @@ -113,11 +113,12 @@ export default { ref="sidebarItem" :title="$options.i18n.milestone" :loading="loading" - @open="handleOpen()" + data-testid="sidebar-milestones" + @open="handleOpen" @close="handleClose" > {{ $options.i18n.noMilestone }} @@ -142,7 +143,7 @@ export default { v-for="milestone in milestones" :key="milestone.id" :is-check-item="true" - :is-checked="activeIssue.milestone && milestone.id === activeIssue.milestone.id" + :is-checked="activeBoardItem.milestone && milestone.id === activeBoardItem.milestone.id" data-testid="milestone-item" @click="setMilestone(milestone.id)" > diff --git a/app/assets/javascripts/boards/components/sidebar/board_sidebar_subscription.vue b/app/assets/javascripts/boards/components/sidebar/board_sidebar_subscription.vue index f01c8e8fa20..376985f7cb6 100644 --- a/app/assets/javascripts/boards/components/sidebar/board_sidebar_subscription.vue +++ b/app/assets/javascripts/boards/components/sidebar/board_sidebar_subscription.vue @@ -21,27 +21,31 @@ export default { components: { GlToggle, }, + inject: ['emailsDisabled'], data() { return { loading: false, }; }, computed: { - ...mapGetters(['activeIssue', 'projectPathForActiveIssue']), + ...mapGetters(['activeBoardItem', 'projectPathForActiveIssue', 'isEpicBoard']), + isEmailsDisabled() { + return this.isEpicBoard ? this.emailsDisabled : this.activeBoardItem.emailsDisabled; + }, notificationText() { - return this.activeIssue.emailsDisabled + return this.isEmailsDisabled ? this.$options.i18n.header.subscribeDisabledDescription : this.$options.i18n.header.title; }, }, methods: { - ...mapActions(['setActiveIssueSubscribed']), + ...mapActions(['setActiveItemSubscribed']), async handleToggleSubscription() { this.loading = true; try { - await this.setActiveIssueSubscribed({ - subscribed: !this.activeIssue.subscribed, + await this.setActiveItemSubscribed({ + subscribed: !this.activeBoardItem.subscribed, projectPath: this.projectPathForActiveIssue, }); } catch (error) { @@ -61,8 +65,8 @@ export default { > {{ notificationText }} +import { mapGetters } from 'vuex'; +import IssuableTimeTracker from '~/sidebar/components/time_tracking/time_tracker.vue'; + +export default { + components: { + IssuableTimeTracker, + }, + inject: ['timeTrackingLimitToHours'], + computed: { + ...mapGetters(['activeBoardItem']), + }, +}; + + + diff --git a/app/assets/javascripts/boards/components/sidebar/board_sidebar_title.vue b/app/assets/javascripts/boards/components/sidebar/board_sidebar_title.vue new file mode 100644 index 00000000000..b8d3107c377 --- /dev/null +++ b/app/assets/javascripts/boards/components/sidebar/board_sidebar_title.vue @@ -0,0 +1,169 @@ + + + diff --git a/app/assets/javascripts/boards/components/toggle_focus.vue b/app/assets/javascripts/boards/components/toggle_focus.vue index 74805f8a681..49f5e7d20a9 100644 --- a/app/assets/javascripts/boards/components/toggle_focus.vue +++ b/app/assets/javascripts/boards/components/toggle_focus.vue @@ -38,14 +38,16 @@ export default {