@sme.up/doc-alchemist 1.2.0-SNAPSHOT-20250627103210 → 1.2.0-SNAPSHOT-20250704074443
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/README.md +280 -28
- package/dist/assets/gfx-data.d.ts +1 -0
- package/dist/assets/gfx-data.js +2 -0
- package/dist/assets/gfx-data.js.map +1 -0
- package/dist/{excel → converters/excel}/commons.d.ts +15 -2
- package/dist/{excel → converters/excel}/commons.js +97 -23
- package/dist/converters/excel/commons.js.map +1 -0
- package/dist/{excel/excel-generator.types.d.ts → converters/excel/excel-converter.types.d.ts} +1 -0
- package/dist/{excel/excel-generator.types.js → converters/excel/excel-converter.types.js} +3 -2
- package/dist/converters/excel/excel-converter.types.js.map +1 -0
- package/dist/{excel/matrix-generator.d.ts → converters/excel/matrix-converter.d.ts} +3 -3
- package/dist/{excel/matrix-generator.js → converters/excel/matrix-converter.js} +15 -13
- package/dist/converters/excel/matrix-converter.js.map +1 -0
- package/dist/{excel/tree-generator.d.ts → converters/excel/tree-converter.d.ts} +2 -2
- package/dist/{excel/tree-generator.js → converters/excel/tree-converter.js} +5 -5
- package/dist/converters/excel/tree-converter.js.map +1 -0
- package/dist/{excel/excel-generator.js → converters/excel-converter.js} +4 -4
- package/dist/converters/excel-converter.js.map +1 -0
- package/dist/{images → converters/images}/charts-generator.d.ts +2 -2
- package/dist/converters/images/charts-generator.js.map +1 -0
- package/dist/converters/pdf/autotable-renderer.d.ts +3 -0
- package/dist/converters/pdf/autotable-renderer.js +89 -0
- package/dist/converters/pdf/autotable-renderer.js.map +1 -0
- package/dist/converters/pdf/cover-renderer.d.ts +1 -0
- package/dist/converters/pdf/cover-renderer.js +26 -0
- package/dist/converters/pdf/cover-renderer.js.map +1 -0
- package/dist/converters/pdf/formulas-helper.d.ts +40 -0
- package/dist/converters/pdf/formulas-helper.js +227 -0
- package/dist/converters/pdf/formulas-helper.js.map +1 -0
- package/dist/converters/pdf/matrix-converter.d.ts +16 -0
- package/dist/converters/pdf/matrix-converter.js +198 -0
- package/dist/converters/pdf/matrix-converter.js.map +1 -0
- package/dist/converters/pdf/pdf-converter.types.d.ts +12 -0
- package/dist/converters/pdf/pdf-converter.types.js +2 -0
- package/dist/converters/pdf/pdf-converter.types.js.map +1 -0
- package/dist/{pdf/sch-generator.d.ts → converters/pdf/sch-converter.d.ts} +1 -1
- package/dist/{pdf/sch-generator.js → converters/pdf/sch-converter.js} +2 -2
- package/dist/converters/pdf/sch-converter.js.map +1 -0
- package/dist/{pdf/pdf-generator.d.ts → converters/pdf-converter.d.ts} +3 -3
- package/dist/converters/pdf-converter.js +44 -0
- package/dist/converters/pdf-converter.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/types/index.d.ts +2 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/utils/{generator-utility.d.ts → commons-utility.d.ts} +26 -1
- package/dist/utils/{generator-utility.js → commons-utility.js} +63 -10
- package/dist/utils/commons-utility.js.map +1 -0
- package/dist/utils/datastructure-utility.js +2 -2
- package/dist/utils/datastructure-utility.js.map +1 -1
- package/dist/utils/dates-utility.d.ts +9 -0
- package/dist/utils/dates-utility.js +18 -0
- package/dist/utils/dates-utility.js.map +1 -1
- package/dist/utils/formatter-utility.d.ts +3 -0
- package/dist/utils/formatter-utility.js +36 -0
- package/dist/utils/formatter-utility.js.map +1 -0
- package/dist/utils/math-utility.d.ts +1 -0
- package/dist/utils/math-utility.js +9 -0
- package/dist/utils/math-utility.js.map +1 -1
- package/package.json +4 -2
- package/dist/excel/commons.js.map +0 -1
- package/dist/excel/excel-generator.js.map +0 -1
- package/dist/excel/excel-generator.types.js.map +0 -1
- package/dist/excel/matrix-generator.js.map +0 -1
- package/dist/excel/tree-generator.js.map +0 -1
- package/dist/images/charts-generator.js.map +0 -1
- package/dist/pdf/pdf-generator.js +0 -9
- package/dist/pdf/pdf-generator.js.map +0 -1
- package/dist/pdf/sch-generator.js.map +0 -1
- package/dist/utils/generator-utility.js.map +0 -1
- /package/dist/{excel/excel-generator.d.ts → converters/excel-converter.d.ts} +0 -0
- /package/dist/{images → converters/images}/charts-generator.js +0 -0
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import * as jsPDFModule from "jspdf";
|
|
2
|
+
import autoTable from "jspdf-autotable";
|
|
3
|
+
import { convertColorToRgb } from "../../utils/commons-utility.js";
|
|
4
|
+
import { logoBase64 } from "../../assets/gfx-data.js";
|
|
5
|
+
import { getCellValueData } from "./formulas-helper.js";
|
|
6
|
+
import { getAutoTableOptions } from "./autotable-renderer.js";
|
|
7
|
+
/**
|
|
8
|
+
* Converts an ExcelJS worksheet into a PDF document using jsPDF and autoTable.
|
|
9
|
+
*
|
|
10
|
+
* This function extracts visible headers and data from the provided worksheet,
|
|
11
|
+
* applies cell styles, simulates Excel cell overflow, and calculates the optimal
|
|
12
|
+
* font size for the table. It then generates a PDF document with the formatted
|
|
13
|
+
* table and returns the resulting jsPDF instance.
|
|
14
|
+
*
|
|
15
|
+
* @param worksheet - The ExcelJS worksheet to convert to PDF.
|
|
16
|
+
* @param webupManagerData - Additional data required for extracting worksheet content.
|
|
17
|
+
* @returns A Promise that resolves to a jsPDF document containing the worksheet data as a table.
|
|
18
|
+
*/
|
|
19
|
+
export const dataTableToPdfDoc = async (worksheet, webupManagerData) => {
|
|
20
|
+
const doc = new jsPDFModule.jsPDF({ orientation: "landscape" });
|
|
21
|
+
doc.setFont("helvetica", "normal");
|
|
22
|
+
doc.setFontSize(10);
|
|
23
|
+
// Extract headers and column indexes
|
|
24
|
+
const { visibleHeaders, visibleColumnIndexes } = extractVisibleHeadersAndIndexes(worksheet);
|
|
25
|
+
// Extract data and cell styles separately
|
|
26
|
+
const data = extractData(worksheet, visibleColumnIndexes, webupManagerData);
|
|
27
|
+
const cellStyles = extractStyles(worksheet, visibleColumnIndexes, data);
|
|
28
|
+
// Post-process data to simulate Excel overflow
|
|
29
|
+
postProcessExcelOverflow(data, cellStyles);
|
|
30
|
+
// Calculate optimal font size based on data
|
|
31
|
+
const pageWidth = doc.internal.pageSize.getWidth();
|
|
32
|
+
const optimalFontSize = calculateOptimalFontSize(data, visibleHeaders, pageWidth);
|
|
33
|
+
autoTable(doc, getAutoTableOptions(visibleHeaders, data, optimalFontSize, cellStyles, logoBase64));
|
|
34
|
+
return doc;
|
|
35
|
+
};
|
|
36
|
+
// Function to calculate the optimal font size
|
|
37
|
+
const calculateOptimalFontSize = (data, visibleHeaders, pageWidth) => {
|
|
38
|
+
const maxSamples = Math.min(100, data.length); // Analyze max 100 rows
|
|
39
|
+
const availableWidth = pageWidth - 20; // Margins
|
|
40
|
+
const numColumns = visibleHeaders.length;
|
|
41
|
+
// If there are few columns, we can allow a larger font size
|
|
42
|
+
if (numColumns <= 3) {
|
|
43
|
+
return 10;
|
|
44
|
+
}
|
|
45
|
+
// Calculate more accurate statistics per column
|
|
46
|
+
const columnStats = visibleHeaders.map((header, colIndex) => {
|
|
47
|
+
const lengths = [header.length];
|
|
48
|
+
// Collect all cell lengths for this column
|
|
49
|
+
for (let rowIndex = 0; rowIndex < maxSamples; rowIndex++) {
|
|
50
|
+
if (data[rowIndex] && data[rowIndex][colIndex]) {
|
|
51
|
+
const cellLength = data[rowIndex][colIndex].text.replace(/\u00A0/g, " ").length;
|
|
52
|
+
lengths.push(cellLength);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
lengths.sort((a, b) => a - b);
|
|
56
|
+
// Use the 90th percentile instead of the maximum to be less conservative
|
|
57
|
+
const percentile90Index = Math.floor(lengths.length * 0.9);
|
|
58
|
+
const effectiveWidth = lengths[percentile90Index] || lengths[lengths.length - 1];
|
|
59
|
+
// The average length to balance very long columns with short ones
|
|
60
|
+
const avgLength = lengths.reduce((sum, len) => sum + len, 0) / lengths.length;
|
|
61
|
+
return {
|
|
62
|
+
max: Math.max(...lengths),
|
|
63
|
+
p90: effectiveWidth,
|
|
64
|
+
avg: avgLength,
|
|
65
|
+
min: Math.min(...lengths),
|
|
66
|
+
};
|
|
67
|
+
});
|
|
68
|
+
// Use a mixed strategy: combine 90th percentile with weighted average
|
|
69
|
+
const estimatedColumnWidths = columnStats.map(stats => {
|
|
70
|
+
// Weight the average more than the 90th percentile to be less pessimistic
|
|
71
|
+
const weightedWidth = stats.avg * 0.7 + stats.p90 * 0.3;
|
|
72
|
+
return Math.max(weightedWidth, 3); // Minimum width of 3 characters
|
|
73
|
+
});
|
|
74
|
+
// Try different font sizes starting from the largest
|
|
75
|
+
for (let testFontSize = 10; testFontSize >= 4; testFontSize -= 0.5) {
|
|
76
|
+
// More optimistic factor based on font size
|
|
77
|
+
const charWidthFactor = testFontSize >= 8 ? 3.2 : testFontSize >= 6 ? 2.8 : 2.5;
|
|
78
|
+
const estimatedTotalWidth = estimatedColumnWidths.reduce((sum, width) => sum + width * charWidthFactor, 0);
|
|
79
|
+
// Add a margin for columns (space between columns)
|
|
80
|
+
const totalWidthWithMargins = estimatedTotalWidth + numColumns * 10; // 10px between columns
|
|
81
|
+
if (totalWidthWithMargins <= availableWidth) {
|
|
82
|
+
return testFontSize;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return 4; // Minimum font size if nothing fits
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* Extracts visible headers and their column indexes from the worksheet (ignoring hidden columns).
|
|
89
|
+
*/
|
|
90
|
+
const extractVisibleHeadersAndIndexes = (worksheet) => {
|
|
91
|
+
const headerRow = worksheet.getRow(1);
|
|
92
|
+
const visibleHeaders = [];
|
|
93
|
+
const visibleColumnIndexes = [];
|
|
94
|
+
headerRow.eachCell({ includeEmpty: true }, (cell, colNumber) => {
|
|
95
|
+
const column = worksheet.getColumn(colNumber);
|
|
96
|
+
if (!column.hidden) {
|
|
97
|
+
visibleHeaders.push(cell?.toString() ?? "");
|
|
98
|
+
visibleColumnIndexes.push(colNumber);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
return { visibleHeaders, visibleColumnIndexes };
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Extracts the data from the worksheet for the given visible columns, formatting dates and preserving spaces.
|
|
105
|
+
*/
|
|
106
|
+
const extractData = (worksheet, visibleColumnIndexes, webupManagerData) => {
|
|
107
|
+
const data = [];
|
|
108
|
+
worksheet.eachRow((row, rowIndex) => {
|
|
109
|
+
if (rowIndex === 1)
|
|
110
|
+
return; // Skip header
|
|
111
|
+
const rowData = [];
|
|
112
|
+
visibleColumnIndexes.forEach(colIdx => {
|
|
113
|
+
const cell = row.getCell(colIdx);
|
|
114
|
+
const cellValue = getCellValueData(cell, worksheet, webupManagerData);
|
|
115
|
+
// Preserve spaces by replacing them with non-breaking spaces
|
|
116
|
+
cellValue.text = cellValue.text.replace(/ /g, "\u00A0");
|
|
117
|
+
rowData.push(cellValue);
|
|
118
|
+
});
|
|
119
|
+
data.push(rowData);
|
|
120
|
+
});
|
|
121
|
+
return data;
|
|
122
|
+
};
|
|
123
|
+
/**
|
|
124
|
+
* Extracts the cell styles (font, color, fill) for the given visible columns from the worksheet.
|
|
125
|
+
*/
|
|
126
|
+
const extractStyles = (worksheet, visibleColumnIndexes, rawData) => {
|
|
127
|
+
const cellStyles = [];
|
|
128
|
+
worksheet.eachRow((row, rowIndex) => {
|
|
129
|
+
if (rowIndex === 1)
|
|
130
|
+
return; // Skip header
|
|
131
|
+
const rowStyles = [];
|
|
132
|
+
visibleColumnIndexes.forEach((colIdx, index) => {
|
|
133
|
+
const cell = row.getCell(colIdx);
|
|
134
|
+
const cellStyle = {};
|
|
135
|
+
// Font
|
|
136
|
+
if (cell.font) {
|
|
137
|
+
if (cell.font.bold && cell.font.italic) {
|
|
138
|
+
cellStyle.fontStyle = "bolditalic";
|
|
139
|
+
}
|
|
140
|
+
else if (cell.font.bold) {
|
|
141
|
+
cellStyle.fontStyle = "bold";
|
|
142
|
+
}
|
|
143
|
+
else if (cell.font.italic) {
|
|
144
|
+
cellStyle.fontStyle = "italic";
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
cellStyle.fontStyle = "normal";
|
|
148
|
+
}
|
|
149
|
+
if (cell.font.color?.argb) {
|
|
150
|
+
const color = cell.font.color.argb;
|
|
151
|
+
const [r, g, b] = convertColorToRgb(color);
|
|
152
|
+
if (!isNaN(r) && !isNaN(g) && !isNaN(b)) {
|
|
153
|
+
cellStyle.textColor = [r, g, b];
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Fill (background color)
|
|
158
|
+
if (cell.fill &&
|
|
159
|
+
cell.fill.type === "pattern" &&
|
|
160
|
+
cell.fill.fgColor?.argb) {
|
|
161
|
+
const color = cell.fill.fgColor.argb;
|
|
162
|
+
const [r, g, b] = convertColorToRgb(color);
|
|
163
|
+
if (!isNaN(r) && !isNaN(g) && !isNaN(b)) {
|
|
164
|
+
cellStyle.fillColor = [r, g, b];
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Align right if the cell is numeric
|
|
168
|
+
if (rawData[rowIndex - 2][index].type === "number") {
|
|
169
|
+
cellStyle.halign = "right";
|
|
170
|
+
}
|
|
171
|
+
rowStyles.push(cellStyle);
|
|
172
|
+
});
|
|
173
|
+
cellStyles.push(rowStyles);
|
|
174
|
+
});
|
|
175
|
+
return cellStyles;
|
|
176
|
+
};
|
|
177
|
+
/**
|
|
178
|
+
* Post-processes the data and cell styles to simulate Excel's text overflow behavior.
|
|
179
|
+
* If a cell has long text and the next cell is empty, the width is set to auto.
|
|
180
|
+
*/
|
|
181
|
+
const postProcessExcelOverflow = (data, cellStyles) => {
|
|
182
|
+
for (let rowIndex = 0; rowIndex < data.length; rowIndex++) {
|
|
183
|
+
for (let colIndex = 0; colIndex < data[rowIndex].length - 1; colIndex++) {
|
|
184
|
+
const currentCell = data[rowIndex][colIndex];
|
|
185
|
+
const nextCell = data[rowIndex][colIndex + 1];
|
|
186
|
+
// If the current cell has long text and the next one is empty or only spaces
|
|
187
|
+
if (currentCell &&
|
|
188
|
+
currentCell.text.length > 15 &&
|
|
189
|
+
(!nextCell || nextCell.text.trim() === "")) {
|
|
190
|
+
// Extend the width of the current cell
|
|
191
|
+
if (!cellStyles[rowIndex][colIndex].cellWidth) {
|
|
192
|
+
cellStyles[rowIndex][colIndex].cellWidth = "auto";
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
//# sourceMappingURL=matrix-converter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matrix-converter.js","sourceRoot":"","sources":["../../../src/converters/pdf/matrix-converter.ts"],"names":[],"mappings":"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","sourcesContent":["import * as jsPDFModule from \"jspdf\";\nimport ExcelJS from \"exceljs\";\nimport autoTable from \"jspdf-autotable\";\nimport { WebupManagerData } from \"../../index.js\";\nimport { CellStyleData, CellValueProps } from \"./pdf-converter.types.js\";\nimport { convertColorToRgb } from \"../../utils/commons-utility.js\";\nimport { logoBase64 } from \"../../assets/gfx-data.js\";\nimport { getCellValueData } from \"./formulas-helper.js\";\nimport { getAutoTableOptions } from \"./autotable-renderer.js\";\n\n/**\n * Converts an ExcelJS worksheet into a PDF document using jsPDF and autoTable.\n *\n * This function extracts visible headers and data from the provided worksheet,\n * applies cell styles, simulates Excel cell overflow, and calculates the optimal\n * font size for the table. It then generates a PDF document with the formatted\n * table and returns the resulting jsPDF instance.\n *\n * @param worksheet - The ExcelJS worksheet to convert to PDF.\n * @param webupManagerData - Additional data required for extracting worksheet content.\n * @returns A Promise that resolves to a jsPDF document containing the worksheet data as a table.\n */\nexport const dataTableToPdfDoc = async (\n worksheet: ExcelJS.Worksheet,\n webupManagerData: WebupManagerData,\n): Promise<jsPDFModule.jsPDF> => {\n const doc = new jsPDFModule.jsPDF({ orientation: \"landscape\" });\n doc.setFont(\"helvetica\", \"normal\");\n doc.setFontSize(10);\n\n // Extract headers and column indexes\n const { visibleHeaders, visibleColumnIndexes } =\n extractVisibleHeadersAndIndexes(worksheet);\n\n // Extract data and cell styles separately\n const data = extractData(worksheet, visibleColumnIndexes, webupManagerData);\n const cellStyles = extractStyles(worksheet, visibleColumnIndexes, data);\n\n // Post-process data to simulate Excel overflow\n postProcessExcelOverflow(data, cellStyles);\n\n // Calculate optimal font size based on data\n const pageWidth = doc.internal.pageSize.getWidth();\n const optimalFontSize = calculateOptimalFontSize(\n data,\n visibleHeaders,\n pageWidth,\n );\n\n autoTable(\n doc,\n getAutoTableOptions(\n visibleHeaders,\n data,\n optimalFontSize,\n cellStyles,\n logoBase64,\n ),\n );\n\n return doc;\n};\n\n// Function to calculate the optimal font size\nconst calculateOptimalFontSize = (\n data: CellValueProps[][],\n visibleHeaders: string[],\n pageWidth: number,\n): number => {\n const maxSamples = Math.min(100, data.length); // Analyze max 100 rows\n const availableWidth = pageWidth - 20; // Margins\n const numColumns = visibleHeaders.length;\n\n // If there are few columns, we can allow a larger font size\n if (numColumns <= 3) {\n return 10;\n }\n\n // Calculate more accurate statistics per column\n const columnStats = visibleHeaders.map((header, colIndex) => {\n const lengths: number[] = [header.length];\n\n // Collect all cell lengths for this column\n for (let rowIndex = 0; rowIndex < maxSamples; rowIndex++) {\n if (data[rowIndex] && data[rowIndex][colIndex]) {\n const cellLength = data[rowIndex][colIndex].text.replace(\n /\\u00A0/g,\n \" \",\n ).length;\n lengths.push(cellLength);\n }\n }\n\n lengths.sort((a, b) => a - b);\n\n // Use the 90th percentile instead of the maximum to be less conservative\n const percentile90Index = Math.floor(lengths.length * 0.9);\n const effectiveWidth =\n lengths[percentile90Index] || lengths[lengths.length - 1];\n\n // The average length to balance very long columns with short ones\n const avgLength =\n lengths.reduce((sum, len) => sum + len, 0) / lengths.length;\n\n return {\n max: Math.max(...lengths),\n p90: effectiveWidth,\n avg: avgLength,\n min: Math.min(...lengths),\n };\n });\n\n // Use a mixed strategy: combine 90th percentile with weighted average\n const estimatedColumnWidths = columnStats.map(stats => {\n // Weight the average more than the 90th percentile to be less pessimistic\n const weightedWidth = stats.avg * 0.7 + stats.p90 * 0.3;\n return Math.max(weightedWidth, 3); // Minimum width of 3 characters\n });\n\n // Try different font sizes starting from the largest\n for (let testFontSize = 10; testFontSize >= 4; testFontSize -= 0.5) {\n // More optimistic factor based on font size\n const charWidthFactor =\n testFontSize >= 8 ? 3.2 : testFontSize >= 6 ? 2.8 : 2.5;\n\n const estimatedTotalWidth = estimatedColumnWidths.reduce(\n (sum, width) => sum + width * charWidthFactor,\n 0,\n );\n\n // Add a margin for columns (space between columns)\n const totalWidthWithMargins = estimatedTotalWidth + numColumns * 10; // 10px between columns\n\n if (totalWidthWithMargins <= availableWidth) {\n return testFontSize;\n }\n }\n\n return 4; // Minimum font size if nothing fits\n};\n\n/**\n * Extracts visible headers and their column indexes from the worksheet (ignoring hidden columns).\n */\nconst extractVisibleHeadersAndIndexes = (\n worksheet: ExcelJS.Worksheet,\n): { visibleHeaders: string[]; visibleColumnIndexes: number[] } => {\n const headerRow = worksheet.getRow(1);\n const visibleHeaders: string[] = [];\n const visibleColumnIndexes: number[] = [];\n headerRow.eachCell({ includeEmpty: true }, (cell, colNumber) => {\n const column = worksheet.getColumn(colNumber);\n if (!column.hidden) {\n visibleHeaders.push(cell?.toString() ?? \"\");\n visibleColumnIndexes.push(colNumber);\n }\n });\n return { visibleHeaders, visibleColumnIndexes };\n};\n\n/**\n * Extracts the data from the worksheet for the given visible columns, formatting dates and preserving spaces.\n */\nconst extractData = (\n worksheet: ExcelJS.Worksheet,\n visibleColumnIndexes: number[],\n webupManagerData: WebupManagerData,\n): CellValueProps[][] => {\n const data: CellValueProps[][] = [];\n worksheet.eachRow((row, rowIndex) => {\n if (rowIndex === 1) return; // Skip header\n const rowData: CellValueProps[] = [];\n visibleColumnIndexes.forEach(colIdx => {\n const cell = row.getCell(colIdx);\n const cellValue = getCellValueData(cell, worksheet, webupManagerData);\n // Preserve spaces by replacing them with non-breaking spaces\n cellValue.text = cellValue.text.replace(/ /g, \"\\u00A0\");\n rowData.push(cellValue);\n });\n data.push(rowData);\n });\n return data;\n};\n\n/**\n * Extracts the cell styles (font, color, fill) for the given visible columns from the worksheet.\n */\nconst extractStyles = (\n worksheet: ExcelJS.Worksheet,\n visibleColumnIndexes: number[],\n rawData: CellValueProps[][],\n): CellStyleData[][] => {\n const cellStyles: CellStyleData[][] = [];\n worksheet.eachRow((row, rowIndex) => {\n if (rowIndex === 1) return; // Skip header\n const rowStyles: CellStyleData[] = [];\n visibleColumnIndexes.forEach((colIdx, index) => {\n const cell = row.getCell(colIdx);\n const cellStyle: CellStyleData = {};\n // Font\n if (cell.font) {\n if (cell.font.bold && cell.font.italic) {\n cellStyle.fontStyle = \"bolditalic\";\n } else if (cell.font.bold) {\n cellStyle.fontStyle = \"bold\";\n } else if (cell.font.italic) {\n cellStyle.fontStyle = \"italic\";\n } else {\n cellStyle.fontStyle = \"normal\";\n }\n if (cell.font.color?.argb) {\n const color = cell.font.color.argb;\n const [r, g, b] = convertColorToRgb(color);\n if (!isNaN(r) && !isNaN(g) && !isNaN(b)) {\n cellStyle.textColor = [r, g, b];\n }\n }\n }\n // Fill (background color)\n if (\n cell.fill &&\n cell.fill.type === \"pattern\" &&\n cell.fill.fgColor?.argb\n ) {\n const color = cell.fill.fgColor.argb;\n const [r, g, b] = convertColorToRgb(color);\n if (!isNaN(r) && !isNaN(g) && !isNaN(b)) {\n cellStyle.fillColor = [r, g, b];\n }\n }\n // Align right if the cell is numeric\n if (rawData[rowIndex - 2][index].type === \"number\") {\n cellStyle.halign = \"right\";\n }\n\n rowStyles.push(cellStyle);\n });\n cellStyles.push(rowStyles);\n });\n return cellStyles;\n};\n\n/**\n * Post-processes the data and cell styles to simulate Excel's text overflow behavior.\n * If a cell has long text and the next cell is empty, the width is set to auto.\n */\nconst postProcessExcelOverflow = (\n data: CellValueProps[][],\n cellStyles: CellStyleData[][],\n) => {\n for (let rowIndex = 0; rowIndex < data.length; rowIndex++) {\n for (let colIndex = 0; colIndex < data[rowIndex].length - 1; colIndex++) {\n const currentCell = data[rowIndex][colIndex];\n const nextCell = data[rowIndex][colIndex + 1];\n\n // If the current cell has long text and the next one is empty or only spaces\n if (\n currentCell &&\n currentCell.text.length > 15 &&\n (!nextCell || nextCell.text.trim() === \"\")\n ) {\n // Extend the width of the current cell\n if (!cellStyles[rowIndex][colIndex].cellWidth) {\n cellStyles[rowIndex][colIndex].cellWidth = \"auto\";\n }\n }\n }\n }\n};\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface CellStyleData {
|
|
2
|
+
fontStyle?: "normal" | "bold" | "italic" | "bolditalic";
|
|
3
|
+
textColor?: [number, number, number];
|
|
4
|
+
fillColor?: [number, number, number];
|
|
5
|
+
cellWidth?: string;
|
|
6
|
+
halign?: "left" | "right" | "center";
|
|
7
|
+
}
|
|
8
|
+
export interface CellValueProps {
|
|
9
|
+
value: string | number | Date;
|
|
10
|
+
text: string;
|
|
11
|
+
type: "string" | "number" | "date";
|
|
12
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-converter.types.js","sourceRoot":"","sources":["../../../src/converters/pdf/pdf-converter.types.ts"],"names":[],"mappings":"","sourcesContent":["export interface CellStyleData {\n fontStyle?: \"normal\" | \"bold\" | \"italic\" | \"bolditalic\";\n textColor?: [number, number, number];\n fillColor?: [number, number, number];\n cellWidth?: string;\n halign?: \"left\" | \"right\" | \"center\";\n}\n\nexport interface CellValueProps {\n // The raw value of the cell, can be string, number, Date\n value: string | number | Date;\n // Formatted representation of the value\n text: string;\n type: \"string\" | \"number\" | \"date\";\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as jsPDFModule from "jspdf";
|
|
2
2
|
import { dataTableToChart } from "../images/charts-generator.js";
|
|
3
|
-
import { Shapes } from "
|
|
3
|
+
import { Shapes } from "../../types/component.js";
|
|
4
4
|
const jsPDF = jsPDFModule.jsPDF;
|
|
5
5
|
export const schedaToPdfDoc = async (sch) => {
|
|
6
6
|
const doc = new jsPDF({ orientation: "landscape" });
|
|
@@ -96,4 +96,4 @@ const filterSections = (sections) => {
|
|
|
96
96
|
return false;
|
|
97
97
|
});
|
|
98
98
|
};
|
|
99
|
-
//# sourceMappingURL=sch-
|
|
99
|
+
//# sourceMappingURL=sch-converter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sch-converter.js","sourceRoot":"","sources":["../../../src/converters/pdf/sch-converter.ts"],"names":[],"mappings":"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","sourcesContent":["import * as jsPDFModule from \"jspdf\";\nimport { dataTableToChart } from \"../images/charts-generator.js\";\nimport { Shapes } from \"../../types/component.js\";\nimport { SmeupDataTable } from \"../../types/data-structures/smeupDataTable.js\";\nimport {\n SmeupSch,\n SmeupSchSection,\n} from \"../../types/data-structures/smeupSch.js\";\nconst jsPDF = jsPDFModule.jsPDF;\n\nexport const schedaToPdfDoc = async (\n sch: SmeupSch,\n): Promise<jsPDFModule.jsPDF> => {\n const doc = new jsPDF({ orientation: \"landscape\" });\n const x = 10;\n const y = 10;\n doc.setFont(\"Helvetica\", \"normal\", 10);\n const pageWidth = doc.internal.pageSize.getWidth();\n const pageHeight = doc.internal.pageSize.getHeight();\n\n const layout = sch.layout || \"column\";\n const sections = sch.sections || [];\n let offsetX = x;\n let offsetY = y;\n for (const section of filterSections(sections)) {\n let sectionW = pageWidth - 2 * x;\n let sectionH = (pageHeight - 2 * y) / sections.length;\n if (layout === \"row\") {\n sectionW = (pageWidth - 2 * x) / sections.length;\n sectionH = pageHeight - 2 * y;\n }\n await renderSection(\n doc,\n section,\n layout,\n offsetX,\n offsetY,\n sectionW,\n sectionH,\n );\n if (layout === \"row\") offsetX += sectionW;\n else offsetY += sectionH;\n }\n\n return doc;\n};\n\n// Helper to render a section\nconst renderSection = async (\n doc: jsPDFModule.jsPDF,\n section: SmeupSchSection,\n parentLayout: string,\n parentX: number,\n parentY: number,\n parentW: number,\n parentH: number,\n): Promise<void> => {\n const layout = section.layout || parentLayout;\n const title = section.components?.[0]?.title || \"\";\n const dim = section.dim ? parseFloat(section.dim) : undefined;\n let sectionW = parentW;\n let sectionH = parentH;\n if (dim) {\n if (layout === \"row\") sectionW = parentW * (dim / 100);\n else sectionH = parentH * (dim / 100);\n }\n // Draw title\n doc.text(title, parentX + 2, parentY + 7);\n // Draw component type (assume one component)\n if (section.components && section.components.length > 0) {\n //const compType = section.components[0].type;\n const data = section.components[0].data || ({} as SmeupDataTable);\n const options = section.components[0].options?.EXA?.[0];\n if (options == null) {\n throw new Error(\"Options is undefined or null for component\");\n }\n const image = await dataTableToChart(data as SmeupDataTable, \"line\", {\n Width: String((sectionW - 4) * 10),\n Height: String((sectionH - 20) * 10),\n ...options,\n });\n const base64Image = image.toString(\"base64\");\n doc.addImage(\n `data:image/jpg;base64,${base64Image}`,\n \"JPG\",\n parentX + 2,\n parentY + 15,\n sectionW - 4,\n sectionH - 20,\n undefined,\n );\n }\n // Draw child sections\n if (section.sections && section.sections.length > 0) {\n let offsetX = parentX;\n let offsetY = parentY + 20;\n const filteredSections = filterSections(section.sections);\n for (let i = 0; i < filteredSections.length; i++) {\n const sub = filteredSections[i];\n let subW = sectionW;\n let subH = sectionH;\n if (layout === \"row\") subW = sectionW / section.sections!.length;\n else subH = sectionH / section.sections!.length;\n await renderSection(doc, sub, layout, offsetX, offsetY, subW, subH);\n if (layout === \"row\") offsetX += subW;\n else offsetY += subH;\n }\n }\n};\n\nconst filterSections = (sections: SmeupSchSection[]): SmeupSchSection[] => {\n return sections.filter(section => {\n // Filter out sections that are empty or have no components\n if (\n section.components &&\n section.components.length > 0 &&\n section.components[0].type === Shapes.EXA\n ) {\n return true;\n }\n // Recursively filter child sections\n if (section.sections && section.sections.length > 0) {\n section.sections = filterSections(section.sections);\n return section.sections.length > 0;\n }\n return false;\n });\n};\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { SmeupDataTable } from "../types/data-structures/smeupDataTable.js";
|
|
2
2
|
import { SmeupSch } from "../types/data-structures/smeupSch.js";
|
|
3
|
-
import {
|
|
3
|
+
import { WebupManagerData, GenericObject } from "../types/index.js";
|
|
4
|
+
export declare const schedaToPdfData: (sch: SmeupSch, webupManagerData: WebupManagerData) => Promise<Buffer>;
|
|
4
5
|
export declare const dataTableToPdfData: (component: {
|
|
5
6
|
smeupDataTable: SmeupDataTable;
|
|
6
7
|
props: GenericObject;
|
|
7
|
-
}, webupManagerData: WebupManagerData) => Promise<Buffer>;
|
|
8
|
-
export declare const schedaToPdfData: (sch: SmeupSch, webupManagerData: WebupManagerData) => Promise<Buffer>;
|
|
8
|
+
}, webupManagerData: WebupManagerData) => Promise<Buffer | Uint8Array>;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
|
+
import { SupportedExportFormats, } from "../types/index.js";
|
|
3
|
+
import { convertToBuffer } from "../utils/commons-utility.js";
|
|
4
|
+
import { dataTableToExcelWorkbook } from "./excel/matrix-converter.js";
|
|
5
|
+
import { dataTableToPdfDoc } from "./pdf/matrix-converter.js";
|
|
6
|
+
import { schedaToPdfDoc } from "./pdf/sch-converter.js";
|
|
7
|
+
import { PDFDocument } from "pdf-lib";
|
|
8
|
+
import { createCoverPdf } from "./pdf/cover-renderer.js";
|
|
9
|
+
export const schedaToPdfData = async (sch, webupManagerData) => {
|
|
10
|
+
const doc = await schedaToPdfDoc(sch);
|
|
11
|
+
return Buffer.from(doc.output("arraybuffer"));
|
|
12
|
+
};
|
|
13
|
+
export const dataTableToPdfData = async (component, webupManagerData) => {
|
|
14
|
+
const workbook = dataTableToExcelWorkbook(component, SupportedExportFormats.XLSX, webupManagerData);
|
|
15
|
+
const worksheet = workbook.getWorksheet(1);
|
|
16
|
+
if (worksheet) {
|
|
17
|
+
const cover = createCoverPdf("AZIENDA SMEUP BSA SRL", "P.IVA/CD.FISCALE: 03474030289 - VIA ALBANO ZANELLA, 23 - 25030 ERBUSCO BS", "Esportazione dati");
|
|
18
|
+
const pdfDoc = await dataTableToPdfDoc(worksheet, webupManagerData);
|
|
19
|
+
const pdfBuffer = pdfDoc.output("arraybuffer");
|
|
20
|
+
return convertToBuffer(await appendPdfDocs([cover, pdfBuffer]));
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
throw new Error("Worksheet not found in the workbook");
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Unisce più PDF (in formato ArrayBuffer/Uint8Array/Buffer) in un unico PDF.
|
|
28
|
+
* @param pdfBuffers Array di buffer PDF (es. ottenuti da jsPDF.output("arraybuffer"))
|
|
29
|
+
* @returns Buffer del PDF unito
|
|
30
|
+
*/
|
|
31
|
+
const appendPdfDocs = async (pdfBuffers) => {
|
|
32
|
+
if (!pdfBuffers.length)
|
|
33
|
+
throw new Error("No PDF buffers to append");
|
|
34
|
+
// Crea un nuovo documento PDF vuoto
|
|
35
|
+
const mergedPdf = await PDFDocument.create();
|
|
36
|
+
for (const pdfBytes of pdfBuffers) {
|
|
37
|
+
const srcPdf = await PDFDocument.load(pdfBytes);
|
|
38
|
+
const copiedPages = await mergedPdf.copyPages(srcPdf, srcPdf.getPageIndices());
|
|
39
|
+
copiedPages.forEach(page => mergedPdf.addPage(page));
|
|
40
|
+
}
|
|
41
|
+
const mergedBytes = await mergedPdf.save();
|
|
42
|
+
return mergedBytes;
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=pdf-converter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-converter.js","sourceRoot":"","sources":["../../src/converters/pdf-converter.ts"],"names":[],"mappings":"AAAA,sDAAsD;AAKtD,OAAO,EAGL,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAClC,GAAa,EACb,gBAAkC,EACjB,EAAE;IACnB,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;IACtC,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;AAChD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EACrC,SAGC,EACD,gBAAkC,EACJ,EAAE;IAChC,MAAM,QAAQ,GAAG,wBAAwB,CACvC,SAAS,EACT,sBAAsB,CAAC,IAAI,EAC3B,gBAAgB,CACjB,CAAC;IAEF,MAAM,SAAS,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC3C,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,KAAK,GAAG,cAAc,CAC1B,uBAAuB,EACvB,2EAA2E,EAC3E,mBAAmB,CACpB,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;QACpE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC/C,OAAO,eAAe,CAAC,MAAM,aAAa,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;AACH,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,aAAa,GAAG,KAAK,EACzB,UAAiD,EAC5B,EAAE;IACvB,IAAI,CAAC,UAAU,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAEpE,oCAAoC;IACpC,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,CAAC;IAE7C,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,SAAS,CAC3C,MAAM,EACN,MAAM,CAAC,cAAc,EAAE,CACxB,CAAC;QACF,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;IAC3C,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n\nimport { create } from \"domain\";\nimport { SmeupDataTable } from \"../types/data-structures/smeupDataTable.js\";\nimport { SmeupSch } from \"../types/data-structures/smeupSch.js\";\nimport {\n WebupManagerData,\n GenericObject,\n SupportedExportFormats,\n} from \"../types/index.js\";\nimport { convertToBuffer } from \"../utils/commons-utility.js\";\nimport { dataTableToExcelWorkbook } from \"./excel/matrix-converter.js\";\nimport { dataTableToPdfDoc } from \"./pdf/matrix-converter.js\";\nimport { schedaToPdfDoc } from \"./pdf/sch-converter.js\";\nimport { PDFDocument } from \"pdf-lib\";\nimport { createCoverPdf } from \"./pdf/cover-renderer.js\";\n\nexport const schedaToPdfData = async (\n sch: SmeupSch,\n webupManagerData: WebupManagerData,\n): Promise<Buffer> => {\n const doc = await schedaToPdfDoc(sch);\n return Buffer.from(doc.output(\"arraybuffer\"));\n};\n\nexport const dataTableToPdfData = async (\n component: {\n smeupDataTable: SmeupDataTable;\n props: GenericObject;\n },\n webupManagerData: WebupManagerData,\n): Promise<Buffer | Uint8Array> => {\n const workbook = dataTableToExcelWorkbook(\n component,\n SupportedExportFormats.XLSX,\n webupManagerData,\n );\n\n const worksheet = workbook.getWorksheet(1);\n if (worksheet) {\n const cover = createCoverPdf(\n \"AZIENDA SMEUP BSA SRL\",\n \"P.IVA/CD.FISCALE: 03474030289 - VIA ALBANO ZANELLA, 23 - 25030 ERBUSCO BS\",\n \"Esportazione dati\",\n );\n const pdfDoc = await dataTableToPdfDoc(worksheet, webupManagerData);\n const pdfBuffer = pdfDoc.output(\"arraybuffer\");\n return convertToBuffer(await appendPdfDocs([cover, pdfBuffer]));\n } else {\n throw new Error(\"Worksheet not found in the workbook\");\n }\n};\n\n/**\n * Unisce più PDF (in formato ArrayBuffer/Uint8Array/Buffer) in un unico PDF.\n * @param pdfBuffers Array di buffer PDF (es. ottenuti da jsPDF.output(\"arraybuffer\"))\n * @returns Buffer del PDF unito\n */\nconst appendPdfDocs = async (\n pdfBuffers: (Uint8Array | ArrayBuffer | Buffer)[],\n): Promise<Uint8Array> => {\n if (!pdfBuffers.length) throw new Error(\"No PDF buffers to append\");\n\n // Crea un nuovo documento PDF vuoto\n const mergedPdf = await PDFDocument.create();\n\n for (const pdfBytes of pdfBuffers) {\n const srcPdf = await PDFDocument.load(pdfBytes);\n const copiedPages = await mergedPdf.copyPages(\n srcPdf,\n srcPdf.getPageIndices(),\n );\n copiedPages.forEach(page => mergedPdf.addPage(page));\n }\n\n const mergedBytes = await mergedPdf.save();\n return mergedBytes;\n};\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { dataTableToExcelData, dataTreeToExcelData, } from "./
|
|
2
|
-
export { schedaToPdfData } from "./
|
|
3
|
-
export { dataTableToChart } from "./images/charts-generator.js";
|
|
1
|
+
export { dataTableToExcelData, dataTreeToExcelData, } from "./converters/excel-converter.js";
|
|
2
|
+
export { schedaToPdfData, dataTableToPdfData, } from "./converters/pdf-converter.js";
|
|
3
|
+
export { dataTableToChart } from "./converters/images/charts-generator.js";
|
|
4
4
|
export type { WebupManagerData, GenericObject } from "./types/index.js";
|
|
5
5
|
export { SupportedExportFormats } from "./types/index.js";
|
|
6
6
|
export type { SmeupDataTable } from "./types/data-structures/smeupDataTable.js";
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Public API exports
|
|
2
|
-
export { dataTableToExcelData, dataTreeToExcelData, } from "./
|
|
3
|
-
export { schedaToPdfData } from "./
|
|
4
|
-
export { dataTableToChart } from "./images/charts-generator.js";
|
|
2
|
+
export { dataTableToExcelData, dataTreeToExcelData, } from "./converters/excel-converter.js";
|
|
3
|
+
export { schedaToPdfData, dataTableToPdfData, } from "./converters/pdf-converter.js";
|
|
4
|
+
export { dataTableToChart } from "./converters/images/charts-generator.js";
|
|
5
5
|
export { SupportedExportFormats } from "./types/index.js";
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,OAAO,EACL,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,OAAO,EACL,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,eAAe,EACf,kBAAkB,GACnB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAG3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["// Public API exports\nexport {\n dataTableToExcelData,\n dataTreeToExcelData,\n} from \"./converters/excel-converter.js\";\n\nexport {\n schedaToPdfData,\n dataTableToPdfData,\n} from \"./converters/pdf-converter.js\";\n\nexport { dataTableToChart } from \"./converters/images/charts-generator.js\";\n// Export types that users might need\nexport type { WebupManagerData, GenericObject } from \"./types/index.js\";\nexport { SupportedExportFormats } from \"./types/index.js\";\nexport type { SmeupDataTable } from \"./types/data-structures/smeupDataTable.js\";\nexport type { SmeupDataTree } from \"./types/data-structures/smeupDataTree.js\";\n\nexport type ColumnGroup = {\n column: string;\n visible: boolean;\n};\n"]}
|
package/dist/types/index.d.ts
CHANGED
package/dist/types/index.js
CHANGED
|
@@ -11,5 +11,6 @@ export var SupportedExportFormats;
|
|
|
11
11
|
SupportedExportFormats["CSV"] = "csv";
|
|
12
12
|
SupportedExportFormats["TXT"] = "txt";
|
|
13
13
|
SupportedExportFormats["PDF_SCHEDA"] = "pdf_scheda";
|
|
14
|
+
SupportedExportFormats["PDF"] = "pdf";
|
|
14
15
|
})(SupportedExportFormats || (SupportedExportFormats = {}));
|
|
15
16
|
//# sourceMappingURL=index.js.map
|
package/dist/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAUA,MAAM,CAAN,IAAY,YAKX;AALD,WAAY,YAAY;IACtB,uCAAuB,CAAA;IACvB,qDAAqC,CAAA;IACrC,qCAAqB,CAAA;IACrB,kDAAkC,CAAA;AACpC,CAAC,EALW,YAAY,KAAZ,YAAY,QAKvB;AAwBD,MAAM,CAAN,IAAY,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAUA,MAAM,CAAN,IAAY,YAKX;AALD,WAAY,YAAY;IACtB,uCAAuB,CAAA;IACvB,qDAAqC,CAAA;IACrC,qCAAqB,CAAA;IACrB,kDAAkC,CAAA;AACpC,CAAC,EALW,YAAY,KAAZ,YAAY,QAKvB;AAwBD,MAAM,CAAN,IAAY,sBAMX;AAND,WAAY,sBAAsB;IAChC,uCAAa,CAAA;IACb,qCAAW,CAAA;IACX,qCAAW,CAAA;IACX,mDAAyB,CAAA;IACzB,qCAAW,CAAA;AACb,CAAC,EANW,sBAAsB,KAAtB,sBAAsB,QAMjC","sourcesContent":["import type { Properties as CSSProperties } from \"csstype\";\nimport { ComponentOptions } from \"./component.js\";\nimport { SmeupDataCell } from \"./data-structures/smeupDataTable.js\";\n\nexport interface SmeupDataObj {\n t: string;\n p: string;\n k: string;\n}\n\nexport enum DatesFormats {\n ISO_DATE = \"YYYY-MM-DD\",\n ISO_DATE_TIME = \"YYYY-MM-DD HH:mm:ss\",\n ISO_TIME = \"HH:mm:ss\",\n ISO_TIME_WITHOUT_SECONDS = \"HH:mm\",\n}\n\nexport interface GenericObject {\n [index: string]: unknown;\n}\n\nexport interface WebupManagerData {\n mathLocale: string;\n datesLocale: string;\n themeBackground: string;\n}\n\n/**\n * Applies dataTable filters to the excel table rows\n */\nexport type ColumnFilter = {\n checkBoxes?: { value: string }[];\n // add other properties if needed\n};\n\nexport interface SmeupDataCellStyled extends SmeupDataCell {\n style?: CSSProperties;\n}\n\nexport enum SupportedExportFormats {\n XLSX = \"xlsx\",\n CSV = \"csv\",\n TXT = \"txt\",\n PDF_SCHEDA = \"pdf_scheda\",\n PDF = \"pdf\",\n}\n\nexport interface ChartOptions extends ComponentOptions {\n Width: string;\n Height: string;\n}\n"]}
|
|
@@ -25,10 +25,35 @@ export declare const filterRows: (smeupDataTable: SmeupDataTable, filteredColumn
|
|
|
25
25
|
* @returns
|
|
26
26
|
*/
|
|
27
27
|
export declare const calculateCellValue: (cell: SmeupDataCell, bookType: SupportedExportFormats, webupManagerData: WebupManagerData) => string | number | Date;
|
|
28
|
+
/**
|
|
29
|
+
* Calculates and formats a value based on its type and export format.
|
|
30
|
+
*
|
|
31
|
+
* - If the value is a date and the object indicates a date type, it returns a formatted date string or a Date object,
|
|
32
|
+
* depending on the export format.
|
|
33
|
+
* - If the value is a number and the object indicates a number type, it returns a formatted number string or a numeric value,
|
|
34
|
+
* depending on the export format.
|
|
35
|
+
* - Otherwise, it returns the original value or an empty string if the value is null or undefined.
|
|
36
|
+
*
|
|
37
|
+
* @param bookType - The export format type.
|
|
38
|
+
* @param webupManagerData - Data containing locale and formatting information.
|
|
39
|
+
* @param value - The value to be calculated and formatted.
|
|
40
|
+
* @param obj - Optional object describing the type of the value.
|
|
41
|
+
* @returns The formatted value, a Date object, a number, or the original value as a string.
|
|
42
|
+
*/
|
|
43
|
+
export declare const calculateValue: (value: string, obj: {
|
|
44
|
+
t: string;
|
|
45
|
+
p: string;
|
|
46
|
+
k: string;
|
|
47
|
+
}, bookType: SupportedExportFormats, webupManagerData: WebupManagerData) => string | number | Date;
|
|
28
48
|
/**
|
|
29
49
|
* Conversion from Hexadecimal color to an AlphaRGB
|
|
30
50
|
* @param hex string - Hexadecimal value, it can bot have and don't have the # prefix
|
|
31
51
|
* @returns ARGB string code
|
|
32
52
|
*/
|
|
33
53
|
export declare const hexToArgb: (hex: string) => string;
|
|
34
|
-
export declare const convertToBuffer: (arrayBuffer: ArrayBuffer) => Buffer | Uint8Array;
|
|
54
|
+
export declare const convertToBuffer: (arrayBuffer: ArrayBuffer | Uint8Array) => Buffer | Uint8Array;
|
|
55
|
+
export declare const loadImageAsBase64: (imageUrl: string) => Promise<string | null>;
|
|
56
|
+
/**
|
|
57
|
+
* Converts a hexadecimal color string (e.g., "#RRGGBB" or "0xRRGGBB") to an RGB tuple.
|
|
58
|
+
*/
|
|
59
|
+
export declare const convertColorToRgb: (color: string) => [number, number, number];
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { exportTypeSupportsFormatting } from "../excel/excel-
|
|
1
|
+
import { exportTypeSupportsFormatting } from "../converters/excel/excel-converter.types.js";
|
|
2
2
|
import { datesIsIsoDate, datesToDate, datesFormat } from "./dates-utility.js";
|
|
3
3
|
import { mathNumberStringToFormattedString, mathCountDecimals, } from "./math-utility.js";
|
|
4
4
|
import { objectsIsVoCodVer, objectsIsDate, objectsIsNumber, } from "./objects-utility.js";
|
|
@@ -81,19 +81,39 @@ export const filterRows = (smeupDataTable, filteredColumns, filters) => {
|
|
|
81
81
|
* @returns
|
|
82
82
|
*/
|
|
83
83
|
export const calculateCellValue = (cell, bookType, webupManagerData) => {
|
|
84
|
-
|
|
84
|
+
return calculateValue(cell.value, cell.obj ?? { t: "", p: "", k: "" }, bookType, webupManagerData);
|
|
85
|
+
};
|
|
86
|
+
/**
|
|
87
|
+
* Calculates and formats a value based on its type and export format.
|
|
88
|
+
*
|
|
89
|
+
* - If the value is a date and the object indicates a date type, it returns a formatted date string or a Date object,
|
|
90
|
+
* depending on the export format.
|
|
91
|
+
* - If the value is a number and the object indicates a number type, it returns a formatted number string or a numeric value,
|
|
92
|
+
* depending on the export format.
|
|
93
|
+
* - Otherwise, it returns the original value or an empty string if the value is null or undefined.
|
|
94
|
+
*
|
|
95
|
+
* @param bookType - The export format type.
|
|
96
|
+
* @param webupManagerData - Data containing locale and formatting information.
|
|
97
|
+
* @param value - The value to be calculated and formatted.
|
|
98
|
+
* @param obj - Optional object describing the type of the value.
|
|
99
|
+
* @returns The formatted value, a Date object, a number, or the original value as a string.
|
|
100
|
+
*/
|
|
101
|
+
export const calculateValue = (value, obj, bookType, webupManagerData) => {
|
|
102
|
+
if (obj && objectsIsDate(obj) && datesIsIsoDate(value)) {
|
|
85
103
|
return exportTypeSupportsFormatting[bookType]
|
|
86
|
-
? new Date(datesToDate(
|
|
87
|
-
: datesFormat(
|
|
104
|
+
? new Date(datesToDate(value, webupManagerData.datesLocale))
|
|
105
|
+
: datesFormat(value, webupManagerData.datesLocale);
|
|
88
106
|
}
|
|
89
|
-
if (
|
|
107
|
+
if (obj && objectsIsNumber(obj)) {
|
|
90
108
|
if (!exportTypeSupportsFormatting[bookType]) {
|
|
91
|
-
return (mathNumberStringToFormattedString(
|
|
109
|
+
return (mathNumberStringToFormattedString(value, mathCountDecimals(Number(value) || 0), "", webupManagerData.mathLocale) || "");
|
|
92
110
|
}
|
|
93
|
-
const numValue = Number(
|
|
94
|
-
return !isNaN(numValue)
|
|
111
|
+
const numValue = Number(value);
|
|
112
|
+
return !isNaN(numValue) && !(Math.abs(numValue) === Infinity)
|
|
113
|
+
? numValue
|
|
114
|
+
: "";
|
|
95
115
|
}
|
|
96
|
-
return
|
|
116
|
+
return value ?? "";
|
|
97
117
|
};
|
|
98
118
|
/**
|
|
99
119
|
* Conversion from Hexadecimal color to an AlphaRGB
|
|
@@ -125,6 +145,9 @@ const isBufferAvailable = () => {
|
|
|
125
145
|
};
|
|
126
146
|
// Utility function to convert ArrayBuffer to Buffer or Uint8Array
|
|
127
147
|
export const convertToBuffer = (arrayBuffer) => {
|
|
148
|
+
if (arrayBuffer instanceof Uint8Array) {
|
|
149
|
+
return arrayBuffer;
|
|
150
|
+
}
|
|
128
151
|
if (isBufferAvailable()) {
|
|
129
152
|
return Buffer.from(arrayBuffer);
|
|
130
153
|
}
|
|
@@ -132,4 +155,34 @@ export const convertToBuffer = (arrayBuffer) => {
|
|
|
132
155
|
return new Uint8Array(arrayBuffer);
|
|
133
156
|
}
|
|
134
157
|
};
|
|
135
|
-
|
|
158
|
+
// Function to load an image as base64 (browser version, async)
|
|
159
|
+
export const loadImageAsBase64 = async (imageUrl) => {
|
|
160
|
+
try {
|
|
161
|
+
const response = await fetch(imageUrl);
|
|
162
|
+
if (!response.ok)
|
|
163
|
+
return null;
|
|
164
|
+
const blob = await response.blob();
|
|
165
|
+
return await new Promise((resolve, reject) => {
|
|
166
|
+
const reader = new FileReader();
|
|
167
|
+
reader.onloadend = () => {
|
|
168
|
+
resolve(reader.result);
|
|
169
|
+
};
|
|
170
|
+
reader.onerror = () => reject(null);
|
|
171
|
+
reader.readAsDataURL(blob);
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
console.warn("Unable to load asset image:", error);
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
/**
|
|
180
|
+
* Converts a hexadecimal color string (e.g., "#RRGGBB" or "0xRRGGBB") to an RGB tuple.
|
|
181
|
+
*/
|
|
182
|
+
export const convertColorToRgb = (color) => {
|
|
183
|
+
const r = parseInt(color.substring(2, 4), 16);
|
|
184
|
+
const g = parseInt(color.substring(4, 6), 16);
|
|
185
|
+
const b = parseInt(color.substring(6, 8), 16);
|
|
186
|
+
return [r, g, b];
|
|
187
|
+
};
|
|
188
|
+
//# sourceMappingURL=commons-utility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commons-utility.js","sourceRoot":"","sources":["../../src/utils/commons-utility.ts"],"names":[],"mappings":"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","sourcesContent":["import { exportTypeSupportsFormatting } from \"../converters/excel/excel-converter.types.js\";\nimport {\n SmeupDataColumn,\n SmeupDataTable,\n SmeupDataCell,\n} from \"../types/data-structures/smeupDataTable.js\";\nimport {\n SmeupDataObj,\n ColumnFilter,\n WebupManagerData,\n SupportedExportFormats,\n GenericObject,\n} from \"../types/index.js\";\nimport { datesIsIsoDate, datesToDate, datesFormat } from \"./dates-utility.js\";\nimport {\n mathNumberStringToFormattedString,\n mathCountDecimals,\n} from \"./math-utility.js\";\nimport {\n objectsIsVoCodVer,\n objectsIsDate,\n objectsIsNumber,\n} from \"./objects-utility.js\";\n\nexport const getFilteredColumns = (\n columns: SmeupDataColumn[],\n props: GenericObject,\n groupsArray: { column: string; visible: boolean }[] = [],\n) => {\n if (!columns) return [];\n\n const mutableColumns = JSON.parse(\n JSON.stringify(columns),\n ) as SmeupDataColumn[];\n\n const filteredColumns: SmeupDataColumn[] = [];\n\n if (props.visibleColumns && (props.visibleColumns as string[]).length > 0) {\n (props.visibleColumns as string[]).forEach((col: string) => {\n const foundColumn = mutableColumns.find(c => c.name === col);\n if (foundColumn) {\n filteredColumns.push({ ...foundColumn });\n }\n });\n } else {\n filteredColumns.push(...mutableColumns);\n }\n\n // Set the visibility of columns based on groups and props\n filteredColumns.forEach((col: SmeupDataColumn) => {\n const isGroupedColumn = groupsArray.filter(g => g.column === col.name);\n col.visible = props.visibleColumns\n ? (props.visibleColumns as string[]).includes(col.name)\n : col.visible;\n col.visible =\n isGroupedColumn.length > 0 ? isGroupedColumn[0].visible : col.visible;\n });\n\n return filteredColumns.filter(column => {\n const dataObject = {\n ...column.obj,\n k: \"\",\n } as SmeupDataObj;\n return column.obj?.t !== \"J4\" && !objectsIsVoCodVer(dataObject);\n });\n};\n\n/**\n * By passing the map, length value and column name\n * creates or updates a map record with\n * @param map Contains columnNames and their longest cell's length\n * @param text The text to use in length calculation\n * @param colName The column to check\n */\nexport const updateMaxValueLength = (\n map: { [key: string]: number },\n text: string | undefined | null,\n colName: string,\n) => {\n if (!map || !text || !colName) return;\n\n const value = Math.max(...text.split(\"\\n\").map(line => line.length));\n if (map[colName]) {\n if (map[colName] < value) {\n map[colName] = value;\n }\n } else {\n map[colName] = value;\n }\n};\n\nexport const filterRows = (\n smeupDataTable: SmeupDataTable,\n filteredColumns: SmeupDataColumn[],\n filters: { [key: string]: ColumnFilter },\n) => {\n if (filters) {\n return smeupDataTable.rows.filter(row => {\n return filteredColumns.every(col => {\n const cellValue = row.cells?.[col.name]?.value;\n const columnFilter = filters[col.name];\n if (columnFilter?.checkBoxes?.length) {\n const allowedValues = columnFilter.checkBoxes.map(item => item.value);\n return (\n typeof cellValue === \"string\" && allowedValues.includes(cellValue)\n );\n }\n return true;\n });\n });\n } else {\n return smeupDataTable.rows;\n }\n};\n\n/**\n * Returns a converted and formatted cell value (string, date, number)\n * @param cell - SmeupDataCell\n * @param bookType - SupportedExportFormats\n * @param webupManagerData - WebupManagerData\n * @returns\n */\nexport const calculateCellValue = (\n cell: SmeupDataCell,\n bookType: SupportedExportFormats,\n webupManagerData: WebupManagerData,\n) => {\n return calculateValue(\n cell.value,\n cell.obj ?? ({ t: \"\", p: \"\", k: \"\" } as SmeupDataObj),\n bookType,\n webupManagerData,\n );\n};\n\n/**\n * Calculates and formats a value based on its type and export format.\n *\n * - If the value is a date and the object indicates a date type, it returns a formatted date string or a Date object,\n * depending on the export format.\n * - If the value is a number and the object indicates a number type, it returns a formatted number string or a numeric value,\n * depending on the export format.\n * - Otherwise, it returns the original value or an empty string if the value is null or undefined.\n *\n * @param bookType - The export format type.\n * @param webupManagerData - Data containing locale and formatting information.\n * @param value - The value to be calculated and formatted.\n * @param obj - Optional object describing the type of the value.\n * @returns The formatted value, a Date object, a number, or the original value as a string.\n */\nexport const calculateValue = (\n value: string,\n obj: {\n t: string;\n p: string;\n k: string;\n },\n bookType: SupportedExportFormats,\n webupManagerData: WebupManagerData,\n) => {\n if (obj && objectsIsDate(obj) && datesIsIsoDate(value)) {\n return exportTypeSupportsFormatting[bookType]\n ? new Date(datesToDate(value, webupManagerData.datesLocale))\n : datesFormat(value, webupManagerData.datesLocale);\n }\n\n if (obj && objectsIsNumber(obj)) {\n if (!exportTypeSupportsFormatting[bookType]) {\n return (\n mathNumberStringToFormattedString(\n value,\n mathCountDecimals(Number(value) || 0),\n \"\",\n webupManagerData.mathLocale,\n ) || \"\"\n );\n }\n\n const numValue = Number(value);\n return !isNaN(numValue) && !(Math.abs(numValue) === Infinity)\n ? numValue\n : \"\";\n }\n\n return value ?? \"\";\n};\n\n/**\n * Conversion from Hexadecimal color to an AlphaRGB\n * @param hex string - Hexadecimal value, it can bot have and don't have the # prefix\n * @returns ARGB string code\n */\nexport const hexToArgb = (hex: string): string => {\n // Hex validation\n if (hex.startsWith(\"#\")) hex = hex.slice(1);\n if (hex.length !== 6) return \"\";\n\n // Value Parse and return\n const red = parseInt(hex.slice(0, 2), 16);\n const green = parseInt(hex.slice(2, 4), 16);\n const blue = parseInt(hex.slice(4, 6), 16);\n return `FF${red.toString(16).padStart(2, \"0\")}${green\n .toString(16)\n .padStart(2, \"0\")}${blue.toString(16).padStart(2, \"0\")}`;\n};\n\n// Utility function to detect if Buffer is available\nconst isBufferAvailable = (): boolean => {\n try {\n return typeof Buffer !== \"undefined\" && typeof Buffer.from === \"function\";\n } catch {\n return false;\n }\n};\n\n// Utility function to convert ArrayBuffer to Buffer or Uint8Array\nexport const convertToBuffer = (\n arrayBuffer: ArrayBuffer | Uint8Array,\n): Buffer | Uint8Array => {\n if (arrayBuffer instanceof Uint8Array) {\n return arrayBuffer;\n }\n if (isBufferAvailable()) {\n return Buffer.from(arrayBuffer);\n } else {\n return new Uint8Array(arrayBuffer);\n }\n};\n\n// Function to load an image as base64 (browser version, async)\nexport const loadImageAsBase64 = async (\n imageUrl: string,\n): Promise<string | null> => {\n try {\n const response = await fetch(imageUrl);\n if (!response.ok) return null;\n const blob = await response.blob();\n return await new Promise<string | null>((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n resolve(reader.result as string);\n };\n reader.onerror = () => reject(null);\n reader.readAsDataURL(blob);\n });\n } catch (error) {\n console.warn(\"Unable to load asset image:\", error);\n return null;\n }\n};\n\n/**\n * Converts a hexadecimal color string (e.g., \"#RRGGBB\" or \"0xRRGGBB\") to an RGB tuple.\n */\nexport const convertColorToRgb = (color: string): [number, number, number] => {\n const r = parseInt(color.substring(2, 4), 16);\n const g = parseInt(color.substring(4, 6), 16);\n const b = parseInt(color.substring(6, 8), 16);\n return [r, g, b];\n};\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export const isColumnHidden = (column) => {
|
|
2
|
-
return (
|
|
3
|
-
|
|
2
|
+
return (Object.prototype.hasOwnProperty.call(column, "visible") &&
|
|
3
|
+
column.visible === false);
|
|
4
4
|
};
|
|
5
5
|
//# sourceMappingURL=datastructure-utility.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"datastructure-utility.js","sourceRoot":"","sources":["../../src/utils/datastructure-utility.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAuB,EAAW,EAAE;IACjE,OAAO,CACL,
|
|
1
|
+
{"version":3,"file":"datastructure-utility.js","sourceRoot":"","sources":["../../src/utils/datastructure-utility.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAuB,EAAW,EAAE;IACjE,OAAO,CACL,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;QACvD,MAAM,CAAC,OAAO,KAAK,KAAK,CACzB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { SmeupDataColumn } from \"../types/data-structures/smeupDataTable.js\";\n\nexport const isColumnHidden = (column: SmeupDataColumn): boolean => {\n return (\n Object.prototype.hasOwnProperty.call(column, \"visible\") &&\n column.visible === false\n );\n};\n"]}
|