diff --git a/server/apps/immich/src/api-v1/album/album-repository.ts b/server/apps/immich/src/api-v1/album/album-repository.ts index 6336a2574b..4c48907264 100644 --- a/server/apps/immich/src/api-v1/album/album-repository.ts +++ b/server/apps/immich/src/api-v1/album/album-repository.ts @@ -164,6 +164,7 @@ export class AlbumRepository implements IAlbumRepository { .leftJoinAndSelect('sharedUser.userInfo', 'userInfo') .leftJoinAndSelect('album.assets', 'assets') .leftJoinAndSelect('assets.assetInfo', 'assetInfo') + .leftJoinAndSelect('assetInfo.exifInfo', 'exifInfo') .orderBy('"assetInfo"."createdAt"::timestamptz', 'ASC') .getOne(); diff --git a/web/src/lib/components/album-page/album-viewer.svelte b/web/src/lib/components/album-page/album-viewer.svelte index 908f9cb0c6..c78dd6490b 100644 --- a/web/src/lib/components/album-page/album-viewer.svelte +++ b/web/src/lib/components/album-page/album-viewer.svelte @@ -1,15 +1,21 @@
@@ -97,11 +147,26 @@
{#each album.assets as asset} {#if album.assets.length < 7} - + {:else} - + {/if} {/each}
+ + +{#if isShowAssetViewer} + +{/if} diff --git a/web/src/lib/components/asset-viewer-page/asser-viewer-nav-bar.svelte b/web/src/lib/components/asset-viewer/asser-viewer-nav-bar.svelte similarity index 100% rename from web/src/lib/components/asset-viewer-page/asser-viewer-nav-bar.svelte rename to web/src/lib/components/asset-viewer/asser-viewer-nav-bar.svelte diff --git a/web/src/lib/components/asset-viewer-page/asset-viewer.svelte b/web/src/lib/components/asset-viewer/asset-viewer.svelte similarity index 69% rename from web/src/lib/components/asset-viewer-page/asset-viewer.svelte rename to web/src/lib/components/asset-viewer/asset-viewer.svelte index 1539b86751..e3cdbd3a7b 100644 --- a/web/src/lib/components/asset-viewer-page/asset-viewer.svelte +++ b/web/src/lib/components/asset-viewer/asset-viewer.svelte @@ -2,7 +2,6 @@ import { createEventDispatcher, onDestroy, onMount } from 'svelte'; import { fly } from 'svelte/transition'; import AsserViewerNavBar from './asser-viewer-nav-bar.svelte'; - import { flattenAssetGroupByDate } from '$lib/stores/assets'; import ChevronRight from 'svelte-material-icons/ChevronRight.svelte'; import ChevronLeft from 'svelte-material-icons/ChevronLeft.svelte'; import PhotoViewer from './photo-viewer.svelte'; @@ -14,31 +13,16 @@ const dispatch = createEventDispatcher(); - export let selectedAsset: AssetResponseDto; - - export let selectedIndex: number; - - let viewDeviceId: string; - let viewAssetId: string; + export let asset: AssetResponseDto; let halfLeftHover = false; let halfRightHover = false; let isShowDetail = false; onMount(() => { - viewAssetId = selectedAsset.id; - viewDeviceId = selectedAsset.deviceId; - pushState(viewAssetId); - document.addEventListener('keydown', (keyInfo) => handleKeyboardPress(keyInfo.key)); }); - onDestroy(() => { - document.removeEventListener('keydown', (b) => { - console.log('destroyed', b); - }); - }); - const handleKeyboardPress = (key: string) => { switch (key) { case 'Escape': @@ -57,38 +41,17 @@ }; const closeViewer = () => { - history.pushState(null, '', `/photos`); dispatch('close'); }; const navigateAssetForward = (e?: Event) => { e?.stopPropagation(); - - const nextAsset = $flattenAssetGroupByDate[selectedIndex + 1]; - viewDeviceId = nextAsset.deviceId; - viewAssetId = nextAsset.id; - - selectedIndex = selectedIndex + 1; - selectedAsset = $flattenAssetGroupByDate[selectedIndex]; - pushState(viewAssetId); + dispatch('navigate-forward'); }; const navigateAssetBackward = (e?: Event) => { e?.stopPropagation(); - - const lastAsset = $flattenAssetGroupByDate[selectedIndex - 1]; - viewDeviceId = lastAsset.deviceId; - viewAssetId = lastAsset.id; - - selectedIndex = selectedIndex - 1; - selectedAsset = $flattenAssetGroupByDate[selectedIndex]; - pushState(viewAssetId); - }; - - const pushState = (assetId: string) => { - // add a URL to the browser's history - // changes the current URL in the address bar but doesn't perform any SvelteKit navigation - history.pushState(null, '', `/photos/${assetId}`); + dispatch('navigate-backward'); }; const showDetailInfoHandler = () => { @@ -98,19 +61,20 @@ const downloadFile = async () => { if ($session.user) { try { - const imageName = selectedAsset.exifInfo?.imageName ? selectedAsset.exifInfo?.imageName : selectedAsset.id; - const imageExtension = selectedAsset.originalPath.split('.')[1]; + const imageName = asset.exifInfo?.imageName ? asset.exifInfo?.imageName : asset.id; + const imageExtension = asset.originalPath.split('.')[1]; const imageFileName = imageName + '.' + imageExtension; // If assets is already download -> return; if ($downloadAssets[imageFileName]) { return; } + $downloadAssets[imageFileName] = 0; const { data, status } = await api.assetApi.downloadFile( - selectedAsset.deviceAssetId, - selectedAsset.deviceId, + asset.deviceAssetId, + asset.deviceId, false, false, { @@ -123,8 +87,8 @@ $downloadAssets[imageFileName] = percentCompleted; } - }, - }, + } + } ); if (!(data instanceof Blob)) { @@ -162,12 +126,16 @@ class="absolute h-screen w-screen top-0 overflow-y-hidden bg-black z-[999] grid grid-rows-[64px_1fr] grid-cols-4 " >
- +
{ halfLeftHover = true; @@ -188,20 +156,18 @@
- {#key selectedIndex} - {#if viewAssetId && viewDeviceId} - {#if selectedAsset.type == AssetTypeEnum.Image} - - {:else} - - {/if} + {#key asset.id} + {#if asset.type == AssetTypeEnum.Image} + + {:else} + {/if} {/key}
{ @@ -228,7 +194,7 @@ class="bg-immich-bg w-[360px] row-span-full transition-all " translate="yes" > - (isShowDetail = false)} /> + (isShowDetail = false)} />
{/if} diff --git a/web/src/lib/components/asset-viewer-page/detail-panel.svelte b/web/src/lib/components/asset-viewer/detail-panel.svelte similarity index 100% rename from web/src/lib/components/asset-viewer-page/detail-panel.svelte rename to web/src/lib/components/asset-viewer/detail-panel.svelte diff --git a/web/src/lib/components/asset-viewer-page/download-panel.svelte b/web/src/lib/components/asset-viewer/download-panel.svelte similarity index 100% rename from web/src/lib/components/asset-viewer-page/download-panel.svelte rename to web/src/lib/components/asset-viewer/download-panel.svelte diff --git a/web/src/lib/components/asset-viewer-page/intersection-observer.svelte b/web/src/lib/components/asset-viewer/intersection-observer.svelte similarity index 100% rename from web/src/lib/components/asset-viewer-page/intersection-observer.svelte rename to web/src/lib/components/asset-viewer/intersection-observer.svelte diff --git a/web/src/lib/components/asset-viewer-page/photo-viewer.svelte b/web/src/lib/components/asset-viewer/photo-viewer.svelte similarity index 100% rename from web/src/lib/components/asset-viewer-page/photo-viewer.svelte rename to web/src/lib/components/asset-viewer/photo-viewer.svelte diff --git a/web/src/lib/components/asset-viewer-page/video-viewer.svelte b/web/src/lib/components/asset-viewer/video-viewer.svelte similarity index 100% rename from web/src/lib/components/asset-viewer-page/video-viewer.svelte rename to web/src/lib/components/asset-viewer/video-viewer.svelte diff --git a/web/src/lib/components/shared-components/immich-thumbnail.svelte b/web/src/lib/components/shared-components/immich-thumbnail.svelte index 0ed4d964ef..9f13c3da70 100644 --- a/web/src/lib/components/shared-components/immich-thumbnail.svelte +++ b/web/src/lib/components/shared-components/immich-thumbnail.svelte @@ -2,7 +2,7 @@ import { session } from '$app/stores'; import { createEventDispatcher, onDestroy } from 'svelte'; import { fade, fly } from 'svelte/transition'; - import IntersectionObserver from '$lib/components/asset-viewer-page/intersection-observer.svelte'; + import IntersectionObserver from '$lib/components/asset-viewer/intersection-observer.svelte'; import CheckCircle from 'svelte-material-icons/CheckCircle.svelte'; import PlayCircleOutline from 'svelte-material-icons/PlayCircleOutline.svelte'; import PauseCircleOutline from 'svelte-material-icons/PauseCircleOutline.svelte'; diff --git a/web/src/lib/components/sharing-page/shared-album-list-tile.svelte b/web/src/lib/components/sharing-page/shared-album-list-tile.svelte index ae00957ed4..ab7d3a87aa 100644 --- a/web/src/lib/components/sharing-page/shared-album-list-tile.svelte +++ b/web/src/lib/components/sharing-page/shared-album-list-tile.svelte @@ -53,7 +53,7 @@ {#if user.email == albumOwner.email}

Owned

{:else} -

Shared by {albumOwner.email}

+

Shared by {albumOwner.firstName} {albumOwner.lastName}

{/if} {/await} diff --git a/web/src/routes/__layout.svelte b/web/src/routes/__layout.svelte index 44435f8bd1..52b94e1bd3 100644 --- a/web/src/routes/__layout.svelte +++ b/web/src/routes/__layout.svelte @@ -18,7 +18,7 @@ import { blur, fade, slide } from 'svelte/transition'; - import DownloadPanel from '$lib/components/asset-viewer-page/download-panel.svelte'; + import DownloadPanel from '$lib/components/asset-viewer/download-panel.svelte'; import AnnouncementBox from '$lib/components/shared-components/announcement-box.svelte'; import UploadPanel from '$lib/components/shared-components/upload-panel.svelte'; import { onMount } from 'svelte'; diff --git a/web/src/routes/albums/[albumId].svelte b/web/src/routes/albums/[albumId]/index.svelte similarity index 95% rename from web/src/routes/albums/[albumId].svelte rename to web/src/routes/albums/[albumId]/index.svelte index 42e1ded410..2ac136ae17 100644 --- a/web/src/routes/albums/[albumId].svelte +++ b/web/src/routes/albums/[albumId]/index.svelte @@ -35,8 +35,6 @@ diff --git a/web/src/routes/photos/index.svelte b/web/src/routes/photos/index.svelte index e6d0100928..4ca3797823 100644 --- a/web/src/routes/photos/index.svelte +++ b/web/src/routes/photos/index.svelte @@ -33,7 +33,7 @@ import { assetsGroupByDate, flattenAssetGroupByDate } from '$lib/stores/assets'; import ImmichThumbnail from '$lib/components/shared-components/immich-thumbnail.svelte'; import moment from 'moment'; - import AssetViewer from '$lib/components/asset-viewer-page/asset-viewer.svelte'; + import AssetViewer from '$lib/components/asset-viewer/asset-viewer.svelte'; import { fileUploader } from '$lib/utils/file-uploader'; import { AssetResponseDto } from '@api'; import SideBar from '$lib/components/shared-components/side-bar/side-bar.svelte'; @@ -42,13 +42,14 @@ let selectedGroupThumbnail: number | null; let isMouseOverGroup: boolean; + $: if (isMouseOverGroup == false) { selectedGroupThumbnail = null; } - let isShowAsset = false; + let isShowAssetViewer = false; let currentViewAssetIndex = 0; - let currentSelectedAsset: AssetResponseDto; + let selectedAsset: AssetResponseDto; const thumbnailMouseEventHandler = (event: CustomEvent) => { const { selectedGroupIndex }: { selectedGroupIndex: number } = event.detail; @@ -60,8 +61,9 @@ const { assetId, deviceId }: { assetId: string; deviceId: string } = event.detail; currentViewAssetIndex = $flattenAssetGroupByDate.findIndex((a) => a.id == assetId); - currentSelectedAsset = $flattenAssetGroupByDate[currentViewAssetIndex]; - isShowAsset = true; + selectedAsset = $flattenAssetGroupByDate[currentViewAssetIndex]; + isShowAssetViewer = true; + pushState(selectedAsset.id); }; const uploadClickedHandler = async () => { @@ -91,6 +93,41 @@ } } }; + + const navigateAssetForward = () => { + try { + if (currentViewAssetIndex < $flattenAssetGroupByDate.length - 1) { + currentViewAssetIndex++; + selectedAsset = $flattenAssetGroupByDate[currentViewAssetIndex]; + pushState(selectedAsset.id); + } + } catch (e) { + console.log('Error navigating asset forward', e); + } + }; + + const navigateAssetBackward = () => { + try { + if (currentViewAssetIndex > 0) { + currentViewAssetIndex--; + selectedAsset = $flattenAssetGroupByDate[currentViewAssetIndex]; + pushState(selectedAsset.id); + } + } catch (e) { + console.log('Error navigating asset backward', e); + } + }; + + const pushState = (assetId: string) => { + // add a URL to the browser's history + // changes the current URL in the address bar but doesn't perform any SvelteKit navigation + history.pushState(null, '', `/photos/${assetId}`); + }; + + const closeViewer = () => { + isShowAssetViewer = false; + history.pushState(null, '', `/photos`); + }; @@ -149,10 +186,11 @@ -{#if isShowAsset} +{#if isShowAssetViewer} (isShowAsset = false)} + asset={selectedAsset} + on:navigate-backward={navigateAssetBackward} + on:navigate-forward={navigateAssetForward} + on:close={closeViewer} /> {/if}