From 94965f6d66638a6aefa706761dc796540555830e Mon Sep 17 00:00:00 2001
From: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com>
Date: Tue, 3 Feb 2026 17:06:26 +0100
Subject: [PATCH] chore: rework tags sidebar (#25855)
---
.../asset-viewer/asset-viewer.svelte | 5 ++
.../asset-viewer/detail-panel-tags.svelte | 66 ++++++++-----------
.../timeline/actions/TagAction.svelte | 7 +-
web/src/lib/managers/event-manager.svelte.ts | 1 +
web/src/lib/modals/AssetTagModal.svelte | 7 +-
web/src/lib/services/asset.service.ts | 15 ++++-
6 files changed, 54 insertions(+), 47 deletions(-)
diff --git a/web/src/lib/components/asset-viewer/asset-viewer.svelte b/web/src/lib/components/asset-viewer/asset-viewer.svelte
index 6284e207c6..06f4e5a0b2 100644
--- a/web/src/lib/components/asset-viewer/asset-viewer.svelte
+++ b/web/src/lib/components/asset-viewer/asset-viewer.svelte
@@ -14,6 +14,7 @@
import { eventManager } from '$lib/managers/event-manager.svelte';
import { imageManager } from '$lib/managers/ImageManager.svelte';
import { Route } from '$lib/route';
+ import { getAssetActions } from '$lib/services/asset.service';
import { assetViewingStore } from '$lib/stores/asset-viewing.store';
import { ocrManager } from '$lib/stores/ocr.svelte';
import { alwaysLoadOriginalVideo } from '$lib/stores/preferences.store';
@@ -36,6 +37,7 @@
type PersonResponseDto,
type StackResponseDto,
} from '@immich/sdk';
+ import { CommandPaletteDefaultProvider } from '@immich/ui';
import { onDestroy, onMount, untrack } from 'svelte';
import { t } from 'svelte-i18n';
import { fly } from 'svelte/transition';
@@ -426,8 +428,11 @@
!assetViewerManager.isShowEditor &&
ocrManager.hasOcrData,
);
+
+ const { Tag } = $derived(getAssetActions($t, asset));
+
diff --git a/web/src/lib/components/asset-viewer/detail-panel-tags.svelte b/web/src/lib/components/asset-viewer/detail-panel-tags.svelte
index cd9b1a40d2..09c4432723 100644
--- a/web/src/lib/components/asset-viewer/detail-panel-tags.svelte
+++ b/web/src/lib/components/asset-viewer/detail-panel-tags.svelte
@@ -1,12 +1,13 @@
-
+
{#if isOwner && !authManager.isSharedLink}
@@ -42,36 +44,24 @@
{#each tags as tag (tag.id)}
-
+ size="tiny"
+ class="hover:bg-primary-400"
+ shape="round"
+ />
+
{/each}
-
+
{/if}
diff --git a/web/src/lib/components/timeline/actions/TagAction.svelte b/web/src/lib/components/timeline/actions/TagAction.svelte
index d2235d7c74..dfe24b476b 100644
--- a/web/src/lib/components/timeline/actions/TagAction.svelte
+++ b/web/src/lib/components/timeline/actions/TagAction.svelte
@@ -20,11 +20,8 @@
const handleTagAssets = async () => {
const assets = [...getOwnedAssets()];
- const success = await modalManager.show(AssetTagModal, { assetIds: assets.map(({ id }) => id) });
-
- if (success) {
- clearSelect();
- }
+ await modalManager.show(AssetTagModal, { assetIds: assets.map(({ id }) => id) });
+ clearSelect();
};
diff --git a/web/src/lib/managers/event-manager.svelte.ts b/web/src/lib/managers/event-manager.svelte.ts
index 4825dbc93b..4093413d1a 100644
--- a/web/src/lib/managers/event-manager.svelte.ts
+++ b/web/src/lib/managers/event-manager.svelte.ts
@@ -37,6 +37,7 @@ export type Events = {
AssetsArchive: [string[]];
AssetsDelete: [string[]];
AssetEditsApplied: [string];
+ AssetsTag: [string[]];
AlbumAddAssets: [];
AlbumUpdate: [AlbumResponseDto];
diff --git a/web/src/lib/modals/AssetTagModal.svelte b/web/src/lib/modals/AssetTagModal.svelte
index e541e24b60..00862ce1b1 100644
--- a/web/src/lib/modals/AssetTagModal.svelte
+++ b/web/src/lib/modals/AssetTagModal.svelte
@@ -1,4 +1,5 @@