diff --git a/web/src/lib/modals/AssetChangeDateModal.svelte b/web/src/lib/modals/AssetChangeDateModal.svelte index 7034493924..e94f1f7afc 100644 --- a/web/src/lib/modals/AssetChangeDateModal.svelte +++ b/web/src/lib/modals/AssetChangeDateModal.svelte @@ -5,7 +5,7 @@ import { getPreferredTimeZone, getTimezones, toIsoDate } from '$lib/modals/timezone-utils'; import { handleError } from '$lib/utils/handle-error'; import { updateAsset } from '@immich/sdk'; - import { Button, HStack, Label, Modal, ModalBody, ModalFooter } from '@immich/ui'; + import { FormModal, Label } from '@immich/ui'; import { mdiCalendarEdit } from '@mdi/js'; import { DateTime } from 'luxon'; import { t } from 'svelte-i18n'; @@ -28,7 +28,7 @@ // the offsets (and validity) for time zones may change if the date is changed, which is why we recompute the list let selectedOption = $derived(getPreferredTimeZone(initialDate, initialTimeZone, timezones, lastSelectedTimezone)); - const handleClose = async () => { + const onSubmit = async () => { if (!date.isValid || !selectedOption) { onClose(false); return; @@ -49,25 +49,25 @@ const date = $derived(DateTime.fromISO(selectedDate, { zone: selectedOption?.value, setZone: true })); - onClose(false)} size="small"> - - {$t('date_and_time')} - - {#if timezoneInput} - - - - {/if} - - - - onClose(false)}>{$t('cancel')} - {$t('confirm')} - - - + onClose(false)} + {onSubmit} + submitText={$t('confirm')} + disabled={!date.isValid || !selectedOption} + size="small" +> + {$t('date_and_time')} + + {#if timezoneInput} + + + + {/if} + diff --git a/web/src/lib/modals/AssetSelectionChangeDateModal.spec.ts b/web/src/lib/modals/AssetSelectionChangeDateModal.spec.ts index 65b77ce5cf..dfb86b6744 100644 --- a/web/src/lib/modals/AssetSelectionChangeDateModal.spec.ts +++ b/web/src/lib/modals/AssetSelectionChangeDateModal.spec.ts @@ -17,8 +17,8 @@ describe('DateSelectionModal component', () => { const getRelativeInputToggle = () => screen.getByTestId('edit-by-offset-switch'); const getDateInput = () => screen.getByLabelText('date_and_time') as HTMLInputElement; const getTimeZoneInput = () => screen.getByLabelText('timezone') as HTMLInputElement; - const getCancelButton = () => screen.getByText('cancel'); - const getConfirmButton = () => screen.getByText('confirm'); + const getCancelButton = () => screen.getByRole('button', { name: /cancel/i }); + const getConfirmButton = () => screen.getByRole('button', { name: /confirm/i }); beforeEach(() => { vi.stubGlobal('IntersectionObserver', getIntersectionObserverMock()); diff --git a/web/src/lib/modals/AssetSelectionChangeDateModal.svelte b/web/src/lib/modals/AssetSelectionChangeDateModal.svelte index 8eb1a481cc..e60e4cb8a5 100644 --- a/web/src/lib/modals/AssetSelectionChangeDateModal.svelte +++ b/web/src/lib/modals/AssetSelectionChangeDateModal.svelte @@ -8,7 +8,7 @@ import { getOwnedAssetsWithWarning } from '$lib/utils/asset-utils'; import { handleError } from '$lib/utils/handle-error'; import { updateAssets } from '@immich/sdk'; - import { Button, Field, HStack, Label, Modal, ModalBody, ModalFooter, Switch } from '@immich/ui'; + import { Field, FormModal, Label, Switch } from '@immich/ui'; import { mdiCalendarEdit } from '@mdi/js'; import { DateTime } from 'luxon'; import { t } from 'svelte-i18n'; @@ -30,7 +30,7 @@ // the offsets (and validity) for time zones may change if the date is changed, which is why we recompute the list let selectedOption = $derived(getPreferredTimeZone(initialDate, initialTimeZone, timezones, lastSelectedTimezone)); - const handleConfirm = async () => { + const onSubmit = async () => { const ids = getOwnedAssetsWithWarning(assets, $user); try { if (showRelative && (selectedDuration || selectedOption)) { @@ -63,66 +63,62 @@ const date = $derived(DateTime.fromISO(selectedDate, { zone: selectedOption?.value, setZone: true })); - onClose(false)} size="small"> - - - - - {#if showRelative} - {$t('offset')} - - {:else} - {$t('date_and_time')} - - {/if} - - (lastSelectedTimezone = option as ZoneOption)} - > - - - - - - onClose(false)}> - {$t('cancel')} - - - {$t('confirm')} - - - - + onClose(false)} + {onSubmit} + submitText={$t('confirm')} + disabled={!date.isValid} + size="small" +> + + + + {#if showRelative} + {$t('offset')} + + {:else} + {$t('date_and_time')} + + {/if} + + (lastSelectedTimezone = option as ZoneOption)} + > + + + diff --git a/web/src/lib/modals/NavigateToDateModal.svelte b/web/src/lib/modals/NavigateToDateModal.svelte index 365cbdb21c..51f968c6df 100644 --- a/web/src/lib/modals/NavigateToDateModal.svelte +++ b/web/src/lib/modals/NavigateToDateModal.svelte @@ -3,10 +3,11 @@ import { TimelineManager } from '$lib/managers/timeline-manager/timeline-manager.svelte'; import type { TimelineAsset } from '$lib/managers/timeline-manager/types'; import { getPreferredTimeZone, getTimezones, toDatetime, type ZoneOption } from '$lib/modals/timezone-utils'; - import { Button, HStack, Modal, ModalBody, ModalFooter, VStack } from '@immich/ui'; + import { FormModal, HStack, VStack } from '@immich/ui'; import { mdiNavigationVariantOutline } from '@mdi/js'; import { DateTime } from 'luxon'; import { t } from 'svelte-i18n'; + interface Props { timelineManager: TimelineManager; onClose: (asset?: TimelineAsset) => void; @@ -20,7 +21,7 @@ // the offsets (and validity) for time zones may change if the date is changed, which is why we recompute the list let selectedOption: ZoneOption | undefined = $derived(getPreferredTimeZone(initialDate, undefined, timezones)); - const handleClose = async () => { + const onSubmit = async () => { if (!date.isValid || !selectedOption) { onClose(); return; @@ -36,26 +37,26 @@ const date = $derived(DateTime.fromISO(selectedDate, { zone: selectedOption?.value, setZone: true })); - onClose()}> - - - - {$t('date_and_time')} - - - - - - - + onClose()} + {onSubmit} + submitText={$t('confirm')} + disabled={!date.isValid || !selectedOption} + size="medium" +> + - onClose()}>{$t('cancel')} - {$t('confirm')} + {$t('date_and_time')} - - + + + + +