base structure for list printing with custom template

This commit is contained in:
Julian Krauser 2025-03-18 16:54:53 +01:00
parent e2a916f37d
commit a085de6e2f
19 changed files with 279 additions and 98 deletions

View file

@ -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:

View file

@ -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,

View file

@ -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<string> {
@ -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 = `<h1 style="font-size:10px; text-align:center; width:100%;">${title}</h1>`;
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,
};
}
}