From 2039c129f257e86029c0cf43b38a9a8a90f0da23 Mon Sep 17 00:00:00 2001 From: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com> Date: Thu, 7 May 2026 21:00:23 +0200 Subject: [PATCH] refactor: settings accordion reactivity (#28281) --- e2e-auth-server/package.json | 3 +- .../settings/SettingAccordion.svelte | 35 ++- .../settings/SettingAccordionState.svelte | 43 ---- .../lib/managers/accordion-manager.svelte.ts | 46 ++++ web/src/lib/utils/context.ts | 8 - .../user-settings/UserSettingsList.svelte | 211 +++++++++--------- web/src/routes/admin/maintenance/+page.svelte | 20 +- .../routes/admin/system-settings/+page.svelte | 14 +- 8 files changed, 178 insertions(+), 202 deletions(-) delete mode 100644 web/src/lib/components/shared-components/settings/SettingAccordionState.svelte create mode 100644 web/src/lib/managers/accordion-manager.svelte.ts delete mode 100644 web/src/lib/utils/context.ts diff --git a/e2e-auth-server/package.json b/e2e-auth-server/package.json index f8ea7243fd..8aa24c04ec 100644 --- a/e2e-auth-server/package.json +++ b/e2e-auth-server/package.json @@ -11,5 +11,6 @@ "@types/oidc-provider": "^9.0.0", "oidc-provider": "^9.0.0", "tsx": "^4.20.6" - } + }, + "packageManager": "pnpm@10.33.1" } diff --git a/web/src/lib/components/shared-components/settings/SettingAccordion.svelte b/web/src/lib/components/shared-components/settings/SettingAccordion.svelte index d4b46b93c6..8d820047fb 100755 --- a/web/src/lib/components/shared-components/settings/SettingAccordion.svelte +++ b/web/src/lib/components/shared-components/settings/SettingAccordion.svelte @@ -1,10 +1,8 @@ @@ -72,7 +63,7 @@ diff --git a/web/src/lib/components/shared-components/settings/SettingAccordionState.svelte b/web/src/lib/components/shared-components/settings/SettingAccordionState.svelte deleted file mode 100644 index b0deb64316..0000000000 --- a/web/src/lib/components/shared-components/settings/SettingAccordionState.svelte +++ /dev/null @@ -1,43 +0,0 @@ - - - - -{@render children?.()} diff --git a/web/src/lib/managers/accordion-manager.svelte.ts b/web/src/lib/managers/accordion-manager.svelte.ts new file mode 100644 index 0000000000..fd646bad32 --- /dev/null +++ b/web/src/lib/managers/accordion-manager.svelte.ts @@ -0,0 +1,46 @@ +import { SvelteSet, SvelteURLSearchParams } from 'svelte/reactivity'; +import { goto } from '$app/navigation'; +import { page } from '$app/state'; +import { QueryParameter } from '$lib/constants'; +import { handlePromiseError } from '$lib/utils'; + +class AccordionManager { + // needs to be derived since `page.url.searchParams` isn't actually initialized by the time this class gets instantiated. + #searchParams = $derived(new SvelteURLSearchParams(page.url.searchParams)); + #state = $derived( + new SvelteSet( + this.#searchParams + .get(QueryParameter.IS_OPEN) + ?.split(' ') + .filter((x) => x !== ''), + ), + ); + + isOpen(key: string) { + return this.#state.has(key); + } + + #refreshSearchParams() { + if (this.#state.size === 0) { + this.#searchParams.delete(QueryParameter.IS_OPEN); + } else { + this.#searchParams.set(QueryParameter.IS_OPEN, [...this.#state].join(' ')); + } + + handlePromiseError( + goto(`?${this.#searchParams.toString()}`, { replaceState: true, noScroll: true, keepFocus: true }), + ); + } + + open(key: string) { + this.#state.add(key); + this.#refreshSearchParams(); + } + + close(key: string) { + this.#state.delete(key); + this.#refreshSearchParams(); + } +} + +export const accordionManager = new AccordionManager(); diff --git a/web/src/lib/utils/context.ts b/web/src/lib/utils/context.ts deleted file mode 100644 index 733b8e6eb9..0000000000 --- a/web/src/lib/utils/context.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { getContext, setContext } from 'svelte'; - -export function createContext(key: string | symbol = Symbol()) { - return { - get: () => getContext(key), - set: (context: T) => setContext(key, context), - }; -} diff --git a/web/src/routes/(user)/user-settings/UserSettingsList.svelte b/web/src/routes/(user)/user-settings/UserSettingsList.svelte index c57e3e0870..97e2b366c6 100644 --- a/web/src/routes/(user)/user-settings/UserSettingsList.svelte +++ b/web/src/routes/(user)/user-settings/UserSettingsList.svelte @@ -26,7 +26,6 @@ mdiTwoFactorAuthentication, } from '@mdi/js'; import { t } from 'svelte-i18n'; - import SettingAccordionState from '$lib/components/shared-components/settings/SettingAccordionState.svelte'; import SettingAccordion from '$lib/components/shared-components/settings/SettingAccordion.svelte'; import AppSettings from './AppSettings.svelte'; import ChangePasswordSettings from './ChangePasswordSettings.svelte'; @@ -48,116 +47,114 @@ $page.url.searchParams.get(QueryParameter.OPEN_SETTING) === OpenQueryParam.OAUTH; - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{#if featureFlagsManager.value.oauth} - + +{/if} - - - + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - {#if featureFlagsManager.value.oauth} - - - - {/if} - - - - - - - - - - - - - - - - - + + + diff --git a/web/src/routes/admin/maintenance/+page.svelte b/web/src/routes/admin/maintenance/+page.svelte index cc2d4d4b17..e335556d45 100644 --- a/web/src/routes/admin/maintenance/+page.svelte +++ b/web/src/routes/admin/maintenance/+page.svelte @@ -1,9 +1,7 @@