From 626d565429b54742b3e3351d620209b1f346c086 Mon Sep 17 00:00:00 2001 From: Agent Zero Date: Fri, 28 Aug 2026 07:34:23 +0200 Subject: [PATCH] task(E6b): seat assignment via canvas selection bridge --- frontend/src/components/CanvasArea.tsx | 6 +++++ frontend/src/components/GuestPanel.tsx | 34 ++++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/CanvasArea.tsx b/frontend/src/components/CanvasArea.tsx index b49f780..11274fb 100644 --- a/frontend/src/components/CanvasArea.tsx +++ b/frontend/src/components/CanvasArea.tsx @@ -155,6 +155,12 @@ const CanvasArea: React.FC = ({ }), }); + // ── Task E6b: Selection-Bridge für GuestPanel (Stuhl-Zuweisung) ── + (window as unknown as { __v2GetSelection: unknown }).__v2GetSelection = () => { + const ids = Array.from(selectionEngine.getSelectedIds()); + return { ids }; + }; + // ── Task C3fin: Snap-Marks + Selection-Handles im Pixi-Overlay ── if (pixi && USE_PIXI_RENDERER) { // Snap-Marks bei Mausbewegung (wenn ein V2-Tool aktiv ist): diff --git a/frontend/src/components/GuestPanel.tsx b/frontend/src/components/GuestPanel.tsx index e99204a..8883e5d 100644 --- a/frontend/src/components/GuestPanel.tsx +++ b/frontend/src/components/GuestPanel.tsx @@ -4,7 +4,14 @@ * wird per API gesetzt (Klick auf Stuhl im Canvas folgt in E6b). */ import React, { useState, useEffect, useCallback } from 'react'; -import { listGuests, createGuest, deleteGuest, type Guest } from '../services/api'; +import { listGuests, createGuest, deleteGuest, updateGuest, type Guest } from '../services/api'; + +/** E6b: Liest die erste Canvas-Auswahl (via CanvasArea-Bridge). */ +function getFirstSelectedId(): string | null { + const bridge = (window as unknown as { __v2GetSelection?: () => { ids: string[] } }).__v2GetSelection; + const ids = bridge?.().ids ?? []; + return ids[0] ?? null; +} interface GuestPanelProps { token: string; @@ -59,6 +66,24 @@ const GuestPanel: React.FC = ({ token, drawingId, onClose }) => } }; + const handleAssign = async (g: Guest) => { + try { + if (g.seat_element_id) { + await updateGuest(token, g.id, { seat_element_id: '' }); + } else { + const seatId = getFirstSelectedId(); + if (!seatId) { + setError('Erst einen Stuhl im Canvas auswählen.'); + return; + } + await updateGuest(token, g.id, { seat_element_id: seatId }); + } + await refresh(); + } catch (e) { + setError(e instanceof Error ? e.message : 'Fehler bei Zuweisung'); + } + }; + const filtered = guests.filter((g) => g.name.toLowerCase().includes(search.toLowerCase()) || (g.email ?? '').toLowerCase().includes(search.toLowerCase()) @@ -122,8 +147,13 @@ const GuestPanel: React.FC = ({ token, drawingId, onClose }) => {g.email &&
{g.email}
}
+ {g.seat_element_id && ( - 💺 + )}