@sme.up/doc-alchemist 1.1.0-SNAPSHOT-20250623155458 → 1.2.0-20250805123329
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 +278 -30
- 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/converters/excel/commons.d.ts +43 -0
- package/dist/converters/excel/commons.js +232 -0
- package/dist/converters/excel/commons.js.map +1 -0
- package/dist/{src/excel/excel-generator.types.d.ts → converters/excel/excel-converter.types.d.ts} +2 -0
- package/dist/{src/excel/excel-generator.types.js → converters/excel/excel-converter.types.js} +5 -2
- package/dist/converters/excel/excel-converter.types.js.map +1 -0
- package/dist/{src/excel/matrix-generator.d.ts → converters/excel/matrix-converter.d.ts} +4 -2
- package/dist/{src/excel/matrix-generator.js → converters/excel/matrix-converter.js} +35 -38
- package/dist/converters/excel/matrix-converter.js.map +1 -0
- package/dist/{src/excel/tree-generator.d.ts → converters/excel/tree-converter.d.ts} +2 -2
- package/dist/{src/excel/tree-generator.js → converters/excel/tree-converter.js} +5 -5
- package/dist/converters/excel/tree-converter.js.map +1 -0
- package/dist/{src/excel/excel-generator.d.ts → converters/excel-converter.d.ts} +2 -1
- package/dist/{src/excel/excel-generator.js → converters/excel-converter.js} +4 -4
- package/dist/converters/excel-converter.js.map +1 -0
- package/dist/converters/images/charts-generator.d.ts +9 -0
- package/dist/converters/images/charts-generator.js +250 -0
- package/dist/converters/images/charts-generator.js.map +1 -0
- package/dist/converters/pdf/autotable-renderer.d.ts +4 -0
- package/dist/converters/pdf/autotable-renderer.js +83 -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 +50 -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 +17 -0
- package/dist/converters/pdf/matrix-converter.js +200 -0
- package/dist/converters/pdf/matrix-converter.js.map +1 -0
- package/dist/converters/pdf/pdf-converter.types.d.ts +13 -0
- package/dist/converters/pdf/pdf-converter.types.js +2 -0
- package/dist/converters/pdf/pdf-converter.types.js.map +1 -0
- package/dist/converters/pdf/sch-converter.d.ts +3 -0
- package/dist/converters/pdf/sch-converter.js +99 -0
- package/dist/converters/pdf/sch-converter.js.map +1 -0
- package/dist/converters/pdf-converter.d.ts +8 -0
- package/dist/converters/pdf-converter.js +54 -0
- package/dist/converters/pdf-converter.js.map +1 -0
- package/dist/index.d.ts +7 -4
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/types/component-props.d.ts +8 -0
- package/dist/types/component-props.js +7 -0
- package/dist/types/component-props.js.map +1 -0
- package/dist/types/component.d.ts +53 -0
- package/dist/types/component.js +53 -0
- package/dist/types/component.js.map +1 -0
- package/dist/types/converter.d.ts +8 -0
- package/dist/types/converter.js +2 -0
- package/dist/types/converter.js.map +1 -0
- package/dist/types/data-structures/smeupDataStructure.d.ts +215 -0
- package/dist/types/data-structures/smeupDataStructure.js +99 -0
- package/dist/types/data-structures/smeupDataStructure.js.map +1 -0
- package/dist/types/data-structures/smeupDataTable.d.ts +125 -0
- package/dist/types/data-structures/smeupDataTable.js +43 -0
- package/dist/types/data-structures/smeupDataTable.js.map +1 -0
- package/dist/types/data-structures/smeupDataTree.d.ts +13 -0
- package/dist/types/data-structures/smeupDataTree.js +2 -0
- package/dist/types/data-structures/smeupDataTree.js.map +1 -0
- package/dist/types/data-structures/smeupSch.d.ts +72 -0
- package/dist/types/data-structures/smeupSch.js +11 -0
- package/dist/types/data-structures/smeupSch.js.map +1 -0
- package/dist/types/dynamism.d.ts +45 -0
- package/dist/types/dynamism.js +30 -0
- package/dist/types/dynamism.js.map +1 -0
- package/dist/types/general.d.ts +22 -0
- package/dist/types/general.js +24 -0
- package/dist/types/general.js.map +1 -0
- package/dist/types/helpers.d.ts +4 -0
- package/dist/types/helpers.js +6 -0
- package/dist/types/helpers.js.map +1 -0
- package/dist/{src/types → types}/index.d.ts +9 -2
- package/dist/{src/types → types}/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/commons-utility.d.ts +61 -0
- package/dist/{src/utils/generator-utility.js → utils/commons-utility.js} +100 -10
- package/dist/utils/commons-utility.js.map +1 -0
- package/dist/utils/datastructure-utility.d.ts +2 -0
- package/dist/utils/datastructure-utility.js +5 -0
- package/dist/utils/datastructure-utility.js.map +1 -0
- package/dist/{src/utils → utils}/dates-utility.d.ts +9 -0
- package/dist/{src/utils → utils}/dates-utility.js +18 -0
- package/dist/utils/dates-utility.js.map +1 -0
- package/dist/utils/formatter-utility.d.ts +4 -0
- package/dist/utils/formatter-utility.js +41 -0
- package/dist/utils/formatter-utility.js.map +1 -0
- package/dist/utils/image-utils.d.ts +7 -0
- package/dist/utils/image-utils.js +32 -0
- package/dist/utils/image-utils.js.map +1 -0
- package/dist/{src/utils → utils}/math-utility.d.ts +1 -0
- package/dist/{src/utils → utils}/math-utility.js +10 -0
- package/dist/utils/math-utility.js.map +1 -0
- package/dist/utils/objects-utility.js.map +1 -0
- package/dist/utils/regex-utility.js.map +1 -0
- package/package.json +14 -11
- package/dist/assets/sample-data.d.ts +0 -48
- package/dist/assets/sample-data.js +0 -372
- package/dist/assets/sample-data.js.map +0 -1
- package/dist/debug.d.ts +0 -1
- package/dist/debug.js +0 -29
- package/dist/debug.js.map +0 -1
- package/dist/src/excel/commons.d.ts +0 -21
- package/dist/src/excel/commons.js +0 -120
- package/dist/src/excel/commons.js.map +0 -1
- package/dist/src/excel/excel-generator.js.map +0 -1
- package/dist/src/excel/excel-generator.types.js.map +0 -1
- package/dist/src/excel/matrix-generator.js.map +0 -1
- package/dist/src/excel/tree-generator.js.map +0 -1
- package/dist/src/index.d.ts +0 -1
- package/dist/src/index.js +0 -2
- package/dist/src/index.js.map +0 -1
- package/dist/src/pdf/pdf-generator.d.ts +0 -7
- package/dist/src/pdf/pdf-generator.js +0 -28
- package/dist/src/pdf/pdf-generator.js.map +0 -1
- package/dist/src/types/index.js.map +0 -1
- package/dist/src/utils/datastructure-utility.d.ts +0 -2
- package/dist/src/utils/datastructure-utility.js +0 -5
- package/dist/src/utils/datastructure-utility.js.map +0 -1
- package/dist/src/utils/dates-utility.js.map +0 -1
- package/dist/src/utils/generator-utility.d.ts +0 -34
- package/dist/src/utils/generator-utility.js.map +0 -1
- package/dist/src/utils/math-utility.js.map +0 -1
- package/dist/src/utils/objects-utility.js.map +0 -1
- package/dist/src/utils/regex-utility.js.map +0 -1
- package/dist/tests/excel-generator.test.d.ts +0 -1
- package/dist/tests/excel-generator.test.js +0 -406
- package/dist/tests/excel-generator.test.js.map +0 -1
- /package/dist/{src/utils → utils}/objects-utility.d.ts +0 -0
- /package/dist/{src/utils → utils}/objects-utility.js +0 -0
- /package/dist/{src/utils → utils}/regex-utility.d.ts +0 -0
- /package/dist/{src/utils → utils}/regex-utility.js +0 -0
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import ExcelJS from "exceljs";
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { addFooterTotalsRow, getExcelColumnLetter, initializeWorksheet, setHeaderStyling, smeupFormulaToExcelFormula, } from "./commons.js";
|
|
2
|
+
import { getFilteredColumns, filterRows, updateMaxValueLength, calculateCellValue, hexToArgb, calculateValue, sortRows, } from "../../utils/commons-utility.js";
|
|
3
|
+
import { exportTypeSupportsFormatting, allowedTotals, } from "./excel-converter.types.js";
|
|
4
|
+
import { isColumnHidden } from "../../utils/datastructure-utility.js";
|
|
5
|
+
import { addFooterTotalsRow, getDistinctCount, getExcelColumnLetter, groupedCellFormatAttributes, initializeWorksheet, setHeaderStyling, smeupFormulaToExcelFormula, smeupFormulaToExcelValue, } from "./commons.js";
|
|
7
6
|
export const dataTableToExcelWorkbook = (component, fileFormat, webupManagerData) => {
|
|
8
7
|
// Create a new ExcelJS.Workbook and return it as a resolved Promise
|
|
9
8
|
const { smeupDataTable: smeupDataTable, props } = component;
|
|
@@ -23,20 +22,7 @@ export const dataTableToExcelWorkbook = (component, fileFormat, webupManagerData
|
|
|
23
22
|
// Filter and sort rows (if filters are available)
|
|
24
23
|
const rows = filterRows(smeupDataTable, filteredColumns, props?.filters);
|
|
25
24
|
if (activeGroups?.length > 0) {
|
|
26
|
-
|
|
27
|
-
rows.sort((a, b) => {
|
|
28
|
-
for (const group of activeGroups) {
|
|
29
|
-
const valA = a.cells && a.cells[group]?.value !== undefined
|
|
30
|
-
? a.cells[group]?.value
|
|
31
|
-
: "";
|
|
32
|
-
const valB = b.cells && b.cells[group]?.value !== undefined
|
|
33
|
-
? b.cells[group]?.value
|
|
34
|
-
: "";
|
|
35
|
-
if (valA !== valB)
|
|
36
|
-
return valA.localeCompare(valB);
|
|
37
|
-
}
|
|
38
|
-
return 0;
|
|
39
|
-
});
|
|
25
|
+
sortRows(rows, component.props.sort, activeGroups);
|
|
40
26
|
// Recursive grouping
|
|
41
27
|
rowNumber = insertDataTableGroupedRows(worksheet, rows, activeGroups, filteredColumns, smeupDataTable.columns, rowNumber, fileFormat, webupManagerData, 1, maxColumnValueLenght, (props?.totals ?? {}));
|
|
42
28
|
//INTERACTIVE GROUPS MANAGING
|
|
@@ -50,6 +36,7 @@ export const dataTableToExcelWorkbook = (component, fileFormat, webupManagerData
|
|
|
50
36
|
};
|
|
51
37
|
}
|
|
52
38
|
else {
|
|
39
|
+
sortRows(rows, component.props.sort);
|
|
53
40
|
// Process rows normally if no grouping
|
|
54
41
|
rowNumber = insertDataTableRows(worksheet, rows, filteredColumns, rowNumber, fileFormat, webupManagerData, maxColumnValueLenght);
|
|
55
42
|
}
|
|
@@ -122,7 +109,7 @@ const insertDataTableGroupedRows = (worksheet, rows, groups, filteredColumns, un
|
|
|
122
109
|
// Compute totals and format cells
|
|
123
110
|
for (const [colIndex, col] of filteredColumns.entries()) {
|
|
124
111
|
const cell = headerRow.getCell(colIndex + 1);
|
|
125
|
-
cell.numFmt =
|
|
112
|
+
cell.numFmt = getExcelNumFormatForGroupedRow(col, totals);
|
|
126
113
|
decorateHeaderRow(cell);
|
|
127
114
|
if (!totals)
|
|
128
115
|
continue;
|
|
@@ -134,7 +121,7 @@ const insertDataTableGroupedRows = (worksheet, rows, groups, filteredColumns, un
|
|
|
134
121
|
formula: smeupFormulaToExcelFormula(totalFormula.replace("MATH", ""), headerRowNumber - 1, filteredColumns),
|
|
135
122
|
}
|
|
136
123
|
: {
|
|
137
|
-
formula: getSubGroupTotalFormula(totalFormula, colIndex + 1, headerRowNumber + 1, lastDataRow),
|
|
124
|
+
formula: getSubGroupTotalFormula(worksheet, totalFormula, colIndex + 1, headerRowNumber + 1, lastDataRow),
|
|
138
125
|
};
|
|
139
126
|
}
|
|
140
127
|
}
|
|
@@ -150,10 +137,7 @@ const insertDataTableRows = (worksheet, rows, filteredColumns, rowNumber, fileFo
|
|
|
150
137
|
const cell = (row?.cells ?? {})[column.name];
|
|
151
138
|
updateMaxValueLength(maxColumnValueLenght, cell?.value, column.name);
|
|
152
139
|
return column.formula
|
|
153
|
-
? {
|
|
154
|
-
formula: `${smeupFormulaToExcelFormula(column.formula, rowNumber, filteredColumns)}`,
|
|
155
|
-
type: ValueType.Formula,
|
|
156
|
-
}
|
|
140
|
+
? calculateValue(smeupFormulaToExcelValue(column, filteredColumns, row?.cells ?? {}), cell.obj ?? { t: "", p: "", k: "" }, fileFormat, webupManagerData)
|
|
157
141
|
: calculateCellValue(cell, fileFormat, webupManagerData);
|
|
158
142
|
});
|
|
159
143
|
const newRow = worksheet.addRow(rowData);
|
|
@@ -178,8 +162,16 @@ export const addStyleToExceljsRow = (exceljsRow, columns, row) => {
|
|
|
178
162
|
Object.keys(row.style ?? {}).length > 0) {
|
|
179
163
|
cellToXlsxStyleConverter(smeupCellWithStyle, cell, row.style);
|
|
180
164
|
}
|
|
165
|
+
else if (smeupCell) {
|
|
166
|
+
applyDefaultXlsxCellStyle(smeupCell, cell);
|
|
167
|
+
}
|
|
181
168
|
});
|
|
182
169
|
};
|
|
170
|
+
const applyDefaultXlsxCellStyle = (cell, xlsxCell) => {
|
|
171
|
+
if (typeof xlsxCell.value === "number" || xlsxCell.formula) {
|
|
172
|
+
xlsxCell.numFmt = getExcelNumFormat(cell.data?.decimals ?? 0, cell.data?.integers ?? 0);
|
|
173
|
+
}
|
|
174
|
+
};
|
|
183
175
|
/**
|
|
184
176
|
* Converts SmeupDataCell.style attributes to ExcelJS styles
|
|
185
177
|
* @param cell SmeupDataCell - The TBL cell containing styless
|
|
@@ -187,6 +179,7 @@ export const addStyleToExceljsRow = (exceljsRow, columns, row) => {
|
|
|
187
179
|
* @returns any
|
|
188
180
|
*/
|
|
189
181
|
const cellToXlsxStyleConverter = (cell, xlsxCell, optionalRowStyles) => {
|
|
182
|
+
applyDefaultXlsxCellStyle(cell, xlsxCell);
|
|
190
183
|
const cellStyle = optionalRowStyles ?? cell?.style;
|
|
191
184
|
if (!cellStyle)
|
|
192
185
|
return;
|
|
@@ -214,8 +207,14 @@ const cellToXlsxStyleConverter = (cell, xlsxCell, optionalRowStyles) => {
|
|
|
214
207
|
color: { argb: hexToArgb(cellStyle.color) },
|
|
215
208
|
};
|
|
216
209
|
}
|
|
217
|
-
|
|
218
|
-
|
|
210
|
+
};
|
|
211
|
+
export const getExcelNumFormatForGroupedRow = (column, totals) => {
|
|
212
|
+
const totalOperation = totals?.[column.name];
|
|
213
|
+
if (totalOperation === "Distinct") {
|
|
214
|
+
return "0"; // Distinct count does not require decimals
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
return getExcelNumFormat(column.decimals ?? 0, column.integers ?? 0);
|
|
219
218
|
}
|
|
220
219
|
};
|
|
221
220
|
export const getExcelNumFormat = (cellDecimals, cellIntegers) => {
|
|
@@ -238,22 +237,20 @@ export const getExcelNumFormat = (cellDecimals, cellIntegers) => {
|
|
|
238
237
|
return numFmt;
|
|
239
238
|
};
|
|
240
239
|
const decorateHeaderRow = (headerCell) => {
|
|
241
|
-
headerCell
|
|
242
|
-
headerCell.alignment = { horizontal: "left" };
|
|
243
|
-
headerCell.fill = {
|
|
244
|
-
type: "pattern",
|
|
245
|
-
pattern: "solid",
|
|
246
|
-
fgColor: { argb: `${hexToArgb("e0e0e0")}` },
|
|
247
|
-
};
|
|
240
|
+
Object.assign(headerCell, groupedCellFormatAttributes);
|
|
248
241
|
};
|
|
249
|
-
const getSubGroupTotalFormula = (totalOperation, colIndex, firstDataRow, lastDataRow) => {
|
|
242
|
+
const getSubGroupTotalFormula = (worksheet, totalOperation, colIndex, firstDataRow, lastDataRow) => {
|
|
250
243
|
const columnExcelLetter = getExcelColumnLetter(colIndex);
|
|
251
244
|
if (!allowedTotals[totalOperation]) {
|
|
252
245
|
console.warn(`Total operation [' ${totalOperation} '] is not supported`, "exportUtils.ts");
|
|
253
246
|
return "";
|
|
254
247
|
}
|
|
255
|
-
|
|
256
|
-
|
|
248
|
+
if (totalOperation === "Distinct") {
|
|
249
|
+
return getDistinctCount(`${columnExcelLetter}${firstDataRow}:${columnExcelLetter}${lastDataRow}`, worksheet);
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
return `${allowedTotals[totalOperation]}${columnExcelLetter}${firstDataRow}:${columnExcelLetter}${lastDataRow})`;
|
|
253
|
+
}
|
|
257
254
|
};
|
|
258
255
|
const ensureGroupRowHasDescription = (worksheet) => {
|
|
259
256
|
const firstVisibleColumnIndex = getFirstVisibleColumn(worksheet);
|
|
@@ -296,4 +293,4 @@ const applyDataTableOutlineLevels = (worksheet) => {
|
|
|
296
293
|
}
|
|
297
294
|
});
|
|
298
295
|
};
|
|
299
|
-
//# sourceMappingURL=matrix-
|
|
296
|
+
//# sourceMappingURL=matrix-converter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matrix-converter.js","sourceRoot":"","sources":["../../../src/converters/excel/matrix-converter.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Properties as CSSProperties } from \"csstype\";\nimport ExcelJS, { Worksheet, Cell } from \"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 calculateValue,\n sortRows,\n} from \"../../utils/commons-utility.js\";\nimport {\n exportTypeSupportsFormatting,\n allowedTotals,\n} from \"./excel-converter.types.js\";\nimport { isColumnHidden } from \"../../utils/datastructure-utility.js\";\nimport {\n addFooterTotalsRow,\n getDistinctCount,\n getExcelColumnLetter,\n groupedCellFormatAttributes,\n initializeWorksheet,\n setHeaderStyling,\n smeupFormulaToExcelFormula,\n smeupFormulaToExcelValue,\n} from \"./commons.js\";\nimport {\n SmeupDataCell,\n SmeupDataColumn,\n SmeupDataRow,\n SmeupDataTable,\n} from \"../../types/data-structures/smeupDataTable.js\";\nimport { SmeupDataNode } from \"../../types/data-structures/smeupDataTree.js\";\nimport { SortObject } from \"../../types/component-props.js\";\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 groupsArray: { column: string; visible: boolean }[] = Array.isArray(\n props?.groups,\n )\n ? props.groups\n : [];\n\n // Visible attribute is used only to determine if the column is visible,\n // ant not to determine if the group is active\n const activeGroups: string[] = groupsArray.map(\n (group: { column: string; visible: boolean }) => group.column,\n );\n\n const filteredColumns = getFilteredColumns(\n smeupDataTable.columns,\n props,\n groupsArray,\n );\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 // 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 sortRows(rows, component.props.sort as SortObject[], activeGroups);\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 sortRows(rows, component.props.sort as SortObject[]);\n\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 * 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 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 = getExcelNumFormatForGroupedRow(col, totals);\n decorateHeaderRow(cell);\n\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 worksheet,\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\n return column.formula\n ? calculateValue(\n smeupFormulaToExcelValue(column, filteredColumns, row?.cells ?? {}),\n cell.obj ?? { t: \"\", p: \"\", k: \"\" },\n fileFormat,\n webupManagerData,\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 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 } else if (smeupCell) {\n applyDefaultXlsxCellStyle(smeupCell, cell);\n }\n });\n};\n\nconst applyDefaultXlsxCellStyle = (cell: SmeupDataCell, xlsxCell: Cell) => {\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\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 applyDefaultXlsxCellStyle(cell, xlsxCell);\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\nexport const getExcelNumFormatForGroupedRow = (\n column: SmeupDataColumn,\n totals: Record<string, string>,\n): string => {\n const totalOperation: string = totals?.[column.name];\n if (totalOperation === \"Distinct\") {\n return \"0\"; // Distinct count does not require decimals\n } else {\n return getExcelNumFormat(column.decimals ?? 0, column.integers ?? 0);\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 Object.assign(headerCell, groupedCellFormatAttributes);\n};\n\nconst getSubGroupTotalFormula = (\n worksheet: ExcelJS.Worksheet,\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 if (totalOperation === \"Distinct\") {\n return getDistinctCount(\n `${columnExcelLetter}${firstDataRow}:${columnExcelLetter}${lastDataRow}`,\n worksheet,\n );\n } else {\n return `${allowedTotals[totalOperation]}${columnExcelLetter}${firstDataRow}:${columnExcelLetter}${lastDataRow})`;\n }\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"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { GenericObject, SupportedExportFormats, WebupManagerData } from "../types/index.js";
|
|
1
|
+
import { GenericObject, SupportedExportFormats, WebupManagerData } from "../../types/index.js";
|
|
3
2
|
import ExcelJS from "exceljs";
|
|
3
|
+
import { SmeupDataTree } from "../../types/data-structures/smeupDataTree.js";
|
|
4
4
|
export declare function dataTreeToExcelWorkbook(component: {
|
|
5
5
|
smeupDataTree: SmeupDataTree;
|
|
6
6
|
props: GenericObject;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { exportTypeSupportsFormatting } from "./excel-
|
|
1
|
+
import { exportTypeSupportsFormatting } from "./excel-converter.types.js";
|
|
2
2
|
import ExcelJS from "exceljs";
|
|
3
3
|
import { addFooterTotalsRow, initializeWorksheet, setHeaderStyling, } from "./commons.js";
|
|
4
|
-
import { isColumnHidden } from "
|
|
5
|
-
import { getFilteredColumns, calculateCellValue, } from "
|
|
6
|
-
import { addStyleToExceljsRow } from "./matrix-
|
|
4
|
+
import { isColumnHidden } from "../../utils/datastructure-utility.js";
|
|
5
|
+
import { getFilteredColumns, calculateCellValue, } from "../../utils/commons-utility.js";
|
|
6
|
+
import { addStyleToExceljsRow } from "./matrix-converter.js";
|
|
7
7
|
export async function dataTreeToExcelWorkbook(component, fileFormat, webupManagerData, splitNodesToColumns = true) {
|
|
8
8
|
const { smeupDataTree, props } = component;
|
|
9
9
|
const workbook = new ExcelJS.Workbook();
|
|
@@ -114,4 +114,4 @@ export const TREE_HEADER_COLUMN_NAME = "TREE_NODE_LVL_";
|
|
|
114
114
|
export const getTreeNodeColumnName = (level) => {
|
|
115
115
|
return `${TREE_HEADER_COLUMN_NAME}${level}`;
|
|
116
116
|
};
|
|
117
|
-
//# sourceMappingURL=tree-
|
|
117
|
+
//# sourceMappingURL=tree-converter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-converter.js","sourceRoot":"","sources":["../../../src/converters/excel/tree-converter.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n GenericObject,\n SupportedExportFormats,\n WebupManagerData,\n} from \"../../types/index.js\";\nimport { exportTypeSupportsFormatting } from \"./excel-converter.types.js\";\nimport ExcelJS from \"exceljs\";\nimport {\n addFooterTotalsRow,\n initializeWorksheet,\n setHeaderStyling,\n} from \"./commons.js\";\nimport { isColumnHidden } from \"../../utils/datastructure-utility.js\";\nimport {\n getFilteredColumns,\n calculateCellValue,\n} from \"../../utils/commons-utility.js\";\nimport { addStyleToExceljsRow } from \"./matrix-converter.js\";\nimport { SmeupDataColumn } from \"../../types/data-structures/smeupDataTable.js\";\nimport {\n SmeupDataTree,\n SmeupDataNode,\n} from \"../../types/data-structures/smeupDataTree.js\";\n\nexport async function dataTreeToExcelWorkbook(\n component: {\n smeupDataTree: SmeupDataTree;\n props: GenericObject;\n },\n fileFormat: SupportedExportFormats,\n webupManagerData: WebupManagerData,\n splitNodesToColumns = true,\n): Promise<ExcelJS.Workbook> {\n const { smeupDataTree, props } = component;\n const workbook = new ExcelJS.Workbook();\n const worksheet = initializeWorksheet(workbook);\n const columnsMaxWidth: { [columnName: string]: number } = {};\n\n // Add ExcelJS columns\n const headerColumns = addTreeColumns(\n worksheet,\n smeupDataTree.columns ?? [],\n smeupDataTree.children,\n splitNodesToColumns,\n props,\n );\n\n // Add ExcelJS rows\n addTreeNodeRows(\n worksheet,\n fileFormat,\n webupManagerData,\n columnsMaxWidth,\n headerColumns,\n smeupDataTree.children,\n splitNodesToColumns,\n );\n\n // Totals\n if (exportTypeSupportsFormatting[fileFormat] && props?.totals) {\n addFooterTotalsRow(worksheet, headerColumns, props, webupManagerData);\n }\n\n // Set ExcelJS columns width\n worksheet.columns.forEach(col => {\n if (col.key) {\n col.width = columnsMaxWidth[col.key] ?? 10;\n } else {\n col.width = 10;\n }\n });\n\n // Forces full calculation when the workbook is opened\n workbook.calcProperties = {\n fullCalcOnLoad: true,\n };\n return workbook;\n}\n\nconst addTreeColumns = (\n worksheet: ExcelJS.Worksheet,\n columns: SmeupDataColumn[],\n nodeRows: SmeupDataNode[],\n splitNodesToColumns: boolean,\n props: GenericObject,\n): SmeupDataColumn[] => {\n const addTreeNodeColumns = (\n nodeRows: SmeupDataNode[],\n nodeColumns: SmeupDataColumn[],\n level = 0,\n ) => {\n if (\n !nodeColumns.some(\n nodeColumn => nodeColumn.name === getTreeNodeColumnName(level),\n )\n ) {\n nodeColumns.push({\n name: getTreeNodeColumnName(level),\n title: `.${level + 1}`,\n });\n }\n\n nodeRows.forEach(row => {\n if (row.children?.length ?? 0 > 0) {\n addTreeNodeColumns(row.children ?? [], nodeColumns, level + 1);\n }\n });\n };\n\n const nodeColumns: SmeupDataColumn[] = [];\n if (splitNodesToColumns) {\n // New column for each tree node\n addTreeNodeColumns(nodeRows, nodeColumns);\n } else {\n // All tree nodes are under the same column\n nodeColumns.push({\n name: getTreeNodeColumnName(0),\n title: \"\",\n });\n }\n\n const filteredColumns: SmeupDataColumn[] = getFilteredColumns(columns, props);\n const headerColumns: SmeupDataColumn[] = [...nodeColumns, ...filteredColumns];\n\n /* Add ExcelJS columns*/\n worksheet.columns = headerColumns.map<Partial<ExcelJS.Column>>(column => ({\n header: column.title ?? \"\",\n key: column.name,\n hidden: isColumnHidden(column),\n }));\n // Add style to ExcelJS columns\n setHeaderStyling(worksheet, true);\n return headerColumns;\n};\n\nconst addTreeNodeRows = (\n worksheet: ExcelJS.Worksheet,\n fileFormat: SupportedExportFormats,\n webupManagerData: WebupManagerData,\n columnsMaxWidth: { [columnName: string]: number },\n columns: SmeupDataColumn[],\n nodeRows: SmeupDataNode[],\n splitNodesToColumns: boolean,\n level = 0,\n): void => {\n const getParsedRowData = (row: SmeupDataNode): (string | number | Date)[] => {\n return columns.map<string | number | Date>(column => {\n /* Set cell value */\n let cellValue: string | number | Date = \"\";\n\n if (column.name.includes(TREE_HEADER_COLUMN_NAME)) {\n /* Node column */\n if (!splitNodesToColumns) {\n // Level-based indentation\n const indent = ` `.repeat(level);\n cellValue = `${indent}${row.obj?.k}: ${row.value}`;\n } else if (column.name === getTreeNodeColumnName(level)) {\n // No indentation\n cellValue = `${row.obj?.k}: ${row.value}`;\n }\n } else {\n /* Standard column */\n cellValue = calculateCellValue(\n row.cells?.[column.name] ?? { value: \"\" },\n fileFormat,\n webupManagerData,\n );\n }\n\n /* Update column max width */\n const currentMaxWidth = columnsMaxWidth[column.name] ?? 10;\n const cellLength =\n cellValue instanceof Date ? 10 : cellValue.toString().length;\n columnsMaxWidth[column.name] = Math.max(currentMaxWidth, cellLength);\n\n return cellValue;\n });\n };\n\n nodeRows.forEach(row => {\n /* Add ExcelJS row */\n const parsedRowData = getParsedRowData(row);\n const exceljsRow = worksheet.addRow(parsedRowData);\n\n if (exportTypeSupportsFormatting[fileFormat]) {\n addStyleToExceljsRow(exceljsRow, columns, row);\n }\n\n if (row.children?.length ?? 0 > 0) {\n addTreeNodeRows(\n worksheet,\n fileFormat,\n webupManagerData,\n columnsMaxWidth,\n columns,\n row.children ?? [],\n splitNodesToColumns,\n level + 1,\n );\n }\n });\n};\n\nexport const TREE_HEADER_COLUMN_NAME = \"TREE_NODE_LVL_\";\n\nexport const getTreeNodeColumnName = (level: number) => {\n return `${TREE_HEADER_COLUMN_NAME}${level}`;\n};\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { SmeupDataTable, SmeupDataTree } from "@sme.up/kokos-sdk-node";
|
|
2
1
|
import { GenericObject, SupportedExportFormats, WebupManagerData } from "../types/index.js";
|
|
2
|
+
import { SmeupDataTable } from "../types/data-structures/smeupDataTable.js";
|
|
3
|
+
import { SmeupDataTree } from "../types/data-structures/smeupDataTree.js";
|
|
3
4
|
export declare const dataTableToExcelData: (component: {
|
|
4
5
|
smeupDataTable: SmeupDataTable;
|
|
5
6
|
props: GenericObject;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { SupportedExportFormats, } from "../types/index.js";
|
|
2
|
-
import { convertToBuffer } from "../utils/
|
|
3
|
-
import { dataTableToExcelWorkbook } from "./matrix-
|
|
4
|
-
import { dataTreeToExcelWorkbook } from "./tree-
|
|
2
|
+
import { convertToBuffer } from "../utils/commons-utility.js";
|
|
3
|
+
import { dataTableToExcelWorkbook } from "./excel/matrix-converter.js";
|
|
4
|
+
import { dataTreeToExcelWorkbook } from "./excel/tree-converter.js";
|
|
5
5
|
export const dataTableToExcelData = async (component, fileFormat, webupManagerData) => {
|
|
6
6
|
const workbook = dataTableToExcelWorkbook(component, fileFormat, webupManagerData);
|
|
7
7
|
return convertToStreamData(workbook, fileFormat);
|
|
@@ -28,4 +28,4 @@ const convertToStreamData = async (workbook, fileFormat) => {
|
|
|
28
28
|
throw new Error(`Unsupported export format: ${fileFormat}`);
|
|
29
29
|
}
|
|
30
30
|
};
|
|
31
|
-
//# sourceMappingURL=excel-
|
|
31
|
+
//# sourceMappingURL=excel-converter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"excel-converter.js","sourceRoot":"","sources":["../../src/converters/excel-converter.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,sBAAsB,GAEvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAEvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAIpE,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EACvC,SAGC,EACD,UAAkC,EAClC,gBAAkC,EACJ,EAAE;IAChC,MAAM,QAAQ,GAAG,wBAAwB,CACvC,SAAS,EACT,UAAU,EACV,gBAAgB,CACjB,CAAC;IAEF,OAAO,mBAAmB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AACnD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EACtC,SAGC,EACD,UAAkC,EAClC,gBAAkC,EACJ,EAAE;IAChC,MAAM,QAAQ,GAAG,MAAM,uBAAuB,CAC5C,SAAS,EACT,UAAU,EACV,gBAAgB,CACjB,CAAC;IAEF,OAAO,mBAAmB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AACnD,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,KAAK,EAC/B,QAAkB,EAClB,UAAkC,EACJ,EAAE;IAChC,kDAAkD;IAClD,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC;YACjC,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACrD,OAAO,eAAe,CAAC,UAAU,CAAC,CAAC;QACrC,CAAC;QACD,KAAK,sBAAsB,CAAC,GAAG,CAAC;QAChC,KAAK,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC;YAChC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC;gBAC/C,gBAAgB,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE;aACrC,CAAC,CAAC;YACH,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC;QACpC,CAAC;QACD;YACE,MAAM,IAAI,KAAK,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAC;IAChE,CAAC;AACH,CAAC,CAAC","sourcesContent":["import {\n GenericObject,\n SupportedExportFormats,\n WebupManagerData,\n} from \"../types/index.js\";\nimport { convertToBuffer } from \"../utils/commons-utility.js\";\nimport { dataTableToExcelWorkbook } from \"./excel/matrix-converter.js\";\nimport { Workbook } from \"exceljs\";\nimport { dataTreeToExcelWorkbook } from \"./excel/tree-converter.js\";\nimport { SmeupDataTable } from \"../types/data-structures/smeupDataTable.js\";\nimport { SmeupDataTree } from \"../types/data-structures/smeupDataTree.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 return convertToStreamData(workbook, fileFormat);\n};\n\nexport const dataTreeToExcelData = async (\n component: {\n smeupDataTree: SmeupDataTree;\n props: GenericObject;\n },\n fileFormat: SupportedExportFormats,\n webupManagerData: WebupManagerData,\n): Promise<Buffer | Uint8Array> => {\n const workbook = await dataTreeToExcelWorkbook(\n component,\n fileFormat,\n webupManagerData,\n );\n\n return convertToStreamData(workbook, fileFormat);\n};\n\nconst convertToStreamData = async (\n workbook: Workbook,\n fileFormat: SupportedExportFormats,\n): Promise<Buffer | Uint8Array> => {\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"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { SmeupDataTable } from "../../types/data-structures/smeupDataTable.js";
|
|
2
|
+
import { ChartOptions } from "../../types/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Converts SmeupDataTable to chart image buffer
|
|
5
|
+
* @param dataTable - SmeupDataTable containing the data
|
|
6
|
+
* @param chartType - Type of chart (bar, line, pie, scatter)
|
|
7
|
+
* @returns Promise<Buffer> containing the chart image
|
|
8
|
+
*/
|
|
9
|
+
export declare const dataTableToChart: (dataTable: SmeupDataTable, chartType: string, chartOptions: ChartOptions) => Promise<Buffer>;
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import * as echarts from "echarts";
|
|
2
|
+
/**
|
|
3
|
+
* Converts SmeupDataTable to chart image buffer
|
|
4
|
+
* @param dataTable - SmeupDataTable containing the data
|
|
5
|
+
* @param chartType - Type of chart (bar, line, pie, scatter)
|
|
6
|
+
* @returns Promise<Buffer> containing the chart image
|
|
7
|
+
*/
|
|
8
|
+
export const dataTableToChart = async (dataTable, chartType, chartOptions) => {
|
|
9
|
+
// Check if we're in Node.js or browser environment
|
|
10
|
+
const isNode = typeof window === "undefined";
|
|
11
|
+
if (isNode) {
|
|
12
|
+
return await generateChartInNode(dataTable, chartType, chartOptions);
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
return generateChartInBrowser(dataTable, chartType, chartOptions);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Generate chart in Node.js environment using canvas
|
|
20
|
+
*/
|
|
21
|
+
async function generateChartInNode(dataTable, chartType, chartOptions) {
|
|
22
|
+
try {
|
|
23
|
+
// Dynamic import for Node.js canvas
|
|
24
|
+
const { createCanvas } = await import("canvas");
|
|
25
|
+
const width = Number(chartOptions.Width);
|
|
26
|
+
const height = Number(chartOptions.Height);
|
|
27
|
+
// Create canvas
|
|
28
|
+
const canvas = createCanvas(width, height);
|
|
29
|
+
// Create a minimal DOM-like environment for ECharts
|
|
30
|
+
const mockElement = {
|
|
31
|
+
clientWidth: width,
|
|
32
|
+
clientHeight: width,
|
|
33
|
+
style: {},
|
|
34
|
+
addEventListener: () => { },
|
|
35
|
+
removeEventListener: () => { },
|
|
36
|
+
getAttribute: () => null,
|
|
37
|
+
setAttribute: () => { },
|
|
38
|
+
getContext: (type) => {
|
|
39
|
+
if (type === "2d") {
|
|
40
|
+
return canvas.getContext("2d");
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
},
|
|
44
|
+
appendChild: () => { },
|
|
45
|
+
removeChild: () => { },
|
|
46
|
+
ownerDocument: {
|
|
47
|
+
createElement: (tagName) => {
|
|
48
|
+
if (tagName === "canvas") {
|
|
49
|
+
return createCanvas(width, height);
|
|
50
|
+
}
|
|
51
|
+
return mockElement;
|
|
52
|
+
},
|
|
53
|
+
createElementNS: () => mockElement,
|
|
54
|
+
defaultView: {
|
|
55
|
+
getComputedStyle: () => ({ getPropertyValue: () => "" }),
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
// Initialize ECharts with the mock element
|
|
60
|
+
const chart = echarts.init(mockElement, null, {
|
|
61
|
+
renderer: "canvas",
|
|
62
|
+
useDirtyRect: false,
|
|
63
|
+
width: width,
|
|
64
|
+
height: height,
|
|
65
|
+
});
|
|
66
|
+
// Convert data table to chart configuration
|
|
67
|
+
const config = convertDataTableToChartConfig(dataTable, chartType, chartOptions);
|
|
68
|
+
// Set chart options
|
|
69
|
+
chart.setOption(config);
|
|
70
|
+
// Force render by calling resize
|
|
71
|
+
chart.resize();
|
|
72
|
+
// Get image buffer from canvas
|
|
73
|
+
const imageBuffer = canvas.toBuffer("image/jpeg");
|
|
74
|
+
// Cleanup
|
|
75
|
+
chart.dispose();
|
|
76
|
+
return imageBuffer;
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
console.error("Error generating chart in Node.js:", error);
|
|
80
|
+
throw new Error(`Failed to generate chart: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Generate chart in browser environment
|
|
85
|
+
*/
|
|
86
|
+
function generateChartInBrowser(dataTable, chartType, chartOptions) {
|
|
87
|
+
try {
|
|
88
|
+
const width = Number(chartOptions.Width);
|
|
89
|
+
const height = Number(chartOptions.height);
|
|
90
|
+
// Create temporary canvas element
|
|
91
|
+
const canvas = document.createElement("canvas");
|
|
92
|
+
canvas.width = width;
|
|
93
|
+
canvas.height = height;
|
|
94
|
+
canvas.style.position = "absolute";
|
|
95
|
+
canvas.style.left = "-9999px";
|
|
96
|
+
document.body.appendChild(canvas);
|
|
97
|
+
// Initialize ECharts with canvas
|
|
98
|
+
const chart = echarts.init(canvas, null, {
|
|
99
|
+
renderer: "canvas",
|
|
100
|
+
useDirtyRect: false,
|
|
101
|
+
width: width,
|
|
102
|
+
height: height,
|
|
103
|
+
});
|
|
104
|
+
// Convert data table to chart configuration
|
|
105
|
+
const config = convertDataTableToChartConfig(dataTable, chartType, chartOptions);
|
|
106
|
+
// Set chart options
|
|
107
|
+
chart.setOption(config);
|
|
108
|
+
// Get image data
|
|
109
|
+
const imageDataUrl = chart.getDataURL({
|
|
110
|
+
type: "jpeg",
|
|
111
|
+
pixelRatio: 1,
|
|
112
|
+
backgroundColor: "#fff",
|
|
113
|
+
});
|
|
114
|
+
// Convert data URL to buffer
|
|
115
|
+
const base64Data = imageDataUrl.replace(/^data:image\/jpeg;base64,/, "");
|
|
116
|
+
const imageBuffer = Buffer.from(base64Data, "base64");
|
|
117
|
+
// Cleanup
|
|
118
|
+
chart.dispose();
|
|
119
|
+
document.body.removeChild(canvas);
|
|
120
|
+
return imageBuffer;
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
console.error("Error generating chart in browser:", error);
|
|
124
|
+
throw new Error(`Failed to generate chart: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Convert SmeupDataTable to ECharts configuration
|
|
129
|
+
*/
|
|
130
|
+
function convertDataTableToChartConfig(dataTable, chartType, chartOptions) {
|
|
131
|
+
if (!dataTable.columns || !dataTable.rows || dataTable.rows.length === 0) {
|
|
132
|
+
throw new Error("Invalid data table: missing columns or rows");
|
|
133
|
+
}
|
|
134
|
+
// Get visible columns
|
|
135
|
+
const visibleColumns = dataTable.columns.filter(col => col.visible !== false);
|
|
136
|
+
if (visibleColumns.length < 2) {
|
|
137
|
+
throw new Error("Data table must have at least 2 visible columns for chart generation");
|
|
138
|
+
}
|
|
139
|
+
// First column is typically used for categories/labels
|
|
140
|
+
const categoryColumn = visibleColumns[0];
|
|
141
|
+
const seriesColumns = chartOptions.Series?.split("|");
|
|
142
|
+
if (!seriesColumns || seriesColumns.length === 0) {
|
|
143
|
+
throw new Error("Chart options must specify at least one series");
|
|
144
|
+
}
|
|
145
|
+
const dataColumns = seriesColumns
|
|
146
|
+
.map(name => visibleColumns.find(col => col.name === name))
|
|
147
|
+
.filter((column) => column !== undefined);
|
|
148
|
+
if (dataColumns.length === 0) {
|
|
149
|
+
throw new Error("No valid data columns found for chart series");
|
|
150
|
+
}
|
|
151
|
+
// Extract categories from first column
|
|
152
|
+
const categories = dataTable.rows.map(row => row.cells?.[categoryColumn.name]?.value?.toString() || "");
|
|
153
|
+
// Extract data series from remaining columns
|
|
154
|
+
const normalizedType = normalizeChartType(chartType);
|
|
155
|
+
const series = dataColumns.map(column => {
|
|
156
|
+
const data = dataTable.rows.map(row => {
|
|
157
|
+
const cellValue = row.cells?.[column.name]?.value;
|
|
158
|
+
return parseFloat(cellValue?.toString() || "0") || 0;
|
|
159
|
+
});
|
|
160
|
+
const seriesData = chartType.toLowerCase() === "pie"
|
|
161
|
+
? data.map((value, index) => ({ value, name: categories[index] }))
|
|
162
|
+
: data;
|
|
163
|
+
// Create properly typed series based on chart type
|
|
164
|
+
switch (normalizedType) {
|
|
165
|
+
case "pie":
|
|
166
|
+
return {
|
|
167
|
+
name: column.title || column.name,
|
|
168
|
+
type: "pie",
|
|
169
|
+
data: seriesData,
|
|
170
|
+
};
|
|
171
|
+
case "line":
|
|
172
|
+
return {
|
|
173
|
+
name: column.title || column.name,
|
|
174
|
+
type: "line",
|
|
175
|
+
data: seriesData,
|
|
176
|
+
lineStyle: { width: 8 },
|
|
177
|
+
};
|
|
178
|
+
case "bar":
|
|
179
|
+
return {
|
|
180
|
+
name: column.title || column.name,
|
|
181
|
+
type: "bar",
|
|
182
|
+
data: seriesData,
|
|
183
|
+
};
|
|
184
|
+
case "scatter":
|
|
185
|
+
return {
|
|
186
|
+
name: column.title || column.name,
|
|
187
|
+
type: "scatter",
|
|
188
|
+
data: seriesData,
|
|
189
|
+
};
|
|
190
|
+
default:
|
|
191
|
+
return {
|
|
192
|
+
name: column.title || column.name,
|
|
193
|
+
type: "bar",
|
|
194
|
+
data: seriesData,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
// Build chart configuration based on type
|
|
199
|
+
const config = {
|
|
200
|
+
tooltip: {
|
|
201
|
+
trigger: chartType.toLowerCase() === "pie" ? "item" : "axis",
|
|
202
|
+
},
|
|
203
|
+
series,
|
|
204
|
+
backgroundColor: "#fff",
|
|
205
|
+
textStyle: {
|
|
206
|
+
fontSize: 36,
|
|
207
|
+
},
|
|
208
|
+
};
|
|
209
|
+
// Add legend for multiple series or pie charts
|
|
210
|
+
if (series.length > 1 || chartType.toLowerCase() === "pie") {
|
|
211
|
+
config.legend = {
|
|
212
|
+
data: series.map(s => s.name),
|
|
213
|
+
textStyle: { fontSize: 32 },
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
// Add axes for non-pie charts
|
|
217
|
+
if (chartType.toLowerCase() !== "pie") {
|
|
218
|
+
config.xAxis = {
|
|
219
|
+
type: "category",
|
|
220
|
+
data: categories,
|
|
221
|
+
axisLabel: { fontSize: 32 },
|
|
222
|
+
};
|
|
223
|
+
config.yAxis = {
|
|
224
|
+
type: "value",
|
|
225
|
+
axisLabel: { fontSize: 32 },
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
return config;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Normalize chart type to ECharts supported types
|
|
232
|
+
*/
|
|
233
|
+
function normalizeChartType(chartType) {
|
|
234
|
+
const type = chartType.toLowerCase();
|
|
235
|
+
switch (type) {
|
|
236
|
+
case "bar":
|
|
237
|
+
case "column":
|
|
238
|
+
return "bar";
|
|
239
|
+
case "line":
|
|
240
|
+
return "line";
|
|
241
|
+
case "pie":
|
|
242
|
+
return "pie";
|
|
243
|
+
case "scatter":
|
|
244
|
+
return "scatter";
|
|
245
|
+
default:
|
|
246
|
+
console.warn(`Unknown chart type: ${chartType}, defaulting to bar`);
|
|
247
|
+
return "bar";
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=charts-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"charts-generator.js","sourceRoot":"","sources":["../../../src/converters/images/charts-generator.ts"],"names":[],"mappings":"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","sourcesContent":["import * as echarts from \"echarts\";\nimport type { EChartsOption } from \"echarts\";\nimport { SmeupDataTable } from \"../../types/data-structures/smeupDataTable.js\";\nimport { ChartOptions } from \"../../types/index.js\";\n\n/**\n * Converts SmeupDataTable to chart image buffer\n * @param dataTable - SmeupDataTable containing the data\n * @param chartType - Type of chart (bar, line, pie, scatter)\n * @returns Promise<Buffer> containing the chart image\n */\nexport const dataTableToChart = async (\n dataTable: SmeupDataTable,\n chartType: string,\n chartOptions: ChartOptions,\n): Promise<Buffer> => {\n // Check if we're in Node.js or browser environment\n const isNode = typeof window === \"undefined\";\n\n if (isNode) {\n return await generateChartInNode(dataTable, chartType, chartOptions);\n } else {\n return generateChartInBrowser(dataTable, chartType, chartOptions);\n }\n};\n\n/**\n * Generate chart in Node.js environment using canvas\n */\nasync function generateChartInNode(\n dataTable: SmeupDataTable,\n chartType: string,\n chartOptions: ChartOptions,\n): Promise<Buffer> {\n try {\n // Dynamic import for Node.js canvas\n const { createCanvas } = await import(\"canvas\");\n\n const width = Number(chartOptions.Width);\n const height = Number(chartOptions.Height);\n\n // Create canvas\n const canvas = createCanvas(width, height);\n\n // Create a minimal DOM-like environment for ECharts\n const mockElement = {\n clientWidth: width,\n clientHeight: width,\n style: {},\n addEventListener: () => {},\n removeEventListener: () => {},\n getAttribute: () => null,\n setAttribute: () => {},\n getContext: (type: string) => {\n if (type === \"2d\") {\n return canvas.getContext(\"2d\");\n }\n return null;\n },\n appendChild: () => {},\n removeChild: () => {},\n ownerDocument: {\n createElement: (tagName: string) => {\n if (tagName === \"canvas\") {\n return createCanvas(width, height);\n }\n return mockElement;\n },\n createElementNS: () => mockElement,\n defaultView: {\n getComputedStyle: () => ({ getPropertyValue: () => \"\" }),\n },\n },\n };\n\n // Initialize ECharts with the mock element\n const chart = echarts.init(mockElement as unknown as HTMLElement, null, {\n renderer: \"canvas\",\n useDirtyRect: false,\n width: width,\n height: height,\n });\n\n // Convert data table to chart configuration\n const config = convertDataTableToChartConfig(\n dataTable,\n chartType,\n chartOptions,\n );\n\n // Set chart options\n chart.setOption(config as EChartsOption);\n\n // Force render by calling resize\n chart.resize();\n\n // Get image buffer from canvas\n const imageBuffer = canvas.toBuffer(\"image/jpeg\");\n\n // Cleanup\n chart.dispose();\n\n return imageBuffer;\n } catch (error) {\n console.error(\"Error generating chart in Node.js:\", error);\n throw new Error(\n `Failed to generate chart: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\n/**\n * Generate chart in browser environment\n */\nfunction generateChartInBrowser(\n dataTable: SmeupDataTable,\n chartType: string,\n chartOptions: ChartOptions,\n): Buffer {\n try {\n const width = Number(chartOptions.Width);\n const height = Number(chartOptions.height);\n // Create temporary canvas element\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n canvas.style.position = \"absolute\";\n canvas.style.left = \"-9999px\";\n document.body.appendChild(canvas);\n\n // Initialize ECharts with canvas\n const chart = echarts.init(canvas, null, {\n renderer: \"canvas\",\n useDirtyRect: false,\n width: width,\n height: height,\n });\n\n // Convert data table to chart configuration\n const config = convertDataTableToChartConfig(\n dataTable,\n chartType,\n chartOptions,\n );\n\n // Set chart options\n chart.setOption(config as EChartsOption);\n\n // Get image data\n const imageDataUrl = chart.getDataURL({\n type: \"jpeg\",\n pixelRatio: 1,\n backgroundColor: \"#fff\",\n });\n\n // Convert data URL to buffer\n const base64Data = imageDataUrl.replace(/^data:image\\/jpeg;base64,/, \"\");\n const imageBuffer = Buffer.from(base64Data, \"base64\");\n\n // Cleanup\n chart.dispose();\n document.body.removeChild(canvas);\n\n return imageBuffer;\n } catch (error) {\n console.error(\"Error generating chart in browser:\", error);\n throw new Error(\n `Failed to generate chart: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\n/**\n * Convert SmeupDataTable to ECharts configuration\n */\nfunction convertDataTableToChartConfig(\n dataTable: SmeupDataTable,\n chartType: string,\n chartOptions: ChartOptions,\n): EChartsOption {\n if (!dataTable.columns || !dataTable.rows || dataTable.rows.length === 0) {\n throw new Error(\"Invalid data table: missing columns or rows\");\n }\n\n // Get visible columns\n const visibleColumns = dataTable.columns.filter(col => col.visible !== false);\n\n if (visibleColumns.length < 2) {\n throw new Error(\n \"Data table must have at least 2 visible columns for chart generation\",\n );\n }\n\n // First column is typically used for categories/labels\n const categoryColumn = visibleColumns[0];\n const seriesColumns = chartOptions.Series?.split(\"|\");\n if (!seriesColumns || seriesColumns.length === 0) {\n throw new Error(\"Chart options must specify at least one series\");\n }\n const dataColumns = seriesColumns\n .map(name => visibleColumns.find(col => col.name === name))\n .filter(\n (column): column is NonNullable<typeof column> => column !== undefined,\n );\n\n if (dataColumns.length === 0) {\n throw new Error(\"No valid data columns found for chart series\");\n }\n\n // Extract categories from first column\n const categories = dataTable.rows.map(\n row => row.cells?.[categoryColumn.name]?.value?.toString() || \"\",\n );\n\n // Extract data series from remaining columns\n const normalizedType = normalizeChartType(chartType);\n const series = dataColumns.map(column => {\n const data = dataTable.rows.map(row => {\n const cellValue = row.cells?.[column.name]?.value;\n return parseFloat(cellValue?.toString() || \"0\") || 0;\n });\n\n const seriesData =\n chartType.toLowerCase() === \"pie\"\n ? data.map((value, index) => ({ value, name: categories[index] }))\n : data;\n\n // Create properly typed series based on chart type\n switch (normalizedType) {\n case \"pie\":\n return {\n name: column.title || column.name,\n type: \"pie\" as const,\n data: seriesData,\n };\n case \"line\":\n return {\n name: column.title || column.name,\n type: \"line\" as const,\n data: seriesData,\n lineStyle: { width: 8 },\n };\n case \"bar\":\n return {\n name: column.title || column.name,\n type: \"bar\" as const,\n data: seriesData,\n };\n case \"scatter\":\n return {\n name: column.title || column.name,\n type: \"scatter\" as const,\n data: seriesData,\n };\n default:\n return {\n name: column.title || column.name,\n type: \"bar\" as const,\n data: seriesData,\n };\n }\n });\n\n // Build chart configuration based on type\n const config: EChartsOption = {\n tooltip: {\n trigger: chartType.toLowerCase() === \"pie\" ? \"item\" : \"axis\",\n },\n series,\n backgroundColor: \"#fff\",\n textStyle: {\n fontSize: 36,\n },\n };\n // Add legend for multiple series or pie charts\n if (series.length > 1 || chartType.toLowerCase() === \"pie\") {\n config.legend = {\n data: series.map(s => s.name),\n textStyle: { fontSize: 32 },\n };\n }\n\n // Add axes for non-pie charts\n if (chartType.toLowerCase() !== \"pie\") {\n config.xAxis = {\n type: \"category\",\n data: categories,\n axisLabel: { fontSize: 32 },\n };\n config.yAxis = {\n type: \"value\",\n axisLabel: { fontSize: 32 },\n };\n }\n\n return config;\n}\n\n/**\n * Normalize chart type to ECharts supported types\n */\nfunction normalizeChartType(chartType: string): string {\n const type = chartType.toLowerCase();\n switch (type) {\n case \"bar\":\n case \"column\":\n return \"bar\";\n case \"line\":\n return \"line\";\n case \"pie\":\n return \"pie\";\n case \"scatter\":\n return \"scatter\";\n default:\n console.warn(`Unknown chart type: ${chartType}, defaulting to bar`);\n return \"bar\";\n }\n}\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { UserOptions } from "jspdf-autotable";
|
|
2
|
+
import { CellStyleData, CellValueProps } from "./pdf-converter.types.js";
|
|
3
|
+
import { ConverterContext } from "../../types/converter.js";
|
|
4
|
+
export declare const getAutoTableOptions: (visibleHeaders: string[], data: CellValueProps[][], optimalFontSize: number, cellStyles: CellStyleData[][], context: ConverterContext) => UserOptions;
|