diff --git a/apps/frontend/components/home/table/row/HomeTableRowTaskChore.svelte b/apps/frontend/components/home/table/row/HomeTableRowTaskChore.svelte
index 5d082cc5f..d665d2222 100644
--- a/apps/frontend/components/home/table/row/HomeTableRowTaskChore.svelte
+++ b/apps/frontend/components/home/table/row/HomeTableRowTaskChore.svelte
@@ -2,6 +2,7 @@
import { QuestStatus } from '@/enums/quest-status';
import { uiIcons } from '@/shared/icons';
import { userState } from '@/user-home/state/user';
+ import { toNiceNumber } from '@/utils/formatting/to-nice-number';
import type { CharacterProps } from '@/types/props';
import IconifyIcon from '@/shared/components/images/IconifyIcon.svelte';
@@ -42,7 +43,10 @@
-->
{:else if charChore?.status === QuestStatus.InProgress}
- {charChore.progressCurrent} / {charChore.progressTotal}
+ {toNiceNumber(charChore.progressCurrent, 0)} / {toNiceNumber(
+ charChore.progressTotal,
+ 0
+ )}
{:else if charChore?.status === QuestStatus.NotStarted}
diff --git a/apps/frontend/components/professions/patron-orders/Order.svelte b/apps/frontend/components/professions/patron-orders/Order.svelte
index 6b61e74eb..0bb65b93d 100644
--- a/apps/frontend/components/professions/patron-orders/Order.svelte
+++ b/apps/frontend/components/professions/patron-orders/Order.svelte
@@ -73,7 +73,7 @@
.flex-wrapper {
--image-margin-top: -4px;
- align-items: stretch;
+ align-items: center;
justify-content: start;
&:not(:last-child) {
diff --git a/apps/frontend/components/professions/patron-orders/Sidebar.svelte b/apps/frontend/components/professions/patron-orders/Sidebar.svelte
index ee7b509da..44fd20797 100644
--- a/apps/frontend/components/professions/patron-orders/Sidebar.svelte
+++ b/apps/frontend/components/professions/patron-orders/Sidebar.svelte
@@ -3,6 +3,8 @@
import type { StaticDataProfession } from '@/shared/stores/static/types';
import Sidebar from '@/shared/components/sub-sidebar/SubSidebar.svelte';
+ import CheckboxInput from '@/shared/components/forms/CheckboxInput.svelte';
+ import { browserState } from '@/shared/state/browser.svelte';
let { sortedProfessions }: { sortedProfessions: StaticDataProfession[] } = $props();
@@ -23,4 +25,13 @@
] as SidebarItem[]);
-
+
+
+
+ Unknown recipes
+
+
+
diff --git a/apps/frontend/components/professions/patron-orders/Table.svelte b/apps/frontend/components/professions/patron-orders/Table.svelte
index 0b85eb4a8..5a4125a57 100644
--- a/apps/frontend/components/professions/patron-orders/Table.svelte
+++ b/apps/frontend/components/professions/patron-orders/Table.svelte
@@ -10,25 +10,25 @@
import TableCell from './TableCell.svelte';
import WowthingImage from '@/shared/components/images/sources/WowthingImage.svelte';
- export let commodities: CommodityData;
- export let profession: StaticDataProfession;
- export let slug: string = undefined;
+ type Props = {
+ commodities: CommodityData;
+ profession?: StaticDataProfession;
+ slug?: string;
+ };
+ let { commodities, profession, slug }: Props = $props();
- let filterFunc: (char: Character) => boolean;
- $: {
- if (profession) {
- filterFunc = (char) =>
- profession &&
- !!char.professions?.[profession.id] &&
- char.patronOrders?.[profession.id] !== undefined &&
- (slug !== 'collectors' ||
- settingsState.value.professions.collectingCharactersV2[profession.id]?.includes(
- char.id
- ));
- } else {
- filterFunc = () => false;
- }
- }
+ let filterFunc: (char: Character) => boolean = $derived.by(() =>
+ profession
+ ? (char) =>
+ profession &&
+ !!char.professions?.[profession.id] &&
+ char.patronOrders?.[profession.id] !== undefined &&
+ (slug !== 'collectors' ||
+ settingsState.value.professions.collectingCharactersV2[
+ profession.id
+ ]?.includes(char.id))
+ : () => false
+ );
diff --git a/apps/frontend/components/professions/recipes/Sidebar.svelte b/apps/frontend/components/professions/recipes/Sidebar.svelte
index 66f424ba1..9ec5546e6 100644
--- a/apps/frontend/components/professions/recipes/Sidebar.svelte
+++ b/apps/frontend/components/professions/recipes/Sidebar.svelte
@@ -1,56 +1,63 @@
{
+ if (char.hidden || char.ignored) {
+ return false;
+ }
+
if (minimumLevel > 0 && char.level < minimumLevel) {
return false;
}
@@ -86,6 +90,17 @@
);
}
+ if (categories[0]?.groups[0]?.lookup === 'class') {
+ const charClass = wowthingData.static.characterClassById.get(char.classId);
+ return categories
+ .filter((cat) => !!cat)
+ .some((cat) =>
+ cat.groups
+ .filter((group) => !!group)
+ .some((group) => Object.keys(group.data).includes(charClass.slug))
+ );
+ }
+
return true;
});
diff --git a/apps/frontend/data/currencies.ts b/apps/frontend/data/currencies.ts
index 6991272ae..f009ab80b 100644
--- a/apps/frontend/data/currencies.ts
+++ b/apps/frontend/data/currencies.ts
@@ -181,13 +181,13 @@ export const currencyExtra: Record = {
3199, // Blacksmithing
3198, // Enchanting
3197, // Engineering
- 3196, // Herbalism
3195, // Inscription
3194, // Jewelcrafting
3193, // Leatherworking
+ 3190, // Tailoring
+ 3196, // Herbalism
3192, // Mining
3191, // Skinning
- 3190, // Tailoring
],
// Midnight - Season 1
126411: [
@@ -455,8 +455,11 @@ export const currencyItems: Record = {
264: [
264882, // Finery Funds
255826, // Mysterious Skyshards
+ 245345, // Fused Vitality
+ null,
242241, // Latent Arcana
246951, // Stormarion Core
+ null,
262636, // Anguish-Scribed Rune [hunts, uncommon]
262637, // Anguish-Infused Rune [hunts, rare]
262638, // Anguish-Permeated Rune [hunts, epic]
diff --git a/apps/frontend/shared/state/browser.svelte.ts b/apps/frontend/shared/state/browser.svelte.ts
index 6c1be03d0..d39ccf57c 100644
--- a/apps/frontend/shared/state/browser.svelte.ts
+++ b/apps/frontend/shared/state/browser.svelte.ts
@@ -110,6 +110,9 @@ interface BrowserStateIdk {
xAxis: string[];
yAxis: string[];
};
+ professions: {
+ patronOrdersUnknown: boolean;
+ };
reputations: {
sortOrder: Record;
};
@@ -263,6 +266,9 @@ const initialState: BrowserStateIdk = {
xAxis: [],
yAxis: [],
},
+ professions: {
+ patronOrdersUnknown: true,
+ },
reputations: {
sortOrder: {},
},
diff --git a/apps/frontend/user-home/components/world-quests/WorldQuest.svelte b/apps/frontend/user-home/components/world-quests/WorldQuest.svelte
index 9bd694861..bfb9bb2d9 100644
--- a/apps/frontend/user-home/components/world-quests/WorldQuest.svelte
+++ b/apps/frontend/user-home/components/world-quests/WorldQuest.svelte
@@ -89,6 +89,9 @@
position: relative;
width: 50px;
+ svg {
+ filter: brightness(0.75);
+ }
:global(img) {
border-radius: 50%;
position: absolute;
diff --git a/apps/frontend/utils/formatting/to-nice-number.ts b/apps/frontend/utils/formatting/to-nice-number.ts
index 52700cc3a..796a638e9 100644
--- a/apps/frontend/utils/formatting/to-nice-number.ts
+++ b/apps/frontend/utils/formatting/to-nice-number.ts
@@ -1,12 +1,12 @@
-export function toNiceNumber(n: number): string {
+export function toNiceNumber(n: number, decimals: number = 1): string {
if (n >= 1000000 || n <= -100000) {
// 2597600 -> 25.976 (divide by 100000) -> 25 (floor) -> 2.5 (divide by 10) -> 2.5m
- return `${(Math.floor(n / 100000) / 10).toFixed(1).toLocaleString()}m`;
+ return `${(Math.floor(n / 100000) / 10).toFixed(decimals).toLocaleString()}m`;
} else if (n >= 100000 || n <= -100000) {
return `${Math.floor(n / 1000).toLocaleString()}k`;
} else if (n >= 1000 || n <= -1000) {
// 25976 -> 259.76 (divide by 100) -> 259 (floor) -> 25.9 (divide by 10) -> 25.9k
- return `${(Math.floor(n / 100) / 10).toFixed(1).toLocaleString()}k`;
+ return `${(Math.floor(n / 100) / 10).toFixed(decimals).toLocaleString()}k`;
} else {
return n.toString();
}
diff --git a/apps/tool/Data/IgnoredSkillLineAbilities.cs b/apps/tool/Data/IgnoredSkillLineAbilities.cs
index 9f994cf3c..9ac256b5b 100644
--- a/apps/tool/Data/IgnoredSkillLineAbilities.cs
+++ b/apps/tool/Data/IgnoredSkillLineAbilities.cs
@@ -40,6 +40,15 @@ public static partial class Hardcoded
433607, // TWW ??
433608, // TWW ??
430610, // TWW ??
+ 1230772, // Mid ??
+ 1230871, // Mid ??
+ 1230879, // Mid ??
+ 1230880, // Mid ??
+ 1230881, // Mid ??
+ 1230882, // Mid ??
+ 1230884, // Mid ??
+ 1233131, // Mid ??
+ 1233139, // Mid ??
// Blacksmithing
2671, // Rough Bronze Bracers
@@ -197,6 +206,10 @@ public static partial class Hardcoded
178242, // Gearspring Parts (dupe for max results?)
407170, // Inspired Order Recalibrator (temporary legendary craft)
473408, // Housing Crafting Test Recipe
+ 1229918, // Mid ??
+ 1229925, // Mid ??
+ 1229929, // Mid ??
+ 1261938, // Mid ??
// Inscription
130407, // MoP Mystery of the Mists
@@ -204,6 +217,7 @@ public static partial class Hardcoded
178550, // WoD Borrow Draenic Mortar
343687, // Shadowlands ??
422337, // Lydaria's Binding Rune (temporary legendary craft)
+ 1230063, // Mid ??
// Jewelcrafting
25614, // Silver Rose Pendant
@@ -246,6 +260,11 @@ public static partial class Hardcoded
176314, // [A] Fearsome Battle Standard (garrison building craft)
176315, // [H] Inspiring Battle Standard (garrison building craft)
176316, // [H] Fearsome Battle Standard (garrison building craft)
+ 1228435, // Mid ??
+ 1228998, // Mid ??
+ 1228999, // Mid ??
+ 1230770, // Mid ??
+ 1279126, // Mid ??
// Tailoring ranks?
3908,