From b9f9c07e0128914ba22b8db9392e4603e2bab1a4 Mon Sep 17 00:00:00 2001 From: rizrmd Date: Fri, 14 Jun 2024 08:54:56 -0700 Subject: [PATCH] fix --- comps/filter/FilterContent.tsx | 39 +++- comps/filter/FilterField.tsx | 204 ++++++++++------- comps/filter/MasterFilter.tsx | 43 ++-- comps/filter/gen/parse-filter.ts | 0 comps/filter/utils/filter-modifier.ts | 1 - comps/filter/utils/get-filter.ts | 31 +++ comps/filter/utils/types.tsx | 25 ++- comps/form/Form.tsx | 4 +- comps/form/base/BaseField.tsx | 4 +- comps/form/base/BaseForm.tsx | 10 +- comps/form/field/Field.tsx | 1 + comps/form/field/FieldInput.tsx | 5 +- comps/form/field/table-edit/TableEdit.tsx | 40 +++- comps/form/field/type/TypeCheckbox.tsx | 1 + comps/form/field/type/TypeCustom.tsx | 3 +- comps/form/field/type/TypeDropdown.tsx | 2 +- comps/form/field/type/TypeInput.tsx | 216 ++++++++---------- comps/form/gen/fields.ts | 23 +- comps/form/gen/gen-field.ts | 256 ++++++++++++++++++++++ comps/form/gen/gen-rel-many.ts | 18 +- comps/form/gen/gen-rel.ts | 1 - comps/form/gen/on_load_rel.ts | 14 +- comps/form/typings.ts | 12 +- comps/form/utils/use-field.tsx | 7 +- comps/list/TableList.tsx | 86 +++++--- comps/md/MasterDetail.tsx | 14 ++ comps/md/gen/md-gen.ts | 41 ++-- comps/md/gen/mode-table-list.ts | 2 +- comps/md/gen/tbl-list/on_load.ts | 6 +- comps/md/parts/MDMaster.tsx | 1 - exports.tsx | 2 +- gen/gen_table_list/gen_table_list.tsx | 2 +- gen/gen_table_list/on_load.ts | 2 +- preset/menu/Layout.tsx | 2 +- preset/menu/Menu.tsx | 25 +-- 35 files changed, 776 insertions(+), 367 deletions(-) create mode 100755 comps/filter/gen/parse-filter.ts create mode 100755 comps/filter/utils/get-filter.ts create mode 100755 comps/form/gen/gen-field.ts diff --git a/comps/filter/FilterContent.tsx b/comps/filter/FilterContent.tsx index 3049523..a4e3cd5 100755 --- a/comps/filter/FilterContent.tsx +++ b/comps/filter/FilterContent.tsx @@ -28,7 +28,37 @@ export const FilterContent: FC<{ &.filter-inline { display: flex; align-items: center; - /* Styles specific to topbar */ + + .field { + padding-top: 0px; + align-items: center; + } + .field > .label { + display: none; + } + .field-inner { + min-height: 25px; + } + .form-inner { + align-items: center; + } + .field-input { + margin-top: 0 !important; + } + .field-outer { + margin-top: 3px; + margin-bottom: 3px; + } + + .search-all { + input { + width: 150px; + } + } + + .search-focus { + width: 250px !important; + } } &.filter-popup { @@ -39,6 +69,10 @@ export const FilterContent: FC<{ z-index: 1000; /* Styles specific to popup */ } + + .form-inner { + position: relative; + } ` )} > @@ -60,8 +94,7 @@ export const FilterContent: FC<{ ); }} - - ); }; + diff --git a/comps/filter/FilterField.tsx b/comps/filter/FilterField.tsx index 771c6f7..e24562e 100755 --- a/comps/filter/FilterField.tsx +++ b/comps/filter/FilterField.tsx @@ -30,23 +30,27 @@ export const FilterField: FC<{ }, 500); }, [filter.form?.data[name]]); + let show_modifier = filter.mode !== "inline"; + return ( ( - { - filter.modifiers[name] = modifier; - filter.render(); - filter_window.prasiContext.render(); - }} - modifier={filter.modifiers[name]} - type={type} - /> - ), + prefix: show_modifier + ? () => ( + { + filter.modifiers[name] = modifier; + filter.render(); + filter_window.prasiContext.render(); + }} + modifier={filter.modifiers[name]} + type={type} + /> + ) + : undefined, onLoad() { return [{ label: "halo", value: "asda" }]; }, @@ -55,98 +59,132 @@ export const FilterField: FC<{ : "typeahead", })} > - {(field) => ( - <> - {type === "text" && ( - - )} - {type === "number" && ( - <> + {(field) => { + if (type === "search-all") { + return ( +
+
+ + + + +
- {filter.modifiers[name] === "between" && ( +
+ ); + } + + return ( + <> + {type === "text" && ( + + )} + {type === "number" && ( + <> - )} - - )} - {type === "date" && ( - <> - - {filter.modifiers[name] === "between" && ( + {filter.modifiers[name] === "between" && ( + + )} + + )} + {type === "date" && ( + <> - )} - - )} - {type === "boolean" && ( - - )} - {type === "options" && ( - <> - {singleOptions.includes(filter.modifiers[name]) && ( - - )} - {multiOptions.includes(filter.modifiers[name]) && ( - - )} - - )} - - )} + {filter.modifiers[name] === "between" && ( + + )} + + )} + {type === "boolean" && ( + + )} + {type === "options" && ( + <> + {singleOptions.includes(filter.modifiers[name]) && ( + + )} + {multiOptions.includes(filter.modifiers[name]) && ( + + )} + + )} + + ); + }}
); }; + diff --git a/comps/filter/MasterFilter.tsx b/comps/filter/MasterFilter.tsx index 915a264..34c56ba 100755 --- a/comps/filter/MasterFilter.tsx +++ b/comps/filter/MasterFilter.tsx @@ -5,6 +5,7 @@ import { GenField } from "../form/typings"; import { default_filter_local, filter_window } from "./utils/types"; import { FilterContent } from "./FilterContent"; import { getPathname } from "lib/utils/pathname"; +import { getFilter } from "./utils/get-filter"; type FilterMode = "regular" | "inline" | "popup"; @@ -34,18 +35,25 @@ export const MasterFilter: FC = ({ }): ReactNode => { const filter = useLocal({ ...default_filter_local }); filter.name = name; + filter.mode = mode; if (!isEditor) { - if (!filter_window.prasi_filter) { - filter_window.prasi_filter = {}; - } - const pf = filter_window.prasi_filter; - if (pf) { - const pathname = getPathname(); - if (!pf[pathname]) pf[pathname] = {}; - if (!pf[pathname][name]) pf[pathname][name] = {}; - pf[pathname][name][_item.id] = filter; + const wf = getFilter(name); + if (wf) { + wf.filter.ref[_item.id] = filter; + wf.list.render(); } + + // if (!filter_window.prasi_filter) { + // filter_window.prasi_filter = {}; + // } + // const pf = filter_window.prasi_filter; + // if (pf) { + // const pathname = getPathname(); + // if (!pf[pathname]) pf[pathname] = {}; + // if (!pf[pathname][name]) pf[pathname][name] = {}; + // pf[pathname][name][_item.id] = filter; + // } } if (mode === "popup") { @@ -92,12 +100,15 @@ export const MasterFilter: FC = ({ } return ( - + <> + + ); }; + diff --git a/comps/filter/gen/parse-filter.ts b/comps/filter/gen/parse-filter.ts new file mode 100755 index 0000000..e69de29 diff --git a/comps/filter/utils/filter-modifier.ts b/comps/filter/utils/filter-modifier.ts index 9f3a7fc..d684abb 100755 --- a/comps/filter/utils/filter-modifier.ts +++ b/comps/filter/utils/filter-modifier.ts @@ -5,7 +5,6 @@ export const filterModifier = (type: keyof typeof modifiers) => { return { label: v, value: k, - checked: true, }; }); }; diff --git a/comps/filter/utils/get-filter.ts b/comps/filter/utils/get-filter.ts new file mode 100755 index 0000000..3c2e792 --- /dev/null +++ b/comps/filter/utils/get-filter.ts @@ -0,0 +1,31 @@ +import { getPathname } from "../../../.."; +import { filter_window } from "./types"; + +export const getFilter = (name: string) => { + if (!filter_window.prasi_filter) { + filter_window.prasi_filter = {}; + } + const pf = filter_window.prasi_filter; + if (pf) { + const pathname = getPathname(); + if (!pf[pathname]) pf[pathname] = {}; + if (!pf[pathname][name]) + pf[pathname][name] = { + filter: { + ref: {}, + render: () => {}, + }, + list: { + ref: {}, + render: () => {}, + reload() { + for (const [k, v] of Object.entries(this.ref)) { + v.reload(); + } + }, + }, + }; + + return pf[pathname][name]; + } +}; diff --git a/comps/filter/utils/types.tsx b/comps/filter/utils/types.tsx index 1b4649e..4daab8c 100755 --- a/comps/filter/utils/types.tsx +++ b/comps/filter/utils/types.tsx @@ -2,6 +2,7 @@ import { BaseFormLocal } from "../../form/base/types"; import { GenField } from "../../form/typings"; export type FilterFieldType = + | "search-all" | "text" | "number" | "boolean" @@ -17,9 +18,17 @@ export const default_filter_local = { modifiers: {} as Record, types: {} as Record, name: "", + mode: "", }; export const modifiers = { + "search-all": { + contains: "Contains", + starts_with: "Starts With", + ends_with: "Ends With", + equal: "Equal", + not_equal: "Not Equal", + }, text: { contains: "Contains", starts_with: "Starts With", @@ -55,8 +64,22 @@ export type FilterModifier = typeof modifiers; export type FilterLocal = typeof default_filter_local & { render: () => void }; export const filter_window = window as unknown as { - prasi_filter: Record>>; + prasi_filter: Record< + string, + Record< + string, + { + filter: {ref: Record, render: () => void;}; + list: { + ref: Record void }>; + reload: () => void; + render: () => void; + }; + } + > + >; prasiContext: { render: () => void; }; }; + diff --git a/comps/form/Form.tsx b/comps/form/Form.tsx index a1642b0..4ecff47 100755 --- a/comps/form/Form.tsx +++ b/comps/form/Form.tsx @@ -7,7 +7,7 @@ import { editorFormData } from "./utils/ed-data"; import { formInit } from "./utils/init"; import { formReload } from "./utils/reload"; import { getPathname } from "lib/utils/pathname"; -import { sofDeleteField } from "lib/utils/soft-del-rel"; +import { sofDeleteField as softDeleteField } from "lib/utils/soft-del-rel"; const editorFormWidth = {} as Record; @@ -60,7 +60,7 @@ export const Form: FC = (props) => { // deteksi jika ada softdelete if(Array.isArray(props.feature)){ if(props.feature?.find((e) => e === "soft_delete")){ - const result = sofDeleteField(props.gen_table, sfd_field) + const result = softDeleteField(props.gen_table, sfd_field) if (result instanceof Promise) { result.then((e) => { // simpan fields yang berisi name dan type fields soft delete diff --git a/comps/form/base/BaseField.tsx b/comps/form/base/BaseField.tsx index 6729fd1..45fe345 100755 --- a/comps/form/base/BaseField.tsx +++ b/comps/form/base/BaseField.tsx @@ -52,11 +52,11 @@ export const BaseField = (prop: { )} > {mode !== "hidden" &&