import TemplateService from "../service/configuration/templateService"; import { PermissionModule } from "../type/permissionTypes"; import TemplateUsageService from "../service/configuration/templateUsageService"; import Handlebars, { template } from "handlebars"; import { FileSystemHelper } from "./fileSystemHelper"; import { TemplateFormat } from "../type/templateTypes"; export abstract class TemplateHelper { static getTemplateFromFile(template: string) { 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 { return (await TemplateService.getById(templateId)).html; } static applyDataToTemplate(template: string, data: any): string { const normalizedTemplate = this.normalizeTemplate(template); const templateCompiled = Handlebars.compile(normalizedTemplate); return templateCompiled(data); } static normalizeTemplate(template: string): string { template = template.replace(/.*?<\/listend>/g, "{{/each}}"); template = template.replace(/]*>(WDH Start: )?/g, "{{#each "); template = template.replace(/<\/liststart>/g, "}}"); return template; } static async renderFileForModule({ module, title = "pdf-export FF Admin", headerData = {}, bodyData = {}, footerData = {}, }: { module: TemplateFormat; title?: string; headerData?: any; bodyData?: any; footerData?: any; }): Promise<{ header: string; body: string; footer: string; headerMargin?: number; footerMargin?: number }> { const moduleTemplate = await TemplateUsageService.getByScope(module); let header = `

${title}

`; let footer = ""; let body = ""; if (moduleTemplate.headerId) { header = await this.getTemplateFromStore(moduleTemplate.headerId); header = this.applyDataToTemplate(header, { title, ...headerData }); } if (moduleTemplate.footerId) { footer = await this.getTemplateFromStore(moduleTemplate.footerId); } else { footer = this.getTemplateFromFile(module + ".footer"); } 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, { title, ...bodyData }); return { header, footer, body, headerMargin: moduleTemplate.headerHeight, footerMargin: moduleTemplate.footerHeight, }; } static async renderFileForCustom({ module, title = "pdf-export FF Admin", headerData = {}, bodyData = {}, footerData = {}, customTemplate, }: { module: TemplateFormat; 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((customTemplate.bodyId || module) + ".body"); } body = this.applyDataToTemplate(body, { title, ...bodyData }); return { header, footer, body, headerMargin: customTemplate.headerHeight, footerMargin: customTemplate.footerHeight, }; } }