// Schnellexport-Dialog (modal) für die Direkt-Formate CSV/IFC/OBJ/STL aus dem // Topbar-Export-Menü: Format wählen + Dateiname festlegen, dann speichern. // (PDF/DXF haben eigene Options-Dialoge.) Später bekommen „Ausschnitte" einen // vordefinierten Namen + Speicherort; dies ist der interaktive Schnellweg. // // Muster wie ExportDxfDialog: abgedunkeltes Overlay, Klick auf Hintergrund + Esc // schliessen. Rein gesteuert — meldet Format + Dateiname über `onSave` nach oben // (App führt Erzeugung + Download aus). Bezeichner englisch, UI deutsch (t()). import { useEffect, useState } from "react"; import { t } from "../i18n"; import { Dropdown } from "./Dropdown"; /** Direkt-herunterladbare Exportformate (mit Datei-Endung). */ export type ExportSaveFormat = "csv" | "ifc" | "obj" | "stl"; /** Datei-Endung je Format. */ export const EXPORT_FORMAT_EXT: Record = { csv: "csv", ifc: "ifc", obj: "obj", stl: "stl", }; export interface ExportSaveDialogProps { /** Vorausgewähltes Format (aus dem angeklickten Menüeintrag). */ initialFormat: ExportSaveFormat; /** Basis-Dateiname OHNE Endung (i. d. R. Projektname). */ baseName: string; onSave: (format: ExportSaveFormat, filename: string) => void; onClose: () => void; } /** Endung sicher an den Basisnamen hängen (doppelte Endung vermeiden). */ function withExt(base: string, ext: string): string { const trimmed = base.trim() || "modell"; const lower = trimmed.toLowerCase(); return lower.endsWith(`.${ext}`) ? trimmed : `${trimmed}.${ext}`; } export function ExportSaveDialog({ initialFormat, baseName, onSave, onClose, }: ExportSaveDialogProps) { useEffect(() => { const onKey = (e: KeyboardEvent) => { if (e.key === "Escape") onClose(); }; window.addEventListener("keydown", onKey); return () => window.removeEventListener("keydown", onKey); }, [onClose]); const [format, setFormat] = useState(initialFormat); // Der Dateiname wird OHNE Endung editiert; die Endung folgt aus dem Format. const [name, setName] = useState(baseName); const filename = withExt(name, EXPORT_FORMAT_EXT[format]); const onConfirm = () => onSave(format, filename); return (
e.stopPropagation()} >
{t("exportSave.title")}
{t("exportSave.format")}
setFormat(v as ExportSaveFormat)} title={t("exportSave.format")} options={[ { value: "csv", label: t("exportSave.fmt.csv") }, { value: "ifc", label: t("exportSave.fmt.ifc") }, { value: "obj", label: t("exportSave.fmt.obj") }, { value: "stl", label: t("exportSave.fmt.stl") }, ]} />
{t("exportSave.filename")}
setName(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter") onConfirm(); }} placeholder="modell" />
{filename} · {t("exportSave.locationNote")}
); }