"use client"; import React, { FormEvent, useState } from "react"; import type { CreateProjectDeviceInput, GlobalDeviceDto, ProjectDeviceDto, } from "../types"; import { FormModal } from "./form-modal"; import { circuitGroupCategories, circuitGroupCategoryLabels, type CircuitGroupCategory, } from "../../shared/constants/circuit-group"; import { GzfPickerModal } from "./gzf-picker-modal"; interface ProjectDeviceModalProps { globalDevices: GlobalDeviceDto[]; initialDevice?: ProjectDeviceDto; initialValues?: Partial; isSaving: boolean; onClose: () => void; onImportGlobal: (globalDeviceId: string) => Promise; onSave: (input: CreateProjectDeviceInput) => Promise; } export function ProjectDeviceModal({ globalDevices, initialDevice, initialValues, isSaving, onClose, onImportGlobal, onSave, }: ProjectDeviceModalProps) { const [values, setValues] = useState(() => toFormValues(initialDevice, initialValues)); const [selectedGlobalDeviceId, setSelectedGlobalDeviceId] = useState(""); const [isGzfPickerOpen, setIsGzfPickerOpen] = useState(false); function update(key: keyof typeof values, value: string) { setValues((current) => ({ ...current, [key]: value })); } async function handleSubmit(event: FormEvent) { event.preventDefault(); await onSave({ name: values.name.trim(), displayName: values.displayName.trim() || values.name.trim(), connectionKind: optionalString(values.connectionKind), costGroup: optionalString(values.costGroup), category: values.category as CircuitGroupCategory, quantity: parseDecimal(values.quantity), powerPerUnit: parseDecimal(values.powerPerUnit), simultaneityFactor: parseDecimal(values.simultaneityFactor), cosPhi: optionalNumber(values.cosPhi), remark: optionalString(values.remark), }); } const isValid = values.name.trim().length > 0 && isNumberInRange(values.quantity, 0) && isNumberInRange(values.powerPerUnit, 0) && isNumberInRange(values.simultaneityFactor, 0, 1) && (!values.cosPhi.trim() || isNumberInRange(values.cosPhi, 0, 1)); return ( <> {!initialDevice && globalDevices.length > 0 ? (
) : null}
update("name", value)} required value={values.name} /> update("displayName", value)} value={values.displayName} />
update("connectionKind", value)} value={values.connectionKind} /> update("costGroup", value)} value={values.costGroup} /> update("quantity", value)} value={values.quantity} /> update("powerPerUnit", value)} step="0.01" value={values.powerPerUnit} />
update("simultaneityFactor", event.target.value)} step="0.01" type="number" value={values.simultaneityFactor} />
update("cosPhi", value)} step="0.01" value={values.cosPhi} />