From c23ca56adb76eb9f670825b2cf167b2c7f3e2c1b Mon Sep 17 00:00:00 2001 From: midzelis Date: Tue, 14 Oct 2025 12:26:16 +0000 Subject: [PATCH] Review comments --- .../timeline/actions/ChangeDateAction.svelte | 39 ++------- .../actions/ChangeDescriptionAction.svelte | 4 +- .../actions/ChangeLocationAction.svelte | 4 +- .../actions/TimelineKeyboardActions.svelte | 13 +-- web/src/lib/elements/DateInput.svelte | 4 +- .../lib/modals/AssetChangeDateModal.svelte | 2 +- .../AssetSelectionChangeDateModal.spec.ts | 17 ++-- .../AssetSelectionChangeDateModal.svelte | 84 +++++++++---------- web/src/lib/modals/NavigateToDateModal.svelte | 23 ++--- web/src/lib/utils/asset-utils.ts | 2 +- 10 files changed, 80 insertions(+), 112 deletions(-) diff --git a/web/src/lib/components/timeline/actions/ChangeDateAction.svelte b/web/src/lib/components/timeline/actions/ChangeDateAction.svelte index 7a84846f9a..b1b1921b5a 100644 --- a/web/src/lib/components/timeline/actions/ChangeDateAction.svelte +++ b/web/src/lib/components/timeline/actions/ChangeDateAction.svelte @@ -1,12 +1,9 @@ {#if menuItem} diff --git a/web/src/lib/components/timeline/actions/ChangeDescriptionAction.svelte b/web/src/lib/components/timeline/actions/ChangeDescriptionAction.svelte index cf16d01172..6a4da927c3 100644 --- a/web/src/lib/components/timeline/actions/ChangeDescriptionAction.svelte +++ b/web/src/lib/components/timeline/actions/ChangeDescriptionAction.svelte @@ -2,7 +2,7 @@ import { getAssetControlContext } from '$lib/components/timeline/AssetSelectControlBar.svelte'; import AssetUpdateDescriptionConfirmModal from '$lib/modals/AssetUpdateDescriptionConfirmModal.svelte'; import { user } from '$lib/stores/user.store'; - import { getSelectedAssets } from '$lib/utils/asset-utils'; + import { getOwnedAssetsWithWarning } from '$lib/utils/asset-utils'; import { handleError } from '$lib/utils/handle-error'; import { updateAssets } from '@immich/sdk'; import { modalManager } from '@immich/ui'; @@ -20,7 +20,7 @@ const handleUpdateDescription = async () => { const description = await modalManager.show(AssetUpdateDescriptionConfirmModal); if (description) { - const ids = getSelectedAssets(getOwnedAssets(), $user); + const ids = getOwnedAssetsWithWarning(getOwnedAssets(), $user); try { await updateAssets({ assetBulkUpdateDto: { ids, description } }); diff --git a/web/src/lib/components/timeline/actions/ChangeLocationAction.svelte b/web/src/lib/components/timeline/actions/ChangeLocationAction.svelte index 2ccfe3704d..bfb10bb382 100644 --- a/web/src/lib/components/timeline/actions/ChangeLocationAction.svelte +++ b/web/src/lib/components/timeline/actions/ChangeLocationAction.svelte @@ -2,7 +2,7 @@ import ChangeLocation from '$lib/components/shared-components/change-location.svelte'; import { getAssetControlContext } from '$lib/components/timeline/AssetSelectControlBar.svelte'; import { user } from '$lib/stores/user.store'; - import { getSelectedAssets } from '$lib/utils/asset-utils'; + import { getOwnedAssetsWithWarning } from '$lib/utils/asset-utils'; import { handleError } from '$lib/utils/handle-error'; import { updateAssets } from '@immich/sdk'; import { mdiMapMarkerMultipleOutline } from '@mdi/js'; @@ -25,7 +25,7 @@ return; } - const ids = getSelectedAssets(getOwnedAssets(), $user); + const ids = getOwnedAssetsWithWarning(getOwnedAssets(), $user); try { await updateAssets({ assetBulkUpdateDto: { ids, latitude: point.lat, longitude: point.lng } }); diff --git a/web/src/lib/components/timeline/actions/TimelineKeyboardActions.svelte b/web/src/lib/components/timeline/actions/TimelineKeyboardActions.svelte index b224442e05..5c030e3774 100644 --- a/web/src/lib/components/timeline/actions/TimelineKeyboardActions.svelte +++ b/web/src/lib/components/timeline/actions/TimelineKeyboardActions.svelte @@ -10,7 +10,6 @@ import { TimelineManager } from '$lib/managers/timeline-manager/timeline-manager.svelte'; import type { TimelineAsset } from '$lib/managers/timeline-manager/types'; import NavigateToDateModal from '$lib/modals/NavigateToDateModal.svelte'; - import ShortcutsModal from '$lib/modals/ShortcutsModal.svelte'; import type { AssetInteraction } from '$lib/stores/asset-interaction.svelte'; import { assetViewingStore } from '$lib/stores/asset-viewing.store'; @@ -22,7 +21,6 @@ import { archiveAssets, cancelMultiselect, selectAllAssets, stackAssets } from '$lib/utils/asset-utils'; import { AssetVisibility } from '@immich/sdk'; import { modalManager } from '@immich/ui'; - let { isViewing: showAssetViewer } = assetViewingStore; interface Props { timelineManager: TimelineManager; @@ -40,6 +38,8 @@ scrollToAsset, }: Props = $props(); + const { isViewing: showAssetViewer } = assetViewingStore; + const trashOrDelete = async (force: boolean = false) => { isShowDeleteConfirmation = false; await deleteAssets( @@ -145,11 +145,14 @@ const setFocusTo = setFocusToInit.bind(undefined, scrollToAsset, timelineManager); const setFocusAsset = setFocusAssetInit.bind(undefined, scrollToAsset); - const handleOpenDateModal = async () => - await modalManager.show(NavigateToDateModal, { + const handleOpenDateModal = async () => { + const asset = await modalManager.show(NavigateToDateModal, { timelineManager, - onFocusOnAsset: setFocusAsset, }); + if (asset) { + setFocusAsset(asset); + } + }; let shortcutList = $derived( (() => { diff --git a/web/src/lib/elements/DateInput.svelte b/web/src/lib/elements/DateInput.svelte index c328a6c036..a8f406f928 100644 --- a/web/src/lib/elements/DateInput.svelte +++ b/web/src/lib/elements/DateInput.svelte @@ -1,5 +1,7 @@ - onClose(false)} size="large"> + onClose(false)} size="small"> - + @@ -91,7 +76,7 @@ - + {:else} @@ -110,17 +95,32 @@ onSelect={(option) => (lastSelectedTimezone = option as ZoneOption)} > - - -
{$t('new_date_range')}
-
- - - - - - -
+
diff --git a/web/src/lib/modals/NavigateToDateModal.svelte b/web/src/lib/modals/NavigateToDateModal.svelte index c6ad0d2b57..4b83c66bc6 100644 --- a/web/src/lib/modals/NavigateToDateModal.svelte +++ b/web/src/lib/modals/NavigateToDateModal.svelte @@ -9,11 +9,10 @@ import { t } from 'svelte-i18n'; interface Props { timelineManager: TimelineManager; - onFocusOnAsset: (asset: TimelineAsset) => void; - onClose: (success: boolean) => void; + onClose: (asset?: TimelineAsset) => void; } - let { timelineManager, onFocusOnAsset, onClose }: Props = $props(); + let { timelineManager, onClose }: Props = $props(); const initialDate = DateTime.now(); let selectedDate = $state(initialDate.toFormat("yyyy-MM-dd'T'HH:mm:ss.SSS")); @@ -23,27 +22,21 @@ const handleClose = async () => { if (!date.isValid || !selectedOption) { - onClose(false); + onClose(); return; } // Get the local date/time components from the selected string using neutral timezone - const dateTime = toDatetime(selectedDate, selectedOption); - const asset = await timelineManager.getClosestAssetToDate(dateTime); - if (asset) { - onFocusOnAsset(asset); - onClose(true); - return; - } - - onClose(false); + const dateTime = toDatetime(selectedDate, selectedOption) as DateTime; + const asset = await timelineManager.getClosestAssetToDate(dateTime.toObject()); + onClose(asset); }; // when changing the time zone, assume the configured date/time is meant for that time zone (instead of updating it) const date = $derived(DateTime.fromISO(selectedDate, { zone: selectedOption?.value, setZone: true })); - onClose(false)}> + onClose()}> @@ -61,7 +54,7 @@ - + diff --git a/web/src/lib/utils/asset-utils.ts b/web/src/lib/utils/asset-utils.ts index 25e045c8a1..5211f0bf72 100644 --- a/web/src/lib/utils/asset-utils.ts +++ b/web/src/lib/utils/asset-utils.ts @@ -405,7 +405,7 @@ export const getAssetType = (type: AssetTypeEnum) => { } }; -export const getSelectedAssets = (assets: TimelineAsset[], user: UserResponseDto | null): string[] => { +export const getOwnedAssetsWithWarning = (assets: TimelineAsset[], user: UserResponseDto | null): string[] => { const ids = [...assets].filter((a) => user && a.ownerId === user.id).map((a) => a.id); const numberOfIssues = [...assets].filter((a) => user && a.ownerId !== user.id).length;