diff --git a/src/lib/api/index.ts b/src/lib/api/index.ts index 30bbb38e..a71eaed2 100644 --- a/src/lib/api/index.ts +++ b/src/lib/api/index.ts @@ -32,6 +32,7 @@ export { adminConfigurationDelete, adminConfigurationList, adminConfigurationUpdate, + adminDeleteUser, adminGetOnlineDevices, adminGetUsers, adminListEmailProviderBlacklist, diff --git a/src/routes/(app)/admin/users/+page.svelte b/src/routes/(app)/admin/users/+page.svelte index 794754c6..338e74cd 100644 --- a/src/routes/(app)/admin/users/+page.svelte +++ b/src/routes/(app)/admin/users/+page.svelte @@ -25,7 +25,7 @@ return isPrivileged ? RenderBlueCell(roles.toString()) : RenderBoldCell(roles.toString()); }; - const columns: ColumnDef[] = [ + const dataColumns: ColumnDef[] = [ CreateSortableColumnDef('name', 'Name', RenderCell), CreateSortableColumnDef('email', 'Email', RenderCell), CreateSortableColumnDef('passwordHashType', 'Password hash type', PasswordHashTypeRenderer), @@ -36,7 +36,6 @@ CreateSortableColumnDef('deactivatedByUserId', 'Deactivated by', (a) => a ? RenderCell(a) : RenderRedCell('None') ), - CreateActionsColumnDef(DataTableActions, (user) => ({ user })), ]; function escapeQuotes(str: string) { @@ -81,6 +80,17 @@ let isFetching = $state(false); + // Bumped to force a re-fetch after a mutation (e.g. user deletion). + let refreshNonce = $state(0); + + const columns: ColumnDef[] = [ + ...dataColumns, + CreateActionsColumnDef(DataTableActions, (user) => ({ + user, + onDeleted: () => refreshNonce++, + })), + ]; + let requestedPage = $state(1); let requestedPageSize = $state(100); @@ -126,6 +136,7 @@ }); $effect(() => { + void refreshNonce; // re-run after a mutation const offset = (requestedPage - 1) * requestedPageSize; isFetching = true; diff --git a/src/routes/(app)/admin/users/data-table-actions.svelte b/src/routes/(app)/admin/users/data-table-actions.svelte index b2826eba..85378938 100644 --- a/src/routes/(app)/admin/users/data-table-actions.svelte +++ b/src/routes/(app)/admin/users/data-table-actions.svelte @@ -10,9 +10,10 @@ interface Props { user: AdminUsersView; + onDeleted?: () => void; } - let { user }: Props = $props(); + let { user, onDeleted }: Props = $props(); let editDialogOpen = $state(false); let deleteDialogOpen = $state(false); @@ -24,7 +25,7 @@ - + User diff --git a/src/routes/(app)/admin/users/dialog-user-delete.svelte b/src/routes/(app)/admin/users/dialog-user-delete.svelte index d6e4b37b..aea4e56a 100644 --- a/src/routes/(app)/admin/users/dialog-user-delete.svelte +++ b/src/routes/(app)/admin/users/dialog-user-delete.svelte @@ -1,16 +1,30 @@ - {}}> + {#snippet description()} Are you sure you want to delete {user.name}?
All data associated with this user will be permanently deleted.