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}