From f2270ad7573c14734c333b6b36fcae6a71b4ec9a Mon Sep 17 00:00:00 2001 From: martin <74269598+martabal@users.noreply.github.com> Date: Thu, 14 Dec 2023 17:55:15 +0100 Subject: [PATCH] fix(web): user management responsive design (#5698) * fix: user management tailwind * use top instead of inset-y-0 * add types to createEventDispatcher --- .../settings/ffmpeg/ffmpeg-settings.svelte | 12 ++- .../settings/job-settings/job-settings.svelte | 12 ++- .../library-settings/library-settings.svelte | 12 ++- .../machine-learning-settings.svelte | 12 ++- .../settings/map-settings/map-settings.svelte | 12 ++- .../new-version-check-settings.svelte | 12 ++- .../settings/oauth/oauth-settings.svelte | 12 ++- .../password-login-settings.svelte | 12 ++- .../settings/setting-buttons-row.svelte | 10 +- .../storage-template-settings.svelte | 12 ++- .../settings/theme/theme-settings.svelte | 12 ++- .../thumbnail/thumbnail-settings.svelte | 12 ++- .../trash-settings/trash-settings.svelte | 12 ++- .../asset-viewer/activity-viewer.svelte | 7 +- .../asset-viewer/asset-viewer.svelte | 6 +- .../asset-viewer/detail-panel.svelte | 14 ++- .../asset-viewer/intersection-observer.svelte | 8 +- .../components/forms/edit-album-form.svelte | 7 +- .../components/forms/edit-user-form.svelte | 19 +++- .../lib/components/forms/login-form.svelte | 7 +- .../actions/create-shared-link.svelte | 4 +- .../photos-page/actions/delete-assets.svelte | 4 +- .../album-selection-modal.svelte | 13 ++- .../shared-components/base-modal.svelte | 5 +- .../create-shared-link-modal.svelte | 5 +- .../asset-selection-viewer.svelte | 4 +- .../navigation-bar/account-info-panel.svelte | 5 +- .../navigation-bar/avatar-selector.svelte | 5 +- .../navigation-bar/navigation-bar.svelte | 4 +- .../profile-image-cropper.svelte | 4 +- .../shared-components/show-shortcuts.svelte | 4 +- .../side-bar/side-bar-button.svelte | 4 +- .../user-settings-page/device-card.svelte | 4 +- web/src/lib/utils/dipatch.ts | 3 + web/src/routes/(user)/albums/+page.svelte | 2 +- .../routes/admin/user-management/+page.svelte | 100 +++++------------- 36 files changed, 257 insertions(+), 135 deletions(-) create mode 100644 web/src/lib/utils/dipatch.ts diff --git a/web/src/lib/components/admin-page/settings/ffmpeg/ffmpeg-settings.svelte b/web/src/lib/components/admin-page/settings/ffmpeg/ffmpeg-settings.svelte index f22538d943..a4b55dccb1 100644 --- a/web/src/lib/components/admin-page/settings/ffmpeg/ffmpeg-settings.svelte +++ b/web/src/lib/components/admin-page/settings/ffmpeg/ffmpeg-settings.svelte @@ -22,6 +22,7 @@ import SettingAccordion from '../setting-accordion.svelte'; import { mdiHelpCircleOutline } from '@mdi/js'; import Icon from '$lib/components/elements/icon.svelte'; + import type { ResetOptions } from '$lib/utils/dipatch'; export let ffmpegConfig: SystemConfigFFmpegDto; // this is the config that is being edited export let disabled = false; @@ -63,6 +64,14 @@ } } + const handleReset = (detail: ResetOptions) => { + if (detail.default) { + resetToDefault(); + } else { + reset(); + } + }; + async function reset() { const { data: resetConfig } = await api.systemConfigApi.getConfig(); @@ -354,9 +363,8 @@
handleReset(detail)} on:save={saveSetting} - on:reset-to-default={resetToDefault} showResetToDefault={!isEqual(savedConfig, defaultConfig)} {disabled} /> diff --git a/web/src/lib/components/admin-page/settings/job-settings/job-settings.svelte b/web/src/lib/components/admin-page/settings/job-settings/job-settings.svelte index c945d5c9e4..f102e791d0 100644 --- a/web/src/lib/components/admin-page/settings/job-settings/job-settings.svelte +++ b/web/src/lib/components/admin-page/settings/job-settings/job-settings.svelte @@ -9,6 +9,7 @@ import { handleError } from '../../../../utils/handle-error'; import SettingButtonsRow from '../setting-buttons-row.svelte'; import SettingInputField, { SettingInputFieldType } from '../setting-input-field.svelte'; + import type { ResetOptions } from '$lib/utils/dipatch'; export let jobConfig: SystemConfigJobDto; // this is the config that is being edited export let disabled = false; @@ -29,6 +30,14 @@ JobName.Migration, ]; + const handleReset = (detail: ResetOptions) => { + if (detail.default) { + resetToDefault(); + } else { + reset(); + } + }; + async function getConfigs() { [savedConfig, defaultConfig] = await Promise.all([ api.systemConfigApi.getConfig().then((res) => res.data.job), @@ -101,9 +110,8 @@
handleReset(detail)} on:save={saveSetting} - on:reset-to-default={resetToDefault} showResetToDefault={!isEqual(savedConfig, defaultConfig)} {disabled} /> diff --git a/web/src/lib/components/admin-page/settings/library-settings/library-settings.svelte b/web/src/lib/components/admin-page/settings/library-settings/library-settings.svelte index 698f2fc358..46901b0011 100644 --- a/web/src/lib/components/admin-page/settings/library-settings/library-settings.svelte +++ b/web/src/lib/components/admin-page/settings/library-settings/library-settings.svelte @@ -11,6 +11,7 @@ import { fade } from 'svelte/transition'; import { handleError } from '../../../../utils/handle-error'; import SettingAccordion from '../setting-accordion.svelte'; + import type { ResetOptions } from '$lib/utils/dipatch'; export let libraryConfig: SystemConfigLibraryDto; // this is the config that is being edited export let disabled = false; @@ -25,6 +26,14 @@ let savedConfig: SystemConfigLibraryDto; let defaultConfig: SystemConfigLibraryDto; + const handleReset = (detail: ResetOptions) => { + if (detail.default) { + resetToDefault(); + } else { + reset(); + } + }; + async function getConfigs() { [savedConfig, defaultConfig] = await Promise.all([ api.systemConfigApi.getConfig().then((res) => res.data.library), @@ -131,9 +140,8 @@
handleReset(detail)} on:save={saveSetting} - on:reset-to-default={resetToDefault} showResetToDefault={!isEqual(savedConfig, defaultConfig)} {disabled} /> diff --git a/web/src/lib/components/admin-page/settings/machine-learning-settings/machine-learning-settings.svelte b/web/src/lib/components/admin-page/settings/machine-learning-settings/machine-learning-settings.svelte index be6eb41351..ad65eb0c1d 100644 --- a/web/src/lib/components/admin-page/settings/machine-learning-settings/machine-learning-settings.svelte +++ b/web/src/lib/components/admin-page/settings/machine-learning-settings/machine-learning-settings.svelte @@ -12,6 +12,7 @@ import SettingSwitch from '../setting-switch.svelte'; import SettingAccordion from '../setting-accordion.svelte'; import SettingSelect from '../setting-select.svelte'; + import type { ResetOptions } from '$lib/utils/dipatch'; export let machineLearningConfig: SystemConfigMachineLearningDto; // this is the config that is being edited export let disabled = false; @@ -33,6 +34,14 @@ notificationController.show({ message: 'Reset to the last saved settings', type: NotificationType.Info }); } + const handleReset = (detail: ResetOptions) => { + if (detail.default) { + resetToDefault(); + } else { + reset(); + } + }; + async function saveSetting() { try { const { data: current } = await api.systemConfigApi.getConfig(); @@ -212,9 +221,8 @@ handleReset(detail)} on:save={saveSetting} - on:reset-to-default={resetToDefault} showResetToDefault={!isEqual(savedConfig, defaultConfig)} {disabled} /> diff --git a/web/src/lib/components/admin-page/settings/map-settings/map-settings.svelte b/web/src/lib/components/admin-page/settings/map-settings/map-settings.svelte index fe2f879690..0375dab0b7 100644 --- a/web/src/lib/components/admin-page/settings/map-settings/map-settings.svelte +++ b/web/src/lib/components/admin-page/settings/map-settings/map-settings.svelte @@ -11,6 +11,7 @@ import SettingButtonsRow from '../setting-buttons-row.svelte'; import SettingSwitch from '../setting-switch.svelte'; import SettingInputField, { SettingInputFieldType } from '../setting-input-field.svelte'; + import type { ResetOptions } from '$lib/utils/dipatch'; export let config: SystemConfigDto; // this is the config that is being edited export let disabled = false; @@ -18,6 +19,14 @@ let savedConfig: SystemConfigDto; let defaultConfig: SystemConfigDto; + const handleReset = (detail: ResetOptions) => { + if (detail.default) { + resetToDefault(); + } else { + reset(); + } + }; + async function refreshConfig() { [savedConfig, defaultConfig] = await Promise.all([ api.systemConfigApi.getConfig().then((res) => res.data), @@ -133,9 +142,8 @@ > handleReset(detail)} on:save={saveSetting} - on:reset-to-default={resetToDefault} showResetToDefault={!isEqual( { ...savedConfig.map, ...savedConfig.reverseGeocoding }, { ...defaultConfig.map, ...defaultConfig.reverseGeocoding }, diff --git a/web/src/lib/components/admin-page/settings/new-version-check-settings/new-version-check-settings.svelte b/web/src/lib/components/admin-page/settings/new-version-check-settings/new-version-check-settings.svelte index 7568ef60a5..7a88bcc065 100644 --- a/web/src/lib/components/admin-page/settings/new-version-check-settings/new-version-check-settings.svelte +++ b/web/src/lib/components/admin-page/settings/new-version-check-settings/new-version-check-settings.svelte @@ -9,6 +9,7 @@ import { fade } from 'svelte/transition'; import SettingButtonsRow from '../setting-buttons-row.svelte'; import SettingSwitch from '../setting-switch.svelte'; + import type { ResetOptions } from '$lib/utils/dipatch'; export let newVersionCheckConfig: SystemConfigNewVersionCheckDto; // this is the config that is being edited @@ -22,6 +23,14 @@ ]); } + const handleReset = (detail: ResetOptions) => { + if (detail.default) { + resetToDefault(); + } else { + reset(); + } + }; + async function saveSetting() { try { const { data: configs } = await api.systemConfigApi.getConfig(); @@ -79,9 +88,8 @@ bind:checked={newVersionCheckConfig.enabled} /> handleReset(detail)} on:save={saveSetting} - on:reset-to-default={resetToDefault} showResetToDefault={!isEqual(savedConfig, defaultConfig)} />
diff --git a/web/src/lib/components/admin-page/settings/oauth/oauth-settings.svelte b/web/src/lib/components/admin-page/settings/oauth/oauth-settings.svelte index a9f2c27139..098acc0146 100644 --- a/web/src/lib/components/admin-page/settings/oauth/oauth-settings.svelte +++ b/web/src/lib/components/admin-page/settings/oauth/oauth-settings.svelte @@ -11,6 +11,7 @@ import SettingButtonsRow from '../setting-buttons-row.svelte'; import SettingInputField, { SettingInputFieldType } from '../setting-input-field.svelte'; import SettingSwitch from '../setting-switch.svelte'; + import type { ResetOptions } from '$lib/utils/dipatch'; export let oauthConfig: SystemConfigOAuthDto; export let disabled = false; @@ -18,6 +19,14 @@ let savedConfig: SystemConfigOAuthDto; let defaultConfig: SystemConfigOAuthDto; + const handleReset = (detail: ResetOptions) => { + if (detail.default) { + resetToDefault(); + } else { + reset(); + } + }; + const handleToggleOverride = () => { // click runs before bind const previouslyEnabled = oauthConfig.mobileOverrideEnabled; @@ -209,9 +218,8 @@ {/if} handleReset(detail)} on:save={saveSetting} - on:reset-to-default={resetToDefault} showResetToDefault={!isEqual(savedConfig, defaultConfig)} {disabled} /> diff --git a/web/src/lib/components/admin-page/settings/password-login/password-login-settings.svelte b/web/src/lib/components/admin-page/settings/password-login/password-login-settings.svelte index 0b5f7a16c0..ec8a748fc2 100644 --- a/web/src/lib/components/admin-page/settings/password-login/password-login-settings.svelte +++ b/web/src/lib/components/admin-page/settings/password-login/password-login-settings.svelte @@ -10,6 +10,7 @@ import ConfirmDisableLogin from '../confirm-disable-login.svelte'; import SettingButtonsRow from '../setting-buttons-row.svelte'; import SettingSwitch from '../setting-switch.svelte'; + import type { ResetOptions } from '$lib/utils/dipatch'; export let passwordLoginConfig: SystemConfigPasswordLoginDto; // this is the config that is being edited export let disabled = false; @@ -17,6 +18,14 @@ let savedConfig: SystemConfigPasswordLoginDto; let defaultConfig: SystemConfigPasswordLoginDto; + const handleReset = (detail: ResetOptions) => { + if (detail.default) { + resetToDefault(); + } else { + reset(); + } + }; + async function getConfigs() { [savedConfig, defaultConfig] = await Promise.all([ api.systemConfigApi.getConfig().then((res) => res.data.passwordLogin), @@ -107,9 +116,8 @@ /> handleReset(detail)} on:save={saveSetting} - on:reset-to-default={resetToDefault} showResetToDefault={!isEqual(savedConfig, defaultConfig)} {disabled} /> diff --git a/web/src/lib/components/admin-page/settings/setting-buttons-row.svelte b/web/src/lib/components/admin-page/settings/setting-buttons-row.svelte index 3931d41eb2..a367832cc1 100644 --- a/web/src/lib/components/admin-page/settings/setting-buttons-row.svelte +++ b/web/src/lib/components/admin-page/settings/setting-buttons-row.svelte @@ -1,8 +1,12 @@
+
+ dispatch('close')} /> +
+
diff --git a/web/src/lib/components/forms/login-form.svelte b/web/src/lib/components/forms/login-form.svelte index 111e6c3fda..ef7d9b0b1e 100644 --- a/web/src/lib/components/forms/login-form.svelte +++ b/web/src/lib/components/forms/login-form.svelte @@ -16,7 +16,10 @@ let loading = false; let oauthLoading = true; - const dispatch = createEventDispatcher(); + const dispatch = createEventDispatcher<{ + success: void; + firstLogin: void; + }>(); onMount(async () => { if (!$featureFlags.oauth) { @@ -62,7 +65,7 @@ }); if (!data.isAdmin && data.shouldChangePassword) { - dispatch('first-login'); + dispatch('firstLogin'); return; } diff --git a/web/src/lib/components/photos-page/actions/create-shared-link.svelte b/web/src/lib/components/photos-page/actions/create-shared-link.svelte index 29200800f9..6e700807af 100644 --- a/web/src/lib/components/photos-page/actions/create-shared-link.svelte +++ b/web/src/lib/components/photos-page/actions/create-shared-link.svelte @@ -6,7 +6,9 @@ import { getAssetControlContext } from '../asset-select-control-bar.svelte'; let showModal = false; - const dispatch = createEventDispatcher(); + const dispatch = createEventDispatcher<{ + escape: void; + }>(); const { getAssets } = getAssetControlContext(); const escape = () => { dispatch('escape'); diff --git a/web/src/lib/components/photos-page/actions/delete-assets.svelte b/web/src/lib/components/photos-page/actions/delete-assets.svelte index 68d133ae97..02fbdaeed3 100644 --- a/web/src/lib/components/photos-page/actions/delete-assets.svelte +++ b/web/src/lib/components/photos-page/actions/delete-assets.svelte @@ -19,7 +19,9 @@ const { clearSelect, getOwnedAssets } = getAssetControlContext(); - const dispatch = createEventDispatcher(); + const dispatch = createEventDispatcher<{ + escape: void; + }>(); let isShowConfirmation = false; let loading = false; diff --git a/web/src/lib/components/shared-components/album-selection-modal.svelte b/web/src/lib/components/shared-components/album-selection-modal.svelte index 27460ba2aa..6def8c4ef7 100644 --- a/web/src/lib/components/shared-components/album-selection-modal.svelte +++ b/web/src/lib/components/shared-components/album-selection-modal.svelte @@ -12,7 +12,18 @@ let loading = true; let search = ''; - const dispatch = createEventDispatcher(); + const dispatch = createEventDispatcher<{ + newAlbum: { + albumName: string; + }; + album: { + album: AlbumResponseDto; + }; + newSharedAlbum: { + albumName: string; + }; + close: void; + }>(); export let shared: boolean; diff --git a/web/src/lib/components/shared-components/base-modal.svelte b/web/src/lib/components/shared-components/base-modal.svelte index 7b466a333b..a1aae869f7 100644 --- a/web/src/lib/components/shared-components/base-modal.svelte +++ b/web/src/lib/components/shared-components/base-modal.svelte @@ -7,7 +7,10 @@ import { clickOutside } from '$lib/utils/click-outside'; import { mdiClose } from '@mdi/js'; - const dispatch = createEventDispatcher(); + const dispatch = createEventDispatcher<{ + escape: void; + close: void; + }>(); export let zIndex = 9999; export let ignoreClickOutside = false; diff --git a/web/src/lib/components/shared-components/create-share-link-modal/create-shared-link-modal.svelte b/web/src/lib/components/shared-components/create-share-link-modal/create-shared-link-modal.svelte index 970ae63175..cec2686c7e 100644 --- a/web/src/lib/components/shared-components/create-share-link-modal/create-shared-link-modal.svelte +++ b/web/src/lib/components/shared-components/create-share-link-modal/create-shared-link-modal.svelte @@ -29,7 +29,10 @@ let canCopyImagesToClipboard = true; let enablePassword = false; - const dispatch = createEventDispatcher(); + const dispatch = createEventDispatcher<{ + close: void; + escape: void; + }>(); const expiredDateOption: ImmichDropDownOption = { default: 'Never', diff --git a/web/src/lib/components/shared-components/gallery-viewer/asset-selection-viewer.svelte b/web/src/lib/components/shared-components/gallery-viewer/asset-selection-viewer.svelte index 067971c0af..75e9ad8c5a 100644 --- a/web/src/lib/components/shared-components/gallery-viewer/asset-selection-viewer.svelte +++ b/web/src/lib/components/shared-components/gallery-viewer/asset-selection-viewer.svelte @@ -11,7 +11,9 @@ let viewWidth: number; $: thumbnailSize = getThumbnailSize(assets.length, viewWidth); - let dispatch = createEventDispatcher(); + let dispatch = createEventDispatcher<{ + select: { asset: AssetResponseDto; selectedAssets: Set }; + }>(); const selectAssetHandler = (event: CustomEvent) => { const { asset }: { asset: AssetResponseDto } = event.detail; diff --git a/web/src/lib/components/shared-components/navigation-bar/account-info-panel.svelte b/web/src/lib/components/shared-components/navigation-bar/account-info-panel.svelte index 938fe157eb..0c790c2851 100644 --- a/web/src/lib/components/shared-components/navigation-bar/account-info-panel.svelte +++ b/web/src/lib/components/shared-components/navigation-bar/account-info-panel.svelte @@ -16,7 +16,10 @@ let isShowSelectAvatar = false; - const dispatch = createEventDispatcher(); + const dispatch = createEventDispatcher<{ + logout: void; + close: void; + }>(); const handleSaveProfile = async (color: UserAvatarColor) => { try { diff --git a/web/src/lib/components/shared-components/navigation-bar/avatar-selector.svelte b/web/src/lib/components/shared-components/navigation-bar/avatar-selector.svelte index 6d7e395785..a29d436179 100644 --- a/web/src/lib/components/shared-components/navigation-bar/avatar-selector.svelte +++ b/web/src/lib/components/shared-components/navigation-bar/avatar-selector.svelte @@ -8,7 +8,10 @@ export let user: UserResponseDto; - const dispatch = createEventDispatcher(); + const dispatch = createEventDispatcher<{ + close: void; + choose: UserAvatarColor; + }>(); const colors: UserAvatarColor[] = Object.values(UserAvatarColor); diff --git a/web/src/lib/components/shared-components/navigation-bar/navigation-bar.svelte b/web/src/lib/components/shared-components/navigation-bar/navigation-bar.svelte index 608e806248..c6fa67cf18 100644 --- a/web/src/lib/components/shared-components/navigation-bar/navigation-bar.svelte +++ b/web/src/lib/components/shared-components/navigation-bar/navigation-bar.svelte @@ -23,7 +23,9 @@ let shouldShowAccountInfo = false; let shouldShowAccountInfoPanel = false; - const dispatch = createEventDispatcher(); + const dispatch = createEventDispatcher<{ + uploadClicked: void; + }>(); const logOut = async () => { const { data } = await api.authenticationApi.logout(); diff --git a/web/src/lib/components/shared-components/profile-image-cropper.svelte b/web/src/lib/components/shared-components/profile-image-cropper.svelte index cd0e917d51..c8544ef0ac 100644 --- a/web/src/lib/components/shared-components/profile-image-cropper.svelte +++ b/web/src/lib/components/shared-components/profile-image-cropper.svelte @@ -10,7 +10,9 @@ export let asset: AssetResponseDto; - const dispatch = createEventDispatcher(); + const dispatch = createEventDispatcher<{ + close: void; + }>(); let imgElement: HTMLDivElement; onMount(() => { diff --git a/web/src/lib/components/shared-components/show-shortcuts.svelte b/web/src/lib/components/shared-components/show-shortcuts.svelte index e0f1f0974e..2f725f1a45 100644 --- a/web/src/lib/components/shared-components/show-shortcuts.svelte +++ b/web/src/lib/components/shared-components/show-shortcuts.svelte @@ -19,7 +19,9 @@ { key: ['Del'], action: 'Delete Asset' }, ], }; - const dispatch = createEventDispatcher(); + const dispatch = createEventDispatcher<{ + close: void; + }>(); dispatch('close')} on:escape={() => dispatch('close')}> diff --git a/web/src/lib/components/shared-components/side-bar/side-bar-button.svelte b/web/src/lib/components/shared-components/side-bar/side-bar-button.svelte index a23eeed032..fbefb2eb5c 100644 --- a/web/src/lib/components/shared-components/side-bar/side-bar-button.svelte +++ b/web/src/lib/components/shared-components/side-bar/side-bar-button.svelte @@ -11,7 +11,9 @@ let showMoreInformation = false; - const dispatch = createEventDispatcher(); + const dispatch = createEventDispatcher<{ + selected: void; + }>(); const onButtonClicked = () => dispatch('selected'); diff --git a/web/src/lib/components/user-settings-page/device-card.svelte b/web/src/lib/components/user-settings-page/device-card.svelte index 3cbcd841ba..9558efe388 100644 --- a/web/src/lib/components/user-settings-page/device-card.svelte +++ b/web/src/lib/components/user-settings-page/device-card.svelte @@ -17,7 +17,9 @@ export let device: AuthDeviceResponseDto; - const dispatcher = createEventDispatcher(); + const dispatcher = createEventDispatcher<{ + delete: void; + }>(); const options: ToRelativeCalendarOptions = { unit: 'days', diff --git a/web/src/lib/utils/dipatch.ts b/web/src/lib/utils/dipatch.ts new file mode 100644 index 0000000000..6e3457eaa9 --- /dev/null +++ b/web/src/lib/utils/dipatch.ts @@ -0,0 +1,3 @@ +export interface ResetOptions { + default?: boolean; +} diff --git a/web/src/routes/(user)/albums/+page.svelte b/web/src/routes/(user)/albums/+page.svelte index 9a4424e796..0c56f690cd 100644 --- a/web/src/routes/(user)/albums/+page.svelte +++ b/web/src/routes/(user)/albums/+page.svelte @@ -239,7 +239,7 @@ (shouldShowEditUserForm = false)}> successModifyAlbum()} + on:editSuccess={() => successModifyAlbum()} on:cancel={() => (shouldShowEditUserForm = false)} /> diff --git a/web/src/routes/admin/user-management/+page.svelte b/web/src/routes/admin/user-management/+page.svelte index 2545bb25a8..ed631c25ff 100644 --- a/web/src/routes/admin/user-management/+page.svelte +++ b/web/src/routes/admin/user-management/+page.svelte @@ -107,7 +107,7 @@
-
+
{#if shouldShowCreateUserForm} (shouldShowCreateUserForm = false)}> (shouldShowCreateUserForm = false)} /> @@ -119,8 +119,9 @@ (shouldShowEditUserForm = false)} /> {/if} @@ -163,32 +164,34 @@ {/if} - + - - - - + + + + {#if allUsers} {#each allUsers as immichUser, i} - - - + + - - - {/each} - {/if} - -
EmailNameCan importActionEmailAction
{immichUser.email}{immichUser.name} + {immichUser.email} + {#if !isDeleted(immichUser)} {#if immichUser.id !== $user.id} @@ -218,62 +221,7 @@ - {/if} -
- - - - - - - - - - - {#if allUsers} - {#each allUsers as user, i} - - - -
NameEmailAction
{user.name}{user.email} - {#if !isDeleted(user)} - - - {/if} - {#if isDeleted(user)} -