This commit is contained in:
Rizky 2024-12-01 13:39:49 +00:00
parent 42eace5e4f
commit 874c9f8fa1
8 changed files with 35 additions and 64 deletions

View File

@ -108,12 +108,12 @@ export const Field: FC<FieldProp> = (arg) => {
typeof field.hidden === "function" typeof field.hidden === "function"
? field.hidden() ? field.hidden()
: typeof field.hidden === "string" : typeof field.hidden === "string"
? field.hidden === "n" ? field.hidden === "n"
? false ? false
: true : true
: typeof field.hidden === "boolean" : typeof field.hidden === "boolean"
? field.hidden ? field.hidden
: true; : true;
if (!show) return <></>; if (!show) return <></>;
return ( return (

View File

@ -35,6 +35,7 @@ export const FieldInput: FC<{
const errors = fm.error.get(name); const errors = fm.error.get(name);
let type_field: any = typeof arg.type === "function" ? arg.type() : arg.type; // tipe field let type_field: any = typeof arg.type === "function" ? arg.type() : arg.type; // tipe field
const disabled = const disabled =
typeof field.disabled === "function" ? field.disabled() : field.disabled; typeof field.disabled === "function" ? field.disabled() : field.disabled;
let custom = <></>; let custom = <></>;

View File

@ -38,8 +38,8 @@ export type PropTypeInput = {
placeholder?: string; placeholder?: string;
onFocus?: (e: FocusEvent<HTMLDivElement>) => void; onFocus?: (e: FocusEvent<HTMLDivElement>) => void;
onBlur?: (e: FocusEvent<HTMLDivElement>) => void; onBlur?: (e: FocusEvent<HTMLDivElement>) => void;
onChange?: (val: any) => void;
model_upload?: "upload" | "import"; model_upload?: "upload" | "import";
onChange?: (value: any) => void;
}; };
const parse = parser.exportAsFunctionAny("en-US"); const parse = parser.exportAsFunctionAny("en-US");
@ -102,10 +102,9 @@ export const FieldTypeInput: FC<{
const renderOnChange = () => { const renderOnChange = () => {
input.render(); input.render();
// if (field.on_change) { if (prop.onChange) {
// field.on_change({ value: fm.data[field.name], name: field.name, fm }); prop.onChange(fm.data[field.name]);
// } }
clearTimeout(input.change_timeout); clearTimeout(input.change_timeout);
input.change_timeout = setTimeout(fm.render, 300); input.change_timeout = setTimeout(fm.render, 300);
}; };
@ -178,25 +177,9 @@ export const FieldTypeInput: FC<{
/> />
); );
case "upload": case "upload":
return ( return <FieldUpload arg={arg} field={field} fm={fm} prop={prop} />;
<FieldUpload
arg={arg}
field={field}
fm={fm}
prop={prop}
on_change={arg.on_change}
/>
);
case "import": case "import":
return ( return <FieldUpload arg={arg} field={field} fm={fm} prop={prop} />;
<FieldUpload
arg={arg}
field={field}
fm={fm}
prop={prop}
on_change={arg.on_change}
/>
);
case "money": case "money":
return ( return (
<> <>
@ -223,10 +206,6 @@ export const FieldTypeInput: FC<{
? new Date(value?.startDate) ? new Date(value?.startDate)
: null; : null;
renderOnChange(); renderOnChange();
if (prop.onChange) {
prop.onChange(fm.data[field.name]);
}
}} }}
/> />
); );
@ -255,10 +234,6 @@ export const FieldTypeInput: FC<{
onChange={(ev) => { onChange={(ev) => {
fm.data[field.name] = ev.currentTarget.value.replace(/\D/g, ""); fm.data[field.name] = ev.currentTarget.value.replace(/\D/g, "");
renderOnChange(); renderOnChange();
if (prop.onChange) {
prop.onChange(fm.data[field.name]);
}
}} }}
inputMode="decimal" inputMode="decimal"
value={format(value, { value={format(value, {
@ -369,9 +344,6 @@ export const FieldTypeInput: FC<{
onChange={async (ev) => { onChange={async (ev) => {
fm.data[field.name] = ev.currentTarget.value; fm.data[field.name] = ev.currentTarget.value;
renderOnChange(); renderOnChange();
if (prop.onChange) {
await prop.onChange(fm.data[field.name]);
}
clearTimeout(internal.search_timeout); clearTimeout(internal.search_timeout);
internal.search_timeout = setTimeout(() => { internal.search_timeout = setTimeout(() => {
@ -403,10 +375,6 @@ export const FieldTypeInput: FC<{
fm.data[field.name] = parseInt(fm.data[field.name]); fm.data[field.name] = parseInt(fm.data[field.name]);
} }
renderOnChange(); renderOnChange();
if (prop.onChange) {
prop.onChange(fm.data[field.name]);
}
}} }}
placeholder={prop.placeholder || arg.placeholder || ""} placeholder={prop.placeholder || arg.placeholder || ""}
value={value} value={value}

View File

@ -2,7 +2,6 @@ import { useLocal } from "lib/utils/use-local";
import { FC, useEffect } from "react"; import { FC, useEffect } from "react";
import { FMLocal, FieldLocal, FieldProp } from "../../typings"; import { FMLocal, FieldLocal, FieldProp } from "../../typings";
import { PropTypeInput } from "./TypeInput"; import { PropTypeInput } from "./TypeInput";
import { isEmptyString } from "lib/utils/is-empty-string";
export const FieldMoney: FC<{ export const FieldMoney: FC<{
field: FieldLocal; field: FieldLocal;
fm: FMLocal; fm: FMLocal;
@ -42,8 +41,11 @@ export const FieldMoney: FC<{
formatCurrency(rawValue) formatCurrency(rawValue)
); );
fm.render(); fm.render();
if (field.on_change) { input.value = formatCurrency(fm.data[field.name]);
field.on_change({ input.render();
if (arg.on_change) {
arg.on_change({
value: convertionCurrencyNumber( value: convertionCurrencyNumber(
formatCurrency(fm.data[field.name]) formatCurrency(fm.data[field.name])
), ),
@ -51,8 +53,6 @@ export const FieldMoney: FC<{
fm, fm,
}); });
} }
input.value = formatCurrency(fm.data[field.name]);
input.render();
} else { } else {
input.value = rawValue; input.value = rawValue;
input.render(); input.render();

View File

@ -1,9 +1,9 @@
import { REGEXP_ONLY_DIGITS } from "input-otp";
import { InputOTP, InputOTPGroup, InputOTPSlot } from "lib/comps/ui/input-otp";
import { useLocal } from "lib/utils/use-local"; import { useLocal } from "lib/utils/use-local";
import { FC, useEffect } from "react"; import { FC } from "react";
import { FieldLocal, FieldProp, FMLocal } from "../../typings"; import { FieldLocal, FieldProp, FMLocal } from "../../typings";
import { PropTypeInput } from "./TypeInput"; import { PropTypeInput } from "./TypeInput";
import { InputOTP, InputOTPGroup, InputOTPSlot } from "lib/comps/ui/input-otp";
import { REGEXP_ONLY_DIGITS } from "input-otp";
export const FieldOTP: FC<{ export const FieldOTP: FC<{
digit: number; digit: number;
@ -11,7 +11,7 @@ export const FieldOTP: FC<{
fm: FMLocal; fm: FMLocal;
prop: PropTypeInput; prop: PropTypeInput;
arg: FieldProp; arg: FieldProp;
}> = ({ digit, fm, field }) => { }> = ({ digit, fm, field, arg }) => {
const local = useLocal({ const local = useLocal({
otp: "", otp: "",
ref: [] as HTMLInputElement[], ref: [] as HTMLInputElement[],
@ -37,8 +37,8 @@ export const FieldOTP: FC<{
onChange={(value) => { onChange={(value) => {
local.otp = value; local.otp = value;
local.render(); local.render();
if (field.on_change) { if (arg.on_change) {
field.on_change({ value, name: field.name, fm }); arg.on_change({ value: local.otp, fm, name: field.name });
} }
}} }}
pattern={REGEXP_ONLY_DIGITS} pattern={REGEXP_ONLY_DIGITS}

View File

@ -10,12 +10,11 @@ export const FieldUpload: FC<{
prop: PropTypeInput; prop: PropTypeInput;
styling?: string; styling?: string;
arg: FieldProp; arg: FieldProp;
on_change: (e: any) => void | Promise<void>;
}> = (pass) => { }> = (pass) => {
const { field, fm, prop, on_change, arg } = pass; const { field, fm, prop, arg } = pass;
let mode = field.prop.upload?.mode || "single-file"; let mode = field.prop.upload?.mode || "single-file";
if (mode === "single-file") { if (mode === "single-file") {
return <FieldUploadSingle {...pass} />; return <FieldUploadSingle {...pass} />;
} }
return <FieldUploadMulti {...pass} />; return <FieldUploadMulti {...pass} />;
}; };

View File

@ -15,8 +15,7 @@ export const FieldUploadMulti: FC<{
prop: PropTypeInput; prop: PropTypeInput;
styling?: string; styling?: string;
arg: FieldProp; arg: FieldProp;
on_change: (e: any) => void | Promise<void>; }> = ({ field, fm, prop, arg }) => {
}> = ({ field, fm, prop, on_change, arg }) => {
let value: string = (fm.data[field.name] || "").trim(); let value: string = (fm.data[field.name] || "").trim();
const input = useLocal({ const input = useLocal({

View File

@ -16,7 +16,11 @@ export const FieldUploadSingle: FC<{
prop: PropTypeInput; prop: PropTypeInput;
styling?: string; styling?: string;
arg: FieldProp; arg: FieldProp;
on_change: (e: any) => void | Promise<void>; on_change?: (arg: {
value: any;
name: string;
fm: any;
}) => void | Promise<void>;
}> = ({ field, fm, prop, on_change, arg }) => { }> = ({ field, fm, prop, on_change, arg }) => {
const styling = arg.upload_style ? arg.upload_style : "full"; const styling = arg.upload_style ? arg.upload_style : "full";
const disabled = const disabled =
@ -57,9 +61,9 @@ export const FieldUploadSingle: FC<{
const jsonData = XLSX.utils.sheet_to_json(worksheet); const jsonData = XLSX.utils.sheet_to_json(worksheet);
if (typeof on_change === "function") { if (typeof on_change === "function") {
on_change({ on_change({
value: jsonData, value: { jsonData, file: file, binary: e.target.result },
file: file, fm,
binnary: e.target.result, name: field.name,
}); });
} }
} }