From 9b15cad7ce6ab307903250166f1b43211b141d53 Mon Sep 17 00:00:00 2001 From: Justin Edmund Date: Fri, 19 Dec 2025 01:36:24 -0800 Subject: [PATCH] add equippable characters section to artifact detail pane --- src/lib/api/queries/collection.queries.ts | 23 +++ .../CollectionArtifactDetailPane.svelte | 12 +- .../EquippableCharactersSection.svelte | 149 ++++++++++++++++++ .../collection/artifacts/+page.svelte | 1 + 4 files changed, 184 insertions(+), 1 deletion(-) create mode 100644 src/lib/components/collection/EquippableCharactersSection.svelte diff --git a/src/lib/api/queries/collection.queries.ts b/src/lib/api/queries/collection.queries.ts index 66245945..dd1e38c5 100644 --- a/src/lib/api/queries/collection.queries.ts +++ b/src/lib/api/queries/collection.queries.ts @@ -182,6 +182,29 @@ export const collectionQueries = { enabled: !!id, staleTime: 1000 * 60 * 5, gcTime: 1000 * 60 * 30 + }), + + /** + * User's collection characters as a simple list (non-paginated) + * Useful for smaller filtered queries where infinite scroll is overkill + * + * @param userId - The user whose collection to fetch + * @param filters - Optional filters for element, proficiency, etc. + * @param enabled - Whether the query is enabled (default: true) + */ + charactersList: (userId: string, filters?: CollectionFilters, enabled: boolean = true) => + queryOptions({ + queryKey: ['collection', 'characters', 'list', userId, filters] as const, + queryFn: async () => { + const response = await collectionAdapter.listCharacters(userId, { + ...filters, + limit: 100 + }) + return response.results + }, + enabled: !!userId && enabled, + staleTime: 1000 * 60 * 2, + gcTime: 1000 * 60 * 15 }) } diff --git a/src/lib/components/collection/CollectionArtifactDetailPane.svelte b/src/lib/components/collection/CollectionArtifactDetailPane.svelte index e2bd2356..ab76e9e2 100644 --- a/src/lib/components/collection/CollectionArtifactDetailPane.svelte +++ b/src/lib/components/collection/CollectionArtifactDetailPane.svelte @@ -23,14 +23,16 @@ import ArtifactGradeDisplay from '$lib/components/artifact/ArtifactGradeDisplay.svelte' import ArtifactSkillDisplay from '$lib/components/artifact/ArtifactSkillDisplay.svelte' import CollectionArtifactEditPane from './CollectionArtifactEditPane.svelte' + import EquippableCharactersSection from './EquippableCharactersSection.svelte' interface Props { artifact: CollectionArtifact + userId: string isOwner?: boolean onClose?: () => void } - let { artifact: initialArtifact, isOwner = false, onClose }: Props = $props() + let { artifact: initialArtifact, userId, isOwner = false, onClose }: Props = $props() // Local state that can be updated when returning from edit pane let artifact = $state(initialArtifact) @@ -164,6 +166,14 @@ {/if} + {#if proficiency} + + {/if} +
diff --git a/src/lib/components/collection/EquippableCharactersSection.svelte b/src/lib/components/collection/EquippableCharactersSection.svelte new file mode 100644 index 00000000..01a7fed6 --- /dev/null +++ b/src/lib/components/collection/EquippableCharactersSection.svelte @@ -0,0 +1,149 @@ + + + + + + {#if isLoading} +
+ +
+ {:else if isEmpty} +
+ No matching characters in collection +
+ {:else} +
+ {#each characters as character (character.id)} + + {#snippet content()} +
+ {getDisplayName(character)} + +
+ {/snippet} + {#snippet children()} +
+ {getDisplayName(character)} +
+ {/snippet} +
+ {/each} +
+ {/if} +
+ + diff --git a/src/routes/(app)/[username]/collection/artifacts/+page.svelte b/src/routes/(app)/[username]/collection/artifacts/+page.svelte index 36b5a87a..8d93ffca 100644 --- a/src/routes/(app)/[username]/collection/artifacts/+page.svelte +++ b/src/routes/(app)/[username]/collection/artifacts/+page.svelte @@ -177,6 +177,7 @@ CollectionArtifactDetailPane, { artifact, + userId: data.user.id, isOwner: data.isOwner, onClose: () => sidebar.close() },