@sme.up/doc-alchemist 1.2.0-SNAPSHOT-20250716144831 → 1.2.0-SNAPSHOT-20250716151001

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import ExcelJS, { Worksheet } from "exceljs";
1
+ import ExcelJS, { Alignment, Fill, Worksheet } from "exceljs";
2
2
  import { GenericObject, WebupManagerData } from "../../types/index.js";
3
3
  import { SmeupDataCell, SmeupDataColumn } from "../../types/data-structures/smeupDataTable.js";
4
4
  /**
@@ -33,3 +33,11 @@ export declare const getDistinctCount: (range: string, worksheet: ExcelJS.Worksh
33
33
  * @returns Un array di ExcelJS.Cell dall'intervallo specificato, in ordine riga-major.
34
34
  */
35
35
  export declare const getCellsFromRange: (worksheet: ExcelJS.Worksheet, startRef: string, endRef: string) => ExcelJS.Cell[];
36
+ export declare const groupedCellFormatAttributes: {
37
+ font: {
38
+ bold: boolean;
39
+ };
40
+ alignment: Partial<Alignment>;
41
+ fill: Fill;
42
+ };
43
+ export declare const isGroupedCell: (cell: ExcelJS.Cell) => boolean;
@@ -213,4 +213,20 @@ export const getCellsFromRange = (worksheet, startRef, endRef) => {
213
213
  }
214
214
  return cells;
215
215
  };
216
+ export const groupedCellFormatAttributes = {
217
+ font: { bold: true },
218
+ alignment: { horizontal: "left" },
219
+ fill: {
220
+ type: "pattern",
221
+ pattern: "solid",
222
+ fgColor: { argb: "ffe0e0e0" },
223
+ },
224
+ };
225
+ export const isGroupedCell = (cell) => {
226
+ return (JSON.stringify({
227
+ font: cell.font,
228
+ alignment: cell.alignment,
229
+ fill: cell.fill,
230
+ }) === JSON.stringify(groupedCellFormatAttributes));
231
+ };
216
232
  //# sourceMappingURL=commons.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"commons.js","sourceRoot":"","sources":["../../../src/converters/excel/commons.ts"],"names":[],"mappings":"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","sourcesContent":["import ExcelJS, { Worksheet } from \"exceljs\";\nimport {\n allowedTotals,\n footerStyleFill,\n headerStyleFill,\n} from \"./excel-converter.types.js\";\nimport { GenericObject, WebupManagerData } from \"../../types/index.js\";\nimport { objectsIsDate } from \"../../utils/objects-utility.js\";\nimport { getExcelNumFormatForGroupedRow } from \"./matrix-converter.js\";\nimport {\n SmeupDataCell,\n SmeupDataColumn,\n} from \"../../types/data-structures/smeupDataTable.js\";\nimport { calculateExpression } from \"../../utils/math-utility.js\";\nconst { ValueType } = ExcelJS;\n\n/**\n * Adds creator, creation date to the workbook and creates a sheet\n * @param workbook\n * @returns void\n */\nexport const initializeWorksheet = (workbook: ExcelJS.Workbook) => {\n workbook.creator = \"/doc-alchemist - dataTable excel generator\";\n workbook.created = new Date();\n\n const worksheet = workbook.addWorksheet(\"Export\");\n return worksheet;\n};\n\nexport const setHeaderStyling = (\n worksheet: Worksheet,\n background = false,\n): 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\nexport const 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 worksheet,\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 = getExcelNumFormatForGroupedRow(column, totals);\n });\n};\n\nexport const 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\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 */\nexport const getTotalFormula = (\n worksheet: ExcelJS.Worksheet,\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 if (totalOperation === \"Distinct\") {\n return getDistinctCount(\n `${columnExcelLetter}${startRow}:${columnExcelLetter}${rowNumber}`,\n worksheet,\n );\n } else {\n return `${allowedTotals[totalOperation]}${columnExcelLetter}${startRow}:${columnExcelLetter}${rowNumber})`;\n }\n};\n\nexport const smeupFormulaToExcelFormula = (\n formula: string,\n rowNumber: number,\n filteredColumns: SmeupDataColumn[],\n): string => {\n const result = formula\n .replace(\"MATH\", \"\")\n .replace(/\\[([^\\]]+)\\]/g, (_, key) => {\n const columnIndex =\n filteredColumns.findIndex(col => col.name === key) + 1;\n const columnLetter = getExcelColumnLetter(columnIndex);\n return columnLetter && columnIndex\n ? `${columnLetter}${rowNumber + 1}`\n : key;\n })\n .replaceAll(\",\", \".\"); // Replace eventual , to . => The excel accepted decimal separator\n return result;\n};\n\nexport const smeupFormulaToExcelValue = (\n column: SmeupDataColumn,\n filteredColumns: SmeupDataColumn[],\n cells: Record<string, SmeupDataCell>,\n): string => {\n let resultValue: string | number = \"\";\n if (!column.formula) {\n return \"\";\n }\n const result = column.formula\n .replace(\"MATH\", \"\")\n .replace(/\\[([^\\]]+)\\]/g, (match, key) => {\n const columnIndex = filteredColumns.findIndex(col => col.name === key);\n return columnIndex >= 0\n ? (cells[key]?.value ?? \"\")\n : match === \"[SUM]\"\n ? match\n : key;\n });\n try {\n if (result === \"[SUM]\") {\n resultValue = applySUMFormula(column, filteredColumns, cells);\n } else {\n resultValue = calculateExpression(result);\n }\n } catch {\n resultValue = result; // If the formula fails, return the original formula\n }\n return resultValue.toString();\n};\n\nconst applySUMFormula = (\n column: SmeupDataColumn,\n filteredColumns: SmeupDataColumn[],\n cells: Record<string, SmeupDataCell>,\n): number => {\n let resultValue: number = 0;\n resultValue = 0;\n const index = filteredColumns.findIndex(col => col.name === column.name);\n filteredColumns.slice(0, index).forEach(col => {\n if (col.obj && col.obj.t === \"NR\") {\n let cellValue = 0;\n if (col.formula) {\n cellValue = Number(\n smeupFormulaToExcelValue(col, filteredColumns, cells),\n );\n } else {\n cellValue = Number(cells[col.name]?.value);\n }\n if (!isNaN(cellValue)) {\n resultValue = (resultValue as number) + cellValue;\n }\n }\n });\n return resultValue;\n};\n\nexport const getDistinctCount = (\n range: string,\n worksheet: ExcelJS.Worksheet,\n): string => {\n const column = range.split(\":\")[0].replace(/[0-9]/g, \"\"); // Extract column letter\n const startRow = parseInt(range.split(\":\")[0].replace(/\\D/g, \"\"), 10);\n const endRow = parseInt(range.split(\":\")[1].replace(/\\D/g, \"\"), 10);\n\n // Create a set to store unique values\n const uniqueValues = new Set<string>();\n\n for (let rowIndex = startRow; rowIndex <= endRow; rowIndex++) {\n const cell = worksheet.getCell(`${column}${rowIndex}`);\n if (cell.formula) continue;\n const cellValue = cell.value;\n if (cellValue !== null && cellValue !== undefined) {\n uniqueValues.add(cellValue.toString());\n }\n }\n\n return uniqueValues.size.toString();\n};\n\n/**\n * Estrae tutte le celle (ExcelJS.Cell) da un intervallo rettangolare specificato in un worksheet ExcelJS.\n *\n * L'intervallo è definito dai riferimenti di cella iniziale e finale (es. \"A1\" a \"C3\").\n * Restituisce le celle in ordine riga-major.\n *\n * @param worksheet - Il worksheet ExcelJS da cui estrarre le celle.\n * @param startRef - Il riferimento della cella iniziale (es. \"A1\").\n * @param endRef - Il riferimento della cella finale (es. \"C3\").\n * @returns Un array di ExcelJS.Cell dall'intervallo specificato, in ordine riga-major.\n */\nexport const getCellsFromRange = (\n worksheet: ExcelJS.Worksheet,\n startRef: string,\n endRef: string,\n): ExcelJS.Cell[] => {\n const parseCellRef = (ref: string) => {\n const match = ref.match(/^([A-Z]+)(\\d+)$/i);\n if (!match) return null;\n const col = match[1].toUpperCase();\n const row = parseInt(match[2], 10);\n return { col, row };\n };\n const colToIndex = (col: string) => {\n let idx = 0;\n for (let i = 0; i < col.length; i++) {\n idx = idx * 26 + (col.charCodeAt(i) - 64);\n }\n return idx;\n };\n const start = parseCellRef(startRef);\n const end = parseCellRef(endRef);\n if (!start || !end) return [];\n const cells: ExcelJS.Cell[] = [];\n for (let r = start.row; r <= end.row; r++) {\n for (let c = colToIndex(start.col); c <= colToIndex(end.col); c++) {\n const cell = worksheet.getRow(r).getCell(c);\n cells.push(cell);\n }\n }\n return cells;\n};\n"]}
