diff --git a/web/src/lib/components/forms/api-key-form.svelte b/web/src/lib/components/forms/api-key-form.svelte deleted file mode 100644 index bba7398655..0000000000 --- a/web/src/lib/components/forms/api-key-form.svelte +++ /dev/null @@ -1,55 +0,0 @@ - - - onCancel()}> - - - {$t('name')} - - - - - {#snippet stickyBottom()} - onCancel()}>{cancelText} - {submitText} - {/snippet} - diff --git a/web/src/lib/components/forms/api-key-secret.svelte b/web/src/lib/components/forms/api-key-secret.svelte deleted file mode 100644 index 0d3b88d85a..0000000000 --- a/web/src/lib/components/forms/api-key-secret.svelte +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - {$t('api_key_description')} - - - - - - - - - {#snippet stickyBottom()} - copyToClipboard(secret)} fullWidth>{$t('copy_to_clipboard')} - {$t('done')} - {/snippet} - diff --git a/web/src/lib/components/user-settings-page/partner-selection-modal.svelte b/web/src/lib/components/user-settings-page/partner-selection-modal.svelte deleted file mode 100644 index 37c6580429..0000000000 --- a/web/src/lib/components/user-settings-page/partner-selection-modal.svelte +++ /dev/null @@ -1,79 +0,0 @@ - - - - - {#if availableUsers.length > 0} - {#each availableUsers as user (user.id)} - selectUser(user)} - class="flex w-full place-items-center gap-4 px-5 py-4 transition-all hover:bg-gray-200 dark:hover:bg-gray-700 rounded-xl" - > - {#if selectedUsers.includes(user)} - ✓ - {:else} - - {/if} - - - - {user.name} - - - {user.email} - - - - {/each} - {:else} - - {$t('photo_shared_all_users')} - - {/if} - - {#if selectedUsers.length > 0} - - onAddUsers(selectedUsers)}>{$t('add')} - - {/if} - - diff --git a/web/src/lib/components/user-settings-page/partner-settings.svelte b/web/src/lib/components/user-settings-page/partner-settings.svelte index b2238b84e2..9d187b6adf 100644 --- a/web/src/lib/components/user-settings-page/partner-settings.svelte +++ b/web/src/lib/components/user-settings-page/partner-settings.svelte @@ -2,6 +2,8 @@ import { dialogController } from '$lib/components/shared-components/dialog/dialog'; import SettingSwitch from '$lib/components/shared-components/settings/setting-switch.svelte'; import UserAvatar from '$lib/components/shared-components/user-avatar.svelte'; + import { modalManager } from '$lib/managers/modal-manager.svelte'; + import PartnerSelectionModal from '$lib/modals/PartnerSelectionModal.svelte'; import { createPartner, getPartners, @@ -18,7 +20,6 @@ import { handleError } from '../../utils/handle-error'; import CircleIconButton from '../elements/buttons/circle-icon-button.svelte'; import Icon from '../elements/icon.svelte'; - import PartnerSelectionModal from './partner-selection-modal.svelte'; interface PartnerSharing { user: UserResponseDto; @@ -33,8 +34,6 @@ let { user }: Props = $props(); - let createPartnerFlag = $state(false); - // let removePartnerDto: PartnerResponseDto | null = null; let partners: Array = $state([]); onMount(async () => { @@ -99,14 +98,19 @@ } }; - const handleCreatePartners = async (users: UserResponseDto[]) => { + const handleCreatePartners = async () => { + const users = await modalManager.open(PartnerSelectionModal, { user }); + + if (!users) { + return; + } + try { for (const user of users) { await createPartner({ id: user.id }); } await refreshPartners(); - createPartnerFlag = false; } catch (error) { handleError(error, $t('errors.unable_to_add_partners')); } @@ -189,10 +193,6 @@ {/if} - (createPartnerFlag = true)}>{$t('add_partner')} + handleCreatePartners()}>{$t('add_partner')} - -{#if createPartnerFlag} - (createPartnerFlag = false)} onAddUsers={handleCreatePartners} /> -{/if} diff --git a/web/src/lib/components/user-settings-page/user-api-key-list.svelte b/web/src/lib/components/user-settings-page/user-api-key-list.svelte index 6fbc28a776..823f5a0a96 100644 --- a/web/src/lib/components/user-settings-page/user-api-key-list.svelte +++ b/web/src/lib/components/user-settings-page/user-api-key-list.svelte @@ -1,6 +1,9 @@ -{#if newKey} - handleCreate(key)} - onCancel={() => (newKey = null)} - /> -{/if} - -{#if secret} - (secret = '')} /> -{/if} - -{#if editKey} - handleUpdate(key)} - onCancel={() => (editKey = null)} - /> -{/if} - - (newKey = { name: $t('api_key') })}>{$t('new_api_key')} + handleCreate()}>{$t('new_api_key')} {#if keys.length > 0} @@ -153,7 +141,7 @@ icon={mdiPencilOutline} title={$t('edit_key')} size="16" - onclick={() => (editKey = key)} + onclick={() => handleUpdate(key)} /> + import { + notificationController, + NotificationType, + } from '$lib/components/shared-components/notification/notification'; + import { Button, Modal, ModalBody, ModalFooter } from '@immich/ui'; + import { mdiKeyVariant } from '@mdi/js'; + import { t } from 'svelte-i18n'; + + interface Props { + apiKey: { name: string }; + title: string; + cancelText?: string; + submitText?: string; + onClose: (apiKey?: { name: string }) => void; + } + + let { apiKey = $bindable(), title, cancelText = $t('cancel'), submitText = $t('save'), onClose }: Props = $props(); + + const handleSubmit = () => { + if (apiKey.name) { + onClose({ name: apiKey.name }); + } else { + notificationController.show({ + message: $t('api_key_empty'), + type: NotificationType.Warning, + }); + } + }; + + const onsubmit = (event: Event) => { + event.preventDefault(); + handleSubmit(); + }; + + + + + + + {$t('name')} + + + + + + + + onClose()}>{cancelText} + {submitText} + + + diff --git a/web/src/lib/modals/ApiKeySecretModal.svelte b/web/src/lib/modals/ApiKeySecretModal.svelte new file mode 100644 index 0000000000..88d34341d9 --- /dev/null +++ b/web/src/lib/modals/ApiKeySecretModal.svelte @@ -0,0 +1,35 @@ + + + + + + + {$t('api_key_description')} + + + + + + + + + + + + copyToClipboard(secret)} fullWidth>{$t('copy_to_clipboard')} + {$t('done')} + + + diff --git a/web/src/lib/modals/PartnerSelectionModal.svelte b/web/src/lib/modals/PartnerSelectionModal.svelte new file mode 100644 index 0000000000..729a035ef1 --- /dev/null +++ b/web/src/lib/modals/PartnerSelectionModal.svelte @@ -0,0 +1,79 @@ + + + + + + {#if availableUsers.length > 0} + {#each availableUsers as user (user.id)} + selectUser(user)} + class="flex w-full place-items-center gap-4 px-5 py-4 transition-all hover:bg-gray-200 dark:hover:bg-gray-700 rounded-xl" + > + {#if selectedUsers.includes(user)} + ✓ + {:else} + + {/if} + + + + {user.name} + + + {user.email} + + + + {/each} + {:else} + + {$t('photo_shared_all_users')} + + {/if} + + + {#if selectedUsers.length > 0} + onClose(selectedUsers)}>{$t('add')} + {/if} + + + +
- {$t('api_key_description')} -
- {user.name} -
- {user.email} -
- {$t('photo_shared_all_users')} -
+ {$t('api_key_description')} +
+ {user.name} +
+ {user.email} +
+ {$t('photo_shared_all_users')} +