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 ──
|
// ── Task C3fin: Snap-Marks + Selection-Handles im Pixi-Overlay ──
|
||||||
if (pixi && USE_PIXI_RENDERER) {
|
if (pixi && USE_PIXI_RENDERER) {
|
||||||
// Snap-Marks bei Mausbewegung (wenn ein V2-Tool aktiv ist):
|
// 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).
|
* wird per API gesetzt (Klick auf Stuhl im Canvas folgt in E6b).
|
||||||
*/
|
*/
|
||||||
import React, { useState, useEffect, useCallback } from 'react';
|
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 {
|
interface GuestPanelProps {
|
||||||
token: string;
|
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) =>
|
const filtered = guests.filter((g) =>
|
||||||
g.name.toLowerCase().includes(search.toLowerCase()) ||
|
g.name.toLowerCase().includes(search.toLowerCase()) ||
|
||||||
(g.email ?? '').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>}
|
{g.email && <div style={{ fontSize: 11, opacity: 0.6 }}>{g.email}</div>}
|
||||||
</div>
|
</div>
|
||||||
<div style={{ display: 'flex', gap: 6, alignItems: 'center' }}>
|
<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 && (
|
{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>
|
<button onClick={() => void handleDelete(g.id)} aria-label={`Lösche ${g.name}`}>🗑</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user