diff --git a/web/src/lib/components/asset-viewer/asset-viewer.svelte b/web/src/lib/components/asset-viewer/asset-viewer.svelte index fd1fb70f5f..8d3e7b33b3 100644 --- a/web/src/lib/components/asset-viewer/asset-viewer.svelte +++ b/web/src/lib/components/asset-viewer/asset-viewer.svelte @@ -9,7 +9,7 @@ import { goto } from '$app/navigation'; import { downloadAssets } from '$lib/stores/download'; import VideoViewer from './video-viewer.svelte'; - import AlbumSelectionModal from './album-selection-modal.svelte'; + import AlbumSelectionModal from '../shared-components/album-selection-modal.svelte'; import { api, AddAssetsResponseDto, @@ -300,7 +300,6 @@ on:album={handleAddToAlbum} on:close={() => (isShowAlbumPicker = false)} /> -
Hello
{/if} diff --git a/web/src/lib/components/asset-viewer/album-selection-modal.svelte b/web/src/lib/components/shared-components/album-selection-modal.svelte similarity index 95% rename from web/src/lib/components/asset-viewer/album-selection-modal.svelte rename to web/src/lib/components/shared-components/album-selection-modal.svelte index 9be06b4530..3d30c9a4f3 100644 --- a/web/src/lib/components/asset-viewer/album-selection-modal.svelte +++ b/web/src/lib/components/shared-components/album-selection-modal.svelte @@ -2,8 +2,8 @@ import { AlbumResponseDto, api } from '@api'; import { createEventDispatcher, onMount } from 'svelte'; import Plus from 'svelte-material-icons/Plus.svelte'; - import BaseModal from '../shared-components/base-modal.svelte'; - import AlbumListItem from './album-list-item.svelte'; + import BaseModal from './base-modal.svelte'; + import AlbumListItem from '../asset-viewer/album-list-item.svelte'; let albums: AlbumResponseDto[] = []; let recentAlbums: AlbumResponseDto[] = []; diff --git a/web/src/routes/photos/+page.svelte b/web/src/routes/photos/+page.svelte index a3f22befee..1e82688cfc 100644 --- a/web/src/routes/photos/+page.svelte +++ b/web/src/routes/photos/+page.svelte @@ -2,6 +2,10 @@ import NavigationBar from '$lib/components/shared-components/navigation-bar.svelte'; import SideBar from '$lib/components/shared-components/side-bar/side-bar.svelte'; import AssetGrid from '$lib/components/photos-page/asset-grid.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 AlbumSelectionModal from '$lib/components/shared-components/album-selection-modal.svelte'; + import { goto } from '$app/navigation'; import type { PageData } from './$types'; @@ -15,7 +19,8 @@ import Close from 'svelte-material-icons/Close.svelte'; import CircleIconButton from '$lib/components/shared-components/circle-icon-button.svelte'; import DeleteOutline from 'svelte-material-icons/DeleteOutline.svelte'; - import { api } from '@api'; + import Plus from 'svelte-material-icons/Plus.svelte'; + import { AlbumResponseDto, api } from '@api'; import { notificationController, NotificationType @@ -51,6 +56,59 @@ console.error('Error deleteSelectedAssetHandler', e); } }; + + let contextMenuPosition = { x: 0, y: 0 }; + let isShowAddMenu = false; + let isShowAlbumPicker = false; + let addToSharedAlbum = false; + + const handleShowMenu = (event: CustomEvent) => { + contextMenuPosition = { + x: event.detail.mouseEvent.x, + y: event.detail.mouseEvent.y + }; + + isShowAddMenu = !isShowAddMenu; + }; + + const handleShowAlbumPicker = (shared: boolean) => { + isShowAddMenu = false; + isShowAlbumPicker = true; + addToSharedAlbum = shared; + }; + + const handleAddToNewAlbum = () => { + isShowAlbumPicker = false; + + const assetIds = Array.from($selectedAssets).map((asset) => asset.id); + api.albumApi.createAlbum({ albumName: 'Untitled', 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); + api.albumApi.addAssetsToAlbum(album.id, { assetIds }).then(({ data: dto }) => { + notificationController.show({ + message: `Added ${dto.successfullyAdded} to ${dto.album?.albumName}`, + type: NotificationType.Info + }); + + assetInteractionStore.clearMultiselect(); + }); + }; @@ -70,6 +128,7 @@

+ openFileUploadDialog(UploadType.GENERAL)} /> {/if} + + {#if isShowAddMenu} + (isShowAddMenu = false)}> +
+ handleShowAlbumPicker(false)} text="Add to Album" /> + handleShowAlbumPicker(true)} text="Add to Shared Album" /> +
+
+ {/if} + + {#if isShowAlbumPicker} + (isShowAlbumPicker = false)} + /> + {/if}