diff --git a/comps/filter/FilterContent.tsx b/comps/filter/FilterContent.tsx index a4e3cd5..3b035c6 100755 --- a/comps/filter/FilterContent.tsx +++ b/comps/filter/FilterContent.tsx @@ -2,6 +2,7 @@ import { FC } from "react"; import { BaseForm } from "../form/base/BaseForm"; import { FilterLocal } from "./utils/types"; import { useLocal } from "lib/utils/use-local"; +import { getFilter } from "./utils/get-filter"; export const FilterContent: FC<{ mode: string; @@ -56,8 +57,18 @@ export const FilterContent: FC<{ } } - .search-focus { - width: 250px !important; + .field.search { + &.focused, + &.filled { + input { + width: 250px !important; + } + } + &.filled { + .field-outer { + border: 2px solid blue; + } + } } } @@ -79,7 +90,13 @@ export const FilterContent: FC<{ { - console.log("skrg nyubmit"); + const f = getFilter(filter.name); + + if (f) { + for (const list of Object.values(f.list.ref)) { + list.reload(); + } + } }} render={internal.render} > @@ -97,4 +114,3 @@ export const FilterContent: FC<{ ); }; - diff --git a/comps/filter/FilterField.tsx b/comps/filter/FilterField.tsx index e24562e..ea41c28 100755 --- a/comps/filter/FilterField.tsx +++ b/comps/filter/FilterField.tsx @@ -85,11 +85,8 @@ export const FilterField: FC<{ type: "input", sub_type: "search", placeholder: "Search...", - onFocus(e) { - e.currentTarget.classList.add("search-focus"); - }, onBlur(e) { - e.currentTarget.classList.remove("search-focus"); + filter.form?.submit(); }, }} /> @@ -187,4 +184,3 @@ export const FilterField: FC<{ ); }; - diff --git a/comps/filter/MasterFilter.tsx b/comps/filter/MasterFilter.tsx index 34c56ba..1b54c98 100755 --- a/comps/filter/MasterFilter.tsx +++ b/comps/filter/MasterFilter.tsx @@ -43,17 +43,6 @@ export const MasterFilter: FC = ({ 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") { @@ -111,4 +100,3 @@ export const MasterFilter: FC = ({ ); }; - diff --git a/comps/filter/gen/parse-filter.ts b/comps/filter/gen/parse-filter.ts deleted file mode 100755 index e69de29..0000000 diff --git a/comps/filter/parser/filter-where.ts b/comps/filter/parser/filter-where.ts new file mode 100755 index 0000000..b4c36c2 --- /dev/null +++ b/comps/filter/parser/filter-where.ts @@ -0,0 +1,33 @@ +import { GFCol } from "lib/gen/utils"; +import { parseGenField } from "../../../.."; +import { getFilter } from "../utils/get-filter"; +import { parseSingleFilter } from "./single-filter"; +import { softDeleteFilter } from "./soft-delete-filter"; + +export const filterWhere = (filter_name: string, p: any) => { + const f = getFilter(filter_name); + + let where: any = {}; + if (f) { + let fields: GFCol[] = []; + if (p.gen__fields) { + fields = parseGenField(p.gen__fields); + } + for (const pf of Object.values(f.filter.ref)) { + const w = parseSingleFilter(pf, fields); + for (const [k, v] of Object.entries(w)) { + where[k] = v; + } + } + } + + if (p && p.opt__feature && p.sft__fields && p.sft__type) { + where = softDeleteFilter(where, { + feature: p.opt_feature, + field: p.sft__fields, + type: p.sft__type, + }); + } + + return where; +}; diff --git a/comps/filter/parser/single-filter.ts b/comps/filter/parser/single-filter.ts new file mode 100755 index 0000000..15855ee --- /dev/null +++ b/comps/filter/parser/single-filter.ts @@ -0,0 +1,114 @@ +import { GFCol } from "lib/gen/utils"; +import { FilterLocal } from "../utils/types"; + +export const parseSingleFilter = (filter: FilterLocal, fields: GFCol[]) => { + const where: any = {}; + const AND: any[] = []; + const OR: any[] = []; + if (filter) { + for (const [name, value] of Object.entries(filter.data)) { + const type = filter.types[name]; + const modifier = filter.modifiers[name]; + + switch (type) { + case "search-all": + fields + .filter((e) => e.type === "varchar" || e.type === "text") + .map((e) => { + OR.push({ + [e.name]: { + contains: "%" + value + "%", + mode: "insensitive", + }, + }); + }); + break; + case "text": + { + if (modifier === "contains") + where[name] = { + contains: "%" + value + "%", + mode: "insensitive", + }; + else if (modifier === "starts_with") + where[name] = { + contains: value + "%", + mode: "insensitive", + }; + else if (modifier === "ends_with") + where[name] = { + contains: "%" + value, + mode: "insensitive", + }; + else if (modifier === "not_equal") { + where[name] = { + NOT: value, + }; + } else if (modifier === "equal") { + where[name] = { + value, + }; + } + } + break; + case "date": + { + let is_value_valid = true; + // TODO: pastikan value bisa diparse pakai any-date-parser + if (is_value_valid) { + if (modifier === "between") { + AND.push({ [name]: { gt: value } }); + AND.push({ [name]: { lt: value } }); + } else if (modifier === "greater_than") { + AND.push({ [name]: { gt: value } }); + } else if (modifier === "less_than") { + AND.push({ [name]: { lt: value } }); + } + } + } + break; + case "number": + { + if (modifier === "equal") { + AND.push({ [name]: { value } }); + } else if (modifier === "not_equal") { + AND.push({ [name]: { NOT: value } }); + } else if (modifier === "greater_than") { + AND.push({ [name]: { gt: value } }); + } else if (modifier === "less_than") { + AND.push({ [name]: { lt: value } }); + } else if (modifier === "between") { + AND.push({ [name]: { gt: value } }); + AND.push({ [name]: { lt: value } }); + } + } + break; + case "boolean": + { + if (modifier === "is_true") { + AND.push({ [name]: true }); + } else if (modifier === "is_false") { + AND.push({ [name]: false }); + } + } + break; + case "options": + { + if (modifier === "equal") { + AND.push({ [name]: { value } }); + } else if (modifier === "not_equal") { + AND.push({ [name]: { NOT: value } }); + } else if (modifier === "includes") { + AND.push({ [name]: { hasEvery: value } }); + } else if (modifier === "excludes") { + AND.push({ [name]: { notIn: value } }); + } + } + break; + } + } + } + if (AND.length > 0) where.AND = AND; + if (OR.length > 0) where.OR = OR; + return where; +}; diff --git a/utils/soft-delete-filter.ts b/comps/filter/parser/soft-delete-filter.ts similarity index 78% rename from utils/soft-delete-filter.ts rename to comps/filter/parser/soft-delete-filter.ts index 562e9ab..1862fd6 100755 --- a/utils/soft-delete-filter.ts +++ b/comps/filter/parser/soft-delete-filter.ts @@ -1,4 +1,4 @@ -import { isEmptyString } from "./is-empty-string"; +import { isEmptyString } from "../../../utils/is-empty-string"; export const softDeleteFilter = ( where: any, @@ -11,16 +11,15 @@ export const softDeleteFilter = ( const feature = soft.feature || []; if (!feature.find((e) => e === "soft_delete")) return where; const defaultParam = typeof where === "object" ? where : {}; + if (isEmptyString(soft.field) || isEmptyString(soft.type)) return defaultParam; + const result = { AND: [ typeof defaultParam === "object" ? { ...defaultParam } : {}, { - [soft.field]: - soft.type === "boolean" - ? false - :null, + [soft.field]: soft.type === "boolean" ? false : null, }, ], }; diff --git a/comps/filter/utils/filter-where.ts b/comps/filter/utils/filter-where.ts deleted file mode 100755 index 1c156ba..0000000 --- a/comps/filter/utils/filter-where.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { getPathname } from "lib/utils/pathname"; -import { filter_window } from "./types"; - -export const filterWhere = (filter_name: string) => { - const pf = filter_window.prasi_filter?.[getPathname()]?.[filter_name]; - const where: any = {}; - const AND: any[] = []; - if (pf) { - console.log(pf); - for (const [k, filter] of Object.entries(pf)) { - for (const [name, value] of Object.entries(filter.data)) { - const type = filter.types[name]; - const modifier = filter.modifiers[name]; - - switch (type) { - case "text": - { - if (modifier === "contains") - where[name] = { - contains: "%" + value + "%", - mode: "insensitive", - }; - else if (modifier === "starts_with") - where[name] = { - contains: value + "%", - mode: "insensitive", - }; - else if (modifier === "ends_with") - where[name] = { - contains: "%" + value, - mode: "insensitive", - }; - else if (modifier === "not_equal") { - where[name] = { - NOT: value, - }; - } else if (modifier === "equal") { - where[name] = { - value, - }; - } - } - break; - case "date": - { - let is_value_valid = true; - // TODO: pastikan value bisa diparse pakai any-date-parser - if (is_value_valid) { - if (modifier === "between") { - AND.push({ [name]: { gt: value } }); - AND.push({ [name]: { lt: value } }); - } else if (modifier === "greater_than") { - AND.push({ [name]: { gt: value } }); - } else if (modifier === "less_than") { - AND.push({ [name]: { lt: value } }); - } - } - } - break; - case "number": - { - if (modifier === "equal") { - AND.push({ [name]: { value } }); - } else if (modifier === "not_equal") { - AND.push({ [name]: { NOT: value } }); - } else if (modifier === "greater_than") { - AND.push({ [name]: { gt: value } }); - } else if (modifier === "less_than") { - AND.push({ [name]: { lt: value } }); - } else if (modifier === "between") { - AND.push({ [name]: { gt: value } }); - AND.push({ [name]: { lt: value } }); - } - } - break; - case "boolean": - { - if (modifier === "is_true") { - AND.push({ [name]: true }); - } else if (modifier === "is_false") { - AND.push({ [name]: false }); - } - } - break; - case "options": - { - if (modifier === "equal") { - AND.push({ [name]: { value } }); - } else if (modifier === "not_equal") { - AND.push({ [name]: { NOT: value } }); - } else if (modifier === "includes") { - AND.push({ [name]: { hasEvery: value } }); - } else if (modifier === "excludes") { - AND.push({ [name]: { notIn: value } }); - } - } - break; - } - } - } - if (AND.length > 0) where.AND = AND; - } - return where; -}; diff --git a/comps/filter/utils/get-filter.ts b/comps/filter/utils/get-filter.ts index 3c2e792..a077b36 100755 --- a/comps/filter/utils/get-filter.ts +++ b/comps/filter/utils/get-filter.ts @@ -25,7 +25,6 @@ export const getFilter = (name: string) => { }, }, }; - return pf[pathname][name]; } }; diff --git a/comps/form/base/BaseField.tsx b/comps/form/base/BaseField.tsx index 45fe345..b0632a4 100755 --- a/comps/form/base/BaseField.tsx +++ b/comps/form/base/BaseField.tsx @@ -36,6 +36,7 @@ export const BaseField = (prop: {