From cb7e68a2870d77248932352f1e84d9d03504e641 Mon Sep 17 00:00:00 2001 From: Jason Rasmussen Date: Wed, 22 Oct 2025 15:21:16 -0400 Subject: [PATCH] refactor: user edit modal (#23169) --- pnpm-lock.yaml | 10 +++--- web/package.json | 2 +- web/src/lib/modals/UserEditModal.svelte | 46 ++++++++++++++----------- 3 files changed, 32 insertions(+), 26 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index be6b2974b0..cb7549022b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -681,8 +681,8 @@ importers: specifier: file:../open-api/typescript-sdk version: link:../open-api/typescript-sdk '@immich/ui': - specifier: ^0.36.0 - version: 0.36.4(@internationalized/date@3.8.2)(svelte@5.40.1) + specifier: ^0.37.1 + version: 0.37.1(@internationalized/date@3.8.2)(svelte@5.40.1) '@mapbox/mapbox-gl-rtl-text': specifier: 0.2.3 version: 0.2.3(mapbox-gl@1.13.3) @@ -2726,8 +2726,8 @@ packages: cpu: [x64] os: [win32] - '@immich/ui@0.36.4': - resolution: {integrity: sha512-urA7yD3ylKPqh6BhctvnpwZ1BZke75qaArRvnmUhjy5mV9Bud4D/yqbX5BlYq+Z3TvNP365BPLJDj7euG91gZw==} + '@immich/ui@0.37.1': + resolution: {integrity: sha512-8S9KsyqyRcNgRHeBU8G3qMQ7D7fN4u9I31jjRc9c3s2tkiYucASofPJdcFdmGZnKLX5fIj+yofxiNZV9tVitOg==} peerDependencies: svelte: ^5.0.0 @@ -14182,7 +14182,7 @@ snapshots: '@img/sharp-win32-x64@0.34.4': optional: true - '@immich/ui@0.36.4(@internationalized/date@3.8.2)(svelte@5.40.1)': + '@immich/ui@0.37.1(@internationalized/date@3.8.2)(svelte@5.40.1)': dependencies: '@mdi/js': 7.4.47 bits-ui: 2.9.8(@internationalized/date@3.8.2)(svelte@5.40.1) diff --git a/web/package.json b/web/package.json index 1096f8a199..fad799813d 100644 --- a/web/package.json +++ b/web/package.json @@ -27,7 +27,7 @@ "dependencies": { "@formatjs/icu-messageformat-parser": "^2.9.8", "@immich/sdk": "file:../open-api/typescript-sdk", - "@immich/ui": "^0.36.0", + "@immich/ui": "^0.37.1", "@mapbox/mapbox-gl-rtl-text": "0.2.3", "@mdi/js": "^7.4.47", "@photo-sphere-viewer/core": "^5.11.5", diff --git a/web/src/lib/modals/UserEditModal.svelte b/web/src/lib/modals/UserEditModal.svelte index 26683c4bbb..657f6dee61 100644 --- a/web/src/lib/modals/UserEditModal.svelte +++ b/web/src/lib/modals/UserEditModal.svelte @@ -5,7 +5,19 @@ import { ByteUnit, convertFromBytes, convertToBytes } from '$lib/utils/byte-units'; import { handleError } from '$lib/utils/handle-error'; import { updateUserAdmin, type UserAdminResponseDto } from '@immich/sdk'; - import { Button, Field, HStack, Input, Label, Link, Modal, ModalBody, ModalFooter, Switch, Text } from '@immich/ui'; + import { + Button, + Field, + HStack, + Input, + Link, + Modal, + ModalBody, + ModalFooter, + NumberInput, + Switch, + Text, + } from '@immich/ui'; import { mdiAccountEditOutline } from '@mdi/js'; import { t } from 'svelte-i18n'; @@ -21,15 +33,19 @@ let email = $derived(user.email); let storageLabel = $derived(user.storageLabel || ''); - let quotaSize = $state(user.quotaSizeInBytes === null ? null : convertFromBytes(user.quotaSizeInBytes, ByteUnit.GiB)); - const previousQuota = user.quotaSizeInBytes; + let quotaSize = $state( + typeof user.quotaSizeInBytes === 'number' ? convertFromBytes(user.quotaSizeInBytes, ByteUnit.GiB) : undefined, + ); + + const quotaSizeBytes = $derived(typeof quotaSize === 'number' ? convertToBytes(quotaSize, ByteUnit.GiB) : null); + let quotaSizeWarning = $derived( - previousQuota !== convertToBytes(Number(quotaSize), ByteUnit.GiB) && - !!quotaSize && + previousQuota !== quotaSizeBytes && + !!quotaSizeBytes && userInteraction.serverInfo && - convertToBytes(Number(quotaSize), ByteUnit.GiB) > userInteraction.serverInfo.diskSizeRaw, + quotaSizeBytes > userInteraction.serverInfo.diskSizeRaw, ); const handleEditUser = async () => { @@ -40,7 +56,7 @@ email, name, storageLabel, - quotaSizeInBytes: quotaSize === null ? null : convertToBytes(Number(quotaSize), ByteUnit.GiB), + quotaSizeInBytes: typeof quotaSize === 'number' ? convertToBytes(quotaSize, ByteUnit.GiB) : null, isAdmin, }, }); @@ -68,22 +84,12 @@ -
- - + + {#if quotaSizeWarning} {$t('errors.quota_higher_than_disk_size')} {/if} -
+