"use client"; import React, { FormEvent, useState } from "react"; import type { ProjectDto } from "../types"; import { distributionBoardSupplyTypeLabels, distributionBoardSupplyTypes, type DistributionBoardSupplyType, } from "../../shared/constants/distribution-board"; import { projectCoverFieldLabels, projectCoverFieldMaxLengths, projectCoverFields, type ProjectCoverField, } from "../../shared/constants/project-cover"; import { FormModal } from "./form-modal"; export interface ProjectSettingsInput extends Record { name: string; internalProjectNumber: string | null; externalProjectNumber: string | null; buildingOwner: string | null; description: string | null; isPublicBuilding: boolean; singlePhaseVoltageV: number; threePhaseVoltageV: number; enabledDistributionBoardSupplyTypes: DistributionBoardSupplyType[]; } const coverFieldPlaceholders: Record = { siteAddress: "Straße Nr.\nPLZ Ort", workStage: "z. B. LPH 5 – Ausführungsplanung", projectLead: "", projectEditor: "", }; interface ProjectSettingsModalProps { isSaving: boolean; onClose: () => void; onExport: () => Promise; onImport: ( transfer: unknown, mode: "replace" | "duplicate" ) => Promise; onSave: (input: ProjectSettingsInput) => Promise; project: ProjectDto; usedDistributionBoardSupplyTypes: DistributionBoardSupplyType[]; } export function ProjectSettingsModal({ isSaving, onClose, onExport, onImport, onSave, project, usedDistributionBoardSupplyTypes, }: ProjectSettingsModalProps) { const [name, setName] = useState(project.name); const [internalProjectNumber, setInternalProjectNumber] = useState( project.internalProjectNumber ?? "" ); const [externalProjectNumber, setExternalProjectNumber] = useState( project.externalProjectNumber ?? "" ); const [buildingOwner, setBuildingOwner] = useState( project.buildingOwner ?? "" ); const [description, setDescription] = useState( project.description ?? "" ); const [isPublicBuilding, setIsPublicBuilding] = useState( project.isPublicBuilding ); const [singlePhaseVoltageV, setSinglePhaseVoltageV] = useState( String(project.singlePhaseVoltageV) ); const [threePhaseVoltageV, setThreePhaseVoltageV] = useState( String(project.threePhaseVoltageV) ); const [ enabledDistributionBoardSupplyTypes, setEnabledDistributionBoardSupplyTypes, ] = useState( project.enabledDistributionBoardSupplyTypes ); const [coverValues, setCoverValues] = useState< Record >({ siteAddress: project.siteAddress ?? "", workStage: project.workStage ?? "", projectLead: project.projectLead ?? "", projectEditor: project.projectEditor ?? "", }); const [transfer, setTransfer] = useState(null); const [transferFilename, setTransferFilename] = useState(""); const [importMode, setImportMode] = useState<"replace" | "duplicate">( "duplicate" ); const [replaceConfirmed, setReplaceConfirmed] = useState(false); const [fileError, setFileError] = useState(null); async function handleSubmit(event: FormEvent) { event.preventDefault(); await onSave({ name: name.trim(), internalProjectNumber: toNullableString(internalProjectNumber), externalProjectNumber: toNullableString(externalProjectNumber), buildingOwner: toNullableString(buildingOwner), description: toNullableString(description), isPublicBuilding, singlePhaseVoltageV: Number(singlePhaseVoltageV), threePhaseVoltageV: Number(threePhaseVoltageV), enabledDistributionBoardSupplyTypes, siteAddress: toNullableString(coverValues.siteAddress), workStage: toNullableString(coverValues.workStage), projectLead: toNullableString(coverValues.projectLead), projectEditor: toNullableString(coverValues.projectEditor), }); } const isValid = name.trim().length > 0 && Number(singlePhaseVoltageV) > 0 && Number(threePhaseVoltageV) > 0 && enabledDistributionBoardSupplyTypes.length > 0; function toggleSupplyType(supplyType: DistributionBoardSupplyType) { if ( enabledDistributionBoardSupplyTypes.includes(supplyType) && usedDistributionBoardSupplyTypes.includes(supplyType) ) { return; } setEnabledDistributionBoardSupplyTypes((current) => current.includes(supplyType) ? current.filter((entry) => entry !== supplyType) : distributionBoardSupplyTypes.filter( (entry) => entry === supplyType || current.includes(entry) ) ); } async function handleTransferFile(file: File | undefined) { setTransfer(null); setTransferFilename(""); setFileError(null); if (!file) { return; } try { setTransfer(JSON.parse(await file.text()) as unknown); setTransferFilename(file.name); } catch { setFileError("Die ausgewählte Datei enthält kein gültiges JSON."); } } return (
setName(event.target.value)} required value={name} />
setInternalProjectNumber(event.target.value) } value={internalProjectNumber} />
setExternalProjectNumber(event.target.value) } value={externalProjectNumber} />
Verwendete Netzarten

Nur ausgewählte Netzarten stehen bei Verteilungen zur Auswahl. Bereits verwendete Netzarten können nicht deaktiviert werden.

{distributionBoardSupplyTypes.map((supplyType) => (
))}
{enabledDistributionBoardSupplyTypes.length === 0 ? (
Mindestens eine Netzart muss aktiviert sein.
) : null}
setBuildingOwner(event.target.value)} value={buildingOwner} />