From 32993800fe2f0653fa52c456386ab85b160f0603 Mon Sep 17 00:00:00 2001 From: Yaro Kasear Date: Mon, 18 Aug 2025 15:05:24 -0500 Subject: [PATCH] Refactor dropdown and table components, add dynamic table functionality, and update stylesheets for improved UI --- .../static/css/{widget.css => combobox.css} | 0 inventory/static/css/dropdown.css | 4 ++ inventory/static/js/dropdown.js | 23 ++++++++ .../fragments/_dropdown_fragment.html | 12 ++--- .../templates/fragments/_table_fragment.html | 53 +++++++++++++++++++ inventory/templates/layout.html | 3 +- inventory/templates/table.html | 2 +- 7 files changed, 89 insertions(+), 8 deletions(-) rename inventory/static/css/{widget.css => combobox.css} (100%) create mode 100644 inventory/static/css/dropdown.css diff --git a/inventory/static/css/widget.css b/inventory/static/css/combobox.css similarity index 100% rename from inventory/static/css/widget.css rename to inventory/static/css/combobox.css diff --git a/inventory/static/css/dropdown.css b/inventory/static/css/dropdown.css new file mode 100644 index 0000000..72868e3 --- /dev/null +++ b/inventory/static/css/dropdown.css @@ -0,0 +1,4 @@ +.dropdown-search-input:focus { + outline: none !important; + box-shadow: none !important; +} diff --git a/inventory/static/js/dropdown.js b/inventory/static/js/dropdown.js index 586fda3..9d4bde6 100644 --- a/inventory/static/js/dropdown.js +++ b/inventory/static/js/dropdown.js @@ -15,6 +15,8 @@ function DropDown(cfg) { this.selectedId = v; this.$refs.clear?.classList.remove('d-none'); } + + this.$refs.button.addEventListener('shown.bs.dropdown', (e) => this.onShown(e)); }, itemSelect(e) { @@ -79,6 +81,27 @@ function DropDown(cfg) { } this.$dispatch('dropdown:cleared', {}); + }, + + onShown() { + const { menu, search, content } = this.$refs || {}; + if (!menu || !search || !content) return; + + requestAnimationFrame(() => { + const viewportH = window.innerHeight; + const menuTop = menu.getBoundingClientRect().top; + + const capByViewport = viewportH * 0.40; + const spaceBelow = viewportH - menuTop - 12; + const menuCap = Math.max(0, Math.min(capByViewport, spaceBelow)); + + const inputH = search.offsetHeight || 0; + const contentMax = Math.max(0, menuCap - inputH); + + content.style.maxHeight = `${contentMax - 2}px`; + + requestAnimationFrame(() => search.focus()); + }); } }; } diff --git a/inventory/templates/fragments/_dropdown_fragment.html b/inventory/templates/fragments/_dropdown_fragment.html index 387955d..b192d54 100644 --- a/inventory/templates/fragments/_dropdown_fragment.html +++ b/inventory/templates/fragments/_dropdown_fragment.html @@ -12,10 +12,10 @@ id: {{ id|tojson }}, refreshUrl: {{ refresh_url|tojson if refresh_url else "null" }}, selectUrl: {{ select_url|tojson if select_url else "null" }}, - recordId: {{ record_id|tojson if record_id else "null"}}, - field: {{ field_name|tojson if field_name else "null"}} + recordId: {{ record_id|tojson if record_id else "null" }}, + field: {{ field_name|tojson if field_name else "null" }} })' - hx-preserve x-init="init()"> + hx-preserve x-init="init()" x-ref="dropdown">