import { toKebabCase, toPascalCase } from "js-convert-case"; import { formTemplate } from "../form.js"; import extract_fields_from_collection from "../../utils/extract-fields-from-collection.js"; import { wrapAttribute } from "../../utils/wrap-attributes.js"; export async function createItemFormTemplate( create_action_name: string, newfilefullpath: string, collection_name: string, list_action: string ): Promise { const collection_fields = await extract_fields_from_collection(collection_name); const formFieldsGetterVar = `get${toPascalCase(collection_name)}FormFields`; return formTemplate(create_action_name, { success_message: "Created!", postimport: `import {${formFieldsGetterVar}, get${toPascalCase( collection_name )}FormControls }from "./shared.js"; import { ${toPascalCase( collection_name )} } from "src/back/collections/collections.js"; import { ${list_action}URL } from "src/back/routes/urls.js"; import {tempstream} from "tempstream"; `, get_fields: `get${toPascalCase(collection_name)}FormFields`, get_controls: `(fields: ReturnType)=>[ new Controls.FormHeader("Create ${toPascalCase( collection_name )}"), ...get${toPascalCase(collection_name)}FormControls(fields)]`, can_access: `canAccess = async (ctx: Context) => { const policy = ${toPascalCase(collection_name)}.getPolicy("create"); const response = await policy.check(ctx.$context); return { canAccess: response?.allowed || false, message: response?.reason || "" }; };`, get_initial_values: "", onsubmit: ` async onSubmit(ctx: Context, formData: FormData) { const fctx = this.makeFormControlContext(ctx, formData, true); const created = await ctx.$app.collections["${toKebabCase( collection_name )}"].createExtraSafe( ctx.$context, { ${collection_fields .map((field_info) => field_info.form_field.generateCreateValueGetter(field_info, { form_field_types: "FormFieldTypes", sealious_field: `fields${wrapAttribute(field_info.name)}`, form_fields: "this.fields", }) ) .join(",\n")} }); for(const field of Object.values(this.fields)){ // eslint-disable-next-line no-await-in-loop await field.postSealiousCreate(ctx, created, formData) } } `, render: ` async render(ctx: Context, data: FormData, show_field_errors: boolean) { return html({ ctx, title: "Create ${toKebabCase(collection_name)}", body: tempstream/* HTML */ \`
← Back to ${collection_name} list \${await super.render(ctx, data, show_field_errors)}
\`, description: "", css_clumps: ["admin-forms"] } ); }`, }); }