From 94c08f0b9e5369084d14eb48aaa43b8c88a29e5c Mon Sep 17 00:00:00 2001 From: Ahmed Bouhuolia Date: Sun, 15 Sep 2024 22:55:39 +0200 Subject: [PATCH] chore: clean pdf templates code --- .../PdfTemplate/AssignPdfTemplateDefault.ts | 9 ++++- .../services/PdfTemplate/EditPdfTemplate.ts | 24 +++++++---- .../PdfTemplate/GetPdfTemplatesTransformer.ts | 14 ++++++- .../PdfTemplate/PdfTemplateApplication.ts | 40 +++++++++++++++++++ packages/server/src/subscribers/events.ts | 3 +- .../BrandingTemplatesTable.tsx | 29 ++------------ .../containers/BrandingTemplates/_hooks.tsx | 25 ++++++++++++ 7 files changed, 106 insertions(+), 38 deletions(-) create mode 100644 packages/webapp/src/containers/BrandingTemplates/_hooks.tsx diff --git a/packages/server/src/services/PdfTemplate/AssignPdfTemplateDefault.ts b/packages/server/src/services/PdfTemplate/AssignPdfTemplateDefault.ts index f4317aec1..ac038c79d 100644 --- a/packages/server/src/services/PdfTemplate/AssignPdfTemplateDefault.ts +++ b/packages/server/src/services/PdfTemplate/AssignPdfTemplateDefault.ts @@ -1,7 +1,7 @@ import { Service, Inject } from 'typedi'; +import { Knex } from 'knex'; import HasTenancyService from '../Tenancy/TenancyService'; import UnitOfWork from '../UnitOfWork'; -import { Knex } from 'knex'; import { EventPublisher } from '@/lib/EventPublisher/EventPublisher'; import events from '@/subscribers/events'; @@ -16,6 +16,13 @@ export class AssignPdfTemplateDefault { @Inject() private eventPublisher: EventPublisher; + /** + * Assigns a default PDF template for a specific tenant. + * @param {number} tenantId - The ID of the tenant for whom the default template is being assigned. + * @param {number} templateId - The ID of the template to be set as the default. + * @returns {Promise} A promise that resolves when the operation is complete. + * @throws {Error} Throws ddan error if the specified template is not found. + */ public async assignDefaultTemplate(tenantId: number, templateId: number) { const { PdfTemplate } = this.tenancy.models(tenantId); diff --git a/packages/server/src/services/PdfTemplate/EditPdfTemplate.ts b/packages/server/src/services/PdfTemplate/EditPdfTemplate.ts index 0e94a2c61..1436e4af5 100644 --- a/packages/server/src/services/PdfTemplate/EditPdfTemplate.ts +++ b/packages/server/src/services/PdfTemplate/EditPdfTemplate.ts @@ -1,4 +1,5 @@ import { Inject, Service } from 'typedi'; +import { Knex } from 'knex'; import { IEditPdfTemplateDTO } from './types'; import HasTenancyService from '../Tenancy/TenancyService'; import UnitOfWork from '../UnitOfWork'; @@ -19,30 +20,39 @@ export class EditPdfTemplate { /** * Edits an existing pdf template. * @param {number} tenantId - * @param {number} templateId + * @param {number} templateId - Template id. * @param {IEditPdfTemplateDTO} editTemplateDTO */ - public editPdfTemplate( + public async editPdfTemplate( tenantId: number, templateId: number, editTemplateDTO: IEditPdfTemplateDTO ) { const { PdfTemplate } = this.tenancy.models(tenantId); - return this.uow.withTransaction(tenantId, async (trx) => { + const oldPdfTemplate = await PdfTemplate.query() + .findById(templateId) + .throwIfNotFound(); + + return this.uow.withTransaction(tenantId, async (trx: Knex.Transaction) => { + // Triggers `onPdfTemplateEditing` event. await this.eventPublisher.emitAsync(events.pdfTemplate.onEditing, { tenantId, templateId, }); - await PdfTemplate.query(trx).where('id', templateId).update({ - templateName: editTemplateDTO.templateName, - attributes: editTemplateDTO.attributes, - }); + const pdfTemplate = await PdfTemplate.query(trx) + .where('id', templateId) + .update({ + templateName: editTemplateDTO.templateName, + attributes: editTemplateDTO.attributes, + }); + // Triggers `onPdfTemplatedEdited` event. await this.eventPublisher.emitAsync(events.pdfTemplate.onEdited, { tenantId, templateId, }); + return pdfTemplate; }); } } diff --git a/packages/server/src/services/PdfTemplate/GetPdfTemplatesTransformer.ts b/packages/server/src/services/PdfTemplate/GetPdfTemplatesTransformer.ts index 181b3f029..1b6904752 100644 --- a/packages/server/src/services/PdfTemplate/GetPdfTemplatesTransformer.ts +++ b/packages/server/src/services/PdfTemplate/GetPdfTemplatesTransformer.ts @@ -18,11 +18,21 @@ export class GetPdfTemplatesTransformer extends Transformer { return ['createdAtFormatted', 'resourceFormatted']; }; - private createdAtFormatted = (template) => { + /** + * Formats the creation date of the PDF template. + * @param {Object} template + * @returns {string} A formatted string representing the creation date of the template. + */ + protected createdAtFormatted = (template) => { return this.formatDate(template.createdAt); }; - private resourceFormatted = (template) => { + /** + * Formats the creation date of the PDF template. + * @param {Object} template - + * @returns {string} A formatted string representing the creation date of the template. + */ + protected resourceFormatted = (template) => { return getTransactionTypeLabel(template.resource); }; } diff --git a/packages/server/src/services/PdfTemplate/PdfTemplateApplication.ts b/packages/server/src/services/PdfTemplate/PdfTemplateApplication.ts index 30a08266e..3f0d66be6 100644 --- a/packages/server/src/services/PdfTemplate/PdfTemplateApplication.ts +++ b/packages/server/src/services/PdfTemplate/PdfTemplateApplication.ts @@ -27,6 +27,14 @@ export class PdfTemplateApplication { @Inject() private assignPdfTemplateDefaultService: AssignPdfTemplateDefault; + /** + * Creates a new PDF template. + * @param {number} tenantId - + * @param {string} templateName - The name of the PDF template to create. + * @param {string} resource - The resource type associated with the PDF template. + * @param {ICreateInvoicePdfTemplateDTO} invoiceTemplateDTO - The data transfer object containing the details for the new PDF template. + * @returns {Promise} + */ public async createPdfTemplate( tenantId: number, templateName: string, @@ -41,6 +49,13 @@ export class PdfTemplateApplication { ); } + /** + * Edits an existing PDF template. + * @param {number} tenantId - The ID of the tenant. + * @param {number} templateId - The ID of the PDF template to edit. + * @param {IEditPdfTemplateDTO} editTemplateDTO - The data transfer object containing the updated details for the PDF template. + * @returns {Promise} + */ public async editPdfTemplate( tenantId: number, templateId: number, @@ -53,6 +68,13 @@ export class PdfTemplateApplication { ); } + /** + * Deletes a PDF template. + * @param {number} tenantId - The ID of the tenant. + * @param {number} templateId - The ID of the PDF template to delete. + * @returns {Promise} + */ + public async deletePdfTemplate(tenantId: number, templateId: number) { return this.deletePdfTemplateService.deletePdfTemplate( tenantId, @@ -60,10 +82,22 @@ export class PdfTemplateApplication { ); } + /** + * Retrieves a PDF template by its ID for a specified tenant. + * @param {number} tenantId - + * @param {number} templateId - The ID of the PDF template to retrieve. + * @returns {Promise} + */ public async getPdfTemplate(tenantId: number, templateId: number) { return this.getPdfTemplateService.getPdfTemplate(tenantId, templateId); } + /** + * Retrieves a list of PDF templates. + * @param {number} tenantId - The ID of the tenant for which to retrieve templates. + * @param {Object} query + * @returns {Promise} + */ public async getPdfTemplates( tenantId: number, query?: { resource?: string } @@ -71,6 +105,12 @@ export class PdfTemplateApplication { return this.getPdfTemplatesService.getPdfTemplates(tenantId, query); } + /** + * Assigns a PDF template as the default template. + * @param {number} tenantId + * @param {number} templateId - The ID of the PDF template to assign as default. + * @returns {Promise} + */ public async assignPdfTemplateAsDefault( tenantId: number, templateId: number diff --git a/packages/server/src/subscribers/events.ts b/packages/server/src/subscribers/events.ts index 9e7d71be7..01f828124 100644 --- a/packages/server/src/subscribers/events.ts +++ b/packages/server/src/subscribers/events.ts @@ -685,6 +685,7 @@ export default { onImportCommitted: 'onImportFileCommitted', }, + // Branding templates pdfTemplate: { onCreating: 'onPdfTemplateCreating', onCreated: 'onPdfTemplateCreated', @@ -697,7 +698,5 @@ export default { onAssignedDefault: 'onPdfTemplateAssignedDefault', onAssigningDefault: 'onPdfTemplateAssigningDefault', - - onInvoiceCreated: 'onInvoicePdfTemplateCreated', }, }; diff --git a/packages/webapp/src/containers/BrandingTemplates/BrandingTemplatesTable.tsx b/packages/webapp/src/containers/BrandingTemplates/BrandingTemplatesTable.tsx index aeba730dc..0b2d57985 100644 --- a/packages/webapp/src/containers/BrandingTemplates/BrandingTemplatesTable.tsx +++ b/packages/webapp/src/containers/BrandingTemplates/BrandingTemplatesTable.tsx @@ -1,15 +1,14 @@ // @ts-nocheck import * as R from 'ramda'; -import { Classes, Tag } from '@blueprintjs/core'; -import clsx from 'classnames'; -import { DataTable, Group, TableSkeletonRows } from '@/components'; +import { DataTable, TableSkeletonRows } from '@/components'; import { useBrandingTemplatesBoot } from './BrandingTemplatesBoot'; import { ActionsMenu } from './_components'; import { DRAWERS } from '@/constants/drawers'; import withAlertActions from '@/containers/Alert/withAlertActions'; import withDrawerActions from '@/containers/Drawer/withDrawerActions'; -import styles from './BrandTemplates.module.scss'; import { getCustomizeDrawerNameFromResource } from './_utils'; +import { useBrandingTemplatesColumns } from './_hooks'; +import styles from './BrandTemplates.module.scss'; interface BrandingTemplatesTableProps {} @@ -72,25 +71,3 @@ export const BrandingTemplatesTable = R.compose( withAlertActions, withDrawerActions, )(BrandingTemplateTableRoot); - -const useBrandingTemplatesColumns = () => { - return [ - { - Header: 'Template Name', - accessor: (row) => ( - - {row.template_name} {row.default && Default} - - ), - width: 65, - clickable: true, - }, - { - Header: 'Created At', - accessor: 'created_at_formatted', - width: 35, - className: clsx(Classes.TEXT_MUTED), - clickable: true, - }, - ]; -}; diff --git a/packages/webapp/src/containers/BrandingTemplates/_hooks.tsx b/packages/webapp/src/containers/BrandingTemplates/_hooks.tsx new file mode 100644 index 000000000..eb5f32251 --- /dev/null +++ b/packages/webapp/src/containers/BrandingTemplates/_hooks.tsx @@ -0,0 +1,25 @@ +import clsx from 'classnames'; +import { Classes, Tag } from '@blueprintjs/core'; +import { Group } from '@/components'; + +export const useBrandingTemplatesColumns = () => { + return [ + { + Header: 'Template Name', + accessor: (row: any) => ( + + {row.template_name} {row.default && Default} + + ), + width: 65, + clickable: true, + }, + { + Header: 'Created At', + accessor: 'created_at_formatted', + width: 35, + className: clsx(Classes.TEXT_MUTED), + clickable: true, + }, + ]; +};