From 31a920103f984ad90ec4ac418b656b4299ddc088 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sat, 14 Mar 2026 13:11:01 +0000 Subject: [PATCH] Move assignment dialog to grimoire parent Co-authored-by: Caden --- .../components/character-token-node.svelte | 133 +-------------- src/lib/components/grimoire.svelte | 159 +++++++++++++++++- 2 files changed, 157 insertions(+), 135 deletions(-) diff --git a/src/lib/components/character-token-node.svelte b/src/lib/components/character-token-node.svelte index 6abd6e1..29bb0c0 100644 --- a/src/lib/components/character-token-node.svelte +++ b/src/lib/components/character-token-node.svelte @@ -1,6 +1,6 @@ @@ -214,65 +150,4 @@ {/if} {/if} - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/src/lib/components/grimoire.svelte b/src/lib/components/grimoire.svelte index ac244b1..4b7aaa5 100644 --- a/src/lib/components/grimoire.svelte +++ b/src/lib/components/grimoire.svelte @@ -16,6 +16,7 @@ } from "$lib/botc-data/trouble-brewing.svelte"; import { onMount, onDestroy } from "svelte"; import type { Character } from "$lib/types/characters"; + import { Save, UserRoundX } from "@lucide/svelte"; function findCharacterByName(name: string): Character | null { for (const characters of Object.values(CHARACTERS_BY_TYPE)) { @@ -37,8 +38,19 @@ let remainingSeconds = $state(5 * 60); let isPolling = $state(true); let lobbyNotFound = $state(false); + let assignmentModal: HTMLDialogElement; + let assignmentCharacterName = $state(null); + let assignmentPlayerName = $state(""); + let assignmentError = $state(""); + let savingAssignment = $state(false); const POLL_DURATION = 5 * 60 * 1000; // 5 minutes const POLL_INTERVAL = 10 * 1000; // 10 seconds + const assignmentKnownPlayers = $derived(getKnownPlayers(characterToPlayer)); + const assignmentOptionsId = $derived( + assignmentCharacterName + ? `player-options-${assignmentCharacterName.toLowerCase().replace(/\s+/g, "-")}` + : "player-options-assignment" + ); function getKnownPlayers(charToPlayer: Record): string[] { return [...new Set( @@ -68,6 +80,77 @@ isPolling = false; } + function openAssignmentDialog(characterName: string) { + assignmentCharacterName = characterName; + assignmentPlayerName = characterToPlayer[characterName] ?? ""; + assignmentError = ""; + if (!assignmentModal?.open) { + assignmentModal?.showModal(); + } + } + + function clearAssignmentDialogState() { + assignmentError = ""; + savingAssignment = false; + assignmentCharacterName = null; + assignmentPlayerName = ""; + } + + async function saveAssignment(event: SubmitEvent) { + event.preventDefault(); + + if (!assignmentCharacterName) { + assignmentError = "No character selected."; + return; + } + + const playerName = assignmentPlayerName.trim(); + if (!playerName) { + assignmentError = "Enter a player name to assign."; + return; + } + + savingAssignment = true; + assignmentError = ""; + + try { + await updatePlayerAssignment(assignmentCharacterName, playerName); + assignmentModal?.close(); + } catch (error) { + assignmentError = + error instanceof Error + ? error.message + : "Failed to update player assignment."; + } finally { + savingAssignment = false; + } + } + + async function clearAssignment(event: MouseEvent) { + event.preventDefault(); + + if (!assignmentCharacterName) { + assignmentError = "No character selected."; + return; + } + + savingAssignment = true; + assignmentError = ""; + + try { + await updatePlayerAssignment(assignmentCharacterName, ""); + assignmentPlayerName = ""; + assignmentModal?.close(); + } catch (error) { + assignmentError = + error instanceof Error + ? error.message + : "Failed to remove player assignment."; + } finally { + savingAssignment = false; + } + } + function startPolling() { stopPolling(); pollStartTime = Date.now(); @@ -123,7 +206,6 @@ } function syncAssignments(newCharToPlayer: Record) { - const knownPlayers = getKnownPlayers(newCharToPlayer); characterToPlayer = newCharToPlayer; if (nodes.length === 0 || nodes.length !== Object.keys(newCharToPlayer).length) { @@ -139,9 +221,8 @@ data: { ...data, playerName, - knownPlayers, availableHelperTokens, - updatePlayerAssignment, + openAssignmentDialog, } satisfies TokenData, }; }); @@ -154,7 +235,6 @@ const centerX = 300; const centerY = 300; const radius = 250; - const knownPlayers = getKnownPlayers(charToPlayer); const characters: Character[] = []; for (const characterName of Object.keys(charToPlayer)) { @@ -178,9 +258,8 @@ data: { character, playerName, - knownPlayers, availableHelperTokens, - updatePlayerAssignment, + openAssignmentDialog, } satisfies TokenData, }; }); @@ -262,6 +341,74 @@ {/if} + + + + +