From 86c06e4756b45f969e23d79f9a299711c51e8975 Mon Sep 17 00:00:00 2001 From: Ivymaster Date: Fri, 10 Jul 2026 11:50:07 +0200 Subject: [PATCH] BUG: issue fix for dropdown reposition errror --- .../tabulator/filters/extendedHeaderFilter.js | 26 +++++++++++++++---- tests/cypress/.gitignore | 5 +++- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/public/js/tabulator/filters/extendedHeaderFilter.js b/public/js/tabulator/filters/extendedHeaderFilter.js index f17783765..8626ad4f9 100644 --- a/public/js/tabulator/filters/extendedHeaderFilter.js +++ b/public/js/tabulator/filters/extendedHeaderFilter.js @@ -64,8 +64,6 @@ export function buildTagHeaderFilterExpression(selectedTagOptions) { } export function buildTagOptionsFromRows(rows, field = "tags") { - let options = []; - let parsedTags = [ ...new Map( getRawTagValuesFromRows(rows, field) @@ -82,7 +80,7 @@ export function buildTagOptionsFromRows(rows, field = "tags") { done: tag.done, }; }) - .map((obj) => [JSON.stringify(obj), obj]), + .map((obj) => [obj.value, obj]), ).values(), ]; if (!Array.isArray(parsedTags)) return; @@ -184,6 +182,7 @@ export function customTagFilter(cell, onRendered, success, cancel, params) { input.style.width = "100%"; input.type = "text"; let dropdownMenu = null; + let suppressScrollCloseUntil = 0; Object.defineProperty(container, "value", { get: () => input.value, @@ -221,11 +220,27 @@ export function customTagFilter(cell, onRendered, success, cancel, params) { activeTagDropdownCleanup = null; } - window.removeEventListener("scroll", positionDropdown, true); + window.removeEventListener("scroll", handleScroll, true); window.removeEventListener("resize", positionDropdown); document.removeEventListener("mousedown", handleOutsideClick, true); }; + const suppressScrollClose = () => { + suppressScrollCloseUntil = Date.now() + 300; + }; + + const handleScroll = (event) => { + const target = event.target; + const isDropdownScroll = + target instanceof Node && dropdownMenu?.contains(target); + + if (isDropdownScroll || Date.now() < suppressScrollCloseUntil) { + return; + } + + closeDropdown(); + }; + const handleOutsideClick = (event) => { if ( dropdownMenu?.contains(event.target) || @@ -265,13 +280,14 @@ export function customTagFilter(cell, onRendered, success, cancel, params) { dropdownMenu.addEventListener("mousedown", (event) => { event.stopPropagation(); }); + dropdownMenu.addEventListener("click", suppressScrollClose, true); document.body.appendChild(dropdownMenu); activeTagDropdownCleanup = closeDropdown; positionDropdown(); - window.addEventListener("scroll", positionDropdown, true); + window.addEventListener("scroll", handleScroll, true); window.addEventListener("resize", positionDropdown); document.addEventListener("mousedown", handleOutsideClick, true); }; diff --git a/tests/cypress/.gitignore b/tests/cypress/.gitignore index 48e0213b8..25e6d917c 100644 --- a/tests/cypress/.gitignore +++ b/tests/cypress/.gitignore @@ -1,4 +1,7 @@ node_modules .env .env.* -!.env.example \ No newline at end of file +!.env.example +/cypress/videos +/cypress/screenshots +/results \ No newline at end of file