From 7793715a30f85b2986754e32bbf9a872ca03741e Mon Sep 17 00:00:00 2001 From: Justin Edmund Date: Sat, 20 Dec 2025 02:13:56 -0800 Subject: [PATCH] filter mainhand weapons by job proficiency --- src/lib/components/panels/SearchSidebar.svelte | 16 +++++++++++----- src/lib/components/party/Party.svelte | 9 ++++++++- src/lib/components/sidebar/SearchContent.svelte | 16 ++++++++++++---- .../features/search/openSearchSidebar.svelte.ts | 7 +++++-- 4 files changed, 36 insertions(+), 12 deletions(-) diff --git a/src/lib/components/panels/SearchSidebar.svelte b/src/lib/components/panels/SearchSidebar.svelte index c98ede42..191e0807 100644 --- a/src/lib/components/panels/SearchSidebar.svelte +++ b/src/lib/components/panels/SearchSidebar.svelte @@ -11,6 +11,7 @@ onClose?: () => void onAddItems?: (items: SearchResult[]) => void canAddMore?: boolean + requiredProficiencies?: number[] // For mainhand: restricts to job's proficiencies } let { @@ -18,7 +19,8 @@ type = 'weapon', onClose = () => {}, onAddItems = () => {}, - canAddMore = true + canAddMore = true, + requiredProficiencies }: Props = $props() // Search state @@ -118,8 +120,12 @@ if (rarityFilters.length > 0) { params.filters.rarity = rarityFilters } - if (type === 'weapon' && proficiencyFilters.length > 0) { - params.filters.proficiency1 = proficiencyFilters + if (type === 'weapon') { + // Use required proficiencies (for mainhand) if set, otherwise use user-selected filters + const profs = requiredProficiencies ?? (proficiencyFilters.length > 0 ? proficiencyFilters : undefined) + if (profs && profs.length > 0) { + params.filters.proficiency1 = profs + } } let response @@ -264,8 +270,8 @@ - - {#if type === 'weapon'} + + {#if type === 'weapon' && !requiredProficiencies}
diff --git a/src/lib/components/party/Party.svelte b/src/lib/components/party/Party.svelte index 393b5179..f5b37067 100644 --- a/src/lib/components/party/Party.svelte +++ b/src/lib/components/party/Party.svelte @@ -825,13 +825,20 @@ ? GridType.Summon : GridType.Character + // For mainhand weapons (position -1), restrict to job's proficiencies + const requiredProficiencies = + opts.type === 'weapon' && opts.position === -1 && party.job?.proficiency + ? party.job.proficiency.filter((p): p is number => p !== null && p !== undefined && p !== 0) + : undefined + // Open the search sidebar with the appropriate type // Pass authUserId to enable collection mode toggle openSearchSidebar({ type: opts.type, onAddItems: handleAddItems, canAddMore: true, - authUserId + authUserId, + requiredProficiencies }) } }) diff --git a/src/lib/components/sidebar/SearchContent.svelte b/src/lib/components/sidebar/SearchContent.svelte index 98436298..8e7e420f 100644 --- a/src/lib/components/sidebar/SearchContent.svelte +++ b/src/lib/components/sidebar/SearchContent.svelte @@ -19,13 +19,16 @@ canAddMore?: boolean /** User ID to enable collection search mode */ authUserId?: string + /** Required proficiencies for mainhand weapon selection */ + requiredProficiencies?: number[] } let { type = 'weapon', onAddItems = () => {}, canAddMore = true, - authUserId + authUserId, + requiredProficiencies }: Props = $props() // Search state (local UI state) @@ -95,10 +98,15 @@ }) // Build filters object for query + // Use requiredProficiencies for mainhand selection if set, otherwise use user-selected filters + const effectiveProficiencies = $derived( + requiredProficiencies ?? (proficiencyFilters.length > 0 ? proficiencyFilters : undefined) + ) + const filters = $derived({ element: elementFilters.length > 0 ? elementFilters : undefined, rarity: rarityFilters.length > 0 ? rarityFilters : undefined, - proficiency: type === 'weapon' && proficiencyFilters.length > 0 ? proficiencyFilters : undefined + proficiency: type === 'weapon' && effectiveProficiencies ? effectiveProficiencies : undefined }) // Helper to map collection items to search result format with collectionId @@ -394,8 +402,8 @@
- - {#if type === 'weapon'} + + {#if type === 'weapon' && !requiredProficiencies}
diff --git a/src/lib/features/search/openSearchSidebar.svelte.ts b/src/lib/features/search/openSearchSidebar.svelte.ts index 24e1df76..d4057053 100644 --- a/src/lib/features/search/openSearchSidebar.svelte.ts +++ b/src/lib/features/search/openSearchSidebar.svelte.ts @@ -8,10 +8,12 @@ interface SearchSidebarOptions { canAddMore?: boolean /** User ID to enable collection search mode. If not provided, only "All Items" mode is available. */ authUserId?: string + /** Required proficiencies for mainhand weapon selection */ + requiredProficiencies?: number[] } export function openSearchSidebar(options: SearchSidebarOptions) { - const { type, onAddItems, canAddMore = true, authUserId } = options + const { type, onAddItems, canAddMore = true, authUserId, requiredProficiencies } = options // Open the sidebar with the search component const title = `Search ${type.charAt(0).toUpperCase() + type.slice(1)}s` @@ -19,7 +21,8 @@ export function openSearchSidebar(options: SearchSidebarOptions) { type, onAddItems, canAddMore, - authUserId + authUserId, + requiredProficiencies }) }