From dc05e278c4f2d618aaebc1e2348512f0227b5f89 Mon Sep 17 00:00:00 2001 From: rizky Date: Tue, 30 Jul 2024 00:05:27 -0700 Subject: [PATCH] fix --- comps/form/gen/on_load_rel.ts | 134 ++++++++++++++++--------------- comps/list/TableList.tsx | 40 +++++++-- comps/md/gen/tbl-list/on_load.ts | 42 +++++----- 3 files changed, 127 insertions(+), 89 deletions(-) diff --git a/comps/form/gen/on_load_rel.ts b/comps/form/gen/on_load_rel.ts index eeb0623..dcfdb1a 100755 --- a/comps/form/gen/on_load_rel.ts +++ b/comps/form/gen/on_load_rel.ts @@ -35,75 +35,79 @@ async (arg: { }) => { if (isEditor) return [${JSON.stringify(sample)}]; - return new Promise(async (done) => { - ${ - skip_select - ? `` - : ` - const fields = parseGenField(rel__gen_fields); - const res = generateSelect(fields); - ` - } - - const is_tree = - typeof rel__feature !== "undefined" && - Array.isArray(rel__feature) && - rel__feature.includes("tree"); - - const ext_select: Record = {}; - if (is_tree && typeof rel__id_parent === "string" && rel__id_parent) { - ext_select[rel__id_parent] = true; - } - - const where = (await call_prasi_events("field", "relation_load", [fm, arg.field]) || {}) as Prisma.${table}WhereInput; - - let items = await db.${table}.findMany({ - select: { - ...ext_select, - ...${JSON.stringify(select)} - ${skip_select ? `` : `,...(res?.select || {})`} - }, - where, - orderBy: { - ${pk}: "desc" - }, - }); - - if (is_tree && typeof rel__id_parent === "string" && rel__id_parent) { - items = sortTree(items, rel__id_parent, "${pk}"); - } - - if(Array.isArray(items) && items.length){ - const cols = ${JSON.stringify(cols)}; - const getLabel = (data: any) => { - const result = []; - cols.map((e) => { - if(data[e]){ - result.push(data[e]); - } - }) - return result.join(" - "); + return new Promise(async (done, reject) => { + try { + ${ + skip_select + ? `` + : ` + const fields = parseGenField(rel__gen_fields); + const res = generateSelect(fields); + ` } + + const is_tree = + typeof rel__feature !== "undefined" && + Array.isArray(rel__feature) && + rel__feature.includes("tree"); - let blank: any = undefined; - if ((ext__required as any) !== "y" && (sub_type as any) === 'dropdown') { - blank = { value: undefined, label: "", data: {} }; + const ext_select: Record = {}; + if (is_tree && typeof rel__id_parent === "string" && rel__id_parent) { + ext_select[rel__id_parent] = true; } + + const where = (await call_prasi_events("field", "relation_load", [fm, arg.field]) || {}) as Prisma.${table}WhereInput; + + let items = await db.${table}.findMany({ + select: { + ...ext_select, + ...${JSON.stringify(select)} + ${skip_select ? `` : `,...(res?.select || {})`} + }, + where, + orderBy: { + ${pk}: "desc" + }, + }); + + if (is_tree && typeof rel__id_parent === "string" && rel__id_parent) { + items = sortTree(items, rel__id_parent, "${pk}"); + } + + if(Array.isArray(items) && items.length){ + const cols = ${JSON.stringify(cols)}; + const getLabel = (data: any) => { + const result = []; + cols.map((e) => { + if(data[e]){ + result.push(data[e]); + } + }) + return result.join(" - "); + } - done( - [ - blank, - ...items.map((e) => { - return { - value: e.${pk}, - label: getLabel(e), - data: e, - }; - }), - ].filter((e) => e), - ); - } else { - done([]) + let blank: any = undefined; + if ((ext__required as any) !== "y" && (sub_type as any) === 'dropdown') { + blank = { value: undefined, label: "", data: {} }; + } + + done( + [ + blank, + ...items.map((e) => { + return { + value: e.${pk}, + label: getLabel(e), + data: e, + }; + }), + ].filter((e) => e), + ); + } else { + done([]) + } + } catch(e) { + reject(e); } }) } diff --git a/comps/list/TableList.tsx b/comps/list/TableList.tsx index 6c09fb1..b09556b 100755 --- a/comps/list/TableList.tsx +++ b/comps/list/TableList.tsx @@ -3,7 +3,7 @@ import { cn } from "@/utils"; import { fields_map } from "@/utils/format-value"; import { useLocal } from "@/utils/use-local"; import get from "lodash.get"; -import { Loader2 } from "lucide-react"; +import { AlertTriangle, Loader2 } from "lucide-react"; import { ChangeEvent, FC, @@ -139,7 +139,13 @@ export const TableList: FC = ({ pk: null as null | GFCol, scrolled: false, data: [] as any[], - status: "init" as "loading" | "ready" | "resizing" | "reload" | "init", + status: "init" as + | "loading" + | "ready" + | "resizing" + | "reload" + | "init" + | "error", where: null as any, paging: { take: 0, @@ -271,8 +277,30 @@ export const TableList: FC = ({ local.status = "ready"; local.render(); }; - if (result instanceof Promise) result.then(callback); - else callback(result); + + if (result instanceof Promise) { + (async () => { + try { + callback(await result); + } catch (e) { + local.status = "error"; + toast.dismiss(); + toast.error( +
+ + Failed to load data +
, + { + dismissible: true, + className: css` + background: #ffecec; + border: 2px solid red; + `, + } + ); + } + })(); + } else callback(result); } }, [on_load, local.sort.orderBy, local.paging.take, local.paging.skip]); @@ -522,7 +550,9 @@ export const TableList: FC = ({ } ); } else { - toast.dismiss(); + if (local.status !== "error") { + toast.dismiss(); + } } } diff --git a/comps/md/gen/tbl-list/on_load.ts b/comps/md/gen/tbl-list/on_load.ts index 375f50d..aec416a 100755 --- a/comps/md/gen/tbl-list/on_load.ts +++ b/comps/md/gen/tbl-list/on_load.ts @@ -47,28 +47,32 @@ async (arg: TableOnLoad) => { }); } - return new Promise(async (done) => { - //@ts-ignore - const fields = parseGenField(gen__fields); - const gen = generateSelect(fields); + return new Promise(async (done, reject) => { + try { + //@ts-ignore + const fields = parseGenField(gen__fields); + const gen = generateSelect(fields); - const result = {items: []} - result.items = await db.${table}.findMany({ - select: gen.select, - orderBy: arg.orderBy || { - ${pk}: "desc", - }, - where: { - ...where, - }, - ...arg.paging, - }); + const result = {items: []} + result.items = await db.${table}.findMany({ + select: gen.select, + orderBy: arg.orderBy || { + ${pk}: "desc", + }, + where: { + ...where, + }, + ...arg.paging, + }); - await call_prasi_events("tablelist", "after_load", ["${table}", result.items, (input) => { - result.items = input; - }]); + await call_prasi_events("tablelist", "after_load", ["${table}", result.items, (input) => { + result.items = input; + }]); - done(result.items); + done(result.items); + } catch(e) { + reject(e); + } }); };