From 2b7215837566715f573aee838779ee44a22b4fae Mon Sep 17 00:00:00 2001 From: Yaro Kasear Date: Fri, 25 Jul 2025 09:22:30 -0500 Subject: [PATCH] Add DropdownWidget for enhanced dropdown functionality and improved event handling --- inventory/static/js/dropdown.js | 48 +++++++++++++++++++ .../fragments/_dropdown_fragment.html | 36 ++------------ inventory/templates/layout.html | 1 + 3 files changed, 54 insertions(+), 31 deletions(-) create mode 100644 inventory/static/js/dropdown.js diff --git a/inventory/static/js/dropdown.js b/inventory/static/js/dropdown.js new file mode 100644 index 0000000..29882b3 --- /dev/null +++ b/inventory/static/js/dropdown.js @@ -0,0 +1,48 @@ +const DropdownWidget = (() => { + function setButton(name, id, identifier) { + const button = document.getElementById(`${name}Button`); + const input = document.getElementById(`${name}`); + + button.dataset.invValue = id; + button.textContent = identifier; + input.value = id; + } + + function clear(name) { + const input = document.getElementById(name); + const button = document.getElementById(`${name}Button`); + const clearButton = document.getElementById(`${name}ClearButton`); + + input.value = ""; + button.dataset.invValue = ""; + button.textContent = "-"; + + clearButton.classList.add("d-none"); + button.classList.remove("rounded-end-0"); + button.classList.remove("border-end-0"); + button.classList.add("rounded-end"); + }; + + document.querySelectorAll('.dropdown-button').forEach(button => { + button.addEventListener('shown.bs.dropdown', () => { + const name = button.id.replace('Button', ''); + const dropdown = button.closest('.dropdown'); + const dropdownMenu = dropdown.querySelector('.dropdown-menu.show'); + const searchInput = dropdown.querySelector('.dropdown-search-input'); + const dropdownContent = dropdown.querySelector(`#${name}DropdownContent`); + + if (!dropdownMenu || !searchInput || !dropdownContent) return; + + const menuHeight = dropdownMenu.clientHeight; + const inputHeight = searchInput.offsetHeight; + const availableHeight = menuHeight - inputHeight; + + dropdownContent.style.maxHeight = `${availableHeight}px`; + }); + }); + + return { + clear, + setButton + }; +})(); diff --git a/inventory/templates/fragments/_dropdown_fragment.html b/inventory/templates/fragments/_dropdown_fragment.html index 9d76e46..3982370 100644 --- a/inventory/templates/fragments/_dropdown_fragment.html +++ b/inventory/templates/fragments/_dropdown_fragment.html @@ -10,35 +10,27 @@ +