From a920d65a21db844ecc73b9b3e2dd3a6487894e48 Mon Sep 17 00:00:00 2001 From: dal4segno Date: Tue, 1 Sep 2026 22:37:08 +0900 Subject: [PATCH] fix: total materials across all member boards --- src/routes/data/+page.svelte | 42 ++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/src/routes/data/+page.svelte b/src/routes/data/+page.svelte index ab19075..8b750ba 100644 --- a/src/routes/data/+page.svelte +++ b/src/routes/data/+page.svelte @@ -161,8 +161,8 @@ $: filteredConnectCards = connectCards.filter((card) => { return cardMatchesSearch(card, boardCardSearch); }); - $: selectedBoardMaterialTotals = boardMaterialTotals(selectedMemberId, selectedActiveBoardNodes); - $: selectedBoardPointTotal = selectedActiveBoardNodes.reduce((total, groupId) => total + (nodeForBoardMember(selectedMemberId, groupId)?.skillTreePointCost ?? 0), 0); + $: allBoardMaterialTotals = boardMaterialTotals(userData.memberBoards); + $: allBoardPointTotal = boardPointTotal(userData.memberBoards); $: efficiencyLeaderOutfitOptions = efficiencyFormation.leaderCharacterId ? fiveStarCards.filter((card) => card.characterId === efficiencyFormation.leaderCharacterId && card.details.costume) .filter((card, index, cards) => cards.findIndex((candidate) => candidate.details.costume?.name === card.details.costume?.name) === index) @@ -586,13 +586,15 @@ }, { points: 0, greenCubes: 0, greenCoreCubes: 0 }); } - function boardMaterialTotals(memberId: string, groupIds: readonly string[]): BoardMaterialTotal[] { + function boardMaterialTotals(memberBoards: Record): BoardMaterialTotal[] { const totals = new Map(); - for (const groupId of groupIds) { - const node = nodeForBoardMember(memberId, groupId); - for (const consumption of node?.consumptions ?? []) { - const quantity = Number(consumption.quantity) || 0; - totals.set(consumption.resourceId, (totals.get(consumption.resourceId) ?? 0) + quantity); + for (const [memberId, groupIds] of Object.entries(memberBoards)) { + for (const groupId of groupIds) { + const node = nodeForBoardMember(memberId, groupId); + for (const consumption of node?.consumptions ?? []) { + const quantity = Number(consumption.quantity) || 0; + totals.set(consumption.resourceId, (totals.get(consumption.resourceId) ?? 0) + quantity); + } } } return [...totals.entries()] @@ -600,6 +602,12 @@ .map(([resourceId, quantity]) => ({ resourceId, quantity, label: boardMaterialLabels[resourceId] ?? resourceId })); } + function boardPointTotal(memberBoards: Record): number { + return Object.entries(memberBoards).reduce((total, [memberId, groupIds]) => + total + groupIds.reduce((memberTotal, groupId) => + memberTotal + (nodeForBoardMember(memberId, groupId)?.skillTreePointCost ?? 0), 0), 0); + } + function currentFormationPower(memberBoards: Record, boardCards: BoardCardPlacements = userData.boardCards): number { if (!efficiencyFormationReady) return 0; const members = efficiencyFormation.cardIds.map((id, index) => ({ @@ -1360,13 +1368,6 @@

{selectedActiveBoardNodeCount} / {selectedBoardNodeCount}개 활성화

-
- 노드 포인트{selectedBoardPointTotal.toLocaleString('ko-KR')} - {#each selectedBoardMaterialTotals as material (material.resourceId)} - {material.label}{material.quantity.toLocaleString('ko-KR')} - {/each} - {#if selectedBoardMaterialTotals.length === 0}

활성 노드에 사용된 재료가 없습니다.

{/if} -
{/if} {/if} +
+

전체 보드 재료 합계

+ 노드 포인트{allBoardPointTotal.toLocaleString('ko-KR')} + {#each allBoardMaterialTotals as material (material.resourceId)} + {material.label}{material.quantity.toLocaleString('ko-KR')} + {/each} + {#if allBoardMaterialTotals.length === 0}

활성 노드에 사용된 재료가 없습니다.

{/if} +
{/if} @@ -1593,7 +1602,8 @@ .board-toolbar p strong { color: #f0a1c2; font-size: 16px; } .board-toolbar div { display: flex; gap: 6px; } .board-toolbar button { padding: 6px 9px; border: 1px solid #394252; border-radius: 7px; color: #aeb7c5; background: #202630; font-size: 12px; font-weight: 750; cursor: pointer; } - .board-material-summary { display: flex; flex-wrap: wrap; gap: 7px; margin: 0 0 12px; padding: 10px; border: 1px solid #303a47; border-radius: 10px; background: #131922; } + .board-material-summary { display: flex; flex-wrap: wrap; gap: 7px; margin: 18px 0 0; padding: 10px; border: 1px solid #303a47; border-radius: 10px; background: #131922; } + .board-material-summary h3 { width: 100%; margin: 0 0 3px; color: #dce3eb; font-size: 14px; } .board-material-summary span { display: grid; gap: 2px; min-width: 108px; padding: 7px 9px; border-radius: 7px; background: #1c2430; } .board-material-summary small { color: #8490a0; font-size: 11px; } .board-material-summary strong { color: #dce3eb; font-size: 14px; }