This commit is contained in:
rizky 2024-07-30 00:05:27 -07:00
parent 1facc07784
commit dc05e278c4
3 changed files with 127 additions and 89 deletions

View File

@ -35,75 +35,79 @@ async (arg: {
}) => { }) => {
if (isEditor) return [${JSON.stringify(sample)}]; if (isEditor) return [${JSON.stringify(sample)}];
return new Promise(async (done) => { return new Promise(async (done, reject) => {
${ try {
skip_select ${
? `` skip_select
: ` ? ``
const fields = parseGenField(rel__gen_fields); : `
const res = generateSelect(fields); 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<string, any> = {};
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(" - ");
} }
let blank: any = undefined; const is_tree =
if ((ext__required as any) !== "y" && (sub_type as any) === 'dropdown') { typeof rel__feature !== "undefined" &&
blank = { value: undefined, label: "", data: {} }; Array.isArray(rel__feature) &&
rel__feature.includes("tree");
const ext_select: Record<string, any> = {};
if (is_tree && typeof rel__id_parent === "string" && rel__id_parent) {
ext_select[rel__id_parent] = true;
} }
done( const where = (await call_prasi_events("field", "relation_load", [fm, arg.field]) || {}) as Prisma.${table}WhereInput;
[
blank, let items = await db.${table}.findMany({
...items.map((e) => { select: {
return { ...ext_select,
value: e.${pk}, ...${JSON.stringify(select)}
label: getLabel(e), ${skip_select ? `` : `,...(res?.select || {})`}
data: e, },
}; where,
}), orderBy: {
].filter((e) => e), ${pk}: "desc"
); },
} else { });
done([])
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(" - ");
}
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);
} }
}) })
} }

View File

@ -3,7 +3,7 @@ import { cn } from "@/utils";
import { fields_map } from "@/utils/format-value"; import { fields_map } from "@/utils/format-value";
import { useLocal } from "@/utils/use-local"; import { useLocal } from "@/utils/use-local";
import get from "lodash.get"; import get from "lodash.get";
import { Loader2 } from "lucide-react"; import { AlertTriangle, Loader2 } from "lucide-react";
import { import {
ChangeEvent, ChangeEvent,
FC, FC,
@ -139,7 +139,13 @@ export const TableList: FC<TableListProp> = ({
pk: null as null | GFCol, pk: null as null | GFCol,
scrolled: false, scrolled: false,
data: [] as any[], data: [] as any[],
status: "init" as "loading" | "ready" | "resizing" | "reload" | "init", status: "init" as
| "loading"
| "ready"
| "resizing"
| "reload"
| "init"
| "error",
where: null as any, where: null as any,
paging: { paging: {
take: 0, take: 0,
@ -271,8 +277,30 @@ export const TableList: FC<TableListProp> = ({
local.status = "ready"; local.status = "ready";
local.render(); 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(
<div className="c-flex c-text-red-600 c-items-center">
<AlertTriangle className="c-h-4 c-w-4 c-mr-1" />
Failed to load data
</div>,
{
dismissible: true,
className: css`
background: #ffecec;
border: 2px solid red;
`,
}
);
}
})();
} else callback(result);
} }
}, [on_load, local.sort.orderBy, local.paging.take, local.paging.skip]); }, [on_load, local.sort.orderBy, local.paging.take, local.paging.skip]);
@ -522,7 +550,9 @@ export const TableList: FC<TableListProp> = ({
} }
); );
} else { } else {
toast.dismiss(); if (local.status !== "error") {
toast.dismiss();
}
} }
} }

View File

@ -47,28 +47,32 @@ async (arg: TableOnLoad) => {
}); });
} }
return new Promise(async (done) => { return new Promise(async (done, reject) => {
//@ts-ignore try {
const fields = parseGenField(gen__fields); //@ts-ignore
const gen = generateSelect(fields); const fields = parseGenField(gen__fields);
const gen = generateSelect(fields);
const result = {items: []} const result = {items: []}
result.items = await db.${table}.findMany({ result.items = await db.${table}.findMany({
select: gen.select, select: gen.select,
orderBy: arg.orderBy || { orderBy: arg.orderBy || {
${pk}: "desc", ${pk}: "desc",
}, },
where: { where: {
...where, ...where,
}, },
...arg.paging, ...arg.paging,
}); });
await call_prasi_events("tablelist", "after_load", ["${table}", result.items, (input) => { await call_prasi_events("tablelist", "after_load", ["${table}", result.items, (input) => {
result.items = input; result.items = input;
}]); }]);
done(result.items); done(result.items);
} catch(e) {
reject(e);
}
}); });
}; };