From 30ee12678f844e3d0dd9e42f69db1b13923dcd8e Mon Sep 17 00:00:00 2001 From: Freddie Date: Tue, 6 Oct 2026 13:57:17 -0700 Subject: [PATCH 1/5] Add "Only collectors" option to Professions>Recipes --- .../professions/recipes/View.svelte | 87 +++++++++++-------- apps/frontend/shared/state/browser.svelte.ts | 4 + apps/frontend/stores/local-storage/index.ts | 1 - .../local-storage/professions-recipes.ts | 15 ---- .../collections/recipes/View.svelte | 7 +- 5 files changed, 57 insertions(+), 57 deletions(-) delete mode 100644 apps/frontend/stores/local-storage/professions-recipes.ts diff --git a/apps/frontend/components/professions/recipes/View.svelte b/apps/frontend/components/professions/recipes/View.svelte index 93d7e1dae..582a8214f 100644 --- a/apps/frontend/components/professions/recipes/View.svelte +++ b/apps/frontend/components/professions/recipes/View.svelte @@ -5,9 +5,10 @@ import { Faction } from '@/enums/faction'; import { SkillSourceType } from '@/enums/skill-source-type'; import { iconLibrary } from '@/shared/icons'; + import { browserState } from '@/shared/state/browser.svelte'; import { settingsState } from '@/shared/state/settings.svelte'; import { wowthingData } from '@/shared/stores/data'; - import { newNavState, professionsRecipesState } from '@/stores/local-storage'; + import { newNavState } from '@/stores/local-storage'; import { userState } from '@/user-home/state/user'; import { useCharacterFilter } from '@/utils/characters'; import type { Character, ExpansionData } from '@/types'; @@ -26,54 +27,61 @@ import WowthingImage from '@/shared/components/images/sources/WowthingImage.svelte'; import YesNoIcon from '@/shared/components/icons/YesNoIcon.svelte'; - export let expansion: ExpansionData; - export let profession: StaticDataProfession; + type Props = { + expansion: ExpansionData; + profession: StaticDataProfession; + }; + + let { expansion, profession }: Props = $props(); - let categoryChildren: StaticDataProfessionCategory[]; - let characters: Character[]; - let colspan: number; - let subProfession: StaticDataSubProfession; - $: { - categoryChildren = profession.expansionCategory[expansion.id].children[0].children.filter( + let categoryChildren = $derived( + profession.expansionCategory[expansion.id].children[0].children.filter( (cat) => cat.abilities.length > 0 - ); - subProfession = profession.expansionSubProfession[expansion.id]; + ) + ); + let subProfession = $derived(profession.expansionSubProfession[expansion.id]); + + let characters = $derived.by(() => { + const ret: Character[] = []; - characters = []; const collectorIds = settingsState.value.professions.collectingCharactersV2?.[profession.id] || []; const validCollectors = collectorIds .map((collectorId) => userState.general.characterById[collectorId]) .filter((char) => !!char); if (validCollectors.length > 0) { - characters.push(null); - characters.push(...validCollectors); + ret.push(null); + ret.push(...validCollectors); } - const professionCharacters = userState.general.visibleCharacters.filter((char) => - useCharacterFilter( - settingsState.value, - (c) => - !collectorIds.includes(c.id) && - !!c.professions?.[profession.id]?.subProfessions?.[subProfession.id], - char, - $newNavState.characterFilter - ) - ); - if (professionCharacters.length > 0) { - characters.push(null); + if (!browserState.current.professions.recipesOnlyCollectors) { + const professionCharacters = userState.general.visibleCharacters.filter((char) => + useCharacterFilter( + settingsState.value, + (c) => + !collectorIds.includes(c.id) && + !!c.professions?.[profession.id]?.subProfessions?.[subProfession.id], + char, + $newNavState.characterFilter + ) + ); + if (professionCharacters.length > 0) { + ret.push(null); - professionCharacters.sort((a, b) => { - if (a.level !== b.level) { - return b.level - a.level; - } - return a.name.localeCompare(b.name); - }); - characters.push(...professionCharacters); + professionCharacters.sort((a, b) => { + if (a.level !== b.level) { + return b.level - a.level; + } + return a.name.localeCompare(b.name); + }); + ret.push(...professionCharacters); + } } - colspan = 3 + characters.length; - } + return ret; + }); + + let colspan = $derived(characters.length + 3); const getAbilities = ( category: StaticDataProfessionCategory, @@ -167,9 +175,14 @@ Include discovered/trainer recipes + Only collectors {#each characters as character} {#if character} @@ -194,7 +207,7 @@ {#each categoryChildren as category} {@const abilities = getAbilities( category, - $professionsRecipesState.includeTrainerRecipes + browserState.current.professions.recipesIncludeTrainer )} {#if abilities.length > 0} diff --git a/apps/frontend/shared/state/browser.svelte.ts b/apps/frontend/shared/state/browser.svelte.ts index e246790c4..2d21660d9 100644 --- a/apps/frontend/shared/state/browser.svelte.ts +++ b/apps/frontend/shared/state/browser.svelte.ts @@ -118,6 +118,8 @@ interface BrowserStateIdk { }; professions: { patronOrdersUnknown: boolean; + recipesIncludeTrainer: boolean; + recipesOnlyCollectors: boolean; }; reputations: { sortOrder: Record; @@ -284,6 +286,8 @@ const initialState: BrowserStateIdk = { }, professions: { patronOrdersUnknown: true, + recipesIncludeTrainer: true, + recipesOnlyCollectors: false, }, reputations: { sortOrder: {}, diff --git a/apps/frontend/stores/local-storage/index.ts b/apps/frontend/stores/local-storage/index.ts index eba4eef93..f52378439 100644 --- a/apps/frontend/stores/local-storage/index.ts +++ b/apps/frontend/stores/local-storage/index.ts @@ -6,7 +6,6 @@ export * from './collecting-settings'; export * from './currency'; export * from './history'; export * from './new-nav'; -export * from './professions-recipes'; export * from './progress'; export * from './sub-sidebar'; export * from './transmog-sets'; diff --git a/apps/frontend/stores/local-storage/professions-recipes.ts b/apps/frontend/stores/local-storage/professions-recipes.ts deleted file mode 100644 index 8bd2ecca6..000000000 --- a/apps/frontend/stores/local-storage/professions-recipes.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { writable } from 'svelte/store'; - -class ProfessionsRecipesState { - public includeTrainerRecipes = true; -} - -const key = 'state-professions-recipes'; -const initialState = new ProfessionsRecipesState(); -Object.assign(initialState, JSON.parse(localStorage.getItem(key) ?? '{}')); - -export const professionsRecipesState = writable(initialState); - -professionsRecipesState.subscribe((state) => { - localStorage.setItem(key, JSON.stringify(state)); -}); diff --git a/apps/frontend/user-home/components/collections/recipes/View.svelte b/apps/frontend/user-home/components/collections/recipes/View.svelte index 422ea7113..83b5a6d60 100644 --- a/apps/frontend/user-home/components/collections/recipes/View.svelte +++ b/apps/frontend/user-home/components/collections/recipes/View.svelte @@ -26,12 +26,11 @@ const retCategory = profession.expansionCategory[expansionId].children[0]; const retSubCategories: [StaticDataProfessionCategory, UserCount][] = []; for (const subCategory of retCategory.children) { - if (subCategory.abilities.length === 0) { - continue; - } - const subStats = userState.recipes.stats[`${professionSlug}--${expansionSlug}--${subCategory.id}`]; + if (!subStats || subStats.total === 0) { + continue; + } let anyShown = false; for (const ability of subCategory.abilities) { From ef5fb25ad7c019f2380731a83e51b84be746b138 Mon Sep 17 00:00:00 2001 From: Freddie Date: Tue, 6 Oct 2026 14:37:59 -0700 Subject: [PATCH 2/5] Fix Professions>Recipes filtering for hidden/ignored abilities --- .../professions/recipes/AbilityRow.svelte | 109 ++++++++++++++++++ .../professions/recipes/View.svelte | 98 +--------------- 2 files changed, 113 insertions(+), 94 deletions(-) create mode 100644 apps/frontend/components/professions/recipes/AbilityRow.svelte diff --git a/apps/frontend/components/professions/recipes/AbilityRow.svelte b/apps/frontend/components/professions/recipes/AbilityRow.svelte new file mode 100644 index 000000000..c27ad7bf2 --- /dev/null +++ b/apps/frontend/components/professions/recipes/AbilityRow.svelte @@ -0,0 +1,109 @@ + + + + +{#if !isHidden && (!isIgnored || anyCharacterHas)} + + + {#if recipeItem} + + + + + {#if recipeItem.allianceOnly} + + {:else if recipeItem.hordeOnly} + + {/if} + + + {:else if ability.spellId} + + + + {:else} + + {/if} + + + + {#if ability.name} + {ability.name} + {:else} + {wowthingData.items.items[ability.itemIds[0] || 0]?.name} + {/if} + + + + {#if recipes && recipes.some((id) => wowthingData.items.items[id]?.bindType !== BindType.OnAcquire)} + + + + {/if} + + + {#each characters as character} + {#if character === null} + + {:else if (recipeItem?.allianceOnly && character.faction !== Faction.Alliance) || (recipeItem?.hordeOnly && character.faction !== Faction.Horde)} + --- + {:else} + {@const charProf = + character.professions[profession.id]?.subProfessions?.[subProfession.id]} + {@const charHas = charProf?.knownRecipes?.has?.(ability.id)} + + + + {/if} + {/each} + +{/if} diff --git a/apps/frontend/components/professions/recipes/View.svelte b/apps/frontend/components/professions/recipes/View.svelte index 582a8214f..b91dbfcd4 100644 --- a/apps/frontend/components/professions/recipes/View.svelte +++ b/apps/frontend/components/professions/recipes/View.svelte @@ -1,10 +1,7 @@ diff --git a/apps/frontend/auctions/Sidebar.svelte b/apps/frontend/auctions/Sidebar.svelte index e4689f757..ca99a6f40 100644 --- a/apps/frontend/auctions/Sidebar.svelte +++ b/apps/frontend/auctions/Sidebar.svelte @@ -10,12 +10,18 @@ import Sidebar from '@/shared/components/sub-sidebar/SubSidebar.svelte'; import TextInput from '@/shared/components/forms/TextInput.svelte'; + let { baseUrlPrefix }: { baseUrlPrefix: string } = $props(); + let searchValue: string; + let baseUrl = $derived( + `${baseUrlPrefix || ''}/browse/${Region[$auctionsAppState.region].toLowerCase()}` + ); + const onSubmit = async function () { if (searchValue?.trim()?.length > 0) { replace( - `/search/${Region[$auctionsAppState.region].toLowerCase()}/${encodeURIComponent(searchValue)}` + `${baseUrlPrefix || ''}/search/${Region[$auctionsAppState.region].toLowerCase()}/${encodeURIComponent(searchValue)}` ); } }; @@ -67,16 +73,10 @@ {#key $auctionsAppState.region} - +
- {#each ['us', 'eu', 'kr', 'tw'] as region} + {#each ['us', 'eu', 'kr', 'tw'] as region (region)}