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;