From 98d29218ab3bec8b9349c23687cd6be386429206 Mon Sep 17 00:00:00 2001 From: Coung Ngo Date: Fri, 26 Mar 2021 00:52:53 +0000 Subject: [PATCH 1/5] Add tabs and header action buttons to issues list page refactor Add Open/Closed/All tabs and header action buttons (RSS, calendar, import/export CSV, bulk edit issues, and new issue buttons) to issues list page refactor, behind `vue_issues_list` feature flag defaulted to off. https://gitlab.com/gitlab-org/gitlab/-/issues/322755 --- .../issuable/components/csv_export_modal.vue | 14 +- .../components/csv_import_export_buttons.vue | 19 ++- .../init_csv_import_export_buttons.js | 9 +- .../issuable_bulk_update_sidebar.js | 15 +-- .../components/issuable_tabs.vue | 13 +- .../components/issues_list_app.vue | 105 +++++++++++++-- app/assets/javascripts/issues_list/index.js | 24 ++++ app/views/projects/issues/index.html.haml | 52 +++++--- .../components/csv_export_modal_spec.js | 6 +- .../csv_import_export_buttons_spec.js | 9 +- .../components/issuable_tabs_spec.js | 8 +- spec/frontend/issuable_list/mock_data.js | 2 +- .../components/issues_list_app_spec.js | 126 +++++++++++++++++- 13 files changed, 341 insertions(+), 61 deletions(-) diff --git a/app/assets/javascripts/issuable/components/csv_export_modal.vue b/app/assets/javascripts/issuable/components/csv_export_modal.vue index 78987a5c62923b..9ca8db0350bbee 100644 --- a/app/assets/javascripts/issuable/components/csv_export_modal.vue +++ b/app/assets/javascripts/issuable/components/csv_export_modal.vue @@ -14,17 +14,21 @@ export default { issuableType: { default: '', }, - issuableCount: { - default: 0, - }, email: { default: '', }, + }, + props: { exportCsvPath: { + type: String, + required: false, default: '', }, - }, - props: { + issuableCount: { + type: Number, + required: false, + default: 0, + }, modalId: { type: String, required: true, diff --git a/app/assets/javascripts/issuable/components/csv_import_export_buttons.vue b/app/assets/javascripts/issuable/components/csv_import_export_buttons.vue index 14474d44e105cd..a903b96fc617fd 100644 --- a/app/assets/javascripts/issuable/components/csv_import_export_buttons.vue +++ b/app/assets/javascripts/issuable/components/csv_import_export_buttons.vue @@ -53,6 +53,18 @@ export default { default: false, }, }, + props: { + exportCsvPath: { + type: String, + required: false, + default: '', + }, + issuableCount: { + type: Number, + required: false, + default: 0, + }, + }, computed: { exportModalId() { return `${this.issuableType}-export-modal`; @@ -105,7 +117,12 @@ export default { > - + diff --git a/app/assets/javascripts/issuable/init_csv_import_export_buttons.js b/app/assets/javascripts/issuable/init_csv_import_export_buttons.js index 5a720b89d338ea..f8649fc13b76c7 100644 --- a/app/assets/javascripts/issuable/init_csv_import_export_buttons.js +++ b/app/assets/javascripts/issuable/init_csv_import_export_buttons.js @@ -28,9 +28,7 @@ export default () => { showExportButton: parseBoolean(showExportButton), showImportButton: parseBoolean(showImportButton), issuableType, - issuableCount, email, - exportCsvPath, importCsvIssuesPath, containerClass, canEdit: parseBoolean(canEdit), @@ -39,7 +37,12 @@ export default () => { showLabel, }, render(h) { - return h(ImportExportButtons); + return h(ImportExportButtons, { + props: { + exportCsvPath, + issuableCount, + }, + }); }, }); }; diff --git a/app/assets/javascripts/issuable_bulk_update_sidebar.js b/app/assets/javascripts/issuable_bulk_update_sidebar.js index 1f707bc955f1de..97d50dde9f746c 100644 --- a/app/assets/javascripts/issuable_bulk_update_sidebar.js +++ b/app/assets/javascripts/issuable_bulk_update_sidebar.js @@ -46,14 +46,11 @@ export default class IssuableBulkUpdateSidebar { this.$bulkEditSubmitBtn.on('click', () => this.prepForSubmit()); this.$checkAllContainer.on('click', () => this.updateFormState()); - issueableEventHub.$on('issuables:updateBulkEdit', () => { - // Danger! Strong coupling ahead! - // The bulk update sidebar and its dropdowns look for checkboxes, and get data on which issue - // is selected by inspecting the DOM. Ideally, we would pass the selected issuable IDs and their properties - // explicitly, but this component is used in too many places right now to refactor straight away. - - this.updateFormState(); - }); + // The event hub connects this bulk update logic with `issues_list_app.vue`. + // We can remove it once we've refactored the issues list page bulk edit sidebar to Vue. + // https://gitlab.com/gitlab-org/gitlab/-/issues/325874 + issueableEventHub.$on('issuables:enableBulkEdit', () => this.toggleBulkEdit(null, true)); + issueableEventHub.$on('issuables:updateBulkEdit', () => this.updateFormState()); } initDropdowns() { @@ -110,7 +107,7 @@ export default class IssuableBulkUpdateSidebar { } toggleBulkEdit(e, enable) { - e.preventDefault(); + e?.preventDefault(); issueableEventHub.$emit('issuables:toggleBulkEdit', enable); diff --git a/app/assets/javascripts/issuable_list/components/issuable_tabs.vue b/app/assets/javascripts/issuable_list/components/issuable_tabs.vue index 57da030e22e9a4..b314f2b368f446 100644 --- a/app/assets/javascripts/issuable_list/components/issuable_tabs.vue +++ b/app/assets/javascripts/issuable_list/components/issuable_tabs.vue @@ -26,6 +26,9 @@ export default { isTabActive(tabName) { return tabName === this.currentTab; }, + isTabCountNumeric(tab) { + return typeof this.tabCounts[tab.name] === 'number'; + }, }, }; @@ -44,9 +47,13 @@ export default { > diff --git a/app/assets/javascripts/issues_list/components/issues_list_app.vue b/app/assets/javascripts/issues_list/components/issues_list_app.vue index d7af388c8931bb..7a7e91e2179c41 100644 --- a/app/assets/javascripts/issues_list/components/issues_list_app.vue +++ b/app/assets/javascripts/issues_list/components/issues_list_app.vue @@ -1,9 +1,11 @@