1
+ {"version":3,"file":"commons.js","sourceRoot":"","sources":["../../../src/converters/excel/commons.ts"],"names":[],"mappings":"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","sourcesContent":["import ExcelJS, { Alignment, Fill, Worksheet } from \"exceljs\";\nimport {\n allowedTotals,\n footerStyleFill,\n headerStyleFill,\n} from \"./excel-converter.types.js\";\nimport { GenericObject, WebupManagerData } from \"../../types/index.js\";\nimport { objectsIsDate } from \"../../utils/objects-utility.js\";\nimport { getExcelNumFormatForGroupedRow } from \"./matrix-converter.js\";\nimport {\n SmeupDataCell,\n SmeupDataColumn,\n} from \"../../types/data-structures/smeupDataTable.js\";\nimport { calculateExpression } from \"../../utils/math-utility.js\";\nconst { ValueType } = ExcelJS;\n\n/**\n * Adds creator, creation date to the workbook and creates a sheet\n * @param workbook\n * @returns void\n */\nexport const initializeWorksheet = (workbook: ExcelJS.Workbook) => {\n workbook.creator = \"/doc-alchemist - dataTable excel generator\";\n workbook.created = new Date();\n\n const worksheet = workbook.addWorksheet(\"Export\");\n return worksheet;\n};\n\nexport const setHeaderStyling = (\n worksheet: Worksheet,\n background = false,\n): 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\nexport const 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 worksheet,\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 = getExcelNumFormatForGroupedRow(column, totals);\n });\n};\n\nexport const 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\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 */\nexport const getTotalFormula = (\n worksheet: ExcelJS.Worksheet,\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 if (totalOperation === \"Distinct\") {\n return getDistinctCount(\n `${columnExcelLetter}${startRow}:${columnExcelLetter}${rowNumber}`,\n worksheet,\n );\n } else {\n return `${allowedTotals[totalOperation]}${columnExcelLetter}${startRow}:${columnExcelLetter}${rowNumber})`;\n }\n};\n\nexport const smeupFormulaToExcelFormula = (\n formula: string,\n rowNumber: number,\n filteredColumns: SmeupDataColumn[],\n): string => {\n const result = formula\n .replace(\"MATH\", \"\")\n .replace(/\\[([^\\]]+)\\]/g, (_, key) => {\n const columnIndex =\n filteredColumns.findIndex(col => col.name === key) + 1;\n const columnLetter = getExcelColumnLetter(columnIndex);\n return columnLetter && columnIndex\n ? `${columnLetter}${rowNumber + 1}`\n : key;\n })\n .replaceAll(\",\", \".\"); // Replace eventual , to . => The excel accepted decimal separator\n return result;\n};\n\nexport const smeupFormulaToExcelValue = (\n column: SmeupDataColumn,\n filteredColumns: SmeupDataColumn[],\n cells: Record<string, SmeupDataCell>,\n): string => {\n let resultValue: string | number = \"\";\n if (!column.formula) {\n return \"\";\n }\n const result = column.formula\n .replace(\"MATH\", \"\")\n .replace(/\\[([^\\]]+)\\]/g, (match, key) => {\n const columnIndex = filteredColumns.findIndex(col => col.name === key);\n return columnIndex >= 0\n ? (cells[key]?.value ?? \"\")\n : match === \"[SUM]\"\n ? match\n : key;\n });\n try {\n if (result === \"[SUM]\") {\n resultValue = applySUMFormula(column, filteredColumns, cells);\n } else {\n resultValue = calculateExpression(result);\n }\n } catch {\n resultValue = result; // If the formula fails, return the original formula\n }\n return resultValue.toString();\n};\n\nconst applySUMFormula = (\n column: SmeupDataColumn,\n filteredColumns: SmeupDataColumn[],\n cells: Record<string, SmeupDataCell>,\n): number => {\n let resultValue: number = 0;\n resultValue = 0;\n const index = filteredColumns.findIndex(col => col.name === column.name);\n filteredColumns.slice(0, index).forEach(col => {\n if (col.obj && col.obj.t === \"NR\") {\n let cellValue = 0;\n if (col.formula) {\n cellValue = Number(\n smeupFormulaToExcelValue(col, filteredColumns, cells),\n );\n } else {\n cellValue = Number(cells[col.name]?.value);\n }\n if (!isNaN(cellValue)) {\n resultValue = (resultValue as number) + cellValue;\n }\n }\n });\n return resultValue;\n};\n\nexport const getDistinctCount = (\n range: string,\n worksheet: ExcelJS.Worksheet,\n): string => {\n const column = range.split(\":\")[0].replace(/[0-9]/g, \"\"); // Extract column letter\n const startRow = parseInt(range.split(\":\")[0].replace(/\\D/g, \"\"), 10);\n const endRow = parseInt(range.split(\":\")[1].replace(/\\D/g, \"\"), 10);\n\n // Create a set to store unique values\n const uniqueValues = new Set<string>();\n\n for (let rowIndex = startRow; rowIndex <= endRow; rowIndex++) {\n const cell = worksheet.getCell(`${column}${rowIndex}`);\n if (cell.formula) continue;\n const cellValue = cell.value;\n if (cellValue !== null && cellValue !== undefined) {\n uniqueValues.add(cellValue.toString());\n }\n }\n\n return uniqueValues.size.toString();\n};\n\n/**\n * Estrae tutte le celle (ExcelJS.Cell) da un intervallo rettangolare specificato in un worksheet ExcelJS.\n *\n * L'intervallo è definito dai riferimenti di cella iniziale e finale (es. \"A1\" a \"C3\").\n * Restituisce le celle in ordine riga-major.\n *\n * @param worksheet - Il worksheet ExcelJS da cui estrarre le celle.\n * @param startRef - Il riferimento della cella iniziale (es. \"A1\").\n * @param endRef - Il riferimento della cella finale (es. \"C3\").\n * @returns Un array di ExcelJS.Cell dall'intervallo specificato, in ordine riga-major.\n */\nexport const getCellsFromRange = (\n worksheet: ExcelJS.Worksheet,\n startRef: string,\n endRef: string,\n): ExcelJS.Cell[] => {\n const parseCellRef = (ref: string) => {\n const match = ref.match(/^([A-Z]+)(\\d+)$/i);\n if (!match) return null;\n const col = match[1].toUpperCase();\n const row = parseInt(match[2], 10);\n return { col, row };\n };\n const colToIndex = (col: string) => {\n let idx = 0;\n for (let i = 0; i < col.length; i++) {\n idx = idx * 26 + (col.charCodeAt(i) - 64);\n }\n return idx;\n };\n const start = parseCellRef(startRef);\n const end = parseCellRef(endRef);\n if (!start || !end) return [];\n const cells: ExcelJS.Cell[] = [];\n for (let r = start.row; r <= end.row; r++) {\n for (let c = colToIndex(start.col); c <= colToIndex(end.col); c++) {\n const cell = worksheet.getRow(r).getCell(c);\n cells.push(cell);\n }\n }\n return cells;\n};\n\nexport const groupedCellFormatAttributes = {\n font: { bold: true },\n alignment: { horizontal: \"left\" } as Partial<Alignment>,\n fill: {\n type: \"pattern\",\n pattern: \"solid\",\n fgColor: { argb: \"ffe0e0e0\" },\n } as Fill,\n};\n\nexport const isGroupedCell = (cell: ExcelJS.Cell): boolean => {\n return (\n JSON.stringify({\n font: cell.font,\n alignment: cell.alignment,\n fill: cell.fill,\n }) === JSON.stringify(groupedCellFormatAttributes)\n );\n};\n"]}
@@ -2,7 +2,7 @@ import ExcelJS from "exceljs";
2
2
  import { getFilteredColumns, filterRows, updateMaxValueLength, calculateCellValue, hexToArgb, calculateValue, sortRows, } from "../../utils/commons-utility.js";
3
3
  import { exportTypeSupportsFormatting, allowedTotals, } from "./excel-converter.types.js";
4
4
  import { isColumnHidden } from "../../utils/datastructure-utility.js";
