From bb697e855f7fd9bd6e39b8eb75bca870ecc2295c Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Fri, 13 Jun 2025 20:37:30 +0200 Subject: [PATCH] Add asset selection controller logic to the tags asset view page, such that tagged media can be deleted, added to albums, etc --- .../[[assetId=id]]/+page.svelte | 75 ++++++++++++++++++- 1 file changed, 73 insertions(+), 2 deletions(-) diff --git a/web/src/routes/(user)/tags/[[photos=photos]]/[[assetId=id]]/+page.svelte b/web/src/routes/(user)/tags/[[photos=photos]]/[[assetId=id]]/+page.svelte index 27c42076ca213..9d248f4cab03e 100644 --- a/web/src/routes/(user)/tags/[[photos=photos]]/[[assetId=id]]/+page.svelte +++ b/web/src/routes/(user)/tags/[[photos=photos]]/[[assetId=id]]/+page.svelte @@ -7,22 +7,38 @@ notificationController, NotificationType, } from '$lib/components/shared-components/notification/notification'; + import AssetSelectControlBar from '$lib/components/photos-page/asset-select-control-bar.svelte'; import SettingInputField from '$lib/components/shared-components/settings/setting-input-field.svelte'; import Breadcrumbs from '$lib/components/shared-components/tree/breadcrumbs.svelte'; import TreeItemThumbnails from '$lib/components/shared-components/tree/tree-item-thumbnails.svelte'; + import ArchiveAction from '$lib/components/photos-page/actions/archive-action.svelte'; import TreeItems from '$lib/components/shared-components/tree/tree-items.svelte'; import Sidebar from '$lib/components/sidebar/sidebar.svelte'; + import ChangeDate from '$lib/components/photos-page/actions/change-date-action.svelte'; + import DownloadAction from '$lib/components/photos-page/actions/download-action.svelte'; + import ChangeDescription from '$lib/components/photos-page/actions/change-description-action.svelte'; + import ChangeLocation from '$lib/components/photos-page/actions/change-location-action.svelte'; + import DeleteAssets from '$lib/components/photos-page/actions/delete-assets.svelte'; + import SetVisibilityAction from '$lib/components/photos-page/actions/set-visibility-action.svelte'; + import TagAction from '$lib/components/photos-page/actions/tag-action.svelte'; import { AppRoute, AssetAction, QueryParameter, SettingInputFieldType } from '$lib/constants'; + import AddToAlbum from '$lib/components/photos-page/actions/add-to-album.svelte'; + import FavoriteAction from '$lib/components/photos-page/actions/favorite-action.svelte'; + import SelectAllAssets from '$lib/components/photos-page/actions/select-all-assets.svelte'; + import ButtonContextMenu from '$lib/components/shared-components/context-menu/button-context-menu.svelte'; import { modalManager } from '$lib/managers/modal-manager.svelte'; import { TimelineManager } from '$lib/managers/timeline-manager/timeline-manager.svelte'; import { AssetInteraction } from '$lib/stores/asset-interaction.svelte'; + import { preferences } from '$lib/stores/user.store'; import { joinPaths, TreeNode } from '$lib/utils/tree-utils'; - import { deleteTag, getAllTags, updateTag, upsertTags, type TagResponseDto } from '@immich/sdk'; + import CreateSharedLink from '$lib/components/photos-page/actions/create-shared-link.svelte'; + import { deleteTag, getAllTags, type TagResponseDto, updateTag, upsertTags } from '@immich/sdk'; import { Button, HStack, Modal, ModalBody, ModalFooter, Text } from '@immich/ui'; - import { mdiPencil, mdiPlus, mdiTag, mdiTagMultiple, mdiTrashCanOutline } from '@mdi/js'; + import { mdiDotsVertical, mdiPencil, mdiPlus, mdiTag, mdiTagMultiple, mdiTrashCanOutline } from '@mdi/js'; import { onDestroy } from 'svelte'; import { t } from 'svelte-i18n'; import type { PageData } from './$types'; + import type { TimelineAsset } from '$lib/managers/timeline-manager/types'; interface Props { data: PageData; @@ -95,6 +111,19 @@ } }; + const handleSetVisibility = (assetIds: string[]) => { + timelineManager.removeAssets(assetIds); + assetInteraction.clearMultiselect(); + }; + + const handleRemoveAssets = (assetIds: string[]) => { + timelineManager.removeAssets(assetIds); + }; + + const handleUndoRemoveAssets = (assets: TimelineAsset[]) => { + timelineManager.addAssets(assets); + }; + const handleDelete = async () => { if (!tag) { return; @@ -166,6 +195,48 @@ {/if} + + {#if assetInteraction.selectionActive} + assetInteraction.clearMultiselect()} + > + + + + + + + {#if assetInteraction.isAllUserOwned} + + timelineManager.updateAssetOperation(ids, (asset) => { + asset.isFavorite = isFavorite; + return { remove: false }; + })} + > + {/if} + + + {#if assetInteraction.isAllUserOwned} + + + + + + {/if} + + {#if $preferences.tags.enabled && assetInteraction.isAllUserOwned} + + {/if} + + {#if assetInteraction.isAllUserOwned} + + {/if} + + + {/if} {#if isNewOpen}