@idevs/corelib 0.0.95 → 0.0.97

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,5 @@
1
1
  import { IdevsExportOptions } from '../globals';
2
+ import { Margins, PageOrientation, PageSize, Style } from 'pdfmake/interfaces';
2
3
  export declare function doExportPdf(options: IdevsExportOptions): void;
3
4
  export type generatePdfOption = {
4
5
  unit?: string;
@@ -7,3 +8,10 @@ export type generatePdfOption = {
7
8
  margin?: number;
8
9
  };
9
10
  export declare function generatePdf(content: string, option?: generatePdfOption): void;
11
+ export declare function makePdf(html: string, options?: PageOptions): Promise<string>;
12
+ export type PageOptions = {
13
+ defaultStyle?: Style | undefined;
14
+ pageSize?: PageSize | undefined;
15
+ pageOrientation?: PageOrientation | undefined;
16
+ pageMargins?: Margins | undefined;
17
+ };
@@ -1,5 +1,8 @@
1
1
  import { deepClone, postToService } from '@serenity-is/corelib';
2
2
  import html2pdf from 'html2pdf.js';
3
+ import pdfMake from 'pdfmake/build/pdfmake';
4
+ import { vfsFonts } from './custom-fonts';
5
+ import htmlToPdfmake from 'html-to-pdfmake';
3
6
  export function doExportPdf(options) {
4
7
  const grid = options.grid;
5
8
  const request = deepClone(grid.getView().params);
@@ -48,4 +51,97 @@ export function generatePdf(content, option) {
48
51
  });
49
52
  }
50
53
  }
