From cf6b8b0728ff831c8861e62cf2998d9ace65e3e7 Mon Sep 17 00:00:00 2001 From: rizky Date: Thu, 16 May 2024 08:52:07 -0700 Subject: [PATCH] wip --- comps/custom/Breadcrumb.tsx | 17 +- comps/filter/Filter.tsx | 26 +++ comps/form/Form.tsx | 7 +- comps/form/field/Field.tsx | 3 +- comps/form/field/FieldInput.tsx | 165 +++++++++----- comps/form/field/mapping.ts | 1 + comps/form/field/type/TypeButton.tsx | 119 ++++++++++ comps/form/field/type/TypeCheckbox.tsx | 93 ++++++++ comps/form/field/type/TypeDropdown.tsx | 97 ++++++++ comps/form/field/type/TypeMoney.tsx | 75 +++++++ comps/form/field/type/TypeMultiOption.tsx | 29 +++ comps/form/field/type/TypeRadio.tsx | 79 +++++++ comps/form/field/type/TypeRichText.tsx | 57 +++++ comps/form/field/type/TypeSingleOption.tsx | 30 +++ comps/form/field/type/TypeSwitch.tsx | 81 +++++++ comps/form/field/type/TypeText.tsx | 133 ++++++++++- comps/form/field/type/TypeToggle.tsx | 83 +++++++ comps/form/field/type/TypeUpload.tsx | 164 ++++++++++++++ comps/form/typings.ts | 8 +- comps/form/utils/gen-mitem.ts | 1 - comps/list/ExportExcel.tsx | 59 +++++ comps/list/ImportExcel.tsx | 229 +++++++++++++++++++ comps/list/TableList.tsx | 249 +++++++++++++++++++-- comps/md/MDAction.tsx | 7 +- comps/md/MDBread.tsx | 19 +- comps/md/MDHeader.tsx | 1 - comps/md/MDMaster.tsx | 32 +++ comps/md/MDTab.tsx | 7 +- comps/md/MasterDetail.tsx | 66 +++++- comps/md/utils/md-init.ts | 4 +- comps/md/utils/typings.ts | 19 +- comps/ui/switch.tsx | 27 +++ data.ts | 18 +- exports.tsx | 2 + gen/gen_action/gen_action.ts | 23 ++ gen/gen_table_list/gen_export.tsx | 81 +++++++ gen/gen_table_list/gen_table_list.tsx | 42 +++- gen/master_detail/gen-action.ts | 66 ++++++ gen/master_detail/gen-form.ts | 65 ++++-- gen/master_detail/gen-list.ts | 29 ++- gen/master_detail/gen.ts | 3 +- gen/master_detail/utils.ts | 16 ++ gen/prasi_gen.ts | 4 + gen/prop/gen_prop_fields.ts | 21 +- gen/prop/gen_prop_table.ts | 2 - utils/format-value.tsx | 12 +- utils/get-value.tsx | 86 +++++++ 47 files changed, 2274 insertions(+), 183 deletions(-) create mode 100644 comps/filter/Filter.tsx create mode 100755 comps/form/field/type/TypeButton.tsx create mode 100755 comps/form/field/type/TypeCheckbox.tsx create mode 100644 comps/form/field/type/TypeDropdown.tsx create mode 100755 comps/form/field/type/TypeMoney.tsx create mode 100755 comps/form/field/type/TypeMultiOption.tsx create mode 100755 comps/form/field/type/TypeRadio.tsx create mode 100755 comps/form/field/type/TypeRichText.tsx create mode 100755 comps/form/field/type/TypeSingleOption.tsx create mode 100755 comps/form/field/type/TypeSwitch.tsx create mode 100755 comps/form/field/type/TypeToggle.tsx create mode 100755 comps/form/field/type/TypeUpload.tsx create mode 100644 comps/list/ExportExcel.tsx create mode 100644 comps/list/ImportExcel.tsx create mode 100755 comps/md/MDMaster.tsx create mode 100755 comps/ui/switch.tsx create mode 100644 gen/gen_action/gen_action.ts create mode 100644 gen/gen_table_list/gen_export.tsx create mode 100755 gen/master_detail/gen-action.ts create mode 100755 utils/get-value.tsx diff --git a/comps/custom/Breadcrumb.tsx b/comps/custom/Breadcrumb.tsx index ca0fc2d..1afe6af 100755 --- a/comps/custom/Breadcrumb.tsx +++ b/comps/custom/Breadcrumb.tsx @@ -1,6 +1,7 @@ import { useLocal } from "@/utils/use-local"; import { FC, ReactNode, useEffect } from "react"; import { Skeleton } from "../ui/skeleton"; +import { MDLocal } from "../md/utils/typings"; export type BreadItem = { label: React.ReactNode; @@ -15,33 +16,37 @@ type BreadcrumbProps = { className?: string; props?: any; value?: BreadItem[]; - item?: any; + item?: any }; export const Breadcrumb: FC = (_arg) => { const { on_load, item } = _arg; - const local = useLocal({ list: _arg.value || ([] as BreadItem[]), status: "init" as "init" | "loading" | "ready", params: {}, }); - + // code review: md.breadcrumb yang di set di props value dipindahkan di on_load + // dan ketika panjang _arg.value bernilai null maka status berubah menjadi init + // untuk menjalankan on_load + // case: ketika refreshBread dijalankan pada MasterDetail + // md.breadcrum yang awalnya array kosong akan berisi satu array namun + // md.breadcrumb yang diterima di komponen ini tidak berubah tetap seperti + // value default yakni array kosong if (_arg.value) { local.list = _arg.value; local.status = "ready"; + if(!_arg.value.length) local.status = "init" } - if (local.status === "init") { let should_load = true; local.status = "loading"; - if (isEditor && item && breadcrumbData[item.id]) { local.list = breadcrumbData[item.id]; local.status = "ready"; should_load = false; + if(!local.list.length) should_load = true; } - if (should_load && typeof on_load === "function") { const callback = (res: any) => { local.list = res; diff --git a/comps/filter/Filter.tsx b/comps/filter/Filter.tsx new file mode 100644 index 0000000..88d254c --- /dev/null +++ b/comps/filter/Filter.tsx @@ -0,0 +1,26 @@ +import { useLocal } from "@/utils/use-local"; +import get from "lodash.get"; +import { FC, useEffect, useRef } from "react"; + +export const MasterFilter: FC<{ + name: string; + value: any; + child: any; +}> = ({name, value, child }) => { + useEffect(() => { + if (!isEditor) { + const w = window as any; + if (typeof w["prasi_filter"] !== "object") w["prasi_filter"] = {}; + if (typeof w["prasi_filter"][name] !== "object") + w["prasi_filter"][name] = {}; + const val = value(); + w["prasi_filter"][name] = { + ...w["prasi_filter"][name], + ...val + }; + w.prasiContext.render(); + } + },[]) + + return
{child}
; +}; diff --git a/comps/form/Form.tsx b/comps/form/Form.tsx index 552faed..69f5d03 100755 --- a/comps/form/Form.tsx +++ b/comps/form/Form.tsx @@ -10,7 +10,10 @@ import { formReload } from "./utils/reload"; const editorFormWidth = {} as Record; +export { FMLocal } from "./typings"; + export const Form: FC = (props) => { + const { PassProp, body } = props; const fm = useLocal({ data: editorFormData[props.item.id] @@ -104,14 +107,13 @@ export const Form: FC = (props) => { formInit(fm, props); fm.reload(); } - if (document.getElementsByClassName("prasi-toaster").length === 0) { const elemDiv = document.createElement("div"); elemDiv.className = "prasi-toaster"; document.body.appendChild(elemDiv); } const toaster_el = document.getElementsByClassName("prasi-toaster")[0]; - + if (fm.status === "resizing") { setTimeout(() => { fm.status = "ready"; @@ -119,7 +121,6 @@ export const Form: FC = (props) => { }, 100); return null; } - return (
{ diff --git a/comps/form/field/Field.tsx b/comps/form/field/Field.tsx index fb0895c..aa78974 100755 --- a/comps/form/field/Field.tsx +++ b/comps/form/field/Field.tsx @@ -25,10 +25,8 @@ export const Field: FC = (arg) => { if (field.status === "init" && !isEditor) return null; const errors = fm.error.get(field.name); - const props = { ...arg.props }; delete props.className; - return (