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 && ( - 💺 + )}