import Add from "@mui/icons-material/Add"; import { Alert, Button, TextField } from "@mui/material"; import { getLocalizedString } from "@olenbetong/appframe-core"; import { useId, useRef, useState } from "react"; import type { ProjectsRecord } from "../../data/dsProjects"; import { ProjectSelect } from "../../ProjectSelect"; import { type ElementDetails, getElement } from "../getElement"; const isElementsOnly = /^([a-z]{2,4}[\s]*[0-9]{4,8}[\s,]*)+$/i; const matchElements = /([a-z]{2,4}[\s]*[0-9]{4,8})/gi; export type ProjectRecordBase = { Domain: string; ProjectID: string; ProjectName?: string; }; export type AddElementManualFormProps = { onAdd: (element: string | ElementDetails) => Promise; mode?: "single" | "multi"; defaultProject?: ProjectRecordBase; allowEmptyElement?: boolean; }; export function AddElementManualForm({ onAdd, mode, defaultProject, allowEmptyElement = false, }: AddElementManualFormProps) { let id = useId(); let buttonRef = useRef(null); let [working, setWorking] = useState(false); let [elementId, setElementId] = useState(""); let [project, setProject] = useState | null>(defaultProject ?? null); async function handleSubmit(evt: React.FormEvent) { try { evt.preventDefault(); evt.stopPropagation(); let formData = new FormData(evt.target as HTMLFormElement); let elements = formData.get("ElementID"); let domain = formData.get("Domain"); let project: ProjectsRecord = JSON.parse(formData.get("Project") as string); if (allowEmptyElement) { if (!project.ProjectID) { alert(getLocalizedString("Project is required")); return; } } else { if (!project.ProjectID || !domain || !elements) { let warning = getLocalizedString( mode === "multi" ? "Project and elements are required" : "Project and element are required", ); alert(warning); return; } } if (elements) { setWorking(true); let record = (elements as string) .match(matchElements) ?.map((elementId) => elementId.replace(/\s+/g, "")) .map((elementId) => getElement({ projectId: project.ProjectID as string, elementId: elementId }, { mode: "manual" }), ); if (!record) { alert(getLocalizedString("Invalid elements")); return; } let loaded = (await Promise.all(record)).map((record) => onAdd(record)); await Promise.all(loaded); setWorking(false); } else { onAdd({ PrimKey: "", Domain: domain?.toString() ?? "", Created: project?.Created, ProjectID: project.ProjectID, ProjectName: project.ProjectName, ProjectDomain: project.Domain, ElementID: "", DisplayName: "", GiaiUri: "", }); } } catch (error) { setWorking(false); alert((error as Error).message); } } return (
{getLocalizedString( "Manually entering elements is a major source of errors. Only use this as a last resort. If the camera or scanner is not working, please contact the IT department.", )} (project ? setProject(project) : setProject(null))} value={project} id="AddElement_Project" /> setElementId(evt.target.value)} /> ); }