import React from "react"; import { HttpError, IResourceComponentsProps, useInvalidate, useTranslate } from "@refinedev/core"; import { Create, useForm, useSelect } from "@refinedev/antd"; import { Form, Input, Select, InputNumber, ColorPicker, Button, Typography, Modal } from "antd"; import TextArea from "antd/es/input/TextArea"; import { numberFormatter, numberParser } from "../../utils/parsing"; import { IVendor } from "../vendors/model"; import { IFilament, IFilamentParsedExtras } from "./model"; import { EntityType, useGetFields } from "../../utils/queryFields"; import { ExtraFieldFormItem, StringifiedExtras } from "../../components/extraFields"; import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; import { getCurrencySymbol, useCurrency } from "../../utils/settings"; import { searchMatches } from "../../utils/filtering"; import { ExternalFilament, useGetExternalDBFilaments } from "../../utils/queryExternalDB"; import { formatFilamentLabel } from "../spools/functions"; import { FilamentImportModal } from "../../components/filamentImportModal"; import { getOrCreateVendorFromExternal } from "../vendors/functions"; dayjs.extend(utc); interface CreateOrCloneProps { mode: "create" | "clone"; } export const FilamentCreate: React.FC = (props) => { const t = useTranslate(); const extraFields = useGetFields(EntityType.filament); const currency = useCurrency(); const [isImportExtOpen, setIsImportExtOpen] = React.useState(false); const invalidate = useInvalidate(); const { form, formProps, formLoading, onFinish, redirect } = useForm< IFilament, HttpError, IFilamentParsedExtras, IFilamentParsedExtras >(); if (!formProps.initialValues) { formProps.initialValues = {}; } if (props.mode === "clone") { // Fix the vendor_id if (formProps.initialValues.vendor) { formProps.initialValues.vendor_id = formProps.initialValues.vendor.id; } } const handleSubmit = async (redirectTo: "list" | "edit" | "create") => { const values = StringifiedExtras(await form.validateFields()); await onFinish(values); redirect(redirectTo, (values as IFilament).id); }; const { selectProps: vendorSelect } = useSelect({ resource: "vendor", optionLabel: "name", }); const importFilament = async (filament: ExternalFilament) => { const vendor = await getOrCreateVendorFromExternal(filament.manufacturer); await invalidate({ resource: "vendor", invalidates: ["list", "detail"], }); form.setFieldsValue({ name: filament.name, vendor_id: vendor.id, material: filament.material, density: filament.density, diameter: filament.diameter, weight: filament.weight, spool_weight: filament.spool_weight || undefined, color_hex: filament.color_hex, settings_extruder_temp: filament.extruder_temp || undefined, settings_bed_temp: filament.bed_temp || undefined, }); }; // Use useEffect to update the form's initialValues when the extra fields are loaded // This is necessary because the form is rendered before the extra fields are loaded React.useEffect(() => { extraFields.data?.forEach((field) => { if (formProps.initialValues && field.default_value) { const parsedValue = JSON.parse(field.default_value as string); form.setFieldsValue({ extra: { [field.key]: parsedValue } }); } }); }, [form, extraFields.data, formProps.initialValues]); return ( ( <> )} footerButtons={() => ( <> )} > { setIsImportExtOpen(false); importFilament(value); }} onClose={() => setIsImportExtOpen(false)} />