From 3fdc1df89c95642b980b12e375ce68448d07bbec Mon Sep 17 00:00:00 2001 From: Jason Rasmussen Date: Tue, 13 May 2025 10:40:50 -0400 Subject: [PATCH] fix(web): handle deleted user on details page (#18264) --- i18n/en.json | 1 + .../lib/modals/UserDeleteConfirmModal.svelte | 10 ++-- .../lib/modals/UserRestoreConfirmModal.svelte | 35 +++++++------ web/src/routes/admin/users/+page.svelte | 12 +++-- web/src/routes/admin/users/[id]/+page.svelte | 49 ++++++++++++++----- 5 files changed, 72 insertions(+), 35 deletions(-) diff --git a/i18n/en.json b/i18n/en.json index fde78a34a3..b712faa3c2 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -1867,6 +1867,7 @@ "use_current_connection": "use current connection", "use_custom_date_range": "Use custom date range instead", "user": "User", + "user_has_been_deleted": "This user has been deleted.", "user_id": "User ID", "user_liked": "{user} liked {type, select, photo {this photo} video {this video} asset {this asset} other {it}}", "created_at": "Created", diff --git a/web/src/lib/modals/UserDeleteConfirmModal.svelte b/web/src/lib/modals/UserDeleteConfirmModal.svelte index 9439c23568..294cafa035 100644 --- a/web/src/lib/modals/UserDeleteConfirmModal.svelte +++ b/web/src/lib/modals/UserDeleteConfirmModal.svelte @@ -4,12 +4,12 @@ import ConfirmModal from '$lib/modals/ConfirmModal.svelte'; import { serverConfig } from '$lib/stores/server-config.store'; import { handleError } from '$lib/utils/handle-error'; - import { deleteUserAdmin, type UserResponseDto } from '@immich/sdk'; + import { deleteUserAdmin, type UserAdminResponseDto, type UserResponseDto } from '@immich/sdk'; import { t } from 'svelte-i18n'; interface Props { user: UserResponseDto; - onClose: (confirmed?: true) => void; + onClose: (user?: UserAdminResponseDto) => void; } let { user, onClose }: Props = $props(); @@ -20,14 +20,12 @@ const handleDeleteUser = async () => { try { - const { deletedAt } = await deleteUserAdmin({ + const result = await deleteUserAdmin({ id: user.id, userAdminDeleteDto: { force: forceDelete }, }); - if (deletedAt !== undefined) { - onClose(true); - } + onClose(result); } catch (error) { handleError(error, $t('errors.unable_to_delete_user')); } diff --git a/web/src/lib/modals/UserRestoreConfirmModal.svelte b/web/src/lib/modals/UserRestoreConfirmModal.svelte index 130164c80e..c8fde89f36 100644 --- a/web/src/lib/modals/UserRestoreConfirmModal.svelte +++ b/web/src/lib/modals/UserRestoreConfirmModal.svelte @@ -1,34 +1,30 @@ - (confirmed ? handleRestoreUser() : onClose())} -> - {#snippet promptSnippet()} + +

{#snippet children({ message })} @@ -36,5 +32,16 @@ {/snippet}

- {/snippet} -
+ + + +
+ + +
+
+ diff --git a/web/src/routes/admin/users/+page.svelte b/web/src/routes/admin/users/+page.svelte index dc21be6c24..bd8ccf59f6 100644 --- a/web/src/routes/admin/users/+page.svelte +++ b/web/src/routes/admin/users/+page.svelte @@ -18,8 +18,8 @@ import { websocketEvents } from '$lib/stores/websocket'; import { getByteUnitString } from '$lib/utils/byte-units'; import { UserStatus, searchUsersAdmin, type UserAdminResponseDto } from '@immich/sdk'; - import { Button, IconButton, Link } from '@immich/ui'; - import { mdiDeleteRestore, mdiInfinity, mdiPencilOutline, mdiTrashCanOutline } from '@mdi/js'; + import { Button, HStack, IconButton, Link, Text } from '@immich/ui'; + import { mdiDeleteRestore, mdiInfinity, mdiPencilOutline, mdiPlusBoxOutline, mdiTrashCanOutline } from '@mdi/js'; import { DateTime } from 'luxon'; import { onMount } from 'svelte'; import { t } from 'svelte-i18n'; @@ -86,6 +86,13 @@ + {#snippet buttons()} + + + + {/snippet}
@@ -163,7 +170,6 @@ {/if}
-
diff --git a/web/src/routes/admin/users/[id]/+page.svelte b/web/src/routes/admin/users/[id]/+page.svelte index 6cf5530ece..03f5e64963 100644 --- a/web/src/routes/admin/users/[id]/+page.svelte +++ b/web/src/routes/admin/users/[id]/+page.svelte @@ -1,5 +1,4 @@