From 520835f2b65c9b7f69f98ed2037edc5bde7721df Mon Sep 17 00:00:00 2001 From: Sukhwinder Dhillon Date: Fri, 19 Jul 2024 11:23:13 +0200 Subject: [PATCH] ActionList: Add property `items` The list knows its items. --- asset/js/widget/ActionList.js | 55 +++++++++-------------------------- 1 file changed, 13 insertions(+), 42 deletions(-) diff --git a/asset/js/widget/ActionList.js b/asset/js/widget/ActionList.js index ea87a9dc..5b4d79c9 100644 --- a/asset/js/widget/ActionList.js +++ b/asset/js/widget/ActionList.js @@ -9,6 +9,7 @@ define(["../notjQuery"], function ($) { constructor(list, isPrimary) { this.list = list; this.isPrimary = isPrimary; + this.items = Array.from(this.list.querySelectorAll(LIST_ITEM_IDENTIFIER)); this.isMultiSelectable = this.list.matches('[data-icinga-multiselect-url]'); this.lastActivatedItemUrl = null; @@ -114,19 +115,17 @@ define(["../notjQuery"], function ($) { } else { document.getSelection().removeAllRanges(); - let allItems = this.getAllItems(); - - let startIndex = allItems.indexOf(item); + let startIndex = this.items.indexOf(item); if(startIndex < 0) { startIndex = 0; } - let endIndex = activeItems.length ? allItems.indexOf(activeItems[0]) : 0; + let endIndex = activeItems.length ? this.items.indexOf(activeItems[0]) : 0; if (startIndex > endIndex) { - toActiveItems = allItems.slice(endIndex, startIndex + 1); + toActiveItems = this.items.slice(endIndex, startIndex + 1); } else { - endIndex = activeItems.length ? allItems.indexOf(activeItems[activeItems.length - 1]) : 0; - toActiveItems = allItems.slice(startIndex, endIndex + 1); + endIndex = activeItems.length ? this.items.indexOf(activeItems[activeItems.length - 1]) : 0; + toActiveItems = this.items.slice(startIndex, endIndex + 1); } toDeactivateItems = activeItems.filter(item => ! toActiveItems.includes(item)); @@ -252,12 +251,11 @@ define(["../notjQuery"], function ($) { return; } - let allItems = this.getAllItems(); - let firstListItem = allItems[0]; - let lastListItem = allItems[allItems.length -1]; + let firstListItem = this.items[0]; + let lastListItem = this.items[this.items.length -1]; let markAsLastActive = null; // initialized only if it is different from toActiveItem let toActiveItem = null; - let wasAllSelected = activeItems.length === allItems.length; + let wasAllSelected = activeItems.length === this.items.length; let lastActivatedItem = this.list.querySelector( `[data-icinga-detail-filter="${ this.lastActivatedItemUrl }"]` ); @@ -375,10 +373,9 @@ define(["../notjQuery"], function ($) { * Select All list items */ selectAll() { - let allItems = this.getAllItems(); let activeItems = this.getActiveItems(); - this.setActive(allItems.filter(item => ! activeItems.includes(item))); - this.setLastActivatedItemUrl(allItems[allItems.length -1].dataset.icingaDetailFilter); + this.setActive(this.items.filter(item => ! activeItems.includes(item))); + this.setLastActivatedItemUrl(this.items[this.items.length -1].dataset.icingaDetailFilter); this.addSelectionCountToFooter(); this.loadDetailUrl(); } @@ -472,33 +469,7 @@ define(["../notjQuery"], function ($) { */ getActiveItems() { - let items; - - if (this.list.tagName.toLowerCase() === 'table') { - items = this.list.querySelectorAll(`:scope > tbody > ${LIST_ITEM_IDENTIFIER}.active`); - } else { - items = this.list.querySelectorAll(`:scope > ${LIST_ITEM_IDENTIFIER}.active`); - } - - return Array.from(items); - } - - /** - * Get all available items - * - * @return array - */ - getAllItems() - { - let items; - - if (this.list.tagName.toLowerCase() === 'table') { - items = this.list.querySelectorAll(`:scope > tbody > ${LIST_ITEM_IDENTIFIER}`); - } else { - items = this.list.querySelectorAll(`:scope > ${LIST_ITEM_IDENTIFIER}`); - } - - return Array.from(items); + return this.items.filter(item => item.classList.contains('active')); } /** @@ -563,7 +534,7 @@ define(["../notjQuery"], function ($) { } } - this.clearSelection(this.getAllItems().filter(item => ! toActiveItems.includes(item))); + this.clearSelection(this.items.filter(item => ! toActiveItems.includes(item))); this.setActive(toActiveItems); this.addSelectionCountToFooter(); }