diff --git a/src/routes/(protected)/admin/license-keys/+page.svelte b/src/routes/(protected)/admin/license-keys/+page.svelte index 62ecd77..57d6321 100644 --- a/src/routes/(protected)/admin/license-keys/+page.svelte +++ b/src/routes/(protected)/admin/license-keys/+page.svelte @@ -35,8 +35,8 @@ let replaceError = $state(''); let replaceSuccess = $state(''); - let lastCreateForm = $state(null); - let lastReplaceForm = $state(null); + let lastCreateForm = $state.raw(null); + let lastReplaceForm = $state.raw(null); let createTimer: ReturnType | undefined; let replaceTimer: ReturnType | undefined; diff --git a/src/routes/(protected)/admin/proclamation-categories/+page.svelte b/src/routes/(protected)/admin/proclamation-categories/+page.svelte index 53fe52d..6a39a4c 100644 --- a/src/routes/(protected)/admin/proclamation-categories/+page.svelte +++ b/src/routes/(protected)/admin/proclamation-categories/+page.svelte @@ -24,7 +24,7 @@ let formError = $state(''); let fieldErrors = $state>({}); let successMessage = $state(''); - let lastForm = $state(null); + let lastForm = $state.raw(null); let closeTimer: ReturnType | undefined; diff --git a/src/routes/(protected)/admin/proclamation-groups/+page.svelte b/src/routes/(protected)/admin/proclamation-groups/+page.svelte index faf3e57..959633c 100644 --- a/src/routes/(protected)/admin/proclamation-groups/+page.svelte +++ b/src/routes/(protected)/admin/proclamation-groups/+page.svelte @@ -24,7 +24,7 @@ let formError = $state(''); let fieldErrors = $state>({}); let successMessage = $state(''); - let lastForm = $state(null); + let lastForm = $state.raw(null); let closeTimer: ReturnType | undefined; diff --git a/src/routes/(protected)/admin/proclamations/+page.svelte b/src/routes/(protected)/admin/proclamations/+page.svelte index b1ea52e..1832394 100644 --- a/src/routes/(protected)/admin/proclamations/+page.svelte +++ b/src/routes/(protected)/admin/proclamations/+page.svelte @@ -46,7 +46,7 @@ let formError = $state(''); let fieldErrors = $state>({}); let successMessage = $state(''); - let lastForm = $state(null); + let lastForm = $state.raw(null); let element = $state(); let editor: Editor | null = null; diff --git a/src/routes/(protected)/admin/profiles/CreateProfileModal.svelte b/src/routes/(protected)/admin/profiles/CreateProfileModal.svelte index d4f5300..e70b8e3 100644 --- a/src/routes/(protected)/admin/profiles/CreateProfileModal.svelte +++ b/src/routes/(protected)/admin/profiles/CreateProfileModal.svelte @@ -23,7 +23,7 @@ let formError = $state(''); let fieldErrors = $state>({}); let successMessage = $state(''); - let lastForm = $state(null); + let lastForm = $state.raw(null); let closeTimer: ReturnType | undefined; diff --git a/src/routes/(protected)/admin/profiles/EditProfileModal.svelte b/src/routes/(protected)/admin/profiles/EditProfileModal.svelte index a2b1f7b..a256de1 100644 --- a/src/routes/(protected)/admin/profiles/EditProfileModal.svelte +++ b/src/routes/(protected)/admin/profiles/EditProfileModal.svelte @@ -46,7 +46,7 @@ let lastRecordId = $state(null); // Capture the form result as it is when this modal mounts so a stale // result from a previous record is not replayed on open. - let lastForm = $state(untrack(() => form ?? null)); + let lastForm = $state.raw(untrack(() => form ?? null)); function resetAddressFields() { addrStreet = ''; diff --git a/src/routes/(protected)/admin/solfeggio-frequencies/+page.svelte b/src/routes/(protected)/admin/solfeggio-frequencies/+page.svelte index 6f99ffe..4c304a0 100644 --- a/src/routes/(protected)/admin/solfeggio-frequencies/+page.svelte +++ b/src/routes/(protected)/admin/solfeggio-frequencies/+page.svelte @@ -27,7 +27,7 @@ let formError = $state(''); let fieldErrors = $state>({}); let successMessage = $state(''); - let lastForm = $state(null); + let lastForm = $state.raw(null); let closeTimer: ReturnType | undefined; diff --git a/src/routes/(protected)/admin/user-roles/+page.svelte b/src/routes/(protected)/admin/user-roles/+page.svelte index 696d8ae..ccdbd6a 100644 --- a/src/routes/(protected)/admin/user-roles/+page.svelte +++ b/src/routes/(protected)/admin/user-roles/+page.svelte @@ -26,7 +26,7 @@ let formError = $state(''); let fieldErrors = $state>({}); let successMessage = $state(''); - let lastForm = $state(null); + let lastForm = $state.raw(null); let closeTimer: ReturnType | undefined; diff --git a/src/routes/(protected)/admin/users/+page.svelte b/src/routes/(protected)/admin/users/+page.svelte index f1d3dd4..5585598 100644 --- a/src/routes/(protected)/admin/users/+page.svelte +++ b/src/routes/(protected)/admin/users/+page.svelte @@ -44,7 +44,7 @@ let formError = $state(''); let fieldErrors = $state>({}); let successMessage = $state(''); - let lastForm = $state(null); + let lastForm = $state.raw(null); let closeTimer: ReturnType | undefined; diff --git a/src/routes/(protected)/admin/users/page.svelte.spec.ts b/src/routes/(protected)/admin/users/page.svelte.spec.ts index 37c0bf3..3f23bbf 100644 --- a/src/routes/(protected)/admin/users/page.svelte.spec.ts +++ b/src/routes/(protected)/admin/users/page.svelte.spec.ts @@ -61,4 +61,25 @@ describe('users admin page', () => { await expect.element(page.getByRole('button', { name: 'Save User' })).toBeInTheDocument(); expect(page.getByText('User updated').elements()).toHaveLength(0); }); + + it('closes the create modal after a successful submit', async () => { + const result = render(Page, { + params: {}, + data: makeData(), + form: null + }); + + await clickButton('New User'); + await expect.element(page.getByRole('button', { name: 'Create User' })).toBeInTheDocument(); + + await result.rerender({ form: { success: true, action: 'upsert' } }); + + await expect.element(page.getByText('User created')).toBeInTheDocument(); + await vi.waitFor( + () => { + expect(page.getByRole('button', { name: 'Create User' }).elements()).toHaveLength(0); + }, + { timeout: 3000 } + ); + }); });