task(E6b): seat assignment via canvas selection bridge
This commit is contained in:
@@ -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):
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user