From a085de6e2f3158f00c12d7e45f1e903b8400872d Mon Sep 17 00:00:00 2001 From: Julian Krauser Date: Tue, 18 Mar 2025 16:54:53 +0100 Subject: [PATCH 1/2] base structure for list printing with custom template --- .../admin/club/listprintController.ts | 52 +++++++++++ src/controller/admin/club/memberController.ts | 27 ------ src/data-source.ts | 8 +- src/demodata/member.list.data.ts | 13 --- src/handlebars.config.ts | 32 +++++++ src/helpers/demoDataHelper.ts | 3 - src/helpers/pdfExport.ts | 33 +++++-- src/helpers/templateHelper.ts | 90 ++++++++++++------- src/index.ts | 1 + src/migrations/1742311486232-listprinting.ts | 25 ++++++ src/routes/admin/club/listprint.ts | 10 +++ src/routes/admin/club/member.ts | 5 -- src/routes/admin/index.ts | 11 ++- ...ter.template.html => footer.template.html} | 0 src/templates/listprint.body.template.html | 48 ++++++++++ ...ml => listprint.member.body.template.html} | 9 +- .../member.list.footer.template.html | 3 - src/templates/protocol.footer.template.html | 3 - src/type/permissionTypes.ts | 4 +- 19 files changed, 279 insertions(+), 98 deletions(-) create mode 100644 src/controller/admin/club/listprintController.ts delete mode 100644 src/demodata/member.list.data.ts create mode 100644 src/handlebars.config.ts create mode 100644 src/migrations/1742311486232-listprinting.ts create mode 100644 src/routes/admin/club/listprint.ts rename src/templates/{member.footer.template.html => footer.template.html} (100%) create mode 100644 src/templates/listprint.body.template.html rename src/templates/{member.list.body.template.html => listprint.member.body.template.html} (78%) delete mode 100644 src/templates/member.list.footer.template.html delete mode 100644 src/templates/protocol.footer.template.html diff --git a/src/controller/admin/club/listprintController.ts b/src/controller/admin/club/listprintController.ts new file mode 100644 index 0000000..edd4961 --- /dev/null +++ b/src/controller/admin/club/listprintController.ts @@ -0,0 +1,52 @@ +import { Request, Response } from "express"; +import { PdfExport } from "../../../helpers/pdfExport"; +import DynamicQueryBuilder from "../../../helpers/dynamicQueryBuilder"; +import QueryStoreService from "../../../service/configuration/queryStoreService"; + +/** + * @description print list by query and template + * @param req {Request} Express req object + * @param res {Response} Express res object + * @returns {Promise<*>} + */ +export async function printListByQueryAndTemplate(req: Request, res: Response): Promise { + const title = req.body.title; + const queryStore = req.body.queryStore; + const headerId = req.body.headerId ?? null; + const bodyId = req.body.bodyId ?? null; + const footerId = req.body.footerId ?? null; + const headerHeight = req.body.headerHeight ?? null; + const footerHeight = req.body.footerHeight ?? null; + + // \/ integrate into query builder execution via shortcut + //await MemberService.getByRunningMembership(); + //await MemberService.getAll({ noLimit:true }); + + let query = (await QueryStoreService.getById(queryStore)).query; + + await DynamicQueryBuilder.executeQuery({ query, noLimit: true }); + + let pdf = await PdfExport.renderFile({ + title: title, + template: "listprint", + saveToDisk: false, + data: { + today: new Date(), + }, + customTemplate: { + headerId, + footerId, + bodyId, + headerHeight, + footerHeight, + }, + }); + + let pdfbuffer = Buffer.from(pdf); + + res.setHeader("Content-Type", "application/pdf"); + res.setHeader("Content-Length", pdfbuffer.byteLength); + res.setHeader("Content-Disposition", "inline; filename=preview.pdf"); + + res.send(pdfbuffer); +} diff --git a/src/controller/admin/club/memberController.ts b/src/controller/admin/club/memberController.ts index a31e514..9ef0bf4 100644 --- a/src/controller/admin/club/memberController.ts +++ b/src/controller/admin/club/memberController.ts @@ -305,33 +305,6 @@ export async function getCommunicationByMemberAndRecord(req: Request, res: Respo res.json(CommunicationFactory.mapToSingle(communication)); } -/** - * @description create member printout list - * @param req {Request} Express req object - * @param res {Response} Express res object - * @returns {Promise<*>} - */ -export async function createMemberPrintoutList(req: Request, res: Response): Promise { - let members = await MemberService.getByRunningMembership(); - - let pdf = await PdfExport.renderFile({ - title: "Mitgliederliste", - template: "member.list", - saveToDisk: false, - data: { - member: members, - }, - }); - - let pdfbuffer = Buffer.from(pdf); - - res.setHeader("Content-Type", "application/pdf"); - res.setHeader("Content-Length", pdfbuffer.byteLength); - res.setHeader("Content-Disposition", "inline; filename=preview.pdf"); - - res.send(pdfbuffer); -} - /** * @description create member * @param req {Request} Express req object diff --git a/src/data-source.ts b/src/data-source.ts index 87af7a0..ea45dc3 100644 --- a/src/data-source.ts +++ b/src/data-source.ts @@ -48,6 +48,7 @@ import { salutation } from "./entity/configuration/salutation"; import { BackupAndResetDatabase1738166124200 } from "./migrations/1738166124200-BackupAndResetDatabase"; import { CreateSchema1738166167472 } from "./migrations/1738166167472-CreateSchema"; import { MemberPrintoutTemplates1742207245862 } from "./migrations/1742207245862-memberPrintoutTemplates"; +import { Listprinting1742311486232 } from "./migrations/1742311486232-listprinting"; const dataSource = new DataSource({ type: DB_TYPE as any, @@ -101,7 +102,12 @@ const dataSource = new DataSource({ webapi, webapiPermission, ], - migrations: [BackupAndResetDatabase1738166124200, CreateSchema1738166167472, MemberPrintoutTemplates1742207245862], + migrations: [ + BackupAndResetDatabase1738166124200, + CreateSchema1738166167472, + MemberPrintoutTemplates1742207245862, + Listprinting1742311486232, + ], migrationsRun: true, migrationsTransactionMode: "each", subscribers: [], diff --git a/src/demodata/member.list.data.ts b/src/demodata/member.list.data.ts deleted file mode 100644 index 7244fd9..0000000 --- a/src/demodata/member.list.data.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { member } from "../entity/club/member/member"; -import { protocolAgenda } from "../entity/club/protocol/protocolAgenda"; -import { protocolDecision } from "../entity/club/protocol/protocolDecision"; -import { protocolVoting } from "../entity/club/protocol/protocolVoting"; - -export const memberlistDemoData: { member: Array> } = { - member: [ - { - firstname: "Julian", - lastname: "Krauser", - }, - ] -} diff --git a/src/handlebars.config.ts b/src/handlebars.config.ts new file mode 100644 index 0000000..2cbded1 --- /dev/null +++ b/src/handlebars.config.ts @@ -0,0 +1,32 @@ +import Handlebars from "handlebars"; + +Handlebars.registerHelper("date", function (aString) { + return new Date(aString).toLocaleDateString("de-DE", { + day: "2-digit", + month: "2-digit", + year: "numeric", + }); +}); + +Handlebars.registerHelper("longdate", function (aString) { + return new Date(aString).toLocaleDateString("de-DE", { + weekday: "long", + day: "2-digit", + month: "2-digit", + year: "numeric", + }); +}); + +Handlebars.registerHelper("datetime", function (aString) { + return new Date(aString).toLocaleDateString("de-DE", { + day: "2-digit", + month: "2-digit", + year: "numeric", + hour: "2-digit", + minute: "2-digit", + }); +}); + +Handlebars.registerHelper("json", function (context) { + return JSON.stringify(context); +}); diff --git a/src/helpers/demoDataHelper.ts b/src/helpers/demoDataHelper.ts index 45020a4..b577eb7 100644 --- a/src/helpers/demoDataHelper.ts +++ b/src/helpers/demoDataHelper.ts @@ -1,7 +1,6 @@ import { newsletterDemoData } from "../demodata/newsletter.data"; import { protocolDemoData } from "../demodata/protocol.data"; import { PermissionModule } from "../type/permissionTypes"; -import { memberlistDemoData } from "../demodata/member.list.data"; import { memberDemoData } from "../demodata/member.data"; export abstract class DemoDataHelper { @@ -11,8 +10,6 @@ export abstract class DemoDataHelper { return protocolDemoData; case "newsletter": return newsletterDemoData; - case "member.list": - return memberlistDemoData; case "member": return memberDemoData; default: diff --git a/src/helpers/pdfExport.ts b/src/helpers/pdfExport.ts index afae7bf..b22f061 100644 --- a/src/helpers/pdfExport.ts +++ b/src/helpers/pdfExport.ts @@ -12,6 +12,7 @@ export abstract class PdfExport { data = {}, saveToDisk = true, folder = "", + customTemplate = undefined, }: { template: `${PermissionModule}` | `${PermissionModule}.${string}`; title?: string; @@ -19,16 +20,34 @@ export abstract class PdfExport { data?: any; saveToDisk?: boolean; folder?: string; + customTemplate?: { + headerId?: number; + footerId?: number; + bodyId?: string | number; + headerHeight: number; + footerHeight: number; + }; }) { if (folder != "") FileSystemHelper.createFolder(folder); - const { header, footer, body, headerMargin, footerMargin } = await TemplateHelper.renderFileForModule({ - module: template, - headerData: data, - bodyData: data, - footerData: data, - title: title, - }); + let header: string, footer: string, body: string, headerMargin: number, footerMargin: number; + if (!customTemplate) { + ({ header, footer, body, headerMargin, footerMargin } = await TemplateHelper.renderFileForModule({ + module: template, + headerData: data, + bodyData: data, + footerData: data, + title: title, + })); + } else { + ({ header, footer, body, headerMargin, footerMargin } = await TemplateHelper.renderFileForCustom({ + customTemplate, + headerData: data, + bodyData: data, + footerData: data, + title: title, + })); + } const browser = await puppeteer.launch({ headless: true, diff --git a/src/helpers/templateHelper.ts b/src/helpers/templateHelper.ts index af1c832..54a48fc 100644 --- a/src/helpers/templateHelper.ts +++ b/src/helpers/templateHelper.ts @@ -4,36 +4,15 @@ import TemplateUsageService from "../service/configuration/templateUsageService" import Handlebars, { template } from "handlebars"; import { FileSystemHelper } from "./fileSystemHelper"; -Handlebars.registerHelper("date", function (aString) { - return new Date(aString).toLocaleDateString("de-DE", { - day: "2-digit", - month: "2-digit", - year: "numeric", - }); -}); - -Handlebars.registerHelper("longdate", function (aString) { - return new Date(aString).toLocaleDateString("de-DE", { - weekday: "long", - day: "2-digit", - month: "2-digit", - year: "numeric", - }); -}); - -Handlebars.registerHelper("datetime", function (aString) { - return new Date(aString).toLocaleDateString("de-DE", { - day: "2-digit", - month: "2-digit", - year: "numeric", - hour: "2-digit", - minute: "2-digit", - }); -}); - export abstract class TemplateHelper { static getTemplateFromFile(template: string) { - return FileSystemHelper.readTemplateFile(`/src/templates/${template}.template.html`); + let tmpFile; + try { + tmpFile = FileSystemHelper.readTemplateFile(`/src/templates/${template}.template.html`); + } catch (err) { + tmpFile = FileSystemHelper.readTemplateFile(`/src/templates/${template.split(".")[1]}.template.html`); + } + return tmpFile; } static async getTemplateFromStore(templateId: number): Promise { @@ -83,14 +62,14 @@ export abstract class TemplateHelper { } else { footer = this.getTemplateFromFile(module + ".footer"); } - footer = this.applyDataToTemplate(footer, footerData); + footer = this.applyDataToTemplate(footer, { title, ...footerData }); if (moduleTemplate.bodyId) { body = await this.getTemplateFromStore(moduleTemplate.bodyId); } else { body = this.getTemplateFromFile(module + ".body"); } - body = this.applyDataToTemplate(body, bodyData); + body = this.applyDataToTemplate(body, { title, ...bodyData }); return { header, @@ -100,4 +79,55 @@ export abstract class TemplateHelper { footerMargin: moduleTemplate.footerHeight, }; } + + static async renderFileForCustom({ + title = "pdf-export FF Admin", + headerData = {}, + bodyData = {}, + footerData = {}, + customTemplate, + }: { + title?: string; + headerData?: any; + bodyData?: any; + footerData?: any; + customTemplate: { + headerId?: number; + footerId?: number; + bodyId?: string | number; + headerHeight: number; + footerHeight: number; + }; + }): Promise<{ header: string; body: string; footer: string; headerMargin?: number; footerMargin?: number }> { + let header = `

${title}

`; + let footer = ""; + let body = ""; + + if (customTemplate.headerId) { + header = await this.getTemplateFromStore(customTemplate.headerId); + header = this.applyDataToTemplate(header, { title, ...headerData }); + } + + if (customTemplate.footerId) { + footer = await this.getTemplateFromStore(customTemplate.footerId); + } else { + footer = this.getTemplateFromFile(module + ".footer"); + } + footer = this.applyDataToTemplate(footer, { title, ...footerData }); + + if (customTemplate.bodyId && typeof customTemplate.bodyId == "number") { + body = await this.getTemplateFromStore(customTemplate.bodyId); + } else { + body = this.getTemplateFromFile(module + ".body"); + } + body = this.applyDataToTemplate(body, { title, ...bodyData }); + + return { + header, + footer, + body, + headerMargin: customTemplate.headerHeight, + footerMargin: customTemplate.footerHeight, + }; + } } diff --git a/src/index.ts b/src/index.ts index 3517a6b..a282863 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,5 @@ import "dotenv/config"; +import "./handlebars.config"; import express from "express"; import { BACKUP_AUTO_RESTORE, configCheck, SERVER_PORT } from "./env.defaults"; diff --git a/src/migrations/1742311486232-listprinting.ts b/src/migrations/1742311486232-listprinting.ts new file mode 100644 index 0000000..6b14e61 --- /dev/null +++ b/src/migrations/1742311486232-listprinting.ts @@ -0,0 +1,25 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; +import { templateUsage } from "../entity/configuration/templateUsage"; + +export class Listprinting1742311486232 implements MigrationInterface { + name = "Listprinting1742311486232"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.manager + .createQueryBuilder() + .delete() + .from(templateUsage) + .where({ scope: "member.list" }) + .execute(); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.manager + .createQueryBuilder() + .insert() + .into(templateUsage) + .values([{ scope: "member.list" }]) + .orUpdate(["headerId", "bodyId", "footerId", "headerHeight", "footerHeight"], ["scope"]) + .execute(); + } +} diff --git a/src/routes/admin/club/listprint.ts b/src/routes/admin/club/listprint.ts new file mode 100644 index 0000000..9bb8a7d --- /dev/null +++ b/src/routes/admin/club/listprint.ts @@ -0,0 +1,10 @@ +import express, { Request, Response } from "express"; +import { printListByQueryAndTemplate } from "../../../controller/admin/club/listprintController"; + +var router = express.Router({ mergeParams: true }); + +router.get("/", async (req: Request, res: Response) => { + await printListByQueryAndTemplate(req, res); +}); + +export default router; diff --git a/src/routes/admin/club/member.ts b/src/routes/admin/club/member.ts index 541487e..efd6e05 100644 --- a/src/routes/admin/club/member.ts +++ b/src/routes/admin/club/member.ts @@ -6,7 +6,6 @@ import { addMembershipToMember, addQualificationToMember, createMember, - createMemberPrintoutList, deleteAwardOfMember, deleteCommunicationOfMember, deleteExecutivePositionOfMember, @@ -60,10 +59,6 @@ router.get("/:id/print", async (req: Request, res: Response) => { await getMemberPrintoutById(req, res); }); -router.get("/print/namelist", async (req: Request, res: Response) => { - await createMemberPrintoutList(req, res); -}); - router.get("/:memberId/memberships", async (req: Request, res: Response) => { await getMembershipsByMember(req, res); }); diff --git a/src/routes/admin/index.ts b/src/routes/admin/index.ts index 3dddb4f..c2bab0f 100644 --- a/src/routes/admin/index.ts +++ b/src/routes/admin/index.ts @@ -19,6 +19,7 @@ import protocol from "./club/protocol"; import calendar from "./club/calendar"; import queryBuilder from "./club/queryBuilder"; import newsletter from "./club/newsletter"; +import listprint from "./club/listprint"; import role from "./management/role"; import user from "./management/user"; @@ -84,7 +85,14 @@ router.use( ]), calendarType ); -router.use("/querystore", PermissionHelper.passCheckMiddleware("read", "configuration", "query_store"), queryStore); +router.use( + "/querystore", + PermissionHelper.passCheckSomeMiddleware([ + { requiredPermissions: "read", section: "configuration", module: "query_store" }, + { requiredPermissions: "read", section: "club", module: "listprint" }, + ]), + queryStore +); router.use("/template", PermissionHelper.passCheckMiddleware("read", "configuration", "template"), template); router.use( "/templateusage", @@ -132,6 +140,7 @@ router.use( ]), newsletter ); +router.use("/listprint", PermissionHelper.passCheckMiddleware("read", "club", "listprint"), listprint); router.use("/role", PermissionHelper.passCheckMiddleware("read", "management", "role"), role); router.use( diff --git a/src/templates/member.footer.template.html b/src/templates/footer.template.html similarity index 100% rename from src/templates/member.footer.template.html rename to src/templates/footer.template.html diff --git a/src/templates/listprint.body.template.html b/src/templates/listprint.body.template.html new file mode 100644 index 0000000..2be7e77 --- /dev/null +++ b/src/templates/listprint.body.template.html @@ -0,0 +1,48 @@ + + + + + Listen-Druck + + +

{{title}}

+

Ausdruck Stand {{longdate today}}

+
+ + + {{#each list}} + + + + {{/each}} +
{{json this}}
+ + + diff --git a/src/templates/member.list.body.template.html b/src/templates/listprint.member.body.template.html similarity index 78% rename from src/templates/member.list.body.template.html rename to src/templates/listprint.member.body.template.html index cc0996c..a4e1840 100644 --- a/src/templates/member.list.body.template.html +++ b/src/templates/listprint.member.body.template.html @@ -6,15 +6,16 @@

Mitgliederliste

+

Ausdruck Stand {{longdate today}}


- {{#each member}} + {{#each list}} - + + {{/each}}
+ {{this.lastname}} {{this.firstname}}{{#if this.nameaffix}} - {{this.nameaffix}}{{/if}} - -
diff --git a/src/templates/member.list.footer.template.html b/src/templates/member.list.footer.template.html deleted file mode 100644 index 7a3190b..0000000 --- a/src/templates/member.list.footer.template.html +++ /dev/null @@ -1,3 +0,0 @@ -
- Seite von -
diff --git a/src/templates/protocol.footer.template.html b/src/templates/protocol.footer.template.html deleted file mode 100644 index 7a3190b..0000000 --- a/src/templates/protocol.footer.template.html +++ /dev/null @@ -1,3 +0,0 @@ -
- Seite von -
diff --git a/src/type/permissionTypes.ts b/src/type/permissionTypes.ts index a031c0e..e9ed138 100644 --- a/src/type/permissionTypes.ts +++ b/src/type/permissionTypes.ts @@ -6,6 +6,7 @@ export type PermissionModule = | "newsletter" | "newsletter_config" | "protocol" + | "listprint" | "qualification" | "award" | "executive_position" @@ -50,6 +51,7 @@ export const permissionModules: Array = [ "newsletter", "newsletter_config", "protocol", + "listprint", "qualification", "award", "executive_position", @@ -68,7 +70,7 @@ export const permissionModules: Array = [ ]; export const permissionTypes: Array = ["read", "create", "update", "delete"]; export const sectionsAndModules: SectionsAndModulesObject = { - club: ["member", "calendar", "newsletter", "protocol", "query"], + club: ["member", "calendar", "newsletter", "protocol", "query", "listprint"], configuration: [ "qualification", "award", From f8a5183f1ab006e76fdbd9896d63389b284cb9e8 Mon Sep 17 00:00:00 2001 From: Julian Krauser Date: Wed, 19 Mar 2025 15:19:03 +0100 Subject: [PATCH 2/2] system queries + custom template selection --- .../admin/club/listprintController.ts | 18 +++++++--- src/helpers/dynamicQueryBuilder.ts | 35 ++++++++++++++++++- src/helpers/pdfExport.ts | 1 + src/helpers/templateHelper.ts | 4 ++- src/routes/admin/club/listprint.ts | 2 +- 5 files changed, 52 insertions(+), 8 deletions(-) diff --git a/src/controller/admin/club/listprintController.ts b/src/controller/admin/club/listprintController.ts index edd4961..1159d9f 100644 --- a/src/controller/admin/club/listprintController.ts +++ b/src/controller/admin/club/listprintController.ts @@ -2,6 +2,7 @@ import { Request, Response } from "express"; import { PdfExport } from "../../../helpers/pdfExport"; import DynamicQueryBuilder from "../../../helpers/dynamicQueryBuilder"; import QueryStoreService from "../../../service/configuration/queryStoreService"; +import InternalException from "../../../exceptions/internalException"; /** * @description print list by query and template @@ -18,13 +19,19 @@ export async function printListByQueryAndTemplate(req: Request, res: Response): const headerHeight = req.body.headerHeight ?? null; const footerHeight = req.body.footerHeight ?? null; - // \/ integrate into query builder execution via shortcut - //await MemberService.getByRunningMembership(); - //await MemberService.getAll({ noLimit:true }); + let query = queryStore; + if (queryStore != "member" && queryStore != "memberByRunningMembership") { + query = (await QueryStoreService.getById(queryStore)).query; + } - let query = (await QueryStoreService.getById(queryStore)).query; + let data = await DynamicQueryBuilder.executeQuery({ + query: query.startsWith("{") ? JSON.parse(query) : query, + noLimit: true, + }); - await DynamicQueryBuilder.executeQuery({ query, noLimit: true }); + if (data.stats == "error") { + throw new InternalException("Failed executing Query"); + } let pdf = await PdfExport.renderFile({ title: title, @@ -32,6 +39,7 @@ export async function printListByQueryAndTemplate(req: Request, res: Response): saveToDisk: false, data: { today: new Date(), + list: data.rows, }, customTemplate: { headerId, diff --git a/src/helpers/dynamicQueryBuilder.ts b/src/helpers/dynamicQueryBuilder.ts index 1749016..446fc22 100644 --- a/src/helpers/dynamicQueryBuilder.ts +++ b/src/helpers/dynamicQueryBuilder.ts @@ -314,6 +314,13 @@ export default abstract class DynamicQueryBuilder { count: number; } > { + if (query == "member") { + query = memberQuery; + } + if (query == "memberByRunningMembership") { + query = memberByRunningMembershipQuery; + } + if (typeof query == "string") { const upperQuery = query.trim().toUpperCase(); if (!upperQuery.startsWith("SELECT") || /INSERT|UPDATE|DELETE|ALTER|DROP|CREATE|TRUNCATE/.test(upperQuery)) { @@ -330,7 +337,7 @@ export default abstract class DynamicQueryBuilder { return await dataSource .transaction(async (manager) => { - data = await manager.query(query); + data = await manager.query(query.toString()); throw new Error("AllwaysRollbackQuery"); }) @@ -382,3 +389,29 @@ export default abstract class DynamicQueryBuilder { } } } + +const memberQuery: DynamicQueryStructure = { + select: "*", + table: "member", + orderBy: [ + { column: "lastname", order: "ASC" }, + { column: "firstname", order: "ASC" }, + ], +}; + +const memberByRunningMembershipQuery: DynamicQueryStructure = { + select: "*", + table: "member", + join: [ + { + select: "*", + table: "membership", + where: [{ structureType: "condition", concat: "_", operation: "null", column: "end", value: "" }], + foreignColumn: "memberships", + }, + ], + orderBy: [ + { column: "lastname", order: "ASC" }, + { column: "firstname", order: "ASC" }, + ], +}; diff --git a/src/helpers/pdfExport.ts b/src/helpers/pdfExport.ts index b22f061..e59ba54 100644 --- a/src/helpers/pdfExport.ts +++ b/src/helpers/pdfExport.ts @@ -41,6 +41,7 @@ export abstract class PdfExport { })); } else { ({ header, footer, body, headerMargin, footerMargin } = await TemplateHelper.renderFileForCustom({ + module: template, customTemplate, headerData: data, bodyData: data, diff --git a/src/helpers/templateHelper.ts b/src/helpers/templateHelper.ts index 54a48fc..e75c87c 100644 --- a/src/helpers/templateHelper.ts +++ b/src/helpers/templateHelper.ts @@ -81,12 +81,14 @@ export abstract class TemplateHelper { } static async renderFileForCustom({ + module, title = "pdf-export FF Admin", headerData = {}, bodyData = {}, footerData = {}, customTemplate, }: { + module: `${PermissionModule}` | `${PermissionModule}.${string}`; title?: string; headerData?: any; bodyData?: any; @@ -118,7 +120,7 @@ export abstract class TemplateHelper { if (customTemplate.bodyId && typeof customTemplate.bodyId == "number") { body = await this.getTemplateFromStore(customTemplate.bodyId); } else { - body = this.getTemplateFromFile(module + ".body"); + body = this.getTemplateFromFile((customTemplate.bodyId || module) + ".body"); } body = this.applyDataToTemplate(body, { title, ...bodyData }); diff --git a/src/routes/admin/club/listprint.ts b/src/routes/admin/club/listprint.ts index 9bb8a7d..08e24d5 100644 --- a/src/routes/admin/club/listprint.ts +++ b/src/routes/admin/club/listprint.ts @@ -3,7 +3,7 @@ import { printListByQueryAndTemplate } from "../../../controller/admin/club/list var router = express.Router({ mergeParams: true }); -router.get("/", async (req: Request, res: Response) => { +router.post("/", async (req: Request, res: Response) => { await printListByQueryAndTemplate(req, res); });