54
+ export function makePdf(html, options) {
55
+ return new Promise((resolve, reject) => {
56
+ if (!html) {
57
+ reject('No html to make a pdf');
58
+ }
59
+ else {
60
+ pdfMake.vfs = vfsFonts;
61
+ pdfMake.fonts = {
62
+ Roboto: {
63
+ normal: 'Roboto-Regular.ttf',
64
+ bold: 'Roboto-Medium.ttf',
65
+ italics: 'Roboto-Italic.ttf',
66
+ bolditalics: 'Roboto-MediumItalic.ttf',
67
+ },
68
+ THSarabun: {
69
+ normal: 'THSarabun.ttf',
70
+ bold: 'THSarabun Bold.ttf',
71
+ italics: 'THSarabun Italic.ttf',
72
+ bolditalics: 'THSarabun Bold Italic.ttf',
73
+ },
74
+ };
75
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
76
+ const def = htmlToPdfmake(html, { tableAutoSize: true });
77
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
78
+ let main = def.find((el) => el['nodeName'] == 'MAIN');
79
+ if (!main) {
80
+ return;
81
+ }
82
+ main = removeEmptyTextNodes(main);
83
+ const defStyle = options?.defaultStyle || {
84
+ font: 'THSarabun',
85
+ };
86
+ const margin = options?.pageMargins ?? 40;
87
+ const pageSize = options?.pageSize ?? 'A4';
88
+ const pageOrientation = options?.pageOrientation ?? 'portrait';
89
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
90
+ let header = def.find((el) => el['nodeName'] == 'HEADER');
91
+ header = removeEmptyTextNodes(header);
92
+ const hd = header ? JSON.stringify(header) : undefined;
93
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
94
+ let footer = def.find((el) => el['nodeName'] == 'FOOTER');
95
+ if (footer) {
96
+ footer = removeEmptyTextNodes(footer);
97
+ }
98
+ const ft = footer ? JSON.stringify(footer) : undefined;
99
+ const content = {
100
+ content: main,
101
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
102
+ header: function (currentPage, pageCount, pageSize) {
103
+ if (!hd) {
104
+ return '';
105
+ }
106
+ const h = hd.replace('{{pageNo}}', currentPage.toString()).replace('{{totalPages}}', pageCount.toString());
107
+ return JSON.parse(h);
108
+ },
109
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
110
+ footer: function (currentPage, pageCount, pageSize) {
111
+ if (!ft) {
112
+ return '';
113
+ }
114
+ const f = ft.replace('{{pageNo}}', currentPage.toString()).replace('{{totalPages}}', pageCount.toString());
115
+ return JSON.parse(f);
116
+ },
117
+ pageSize: pageSize,
118
+ pageOrientation: pageOrientation,
119
+ pageMargins: margin,
120
+ defaultStyle: defStyle,
121
+ };
122
+ pdfMake.createPdf(content).open();
123
+ resolve('Make pdf successfully');
124
+ }
125
+ });
126
+ }
127
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
128
+ const removeEmptyTextNodes = (obj) => {
129
+ // If obj is an array, iterate through each element and filter
130
+ if (Array.isArray(obj)) {
131
+ return obj
132
+ .map(removeEmptyTextNodes) // Recursively apply the function
133
+ .filter(item => !(item && item.text === ' ')); // Remove elements where text is " "
134
+ }
135
+ // If obj is an object, check each key
136
+ if (typeof obj === 'object' && obj !== null) {
137
+ // eslint-disable-next-line prefer-const
138
+ for (let key in obj) {
139
+ // eslint-disable-next-line no-prototype-builtins
140
+ if (obj.hasOwnProperty(key)) {
141
+ obj[key] = removeEmptyTextNodes(obj[key]);
142
+ }
143
+ }
144
+ }
145
+ return obj;
146
+ };
51
147
  //# sourceMappingURL=pdfExportHelper.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pdfExportHelper.js","sourceRoot":"","sources":["../../src/helpers/pdfExportHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import { deepClone, postToService } from '@serenity-is/corelib'\nimport { IdevsExportOptions, IdevsExportRequest } from '../globals'\nimport html2pdf from 'html2pdf.js'\nimport { jsPDF } from 'jspdf'\n\nexport function doExportPdf(options: IdevsExportOptions): void {\n const grid = options.grid\n const request = deepClone(grid.getView().params) as IdevsExportRequest\n request.Take = 0\n request.Skip = 0\n const sortBy = grid.getView().sortBy\n if (sortBy) {\n request.Sort = sortBy\n }\n\n request.ExportColumns = []\n const columns = grid.getGrid().getColumns()\n for (const column of columns) {\n request.ExportColumns.push(column.id || column.field || '')\n }\n request.ExportColumns = request.ExportColumns.filter(column => !!column)\n request.viewName = options.viewName\n request.companyName = options.companyName\n request.reportName = options.reportName\n request.selectionRange = options.selectionRange\n request.conditionRange = options.conditionRange\n request.logo = options.logo\n request.entity = options.entity\n\n postToService({ service: options.service, request: request, target: '_blank' })\n}\n\nexport type generatePdfOption = {\n unit?: string\n format?: string\n orientation?: string\n margin?: number\n}\n\nexport function generatePdf(content: string, option?: generatePdfOption): void {\n const margin = option?.margin ?? 10\n const unit = option?.unit ?? 'mm'\n const format = option?.format ?? 'a4'\n const orientation = option?.orientation ?? 'portrait'\n if (content) {\n html2pdf()\n .from(content)\n .set({\n margin: margin,\n filename: 'filename.pdf',\n image: { type: 'jpeg', quality: 0.98 },\n html2canvas: { scale: 2, logging: true, dpi: 192, letterRendering: true },\n jsPDF: { unit: unit, format: format, orientation: orientation },\n })\n .toPdf()\n .get('pdf')\n .then((pdf: jsPDF) => {\n const blob = pdf.output('blob')\n const url = URL.createObjectURL(blob)\n window.open(url, '_blank')\n })\n }\n}\n"]}
