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">