import { useLocal } from "lib/utils/use-local"; import { hashSum } from "lib/utils/hash-sum"; import { FC, useEffect } from "react"; import { FieldProp } from "../typings"; import { useField } from "../utils/use-field"; import { validate } from "../utils/validate"; import { FieldInput } from "./FieldInput"; import { Label } from "./Label"; import { call_prasi_events } from "lib/utils/prasi-events"; const prepForSum = (obj: any): any => { if (Array.isArray(obj)) { return obj.map((e) => prepForSum(e)); } const new_obj: any = {}; if (obj) { for (const [k, v] of Object.entries(obj) as any) { if (typeof v === "object" && v?.id) { new_obj[k] = v.id; continue; } if (typeof v === "object" && v?.connect?.id) { new_obj[k] = v.connect.id; continue; } new_obj[k] = v; } } return new_obj; }; export const Field: FC = (arg) => { const showlabel = arg.show_label || "y"; let sub_type: any = arg.sub_type; // tipe field const { fm } = arg; const field = useField(arg); const name = field.name; const local = useLocal({ prev_val: fm.data?.[name] }); const w = field.width; useEffect(() => { if (fm.save_status === "init" || fm.status !== "ready") return; if (local.prev_val !== fm.data[name]) { if (typeof fm.data[name] === "object") { const sfied = hashSum(prepForSum(fm.data[name])); if (sfied !== local.prev_val) { local.prev_val = sfied; } else { return; } } else { local.prev_val = fm.data[name]; } if ( (!local.prev_val && fm.data[name]) || (local.prev_val && !fm.data[name]) ) { validate(field, fm); } if (arg.on_change) { arg.on_change({ value: fm.data?.[name], name, fm }); } if (fm.deps.md) { fm.save_status = "unsaved"; } if (!fm.events) { fm.events = { on_change(name, new_value) {}, }; } fm.events.on_change(name, fm.data[name]); fm.render(); call_prasi_events("field", "on_change", [fm, field]); } }, [fm.data[name]]); useEffect(() => { if (typeof arg.on_init === "function") { arg.on_init({ name, field }); } }, [field]); if (field.status === "init" && !isEditor) return null; let errors = fm.error.get(name); if (field.error) { errors = [field.error]; } const props = { ...arg.props }; let editorClassName = ""; if (isEditor) { editorClassName = props.className.split(" ").find((e: string) => e.startsWith("s-")) || ""; } const disabled = typeof field.disabled === "function" ? field.disabled() : field.disabled; if (field.hidden) return <>; return ( {showlabel !== "n" && field.label && ); }; const LabelDiv = (arg: any) => { const props = { ...arg }; const mode = arg.mode; delete props.mode; if (mode === "label") { return