1
+ {"version":3,"file":"pdfExportHelper.js","sourceRoot":"","sources":["../../src/helpers/pdfExportHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import { deepClone, postToService } from '@serenity-is/corelib'\nimport { IdevsExportOptions, IdevsExportRequest } from '../globals'\nimport html2pdf from 'html2pdf.js'\nimport { jsPDF } from 'jspdf'\nimport pdfMake from 'pdfmake/build/pdfmake'\nimport { vfsFonts } from './custom-fonts'\nimport htmlToPdfmake from 'html-to-pdfmake'\nimport { Margins, PageOrientation, PageSize, Style, TDocumentDefinitions } from 'pdfmake/interfaces'\n\nexport function doExportPdf(options: IdevsExportOptions): void {\n const grid = options.grid\n const request = deepClone(grid.getView().params) as IdevsExportRequest\n request.Take = 0\n request.Skip = 0\n const sortBy = grid.getView().sortBy\n if (sortBy) {\n request.Sort = sortBy\n }\n\n request.ExportColumns = []\n const columns = grid.getGrid().getColumns()\n for (const column of columns) {\n request.ExportColumns.push(column.id || column.field || '')\n }\n request.ExportColumns = request.ExportColumns.filter(column => !!column)\n request.viewName = options.viewName\n request.companyName = options.companyName\n request.reportName = options.reportName\n request.selectionRange = options.selectionRange\n request.conditionRange = options.conditionRange\n request.logo = options.logo\n request.entity = options.entity\n\n postToService({ service: options.service, request: request, target: '_blank' })\n}\n\nexport type generatePdfOption = {\n unit?: string\n format?: string\n orientation?: string\n margin?: number\n}\n\nexport function generatePdf(content: string, option?: generatePdfOption): void {\n const margin = option?.margin ?? 10\n const unit = option?.unit ?? 'mm'\n const format = option?.format ?? 'a4'\n const orientation = option?.orientation ?? 'portrait'\n if (content) {\n html2pdf()\n .from(content)\n .set({\n margin: margin,\n filename: 'filename.pdf',\n image: { type: 'jpeg', quality: 0.98 },\n html2canvas: { scale: 2, logging: true, dpi: 192, letterRendering: true },\n jsPDF: { unit: unit, format: format, orientation: orientation },\n })\n .toPdf()\n .get('pdf')\n .then((pdf: jsPDF) => {\n const blob = pdf.output('blob')\n const url = URL.createObjectURL(blob)\n window.open(url, '_blank')\n })\n }\n}\n\nexport function makePdf(html: string, options?: PageOptions): Promise<string> {\n return new Promise((resolve, reject) => {\n if (!html) {\n reject('No html to make a pdf')\n } else {\n pdfMake.vfs = vfsFonts\n pdfMake.fonts = {\n Roboto: {\n normal: 'Roboto-Regular.ttf',\n bold: 'Roboto-Medium.ttf',\n italics: 'Roboto-Italic.ttf',\n bolditalics: 'Roboto-MediumItalic.ttf',\n },\n THSarabun: {\n normal: 'THSarabun.ttf',\n bold: 'THSarabun Bold.ttf',\n italics: 'THSarabun Italic.ttf',\n bolditalics: 'THSarabun Bold Italic.ttf',\n },\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const def: any = htmlToPdfmake(html, { tableAutoSize: true })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let main = def.find((el: any) => el['nodeName'] == 'MAIN')\n if (!main) {\n return\n }\n main = removeEmptyTextNodes(main)\n\n const defStyle = options?.defaultStyle || {\n font: 'THSarabun',\n }\n\n const margin = options?.pageMargins ?? 40\n const pageSize = options?.pageSize ?? 'A4'\n const pageOrientation = options?.pageOrientation ?? 'portrait'\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let header: any = def.find((el: any) => el['nodeName'] == 'HEADER')\n header = removeEmptyTextNodes(header)\n const hd = header ? JSON.stringify(header) : undefined\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let footer = def.find((el: any) => el['nodeName'] == 'FOOTER')\n if (footer) {\n footer = removeEmptyTextNodes(footer)\n }\n const ft = footer ? JSON.stringify(footer) : undefined\n\n const content: TDocumentDefinitions = {\n content: main,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n header: function (currentPage, pageCount, pageSize) {\n if (!hd) {\n return ''\n }\n\n const h = hd.replace('{{pageNo}}', currentPage.toString()).replace('{{totalPages}}', pageCount.toString())\n return JSON.parse(h)\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n footer: function (currentPage, pageCount, pageSize) {\n if (!ft) {\n return ''\n }\n const f = ft.replace('{{pageNo}}', currentPage.toString()).replace('{{totalPages}}', pageCount.toString())\n return JSON.parse(f)\n },\n pageSize: pageSize,\n pageOrientation: pageOrientation,\n pageMargins: margin,\n defaultStyle: defStyle,\n }\n\n pdfMake.createPdf(content).open()\n\n resolve('Make pdf successfully')\n }\n })\n}\n\nexport type PageOptions = {\n defaultStyle?: Style | undefined\n pageSize?: PageSize | undefined\n pageOrientation?: PageOrientation | undefined\n pageMargins?: Margins | undefined\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst removeEmptyTextNodes = (obj: any): any => {\n // If obj is an array, iterate through each element and filter\n if (Array.isArray(obj)) {\n return obj\n .map(removeEmptyTextNodes) // Recursively apply the function\n .filter(item => !(item && item.text === ' ')) // Remove elements where text is \" \"\n }\n\n // If obj is an object, check each key\n if (typeof obj === 'object' && obj !== null) {\n // eslint-disable-next-line prefer-const\n for (let key in obj) {\n // eslint-disable-next-line no-prototype-builtins\n if (obj.hasOwnProperty(key)) {\n obj[key] = removeEmptyTextNodes(obj[key])\n }\n }\n }\n\n return obj\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@idevs/corelib",
3
- "version": "0.0.95",
3
+ "version": "0.0.97",
4
4
  "description": "Extended library for Serenity Framework",
5
5
  "main": "src/index.js",
6
6
  "scripts": {
@@ -36,18 +36,22 @@
36
36
  "@types/jquery.validation": "^1.16.10",
37
37
  "@types/jqueryui": "^1.12.22",
38
38
  "@types/toastr": "^2.1.43",
39
- "@typescript-eslint/typescript-estree": "^8.1.0"
39
+ "@typescript-eslint/typescript-estree": "^8.1.0",
40
+ "html-to-pdfmake": "^2.5.13",
41
+ "pdfmake": "^0.2.12",
42
+ "html2pdf.js": "^0.10.2",
43
+ "jspdf": "^2.5.1"
40
44
  },
41
45
  "devDependencies": {
42
46
  "@serenity-is/tsbuild": "^8.6.0",
47
+ "@types/html-to-pdfmake": "^2.4.4",
43
48
  "@types/jspdf": "^2.0.0",
49
+ "@types/pdfmake": "^0.2.9",
44
50
  "@typescript-eslint/eslint-plugin": "^5.62.0",
45
51
  "@typescript-eslint/parser": "^5.62.0",
46
52
  "bootstrap": "^5.3.3",
47
53
  "eslint": "^8.57.0",
48
54
  "eslint-config-prettier": "^8.10.0",
49
- "html2pdf.js": "^0.10.2",
50
- "jspdf": "^2.5.1",
51
55
  "prettier": "^2.8.8",
52
56
  "typescript": "^5.5.4"
53
57
  }
@@ -133,6 +133,7 @@ export class LookupFormatter implements Formatter {
133
133
  return LookupFormatter.format(ctx.value, this.lookupKey)
134
134
  }
135
135
 
136
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
136
137
  static format(src: any, lookupKey?: string): string {
137
138
  if (!src) return ''
138
139
 
@@ -145,14 +146,17 @@ export class LookupFormatter implements Formatter {
145
146
  const textField = lookup.textField
146
147
  const idList = src.toString().split(',')
147
148
 
148
- return idList
149
- .map((x: any) => {
150
- const g = items.find(i => i[idField] == x)
151
- if (!g) return x
149
+ return (
150
+ idList
151
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
152
+ .map((x: any) => {
153
+ const g = items.find(i => i[idField] == x)
154
+ if (!g) return x
152
155
 
153
- return htmlEncode(g[textField])
154
- })
155
- .join(', ')
156
+ return htmlEncode(g[textField])
157
+ })
158
+ .join(', ')
159
+ )
156
160
  }
157
161
  }
158
162
 
@@ -1,4 +1,4 @@
1
- import { DataGrid, ListRequest, ToolButton } from '@serenity-is/corelib'
1
+ import { DataGrid, ListRequest, ServiceResponse, ToolButton } from '@serenity-is/corelib'
2
2
  import { isEmptyOrNull } from '@serenity-is/corelib'
3
3
 
4
4
  declare global {
@@ -346,6 +346,10 @@ export type ExportOptions = IdevsExportOptions & {
346
346
  onClick?: (e: any) => void
347
347
  }
348
348
 
349
+ export type IdevsContentResponse = ServiceResponse & {
350
+ Content: string
351
+ }
352
+
349
353
  export function createExportToolButton(options: ExportOptions): ToolButton {
350
354
  return {
351
355
  hint: options.hint || options.exportType,
@@ -0,0 +1,5 @@
1
+ declare module 'pdfmake/build/custom_fonts' {
2
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
3
+ const pdfFonts: any
4
+ export default pdfFonts
5
+ }