From 5a55bb9d969290812348833f0564b476b16d0e0a Mon Sep 17 00:00:00 2001 From: Coung Ngo Date: Tue, 23 Mar 2021 11:55:10 +0000 Subject: [PATCH 1/2] Add bulk edit to issues list page refactor This commit adds bulk edit to the Vue issues list page, which is under the feature flag `vue_issues_list` defaulted to off. --- .../issuable_bulk_update_actions.js | 4 +-- .../issuable_bulk_update_sidebar.js | 22 ++++++------- .../components/issuable_item.vue | 6 +++- .../components/issuable_list_root.vue | 2 ++ .../components/issues_list_app.vue | 18 ++++++++++ app/assets/javascripts/labels_select.js | 8 +++-- app/views/projects/issues/index.html.haml | 2 ++ .../components/issuable_list_root_spec.js | 15 ++++++++- .../components/issues_list_app_spec.js | 33 +++++++++++++++++++ 9 files changed, 92 insertions(+), 18 deletions(-) diff --git a/app/assets/javascripts/issuable_bulk_update_actions.js b/app/assets/javascripts/issuable_bulk_update_actions.js index f507f072253d50..366a9a8a883183 100644 --- a/app/assets/javascripts/issuable_bulk_update_actions.js +++ b/app/assets/javascripts/issuable_bulk_update_actions.js @@ -87,7 +87,7 @@ export default { // From issuable's initial bulk selection getOriginalCommonIds() { const labelIds = []; - this.getElement('.selected-issuable:checked').each((i, el) => { + this.getElement('.issuable-list input[type="checkbox"]:checked').each((i, el) => { labelIds.push(this.getElement(`#${this.prefixId}${el.dataset.id}`).data('labels')); }); return intersection.apply(this, labelIds); @@ -100,7 +100,7 @@ export default { let issuableLabels = []; // Collect unique label IDs for all checked issues - this.getElement('.selected-issuable:checked').each((i, el) => { + this.getElement('.issuable-list input[type="checkbox"]:checked').each((i, el) => { issuableLabels = this.getElement(`#${this.prefixId}${el.dataset.id}`).data('labels'); issuableLabels.forEach((labelId) => { // Store unique IDs diff --git a/app/assets/javascripts/issuable_bulk_update_sidebar.js b/app/assets/javascripts/issuable_bulk_update_sidebar.js index ef98db5151a66c..1f707bc955f1de 100644 --- a/app/assets/javascripts/issuable_bulk_update_sidebar.js +++ b/app/assets/javascripts/issuable_bulk_update_sidebar.js @@ -34,7 +34,7 @@ export default class IssuableBulkUpdateSidebar { this.$otherFilters = $('.issues-other-filters'); this.$checkAllContainer = $('.check-all-holder'); this.$issueChecks = $('.issue-check'); - this.$issuesList = $('.selected-issuable'); + this.$issuesList = $('.issuable-list input[type="checkbox"]'); this.$issuableIdsInput = $('#update_issuable_ids'); } @@ -46,16 +46,14 @@ export default class IssuableBulkUpdateSidebar { this.$bulkEditSubmitBtn.on('click', () => this.prepForSubmit()); this.$checkAllContainer.on('click', () => this.updateFormState()); - if (this.vueIssuablesListFeature) { - issueableEventHub.$on('issuables:updateBulkEdit', () => { - // Danger! Strong coupling ahead! - // The bulk update sidebar and its dropdowns look for .selected-issuable 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. + 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(); - }); - } + this.updateFormState(); + }); } initDropdowns() { @@ -96,7 +94,7 @@ export default class IssuableBulkUpdateSidebar { } updateFormState() { - const noCheckedIssues = !$('.selected-issuable:checked').length; + const noCheckedIssues = !$('.issuable-list input[type="checkbox"]:checked').length; this.toggleSubmitButtonDisabled(noCheckedIssues); this.updateSelectedIssuableIds(); @@ -166,7 +164,7 @@ export default class IssuableBulkUpdateSidebar { } static getCheckedIssueIds() { - const $checkedIssues = $('.selected-issuable:checked'); + const $checkedIssues = $('.issuable-list input[type="checkbox"]:checked'); if ($checkedIssues.length > 0) { return $.map($checkedIssues, (value) => $(value).data('id')); diff --git a/app/assets/javascripts/issuable_list/components/issuable_item.vue b/app/assets/javascripts/issuable_list/components/issuable_item.vue index 92c527c79ffc3d..880ad686f17566 100644 --- a/app/assets/javascripts/issuable_list/components/issuable_item.vue +++ b/app/assets/javascripts/issuable_list/components/issuable_item.vue @@ -65,6 +65,9 @@ export default { labels() { return this.issuable.labels?.nodes || this.issuable.labels || []; }, + labelIdsString() { + return JSON.stringify(this.labels.map((label) => label.id)); + }, assignees() { return this.issuable.assignees || []; }, @@ -149,12 +152,13 @@ export default {