@sme.up/doc-alchemist 1.0.0-SNAPSHOT-20250613100107
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 +129 -0
- package/dist/assets/sample-data.d.ts +21 -0
- package/dist/assets/sample-data.js +235 -0
- package/dist/assets/sample-data.js.map +1 -0
- package/dist/debug.d.ts +1 -0
- package/dist/debug.js +20 -0
- package/dist/debug.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/src/excel/excel-generator.d.ts +14 -0
- package/dist/src/excel/excel-generator.js +415 -0
- package/dist/src/excel/excel-generator.js.map +1 -0
- package/dist/src/excel/excel-generator.types.d.ts +21 -0
- package/dist/src/excel/excel-generator.types.js +26 -0
- package/dist/src/excel/excel-generator.types.js.map +1 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/pdf/pdf-generator.d.ts +6 -0
- package/dist/src/pdf/pdf-generator.js +5 -0
- package/dist/src/pdf/pdf-generator.js.map +1 -0
- package/dist/src/types/index.d.ts +38 -0
- package/dist/src/types/index.js +15 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/utils/datastructure-utility.d.ts +2 -0
- package/dist/src/utils/datastructure-utility.js +5 -0
- package/dist/src/utils/datastructure-utility.js.map +1 -0
- package/dist/src/utils/dates-utility.d.ts +10 -0
- package/dist/src/utils/dates-utility.js +55 -0
- package/dist/src/utils/dates-utility.js.map +1 -0
- package/dist/src/utils/generator-utility.d.ts +31 -0
- package/dist/src/utils/generator-utility.js +113 -0
- package/dist/src/utils/generator-utility.js.map +1 -0
- package/dist/src/utils/math-utility.d.ts +10 -0
- package/dist/src/utils/math-utility.js +161 -0
- package/dist/src/utils/math-utility.js.map +1 -0
- package/dist/src/utils/objects-utility.d.ts +4 -0
- package/dist/src/utils/objects-utility.js +16 -0
- package/dist/src/utils/objects-utility.js.map +1 -0
- package/dist/src/utils/regex-utility.d.ts +1 -0
- package/dist/src/utils/regex-utility.js +4 -0
- package/dist/src/utils/regex-utility.js.map +1 -0
- package/dist/tests/excel-generator.test.d.ts +17 -0
- package/dist/tests/excel-generator.test.js +287 -0
- package/dist/tests/excel-generator.test.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
import ExcelJS from "exceljs";
|
|
2
|
+
const { ValueType } = ExcelJS;
|
|
3
|
+
import { SupportedExportFormats, } from "../types/index.js";
|
|
4
|
+
import { getFilteredColumns, filterRows, updateMaxValueLength, calculateCellValue, hexToArgb, convertToBuffer, } from "../utils/generator-utility.js";
|
|
5
|
+
import { objectsIsDate } from "../utils/objects-utility.js";
|
|
6
|
+
import { exportTypeSupportsFormatting, headerStyleFill, allowedTotals, footerStyleFill, } from "./excel-generator.types.js";
|
|
7
|
+
import { isColumnHidden } from "../utils/datastructure-utility.js";
|
|
8
|
+
export const dataTableToExcelData = async (component, fileFormat, webupManagerData) => {
|
|
9
|
+
const workbook = dataTableToExcelWorkbook(component, fileFormat, webupManagerData);
|
|
10
|
+
// Convert workbook to buffer based on file format
|
|
11
|
+
switch (fileFormat) {
|
|
12
|
+
case SupportedExportFormats.XLSX: {
|
|
13
|
+
const xlsxBuffer = await workbook.xlsx.writeBuffer();
|
|
14
|
+
return convertToBuffer(xlsxBuffer);
|
|
15
|
+
}
|
|
16
|
+
case SupportedExportFormats.TXT:
|
|
17
|
+
case SupportedExportFormats.CSV: {
|
|
18
|
+
const csvBuffer = await workbook.csv.writeBuffer({
|
|
19
|
+
formatterOptions: { delimiter: ";" },
|
|
20
|
+
});
|
|
21
|
+
return convertToBuffer(csvBuffer);
|
|
22
|
+
}
|
|
23
|
+
default:
|
|
24
|
+
throw new Error(`Unsupported export format: ${fileFormat}`);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
export const dataTableToExcelWorkbook = (component, fileFormat, webupManagerData) => {
|
|
28
|
+
// Create a new ExcelJS.Workbook and return it as a resolved Promise
|
|
29
|
+
const { smeupDataTable: smeupDataTable, props } = component;
|
|
30
|
+
const workbook = new ExcelJS.Workbook();
|
|
31
|
+
const worksheet = initializeWorksheet(workbook);
|
|
32
|
+
const filteredColumns = getFilteredColumns(smeupDataTable.columns);
|
|
33
|
+
const maxColumnValueLenght = {};
|
|
34
|
+
let rowNumber = 1; // Start row number
|
|
35
|
+
// Headers setup
|
|
36
|
+
setDataTableHeaderRow(worksheet, filteredColumns, maxColumnValueLenght);
|
|
37
|
+
// Get active groups (where visible is true)
|
|
38
|
+
const groupsArray = Array.isArray(props?.groups) ? props.groups : [];
|
|
39
|
+
const activeGroups = groupsArray
|
|
40
|
+
.filter((group) => group.visible)
|
|
41
|
+
.map((group) => group.column);
|
|
42
|
+
// Filter and sort rows (if filters are available)
|
|
43
|
+
const rows = filterRows(smeupDataTable, filteredColumns, props?.filters);
|
|
44
|
+
if (activeGroups?.length > 0) {
|
|
45
|
+
// Sort rows based on the first active group column
|
|
46
|
+
rows.sort((a, b) => {
|
|
47
|
+
for (const group of activeGroups) {
|
|
48
|
+
const valA = a.cells && a.cells[group]?.value !== undefined
|
|
49
|
+
? a.cells[group]?.value
|
|
50
|
+
: "";
|
|
51
|
+
const valB = b.cells && b.cells[group]?.value !== undefined
|
|
52
|
+
? b.cells[group]?.value
|
|
53
|
+
: "";
|
|
54
|
+
if (valA !== valB)
|
|
55
|
+
return valA.localeCompare(valB);
|
|
56
|
+
}
|
|
57
|
+
return 0;
|
|
58
|
+
});
|
|
59
|
+
// Recursive grouping
|
|
60
|
+
rowNumber = insertDataTableGroupedRows(worksheet, rows, activeGroups, filteredColumns, smeupDataTable.columns, rowNumber, fileFormat, webupManagerData, 1, maxColumnValueLenght, (props?.totals ?? {}));
|
|
61
|
+
//INTERACTIVE GROUPS MANAGING
|
|
62
|
+
//TODO: Add groups subtotals
|
|
63
|
+
if (worksheet.getColumn(1).hidden)
|
|
64
|
+
ensureGroupRowHasDescription(worksheet);
|
|
65
|
+
applyDataTableOutlineLevels(worksheet);
|
|
66
|
+
worksheet.properties.outlineProperties = {
|
|
67
|
+
summaryBelow: false,
|
|
68
|
+
summaryRight: false,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
// Process rows normally if no grouping
|
|
73
|
+
rowNumber = insertDataTableRows(worksheet, rows, filteredColumns, rowNumber, fileFormat, webupManagerData, maxColumnValueLenght);
|
|
74
|
+
}
|
|
75
|
+
if (exportTypeSupportsFormatting[fileFormat] && props?.totals) {
|
|
76
|
+
addFooterTotalsRow(worksheet, filteredColumns, props, webupManagerData);
|
|
77
|
+
}
|
|
78
|
+
// Apply column width
|
|
79
|
+
worksheet.columns.forEach(col => {
|
|
80
|
+
const columnKey = col.key;
|
|
81
|
+
if (columnKey) {
|
|
82
|
+
col.width = (maxColumnValueLenght[columnKey] ?? 10) * 1.1;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
col.width = 10 * 1.1; // Default width
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
// Apply filter to column headers
|
|
89
|
+
// TODO: look if it breaks groupings
|
|
90
|
+
worksheet.autoFilter = {
|
|
91
|
+
from: { row: 1, column: 1 },
|
|
92
|
+
to: { row: rowNumber, column: filteredColumns.length },
|
|
93
|
+
};
|
|
94
|
+
// Forces full calculation when the workbook is opened
|
|
95
|
+
workbook.calcProperties = {
|
|
96
|
+
fullCalcOnLoad: true,
|
|
97
|
+
};
|
|
98
|
+
return workbook;
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* Adds creator, creation date to the workbook and creates a sheet
|
|
102
|
+
* @param workbook
|
|
103
|
+
* @returns void
|
|
104
|
+
*/
|
|
105
|
+
const initializeWorksheet = (workbook) => {
|
|
106
|
+
workbook.creator = "/doc-alchemist - dataTable excel generator";
|
|
107
|
+
workbook.created = new Date();
|
|
108
|
+
return workbook.addWorksheet("Export");
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* Creates the first row of the table by looking at dataTable columns.
|
|
112
|
+
* Also updates column width calculations
|
|
113
|
+
* @param worksheet
|
|
114
|
+
* @param filteredColumns
|
|
115
|
+
* @param maxValueLengthMap
|
|
116
|
+
*/
|
|
117
|
+
const setDataTableHeaderRow = (worksheet, filteredColumns, maxValueLengthMap) => {
|
|
118
|
+
worksheet.columns = filteredColumns.map(col => {
|
|
119
|
+
updateMaxValueLength(maxValueLengthMap, col.title, col.name);
|
|
120
|
+
return {
|
|
121
|
+
header: col.title,
|
|
122
|
+
key: col.name,
|
|
123
|
+
width: maxValueLengthMap[col.name], // Set the width to the updated value
|
|
124
|
+
hidden: isColumnHidden(col),
|
|
125
|
+
};
|
|
126
|
+
});
|
|
127
|
+
setHeaderStyling(worksheet);
|
|
128
|
+
};
|
|
129
|
+
const setHeaderStyling = (worksheet, background = false) => {
|
|
130
|
+
const headerRow = worksheet.getRow(1);
|
|
131
|
+
headerRow.font = { bold: true };
|
|
132
|
+
headerRow.alignment = {
|
|
133
|
+
horizontal: "center",
|
|
134
|
+
vertical: "middle",
|
|
135
|
+
wrapText: true,
|
|
136
|
+
};
|
|
137
|
+
if (background) {
|
|
138
|
+
for (let col = 1; col <= worksheet.columns.length; col++) {
|
|
139
|
+
const cell = headerRow.getCell(col);
|
|
140
|
+
cell.fill = headerStyleFill;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
const insertDataTableGroupedRows = (worksheet, rows, groups, filteredColumns, unfilteredColumns, rowNumber, fileFormat, webupManagerData, currentOutlineLevel = 1, maxColumnValueLength, totals) => {
|
|
145
|
+
if (!groups.length) {
|
|
146
|
+
return insertDataTableRows(worksheet, rows, filteredColumns, rowNumber, fileFormat, webupManagerData, maxColumnValueLength);
|
|
147
|
+
}
|
|
148
|
+
const [currentGroup, ...remainingGroups] = groups;
|
|
149
|
+
const uniqueGroupValues = [
|
|
150
|
+
...new Set(rows
|
|
151
|
+
.map(row => row.cells && row.cells[currentGroup]?.value)
|
|
152
|
+
.filter(value => value !== undefined)),
|
|
153
|
+
].sort();
|
|
154
|
+
const columnTitles = Object.fromEntries(unfilteredColumns.map(col => [col.name, col.title]));
|
|
155
|
+
for (const groupValue of uniqueGroupValues) {
|
|
156
|
+
// Filter rows for the current group
|
|
157
|
+
const groupedRows = rows.filter(row => row.cells && row.cells[currentGroup]?.value === groupValue);
|
|
158
|
+
const indentation = " ".repeat((currentOutlineLevel - 1) * 8);
|
|
159
|
+
// Insert header row
|
|
160
|
+
const headerRow = worksheet.addRow([]);
|
|
161
|
+
headerRow.getCell(1).value =
|
|
162
|
+
`${indentation}▼${columnTitles[currentGroup]} - ${groupValue}`;
|
|
163
|
+
const headerRowNumber = ++rowNumber;
|
|
164
|
+
rowNumber = insertDataTableGroupedRows(worksheet, groupedRows, remainingGroups, filteredColumns, unfilteredColumns, rowNumber, fileFormat, webupManagerData, currentOutlineLevel + 1, maxColumnValueLength, totals);
|
|
165
|
+
const lastDataRow = rowNumber;
|
|
166
|
+
// Compute totals and format cells
|
|
167
|
+
for (const [colIndex, col] of filteredColumns.entries()) {
|
|
168
|
+
const cell = headerRow.getCell(colIndex + 1);
|
|
169
|
+
cell.numFmt = getExcelNumFormat(col.decimals ?? 0, col.integers ?? 0);
|
|
170
|
+
decorateHeaderRow(cell);
|
|
171
|
+
if (!totals)
|
|
172
|
+
continue;
|
|
173
|
+
const totalFormula = totals[col.name];
|
|
174
|
+
if (totalFormula && col.visible) {
|
|
175
|
+
cell.alignment = { horizontal: "right" };
|
|
176
|
+
cell.value = totalFormula.startsWith("MATH")
|
|
177
|
+
? {
|
|
178
|
+
formula: smeupFormulaToExcelFormula(totalFormula.replace("MATH", ""), headerRowNumber - 1, filteredColumns),
|
|
179
|
+
}
|
|
180
|
+
: {
|
|
181
|
+
formula: getSubGroupTotalFormula(totalFormula, colIndex + 1, headerRowNumber + 1, lastDataRow),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return rowNumber;
|
|
187
|
+
};
|
|
188
|
+
/**
|
|
189
|
+
* Inserts normal rows (without grouping).
|
|
190
|
+
*/
|
|
191
|
+
const insertDataTableRows = (worksheet, rows, filteredColumns, rowNumber, fileFormat, webupManagerData, maxColumnValueLenght) => {
|
|
192
|
+
for (const row of rows) {
|
|
193
|
+
const rowData = filteredColumns.map(column => {
|
|
194
|
+
const cell = (row?.cells ?? {})[column.name];
|
|
195
|
+
updateMaxValueLength(maxColumnValueLenght, cell?.value, column.name);
|
|
196
|
+
return column.formula
|
|
197
|
+
? {
|
|
198
|
+
formula: `${smeupFormulaToExcelFormula(column.formula, rowNumber, filteredColumns)}`,
|
|
199
|
+
type: ValueType.Formula,
|
|
200
|
+
}
|
|
201
|
+
: calculateCellValue(cell, fileFormat, webupManagerData);
|
|
202
|
+
});
|
|
203
|
+
const newRow = worksheet.addRow(rowData);
|
|
204
|
+
if (exportTypeSupportsFormatting[fileFormat]) {
|
|
205
|
+
addStyleToExceljsRow(newRow, filteredColumns, row);
|
|
206
|
+
}
|
|
207
|
+
rowNumber++;
|
|
208
|
+
}
|
|
209
|
+
return rowNumber;
|
|
210
|
+
};
|
|
211
|
+
export const smeupFormulaToExcelFormula = (formula, rowNumber, filteredColumns) => {
|
|
212
|
+
return formula
|
|
213
|
+
.replace("MATH", "")
|
|
214
|
+
.replace(/\[(\w+)\]/g, (_, key) => {
|
|
215
|
+
const columnIndex = filteredColumns.findIndex(col => col.name === key) + 1; // Convert to base 1 index
|
|
216
|
+
const columnLetter = getExcelColumnLetter(columnIndex);
|
|
217
|
+
return columnLetter && columnIndex
|
|
218
|
+
? `${columnLetter}${rowNumber + 1}`
|
|
219
|
+
: key; // Return column letter with row number or original key if not found
|
|
220
|
+
})
|
|
221
|
+
.replaceAll(",", "."); // Replace eventual , to . => The excel accepted decimal separator
|
|
222
|
+
};
|
|
223
|
+
const getExcelColumnLetter = (index) => {
|
|
224
|
+
let columnLetter = "";
|
|
225
|
+
while (index > 0) {
|
|
226
|
+
index--; // Excel columns are 1-based, but calculations work better with 0-based
|
|
227
|
+
columnLetter = String.fromCharCode((index % 26) + 65) + columnLetter;
|
|
228
|
+
index = Math.floor(index / 26);
|
|
229
|
+
}
|
|
230
|
+
return columnLetter;
|
|
231
|
+
};
|
|
232
|
+
export const addStyleToExceljsRow = (exceljsRow, columns, row) => {
|
|
233
|
+
exceljsRow.eachCell((cell, cellIndex) => {
|
|
234
|
+
const columnIndex = cellIndex - 1;
|
|
235
|
+
const columnName = columns[columnIndex]?.name;
|
|
236
|
+
const smeupCell = row?.cells?.[columnName];
|
|
237
|
+
const smeupCellWithStyle = smeupCell;
|
|
238
|
+
if (smeupCellWithStyle?.style &&
|
|
239
|
+
Object.keys(smeupCellWithStyle.style).length > 0) {
|
|
240
|
+
cellToXlsxStyleConverter(smeupCellWithStyle, cell);
|
|
241
|
+
}
|
|
242
|
+
else if (row?.style &&
|
|
243
|
+
Object.keys(row.style ?? {}).length > 0) {
|
|
244
|
+
cellToXlsxStyleConverter(smeupCellWithStyle, cell, row.style);
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
};
|
|
248
|
+
/**
|
|
249
|
+
* Converts SmeupDataCell.style attributes to ExcelJS styles
|
|
250
|
+
* @param cell SmeupDataCell - The TBL cell containing styless
|
|
251
|
+
* @param xlsxCell ExcelJS.Cell - XLSX cell where styles will be applied
|
|
252
|
+
* @returns any
|
|
253
|
+
*/
|
|
254
|
+
const cellToXlsxStyleConverter = (cell, xlsxCell, optionalRowStyles) => {
|
|
255
|
+
const cellStyle = optionalRowStyles ?? cell?.style;
|
|
256
|
+
if (!cellStyle)
|
|
257
|
+
return;
|
|
258
|
+
if (cellStyle.textAlign) {
|
|
259
|
+
xlsxCell.alignment = {
|
|
260
|
+
horizontal: cellStyle.textAlign,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
if (cellStyle.backgroundColor) {
|
|
264
|
+
xlsxCell.fill = {
|
|
265
|
+
type: "pattern",
|
|
266
|
+
pattern: "solid",
|
|
267
|
+
fgColor: { argb: hexToArgb(cellStyle.backgroundColor) },
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
if (cellStyle.fontWeight == "bold") {
|
|
271
|
+
xlsxCell.font = {
|
|
272
|
+
...xlsxCell.font,
|
|
273
|
+
bold: true,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
if (cellStyle.color) {
|
|
277
|
+
xlsxCell.font = {
|
|
278
|
+
...xlsxCell.font,
|
|
279
|
+
color: { argb: hexToArgb(cellStyle.color) },
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
if (typeof xlsxCell.value === "number" || xlsxCell.formula) {
|
|
283
|
+
xlsxCell.numFmt = getExcelNumFormat(cell.data?.decimals ?? 0, cell.data?.integers ?? 0);
|
|
284
|
+
}
|
|
285
|
+
};
|
|
286
|
+
export const getExcelNumFormat = (cellDecimals, cellIntegers) => {
|
|
287
|
+
// Step 1: Build the integer part with necessary '#' and '0'
|
|
288
|
+
let integerPart = cellIntegers ? "#".repeat(cellIntegers - 1) + "0" : "0";
|
|
289
|
+
// Step 2: Insert commas every three digits from the right
|
|
290
|
+
if (cellIntegers > 3) {
|
|
291
|
+
integerPart = integerPart
|
|
292
|
+
.split("")
|
|
293
|
+
.reverse()
|
|
294
|
+
.map((char, index) => (index > 0 && index % 3 === 0 ? char + "," : char))
|
|
295
|
+
.reverse()
|
|
296
|
+
.join("");
|
|
297
|
+
}
|
|
298
|
+
// Step 3: Build the decimal part
|
|
299
|
+
const decimalPart = cellDecimals > 0 ? "." + "0".repeat(cellDecimals) : ".00";
|
|
300
|
+
// Step 4: Construct the full format, including negative formatting
|
|
301
|
+
let numFmt = integerPart + decimalPart;
|
|
302
|
+
numFmt += `;[Red]-${numFmt}`;
|
|
303
|
+
return numFmt;
|
|
304
|
+
};
|
|
305
|
+
const decorateHeaderRow = (headerCell) => {
|
|
306
|
+
headerCell.font = { bold: true };
|
|
307
|
+
headerCell.alignment = { horizontal: "left" };
|
|
308
|
+
headerCell.fill = {
|
|
309
|
+
type: "pattern",
|
|
310
|
+
pattern: "solid",
|
|
311
|
+
fgColor: { argb: `${hexToArgb("e0e0e0")}` },
|
|
312
|
+
};
|
|
313
|
+
};
|
|
314
|
+
const getSubGroupTotalFormula = (totalOperation, colIndex, firstDataRow, lastDataRow) => {
|
|
315
|
+
const columnExcelLetter = getExcelColumnLetter(colIndex);
|
|
316
|
+
if (!allowedTotals[totalOperation]) {
|
|
317
|
+
console.warn(`Total operation [' ${totalOperation} '] is not supported`, "exportUtils.ts");
|
|
318
|
+
return "";
|
|
319
|
+
}
|
|
320
|
+
// Use full range (includes both subheaders and data rows)
|
|
321
|
+
return `${allowedTotals[totalOperation]}${columnExcelLetter}${firstDataRow}:${columnExcelLetter}${lastDataRow})`;
|
|
322
|
+
};
|
|
323
|
+
const ensureGroupRowHasDescription = (worksheet) => {
|
|
324
|
+
const firstVisibleColumnIndex = getFirstVisibleColumn(worksheet);
|
|
325
|
+
if (!firstVisibleColumnIndex) {
|
|
326
|
+
console.warn("No visible columns found in the worksheet.");
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
// Iterate through each row and check if the first cell contains "▼"
|
|
330
|
+
worksheet.eachRow((row) => {
|
|
331
|
+
const cellValue = row.getCell(1).value;
|
|
332
|
+
if (cellValue && cellValue.toString().includes("▼")) {
|
|
333
|
+
row.getCell(firstVisibleColumnIndex).value = cellValue
|
|
334
|
+
.toString()
|
|
335
|
+
.replace("▼", "");
|
|
336
|
+
}
|
|
337
|
+
});
|
|
338
|
+
};
|
|
339
|
+
const getFirstVisibleColumn = (worksheet) => {
|
|
340
|
+
return ([...Array(worksheet.columnCount)]
|
|
341
|
+
.map((_, i) => i + 1) // Convert to base 1 index
|
|
342
|
+
.find(col => !worksheet.getColumn(col).hidden) || null);
|
|
343
|
+
};
|
|
344
|
+
// Function to analyze header indentation and assign outline levels
|
|
345
|
+
const applyDataTableOutlineLevels = (worksheet) => {
|
|
346
|
+
let lastOutlineLevel = 0;
|
|
347
|
+
worksheet.eachRow((row, rowIndex) => {
|
|
348
|
+
if (rowIndex !== 1) {
|
|
349
|
+
const firstCell = row.getCell(1);
|
|
350
|
+
const isHeader = firstCell.value?.toString().includes("▼");
|
|
351
|
+
if (isHeader) {
|
|
352
|
+
row.getCell(1).value = row.getCell(1).value.replace("▼", "");
|
|
353
|
+
const leadingSpaces = firstCell.value.match(/^ */)?.[0].length || 0;
|
|
354
|
+
const outlineLevel = Math.floor(leadingSpaces / 8) + 1; // Each 8 spaces = 1 level
|
|
355
|
+
row.outlineLevel = outlineLevel - 1; // Ensure headers get an outline level
|
|
356
|
+
lastOutlineLevel = outlineLevel;
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
row.outlineLevel = lastOutlineLevel; // Normal rows follow the last assigned level
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
});
|
|
363
|
+
};
|
|
364
|
+
const addFooterTotalsRow = (worksheet, columns, props, webupManagerData) => {
|
|
365
|
+
if (!props?.totals || typeof props.totals !== "object") {
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
const totals = props.totals;
|
|
369
|
+
// Set footer total formulas
|
|
370
|
+
const footerRowData = columns.map((column, columnIndex) => {
|
|
371
|
+
const totalOperation = totals[column.name];
|
|
372
|
+
if (!totalOperation)
|
|
373
|
+
return;
|
|
374
|
+
const formula = getTotalFormula(totalOperation, columnIndex + 1, // from base 0 to base 1
|
|
375
|
+
worksheet.rowCount, columns, totalOperation.startsWith("MATH"));
|
|
376
|
+
return formula ? { formula: formula, type: ValueType.Formula } : " ";
|
|
377
|
+
});
|
|
378
|
+
const footerRow = worksheet.addRow(footerRowData);
|
|
379
|
+
// Format excel footer cells
|
|
380
|
+
footerRow.font = { bold: true };
|
|
381
|
+
footerRow.alignment = { horizontal: "right" };
|
|
382
|
+
columns.map((column, index) => {
|
|
383
|
+
const exceljsCell = footerRow.getCell(index + 1); // Convert base 0 index to base 1
|
|
384
|
+
exceljsCell.fill = footerStyleFill;
|
|
385
|
+
if (column.obj &&
|
|
386
|
+
objectsIsDate(column.obj) &&
|
|
387
|
+
(exceljsCell.formula?.startsWith(allowedTotals.Min) ||
|
|
388
|
+
exceljsCell.formula?.startsWith(allowedTotals.Max))) {
|
|
389
|
+
const dateFormat = webupManagerData.datesLocale === "it" ? "dd/mm/yyyy" : "mm/dd/yyyy";
|
|
390
|
+
exceljsCell.numFmt = dateFormat;
|
|
391
|
+
return;
|
|
392
|
+
}
|
|
393
|
+
exceljsCell.numFmt = getExcelNumFormat(column.decimals ?? 0, column.integers ?? 0);
|
|
394
|
+
});
|
|
395
|
+
};
|
|
396
|
+
/**
|
|
397
|
+
* Returns the formula used in the footer to add Totals at the end of the table
|
|
398
|
+
* @param totalOperation string
|
|
399
|
+
* @param colIndex string
|
|
400
|
+
* @param rowNumber number
|
|
401
|
+
* @returns
|
|
402
|
+
*/
|
|
403
|
+
const getTotalFormula = (totalOperation, colIndex, rowNumber, filteredColumns, isSmeupFormula) => {
|
|
404
|
+
const startRow = 2;
|
|
405
|
+
const columnExcelLetter = getExcelColumnLetter(colIndex);
|
|
406
|
+
if (isSmeupFormula) {
|
|
407
|
+
return smeupFormulaToExcelFormula(totalOperation, rowNumber, filteredColumns);
|
|
408
|
+
}
|
|
409
|
+
if (!allowedTotals[totalOperation]) {
|
|
410
|
+
console.warn(`Total operation [' ${totalOperation} '] is not supported`, "exportUtils.ts");
|
|
411
|
+
return "";
|
|
412
|
+
}
|
|
413
|
+
return `${allowedTotals[totalOperation]}${columnExcelLetter}${startRow}:${columnExcelLetter}${rowNumber})`;
|
|
414
|
+
};
|
|
415
|
+
//# sourceMappingURL=excel-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"excel-generator.js","sourceRoot":"","sources":["../../../src/excel/excel-generator.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Properties as CSSProperties } from \"csstype\";\nimport {\n SmeupDataCell,\n SmeupDataColumn,\n SmeupDataNode,\n SmeupDataRow,\n SmeupDataTable,\n} from \"@sme.up/kokos-sdk-node\";\nimport ExcelJS, { Worksheet, Cell } from \"exceljs\";\nconst { ValueType } = ExcelJS;\nimport {\n GenericObject,\n WebupManagerData,\n ColumnFilter,\n SmeupDataCellStyled,\n SupportedExportFormats,\n} from \"../types/index.js\";\nimport {\n getFilteredColumns,\n filterRows,\n updateMaxValueLength,\n calculateCellValue,\n hexToArgb,\n convertToBuffer,\n} from \"../utils/generator-utility.js\";\nimport { objectsIsDate } from \"../utils/objects-utility.js\";\nimport {\n exportTypeSupportsFormatting,\n headerStyleFill,\n allowedTotals,\n footerStyleFill,\n} from \"./excel-generator.types.js\";\nimport { isColumnHidden } from \"../utils/datastructure-utility.js\";\n\nexport const dataTableToExcelData = async (\n component: {\n smeupDataTable: SmeupDataTable;\n props: GenericObject;\n },\n fileFormat: SupportedExportFormats,\n webupManagerData: WebupManagerData,\n): Promise<Buffer | Uint8Array> => {\n const workbook = dataTableToExcelWorkbook(\n component,\n fileFormat,\n webupManagerData,\n );\n\n // Convert workbook to buffer based on file format\n switch (fileFormat) {\n case SupportedExportFormats.XLSX: {\n const xlsxBuffer = await workbook.xlsx.writeBuffer();\n return convertToBuffer(xlsxBuffer);\n }\n case SupportedExportFormats.TXT:\n case SupportedExportFormats.CSV: {\n const csvBuffer = await workbook.csv.writeBuffer({\n formatterOptions: { delimiter: \";\" },\n });\n return convertToBuffer(csvBuffer);\n }\n default:\n throw new Error(`Unsupported export format: ${fileFormat}`);\n }\n};\n\nexport const dataTableToExcelWorkbook = (\n component: {\n smeupDataTable: SmeupDataTable;\n props: GenericObject;\n },\n fileFormat: SupportedExportFormats,\n webupManagerData: WebupManagerData,\n): ExcelJS.Workbook => {\n // Create a new ExcelJS.Workbook and return it as a resolved Promise\n const { smeupDataTable: smeupDataTable, props } = component;\n const workbook = new ExcelJS.Workbook();\n const worksheet = initializeWorksheet(workbook);\n\n const filteredColumns: SmeupDataColumn[] = getFilteredColumns(\n smeupDataTable.columns,\n );\n const maxColumnValueLenght: { [key: string]: number } = {};\n\n let rowNumber: number = 1; // Start row number\n\n // Headers setup\n setDataTableHeaderRow(worksheet, filteredColumns, maxColumnValueLenght);\n\n // Get active groups (where visible is true)\n const groupsArray = Array.isArray(props?.groups) ? props.groups : [];\n const activeGroups = groupsArray\n .filter((group: { column: string; visible: boolean }) => group.visible)\n .map((group: { column: string; visible: boolean }) => group.column);\n\n // Filter and sort rows (if filters are available)\n const rows = filterRows(\n smeupDataTable,\n filteredColumns,\n props?.filters as { [key: string]: ColumnFilter },\n );\n\n if (activeGroups?.length > 0) {\n // Sort rows based on the first active group column\n rows.sort((a, b) => {\n for (const group of activeGroups) {\n const valA =\n a.cells && a.cells[group]?.value !== undefined\n ? a.cells[group]?.value\n : \"\";\n const valB =\n b.cells && b.cells[group]?.value !== undefined\n ? b.cells[group]?.value\n : \"\";\n if (valA !== valB) return valA.localeCompare(valB);\n }\n return 0;\n });\n\n // Recursive grouping\n rowNumber = insertDataTableGroupedRows(\n worksheet,\n rows,\n activeGroups,\n filteredColumns,\n smeupDataTable.columns,\n rowNumber,\n fileFormat,\n webupManagerData,\n 1,\n maxColumnValueLenght,\n (props?.totals ?? {}) as Record<string, string>,\n );\n\n //INTERACTIVE GROUPS MANAGING\n //TODO: Add groups subtotals\n if (worksheet.getColumn(1).hidden) ensureGroupRowHasDescription(worksheet);\n applyDataTableOutlineLevels(worksheet);\n worksheet.properties.outlineProperties = {\n summaryBelow: false,\n summaryRight: false,\n };\n } else {\n // Process rows normally if no grouping\n rowNumber = insertDataTableRows(\n worksheet,\n rows,\n filteredColumns,\n rowNumber,\n fileFormat,\n webupManagerData,\n maxColumnValueLenght,\n );\n }\n\n if (exportTypeSupportsFormatting[fileFormat] && props?.totals) {\n addFooterTotalsRow(worksheet, filteredColumns, props, webupManagerData);\n }\n\n // Apply column width\n worksheet.columns.forEach(col => {\n const columnKey = col.key;\n if (columnKey) {\n col.width = (maxColumnValueLenght[columnKey] ?? 10) * 1.1;\n } else {\n col.width = 10 * 1.1; // Default width\n }\n });\n\n // Apply filter to column headers\n // TODO: look if it breaks groupings\n worksheet.autoFilter = {\n from: { row: 1, column: 1 },\n to: { row: rowNumber, column: filteredColumns.length },\n };\n\n // Forces full calculation when the workbook is opened\n workbook.calcProperties = {\n fullCalcOnLoad: true,\n };\n\n return workbook;\n};\n\n/**\n * Adds creator, creation date to the workbook and creates a sheet\n * @param workbook\n * @returns void\n */\nconst initializeWorksheet = (workbook: ExcelJS.Workbook) => {\n workbook.creator = \"/doc-alchemist - dataTable excel generator\";\n workbook.created = new Date();\n\n return workbook.addWorksheet(\"Export\");\n};\n\n/**\n * Creates the first row of the table by looking at dataTable columns.\n * Also updates column width calculations\n * @param worksheet\n * @param filteredColumns\n * @param maxValueLengthMap\n */\nconst setDataTableHeaderRow = (\n worksheet: Worksheet,\n filteredColumns: SmeupDataColumn[],\n maxValueLengthMap: { [key: string]: number },\n) => {\n worksheet.columns = filteredColumns.map(col => {\n updateMaxValueLength(maxValueLengthMap, col.title, col.name);\n return {\n header: col.title,\n key: col.name,\n width: maxValueLengthMap[col.name], // Set the width to the updated value\n hidden: isColumnHidden(col),\n } as ExcelJS.Column;\n });\n\n setHeaderStyling(worksheet);\n};\n\nconst setHeaderStyling = (worksheet: Worksheet, background = false): void => {\n const headerRow = worksheet.getRow(1);\n headerRow.font = { bold: true };\n headerRow.alignment = {\n horizontal: \"center\",\n vertical: \"middle\",\n wrapText: true,\n };\n\n if (background) {\n for (let col = 1; col <= worksheet.columns.length; col++) {\n const cell = headerRow.getCell(col);\n cell.fill = headerStyleFill;\n }\n }\n};\n\nconst insertDataTableGroupedRows = (\n worksheet: ExcelJS.Worksheet,\n rows: SmeupDataRow[],\n groups: string[],\n filteredColumns: SmeupDataColumn[],\n unfilteredColumns: SmeupDataColumn[],\n rowNumber: number,\n fileFormat: SupportedExportFormats,\n webupManagerData: WebupManagerData,\n currentOutlineLevel: number = 1,\n maxColumnValueLength: Record<string, number>,\n totals: Record<string, string>,\n): number => {\n if (!groups.length) {\n return insertDataTableRows(\n worksheet,\n rows,\n filteredColumns,\n rowNumber,\n fileFormat,\n webupManagerData,\n maxColumnValueLength,\n );\n }\n\n const [currentGroup, ...remainingGroups] = groups;\n const uniqueGroupValues = [\n ...new Set(\n rows\n .map(row => row.cells && row.cells[currentGroup]?.value)\n .filter(value => value !== undefined),\n ),\n ].sort();\n const columnTitles = Object.fromEntries(\n unfilteredColumns.map(col => [col.name, col.title]),\n );\n\n for (const groupValue of uniqueGroupValues) {\n // Filter rows for the current group\n const groupedRows = rows.filter(\n row => row.cells && row.cells[currentGroup]?.value === groupValue,\n );\n const indentation = \" \".repeat((currentOutlineLevel - 1) * 8);\n\n // Insert header row\n const headerRow = worksheet.addRow([]);\n headerRow.getCell(1).value =\n `${indentation}▼${columnTitles[currentGroup]} - ${groupValue}`;\n const headerRowNumber = ++rowNumber;\n\n rowNumber = insertDataTableGroupedRows(\n worksheet,\n groupedRows,\n remainingGroups,\n filteredColumns,\n unfilteredColumns,\n rowNumber,\n fileFormat,\n webupManagerData,\n currentOutlineLevel + 1,\n maxColumnValueLength,\n totals,\n );\n const lastDataRow = rowNumber;\n\n // Compute totals and format cells\n for (const [colIndex, col] of filteredColumns.entries()) {\n const cell = headerRow.getCell(colIndex + 1);\n cell.numFmt = getExcelNumFormat(col.decimals ?? 0, col.integers ?? 0);\n decorateHeaderRow(cell);\n if (!totals) continue;\n const totalFormula = totals[col.name];\n if (totalFormula && col.visible) {\n cell.alignment = { horizontal: \"right\" };\n\n cell.value = totalFormula.startsWith(\"MATH\")\n ? {\n formula: smeupFormulaToExcelFormula(\n totalFormula.replace(\"MATH\", \"\"),\n headerRowNumber - 1,\n filteredColumns,\n ),\n }\n : {\n formula: getSubGroupTotalFormula(\n totalFormula,\n colIndex + 1,\n headerRowNumber + 1,\n lastDataRow,\n ),\n };\n }\n }\n }\n\n return rowNumber;\n};\n\n/**\n * Inserts normal rows (without grouping).\n */\nconst insertDataTableRows = (\n worksheet: ExcelJS.Worksheet,\n rows: SmeupDataRow[],\n filteredColumns: SmeupDataColumn[],\n rowNumber: number,\n fileFormat: SupportedExportFormats,\n webupManagerData: WebupManagerData,\n maxColumnValueLenght: { [key: string]: number },\n): number => {\n for (const row of rows) {\n const rowData = filteredColumns.map(column => {\n const cell: SmeupDataCell = (row?.cells ?? {})[column.name];\n updateMaxValueLength(maxColumnValueLenght, cell?.value, column.name);\n return column.formula\n ? {\n formula: `${smeupFormulaToExcelFormula(\n column.formula,\n rowNumber,\n filteredColumns,\n )}`,\n type: ValueType.Formula,\n }\n : calculateCellValue(cell, fileFormat, webupManagerData);\n });\n\n const newRow = worksheet.addRow(rowData);\n if (exportTypeSupportsFormatting[fileFormat]) {\n addStyleToExceljsRow(newRow, filteredColumns, row);\n }\n\n rowNumber++;\n }\n\n return rowNumber;\n};\n\nexport const smeupFormulaToExcelFormula = (\n formula: string,\n rowNumber: number,\n filteredColumns: SmeupDataColumn[],\n): string => {\n return formula\n .replace(\"MATH\", \"\")\n .replace(/\\[(\\w+)\\]/g, (_, key) => {\n const columnIndex =\n filteredColumns.findIndex(col => col.name === key) + 1; // Convert to base 1 index\n const columnLetter = getExcelColumnLetter(columnIndex);\n return columnLetter && columnIndex\n ? `${columnLetter}${rowNumber + 1}`\n : key; // Return column letter with row number or original key if not found\n })\n .replaceAll(\",\", \".\"); // Replace eventual , to . => The excel accepted decimal separator\n};\n\nconst getExcelColumnLetter = (index: number): string => {\n let columnLetter = \"\";\n while (index > 0) {\n index--; // Excel columns are 1-based, but calculations work better with 0-based\n columnLetter = String.fromCharCode((index % 26) + 65) + columnLetter;\n index = Math.floor(index / 26);\n }\n return columnLetter;\n};\n\nexport const addStyleToExceljsRow = (\n exceljsRow: ExcelJS.Row,\n columns: SmeupDataColumn[],\n row: SmeupDataRow | SmeupDataNode,\n) => {\n exceljsRow.eachCell((cell, cellIndex) => {\n const columnIndex = cellIndex - 1;\n const columnName = columns[columnIndex]?.name;\n const smeupCell = row?.cells?.[columnName];\n const smeupCellWithStyle = smeupCell as SmeupDataCellStyled;\n if (\n smeupCellWithStyle?.style &&\n Object.keys(smeupCellWithStyle.style).length > 0\n ) {\n cellToXlsxStyleConverter(smeupCellWithStyle, cell);\n } else if (\n (row as SmeupDataCellStyled)?.style &&\n Object.keys((row as SmeupDataCellStyled).style ?? {}).length > 0\n ) {\n cellToXlsxStyleConverter(\n smeupCellWithStyle,\n cell,\n (row as SmeupDataCellStyled).style,\n );\n }\n });\n};\n\n/**\n * Converts SmeupDataCell.style attributes to ExcelJS styles\n * @param cell SmeupDataCell - The TBL cell containing styless\n * @param xlsxCell ExcelJS.Cell - XLSX cell where styles will be applied\n * @returns any\n */\nconst cellToXlsxStyleConverter = (\n cell: SmeupDataCell,\n xlsxCell: Cell,\n optionalRowStyles?: CSSProperties,\n) => {\n const cellStyle = optionalRowStyles ?? (cell as SmeupDataCellStyled)?.style;\n if (!cellStyle) return;\n\n if (cellStyle.textAlign) {\n xlsxCell.alignment = {\n horizontal: cellStyle.textAlign as\n | \"left\"\n | \"center\"\n | \"right\"\n | \"fill\"\n | \"justify\"\n | \"centerContinuous\"\n | \"distributed\",\n };\n }\n\n if (cellStyle.backgroundColor) {\n xlsxCell.fill = {\n type: \"pattern\",\n pattern: \"solid\",\n fgColor: { argb: hexToArgb(cellStyle.backgroundColor) },\n };\n }\n if (cellStyle.fontWeight == \"bold\") {\n xlsxCell.font = {\n ...xlsxCell.font,\n bold: true,\n };\n }\n if (cellStyle.color) {\n xlsxCell.font = {\n ...xlsxCell.font,\n color: { argb: hexToArgb(cellStyle.color) },\n };\n }\n\n if (typeof xlsxCell.value === \"number\" || xlsxCell.formula) {\n xlsxCell.numFmt = getExcelNumFormat(\n (cell.data?.decimals as number) ?? 0,\n (cell.data?.integers as number) ?? 0,\n );\n }\n};\n\nexport const getExcelNumFormat = (\n cellDecimals: number,\n cellIntegers: number,\n): string => {\n // Step 1: Build the integer part with necessary '#' and '0'\n let integerPart = cellIntegers ? \"#\".repeat(cellIntegers - 1) + \"0\" : \"0\";\n\n // Step 2: Insert commas every three digits from the right\n if (cellIntegers > 3) {\n integerPart = integerPart\n .split(\"\")\n .reverse()\n .map((char, index) => (index > 0 && index % 3 === 0 ? char + \",\" : char))\n .reverse()\n .join(\"\");\n }\n\n // Step 3: Build the decimal part\n const decimalPart = cellDecimals > 0 ? \".\" + \"0\".repeat(cellDecimals) : \".00\";\n\n // Step 4: Construct the full format, including negative formatting\n let numFmt = integerPart + decimalPart;\n numFmt += `;[Red]-${numFmt}`;\n\n return numFmt;\n};\n\nconst decorateHeaderRow = (headerCell: ExcelJS.Cell) => {\n headerCell.font = { bold: true };\n headerCell.alignment = { horizontal: \"left\" };\n headerCell.fill = {\n type: \"pattern\",\n pattern: \"solid\",\n fgColor: { argb: `${hexToArgb(\"e0e0e0\")}` },\n };\n};\n\nconst getSubGroupTotalFormula = (\n totalOperation: string,\n colIndex: number,\n firstDataRow: number,\n lastDataRow: number,\n): string => {\n const columnExcelLetter = getExcelColumnLetter(colIndex);\n\n if (!allowedTotals[totalOperation]) {\n console.warn(\n `Total operation [' ${totalOperation} '] is not supported`,\n \"exportUtils.ts\",\n );\n return \"\";\n }\n\n // Use full range (includes both subheaders and data rows)\n return `${allowedTotals[totalOperation]}${columnExcelLetter}${firstDataRow}:${columnExcelLetter}${lastDataRow})`;\n};\n\nconst ensureGroupRowHasDescription = (worksheet: ExcelJS.Worksheet) => {\n const firstVisibleColumnIndex = getFirstVisibleColumn(worksheet);\n if (!firstVisibleColumnIndex) {\n console.warn(\"No visible columns found in the worksheet.\");\n return;\n }\n // Iterate through each row and check if the first cell contains \"▼\"\n worksheet.eachRow((row: ExcelJS.Row) => {\n const cellValue = row.getCell(1).value;\n if (cellValue && cellValue.toString().includes(\"▼\")) {\n row.getCell(firstVisibleColumnIndex).value = cellValue\n .toString()\n .replace(\"▼\", \"\");\n }\n });\n};\n\nconst getFirstVisibleColumn = (worksheet: ExcelJS.Worksheet) => {\n return (\n [...Array(worksheet.columnCount)]\n .map((_, i) => i + 1) // Convert to base 1 index\n .find(col => !worksheet.getColumn(col).hidden) || null\n );\n};\n\n// Function to analyze header indentation and assign outline levels\nconst applyDataTableOutlineLevels = (worksheet: ExcelJS.Worksheet) => {\n let lastOutlineLevel = 0;\n\n worksheet.eachRow((row, rowIndex) => {\n if (rowIndex !== 1) {\n const firstCell = row.getCell(1);\n const isHeader = firstCell.value?.toString().includes(\"▼\");\n\n if (isHeader) {\n row.getCell(1).value = (row.getCell(1).value as string).replace(\n \"▼\",\n \"\",\n );\n const leadingSpaces =\n (firstCell.value as string).match(/^ */)?.[0].length || 0;\n const outlineLevel = Math.floor(leadingSpaces / 8) + 1; // Each 8 spaces = 1 level\n row.outlineLevel = outlineLevel - 1; // Ensure headers get an outline level\n lastOutlineLevel = outlineLevel;\n } else {\n row.outlineLevel = lastOutlineLevel; // Normal rows follow the last assigned level\n }\n }\n });\n};\n\nconst addFooterTotalsRow = (\n worksheet: ExcelJS.Worksheet,\n columns: SmeupDataColumn[],\n props: GenericObject,\n webupManagerData: WebupManagerData,\n) => {\n if (!props?.totals || typeof props.totals !== \"object\") {\n return;\n }\n\n const totals = props.totals as Record<string, string>;\n\n // Set footer total formulas\n const footerRowData = columns.map((column, columnIndex) => {\n const totalOperation: string = totals[column.name];\n if (!totalOperation) return;\n\n const formula = getTotalFormula(\n totalOperation,\n columnIndex + 1, // from base 0 to base 1\n worksheet.rowCount,\n columns,\n totalOperation.startsWith(\"MATH\"),\n );\n\n return formula ? { formula: formula, type: ValueType.Formula } : \" \";\n });\n const footerRow = worksheet.addRow(footerRowData);\n\n // Format excel footer cells\n footerRow.font = { bold: true };\n footerRow.alignment = { horizontal: \"right\" };\n columns.map((column, index) => {\n const exceljsCell = footerRow.getCell(index + 1); // Convert base 0 index to base 1\n exceljsCell.fill = footerStyleFill;\n\n if (\n column.obj &&\n objectsIsDate(column.obj) &&\n (exceljsCell.formula?.startsWith(allowedTotals.Min) ||\n exceljsCell.formula?.startsWith(allowedTotals.Max))\n ) {\n const dateFormat =\n webupManagerData.datesLocale === \"it\" ? \"dd/mm/yyyy\" : \"mm/dd/yyyy\";\n exceljsCell.numFmt = dateFormat;\n return;\n }\n\n exceljsCell.numFmt = getExcelNumFormat(\n column.decimals ?? 0,\n column.integers ?? 0,\n );\n });\n};\n\n/**\n * Returns the formula used in the footer to add Totals at the end of the table\n * @param totalOperation string\n * @param colIndex string\n * @param rowNumber number\n * @returns\n */\nconst getTotalFormula = (\n totalOperation: string,\n colIndex: number,\n rowNumber: number,\n filteredColumns: SmeupDataColumn[],\n isSmeupFormula: boolean,\n): string => {\n const startRow = 2;\n const columnExcelLetter = getExcelColumnLetter(colIndex);\n\n if (isSmeupFormula) {\n return smeupFormulaToExcelFormula(\n totalOperation,\n rowNumber,\n filteredColumns,\n );\n }\n\n if (!allowedTotals[totalOperation]) {\n console.warn(\n `Total operation [' ${totalOperation} '] is not supported`,\n \"exportUtils.ts\",\n );\n return \"\";\n }\n\n return `${allowedTotals[totalOperation]}${columnExcelLetter}${startRow}:${columnExcelLetter}${rowNumber})`;\n};\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Fill } from "exceljs";
|
|
2
|
+
export declare enum TotalMode {
|
|
3
|
+
COUNT = "Count",
|
|
4
|
+
SUM = "Sum",
|
|
5
|
+
MIN = "Min",
|
|
6
|
+
MAX = "Max",
|
|
7
|
+
DISTINCT = "Distinct",
|
|
8
|
+
AVERAGE = "Average",
|
|
9
|
+
MATH = "MATH"
|
|
10
|
+
}
|
|
11
|
+
export declare const headerStyleFill: Fill;
|
|
12
|
+
export declare const exportTypeSupportsFormatting: {
|
|
13
|
+
xlsx: boolean;
|
|
14
|
+
csv: boolean;
|
|
15
|
+
txt: boolean;
|
|
16
|
+
pdf_scheda: boolean;
|
|
17
|
+
};
|
|
18
|
+
export declare const allowedTotals: {
|
|
19
|
+
[x: string]: string;
|
|
20
|
+
};
|
|
21
|
+
export declare const footerStyleFill: Fill;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { SupportedExportFormats } from "../types";
|
|
2
|
+
export const headerStyleFill = {
|
|
3
|
+
type: "pattern",
|
|
4
|
+
pattern: "solid",
|
|
5
|
+
fgColor: { argb: "E0E0E0" },
|
|
6
|
+
};
|
|
7
|
+
export const exportTypeSupportsFormatting = {
|
|
8
|
+
[SupportedExportFormats.XLSX]: true,
|
|
9
|
+
[SupportedExportFormats.CSV]: false,
|
|
10
|
+
[SupportedExportFormats.TXT]: false,
|
|
11
|
+
[SupportedExportFormats.PDF_SCHEDA]: false,
|
|
12
|
+
};
|
|
13
|
+
export const allowedTotals = {
|
|
14
|
+
// The different initial number indicates the specific subtotal action
|
|
15
|
+
["Count"]: "SUBTOTAL(3,", // COUNTA
|
|
16
|
+
["Sum"]: "SUBTOTAL(9,", // SUM
|
|
17
|
+
["Max"]: "SUBTOTAL(4,", // MAX
|
|
18
|
+
["Min"]: "SUBTOTAL(5,", // MIN
|
|
19
|
+
["Average"]: "SUBTOTAL(1,", // AVERAGE
|
|
20
|
+
};
|
|
21
|
+
export const footerStyleFill = {
|
|
22
|
+
type: "pattern",
|
|
23
|
+
pattern: "solid",
|
|
24
|
+
fgColor: { argb: "EEEEEE" },
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=excel-generator.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"excel-generator.types.js","sourceRoot":"","sources":["../../../src/excel/excel-generator.types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAYlD,MAAM,CAAC,MAAM,eAAe,GAAS;IACnC,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,OAAO;IAChB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;CAC5B,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,IAAI;IACnC,CAAC,sBAAsB,CAAC,GAAG,CAAC,EAAE,KAAK;IACnC,CAAC,sBAAsB,CAAC,GAAG,CAAC,EAAE,KAAK;IACnC,CAAC,sBAAsB,CAAC,UAAU,CAAC,EAAE,KAAK;CAC3C,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,sEAAsE;IACtE,CAAC,OAAoB,CAAC,EAAE,aAAa,EAAE,SAAS;IAChD,CAAC,KAAkB,CAAC,EAAE,aAAa,EAAE,MAAM;IAC3C,CAAC,KAAkB,CAAC,EAAE,aAAa,EAAE,MAAM;IAC3C,CAAC,KAAkB,CAAC,EAAE,aAAa,EAAE,MAAM;IAC3C,CAAC,SAAsB,CAAC,EAAE,aAAa,EAAE,UAAU;CACpD,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAS;IACnC,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,OAAO;IAChB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;CAC5B,CAAC","sourcesContent":["import { Fill } from \"exceljs\";\nimport { SupportedExportFormats } from \"../types\";\n\nexport declare enum TotalMode {\n COUNT = \"Count\",\n SUM = \"Sum\",\n MIN = \"Min\",\n MAX = \"Max\",\n DISTINCT = \"Distinct\",\n AVERAGE = \"Average\",\n MATH = \"MATH\",\n}\n\nexport const headerStyleFill: Fill = {\n type: \"pattern\",\n pattern: \"solid\",\n fgColor: { argb: \"E0E0E0\" },\n};\n\nexport const exportTypeSupportsFormatting = {\n [SupportedExportFormats.XLSX]: true,\n [SupportedExportFormats.CSV]: false,\n [SupportedExportFormats.TXT]: false,\n [SupportedExportFormats.PDF_SCHEDA]: false,\n};\n\nexport const allowedTotals = {\n // The different initial number indicates the specific subtotal action\n [\"Count\" as TotalMode]: \"SUBTOTAL(3,\", // COUNTA\n [\"Sum\" as TotalMode]: \"SUBTOTAL(9,\", // SUM\n [\"Max\" as TotalMode]: \"SUBTOTAL(4,\", // MAX\n [\"Min\" as TotalMode]: \"SUBTOTAL(5,\", // MIN\n [\"Average\" as TotalMode]: \"SUBTOTAL(1,\", // AVERAGE\n};\n\nexport const footerStyleFill: Fill = {\n type: \"pattern\",\n pattern: \"solid\",\n fgColor: { argb: \"EEEEEE\" },\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./excel/excel-generator.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC","sourcesContent":["export * from \"./excel/excel-generator.js\";\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { SmeupDataTable } from "@sme.up/kokos-sdk-node";
|
|
2
|
+
import { GenericObject, WebupManagerData } from "../types/index.js";
|
|
3
|
+
export declare const generatePdf: (component: {
|
|
4
|
+
data: SmeupDataTable;
|
|
5
|
+
props: GenericObject;
|
|
6
|
+
}, webupManagerData: WebupManagerData) => Promise<Buffer>;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export const generatePdf = (component, webupManagerData) => {
|
|
2
|
+
console.warn("PDF generation is not supported in the current environment. This function is a placeholder and does not generate a real PDF.", component, webupManagerData);
|
|
3
|
+
return Promise.resolve(Buffer.from([]));
|
|
4
|
+
};
|
|
5
|
+
//# sourceMappingURL=pdf-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-generator.js","sourceRoot":"","sources":["../../../src/pdf/pdf-generator.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,SAGC,EACD,gBAAkC,EACjB,EAAE;IACnB,OAAO,CAAC,IAAI,CACV,8HAA8H,EAC9H,SAAS,EACT,gBAAgB,CACjB,CAAC;IACF,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1C,CAAC,CAAC","sourcesContent":["import { SmeupDataTable } from \"@sme.up/kokos-sdk-node\";\nimport { GenericObject, WebupManagerData } from \"../types/index.js\";\n\nexport const generatePdf = (\n component: {\n data: SmeupDataTable;\n props: GenericObject;\n },\n webupManagerData: WebupManagerData,\n): Promise<Buffer> => {\n console.warn(\n \"PDF generation is not supported in the current environment. This function is a placeholder and does not generate a real PDF.\",\n component,\n webupManagerData,\n );\n return Promise.resolve(Buffer.from([]));\n};\n"]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { SmeupDataCell } from "@sme.up/kokos-sdk-node";
|
|
2
|
+
import type { Properties as CSSProperties } from "csstype";
|
|
3
|
+
export interface SmeupDataObj {
|
|
4
|
+
t: string;
|
|
5
|
+
p: string;
|
|
6
|
+
k: string;
|
|
7
|
+
}
|
|
8
|
+
export declare enum DatesFormats {
|
|
9
|
+
ISO_DATE = "YYYY-MM-DD",
|
|
10
|
+
ISO_DATE_TIME = "YYYY-MM-DD HH:mm:ss",
|
|
11
|
+
ISO_TIME = "HH:mm:ss",
|
|
12
|
+
ISO_TIME_WITHOUT_SECONDS = "HH:mm"
|
|
13
|
+
}
|
|
14
|
+
export interface GenericObject {
|
|
15
|
+
[index: string]: unknown;
|
|
16
|
+
}
|
|
17
|
+
export interface WebupManagerData {
|
|
18
|
+
mathLocale: string;
|
|
19
|
+
datesLocale: string;
|
|
20
|
+
themeBackground: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Applies dataTable filters to the excel table rows
|
|
24
|
+
*/
|
|
25
|
+
export type ColumnFilter = {
|
|
26
|
+
checkBoxes?: {
|
|
27
|
+
value: string;
|
|
28
|
+
}[];
|
|
29
|
+
};
|
|
30
|
+
export interface SmeupDataCellStyled extends SmeupDataCell {
|
|
31
|
+
style?: CSSProperties;
|
|
32
|
+
}
|
|
33
|
+
export declare enum SupportedExportFormats {
|
|
34
|
+
XLSX = "xlsx",
|
|
35
|
+
CSV = "csv",
|
|
36
|
+
TXT = "txt",
|
|
37
|
+
PDF_SCHEDA = "pdf_scheda"
|
|
38
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export var DatesFormats;
|
|
2
|
+
(function (DatesFormats) {
|
|
3
|
+
DatesFormats["ISO_DATE"] = "YYYY-MM-DD";
|
|
4
|
+
DatesFormats["ISO_DATE_TIME"] = "YYYY-MM-DD HH:mm:ss";
|
|
5
|
+
DatesFormats["ISO_TIME"] = "HH:mm:ss";
|
|
6
|
+
DatesFormats["ISO_TIME_WITHOUT_SECONDS"] = "HH:mm";
|
|
7
|
+
})(DatesFormats || (DatesFormats = {}));
|
|
8
|
+
export var SupportedExportFormats;
|
|
9
|
+
(function (SupportedExportFormats) {
|
|
10
|
+
SupportedExportFormats["XLSX"] = "xlsx";
|
|
11
|
+
SupportedExportFormats["CSV"] = "csv";
|
|
12
|
+
SupportedExportFormats["TXT"] = "txt";
|
|
13
|
+
SupportedExportFormats["PDF_SCHEDA"] = "pdf_scheda";
|
|
14
|
+
})(SupportedExportFormats || (SupportedExportFormats = {}));
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AASA,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,sBAKX;AALD,WAAY,sBAAsB;IAChC,uCAAa,CAAA;IACb,qCAAW,CAAA;IACX,qCAAW,CAAA;IACX,mDAAyB,CAAA;AAC3B,CAAC,EALW,sBAAsB,KAAtB,sBAAsB,QAKjC","sourcesContent":["import { SmeupDataCell } from \"@sme.up/kokos-sdk-node\";\nimport type { Properties as CSSProperties } from \"csstype\";\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}\n"]}
|