prasi-lib/comps/form/gen/gen-form/on-submit.ts

168 lines
3.5 KiB
TypeScript
Executable File

import { GenFormArgs } from "./types";
export const genFormOnSubmit = ({
result,
pk,
pks,
table,
select,
is_md,
rel_many
}: GenFormArgs) => {
result.on_submit = {
mode: "raw",
value: `\
async ({ form, error, fm }: IForm) => {
let result = false;
try {${
is_md &&
`\
if (typeof md !== "undefined") {
fm.status = "saving";
md.render();
}`
}
const data = { ...form };
const record = {} as Record<string, any>;
const relation_ref = ${JSON.stringify(rel_many)};
const has_many = [] as Array<{
table: string;
data: Array<any>;
fk: string;
}>;
// validasi
fm.error.clear();
for (const [k, field] of Object.entries(fm.fields)) {
validateField(field, fm);
}
${
is_md &&
`\
if (fm.error.list.length > 0) {
if (typeof md !== "undefined") {
fm.status = "ready";
md.render();
}
return false;
}`
}
call_prasi_events("form", "before_save", [fm, data]);
// pisahkan antara has_many dengan field biasa
for (const [k, v] of Object.entries(data) as any) {
if (Array.isArray(v)) {
const rel =
Array.isArray(relation_ref) && relation_ref.length
? relation_ref.find((e) => e.table === k)
: null;
if (rel) {
has_many.push({
table: k,
data: v,
fk: rel.fk,
});
}
} else {
record[k] = v;
}
}
// prisma create / update ga boleh ada record.${pk}
if (record) delete record.${pk};
if (form.${pk}) {
await db.${table}.update({
where: {
${pk}: form.${pk},
},
data: {
...record,
},
});
} else {
const res = await db.${table}.create({
//@ts-ignore
data: {
...record,
},
});
if (res) {
form.id = res.id;
fm.is_newly_created = true;
}
}
if (has_many.length) {
const exec_query_bulk = async (
current: { table: string; data: Array<any>; fk: string },
list: Array<{ table: string; data: Array<any>; fk: string }>,
index: number,
) => {
if (list.length) {
const data = current.data.map((e) => {
const record = {
...e,
${table}: {
connect: {
${pk}: form.${pk},
},
},
};
call_prasi_events("form", "before_save", [fm, record]);
return record;
});
await db._batch.upsert({
table: current.table,
where: {
[current.fk]: form.${pk},
},
data: data,
mode: "relation",
} as any);
if (list.length > 1) {
try {
index++;
if (index <= list.length - 1) {
await exec_query_bulk(list[index], list, index);
}
} catch (ex) {}
}
}
};
await exec_query_bulk(has_many[0], has_many, 0);
}
result = true;
call_prasi_events("form", "after_save", [fm, data]);
${
is_md &&
`if (typeof md !== "undefined") {
fm.status = "ready";
fm.data = form;
md.selected = form;
md.render();
fm.render();
}`
}
} catch (e) {
console.error(e);
result = false;
}
return result;
};
type IForm = { form: any; error: Record<string, string>; fm: FMLocal }
`,
};
};