diff --git a/web/src/lib/components/album-page/album-viewer.svelte b/web/src/lib/components/album-page/album-viewer.svelte index 83ff24a41..bd832f11f 100644 --- a/web/src/lib/components/album-page/album-viewer.svelte +++ b/web/src/lib/components/album-page/album-viewer.svelte @@ -1,49 +1,48 @@
{#if isMultiSelectionMode} - - -

- Selected {multiSelectAsset.size.toLocaleString($locale)} -

-
- - - {#if isOwned} - - {/if} - -
+ + {#if isOwned} + + {/if} + {/if} diff --git a/web/src/lib/components/photos-page/actions/create-shared-link.svelte b/web/src/lib/components/photos-page/actions/create-shared-link.svelte new file mode 100644 index 000000000..5f436315a --- /dev/null +++ b/web/src/lib/components/photos-page/actions/create-shared-link.svelte @@ -0,0 +1,23 @@ + + + (showModal = true)} /> + +{#if showModal} + { + showModal = false; + clearSelect(); + }} + /> +{/if} diff --git a/web/src/lib/components/photos-page/actions/delete-assets.svelte b/web/src/lib/components/photos-page/actions/delete-assets.svelte new file mode 100644 index 000000000..8857b5c21 --- /dev/null +++ b/web/src/lib/components/photos-page/actions/delete-assets.svelte @@ -0,0 +1,45 @@ + + + diff --git a/web/src/lib/components/photos-page/actions/download-files.svelte b/web/src/lib/components/photos-page/actions/download-files.svelte new file mode 100644 index 000000000..279269723 --- /dev/null +++ b/web/src/lib/components/photos-page/actions/download-files.svelte @@ -0,0 +1,17 @@ + + + diff --git a/web/src/lib/components/photos-page/actions/move-to-archive.svelte b/web/src/lib/components/photos-page/actions/move-to-archive.svelte new file mode 100644 index 000000000..c56304b12 --- /dev/null +++ b/web/src/lib/components/photos-page/actions/move-to-archive.svelte @@ -0,0 +1,40 @@ + + + diff --git a/web/src/lib/components/photos-page/actions/remove-favorite.svelte b/web/src/lib/components/photos-page/actions/remove-favorite.svelte new file mode 100644 index 000000000..611a38dc3 --- /dev/null +++ b/web/src/lib/components/photos-page/actions/remove-favorite.svelte @@ -0,0 +1,36 @@ + + + + + diff --git a/web/src/lib/components/photos-page/actions/remove-from-album.svelte b/web/src/lib/components/photos-page/actions/remove-from-album.svelte new file mode 100644 index 000000000..1db8e16c6 --- /dev/null +++ b/web/src/lib/components/photos-page/actions/remove-from-album.svelte @@ -0,0 +1,35 @@ + + + diff --git a/web/src/lib/components/photos-page/actions/remove-from-archive.svelte b/web/src/lib/components/photos-page/actions/remove-from-archive.svelte new file mode 100644 index 000000000..b24a67ec2 --- /dev/null +++ b/web/src/lib/components/photos-page/actions/remove-from-archive.svelte @@ -0,0 +1,39 @@ + + + diff --git a/web/src/lib/components/photos-page/actions/remove-from-shared-link.svelte b/web/src/lib/components/photos-page/actions/remove-from-shared-link.svelte new file mode 100644 index 000000000..86a70720e --- /dev/null +++ b/web/src/lib/components/photos-page/actions/remove-from-shared-link.svelte @@ -0,0 +1,34 @@ + + + diff --git a/web/src/lib/components/photos-page/asset-select-context-menu.svelte b/web/src/lib/components/photos-page/asset-select-context-menu.svelte new file mode 100644 index 000000000..7be7de4ed --- /dev/null +++ b/web/src/lib/components/photos-page/asset-select-context-menu.svelte @@ -0,0 +1,35 @@ + + + + + + +{#if showContextMenu} + (showContextMenu = false)}> +
+ +
+
+{/if} diff --git a/web/src/lib/components/photos-page/asset-select-control-bar.svelte b/web/src/lib/components/photos-page/asset-select-control-bar.svelte new file mode 100644 index 000000000..ceb6c6aab --- /dev/null +++ b/web/src/lib/components/photos-page/asset-select-control-bar.svelte @@ -0,0 +1,39 @@ + + + + + +

+ Selected {assets.size.toLocaleString($locale)} +

+ +
diff --git a/web/src/lib/components/photos-page/menu-options/option-add-to-album.svelte b/web/src/lib/components/photos-page/menu-options/option-add-to-album.svelte new file mode 100644 index 000000000..3dbd988bb --- /dev/null +++ b/web/src/lib/components/photos-page/menu-options/option-add-to-album.svelte @@ -0,0 +1,67 @@ + + + (showAlbumPicker = true)} + text={shared ? 'Add to Shared Album' : 'Add to Album'} +/> + +{#if showAlbumPicker} + +{/if} diff --git a/web/src/lib/components/photos-page/menu-options/option-add-to-favorites.svelte b/web/src/lib/components/photos-page/menu-options/option-add-to-favorites.svelte new file mode 100644 index 000000000..1c38d4669 --- /dev/null +++ b/web/src/lib/components/photos-page/menu-options/option-add-to-favorites.svelte @@ -0,0 +1,41 @@ + + + diff --git a/web/src/lib/components/photos-page/menu-options/option-remove-from-favorites.svelte b/web/src/lib/components/photos-page/menu-options/option-remove-from-favorites.svelte new file mode 100644 index 000000000..4a2d2781e --- /dev/null +++ b/web/src/lib/components/photos-page/menu-options/option-remove-from-favorites.svelte @@ -0,0 +1,19 @@ + + + + { + closeMenu(); + handleRemoveFavorite(); + }} + text="Remove from favorites" + /> + diff --git a/web/src/lib/components/share-page/individual-shared-viewer.svelte b/web/src/lib/components/share-page/individual-shared-viewer.svelte index 79b4228d1..12510e52c 100644 --- a/web/src/lib/components/share-page/individual-shared-viewer.svelte +++ b/web/src/lib/components/share-page/individual-shared-viewer.svelte @@ -1,47 +1,37 @@
{#if isMultiSelectionMode} - - -

- Selected {selectedAssets.size.toLocaleString($locale)} -

-
- - downloadAssets(false)} - logo={CloudDownloadOutline} - /> - {#if isOwned} - - {/if} - -
+ + + {#if isOwned} + + {/if} + {:else} goto('/photos')} @@ -139,7 +96,7 @@ {#if sharedLink?.allowDownload} downloadAssets(true)} + on:click={downloadAssets} logo={FolderDownloadOutline} /> {/if} diff --git a/web/src/lib/utils/asset-utils.ts b/web/src/lib/utils/asset-utils.ts index d37905d3b..e8428f72e 100644 --- a/web/src/lib/utils/asset-utils.ts +++ b/web/src/lib/utils/asset-utils.ts @@ -25,7 +25,7 @@ export const addAssetsToAlbum = async ( export async function bulkDownload( fileName: string, assets: AssetResponseDto[], - onDone: () => void, + onDone?: () => void, key?: string ) { const assetIds = assets.map((asset) => asset.id); @@ -63,7 +63,7 @@ export async function bulkDownload( if (isNotComplete && fileCount > 0) { // skip += fileCount; } else { - onDone(); + onDone?.(); done = true; } diff --git a/web/src/routes/(user)/archive/+page.svelte b/web/src/routes/(user)/archive/+page.svelte index 7eb70e96d..8fbe65a3a 100644 --- a/web/src/routes/(user)/archive/+page.svelte +++ b/web/src/routes/(user)/archive/+page.svelte @@ -1,34 +1,27 @@ @@ -190,68 +47,20 @@ {#if isMultiSelectionMode} - (selectedAssets = new Set())} > - -

- Selected {selectedAssets.size.toLocaleString($locale)} -

-
- - - - - - - -
- {/if} - - {#if isShowAddMenu} - (isShowAddMenu = false)}> -
- - handleShowAlbumPicker(false)} text="Add to Album" /> - handleShowAlbumPicker(true)} text="Add to Shared Album" /> -
-
- {/if} - - {#if isShowAlbumPicker} - (isShowAlbumPicker = false)} - /> - {/if} - - {#if isShowCreateSharedLinkModal} - + + onAssetDelete(asset.id)} /> + + + + + + + + {/if}
diff --git a/web/src/routes/(user)/favorites/+page.svelte b/web/src/routes/(user)/favorites/+page.svelte index e5495cb3c..c9c7aea20 100644 --- a/web/src/routes/(user)/favorites/+page.svelte +++ b/web/src/routes/(user)/favorites/+page.svelte @@ -1,21 +1,17 @@ {#if isMultiSelectionMode} - - -

- Selected {selectedAssets.size} -

-
- - - - -
-{/if} - - -{#if isShowCreateSharedLinkModal} - + (selectedAssets = new Set())}> + + onAssetDelete(asset.id)} /> + {/if} diff --git a/web/src/routes/(user)/partners/[userId]/+page.svelte b/web/src/routes/(user)/partners/[userId]/+page.svelte index f6f38c637..f9a3f19bf 100644 --- a/web/src/routes/(user)/partners/[userId]/+page.svelte +++ b/web/src/routes/(user)/partners/[userId]/+page.svelte @@ -1,52 +1,34 @@
{#if $isMultiSelectStoreState} - assetInteractionStore.clearMultiselect()} - tailwindClasses={'bg-white shadow-md'} + - -

- Selected {$selectedAssets.size.toLocaleString($locale)} -

-
- - - - -
+ + {:else} - import { goto } from '$app/navigation'; + import UserPageLayout from '$lib/components/layouts/user-page-layout.svelte'; + import CreateSharedLink from '$lib/components/photos-page/actions/create-shared-link.svelte'; + import DeleteAssets from '$lib/components/photos-page/actions/delete-assets.svelte'; + import DownloadFiles from '$lib/components/photos-page/actions/download-files.svelte'; + import MoveToArchive from '$lib/components/photos-page/actions/move-to-archive.svelte'; import AssetGrid from '$lib/components/photos-page/asset-grid.svelte'; - import AlbumSelectionModal from '$lib/components/shared-components/album-selection-modal.svelte'; - import CircleIconButton from '$lib/components/elements/buttons/circle-icon-button.svelte'; - import ContextMenu from '$lib/components/shared-components/context-menu/context-menu.svelte'; - import MenuOption from '$lib/components/shared-components/context-menu/menu-option.svelte'; - import ControlAppBar from '$lib/components/shared-components/control-app-bar.svelte'; - import CreateSharedLinkModal from '$lib/components/shared-components/create-share-link-modal/create-shared-link-modal.svelte'; - import { - notificationController, - NotificationType - } from '$lib/components/shared-components/notification/notification'; + import AssetSelectContextMenu from '$lib/components/photos-page/asset-select-context-menu.svelte'; + import AssetSelectControlBar from '$lib/components/photos-page/asset-select-control-bar.svelte'; + import OptionAddToAlbum from '$lib/components/photos-page/menu-options/option-add-to-album.svelte'; + import OptionAddToFavorites from '$lib/components/photos-page/menu-options/option-add-to-favorites.svelte'; import { assetInteractionStore, isMultiSelectStoreState, selectedAssets } from '$lib/stores/asset-interaction.store'; import { assetStore } from '$lib/stores/assets.store'; - import { addAssetsToAlbum, bulkDownload } from '$lib/utils/asset-utils'; - import { AlbumResponseDto, api, SharedLinkType } from '@api'; - import ArchiveArrowDownOutline from 'svelte-material-icons/ArchiveArrowDownOutline.svelte'; - import Close from 'svelte-material-icons/Close.svelte'; - import CloudDownloadOutline from 'svelte-material-icons/CloudDownloadOutline.svelte'; - import DeleteOutline from 'svelte-material-icons/DeleteOutline.svelte'; + import { onDestroy } from 'svelte'; import Plus from 'svelte-material-icons/Plus.svelte'; - import ShareVariantOutline from 'svelte-material-icons/ShareVariantOutline.svelte'; - import { locale } from '$lib/stores/preferences.store'; - import UserPageLayout from '$lib/components/layouts/user-page-layout.svelte'; import type { PageData } from './$types'; export let data: PageData; - let isShowCreateSharedLinkModal = false; - const deleteSelectedAssetHandler = async () => { - try { - if ( - window.confirm( - `Caution! Are you sure you want to delete ${$selectedAssets.size} assets? This step also deletes assets in the album(s) to which they belong. You can not undo this action!` - ) - ) { - const { data: deletedAssets } = await api.assetApi.deleteAsset({ - ids: Array.from($selectedAssets).map((a) => a.id) - }); - - for (const asset of deletedAssets) { - if (asset.status == 'SUCCESS') { - assetStore.removeAsset(asset.id); - } - } - - assetInteractionStore.clearMultiselect(); - } - } catch (e) { - notificationController.show({ - type: NotificationType.Error, - message: 'Error deleting assets, check console for more details' - }); - console.error('Error deleteSelectedAssetHandler', e); - } - }; - - let contextMenuPosition = { x: 0, y: 0 }; - let isShowAddMenu = false; - let isShowAlbumPicker = false; - let addToSharedAlbum = false; - - const handleShowMenu = ({ x, y }: MouseEvent) => { - contextMenuPosition = { x, y }; - isShowAddMenu = !isShowAddMenu; - }; - - const handleArchive = async () => { - let cnt = 0; - for (const asset of $selectedAssets) { - if (!asset.isArchived) { - api.assetApi.updateAsset(asset.id, { - isArchived: true - }); - - assetStore.removeAsset(asset.id); - cnt = cnt + 1; - } - } - - notificationController.show({ - message: `Archived ${cnt}`, - type: NotificationType.Info - }); - + onDestroy(() => { assetInteractionStore.clearMultiselect(); - }; - - const handleAddToFavorites = () => { - isShowAddMenu = false; - - let cnt = 0; - for (const asset of $selectedAssets) { - if (!asset.isFavorite) { - api.assetApi.updateAsset(asset.id, { - isFavorite: true - }); - assetStore.updateAsset(asset.id, true); - cnt = cnt + 1; - } - } - - notificationController.show({ - message: `Added ${cnt} to favorites`, - type: NotificationType.Info - }); - - assetInteractionStore.clearMultiselect(); - }; - - const handleShowAlbumPicker = (shared: boolean) => { - isShowAddMenu = false; - isShowAlbumPicker = true; - addToSharedAlbum = shared; - }; - - const handleAddToNewAlbum = (event: CustomEvent) => { - isShowAlbumPicker = false; - - const { albumName }: { albumName: string } = event.detail; - const assetIds = Array.from($selectedAssets).map((asset) => asset.id); - api.albumApi.createAlbum({ albumName, assetIds }).then((response) => { - const { id, albumName } = response.data; - - notificationController.show({ - message: `Added ${assetIds.length} to ${albumName}`, - type: NotificationType.Info - }); - - assetInteractionStore.clearMultiselect(); - - goto('/albums/' + id); - }); - }; - - const handleAddToAlbum = async (event: CustomEvent<{ album: AlbumResponseDto }>) => { - isShowAlbumPicker = false; - const album = event.detail.album; - - const assetIds = Array.from($selectedAssets).map((asset) => asset.id); - - addAssetsToAlbum(album.id, assetIds).then(() => { - assetInteractionStore.clearMultiselect(); - }); - }; - - const handleDownloadFiles = async () => { - await bulkDownload('immich', Array.from($selectedAssets), () => { - assetInteractionStore.clearMultiselect(); - }); - }; - - const handleCreateSharedLink = async () => { - isShowCreateSharedLinkModal = true; - }; - - const handleCloseSharedLinkModal = () => { - assetInteractionStore.clearMultiselect(); - isShowCreateSharedLinkModal = false; - }; + }); {#if $isMultiSelectStoreState} - assetInteractionStore.clearMultiselect()} - backIcon={Close} - tailwindClasses={'bg-white shadow-md'} + - -

- Selected {$selectedAssets.size.toLocaleString($locale)} -

-
- - - - - - - -
- {/if} - - {#if isShowAddMenu} - (isShowAddMenu = false)}> -
- - handleShowAlbumPicker(false)} text="Add to Album" /> - handleShowAlbumPicker(true)} text="Add to Shared Album" /> -
-
- {/if} - - {#if isShowAlbumPicker} - (isShowAlbumPicker = false)} - /> - {/if} - - {#if isShowCreateSharedLinkModal} - + + assetStore.removeAsset(asset.id)} /> + + + + + + + + {/if}
diff --git a/web/src/routes/(user)/search/+page.svelte b/web/src/routes/(user)/search/+page.svelte index 8bed2cb01..4c50243d0 100644 --- a/web/src/routes/(user)/search/+page.svelte +++ b/web/src/routes/(user)/search/+page.svelte @@ -1,31 +1,25 @@
{#if isMultiSelectionMode} - - -

- Selected {selectedAssets.size.toLocaleString($locale)} -

-
- - - - - - - - - -
+ (selectedAssets = new Set())}> + + {#if isAllArchived} + + {:else} + + {/if} + + + {#if isAllFavorite} + + {:else} + + {/if} + + + + + {:else} goto(previousRoute)} backIcon={ArrowLeft}>
@@ -271,35 +102,4 @@ {/if}
- - {#if isShowAddMenu} - (isShowAddMenu = false)}> -
- - handleShowAlbumPicker(false)} text="Add to Album" /> - handleShowAlbumPicker(true)} text="Add to Shared Album" /> -
-
- {/if} - - {#if isShowAlbumPicker} - (isShowAlbumPicker = false)} - /> - {/if} - - {#if isShowCreateSharedLinkModal} - - {/if}