diff --git a/web/src/lib/constants.ts b/web/src/lib/constants.ts index c389ebf2ef..73f272d7fc 100644 --- a/web/src/lib/constants.ts +++ b/web/src/lib/constants.ts @@ -1,3 +1,5 @@ +export const UUID_REGEX = /^[\dA-Fa-f]{8}(?:\b-[\dA-Fa-f]{4}){3}\b-[\dA-Fa-f]{12}$/; + export enum AssetAction { ARCHIVE = 'archive', UNARCHIVE = 'unarchive', @@ -20,6 +22,7 @@ export enum AssetAction { export enum AppRoute { ADMIN_USERS = '/admin/users', + ADMIN_USERS_NEW = '/admin/users/new', ADMIN_LIBRARY_MANAGEMENT = '/admin/library-management', ADMIN_SETTINGS = '/admin/system-settings', ADMIN_STATS = '/admin/server-status', diff --git a/web/src/lib/services/user-admin.service.ts b/web/src/lib/services/user-admin.service.ts index 997a43fc7f..557d01bfb0 100644 --- a/web/src/lib/services/user-admin.service.ts +++ b/web/src/lib/services/user-admin.service.ts @@ -1,8 +1,8 @@ import { goto } from '$app/navigation'; +import { AppRoute } from '$lib/constants'; import { eventManager } from '$lib/managers/event-manager.svelte'; import { serverConfigManager } from '$lib/managers/server-config-manager.svelte'; import PasswordResetSuccessModal from '$lib/modals/PasswordResetSuccessModal.svelte'; -import UserCreateModal from '$lib/modals/UserCreateModal.svelte'; import UserDeleteConfirmModal from '$lib/modals/UserDeleteConfirmModal.svelte'; import UserEditModal from '$lib/modals/UserEditModal.svelte'; import UserRestoreConfirmModal from '$lib/modals/UserRestoreConfirmModal.svelte'; @@ -39,7 +39,7 @@ export const getUserAdminsActions = ($t: MessageFormatter) => { title: $t('create_user'), type: $t('command'), icon: mdiPlusBoxOutline, - onAction: () => modalManager.show(UserCreateModal, {}), + onAction: () => goto(AppRoute.ADMIN_USERS_NEW), shortcuts: { shift: true, key: 'n' }, }; @@ -103,7 +103,7 @@ export const handleCreateUserAdmin = async (dto: UserAdminCreateDto) => { const response = await createUserAdmin({ userAdminCreateDto: dto }); eventManager.emit('UserAdminCreate', response); toastManager.success(); - return true; + return response; } catch (error) { handleError(error, $t('errors.unable_to_create_user')); } diff --git a/web/src/params/id.ts b/web/src/params/id.ts index 6b16a651d1..b7e93be6ae 100644 --- a/web/src/params/id.ts +++ b/web/src/params/id.ts @@ -1,6 +1,7 @@ +import { UUID_REGEX } from '$lib/constants'; import type { ParamMatcher } from '@sveltejs/kit'; /* Returns true if the given param matches UUID format */ export const match: ParamMatcher = (param: string) => { - return /^[\dA-Fa-f]{8}(?:\b-[\dA-Fa-f]{4}){3}\b-[\dA-Fa-f]{12}$/.test(param); + return UUID_REGEX.test(param); }; diff --git a/web/src/routes/admin/users/+page.svelte b/web/src/routes/admin/users/(list)/+layout.svelte similarity index 94% rename from web/src/routes/admin/users/+page.svelte rename to web/src/routes/admin/users/(list)/+layout.svelte index 53d810ba21..8f25307e15 100644 --- a/web/src/routes/admin/users/+page.svelte +++ b/web/src/routes/admin/users/(list)/+layout.svelte @@ -7,14 +7,16 @@ import { searchUsersAdmin, type UserAdminResponseDto } from '@immich/sdk'; import { Button, CommandPaletteContext, Icon } from '@immich/ui'; import { mdiInfinity } from '@mdi/js'; + import type { Snippet } from 'svelte'; import { t } from 'svelte-i18n'; - import type { PageData } from './$types'; + import type { LayoutData } from './$types'; type Props = { - data: PageData; + children?: Snippet; + data: LayoutData; }; - let { data }: Props = $props(); + let { children, data }: Props = $props(); let allUsers: UserAdminResponseDto[] = $state(data.allUsers); @@ -91,3 +93,5 @@ + +{@render children?.()} diff --git a/web/src/routes/admin/users/+page.ts b/web/src/routes/admin/users/(list)/+layout.ts similarity index 87% rename from web/src/routes/admin/users/+page.ts rename to web/src/routes/admin/users/(list)/+layout.ts index 521f8573e1..58be724031 100644 --- a/web/src/routes/admin/users/+page.ts +++ b/web/src/routes/admin/users/(list)/+layout.ts @@ -1,7 +1,7 @@ import { authenticate, requestServerInfo } from '$lib/utils/auth'; import { getFormatter } from '$lib/utils/i18n'; import { searchUsersAdmin } from '@immich/sdk'; -import type { PageLoad } from './$types'; +import type { LayoutLoad } from './$types'; export const load = (async ({ url }) => { await authenticate(url, { admin: true }); @@ -15,4 +15,4 @@ export const load = (async ({ url }) => { title: $t('admin.user_management'), }, }; -}) satisfies PageLoad; +}) satisfies LayoutLoad; diff --git a/web/src/routes/admin/users/(list)/+page.svelte b/web/src/routes/admin/users/(list)/+page.svelte new file mode 100644 index 0000000000..e69de29bb2 diff --git a/web/src/lib/modals/UserCreateModal.svelte b/web/src/routes/admin/users/(list)/new/+page.svelte similarity index 93% rename from web/src/lib/modals/UserCreateModal.svelte rename to web/src/routes/admin/users/(list)/new/+page.svelte index 7dd0449119..2e2a1fbf75 100644 --- a/web/src/lib/modals/UserCreateModal.svelte +++ b/web/src/routes/admin/users/(list)/new/+page.svelte @@ -1,4 +1,6 @@