5
- import { addFooterTotalsRow, getDistinctCount, getExcelColumnLetter, initializeWorksheet, setHeaderStyling, smeupFormulaToExcelFormula, smeupFormulaToExcelValue, } from "./commons.js";
5
+ import { addFooterTotalsRow, getDistinctCount, getExcelColumnLetter, groupedCellFormatAttributes, initializeWorksheet, setHeaderStyling, smeupFormulaToExcelFormula, smeupFormulaToExcelValue, } from "./commons.js";
6
6
  export const dataTableToExcelWorkbook = (component, fileFormat, webupManagerData) => {
7
7
  // Create a new ExcelJS.Workbook and return it as a resolved Promise
8
8
  const { smeupDataTable: smeupDataTable, props } = component;
@@ -237,13 +237,7 @@ export const getExcelNumFormat = (cellDecimals, cellIntegers) => {
237
237
  return numFmt;
238
238
  };
239
239
  const decorateHeaderRow = (headerCell) => {
240
- headerCell.font = { bold: true };
241
- headerCell.alignment = { horizontal: "left" };
242
- headerCell.fill = {
243
- type: "pattern",
244
- pattern: "solid",
245
- fgColor: { argb: `${hexToArgb("e0e0e0")}` },
246
- };
240
+ Object.assign(headerCell, groupedCellFormatAttributes);
247
241
  };
248
242
  const getSubGroupTotalFormula = (worksheet, totalOperation, colIndex, firstDataRow, lastDataRow) => {
249
243
  const columnExcelLetter = getExcelColumnLetter(colIndex);
@@ -1 +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 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 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 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
+ {"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"]}
@@ -5,7 +5,7 @@ export const getAutoTableOptions = (visibleHeaders, data, optimalFontSize, cellS
5
5
  head: [visibleHeaders],
6
6
  body: data.map(row => row.map(cell => cell.text)),
7
7
  startY: 20,
8
- margin: { left: 5, right: 5, top: 25, bottom: 10 },
8
+ margin: { left: 5, right: 5, top: 20, bottom: 10 },
9
9
  styles,
10
10
  columnStyles,
11
11
  headStyles,
@@ -18,7 +18,7 @@ const getTableStyles = (visibleHeaders, optimalFontSize) => {
18
18
  font: "helvetica",
19
19
  fontSize: optimalFontSize + 1,
20
20
  cellPadding: 1,
21
- overflow: "visible",
21
+ overflow: "linebreak",
22
22
  cellWidth: "auto",
23
23
  minCellWidth: 5,
24
24
  };
@@ -26,9 +26,9 @@ const getTableStyles = (visibleHeaders, optimalFontSize) => {
26
26
  ...Object.fromEntries(visibleHeaders.map((_, index) => [
27
27
  index,
28
28
  {
29
- cellWidth: "wrap",
29
+ cellWidth: "auto",
30
30
  halign: "left",
31
- overflow: "visible",
31
+ overflow: "linebreak",
32
32
  cellPadding: { top: 1, right: 1, bottom: 1, left: 1 },
33
33
  },
34
34
  ])),
@@ -48,18 +48,7 @@ const didParseCellHandler = (dataArg, cellStyles) => {
48
48
  const cellStyle = cellStyles[rowIndex]?.[colIndex];
49
49
  if (cellStyle) {
50
50
  // Apply styles from the Excel cell
51
- if (cellStyle.fontStyle) {
52
- dataArg.cell.styles.fontStyle = cellStyle.fontStyle;
53
- }
54
- if (cellStyle.textColor) {
55
- dataArg.cell.styles.textColor = cellStyle.textColor;
56
- }
57
- if (cellStyle.fillColor) {
58
- dataArg.cell.styles.fillColor = cellStyle.fillColor;
59
- }
60
- if (cellStyle.halign === "right") {
61
- dataArg.cell.styles.halign = "right";
62
- }
51
+ Object.assign(dataArg.cell.styles, cellStyle);
63
52
  }
64
53
  }
65
54
  };
@@ -1 +1 @@
1
- {"version":3,"file":"autotable-renderer.js","sourceRoot":"","sources":["../../../src/converters/pdf/autotable-renderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { UserOptions } from \"jspdf-autotable\";\nimport { CellStyleData, CellValueProps } from \"./pdf-converter.types.js\";\nimport type {\n Styles,\n OverflowType,\n FontStyle,\n CellHookData,\n HookData,\n} from \"jspdf-autotable\";\nimport { getLogoPositionAndDimension } from \"../../utils/image-utils.js\";\n\ntype TableStyles = {\n styles: Partial<Styles>;\n columnStyles: Record<string, Partial<Styles>>;\n headStyles: Partial<Styles>;\n};\n\nexport const getAutoTableOptions = (\n visibleHeaders: string[],\n data: CellValueProps[][],\n optimalFontSize: number,\n cellStyles: CellStyleData[][],\n header?: string,\n logoBase64?: string,\n): UserOptions => {\n const { styles, columnStyles, headStyles } = getTableStyles(\n visibleHeaders,\n optimalFontSize,\n );\n return {\n head: [visibleHeaders],\n body: data.map(row => row.map(cell => cell.text)),\n startY: 20,\n margin: { left: 5, right: 5, top: 25, bottom: 10 },\n styles,\n columnStyles,\n headStyles,\n didDrawPage: dataArg => didDrawPageHandler(dataArg, header, logoBase64),\n didParseCell: dataArg => didParseCellHandler(dataArg, cellStyles),\n };\n};\n\nconst getTableStyles = (\n visibleHeaders: string[],\n optimalFontSize: number,\n): TableStyles => {\n const styles: Partial<Styles> = {\n font: \"helvetica\",\n fontSize: optimalFontSize + 1,\n cellPadding: 1,\n overflow: \"visible\" as OverflowType,\n cellWidth: \"auto\",\n minCellWidth: 5,\n };\n\n const columnStyles: { [key: string]: Partial<Styles> } = {\n ...Object.fromEntries(\n visibleHeaders.map((_, index) => [\n index,\n {\n cellWidth: \"wrap\",\n halign: \"left\",\n overflow: \"visible\" as OverflowType,\n cellPadding: { top: 1, right: 1, bottom: 1, left: 1 },\n },\n ]),\n ),\n };\n\n const headStyles: Partial<Styles> = {\n fillColor: [255, 0, 0],\n textColor: [255, 255, 255],\n fontStyle: \"bold\" as FontStyle,\n halign: \"center\",\n };\n\n return { styles, columnStyles, headStyles };\n};\n\nconst didParseCellHandler = (\n dataArg: CellHookData,\n cellStyles: CellStyleData[][],\n) => {\n if (dataArg.section === \"body\") {\n const rowIndex = dataArg.row.index;\n const colIndex = dataArg.column.index;\n const cellStyle = cellStyles[rowIndex]?.[colIndex];\n\n if (cellStyle) {\n // Apply styles from the Excel cell\n if (cellStyle.fontStyle) {\n dataArg.cell.styles.fontStyle = cellStyle.fontStyle;\n }\n if (cellStyle.textColor) {\n dataArg.cell.styles.textColor = cellStyle.textColor;\n }\n if (cellStyle.fillColor) {\n dataArg.cell.styles.fillColor = cellStyle.fillColor;\n }\n if (cellStyle.halign === \"right\") {\n dataArg.cell.styles.halign = \"right\";\n }\n }\n }\n};\n\nconst didDrawPageHandler = (\n dataArg: HookData,\n header?: string,\n logoBase64?: string,\n) => {\n const pageWidth = dataArg.doc.internal.pageSize.getWidth();\n\n // Add the logo on each page\n if (logoBase64) {\n const { logoWidth, logoHeight, logoX, logoY } = getLogoPositionAndDimension(\n dataArg.doc,\n logoBase64,\n );\n\n const textFontSize = 14;\n const textX = 5;\n const textY = 10;\n dataArg.doc.setFontSize(textFontSize);\n dataArg.doc.setFont(\"helvetica\", \"normal\");\n dataArg.doc.text(\n dataArg.doc.splitTextToSize(header, pageWidth - 20),\n textX,\n textY,\n { align: \"left\" },\n );\n\n try {\n dataArg.doc.addImage(\n logoBase64,\n \"PNG\",\n logoX,\n logoY,\n logoWidth,\n logoHeight,\n );\n } catch (error) {\n console.warn(\"Error adding logo:\", error);\n }\n }\n};\n"]}
1
+ {"version":3,"file":"autotable-renderer.js","sourceRoot":"","sources":["../../../src/converters/pdf/autotable-renderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { UserOptions } from \"jspdf-autotable\";\nimport { CellStyleData, CellValueProps } from \"./pdf-converter.types.js\";\nimport type {\n Styles,\n OverflowType,\n FontStyle,\n CellHookData,\n HookData,\n} from \"jspdf-autotable\";\nimport { getLogoPositionAndDimension } from \"../../utils/image-utils.js\";\n\ntype TableStyles = {\n styles: Partial<Styles>;\n columnStyles: Record<string, Partial<Styles>>;\n headStyles: Partial<Styles>;\n};\n\nexport const getAutoTableOptions = (\n visibleHeaders: string[],\n data: CellValueProps[][],\n optimalFontSize: number,\n cellStyles: CellStyleData[][],\n header?: string,\n logoBase64?: string,\n): UserOptions => {\n const { styles, columnStyles, headStyles } = getTableStyles(\n visibleHeaders,\n optimalFontSize,\n );\n return {\n head: [visibleHeaders],\n body: data.map(row => row.map(cell => cell.text)),\n startY: 20,\n margin: { left: 5, right: 5, top: 20, bottom: 10 },\n styles,\n columnStyles,\n headStyles,\n didDrawPage: dataArg => didDrawPageHandler(dataArg, header, logoBase64),\n didParseCell: dataArg => didParseCellHandler(dataArg, cellStyles),\n };\n};\n\nconst getTableStyles = (\n visibleHeaders: string[],\n optimalFontSize: number,\n): TableStyles => {\n const styles: Partial<Styles> = {\n font: \"helvetica\",\n fontSize: optimalFontSize + 1,\n cellPadding: 1,\n overflow: \"linebreak\" as OverflowType,\n cellWidth: \"auto\",\n minCellWidth: 5,\n };\n\n const columnStyles: { [key: string]: Partial<Styles> } = {\n ...Object.fromEntries(\n visibleHeaders.map((_, index) => [\n index,\n {\n cellWidth: \"auto\",\n halign: \"left\",\n overflow: \"linebreak\" as OverflowType,\n cellPadding: { top: 1, right: 1, bottom: 1, left: 1 },\n },\n ]),\n ),\n };\n\n const headStyles: Partial<Styles> = {\n fillColor: [255, 0, 0],\n textColor: [255, 255, 255],\n fontStyle: \"bold\" as FontStyle,\n halign: \"center\",\n };\n\n return { styles, columnStyles, headStyles };\n};\n\nconst didParseCellHandler = (\n dataArg: CellHookData,\n cellStyles: CellStyleData[][],\n) => {\n if (dataArg.section === \"body\") {\n const rowIndex = dataArg.row.index;\n const colIndex = dataArg.column.index;\n const cellStyle = cellStyles[rowIndex]?.[colIndex];\n\n if (cellStyle) {\n // Apply styles from the Excel cell\n Object.assign(dataArg.cell.styles, cellStyle);\n }\n }\n};\n\nconst didDrawPageHandler = (\n dataArg: HookData,\n header?: string,\n logoBase64?: string,\n) => {\n const pageWidth = dataArg.doc.internal.pageSize.getWidth();\n\n // Add the logo on each page\n if (logoBase64) {\n const { logoWidth, logoHeight, logoX, logoY } = getLogoPositionAndDimension(\n dataArg.doc,\n logoBase64,\n );\n\n const textFontSize = 14;\n const textX = 5;\n const textY = 10;\n dataArg.doc.setFontSize(textFontSize);\n dataArg.doc.setFont(\"helvetica\", \"normal\");\n dataArg.doc.text(\n dataArg.doc.splitTextToSize(header, pageWidth - 20),\n textX,\n textY,\n { align: \"left\" },\n );\n\n try {\n dataArg.doc.addImage(\n logoBase64,\n \"PNG\",\n logoX,\n logoY,\n logoWidth,\n logoHeight,\n );\n } catch (error) {\n console.warn(\"Error adding logo:\", error);\n }\n }\n};\n"]}
@@ -3,6 +3,7 @@ import autoTable from "jspdf-autotable";
3
3
  import { convertColorToRgb } from "../../utils/commons-utility.js";
4
4
  import { getCellValueData } from "./formulas-helper.js";
5
5
  import { getAutoTableOptions } from "./autotable-renderer.js";
6
+ import { isGroupedCell } from "../excel/commons.js";
6
7
  /**
7
8
  * Converts an ExcelJS worksheet into a PDF document using jsPDF and autoTable.
8
9
  *
@@ -111,8 +112,6 @@ const extractData = (worksheet, visibleColumnIndexes, webupManagerData) => {
111
112
  visibleColumnIndexes.forEach(colIdx => {
112
113
  const cell = row.getCell(colIdx);
113
114
  const cellValue = getCellValueData(cell, worksheet, webupManagerData);
114
- // Preserve spaces by replacing them with non-breaking spaces
115
- cellValue.text = cellValue.text.replace(/ /g, "\u00A0");
116
115
  rowData.push(cellValue);
117
116
  });
118
117
  data.push(rowData);
@@ -167,6 +166,10 @@ const extractStyles = (worksheet, visibleColumnIndexes, rawData) => {
167
166
  if (rawData[rowIndex - 2][index].type === "number") {
168
167
  cellStyle.halign = "right";
169
168
  }
169
+ if (isGroupedCell(cell)) {
170
+ cellStyle.cellWidth = "wrap";
171
+ cellStyle.overflow = "visible";
172
+ }
170
173
  rowStyles.push(cellStyle);
171
174
  });
172
175
  cellStyles.push(rowStyles);
@@ -1 +1 @@
1
- {"version":3,"file":"matrix-converter.js","sourceRoot":"","sources":["../../../src/converters/pdf/matrix-converter.ts"],"names":[],"mappings":"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","sourcesContent":["import * as jsPDFModule from \"jspdf\";\nimport ExcelJS from \"exceljs\";\nimport autoTable from \"jspdf-autotable\";\nimport { WebupManagerData } from \"../../index.js\";\nimport { CellStyleData, CellValueProps } from \"./pdf-converter.types.js\";\nimport { convertColorToRgb } from \"../../utils/commons-utility.js\";\nimport { getCellValueData } from \"./formulas-helper.js\";\nimport { getAutoTableOptions } from \"./autotable-renderer.js\";\n\n/**\n * Converts an ExcelJS worksheet into a PDF document using jsPDF and autoTable.\n *\n * This function extracts visible headers and data from the provided worksheet,\n * applies cell styles, simulates Excel cell overflow, and calculates the optimal\n * font size for the table. It then generates a PDF document with the formatted\n * table and returns the resulting jsPDF instance.\n *\n * @param worksheet - The ExcelJS worksheet to convert to PDF.\n * @param webupManagerData - Additional data required for extracting worksheet content.\n * @returns A Promise that resolves to a jsPDF document containing the worksheet data as a table.\n */\nexport const dataTableToPdfDoc = async (\n worksheet: ExcelJS.Worksheet,\n webupManagerData: WebupManagerData,\n header?: string,\n logoBase64?: string,\n): Promise<jsPDFModule.jsPDF> => {\n const doc = new jsPDFModule.jsPDF({ orientation: \"landscape\" });\n doc.setFont(\"helvetica\", \"normal\");\n doc.setFontSize(10);\n\n // Extract headers and column indexes\n const { visibleHeaders, visibleColumnIndexes } =\n extractVisibleHeadersAndIndexes(worksheet);\n\n // Extract data and cell styles separately\n const data = extractData(worksheet, visibleColumnIndexes, webupManagerData);\n const cellStyles = extractStyles(worksheet, visibleColumnIndexes, data);\n\n // Post-process data to simulate Excel overflow\n postProcessExcelOverflow(data, cellStyles);\n\n // Calculate optimal font size based on data\n const pageWidth = doc.internal.pageSize.getWidth();\n const optimalFontSize = calculateOptimalFontSize(\n data,\n visibleHeaders,\n pageWidth,\n );\n\n autoTable(\n doc,\n getAutoTableOptions(\n visibleHeaders,\n data,\n optimalFontSize,\n cellStyles,\n header,\n logoBase64,\n ),\n );\n\n return doc;\n};\n\n// Function to calculate the optimal font size\nconst calculateOptimalFontSize = (\n data: CellValueProps[][],\n visibleHeaders: string[],\n pageWidth: number,\n): number => {\n const maxSamples = Math.min(100, data.length); // Analyze max 100 rows\n const availableWidth = pageWidth - 20; // Margins\n const numColumns = visibleHeaders.length;\n\n // If there are few columns, we can allow a larger font size\n if (numColumns <= 3) {\n return 10;\n }\n\n // Calculate more accurate statistics per column\n const columnStats = visibleHeaders.map((header, colIndex) => {\n const lengths: number[] = [header.length];\n\n // Collect all cell lengths for this column\n for (let rowIndex = 0; rowIndex < maxSamples; rowIndex++) {\n if (data[rowIndex] && data[rowIndex][colIndex]) {\n const cellLength = data[rowIndex][colIndex].text.replace(\n /\\u00A0/g,\n \" \",\n ).length;\n lengths.push(cellLength);\n }\n }\n\n lengths.sort((a, b) => a - b);\n\n // Use the 90th percentile instead of the maximum to be less conservative\n const percentile90Index = Math.floor(lengths.length * 0.9);\n const effectiveWidth =\n lengths[percentile90Index] || lengths[lengths.length - 1];\n\n // The average length to balance very long columns with short ones\n const avgLength =\n lengths.reduce((sum, len) => sum + len, 0) / lengths.length;\n\n return {\n max: Math.max(...lengths),\n p90: effectiveWidth,\n avg: avgLength,\n min: Math.min(...lengths),\n };\n });\n\n // Use a mixed strategy: combine 90th percentile with weighted average\n const estimatedColumnWidths = columnStats.map(stats => {\n // Weight the average more than the 90th percentile to be less pessimistic\n const weightedWidth = stats.avg * 0.7 + stats.p90 * 0.3;\n return Math.max(weightedWidth, 3); // Minimum width of 3 characters\n });\n\n // Try different font sizes starting from the largest\n for (let testFontSize = 10; testFontSize >= 4; testFontSize -= 0.5) {\n // More optimistic factor based on font size\n const charWidthFactor =\n testFontSize >= 8 ? 3.2 : testFontSize >= 6 ? 2.8 : 2.5;\n\n const estimatedTotalWidth = estimatedColumnWidths.reduce(\n (sum, width) => sum + width * charWidthFactor,\n 0,\n );\n\n // Add a margin for columns (space between columns)\n const totalWidthWithMargins = estimatedTotalWidth + numColumns * 10; // 10px between columns\n\n if (totalWidthWithMargins <= availableWidth) {\n return testFontSize;\n }\n }\n\n return 4; // Minimum font size if nothing fits\n};\n\n/**\n * Extracts visible headers and their column indexes from the worksheet (ignoring hidden columns).\n */\nconst extractVisibleHeadersAndIndexes = (\n worksheet: ExcelJS.Worksheet,\n): { visibleHeaders: string[]; visibleColumnIndexes: number[] } => {\n const headerRow = worksheet.getRow(1);\n const visibleHeaders: string[] = [];\n const visibleColumnIndexes: number[] = [];\n headerRow.eachCell({ includeEmpty: true }, (cell, colNumber) => {\n const column = worksheet.getColumn(colNumber);\n if (!column.hidden) {\n visibleHeaders.push(cell?.toString() ?? \"\");\n visibleColumnIndexes.push(colNumber);\n }\n });\n return { visibleHeaders, visibleColumnIndexes };\n};\n\n/**\n * Extracts the data from the worksheet for the given visible columns, formatting dates and preserving spaces.\n */\nconst extractData = (\n worksheet: ExcelJS.Worksheet,\n visibleColumnIndexes: number[],\n webupManagerData: WebupManagerData,\n): CellValueProps[][] => {\n const data: CellValueProps[][] = [];\n worksheet.eachRow((row, rowIndex) => {\n if (rowIndex === 1) return; // Skip header\n const rowData: CellValueProps[] = [];\n visibleColumnIndexes.forEach(colIdx => {\n const cell = row.getCell(colIdx);\n const cellValue = getCellValueData(cell, worksheet, webupManagerData);\n // Preserve spaces by replacing them with non-breaking spaces\n cellValue.text = cellValue.text.replace(/ /g, \"\\u00A0\");\n rowData.push(cellValue);\n });\n data.push(rowData);\n });\n return data;\n};\n\n/**\n * Extracts the cell styles (font, color, fill) for the given visible columns from the worksheet.\n */\nconst extractStyles = (\n worksheet: ExcelJS.Worksheet,\n visibleColumnIndexes: number[],\n rawData: CellValueProps[][],\n): CellStyleData[][] => {\n const cellStyles: CellStyleData[][] = [];\n worksheet.eachRow((row, rowIndex) => {\n if (rowIndex === 1) return; // Skip header\n const rowStyles: CellStyleData[] = [];\n visibleColumnIndexes.forEach((colIdx, index) => {\n const cell = row.getCell(colIdx);\n const cellStyle: CellStyleData = {};\n // Font\n if (cell.font) {\n if (cell.font.bold && cell.font.italic) {\n cellStyle.fontStyle = \"bolditalic\";\n } else if (cell.font.bold) {\n cellStyle.fontStyle = \"bold\";\n } else if (cell.font.italic) {\n cellStyle.fontStyle = \"italic\";\n } else {\n cellStyle.fontStyle = \"normal\";\n }\n if (cell.font.color?.argb) {\n const color = cell.font.color.argb;\n const [r, g, b] = convertColorToRgb(color);\n if (!isNaN(r) && !isNaN(g) && !isNaN(b)) {\n cellStyle.textColor = [r, g, b];\n }\n }\n }\n // Fill (background color)\n if (\n cell.fill &&\n cell.fill.type === \"pattern\" &&\n cell.fill.fgColor?.argb\n ) {\n const color = cell.fill.fgColor.argb;\n const [r, g, b] = convertColorToRgb(color);\n if (!isNaN(r) && !isNaN(g) && !isNaN(b)) {\n cellStyle.fillColor = [r, g, b];\n }\n }\n // Align right if the cell is numeric\n if (rawData[rowIndex - 2][index].type === \"number\") {\n cellStyle.halign = \"right\";\n }\n\n rowStyles.push(cellStyle);\n });\n cellStyles.push(rowStyles);\n });\n return cellStyles;\n};\n\n/**\n * Post-processes the data and cell styles to simulate Excel's text overflow behavior.\n * If a cell has long text and the next cell is empty, the width is set to auto.\n */\nconst postProcessExcelOverflow = (\n data: CellValueProps[][],\n cellStyles: CellStyleData[][],\n) => {\n for (let rowIndex = 0; rowIndex < data.length; rowIndex++) {\n for (let colIndex = 0; colIndex < data[rowIndex].length - 1; colIndex++) {\n const currentCell = data[rowIndex][colIndex];\n const nextCell = data[rowIndex][colIndex + 1];\n\n // If the current cell has long text and the next one is empty or only spaces\n if (\n currentCell &&\n currentCell.text.length > 15 &&\n (!nextCell || nextCell.text.trim() === \"\")\n ) {\n // Extend the width of the current cell\n if (!cellStyles[rowIndex][colIndex].cellWidth) {\n cellStyles[rowIndex][colIndex].cellWidth = \"auto\";\n }\n }\n }\n }\n};\n"]}
1
+ {"version":3,"file":"matrix-converter.js","sourceRoot":"","sources":["../../../src/converters/pdf/matrix-converter.ts"],"names":[],"mappings":"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","sourcesContent":["import * as jsPDFModule from \"jspdf\";\nimport ExcelJS from \"exceljs\";\nimport autoTable from \"jspdf-autotable\";\nimport { WebupManagerData } from \"../../index.js\";\nimport { CellStyleData, CellValueProps } from \"./pdf-converter.types.js\";\nimport { convertColorToRgb } from \"../../utils/commons-utility.js\";\nimport { getCellValueData } from \"./formulas-helper.js\";\nimport { getAutoTableOptions } from \"./autotable-renderer.js\";\nimport { isGroupedCell } from \"../excel/commons.js\";\n\n/**\n * Converts an ExcelJS worksheet into a PDF document using jsPDF and autoTable.\n *\n * This function extracts visible headers and data from the provided worksheet,\n * applies cell styles, simulates Excel cell overflow, and calculates the optimal\n * font size for the table. It then generates a PDF document with the formatted\n * table and returns the resulting jsPDF instance.\n *\n * @param worksheet - The ExcelJS worksheet to convert to PDF.\n * @param webupManagerData - Additional data required for extracting worksheet content.\n * @returns A Promise that resolves to a jsPDF document containing the worksheet data as a table.\n */\nexport const dataTableToPdfDoc = async (\n worksheet: ExcelJS.Worksheet,\n webupManagerData: WebupManagerData,\n header?: string,\n logoBase64?: string,\n): Promise<jsPDFModule.jsPDF> => {\n const doc = new jsPDFModule.jsPDF({ orientation: \"landscape\" });\n doc.setFont(\"helvetica\", \"normal\");\n doc.setFontSize(10);\n\n // Extract headers and column indexes\n const { visibleHeaders, visibleColumnIndexes } =\n extractVisibleHeadersAndIndexes(worksheet);\n\n // Extract data and cell styles separately\n const data = extractData(worksheet, visibleColumnIndexes, webupManagerData);\n const cellStyles = extractStyles(worksheet, visibleColumnIndexes, data);\n\n // Post-process data to simulate Excel overflow\n postProcessExcelOverflow(data, cellStyles);\n\n // Calculate optimal font size based on data\n const pageWidth = doc.internal.pageSize.getWidth();\n const optimalFontSize = calculateOptimalFontSize(\n data,\n visibleHeaders,\n pageWidth,\n );\n\n autoTable(\n doc,\n getAutoTableOptions(\n visibleHeaders,\n data,\n optimalFontSize,\n cellStyles,\n header,\n logoBase64,\n ),\n );\n\n return doc;\n};\n\n// Function to calculate the optimal font size\nconst calculateOptimalFontSize = (\n data: CellValueProps[][],\n visibleHeaders: string[],\n pageWidth: number,\n): number => {\n const maxSamples = Math.min(100, data.length); // Analyze max 100 rows\n const availableWidth = pageWidth - 20; // Margins\n const numColumns = visibleHeaders.length;\n\n // If there are few columns, we can allow a larger font size\n if (numColumns <= 3) {\n return 10;\n }\n\n // Calculate more accurate statistics per column\n const columnStats = visibleHeaders.map((header, colIndex) => {\n const lengths: number[] = [header.length];\n\n // Collect all cell lengths for this column\n for (let rowIndex = 0; rowIndex < maxSamples; rowIndex++) {\n if (data[rowIndex] && data[rowIndex][colIndex]) {\n const cellLength = data[rowIndex][colIndex].text.replace(\n /\\u00A0/g,\n \" \",\n ).length;\n lengths.push(cellLength);\n }\n }\n\n lengths.sort((a, b) => a - b);\n\n // Use the 90th percentile instead of the maximum to be less conservative\n const percentile90Index = Math.floor(lengths.length * 0.9);\n const effectiveWidth =\n lengths[percentile90Index] || lengths[lengths.length - 1];\n\n // The average length to balance very long columns with short ones\n const avgLength =\n lengths.reduce((sum, len) => sum + len, 0) / lengths.length;\n\n return {\n max: Math.max(...lengths),\n p90: effectiveWidth,\n avg: avgLength,\n min: Math.min(...lengths),\n };\n });\n\n // Use a mixed strategy: combine 90th percentile with weighted average\n const estimatedColumnWidths = columnStats.map(stats => {\n // Weight the average more than the 90th percentile to be less pessimistic\n const weightedWidth = stats.avg * 0.7 + stats.p90 * 0.3;\n return Math.max(weightedWidth, 3); // Minimum width of 3 characters\n });\n\n // Try different font sizes starting from the largest\n for (let testFontSize = 10; testFontSize >= 4; testFontSize -= 0.5) {\n // More optimistic factor based on font size\n const charWidthFactor =\n testFontSize >= 8 ? 3.2 : testFontSize >= 6 ? 2.8 : 2.5;\n\n const estimatedTotalWidth = estimatedColumnWidths.reduce(\n (sum, width) => sum + width * charWidthFactor,\n 0,\n );\n\n // Add a margin for columns (space between columns)\n const totalWidthWithMargins = estimatedTotalWidth + numColumns * 10; // 10px between columns\n\n if (totalWidthWithMargins <= availableWidth) {\n return testFontSize;\n }\n }\n\n return 4; // Minimum font size if nothing fits\n};\n\n/**\n * Extracts visible headers and their column indexes from the worksheet (ignoring hidden columns).\n */\nconst extractVisibleHeadersAndIndexes = (\n worksheet: ExcelJS.Worksheet,\n): { visibleHeaders: string[]; visibleColumnIndexes: number[] } => {\n const headerRow = worksheet.getRow(1);\n const visibleHeaders: string[] = [];\n const visibleColumnIndexes: number[] = [];\n headerRow.eachCell({ includeEmpty: true }, (cell, colNumber) => {\n const column = worksheet.getColumn(colNumber);\n if (!column.hidden) {\n visibleHeaders.push(cell?.toString() ?? \"\");\n visibleColumnIndexes.push(colNumber);\n }\n });\n return { visibleHeaders, visibleColumnIndexes };\n};\n\n/**\n * Extracts the data from the worksheet for the given visible columns, formatting dates and preserving spaces.\n */\nconst extractData = (\n worksheet: ExcelJS.Worksheet,\n visibleColumnIndexes: number[],\n webupManagerData: WebupManagerData,\n): CellValueProps[][] => {\n const data: CellValueProps[][] = [];\n worksheet.eachRow((row, rowIndex) => {\n if (rowIndex === 1) return; // Skip header\n const rowData: CellValueProps[] = [];\n visibleColumnIndexes.forEach(colIdx => {\n const cell = row.getCell(colIdx);\n const cellValue = getCellValueData(cell, worksheet, webupManagerData);\n rowData.push(cellValue);\n });\n data.push(rowData);\n });\n return data;\n};\n\n/**\n * Extracts the cell styles (font, color, fill) for the given visible columns from the worksheet.\n */\nconst extractStyles = (\n worksheet: ExcelJS.Worksheet,\n visibleColumnIndexes: number[],\n rawData: CellValueProps[][],\n): CellStyleData[][] => {\n const cellStyles: CellStyleData[][] = [];\n worksheet.eachRow((row, rowIndex) => {\n if (rowIndex === 1) return; // Skip header\n const rowStyles: CellStyleData[] = [];\n visibleColumnIndexes.forEach((colIdx, index) => {\n const cell = row.getCell(colIdx);\n const cellStyle: CellStyleData = {};\n // Font\n if (cell.font) {\n if (cell.font.bold && cell.font.italic) {\n cellStyle.fontStyle = \"bolditalic\";\n } else if (cell.font.bold) {\n cellStyle.fontStyle = \"bold\";\n } else if (cell.font.italic) {\n cellStyle.fontStyle = \"italic\";\n } else {\n cellStyle.fontStyle = \"normal\";\n }\n if (cell.font.color?.argb) {\n const color = cell.font.color.argb;\n const [r, g, b] = convertColorToRgb(color);\n if (!isNaN(r) && !isNaN(g) && !isNaN(b)) {\n cellStyle.textColor = [r, g, b];\n }\n }\n }\n // Fill (background color)\n if (\n cell.fill &&\n cell.fill.type === \"pattern\" &&\n cell.fill.fgColor?.argb\n ) {\n const color = cell.fill.fgColor.argb;\n const [r, g, b] = convertColorToRgb(color);\n if (!isNaN(r) && !isNaN(g) && !isNaN(b)) {\n cellStyle.fillColor = [r, g, b];\n }\n }\n // Align right if the cell is numeric\n if (rawData[rowIndex - 2][index].type === \"number\") {\n cellStyle.halign = \"right\";\n }\n\n if (isGroupedCell(cell)) {\n cellStyle.cellWidth = \"wrap\";\n cellStyle.overflow = \"visible\";\n }\n\n rowStyles.push(cellStyle);\n });\n cellStyles.push(rowStyles);\n });\n return cellStyles;\n};\n\n/**\n * Post-processes the data and cell styles to simulate Excel's text overflow behavior.\n * If a cell has long text and the next cell is empty, the width is set to auto.\n */\nconst postProcessExcelOverflow = (\n data: CellValueProps[][],\n cellStyles: CellStyleData[][],\n) => {\n for (let rowIndex = 0; rowIndex < data.length; rowIndex++) {\n for (let colIndex = 0; colIndex < data[rowIndex].length - 1; colIndex++) {\n const currentCell = data[rowIndex][colIndex];\n const nextCell = data[rowIndex][colIndex + 1];\n\n // If the current cell has long text and the next one is empty or only spaces\n if (\n currentCell &&\n currentCell.text.length > 15 &&\n (!nextCell || nextCell.text.trim() === \"\")\n ) {\n // Extend the width of the current cell\n if (!cellStyles[rowIndex][colIndex].cellWidth) {\n cellStyles[rowIndex][colIndex].cellWidth = \"auto\";\n }\n }\n }\n }\n};\n"]}
@@ -2,8 +2,9 @@ export interface CellStyleData {
2
2
  fontStyle?: "normal" | "bold" | "italic" | "bolditalic";
3
3
  textColor?: [number, number, number];
4
4
  fillColor?: [number, number, number];
5
- cellWidth?: string;
5
+ cellWidth?: "auto" | "wrap";
6
6
  halign?: "left" | "right" | "center";
7
+ overflow?: "linebreak" | "visible";
7
8
  }
8
9
  export interface CellValueProps {
9
10
  value: string | number | Date;
@@ -1 +1 @@
1
- {"version":3,"file":"pdf-converter.types.js","sourceRoot":"","sources":["../../../src/converters/pdf/pdf-converter.types.ts"],"names":[],"mappings":"","sourcesContent":["export interface CellStyleData {\n fontStyle?: \"normal\" | \"bold\" | \"italic\" | \"bolditalic\";\n textColor?: [number, number, number];\n fillColor?: [number, number, number];\n cellWidth?: string;\n halign?: \"left\" | \"right\" | \"center\";\n}\n\nexport interface CellValueProps {\n // The raw value of the cell, can be string, number, Date\n value: string | number | Date;\n // Formatted representation of the value\n text: string;\n type: \"string\" | \"number\" | \"date\";\n}\n"]}
1
+ {"version":3,"file":"pdf-converter.types.js","sourceRoot":"","sources":["../../../src/converters/pdf/pdf-converter.types.ts"],"names":[],"mappings":"","sourcesContent":["export interface CellStyleData {\n fontStyle?: \"normal\" | \"bold\" | \"italic\" | \"bolditalic\";\n textColor?: [number, number, number];\n fillColor?: [number, number, number];\n cellWidth?: \"auto\" | \"wrap\";\n halign?: \"left\" | \"right\" | \"center\";\n overflow?: \"linebreak\" | \"visible\";\n}\n\nexport interface CellValueProps {\n // The raw value of the cell, can be string, number, Date\n value: string | number | Date;\n // Formatted representation of the value\n text: string;\n type: \"string\" | \"number\" | \"date\";\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  import { exportTypeSupportsFormatting } from "../converters/excel/excel-converter.types.js";
2
2
  import { SortMode } from "../types/component-props.js";
3
3
  import { datesIsIsoDate, datesToDate, datesFormat } from "./dates-utility.js";
4
+ import { sanitizeString } from "./formatter-utility.js";
4
5
  import { mathNumberStringToFormattedString, mathCountDecimals, } from "./math-utility.js";
5
6
  import { objectsIsVoCodVer, objectsIsDate, objectsIsNumber, } from "./objects-utility.js";
6
7
  export const getFilteredColumns = (columns, props, groupsArray = []) => {
@@ -149,7 +150,7 @@ export const calculateValue = (value, obj, bookType, webupManagerData) => {
149
150
  ? numValue
150
151
  : "";
151
152
  }
152
- return value ?? "";
153
+ return sanitizeString(value) ?? "";
153
154
  };
154
155
  /**
155
156
  * Conversion from Hexadecimal color to an AlphaRGB
@@ -1 +1 @@
1
- {"version":3,"file":"commons-utility.js","sourceRoot":"","sources":["../../src/utils/commons-utility.ts"],"names":[],"mappings":"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","sourcesContent":["import { exportTypeSupportsFormatting } from \"../converters/excel/excel-converter.types.js\";\nimport { SortMode, SortObject } from \"../types/component-props.js\";\nimport {\n SmeupDataColumn,\n SmeupDataTable,\n SmeupDataCell,\n SmeupDataRow,\n} from \"../types/data-structures/smeupDataTable.js\";\nimport {\n SmeupDataObj,\n ColumnFilter,\n WebupManagerData,\n SupportedExportFormats,\n GenericObject,\n} from \"../types/index.js\";\nimport { datesIsIsoDate, datesToDate, datesFormat } from \"./dates-utility.js\";\nimport {\n mathNumberStringToFormattedString,\n mathCountDecimals,\n} from \"./math-utility.js\";\nimport {\n objectsIsVoCodVer,\n objectsIsDate,\n objectsIsNumber,\n} from \"./objects-utility.js\";\n\nexport const getFilteredColumns = (\n columns: SmeupDataColumn[],\n props: GenericObject,\n groupsArray: { column: string; visible: boolean }[] = [],\n) => {\n if (!columns) return [];\n\n const mutableColumns = JSON.parse(\n JSON.stringify(columns),\n ) as SmeupDataColumn[];\n\n const filteredColumns: SmeupDataColumn[] = [];\n\n if (props.visibleColumns && (props.visibleColumns as string[]).length > 0) {\n (props.visibleColumns as string[]).forEach((col: string) => {\n const foundColumn = mutableColumns.find(c => c.name === col);\n if (foundColumn) {\n filteredColumns.push({ ...foundColumn });\n }\n });\n } else {\n filteredColumns.push(...mutableColumns);\n }\n\n // Set the visibility of columns based on groups and props\n filteredColumns.forEach((col: SmeupDataColumn) => {\n const isGroupedColumn = groupsArray.filter(g => g.column === col.name);\n col.visible = props.visibleColumns\n ? (props.visibleColumns as string[]).includes(col.name)\n : col.visible;\n col.visible =\n isGroupedColumn.length > 0 ? isGroupedColumn[0].visible : col.visible;\n });\n\n return filteredColumns.filter(column => {\n const dataObject = {\n ...column.obj,\n k: \"\",\n } as SmeupDataObj;\n return column.obj?.t !== \"J4\" && !objectsIsVoCodVer(dataObject);\n });\n};\n\n/**\n * By passing the map, length value and column name\n * creates or updates a map record with\n * @param map Contains columnNames and their longest cell's length\n * @param text The text to use in length calculation\n * @param colName The column to check\n */\nexport const updateMaxValueLength = (\n map: { [key: string]: number },\n text: string | undefined | null,\n colName: string,\n) => {\n if (!map || !text || !colName) return;\n\n const value = Math.max(...text.split(\"\\n\").map(line => line.length));\n if (map[colName]) {\n if (map[colName] < value) {\n map[colName] = value;\n }\n } else {\n map[colName] = value;\n }\n};\n\nexport const filterRows = (\n smeupDataTable: SmeupDataTable,\n filteredColumns: SmeupDataColumn[],\n filters: { [key: string]: ColumnFilter },\n) => {\n if (filters) {\n return smeupDataTable.rows.filter(row => {\n return filteredColumns.every(col => {\n const cellValue = row.cells?.[col.name]?.value;\n const columnFilter = filters[col.name];\n if (columnFilter?.checkBoxes?.length) {\n const allowedValues = columnFilter.checkBoxes.map(item => item.value);\n return (\n typeof cellValue === \"string\" && allowedValues.includes(cellValue)\n );\n }\n return true;\n });\n });\n } else {\n return smeupDataTable.rows;\n }\n};\n\nexport const sortRows = (\n rows: SmeupDataRow[],\n sortObject: SortObject[],\n activeGroups?: string[],\n) => {\n const sort = sortObject?.[0];\n\n if (!sort && !activeGroups) {\n return;\n }\n\n if (!sort && activeGroups) {\n rows.sort((a, b) => {\n for (const group of activeGroups) {\n const valA = a.cells?.[group]?.value ?? \"\";\n const valB = b.cells?.[group]?.value ?? \"\";\n\n if (valA !== valB) {\n return valA.localeCompare(valB);\n }\n }\n return 0;\n });\n return;\n }\n\n rows.sort((a, b) => {\n const valA = a.cells?.[sort.column]?.value ?? \"\";\n const valB = b.cells?.[sort.column]?.value ?? \"\";\n\n switch (sort.sortMode) {\n case SortMode.A:\n if (valA !== valB) {\n return valA.localeCompare(valB);\n }\n return 0;\n case SortMode.D:\n if (valA !== valB) {\n return -valA.localeCompare(valB);\n }\n return 0;\n }\n });\n};\n\n/**\n * Returns a converted and formatted cell value (string, date, number)\n * @param cell - SmeupDataCell\n * @param bookType - SupportedExportFormats\n * @param webupManagerData - WebupManagerData\n * @returns\n */\nexport const calculateCellValue = (\n cell: SmeupDataCell,\n bookType: SupportedExportFormats,\n webupManagerData: WebupManagerData,\n) => {\n return calculateValue(\n cell.value,\n cell.obj ?? ({ t: \"\", p: \"\", k: \"\" } as SmeupDataObj),\n bookType,\n webupManagerData,\n );\n};\n\n/**\n * Calculates and formats a value based on its type and export format.\n *\n * - If the value is a date and the object indicates a date type, it returns a formatted date string or a Date object,\n * depending on the export format.\n * - If the value is a number and the object indicates a number type, it returns a formatted number string or a numeric value,\n * depending on the export format.\n * - Otherwise, it returns the original value or an empty string if the value is null or undefined.\n *\n * @param bookType - The export format type.\n * @param webupManagerData - Data containing locale and formatting information.\n * @param value - The value to be calculated and formatted.\n * @param obj - Optional object describing the type of the value.\n * @returns The formatted value, a Date object, a number, or the original value as a string.\n */\nexport const calculateValue = (\n value: string,\n obj: {\n t: string;\n p: string;\n k: string;\n },\n bookType: SupportedExportFormats,\n webupManagerData: WebupManagerData,\n) => {\n if (obj && objectsIsDate(obj) && datesIsIsoDate(value)) {\n return exportTypeSupportsFormatting[bookType]\n ? new Date(datesToDate(value, webupManagerData.datesLocale))\n : datesFormat(value, webupManagerData.datesLocale);\n }\n\n if (obj && objectsIsNumber(obj)) {\n if (!exportTypeSupportsFormatting[bookType]) {\n return (\n mathNumberStringToFormattedString(\n value,\n mathCountDecimals(Number(value) || 0),\n \"\",\n webupManagerData.mathLocale,\n ) || \"\"\n );\n }\n\n const numValue = Number(value);\n return !isNaN(numValue) && !(Math.abs(numValue) === Infinity)\n ? numValue\n : \"\";\n }\n\n return value ?? \"\";\n};\n\n/**\n * Conversion from Hexadecimal color to an AlphaRGB\n * @param hex string - Hexadecimal value, it can bot have and don't have the # prefix\n * @returns ARGB string code\n */\nexport const hexToArgb = (hex: string): string => {\n // Hex validation\n if (hex.startsWith(\"#\")) hex = hex.slice(1);\n if (hex.length !== 6) return \"\";\n\n // Value Parse and return\n const red = parseInt(hex.slice(0, 2), 16);\n const green = parseInt(hex.slice(2, 4), 16);\n const blue = parseInt(hex.slice(4, 6), 16);\n return `FF${red.toString(16).padStart(2, \"0\")}${green\n .toString(16)\n .padStart(2, \"0\")}${blue.toString(16).padStart(2, \"0\")}`;\n};\n\n// Utility function to detect if Buffer is available\nconst isBufferAvailable = (): boolean => {\n try {\n return typeof Buffer !== \"undefined\" && typeof Buffer.from === \"function\";\n } catch {\n return false;\n }\n};\n\n// Utility function to convert ArrayBuffer to Buffer or Uint8Array\nexport const convertToBuffer = (\n arrayBuffer: ArrayBuffer | Uint8Array,\n): Buffer | Uint8Array => {\n if (arrayBuffer instanceof Uint8Array) {\n return arrayBuffer;\n }\n if (isBufferAvailable()) {\n return Buffer.from(arrayBuffer);\n } else {\n return new Uint8Array(arrayBuffer);\n }\n};\n\n// Function to load an image as base64 (browser version, async)\nexport const loadImageAsBase64 = async (\n imageUrl: string,\n): Promise<string | null> => {\n try {\n const response = await fetch(imageUrl);\n if (!response.ok) return null;\n const blob = await response.blob();\n return await new Promise<string | null>((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n resolve(reader.result as string);\n };\n reader.onerror = () => reject(null);\n reader.readAsDataURL(blob);\n });\n } catch (error) {\n console.warn(\"Unable to load asset image:\", error);\n return null;\n }\n};\n\n/**\n * Converts a hexadecimal color string (e.g., \"#RRGGBB\" or \"0xRRGGBB\") to an RGB tuple.\n */\nexport const convertColorToRgb = (color: string): [number, number, number] => {\n const r = parseInt(color.substring(2, 4), 16);\n const g = parseInt(color.substring(4, 6), 16);\n const b = parseInt(color.substring(6, 8), 16);\n return [r, g, b];\n};\n"]}
1
+ {"version":3,"file":"commons-utility.js","sourceRoot":"","sources":["../../src/utils/commons-utility.ts"],"names":[],"mappings":"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","sourcesContent":["import { exportTypeSupportsFormatting } from \"../converters/excel/excel-converter.types.js\";\nimport { SortMode, SortObject } from \"../types/component-props.js\";\nimport {\n SmeupDataColumn,\n SmeupDataTable,\n SmeupDataCell,\n SmeupDataRow,\n} from \"../types/data-structures/smeupDataTable.js\";\nimport {\n SmeupDataObj,\n ColumnFilter,\n WebupManagerData,\n SupportedExportFormats,\n GenericObject,\n} from \"../types/index.js\";\nimport { datesIsIsoDate, datesToDate, datesFormat } from \"./dates-utility.js\";\nimport { sanitizeString } from \"./formatter-utility.js\";\nimport {\n mathNumberStringToFormattedString,\n mathCountDecimals,\n} from \"./math-utility.js\";\nimport {\n objectsIsVoCodVer,\n objectsIsDate,\n objectsIsNumber,\n} from \"./objects-utility.js\";\n\nexport const getFilteredColumns = (\n columns: SmeupDataColumn[],\n props: GenericObject,\n groupsArray: { column: string; visible: boolean }[] = [],\n) => {\n if (!columns) return [];\n\n const mutableColumns = JSON.parse(\n JSON.stringify(columns),\n ) as SmeupDataColumn[];\n\n const filteredColumns: SmeupDataColumn[] = [];\n\n if (props.visibleColumns && (props.visibleColumns as string[]).length > 0) {\n (props.visibleColumns as string[]).forEach((col: string) => {\n const foundColumn = mutableColumns.find(c => c.name === col);\n if (foundColumn) {\n filteredColumns.push({ ...foundColumn });\n }\n });\n } else {\n filteredColumns.push(...mutableColumns);\n }\n\n // Set the visibility of columns based on groups and props\n filteredColumns.forEach((col: SmeupDataColumn) => {\n const isGroupedColumn = groupsArray.filter(g => g.column === col.name);\n col.visible = props.visibleColumns\n ? (props.visibleColumns as string[]).includes(col.name)\n : col.visible;\n col.visible =\n isGroupedColumn.length > 0 ? isGroupedColumn[0].visible : col.visible;\n });\n\n return filteredColumns.filter(column => {\n const dataObject = {\n ...column.obj,\n k: \"\",\n } as SmeupDataObj;\n return column.obj?.t !== \"J4\" && !objectsIsVoCodVer(dataObject);\n });\n};\n\n/**\n * By passing the map, length value and column name\n * creates or updates a map record with\n * @param map Contains columnNames and their longest cell's length\n * @param text The text to use in length calculation\n * @param colName The column to check\n */\nexport const updateMaxValueLength = (\n map: { [key: string]: number },\n text: string | undefined | null,\n colName: string,\n) => {\n if (!map || !text || !colName) return;\n\n const value = Math.max(...text.split(\"\\n\").map(line => line.length));\n if (map[colName]) {\n if (map[colName] < value) {\n map[colName] = value;\n }\n } else {\n map[colName] = value;\n }\n};\n\nexport const filterRows = (\n smeupDataTable: SmeupDataTable,\n filteredColumns: SmeupDataColumn[],\n filters: { [key: string]: ColumnFilter },\n) => {\n if (filters) {\n return smeupDataTable.rows.filter(row => {\n return filteredColumns.every(col => {\n const cellValue = row.cells?.[col.name]?.value;\n const columnFilter = filters[col.name];\n if (columnFilter?.checkBoxes?.length) {\n const allowedValues = columnFilter.checkBoxes.map(item => item.value);\n return (\n typeof cellValue === \"string\" && allowedValues.includes(cellValue)\n );\n }\n return true;\n });\n });\n } else {\n return smeupDataTable.rows;\n }\n};\n\nexport const sortRows = (\n rows: SmeupDataRow[],\n sortObject: SortObject[],\n activeGroups?: string[],\n) => {\n const sort = sortObject?.[0];\n\n if (!sort && !activeGroups) {\n return;\n }\n\n if (!sort && activeGroups) {\n rows.sort((a, b) => {\n for (const group of activeGroups) {\n const valA = a.cells?.[group]?.value ?? \"\";\n const valB = b.cells?.[group]?.value ?? \"\";\n\n if (valA !== valB) {\n return valA.localeCompare(valB);\n }\n }\n return 0;\n });\n return;\n }\n\n rows.sort((a, b) => {\n const valA = a.cells?.[sort.column]?.value ?? \"\";\n const valB = b.cells?.[sort.column]?.value ?? \"\";\n\n switch (sort.sortMode) {\n case SortMode.A:\n if (valA !== valB) {\n return valA.localeCompare(valB);\n }\n return 0;\n case SortMode.D:\n if (valA !== valB) {\n return -valA.localeCompare(valB);\n }\n return 0;\n }\n });\n};\n\n/**\n * Returns a converted and formatted cell value (string, date, number)\n * @param cell - SmeupDataCell\n * @param bookType - SupportedExportFormats\n * @param webupManagerData - WebupManagerData\n * @returns\n */\nexport const calculateCellValue = (\n cell: SmeupDataCell,\n bookType: SupportedExportFormats,\n webupManagerData: WebupManagerData,\n) => {\n return calculateValue(\n cell.value,\n cell.obj ?? ({ t: \"\", p: \"\", k: \"\" } as SmeupDataObj),\n bookType,\n webupManagerData,\n );\n};\n\n/**\n * Calculates and formats a value based on its type and export format.\n *\n * - If the value is a date and the object indicates a date type, it returns a formatted date string or a Date object,\n * depending on the export format.\n * - If the value is a number and the object indicates a number type, it returns a formatted number string or a numeric value,\n * depending on the export format.\n * - Otherwise, it returns the original value or an empty string if the value is null or undefined.\n *\n * @param bookType - The export format type.\n * @param webupManagerData - Data containing locale and formatting information.\n * @param value - The value to be calculated and formatted.\n * @param obj - Optional object describing the type of the value.\n * @returns The formatted value, a Date object, a number, or the original value as a string.\n */\nexport const calculateValue = (\n value: string,\n obj: {\n t: string;\n p: string;\n k: string;\n },\n bookType: SupportedExportFormats,\n webupManagerData: WebupManagerData,\n) => {\n if (obj && objectsIsDate(obj) && datesIsIsoDate(value)) {\n return exportTypeSupportsFormatting[bookType]\n ? new Date(datesToDate(value, webupManagerData.datesLocale))\n : datesFormat(value, webupManagerData.datesLocale);\n }\n\n if (obj && objectsIsNumber(obj)) {\n if (!exportTypeSupportsFormatting[bookType]) {\n return (\n mathNumberStringToFormattedString(\n value,\n mathCountDecimals(Number(value) || 0),\n \"\",\n webupManagerData.mathLocale,\n ) || \"\"\n );\n }\n\n const numValue = Number(value);\n return !isNaN(numValue) && !(Math.abs(numValue) === Infinity)\n ? numValue\n : \"\";\n }\n\n return sanitizeString(value) ?? \"\";\n};\n\n/**\n * Conversion from Hexadecimal color to an AlphaRGB\n * @param hex string - Hexadecimal value, it can bot have and don't have the # prefix\n * @returns ARGB string code\n */\nexport const hexToArgb = (hex: string): string => {\n // Hex validation\n if (hex.startsWith(\"#\")) hex = hex.slice(1);\n if (hex.length !== 6) return \"\";\n\n // Value Parse and return\n const red = parseInt(hex.slice(0, 2), 16);\n const green = parseInt(hex.slice(2, 4), 16);\n const blue = parseInt(hex.slice(4, 6), 16);\n return `FF${red.toString(16).padStart(2, \"0\")}${green\n .toString(16)\n .padStart(2, \"0\")}${blue.toString(16).padStart(2, \"0\")}`;\n};\n\n// Utility function to detect if Buffer is available\nconst isBufferAvailable = (): boolean => {\n try {\n return typeof Buffer !== \"undefined\" && typeof Buffer.from === \"function\";\n } catch {\n return false;\n }\n};\n\n// Utility function to convert ArrayBuffer to Buffer or Uint8Array\nexport const convertToBuffer = (\n arrayBuffer: ArrayBuffer | Uint8Array,\n): Buffer | Uint8Array => {\n if (arrayBuffer instanceof Uint8Array) {\n return arrayBuffer;\n }\n if (isBufferAvailable()) {\n return Buffer.from(arrayBuffer);\n } else {\n return new Uint8Array(arrayBuffer);\n }\n};\n\n// Function to load an image as base64 (browser version, async)\nexport const loadImageAsBase64 = async (\n imageUrl: string,\n): Promise<string | null> => {\n try {\n const response = await fetch(imageUrl);\n if (!response.ok) return null;\n const blob = await response.blob();\n return await new Promise<string | null>((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n resolve(reader.result as string);\n };\n reader.onerror = () => reject(null);\n reader.readAsDataURL(blob);\n });\n } catch (error) {\n console.warn(\"Unable to load asset image:\", error);\n return null;\n }\n};\n\n/**\n * Converts a hexadecimal color string (e.g., \"#RRGGBB\" or \"0xRRGGBB\") to an RGB tuple.\n */\nexport const convertColorToRgb = (color: string): [number, number, number] => {\n const r = parseInt(color.substring(2, 4), 16);\n const g = parseInt(color.substring(4, 6), 16);\n const b = parseInt(color.substring(6, 8), 16);\n return [r, g, b];\n};\n"]}
@@ -1,3 +1,4 @@
1
1
  import { WebupManagerData } from "../types/index.js";
2
2
  export declare const formatDate: (date: Date, webupManagerData: WebupManagerData) => string;
3
3
  export declare const formatNumber: (value: number, numFmt: string, webupManagerData: WebupManagerData) => string;
4
+ export declare const sanitizeString: (input: string) => string;
@@ -18,9 +18,7 @@ export const formatDate = (date, webupManagerData) => {
18
18
  export const formatNumber = (value, numFmt, webupManagerData) => {
19
19
  try {
20
20
  const locale = webupManagerData?.mathLocale || "it-IT";
21
- // Prendi solo la parte positiva del formato (prima del punto e virgola)
22
21
  const positiveFmt = numFmt.split(";")[0] || numFmt;
23
- // Conta i decimali dopo il punto (es: 0.00 -> 2 decimali)
24
22
  const decimalMatch = positiveFmt.match(/\.(0+)/);
25
23
  const decimals = decimalMatch ? decimalMatch[1].length : 0;
26
24
  const formatter = new Intl.NumberFormat(locale, {
@@ -33,4 +31,11 @@ export const formatNumber = (value, numFmt, webupManagerData) => {
33
31
  return value.toString();
34
32
  }
35
33
  };
34
+ export const sanitizeString = (input) => {
35
+ // Remove HTML tags and multiple spaces
36
+ return input
37
+ .replace(/<[^>]*>/g, " ")
38
+ .replace(/\s+/g, " ")
39
+ .trim();
40
+ };
36
41
  //# sourceMappingURL=formatter-utility.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"formatter-utility.js","sourceRoot":"","sources":["../../src/utils/formatter-utility.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,IAAU,EACV,gBAAkC,EAC1B,EAAE;IACV,IACE,gBAAgB,EAAE,WAAW,KAAK,OAAO;QACzC,gBAAgB,EAAE,WAAW,KAAK,IAAI,EACtC,CAAC;QACD,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE;YACtC,GAAG,EAAE,SAAS;YACd,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE;YACtC,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE,SAAS;YACd,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,KAAa,EACb,MAAc,EACd,gBAAkC,EAC1B,EAAE;IACV,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,gBAAgB,EAAE,UAAU,IAAI,OAAO,CAAC;QACvD,wEAAwE;QACxE,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;QACnD,0DAA0D;QAC1D,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;YAC9C,qBAAqB,EAAE,QAAQ;YAC/B,qBAAqB,EAAE,QAAQ;SAChC,CAAC,CAAC;QACH,OAAO,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC,CAAC","sourcesContent":["import { WebupManagerData } from \"../types/index.js\";\n\nexport const formatDate = (\n date: Date,\n webupManagerData: WebupManagerData,\n): string => {\n if (\n webupManagerData?.datesLocale === \"it-IT\" ||\n webupManagerData?.datesLocale === \"it\"\n ) {\n return date.toLocaleDateString(\"it-IT\", {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\",\n });\n } else {\n return date.toLocaleDateString(\"en-US\", {\n month: \"2-digit\",\n day: \"2-digit\",\n year: \"numeric\",\n });\n }\n};\n\nexport const formatNumber = (\n value: number,\n numFmt: string,\n webupManagerData: WebupManagerData,\n): string => {\n try {\n const locale = webupManagerData?.mathLocale || \"it-IT\";\n // Prendi solo la parte positiva del formato (prima del punto e virgola)\n const positiveFmt = numFmt.split(\";\")[0] || numFmt;\n // Conta i decimali dopo il punto (es: 0.00 -> 2 decimali)\n const decimalMatch = positiveFmt.match(/\\.(0+)/);\n const decimals = decimalMatch ? decimalMatch[1].length : 0;\n const formatter = new Intl.NumberFormat(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n });\n return formatter.format(value);\n } catch {\n return value.toString();\n }\n};\n"]}
1
+ {"version":3,"file":"formatter-utility.js","sourceRoot":"","sources":["../../src/utils/formatter-utility.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,IAAU,EACV,gBAAkC,EAC1B,EAAE;IACV,IACE,gBAAgB,EAAE,WAAW,KAAK,OAAO;QACzC,gBAAgB,EAAE,WAAW,KAAK,IAAI,EACtC,CAAC;QACD,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE;YACtC,GAAG,EAAE,SAAS;YACd,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE;YACtC,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE,SAAS;YACd,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,KAAa,EACb,MAAc,EACd,gBAAkC,EAC1B,EAAE;IACV,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,gBAAgB,EAAE,UAAU,IAAI,OAAO,CAAC;QACvD,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;QACnD,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;YAC9C,qBAAqB,EAAE,QAAQ;YAC/B,qBAAqB,EAAE,QAAQ;SAChC,CAAC,CAAC;QACH,OAAO,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAa,EAAU,EAAE;IACtD,uCAAuC;IACvC,OAAO,KAAK;SACT,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;AACZ,CAAC,CAAC","sourcesContent":["import { WebupManagerData } from \"../types/index.js\";\n\nexport const formatDate = (\n date: Date,\n webupManagerData: WebupManagerData,\n): string => {\n if (\n webupManagerData?.datesLocale === \"it-IT\" ||\n webupManagerData?.datesLocale === \"it\"\n ) {\n return date.toLocaleDateString(\"it-IT\", {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\",\n });\n } else {\n return date.toLocaleDateString(\"en-US\", {\n month: \"2-digit\",\n day: \"2-digit\",\n year: \"numeric\",\n });\n }\n};\n\nexport const formatNumber = (\n value: number,\n numFmt: string,\n webupManagerData: WebupManagerData,\n): string => {\n try {\n const locale = webupManagerData?.mathLocale || \"it-IT\";\n const positiveFmt = numFmt.split(\";\")[0] || numFmt;\n const decimalMatch = positiveFmt.match(/\\.(0+)/);\n const decimals = decimalMatch ? decimalMatch[1].length : 0;\n const formatter = new Intl.NumberFormat(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n });\n return formatter.format(value);\n } catch {\n return value.toString();\n }\n};\n\nexport const sanitizeString = (input: string): string => {\n // Remove HTML tags and multiple spaces\n return input\n .replace(/<[^>]*>/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sme.up/doc-alchemist",
3
- "version": "1.2.0-SNAPSHOT-20250716144831",
3
+ "version": "1.2.0-SNAPSHOT-20250716151001",
4
4
  "description": "Library for generating documents in various formats, including Excel and PDF.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Smeup LAB <info@smeup.com> (https://www.smeup.com/)",