@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.
- package/dist/formatters/formatters.js +4 -2
- package/dist/formatters/formatters.js.map +1 -1
- package/dist/globals/index.d.ts +4 -1
- package/dist/globals/index.js.map +1 -1
- package/dist/helpers/custom-fonts.d.ts +3 -0
- package/dist/helpers/custom-fonts.js +11 -0
- package/dist/helpers/custom-fonts.js.map +1 -0
- package/dist/helpers/pdfExportHelper.d.ts +8 -0
- package/dist/helpers/pdfExportHelper.js +96 -0
- package/dist/helpers/pdfExportHelper.js.map +1 -1
- package/package.json +8 -4
- package/src/formatters/formatters.ts +11 -7
- package/src/globals/index.ts +5 -1
- package/src/helpers/custom-fonts.d.ts +5 -0
- package/src/helpers/custom-fonts.ts +18 -0
- package/src/helpers/pdfExportHelper.ts +116 -0
|
@@ -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":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAE/D,OAAO,QAAQ,MAAM,aAAa,CAAA;AAGlC,MAAM,UAAU,WAAW,CAAC,OAA2B;IACrD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA;IACzB,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAuB,CAAA;IACtE,OAAO,CAAC,IAAI,GAAG,CAAC,CAAA;IAChB,OAAO,CAAC,IAAI,GAAG,CAAC,CAAA;IAChB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAA;IACpC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,GAAG,MAAM,CAAA;IACvB,CAAC;IAED,OAAO,CAAC,aAAa,GAAG,EAAE,CAAA;IAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE,CAAA;IAC3C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;IAC7D,CAAC;IACD,OAAO,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;IACxE,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAA;IACnC,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAA;IACzC,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAA;IACvC,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAA;IAC/C,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAA;IAC/C,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA;IAC3B,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;IAE/B,aAAa,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAA;AACjF,CAAC;AASD,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,MAA0B;IACrE,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,EAAE,CAAA;IACnC,MAAM,IAAI,GAAG,MAAM,EAAE,IAAI,IAAI,IAAI,CAAA;IACjC,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,IAAI,CAAA;IACrC,MAAM,WAAW,GAAG,MAAM,EAAE,WAAW,IAAI,UAAU,CAAA;IACrD,IAAI,OAAO,EAAE,CAAC;QACZ,QAAQ,EAAE;aACP,IAAI,CAAC,OAAO,CAAC;aACb,GAAG,CAAC;YACH,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,cAAc;YACxB,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;YACtC,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE;YACzE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE;SAChE,CAAC;aACD,KAAK,EAAE;aACP,GAAG,CAAC,KAAK,CAAC;aACV,IAAI,CAAC,CAAC,GAAU,EAAE,EAAE;YACnB,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YAC/B,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;YACrC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;QAC5B,CAAC,CAAC,CAAA;IACN,CAAC;AACH,CAAC","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.
|
|
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
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
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
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
+
return htmlEncode(g[textField])
|
|
157
|
+
})
|
|
158
|
+
.join(', ')
|
|
159
|
+
)
|
|
156
160
|
}
|
|
157
161
|
}
|
|
158
162
|
|
package/src/globals/index.ts
CHANGED
|
@@ -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,
|