From 1b032339aab242f437446d4ccd4335f3c3e1b3be Mon Sep 17 00:00:00 2001 From: Jason Rasmussen Date: Wed, 21 Jan 2026 13:13:16 -0500 Subject: [PATCH] refactor(web): asset job actions (#25426) --- .../asset-viewer/asset-viewer-nav-bar.spec.ts | 2 +- .../asset-viewer/asset-viewer-nav-bar.svelte | 58 +++++++++---------- .../asset-viewer/asset-viewer.svelte | 15 +---- .../timeline/actions/AssetJobActions.svelte | 6 +- web/src/lib/services/asset.service.ts | 50 +++++++++++++++- web/src/lib/utils.ts | 33 +++-------- 6 files changed, 90 insertions(+), 74 deletions(-) diff --git a/web/src/lib/components/asset-viewer/asset-viewer-nav-bar.spec.ts b/web/src/lib/components/asset-viewer/asset-viewer-nav-bar.spec.ts index 1c802b0dce..5ee6dbf93e 100644 --- a/web/src/lib/components/asset-viewer/asset-viewer-nav-bar.spec.ts +++ b/web/src/lib/components/asset-viewer/asset-viewer-nav-bar.spec.ts @@ -16,7 +16,7 @@ describe('AssetViewerNavBar component', () => { preAction: () => {}, onZoomImage: () => {}, onAction: () => {}, - onRunJob: () => {}, + onEdit: () => {}, onPlaySlideshow: () => {}, onClose: () => {}, playOriginalVideo: false, diff --git a/web/src/lib/components/asset-viewer/asset-viewer-nav-bar.svelte b/web/src/lib/components/asset-viewer/asset-viewer-nav-bar.svelte index cf8301d755..93d1a4acd1 100644 --- a/web/src/lib/components/asset-viewer/asset-viewer-nav-bar.svelte +++ b/web/src/lib/components/asset-viewer/asset-viewer-nav-bar.svelte @@ -28,12 +28,11 @@ import { photoViewerImgElement } from '$lib/stores/assets-store.svelte'; import { user } from '$lib/stores/user.store'; import { photoZoomState } from '$lib/stores/zoom-image.store'; - import { getAssetJobName, getSharedLink, withoutIcons } from '$lib/utils'; + import { getSharedLink, withoutIcons } from '$lib/utils'; import type { OnUndoDelete } from '$lib/utils/actions'; import { canCopyImageToClipboard } from '$lib/utils/asset-utils'; import { toTimelineAsset } from '$lib/utils/timeline-util'; import { - AssetJobName, AssetTypeEnum, AssetVisibility, type AlbumResponseDto, @@ -44,13 +43,9 @@ import { CommandPaletteDefaultProvider, IconButton, type ActionItem } from '@immich/ui'; import { mdiArrowLeft, - mdiCogRefreshOutline, mdiCompare, mdiContentCopy, - mdiDatabaseRefreshOutline, mdiDotsVertical, - mdiHeadSyncOutline, - mdiImageRefreshOutline, mdiImageSearch, mdiMagnifyMinusOutline, mdiMagnifyPlusOutline, @@ -71,7 +66,6 @@ preAction: PreAction; onAction: OnAction; onUndoDelete?: OnUndoDelete; - onRunJob: (name: AssetJobName) => void; onPlaySlideshow: () => void; onEdit: () => void; onClose?: () => void; @@ -90,7 +84,6 @@ preAction, onAction, onUndoDelete = undefined, - onRunJob, onPlaySlideshow, onClose, onEdit, @@ -124,6 +117,10 @@ PlayMotionPhoto, StopMotionPhoto, Info, + RefreshFacesJob, + RefreshMetadataJob, + RegenerateThumbnailJob, + TranscodeVideoJob, } = $derived(getAssetActions($t, asset)); const sharedLink = getSharedLink(); @@ -140,7 +137,24 @@
- onRunJob(AssetJobName.RefreshFaces)} - text={$getAssetJobName(AssetJobName.RefreshFaces)} - /> - onRunJob(AssetJobName.RefreshMetadata)} - text={$getAssetJobName(AssetJobName.RefreshMetadata)} - /> - onRunJob(AssetJobName.RegenerateThumbnail)} - text={$getAssetJobName(AssetJobName.RegenerateThumbnail)} - /> - {#if asset.type === AssetTypeEnum.Video} - onRunJob(AssetJobName.TranscodeVideo)} - text={$getAssetJobName(AssetJobName.TranscodeVideo)} - /> - {/if} + + + + {/if} {/if} diff --git a/web/src/lib/components/asset-viewer/asset-viewer.svelte b/web/src/lib/components/asset-viewer/asset-viewer.svelte index ac9c07df94..9e3c121024 100644 --- a/web/src/lib/components/asset-viewer/asset-viewer.svelte +++ b/web/src/lib/components/asset-viewer/asset-viewer.svelte @@ -19,7 +19,7 @@ import { alwaysLoadOriginalVideo } from '$lib/stores/preferences.store'; import { SlideshowNavigation, SlideshowState, slideshowStore } from '$lib/stores/slideshow.store'; import { user } from '$lib/stores/user.store'; - import { getAssetJobMessage, getAssetUrl, getSharedLink, handlePromiseError } from '$lib/utils'; + import { getAssetUrl, getSharedLink, handlePromiseError } from '$lib/utils'; import type { OnUndoDelete } from '$lib/utils/actions'; import { navigateToAsset } from '$lib/utils/asset-utils'; import { handleError } from '$lib/utils/handle-error'; @@ -28,18 +28,15 @@ import { preloadImageUrl } from '$lib/utils/sw-messaging'; import { toTimelineAsset } from '$lib/utils/timeline-util'; import { - AssetJobName, AssetTypeEnum, getAllAlbums, getAssetInfo, getStack, - runAssetJobs, type AlbumResponseDto, type AssetResponseDto, type PersonResponseDto, type StackResponseDto, } from '@immich/sdk'; - import { toastManager } from '@immich/ui'; import { onDestroy, onMount, untrack } from 'svelte'; import { t } from 'svelte-i18n'; import { fly } from 'svelte/transition'; @@ -262,15 +259,6 @@ isShowEditor = !isShowEditor; }; - const handleRunJob = async (name: AssetJobName) => { - try { - await runAssetJobs({ assetJobsDto: { assetIds: [asset.id], name } }); - toastManager.success($getAssetJobMessage(name)); - } catch (error) { - handleError(error, $t('errors.unable_to_submit_job')); - } - }; - /** * Slide show mode */ @@ -473,7 +461,6 @@ onAction={handleAction} {onUndoDelete} onEdit={showEditor} - onRunJob={handleRunJob} onPlaySlideshow={() => ($slideshowState = SlideshowState.PlaySlideshow)} onClose={onClose ? () => onClose(asset) : undefined} {playOriginalVideo} diff --git a/web/src/lib/components/timeline/actions/AssetJobActions.svelte b/web/src/lib/components/timeline/actions/AssetJobActions.svelte index 249b3c5d14..b4a3bdbefd 100644 --- a/web/src/lib/components/timeline/actions/AssetJobActions.svelte +++ b/web/src/lib/components/timeline/actions/AssetJobActions.svelte @@ -1,7 +1,7 @@