From 0ad8135c1feeefa23ec883e409fb65b8b52882a1 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Fri, 17 Mar 2023 21:08:46 +0000 Subject: Add latest changes from gitlab-org/gitlab@master --- .../artifacts/components/artifact_row.vue | 24 ++- .../artifacts/components/artifacts_bulk_delete.vue | 182 +++++++++++++++++++++ .../components/artifacts_table_row_details.vue | 9 + .../artifacts/components/job_artifacts_table.vue | 73 ++++++++- .../artifacts/components/job_checkbox.vue | 52 ++++++ app/assets/javascripts/artifacts/constants.js | 39 +++++ .../bulk_destroy_job_artifacts.mutation.graphql | 7 + app/assets/javascripts/artifacts/index.js | 10 +- .../components/editor/text_editor.vue | 11 ++ .../accordion_items/image_item.vue | 39 +++++ .../components/job_assistant_drawer/constants.js | 7 +- .../job_assistant_drawer/job_assistant_drawer.vue | 3 + .../content_editor/components/content_editor.vue | 37 ++++- .../components/toolbar_more_dropdown.vue | 14 +- .../content_editor/services/content_editor.js | 4 +- .../services/create_content_editor.js | 6 +- .../services/gl_api_markdown_deserializer.js | 5 +- .../javascripts/header_search/components/app.vue | 60 ++++--- .../header_search_autocomplete_items.vue | 14 +- .../components/header_search_default_items.vue | 6 +- .../components/header_search_scoped_items.vue | 6 +- app/assets/javascripts/header_search/constants.js | 44 ----- .../javascripts/header_search/store/getters.js | 10 +- .../javascripts/notes/components/comment_form.vue | 118 ++++++------- .../components/list_page/image_list_row.vue | 8 +- .../super_sidebar/components/context_switcher.vue | 13 +- .../components/frequent_groups_list.vue | 69 -------- .../components/frequent_items_list.vue | 63 ++----- .../components/frequent_projects_list.vue | 69 -------- .../super_sidebar/components/groups_list.vue | 78 +++++++++ .../super_sidebar/components/items_list.vue | 40 +++++ .../super_sidebar/components/projects_list.vue | 79 +++++++++ .../super_sidebar/components/search_results.vue | 49 ++++++ .../super_sidebar/components/user_menu.vue | 2 +- .../components/markdown/markdown_editor.vue | 26 ++- .../vue_shared/global_search/constants.js | 73 +++++++++ app/controllers/projects/artifacts_controller.rb | 4 + .../projects/merge_requests_controller.rb | 1 + app/helpers/artifacts_helper.rb | 1 + .../development/show_tags_on_commits_view.yml | 2 +- .../img/view_branch_protections_v15_10.png | Bin 0 -> 5103 bytes doc/user/project/repository/branches/index.md | 140 ++++++++++------ locale/gitlab.pot | 50 +++++- .../features/issues/user_comments_on_issue_spec.rb | 2 + spec/features/issues/user_edits_issue_spec.rb | 22 ++- .../user_comments_on_merge_request_spec.rb | 2 + .../user_views_open_merge_request_spec.rb | 12 ++ spec/features/projects/pipeline_schedules_spec.rb | 2 +- .../create_mock_source_editor_extension.js | 12 ++ .../artifacts/components/artifact_row_spec.js | 35 +++- .../components/artifacts_bulk_delete_spec.js | 96 +++++++++++ .../components/artifacts_table_row_details_spec.js | 22 ++- .../components/job_artifacts_table_spec.js | 126 ++++++++++++-- .../artifacts/components/job_checkbox_spec.js | 71 ++++++++ .../components/editor/text_editor_spec.js | 74 +++++---- .../accordion_items/image_item_spec.js | 39 +++++ .../job_assistant_drawer_spec.js | 36 +++- .../components/content_editor_spec.js | 27 ++- .../components/toolbar_more_dropdown_spec.js | 15 +- .../services/create_content_editor_spec.js | 2 +- .../services/gl_api_markdown_deserializer_spec.js | 22 ++- spec/frontend/header_search/components/app_spec.js | 10 +- .../header_search_autocomplete_items_spec.js | 7 +- .../components/header_search_scoped_items_spec.js | 3 +- spec/frontend/header_search/mock_data.js | 10 +- .../frontend/notes/components/comment_form_spec.js | 106 ++++++------ .../components/list_page/image_list_row_spec.js | 13 +- .../components/context_switcher_spec.js | 36 ++-- .../components/frequent_groups_list_spec.js | 51 ------ .../components/frequent_items_list_spec.js | 55 +------ .../components/frequent_projects_list_spec.js | 51 ------ .../super_sidebar/components/groups_list_spec.js | 87 ++++++++++ .../super_sidebar/components/items_list_spec.js | 63 +++++++ .../super_sidebar/components/projects_list_spec.js | 82 ++++++++++ .../components/search_results_spec.js | 57 +++++++ .../components/markdown/markdown_editor_spec.js | 81 +++++++-- spec/helpers/artifacts_helper_spec.rb | 1 + spec/support/helpers/content_editor_helpers.rb | 58 +++++++ .../features/content_editor_shared_examples.rb | 115 ++++--------- .../wiki/user_updates_wiki_page_shared_examples.rb | 1 + 80 files changed, 2167 insertions(+), 884 deletions(-) create mode 100644 app/assets/javascripts/artifacts/components/artifacts_bulk_delete.vue create mode 100644 app/assets/javascripts/artifacts/components/job_checkbox.vue create mode 100644 app/assets/javascripts/artifacts/graphql/mutations/bulk_destroy_job_artifacts.mutation.graphql create mode 100644 app/assets/javascripts/ci/pipeline_editor/components/job_assistant_drawer/accordion_items/image_item.vue delete mode 100644 app/assets/javascripts/super_sidebar/components/frequent_groups_list.vue delete mode 100644 app/assets/javascripts/super_sidebar/components/frequent_projects_list.vue create mode 100644 app/assets/javascripts/super_sidebar/components/groups_list.vue create mode 100644 app/assets/javascripts/super_sidebar/components/items_list.vue create mode 100644 app/assets/javascripts/super_sidebar/components/projects_list.vue create mode 100644 app/assets/javascripts/super_sidebar/components/search_results.vue create mode 100644 app/assets/javascripts/vue_shared/global_search/constants.js create mode 100644 doc/user/project/repository/branches/img/view_branch_protections_v15_10.png create mode 100644 spec/frontend/__helpers__/create_mock_source_editor_extension.js create mode 100644 spec/frontend/artifacts/components/artifacts_bulk_delete_spec.js create mode 100644 spec/frontend/artifacts/components/job_checkbox_spec.js create mode 100644 spec/frontend/ci/pipeline_editor/components/job_assistant_drawer/accordion_items/image_item_spec.js delete mode 100644 spec/frontend/super_sidebar/components/frequent_groups_list_spec.js delete mode 100644 spec/frontend/super_sidebar/components/frequent_projects_list_spec.js create mode 100644 spec/frontend/super_sidebar/components/groups_list_spec.js create mode 100644 spec/frontend/super_sidebar/components/items_list_spec.js create mode 100644 spec/frontend/super_sidebar/components/projects_list_spec.js create mode 100644 spec/frontend/super_sidebar/components/search_results_spec.js create mode 100644 spec/support/helpers/content_editor_helpers.rb diff --git a/app/assets/javascripts/artifacts/components/artifact_row.vue b/app/assets/javascripts/artifacts/components/artifact_row.vue index fffdfce60a7..f37c4c6f107 100644 --- a/app/assets/javascripts/artifacts/components/artifact_row.vue +++ b/app/assets/javascripts/artifacts/components/artifact_row.vue @@ -1,7 +1,8 @@ + diff --git a/app/assets/javascripts/artifacts/components/artifacts_table_row_details.vue b/app/assets/javascripts/artifacts/components/artifacts_table_row_details.vue index b9aae4bf4e5..7d675251ffd 100644 --- a/app/assets/javascripts/artifacts/components/artifacts_table_row_details.vue +++ b/app/assets/javascripts/artifacts/components/artifacts_table_row_details.vue @@ -25,6 +25,10 @@ export default { type: Object, required: true, }, + selectedArtifacts: { + type: Array, + required: true, + }, queryVariables: { type: Object, required: true, @@ -52,6 +56,9 @@ export default { isLastRow(index) { return index === this.artifacts.nodes.length - 1; }, + isSelected(item) { + return this.selectedArtifacts.includes(item.id); + }, showModal(item) { this.deletingArtifactId = item.id; this.deletingArtifactName = item.name; @@ -98,7 +105,9 @@ export default { diff --git a/app/assets/javascripts/artifacts/components/job_artifacts_table.vue b/app/assets/javascripts/artifacts/components/job_artifacts_table.vue index 1b7782c6860..ba4026190a2 100644 --- a/app/assets/javascripts/artifacts/components/job_artifacts_table.vue +++ b/app/assets/javascripts/artifacts/components/job_artifacts_table.vue @@ -8,11 +8,13 @@ import { GlBadge, GlIcon, GlPagination, + GlFormCheckbox, } from '@gitlab/ui'; import { createAlert } from '~/alert'; import { getIdFromGraphQLId } from '~/graphql_shared/utils'; import TimeAgo from '~/vue_shared/components/time_ago_tooltip.vue'; import CiIcon from '~/vue_shared/components/ci_icon.vue'; +import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin'; import getJobArtifactsQuery from '../graphql/queries/get_job_artifacts.query.graphql'; import { totalArtifactsSizeForJob, mapArchivesToJobNodes, mapBooleansToJobNodes } from '../utils'; import { @@ -33,7 +35,11 @@ import { INITIAL_NEXT_PAGE_CURSOR, JOBS_PER_PAGE, INITIAL_LAST_PAGE_SIZE, + BULK_DELETE_FEATURE_FLAG, + I18N_BULK_DELETE_CONFIRMATION_TOAST, } from '../constants'; +import JobCheckbox from './job_checkbox.vue'; +import ArtifactsBulkDelete from './artifacts_bulk_delete.vue'; import ArtifactsTableRowDetails from './artifacts_table_row_details.vue'; import FeedbackBanner from './feedback_banner.vue'; @@ -56,11 +62,15 @@ export default { GlBadge, GlIcon, GlPagination, + GlFormCheckbox, CiIcon, TimeAgo, + JobCheckbox, + ArtifactsBulkDelete, ArtifactsTableRowDetails, FeedbackBanner, }, + mixins: [glFeatureFlagsMixin()], inject: ['projectPath', 'canDestroyArtifacts'], apollo: { jobArtifacts: { @@ -94,6 +104,7 @@ export default { jobArtifacts: [], pageInfo: {}, expandedJobs: [], + selectedArtifacts: [], pagination: INITIAL_PAGINATION_STATE, }; }, @@ -118,6 +129,21 @@ export default { nextPage() { return Number(this.pageInfo.hasNextPage); }, + fields() { + return [ + this.canBulkDestroyArtifacts && { + key: 'checkbox', + label: '', + }, + ...this.$options.fields, + ]; + }, + anyArtifactsSelected() { + return Boolean(this.selectedArtifacts.length); + }, + canBulkDestroyArtifacts() { + return this.glFeatures[BULK_DELETE_FEATURE_FLAG] && this.canDestroyArtifacts; + }, }, methods: { refetchArtifacts() { @@ -158,6 +184,19 @@ export default { this.expandedJobs.splice(this.expandedJobs.indexOf(id), 1); } }, + selectArtifact(artifactNode, checked) { + if (checked) { + this.selectedArtifacts.push(artifactNode.id); + } else { + this.selectedArtifacts.splice(this.selectedArtifacts.indexOf(artifactNode.id), 1); + } + }, + clearSelectedArtifacts() { + this.selectedArtifacts = []; + }, + showDeletedToast(deletedCount) { + this.$toast.show(I18N_BULK_DELETE_CONFIRMATION_TOAST(deletedCount)); + }, downloadPath(job) { return job.archive?.downloadPath; }, @@ -217,9 +256,16 @@ export default { + +