diff --git a/components/form/Form.tsx b/components/form/Form.tsx index 542b09c..f2c7c17 100644 --- a/components/form/Form.tsx +++ b/components/form/Form.tsx @@ -57,58 +57,107 @@ export const Form: React.FC = ({ ); try { const fieldDate: any = local?.fields; + let isError = false; + let error: Record = {}; try { const dateFields = Object.values(fieldDate).filter( (field: any) => get(field, "type") === "date" ); - if (Array.isArray(dateFields) && dateFields?.length) { - dateFields.map((e: any) => { - if (e?.name) - local.data[e?.name] = normalDate(local.data[e?.name]); + if (dateFields.length) { + dateFields.forEach((e: any) => { + if (e?.name) { + local.data[e.name] = normalDate(local.data[e.name]); + } }); local.render(); } - } catch (ex) {} + } catch (ex) { + console.error("Error processing date fields:", ex); + } + const fieldRequired = Object.values(fieldDate).filter( - (field: any) => field?.required + (field: any) => field?.required || field?.type === "table" ); - let error = {} as any; - if (Array.isArray(fieldRequired) && fieldRequired?.length) { - fieldRequired.map((e: any) => { - const type = e?.type; + + if (fieldRequired.length) { + fieldRequired.forEach((e: any) => { let keys = e?.name; - if (["dropdown-async", "multi-async"].includes(type)) { - keys = e?.target || e?.name; - } - if ( - [ - "multi-dropdown", - "checkbox", - "multi-upload", - "multi-async", - ].includes(type) - ) { - if ( - !Array.isArray(get(local.data, keys)) || - !get(local.data, `${keys}.length`) - ) { - error[e?.name] = `This field requires at least one item.`; - } + const type = e?.type; + + if (type === "table" && e?.fields?.length) { + e.fields.forEach((item: any, index: number) => { + let errorChilds: Record = {}; + const fieldRequired = Object.values(item?.fields).filter( + (field: any) => field?.required + ); + console.log({ fieldRequired }); + fieldRequired.forEach((subField: any) => { + let keySub = subField?.name; + const typeSub = subField?.type; + const val = get(local.data, `${keys}[${index}].${keySub}`); + if (["dropdown-async", "multi-async"].includes(typeSub)) { + keySub = subField?.target || subField?.name; + } + if ( + [ + "multi-dropdown", + "checkbox", + "multi-upload", + "multi-async", + ].includes(typeSub) + ) { + if (!Array.isArray(get(local.data, keys)) || !val?.length) { + errorChilds[subField.name] = + "This field requires at least one item."; + isError = true; + } + } else if (!val) { + errorChilds[subField.name] = "Please fill out this field."; + isError = true; + } + + console.log({ + keySub, + data: get(local.data, `${keys}[${index}]`), + val, + }); + }); + + item.error = errorChilds; + }); } else { - if (!get(local.data, keys)) { - error[e?.name] = `Please fill out this field.`; + if (["dropdown-async", "multi-async"].includes(type)) { + keys = e?.target || e?.name; + } + const val = get(local.data, keys); + if ( + [ + "multi-dropdown", + "checkbox", + "multi-upload", + "multi-async", + ].includes(type) + ) { + if (!Array.isArray(val) || !val?.length) { + error[e.name] = "This field requires at least one item."; + isError = true; + } + } else if (!val) { + error[e.name] = "Please fill out this field."; + isError = true; } } }); } + local.error = error; local.render(); - console.log({ error }); - if (Object.keys(error).length) { - throw new Error("please check your input field."); - } else { - await onSubmit(local); - } + console.log(isError); + // if (isError) { + // throw new Error("please check your input field."); + // } else { + // await onSubmit(local); + // } setTimeout(() => { toast.success(
= ({ placeholder={disabled ? "" : placeholderField} isDisabled={disabled} className={cx( - "rounded-md border-none text-sm", + "rounded-md border-none text-sm w-full", css` [role="listbox"] { padding: 0px !important; diff --git a/components/form/field/TypeInput.tsx b/components/form/field/TypeInput.tsx index c4ad75c..03237aa 100644 --- a/components/form/field/TypeInput.tsx +++ b/components/form/field/TypeInput.tsx @@ -230,6 +230,7 @@ export const TypeInput: React.FC = ({ asSingle={true} useRange={false} onChange={(value) => { + console.log(value); fm.data[name] = value?.startDate ? new Date(value?.startDate) : null; diff --git a/components/tablelist/TableBetter.tsx b/components/tablelist/TableBetter.tsx index 4a58d05..c3ed24b 100644 --- a/components/tablelist/TableBetter.tsx +++ b/components/tablelist/TableBetter.tsx @@ -154,6 +154,12 @@ export const TableEditBetter: React.FC = ({ local.data = fm?.data[name] || []; local.render(); console.log(columns); + fm.fields[name] = { + name: name, + type: "table", + fields: [], + }; + fm.render(); }, []); const handleResize = (index: any, width: any) => { @@ -168,9 +174,11 @@ export const TableEditBetter: React.FC = ({
{!disabledHeader ? (
-
-
-
{sideLeft ? sideLeft(local) : <>}
+
+
+
+ {sideLeft ? sideLeft(local) : <>} +
@@ -265,10 +273,21 @@ export const TableEditBetter: React.FC = ({ )} {local.data.map((row: any, index: any) => { + if ( + typeof fm.fields?.[name]?.fields?.[index]?.fields !== + "object" + ) { + fm.fields[name].fields[index] = { + fields: {}, + }; + } const fm_row = { ...fm, - + name: name, + type: "table", data: row, + error: fm.fields?.[name]?.fields?.[index]?.error, + fields: fm.fields?.[name]?.fields?.[index]?.fields, render: () => { local.render(); fm.data[name] = local.data; @@ -302,7 +321,9 @@ export const TableEditBetter: React.FC = ({ return (
{renderData}
diff --git a/components/ui/Datepicker/components/Input.tsx b/components/ui/Datepicker/components/Input.tsx index 96c0e88..a5c04a9 100644 --- a/components/ui/Datepicker/components/Input.tsx +++ b/components/ui/Datepicker/components/Input.tsx @@ -74,9 +74,7 @@ const Input: React.FC = (e: Props) => { const handleInputChange = useCallback( (e: React.ChangeEvent) => { const inputValue = e.target.value; - const dates = []; - if (asSingle) { const date = parseFormattedDate(inputValue, displayFormat); if (dateIsValid(date.toDate())) { @@ -121,6 +119,8 @@ const Input: React.FC = (e: Props) => { if (dates[1]) changeDayHover(dayjs(dates[1]).add(-1, "day").format(DATE_FORMAT)); else changeDayHover(dates[0]); + } else { + changeDatepickerValue(null, e.target); } changeInputText(e.target.value);