From 21283ce25f6134d430ae0fb2968b05d7e20fa1a6 Mon Sep 17 00:00:00 2001 From: Albrecht Degering Date: Thu, 23 Jul 2026 01:23:32 +0200 Subject: [PATCH] fix: preserve hidden tool visibility --- .env.example | 2 +- Containerfile.release | 2 +- compose.yaml | 2 +- src/App.test.tsx | 28 ++++++++++++++++++++++++++++ src/App.tsx | 8 ++++++-- 5 files changed, 37 insertions(+), 5 deletions(-) diff --git a/.env.example b/.env.example index 69c4cbc..1558509 100644 --- a/.env.example +++ b/.env.example @@ -5,4 +5,4 @@ TRAEFIK_CERT_RESOLVER=netcup # Keep these two values paired when deploying a newer published toolbox release. TOOLBOX_RELEASE_VERSION=0.4.1 -TOOLBOX_RELEASE_SHA256=36133af8d2b3a7084874303a88c62a5581950c51e9e4786b985fe7ea48f71f0d +TOOLBOX_RELEASE_SHA256=7d8907990a8b91c2bfda48d007fd8136e95222858db8f51780cd10f4165e9124 diff --git a/Containerfile.release b/Containerfile.release index 0dd7cea..cf8c830 100644 --- a/Containerfile.release +++ b/Containerfile.release @@ -3,7 +3,7 @@ ARG NGINX_IMAGE=nginxinc/nginx-unprivileged:1.31.3-alpine@sha256:18d67281256ded3 FROM ${NGINX_IMAGE} AS release ARG TOOLBOX_RELEASE_VERSION=0.4.1 -ARG TOOLBOX_RELEASE_SHA256=36133af8d2b3a7084874303a88c62a5581950c51e9e4786b985fe7ea48f71f0d +ARG TOOLBOX_RELEASE_SHA256=7d8907990a8b91c2bfda48d007fd8136e95222858db8f51780cd10f4165e9124 ARG TOOLBOX_RELEASE_BASE_URL=https://git.add-ideas.de/zemion/toolbox-portal/releases/download RUN set -eu; \ diff --git a/compose.yaml b/compose.yaml index cfe182a..14157a5 100644 --- a/compose.yaml +++ b/compose.yaml @@ -7,7 +7,7 @@ services: dockerfile: Containerfile.release args: TOOLBOX_RELEASE_VERSION: "${TOOLBOX_RELEASE_VERSION:-0.4.1}" - TOOLBOX_RELEASE_SHA256: "${TOOLBOX_RELEASE_SHA256:-36133af8d2b3a7084874303a88c62a5581950c51e9e4786b985fe7ea48f71f0d}" + TOOLBOX_RELEASE_SHA256: "${TOOLBOX_RELEASE_SHA256:-7d8907990a8b91c2bfda48d007fd8136e95222858db8f51780cd10f4165e9124}" image: "git.add-ideas.de/zemion/toolbox:${TOOLBOX_RELEASE_VERSION:-0.4.1}" restart: unless-stopped read_only: true diff --git a/src/App.test.tsx b/src/App.test.tsx index d793745..9d02e7c 100644 --- a/src/App.test.tsx +++ b/src/App.test.tsx @@ -124,6 +124,34 @@ describe('portal UI', () => { ).not.toBeInTheDocument(); }); + it('keeps remaining hidden tools visible while editing the hidden set', async () => { + vi.stubGlobal('fetch', vi.fn(catalogueFetch())); + const user = userEvent.setup(); + render(); + await screen.findByRole('heading', { name: 'PDF Workbench' }); + + await user.click( + screen.getByRole('button', { name: 'Hide PDF Workbench' }) + ); + const showHidden = screen.getByRole('checkbox', { + name: 'Show hidden (1)', + }); + await user.click(showHidden); + await user.click( + screen.getByRole('button', { name: 'Hide XSLT Workbench' }) + ); + expect(showHidden).toHaveAccessibleName('Show hidden (2)'); + await user.click( + screen.getByRole('button', { name: 'Show PDF Workbench' }) + ); + + expect(showHidden).toBeChecked(); + expect(showHidden).toHaveAccessibleName('Show hidden (1)'); + expect( + screen.getByRole('heading', { name: 'XSLT Workbench' }) + ).toBeInTheDocument(); + }); + it('clears search filters without revealing hidden tools', async () => { vi.stubGlobal('fetch', vi.fn(catalogueFetch())); const user = userEvent.setup(); diff --git a/src/App.tsx b/src/App.tsx index 9759175..12a976f 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -123,7 +123,8 @@ export default function App() { const [preferences, setPreferences, storageAvailable] = usePreferences(); const closeHelp = useCallback(() => setHelpOpen(false), []); const showHidden = - preferences.hidden.length > 0 && shownHiddenIds === preferences.hidden; + preferences.hidden.length > 0 && + shownHiddenIds?.some((id) => preferences.hidden.includes(id)) === true; const sensors = useSensors( useSensor(PointerSensor, { activationConstraint: { distance: 8 } }), useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }) @@ -205,6 +206,9 @@ export default function App() { })); function toggleListItem(field: 'pinned' | 'hidden', id: string) { + if (field === 'hidden' && showHidden && !preferences.hidden.includes(id)) { + setShownHiddenIds((current) => [...new Set([...(current ?? []), id])]); + } setPreferences((current) => ({ ...current, [field]: current[field].includes(id) @@ -332,7 +336,7 @@ export default function App() { disabled={preferences.hidden.length === 0} onChange={(event) => setShownHiddenIds( - event.target.checked ? preferences.hidden : null + event.target.checked ? [...preferences.hidden] : null ) } />