diff --git a/src/routes/(app)/[username]/collection/+layout.svelte b/src/routes/(app)/[username]/collection/+layout.svelte index eeb416ab..9ed7a9c3 100644 --- a/src/routes/(app)/[username]/collection/+layout.svelte +++ b/src/routes/(app)/[username]/collection/+layout.svelte @@ -2,17 +2,53 @@ import type { LayoutData } from './$types' import { page } from '$app/stores' import { goto } from '$app/navigation' + import { setContext } from 'svelte' + import { DropdownMenu } from 'bits-ui' import ProfileHeader from '$lib/components/profile/ProfileHeader.svelte' import SegmentedControl from '$lib/components/ui/segmented-control/SegmentedControl.svelte' import Segment from '$lib/components/ui/segmented-control/Segment.svelte' import Button from '$lib/components/ui/Button.svelte' import Icon from '$lib/components/Icon.svelte' + import DropdownItem from '$lib/components/ui/dropdown/DropdownItem.svelte' import AddToCollectionModal from '$lib/components/collection/AddToCollectionModal.svelte' + import BulkDeleteConfirmModal from '$lib/components/collection/BulkDeleteConfirmModal.svelte' import { openAddArtifactSidebar } from '$lib/features/collection/openAddArtifactSidebar' + import { + createSelectionModeContext, + SELECTION_MODE_KEY, + LOADED_IDS_KEY, + type EntityType + } from '$lib/stores/selectionMode.svelte' + import { + useBulkRemoveCharactersFromCollection, + useBulkRemoveWeaponsFromCollection, + useBulkRemoveSummonsFromCollection + } from '$lib/api/mutations/collection.mutations' + import { useBulkDeleteCollectionArtifacts } from '$lib/api/mutations/artifact.mutations' let { data, children }: { data: LayoutData; children: any } = $props() + // Bulk delete mutations + const bulkDeleteCharacters = useBulkRemoveCharactersFromCollection() + const bulkDeleteWeapons = useBulkRemoveWeaponsFromCollection() + const bulkDeleteSummons = useBulkRemoveSummonsFromCollection() + const bulkDeleteArtifacts = useBulkDeleteCollectionArtifacts() + let addModalOpen = $state(false) + let confirmDeleteOpen = $state(false) + let isDeleting = $state(false) + + // Selection mode context + const selectionMode = createSelectionModeContext() + setContext(SELECTION_MODE_KEY, selectionMode) + + // Context for child pages to provide their loaded IDs + let loadedIds = $state([]) + setContext(LOADED_IDS_KEY, { + setIds: (ids: string[]) => { + loadedIds = ids + } + }) // Determine active entity type from URL path const activeEntityType = $derived.by(() => { @@ -43,12 +79,69 @@ const username = $derived(data.user?.username || $page.params.username) function handleTabChange(value: string) { + // Exit selection mode when switching entity types + if (selectionMode.isActive) { + selectionMode.exit() + } goto(`/${username}/collection/${value}`) } function handleAddArtifact() { openAddArtifactSidebar() } + + function handleEnterSelectionMode() { + selectionMode.enter(activeEntityType as EntityType) + } + + function handleCancelSelection() { + selectionMode.exit() + } + + function handleSelectAll() { + selectionMode.selectAll(loadedIds) + } + + function handleDeleteClick() { + if (selectionMode.selectedCount > 0) { + confirmDeleteOpen = true + } + } + + async function handleConfirmDelete() { + isDeleting = true + const ids = Array.from(selectionMode.selectedIds) + + try { + // Call the appropriate bulk delete mutation based on entity type + switch (activeEntityType) { + case 'characters': + await bulkDeleteCharacters.mutateAsync(ids) + break + case 'weapons': + await bulkDeleteWeapons.mutateAsync(ids) + break + case 'summons': + await bulkDeleteSummons.mutateAsync(ids) + break + case 'artifacts': + await bulkDeleteArtifacts.mutateAsync(ids) + break + } + + selectionMode.exit() + confirmDeleteOpen = false + } catch (error) { + console.error('Failed to delete items:', error) + // Keep modal open on error so user can retry + } finally { + isDeleting = false + } + } + + function handleCancelDelete() { + confirmDeleteOpen = false + } @@ -72,38 +165,81 @@
@@ -121,9 +257,19 @@ /> {/if} + + diff --git a/src/routes/(app)/[username]/collection/characters/+page.svelte b/src/routes/(app)/[username]/collection/characters/+page.svelte index 22dd36c0..03218a31 100644 --- a/src/routes/(app)/[username]/collection/characters/+page.svelte +++ b/src/routes/(app)/[username]/collection/characters/+page.svelte @@ -1,6 +1,7 @@