From f021ff84ee74ea1b575ca48417e08c6f0a80e16c Mon Sep 17 00:00:00 2001 From: Long Nguyen Date: Fri, 1 Aug 2025 02:56:57 +0700 Subject: [PATCH] Add export CSV to work items UI Add export CSV to work items UI Changelog: added --- .../components/work_item_list_actions.vue | 95 +++++++- .../work_item_metadata_provider.vue | 1 + .../work_items_csv_export_modal.vue | 146 ++++++++++++ .../graphql/work_item_metadata.query.graphql | 1 + .../work_items_csv_export.mutation.graphql | 6 + .../work_items/pages/work_items_list_app.vue | 43 +++- .../graphql/work_item_metadata.query.graphql | 1 + locale/gitlab.pot | 26 ++ .../components/work_item_list_actions_spec.js | 69 +++++- .../work_items_csv_export_modal_spec.js | 222 ++++++++++++++++++ .../components/work_items_list_app_spec.js | 3 + spec/frontend/work_items/mock_data.js | 21 ++ 12 files changed, 611 insertions(+), 23 deletions(-) create mode 100644 app/assets/javascripts/work_items/components/work_items_csv_export_modal.vue create mode 100644 app/assets/javascripts/work_items/graphql/work_items_csv_export.mutation.graphql create mode 100644 spec/frontend/work_items/components/work_items_csv_export_modal_spec.js diff --git a/app/assets/javascripts/work_items/components/work_item_list_actions.vue b/app/assets/javascripts/work_items/components/work_item_list_actions.vue index a810c246e3bc18..8ae810a0ee1ba8 100644 --- a/app/assets/javascripts/work_items/components/work_item_list_actions.vue +++ b/app/assets/javascripts/work_items/components/work_item_list_actions.vue @@ -3,20 +3,32 @@ import { GlDisclosureDropdown, GlDisclosureDropdownGroup, GlDisclosureDropdownItem, + GlModalDirective, GlTooltipDirective, } from '@gitlab/ui'; -import { __ } from '~/locale'; +import { s__, __ } from '~/locale'; +import WorkItemCsvExportModal from './work_items_csv_export_modal.vue'; export default { + exportModalId: 'work-item-export-modal', components: { GlDisclosureDropdownItem, GlDisclosureDropdown, GlDisclosureDropdownGroup, + WorkItemCsvExportModal, + }, + i18n: { + exportAsCSV: s__('WorkItem|Export as CSV'), + importFromJira: s__('WorkItem|Import from Jira'), }, directives: { + GlModal: GlModalDirective, GlTooltip: GlTooltipDirective, }, inject: { + showExportButton: { + default: false, + }, projectImportJiraPath: { default: null, }, @@ -27,13 +39,43 @@ export default { default: null, }, }, + props: { + workItemCount: { + type: Number, + required: false, + default: undefined, + }, + queryVariables: { + type: Object, + required: false, + default: () => ({}), + }, + showImportExportButtons: { + type: Boolean, + required: false, + default: false, + }, + }, + data() { + return { + showTooltip: false, + }; + }, computed: { importFromJira() { return { - text: __('Import from Jira'), + text: this.$options.i18n.importFromJira, href: this.projectImportJiraPath, }; }, + exportAsCSV() { + return { + text: this.$options.i18n.exportAsCSV, + }; + }, + dropdownTooltip() { + return !this.showTooltip ? __('Actions') : ''; + }, subscribeDropdownOptions() { return { items: [ @@ -53,8 +95,19 @@ export default { hasSubscriptionOptions() { return this.rssPath || this.calendarPath; }, + hasImportExportOptions() { + return this.showImportExportButtons && (this.projectImportJiraPath || this.showExportButton); + }, shouldShowDropdown() { - return this.projectImportJiraPath || this.hasSubscriptionOptions; + return this.hasImportExportOptions || this.hasSubscriptionOptions; + }, + }, + methods: { + showDropdown() { + this.showTooltip = true; + }, + hideDropdown() { + this.showTooltip = false; }, }, }; @@ -63,23 +116,43 @@ export default {