diff --git a/app/assets/javascripts/issuable/components/csv_export_modal.vue b/app/assets/javascripts/issuable/components/csv_export_modal.vue
index 78987a5c62923b432a086d11a1a71f4213ae2e94..7bdd55ddda3499ba1d9dc5928c467e9bd05571ca 100644
--- a/app/assets/javascripts/issuable/components/csv_export_modal.vue
+++ b/app/assets/javascripts/issuable/components/csv_export_modal.vue
@@ -12,19 +12,23 @@ export default {
},
inject: {
issuableType: {
- default: '',
- },
- issuableCount: {
- default: 0,
+ default: ISSUABLE_TYPE.issues,
},
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 14474d44e105cdbbc4a7b645b5386655047dc965..fb4d5aca2f568b2bc2100180cddeed04f4943a7c 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: undefined,
+ },
+ },
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 5a720b89d338ea3bcd7d7aab542d6b66be5fe071..83163e3c4789f52000ddefc8889cb77b8e50edc1 100644
--- a/app/assets/javascripts/issuable/init_csv_import_export_buttons.js
+++ b/app/assets/javascripts/issuable/init_csv_import_export_buttons.js
@@ -1,6 +1,6 @@
import Vue from 'vue';
import { parseBoolean } from '~/lib/utils/common_utils';
-import ImportExportButtons from './components/csv_import_export_buttons.vue';
+import CsvImportExportButtons from './components/csv_import_export_buttons.vue';
export default () => {
const el = document.querySelector('.js-csv-import-export-buttons');
@@ -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(CsvImportExportButtons, {
+ props: {
+ exportCsvPath,
+ issuableCount: parseInt(issuableCount, 10),
+ },
+ });
},
});
};
diff --git a/app/assets/javascripts/issuable_bulk_update_sidebar.js b/app/assets/javascripts/issuable_bulk_update_sidebar.js
index 1f707bc955f1dec34e5c7b7dbb86ad2124ddd8d3..97d50dde9f746c6d97b0156a86c74061f438e34e 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 57da030e22e9a4f9d42deeb8c9892617464d7ae3..6bc621b52e614ea34d040b2c8eb787f352025d0d 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 Number.isInteger(this.tabCounts[tab.name]);
+ },
},
};
@@ -44,9 +47,13 @@ export default {
>
{{ tab.title }}
- {{
- tabCounts[tab.name]
- }}
+ {{ tabCounts[tab.name] }}
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 d7af388c8931bb7e790e1f4935f0c50eead6c16e..1f26c65475b18a24e4cf8d804b99b7ec7f848311 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,10 @@