diff --git a/netbox/project-static/dist/netbox.js b/netbox/project-static/dist/netbox.js index c7d68128a..d86555f8e 100644 Binary files a/netbox/project-static/dist/netbox.js and b/netbox/project-static/dist/netbox.js differ diff --git a/netbox/project-static/dist/netbox.js.map b/netbox/project-static/dist/netbox.js.map index 33fdbf58e..8a46e91a8 100644 Binary files a/netbox/project-static/dist/netbox.js.map and b/netbox/project-static/dist/netbox.js.map differ diff --git a/netbox/project-static/src/search.ts b/netbox/project-static/src/search.ts index d01bc744a..59b668cc0 100644 --- a/netbox/project-static/src/search.ts +++ b/netbox/project-static/src/search.ts @@ -1,40 +1,44 @@ import debounce from 'just-debounce-it'; -import { getElements, getRowValues, findFirstAdjacent } from './util'; +import { getElements, getRowValues, findFirstAdjacent, isTruthy } from './util'; -interface SearchFilterButton extends EventTarget { - dataset: { searchValue: string }; -} - -function isSearchButton(el: any): el is SearchFilterButton { - return el?.dataset?.searchValue ?? null !== null; +/** + * Change the display value and hidden input values of the search filter based on dropdown + * selection. + * + * @param event "click" event for each dropdown item. + * @param button Each dropdown item element. + */ +function handleSearchDropdownClick(event: Event, button: HTMLButtonElement) { + const dropdown = event.currentTarget as HTMLButtonElement; + const selectedValue = findFirstAdjacent(dropdown, 'span.search-obj-selected'); + const selectedType = findFirstAdjacent(dropdown, 'input.search-obj-type'); + const searchValue = dropdown.getAttribute('data-search-value'); + let selected = '' as string; + + if (selectedValue !== null && selectedType !== null) { + if (isTruthy(searchValue) && selected !== searchValue) { + selected = searchValue; + selectedValue.innerHTML = button.textContent ?? 'Error'; + selectedType.value = searchValue; + } else { + selected = ''; + selectedType.innerHTML = 'All Objects'; + selectedType.value = ''; + } + } } +/** + * Initialize Search Bar Elements. + */ function initSearchBar() { - const dropdown = document.getElementById('object-type-selector'); - const selectedValue = document.getElementById('selected-value') as HTMLSpanElement; - const selectedType = document.getElementById('search-obj-type') as HTMLInputElement; - let selected = ''; - - if (dropdown !== null) { - const buttons = dropdown.querySelectorAll('li > button.dropdown-item'); - for (const button of buttons) { - if (button !== null) { - function handleClick(event: Event) { - if (isSearchButton(event.target)) { - const objectType = event.target.dataset.searchValue; - if (objectType !== '' && selected !== objectType) { - selected = objectType; - selectedValue.innerHTML = button.textContent ?? 'Error'; - selectedType.value = objectType; - } else { - selected = ''; - selectedType.innerHTML = 'All Objects'; - selectedType.value = ''; - } - } - } - button.addEventListener('click', handleClick); - } + for (const dropdown of getElements( + 'div.search-container ul.search-obj-selector', + )) { + for (const button of dropdown.querySelectorAll( + 'li > button.dropdown-item', + )) { + button.addEventListener('click', event => handleSearchDropdownClick(event, button)); } } } diff --git a/netbox/templates/layout.html b/netbox/templates/layout.html index a874b143d..3cac647e3 100644 --- a/netbox/templates/layout.html +++ b/netbox/templates/layout.html @@ -15,7 +15,7 @@ {% include 'logo.html' %}