task(E6b): seat assignment via canvas selection bridge

This commit is contained in:
Agent Zero
2026-08-28 07:34:23 +02:00
parent 9e8255f70f
commit 626d565429
2 changed files with 38 additions and 2 deletions
+6
View File
@@ -155,6 +155,12 @@ const CanvasArea: React.FC<CanvasAreaProps> = ({
}),
});
// ── 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):
+32 -2
View File
@@ -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<GuestPanelProps> = ({ 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<GuestPanelProps> = ({ token, drawingId, onClose }) =>
{g.email && <div style={{ fontSize: 11, opacity: 0.6 }}>{g.email}</div>}
</div>
<div style={{ display: 'flex', gap: 6, alignItems: 'center' }}>
<button
onClick={() => void handleAssign(g)}
title={g.seat_element_id ? 'Zuweisung aufheben' : 'Erste Canvas-Auswahl als Sitzplatz zuweisen'}
style={{ opacity: g.seat_element_id ? 1 : 0.6 }}
>💺</button>
{g.seat_element_id && (
<span style={{ fontSize: 11, opacity: 0.7 }} title="Sitzplatz zugewiesen">💺</span>
<span style={{ fontSize: 11, opacity: 0.7 }} title="Sitzplatz zugewiesen"></span>
)}
<button onClick={() => void handleDelete(g.id)} aria-label={`Lösche ${g.name}`}>🗑</button>
</div>