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)}];
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<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(" - ");
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<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(" - ");
}
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);
}
})
}

View File

@ -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<TableListProp> = ({
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<TableListProp> = ({
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(
<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]);
@ -522,7 +550,9 @@ export const TableList: FC<TableListProp> = ({
}
);
} else {
toast.dismiss();
if (local.status !== "error") {
toast.dismiss();
}
}
}

View File

@ -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);
}
});
};