@sme.up/doc-alchemist 1.7.0-SNAPSHOT-20251218135616 → 1.7.0-SNAPSHOT-20251223155346

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.
Files changed (57) hide show
  1. package/dist/converters/images/charts-converter.d.ts +2 -2
  2. package/dist/converters/images/charts-converter.js +11 -7
  3. package/dist/converters/images/charts-converter.js.map +1 -1
  4. package/dist/converters/images/charts-data-converter.d.ts +1 -1
  5. package/dist/converters/images/charts-data-converter.js +8 -8
  6. package/dist/converters/images/charts-data-converter.js.map +1 -1
  7. package/dist/converters/pdf/pdfmake/adapters/box/box-adapter.d.ts +28 -0
  8. package/dist/converters/pdf/pdfmake/adapters/box/box-adapter.js +164 -0
  9. package/dist/converters/pdf/pdfmake/adapters/box/box-adapter.js.map +1 -0
  10. package/dist/converters/pdf/pdfmake/adapters/box/box-layouts.d.ts +6 -0
  11. package/dist/converters/pdf/pdfmake/adapters/box/box-layouts.js +147 -0
  12. package/dist/converters/pdf/pdfmake/adapters/box/box-layouts.js.map +1 -0
  13. package/dist/converters/pdf/pdfmake/adapters/{chart-adapter.d.ts → chart/chart-adapter.d.ts} +1 -1
  14. package/dist/converters/pdf/pdfmake/adapters/{chart-adapter.js → chart/chart-adapter.js} +10 -9
  15. package/dist/converters/pdf/pdfmake/adapters/chart/chart-adapter.js.map +1 -0
  16. package/dist/converters/pdf/pdfmake/adapters/helpers.d.ts +3 -0
  17. package/dist/converters/pdf/pdfmake/adapters/helpers.js +18 -0
  18. package/dist/converters/pdf/pdfmake/adapters/helpers.js.map +1 -0
  19. package/dist/converters/pdf/pdfmake/adapters/{image-adapter.d.ts → image/image-adapter.d.ts} +1 -1
  20. package/dist/converters/pdf/pdfmake/adapters/image/image-adapter.js.map +1 -0
  21. package/dist/converters/pdf/pdfmake/adapters/{layout-adapter.d.ts → layout/layout-adapter.d.ts} +1 -1
  22. package/dist/converters/pdf/pdfmake/adapters/layout/layout-adapter.js.map +1 -0
  23. package/dist/converters/pdf/pdfmake/adapters/{page-element-adapter.d.ts → page-alement/page-element-adapter.d.ts} +1 -1
  24. package/dist/converters/pdf/pdfmake/adapters/{page-element-adapter.js → page-alement/page-element-adapter.js} +1 -1
  25. package/dist/converters/pdf/pdfmake/adapters/page-alement/page-element-adapter.js.map +1 -0
  26. package/dist/converters/pdf/pdfmake/adapters/{table-adapter.d.ts → table/table-adapter.d.ts} +1 -1
  27. package/dist/converters/pdf/pdfmake/adapters/{table-adapter.js → table/table-adapter.js} +16 -8
  28. package/dist/converters/pdf/pdfmake/adapters/table/table-adapter.js.map +1 -0
  29. package/dist/converters/pdf/pdfmake/pdfmake.types.d.ts +2 -3
  30. package/dist/converters/pdf/pdfmake/pdfmake.types.js.map +1 -1
  31. package/dist/converters/pdf-converter.js +7 -5
  32. package/dist/converters/pdf-converter.js.map +1 -1
  33. package/dist/index.d.ts +2 -2
  34. package/dist/index.js +2 -2
  35. package/dist/index.js.map +1 -1
  36. package/dist/types/component.d.ts +34 -0
  37. package/dist/types/component.js +8 -1
  38. package/dist/types/component.js.map +1 -1
  39. package/dist/utils/cells-utility.d.ts +2 -0
  40. package/dist/utils/cells-utility.js +10 -0
  41. package/dist/utils/cells-utility.js.map +1 -0
  42. package/dist/utils/filters-utility.js +0 -1
  43. package/dist/utils/filters-utility.js.map +1 -1
  44. package/dist/utils/objects-utility.d.ts +1 -0
  45. package/dist/utils/objects-utility.js +7 -1
  46. package/dist/utils/objects-utility.js.map +1 -1
  47. package/package.json +1 -1
  48. package/dist/converters/images/charts-converter-types.d.ts +0 -15
  49. package/dist/converters/images/charts-converter-types.js +0 -11
  50. package/dist/converters/images/charts-converter-types.js.map +0 -1
  51. package/dist/converters/pdf/pdfmake/adapters/chart-adapter.js.map +0 -1
  52. package/dist/converters/pdf/pdfmake/adapters/image-adapter.js.map +0 -1
  53. package/dist/converters/pdf/pdfmake/adapters/layout-adapter.js.map +0 -1
  54. package/dist/converters/pdf/pdfmake/adapters/page-element-adapter.js.map +0 -1
  55. package/dist/converters/pdf/pdfmake/adapters/table-adapter.js.map +0 -1
  56. /package/dist/converters/pdf/pdfmake/adapters/{image-adapter.js → image/image-adapter.js} +0 -0
  57. /package/dist/converters/pdf/pdfmake/adapters/{layout-adapter.js → layout/layout-adapter.js} +0 -0
@@ -1,9 +1,9 @@
1
1
  import { SmeupDataTable } from "../../types/data-structures/smeupDataTable";
2
- import { ChartOptions } from "./charts-converter-types";
2
+ import { ChartOptions } from "../../types/component";
3
3
  /**
4
4
  * Converts SmeupDataTable to chart SVG string
5
5
  * @param dataTable - SmeupDataTable containing the data
6
6
  * @param chartType - Type of chart (bar, line, pie, scatter)
7
7
  * @returns Promise<string> containing the chart SVG
8
8
  */
9
- export declare const dataTableToChart: (dataTable: SmeupDataTable, chartOptions: ChartOptions) => Promise<string>;
9
+ export declare const dataTableToChart: (dataTable: SmeupDataTable, chartOptions: ChartOptions, onMergeOptions?: (merged: ChartOptions) => void) => Promise<string>;
@@ -43,21 +43,25 @@ const datastructure_utility_1 = require("../../utils/datastructure-utility");
43
43
  * @param chartType - Type of chart (bar, line, pie, scatter)
44
44
  * @returns Promise<string> containing the chart SVG
45
45
  */
46
- const dataTableToChart = async (dataTable, chartOptions) => {
47
- return await generateChart(dataTable, chartOptions);
46
+ const dataTableToChart = async (dataTable, chartOptions, onMergeOptions) => {
47
+ return await generateChart(dataTable, chartOptions, onMergeOptions);
48
48
  };
49
49
  exports.dataTableToChart = dataTableToChart;
50
50
  /**
51
51
  * Generate chart in Node.js environment using SVG renderer
52
52
  */
53
- async function generateChart(dataTable, chartOptions) {
53
+ async function generateChart(dataTable, chartOptions, onMergeOptions) {
54
54
  try {
55
55
  const options = (0, datastructure_utility_1.mergeSetupOptions)(dataTable.setup?.options?.["EXA"]?.[0] ?? {}, chartOptions ?? {});
56
- if (!chartOptions) {
57
- throw new Error("Chart options must be provided");
56
+ if (!options ||
57
+ (typeof options === "object" && Object.keys(options).length === 0)) {
58
+ throw new Error("Chart options must be provided and not be empty");
58
59
  }
59
- const width = Number(options.ForceWidth ?? 400);
60
- const height = Number(options.ForceHeight ?? 300);
60
+ options.ForceWidth = options.ForceWidth ?? "400";
61
+ options.ForceHeight = options.ForceHeight ?? "300";
62
+ const width = Number(options.ForceWidth);
63
+ const height = Number(options.ForceHeight);
64
+ onMergeOptions?.(options);
61
65
  // Initialize ECharts with SVG renderer (no canvas needed in recent versions)
62
66
  const chart = echarts.init(null, null, {
63
67
  renderer: "svg",
@@ -1 +1 @@
1
- {"version":3,"file":"charts-converter.js","sourceRoot":"","sources":["../../../src/converters/images/charts-converter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAAmC;AAGnC,mEAAwE;AAExE,6EAAsE;AAEtE;;;;;GAKG;AACI,MAAM,gBAAgB,GAAG,KAAK,EACnC,SAAyB,EACzB,YAA0B,EACT,EAAE;IACnB,OAAO,MAAM,aAAa,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AACtD,CAAC,CAAC;AALW,QAAA,gBAAgB,oBAK3B;AAEF;;GAEG;AACH,KAAK,UAAU,aAAa,CAC1B,SAAyB,EACzB,YAA0B;IAE1B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAA,yCAAiB,EAC/B,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAC5C,YAAY,IAAI,EAAE,CACnB,CAAC;QAEF,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,IAAI,GAAG,CAAC,CAAC;QAElD,6EAA6E;QAC7E,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;YACrC,QAAQ,EAAE,KAAK;YACf,GAAG,EAAE,IAAI;YACT,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QAEH,4CAA4C;QAC5C,MAAM,MAAM,GAAG,IAAA,qDAA6B,EAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAEjE,oBAAoB;QACpB,KAAK,CAAC,SAAS,CAAC,MAAuB,CAAC,CAAC;QAEzC,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEhE,iBAAiB;QACjB,MAAM,SAAS,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAE5C,UAAU;QACV,KAAK,CAAC,OAAO,EAAE,CAAC;QAEhB,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;QAC3D,MAAM,IAAI,KAAK,CACb,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CACxF,CAAC;IACJ,CAAC;AACH,CAAC","sourcesContent":["import * as echarts from \"echarts\";\nimport type { EChartsOption } from \"echarts\";\nimport { SmeupDataTable } from \"../../types/data-structures/smeupDataTable\";\nimport { convertDataTableToChartConfig } from \"./charts-data-converter\";\nimport { ChartOptions } from \"./charts-converter-types\";\nimport { mergeSetupOptions } from \"../../utils/datastructure-utility\";\n\n/**\n * Converts SmeupDataTable to chart SVG string\n * @param dataTable - SmeupDataTable containing the data\n * @param chartType - Type of chart (bar, line, pie, scatter)\n * @returns Promise<string> containing the chart SVG\n */\nexport const dataTableToChart = async (\n dataTable: SmeupDataTable,\n chartOptions: ChartOptions,\n): Promise<string> => {\n return await generateChart(dataTable, chartOptions);\n};\n\n/**\n * Generate chart in Node.js environment using SVG renderer\n */\nasync function generateChart(\n dataTable: SmeupDataTable,\n chartOptions: ChartOptions,\n): Promise<string> {\n try {\n const options = mergeSetupOptions<ChartOptions>(\n dataTable.setup?.options?.[\"EXA\"]?.[0] ?? {},\n chartOptions ?? {},\n );\n\n if (!chartOptions) {\n throw new Error(\"Chart options must be provided\");\n }\n\n const width = Number(options.ForceWidth ?? 400);\n const height = Number(options.ForceHeight ?? 300);\n\n // Initialize ECharts with SVG renderer (no canvas needed in recent versions)\n const chart = echarts.init(null, null, {\n renderer: \"svg\",\n ssr: true,\n width: width,\n height: height,\n });\n\n // Convert data table to chart configuration\n const config = convertDataTableToChartConfig(dataTable, options);\n\n // Set chart options\n chart.setOption(config as EChartsOption);\n\n console.debug(\"Chart options\", JSON.stringify(config, null, 2));\n\n // Get SVG string\n const svgString = chart.renderToSVGString();\n\n // Cleanup\n chart.dispose();\n\n return svgString;\n } catch (error) {\n console.error(\"Error generating chart in Node.js:\", error);\n throw new Error(\n `Failed to generate chart: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n"]}
1
+ {"version":3,"file":"charts-converter.js","sourceRoot":"","sources":["../../../src/converters/images/charts-converter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAAmC;AAGnC,mEAAwE;AACxE,6EAAsE;AAGtE;;;;;GAKG;AACI,MAAM,gBAAgB,GAAG,KAAK,EACnC,SAAyB,EACzB,YAA0B,EAC1B,cAA+C,EAC9B,EAAE;IACnB,OAAO,MAAM,aAAa,CAAC,SAAS,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC;AACtE,CAAC,CAAC;AANW,QAAA,gBAAgB,oBAM3B;AAEF;;GAEG;AACH,KAAK,UAAU,aAAa,CAC1B,SAAyB,EACzB,YAA0B,EAC1B,cAA+C;IAE/C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAA,yCAAiB,EAC/B,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAC5C,YAAY,IAAI,EAAE,CACnB,CAAC;QAEF,IACE,CAAC,OAAO;YACR,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,EAClE,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrE,CAAC;QAED,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,KAAK,CAAC;QACjD,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,KAAK,CAAC;QAEnD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAE3C,cAAc,EAAE,CAAC,OAAO,CAAC,CAAC;QAE1B,6EAA6E;QAC7E,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;YACrC,QAAQ,EAAE,KAAK;YACf,GAAG,EAAE,IAAI;YACT,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QAEH,4CAA4C;QAC5C,MAAM,MAAM,GAAG,IAAA,qDAA6B,EAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAEjE,oBAAoB;QACpB,KAAK,CAAC,SAAS,CAAC,MAAuB,CAAC,CAAC;QAEzC,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEhE,iBAAiB;QACjB,MAAM,SAAS,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAE5C,UAAU;QACV,KAAK,CAAC,OAAO,EAAE,CAAC;QAEhB,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;QAC3D,MAAM,IAAI,KAAK,CACb,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CACxF,CAAC;IACJ,CAAC;AACH,CAAC","sourcesContent":["import * as echarts from \"echarts\";\nimport type { EChartsOption } from \"echarts\";\nimport { SmeupDataTable } from \"../../types/data-structures/smeupDataTable\";\nimport { convertDataTableToChartConfig } from \"./charts-data-converter\";\nimport { mergeSetupOptions } from \"../../utils/datastructure-utility\";\nimport { ChartOptions } from \"../../types/component\";\n\n/**\n * Converts SmeupDataTable to chart SVG string\n * @param dataTable - SmeupDataTable containing the data\n * @param chartType - Type of chart (bar, line, pie, scatter)\n * @returns Promise<string> containing the chart SVG\n */\nexport const dataTableToChart = async (\n dataTable: SmeupDataTable,\n chartOptions: ChartOptions,\n onMergeOptions?: (merged: ChartOptions) => void,\n): Promise<string> => {\n return await generateChart(dataTable, chartOptions, onMergeOptions);\n};\n\n/**\n * Generate chart in Node.js environment using SVG renderer\n */\nasync function generateChart(\n dataTable: SmeupDataTable,\n chartOptions: ChartOptions,\n onMergeOptions?: (merged: ChartOptions) => void,\n): Promise<string> {\n try {\n const options = mergeSetupOptions<ChartOptions>(\n dataTable.setup?.options?.[\"EXA\"]?.[0] ?? {},\n chartOptions ?? {},\n );\n\n if (\n !options ||\n (typeof options === \"object\" && Object.keys(options).length === 0)\n ) {\n throw new Error(\"Chart options must be provided and not be empty\");\n }\n\n options.ForceWidth = options.ForceWidth ?? \"400\";\n options.ForceHeight = options.ForceHeight ?? \"300\";\n\n const width = Number(options.ForceWidth);\n const height = Number(options.ForceHeight);\n\n onMergeOptions?.(options);\n\n // Initialize ECharts with SVG renderer (no canvas needed in recent versions)\n const chart = echarts.init(null, null, {\n renderer: \"svg\",\n ssr: true,\n width: width,\n height: height,\n });\n\n // Convert data table to chart configuration\n const config = convertDataTableToChartConfig(dataTable, options);\n\n // Set chart options\n chart.setOption(config as EChartsOption);\n\n console.debug(\"Chart options\", JSON.stringify(config, null, 2));\n\n // Get SVG string\n const svgString = chart.renderToSVGString();\n\n // Cleanup\n chart.dispose();\n\n return svgString;\n } catch (error) {\n console.error(\"Error generating chart in Node.js:\", error);\n throw new Error(\n `Failed to generate chart: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { EChartsOption } from "echarts";
2
2
  import { SmeupDataTable } from "../../types/data-structures/smeupDataTable";
3
- import { ChartOptions } from "./charts-converter-types";
3
+ import { ChartOptions } from "../../types/component";
4
4
  /**
5
5
  * Convert SmeupDataTable to ECharts configuration
6
6
  */
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.convertDataTableToChartConfig = convertDataTableToChartConfig;
4
- const charts_converter_types_1 = require("./charts-converter-types");
4
+ const component_1 = require("../../types/component");
5
5
  /**
6
6
  * Convert SmeupDataTable to ECharts configuration
7
7
  */
@@ -9,7 +9,7 @@ function convertDataTableToChartConfig(dataTable, chartOptions) {
9
9
  if (!dataTable.columns || !dataTable.rows || dataTable.rows.length === 0) {
10
10
  throw new Error("Invalid data table: missing columns or rows");
11
11
  }
12
- const chartType = chartOptions.Typ || charts_converter_types_1.ChartType.BAR;
12
+ const chartType = chartOptions.Typ || component_1.ChartType.BAR;
13
13
  // Get visible columns
14
14
  const visibleColumns = dataTable.columns.filter(col => col.visible !== false);
15
15
  if (visibleColumns.length < 2) {
@@ -34,14 +34,14 @@ function convertDataTableToChartConfig(dataTable, chartOptions) {
34
34
  const cellValue = row.cells?.[column.name]?.value;
35
35
  return parseFloat(cellValue?.toString() || "0") || 0;
36
36
  });
37
- const seriesData = chartType === charts_converter_types_1.ChartType.PIE
37
+ const seriesData = chartType === component_1.ChartType.PIE
38
38
  ? data.map((value, index) => ({ value, name: categories[index] }))
39
39
  : data;
40
40
  return {
41
41
  name: column.title || column.name,
42
- type: (Object.values(charts_converter_types_1.ChartType).includes(chartType)
42
+ type: (Object.values(component_1.ChartType).includes(chartType)
43
43
  ? chartType
44
- : charts_converter_types_1.ChartType.BAR).toLowerCase(),
44
+ : component_1.ChartType.BAR).toLowerCase(),
45
45
  data: seriesData,
46
46
  // Witout this, pie chart labels are not shown on PDF documents
47
47
  label: {
@@ -53,7 +53,7 @@ function convertDataTableToChartConfig(dataTable, chartOptions) {
53
53
  // Build chart configuration based on type
54
54
  const config = {
55
55
  tooltip: {
56
- trigger: chartType === charts_converter_types_1.ChartType.PIE ? "item" : "axis",
56
+ trigger: chartType === component_1.ChartType.PIE ? "item" : "axis",
57
57
  },
58
58
  series,
59
59
  textStyle: {
@@ -69,7 +69,7 @@ function convertDataTableToChartConfig(dataTable, chartOptions) {
69
69
  }),
70
70
  };
71
71
  // Add legend for multiple series or pie charts
72
- if (series.length > 1 || chartType === charts_converter_types_1.ChartType.PIE) {
72
+ if (series.length > 1 || chartType === component_1.ChartType.PIE) {
73
73
  config.legend = {
74
74
  data: series.map(s => s.name),
75
75
  textStyle: { fontSize: 12 },
@@ -78,7 +78,7 @@ function convertDataTableToChartConfig(dataTable, chartOptions) {
78
78
  };
79
79
  }
80
80
  // Add axes for non-pie charts
81
- if (chartType !== charts_converter_types_1.ChartType.PIE) {
81
+ if (chartType !== component_1.ChartType.PIE) {
82
82
  config.xAxis = {
83
83
  type: "category",
84
84
  data: categories,
@@ -1 +1 @@
1
- {"version":3,"file":"charts-data-converter.js","sourceRoot":"","sources":["../../../src/converters/images/charts-data-converter.ts"],"names":[],"mappings":"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","sourcesContent":["import { EChartsOption } from \"echarts\";\nimport { SmeupDataTable } from \"../../types/data-structures/smeupDataTable\";\nimport { ChartOptions, ChartType } from \"./charts-converter-types\";\n\n/**\n * Convert SmeupDataTable to ECharts configuration\n */\nexport function convertDataTableToChartConfig(\n dataTable: SmeupDataTable,\n chartOptions: ChartOptions,\n): EChartsOption {\n if (!dataTable.columns || !dataTable.rows || dataTable.rows.length === 0) {\n throw new Error(\"Invalid data table: missing columns or rows\");\n }\n\n const chartType = chartOptions.Typ || ChartType.BAR;\n\n // Get visible columns\n const visibleColumns = dataTable.columns.filter(col => col.visible !== false);\n\n if (visibleColumns.length < 2) {\n throw new Error(\n \"Data table must have at least 2 visible columns for chart generation\",\n );\n }\n\n const categoryColumn = chartOptions.Axe ?? visibleColumns[0].name;\n const seriesColumns = chartOptions.Series?.split(\"|\");\n if (!seriesColumns || seriesColumns.length === 0) {\n throw new Error(\"Chart options must specify at least one series\");\n }\n const dataColumns = seriesColumns\n .map(name => visibleColumns.find(col => col.name === name))\n .filter(\n (column): column is NonNullable<typeof column> => column !== undefined,\n );\n\n if (dataColumns.length === 0) {\n throw new Error(\"No valid data columns found for chart series\");\n }\n\n // Extract categories from first column\n const categories = dataTable.rows.map(\n row => row.cells?.[categoryColumn]?.value?.toString() || \"\",\n );\n\n // Extract data series from remaining columns\n const series = dataColumns.map(column => {\n const data = dataTable.rows.map(row => {\n const cellValue = row.cells?.[column.name]?.value;\n return parseFloat(cellValue?.toString() || \"0\") || 0;\n });\n\n const seriesData =\n chartType === ChartType.PIE\n ? data.map((value, index) => ({ value, name: categories[index] }))\n : data;\n\n return {\n name: column.title || column.name,\n type: (Object.values(ChartType).includes(chartType)\n ? chartType\n : ChartType.BAR\n ).toLowerCase() as \"pie\" | \"line\" | \"bar\" | \"scatter\",\n data: seriesData,\n // Witout this, pie chart labels are not shown on PDF documents\n label: {\n color: \"#696969\",\n fontSize: 14,\n },\n };\n });\n\n // Build chart configuration based on type\n const config: EChartsOption = {\n tooltip: {\n trigger: chartType === ChartType.PIE ? \"item\" : \"axis\",\n },\n series,\n textStyle: {\n fontSize: 18,\n },\n ...(chartOptions.Title && {\n title: {\n text: chartOptions.Title,\n left: \"center\",\n top: \"bottom\",\n textStyle: { fontSize: 12 },\n },\n }),\n };\n // Add legend for multiple series or pie charts\n if (series.length > 1 || chartType === ChartType.PIE) {\n config.legend = {\n data: series.map(s => s.name),\n textStyle: { fontSize: 12 },\n orient: \"vertical\",\n left: \"left\",\n };\n }\n\n // Add axes for non-pie charts\n if (chartType !== ChartType.PIE) {\n config.xAxis = {\n type: \"category\",\n data: categories,\n axisLabel: { fontSize: 12 },\n };\n config.yAxis = {\n type: \"value\",\n axisLabel: { fontSize: 12 },\n };\n }\n\n return config;\n}\n"]}
1
+ {"version":3,"file":"charts-data-converter.js","sourceRoot":"","sources":["../../../src/converters/images/charts-data-converter.ts"],"names":[],"mappings":"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","sourcesContent":["import { EChartsOption } from \"echarts\";\nimport { SmeupDataTable } from \"../../types/data-structures/smeupDataTable\";\nimport { ChartOptions, ChartType } from \"../../types/component\";\n\n/**\n * Convert SmeupDataTable to ECharts configuration\n */\nexport function convertDataTableToChartConfig(\n dataTable: SmeupDataTable,\n chartOptions: ChartOptions,\n): EChartsOption {\n if (!dataTable.columns || !dataTable.rows || dataTable.rows.length === 0) {\n throw new Error(\"Invalid data table: missing columns or rows\");\n }\n\n const chartType = chartOptions.Typ || ChartType.BAR;\n\n // Get visible columns\n const visibleColumns = dataTable.columns.filter(col => col.visible !== false);\n\n if (visibleColumns.length < 2) {\n throw new Error(\n \"Data table must have at least 2 visible columns for chart generation\",\n );\n }\n\n const categoryColumn = chartOptions.Axe ?? visibleColumns[0].name;\n const seriesColumns = chartOptions.Series?.split(\"|\");\n if (!seriesColumns || seriesColumns.length === 0) {\n throw new Error(\"Chart options must specify at least one series\");\n }\n const dataColumns = seriesColumns\n .map(name => visibleColumns.find(col => col.name === name))\n .filter(\n (column): column is NonNullable<typeof column> => column !== undefined,\n );\n\n if (dataColumns.length === 0) {\n throw new Error(\"No valid data columns found for chart series\");\n }\n\n // Extract categories from first column\n const categories = dataTable.rows.map(\n row => row.cells?.[categoryColumn]?.value?.toString() || \"\",\n );\n\n // Extract data series from remaining columns\n const series = dataColumns.map(column => {\n const data = dataTable.rows.map(row => {\n const cellValue = row.cells?.[column.name]?.value;\n return parseFloat(cellValue?.toString() || \"0\") || 0;\n });\n\n const seriesData =\n chartType === ChartType.PIE\n ? data.map((value, index) => ({ value, name: categories[index] }))\n : data;\n\n return {\n name: column.title || column.name,\n type: (Object.values(ChartType).includes(chartType)\n ? chartType\n : ChartType.BAR\n ).toLowerCase() as \"pie\" | \"line\" | \"bar\" | \"scatter\",\n data: seriesData,\n // Witout this, pie chart labels are not shown on PDF documents\n label: {\n color: \"#696969\",\n fontSize: 14,\n },\n };\n });\n\n // Build chart configuration based on type\n const config: EChartsOption = {\n tooltip: {\n trigger: chartType === ChartType.PIE ? \"item\" : \"axis\",\n },\n series,\n textStyle: {\n fontSize: 18,\n },\n ...(chartOptions.Title && {\n title: {\n text: chartOptions.Title,\n left: \"center\",\n top: \"bottom\",\n textStyle: { fontSize: 12 },\n },\n }),\n };\n // Add legend for multiple series or pie charts\n if (series.length > 1 || chartType === ChartType.PIE) {\n config.legend = {\n data: series.map(s => s.name),\n textStyle: { fontSize: 12 },\n orient: \"vertical\",\n left: \"left\",\n };\n }\n\n // Add axes for non-pie charts\n if (chartType !== ChartType.PIE) {\n config.xAxis = {\n type: \"category\",\n data: categories,\n axisLabel: { fontSize: 12 },\n };\n config.yAxis = {\n type: \"value\",\n axisLabel: { fontSize: 12 },\n };\n }\n\n return config;\n}\n"]}
@@ -0,0 +1,28 @@
1
+ import { PdfMakeConverterContext } from "../../pdfmake.types";
2
+ /**
3
+ * Adapter function for converting a box element with a `fun` property to a Smeup box structure.
4
+ *
5
+ * This function returns an asynchronous converter that checks if the provided element contains
6
+ * a box with a `fun` property. If present, it uses the `getSmeupDataStructure` function from
7
+ * the context to fetch the box data corresponding to the `fun` string, and replaces the original
8
+ * box's `fun` property with the fetched data under the `data` property. All other properties
9
+ * of the box are preserved.
10
+ *
11
+ * @returns An asynchronous function that takes an element and a context, and returns the adapted element.
12
+ *
13
+ * @throws If the context does not provide a `getSmeupDataStructure` function when the `fun` property is used.
14
+ *
15
+ * @param element - The input element to be adapted.
16
+ * @param context - The conversion context, which must provide `getSmeupDataStructure` if the `fun` property is present.
17
+ */
18
+ export declare const boxFunAdapter: () => (element: unknown, context: PdfMakeConverterContext) => Promise<unknown>;
19
+ export declare const boxDataAdapter: () => (element: unknown, context: PdfMakeConverterContext) => Promise<unknown>;
20
+ /**
21
+ * Main box adapter that chains all box transformation adapters.
22
+ *
23
+ * This adapter first converts a `fun` property to box data using boxFunAdapter,
24
+ * then transforms the box data to columns with cards using boxDataAdapter.
25
+ *
26
+ * @returns An asynchronous function that applies all box adapters in sequence.
27
+ */
28
+ export declare const boxAdapter: () => (element: unknown, context: PdfMakeConverterContext) => Promise<unknown>;
@@ -0,0 +1,164 @@
1
+ "use strict";
2
+ // ...
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.boxAdapter = exports.boxDataAdapter = exports.boxFunAdapter = void 0;
5
+ const smeupDataStructure_1 = require("../../../../../types/data-structures/smeupDataStructure");
6
+ const box_layouts_1 = require("./box-layouts");
7
+ const adapter_processor_1 = require("../../adapter-processor");
8
+ const hasSmeupBoxData = (element) => {
9
+ const box = element
10
+ ?.box;
11
+ const data = box?.smeup?.data;
12
+ return (data?.type === smeupDataStructure_1.SmeupDataStructureType.SmeupDataTable &&
13
+ Array.isArray(data?.rows) &&
14
+ Array.isArray(data?.columns));
15
+ };
16
+ const hasSmeupBox = (element) => {
17
+ const box = element
18
+ ?.box;
19
+ const fun = box?.smeup?.fun;
20
+ return typeof fun === "string" && fun.length > 0;
21
+ };
22
+ /**
23
+ * Adapter function for converting a box element with a `fun` property to a Smeup box structure.
24
+ *
25
+ * This function returns an asynchronous converter that checks if the provided element contains
26
+ * a box with a `fun` property. If present, it uses the `getSmeupDataStructure` function from
27
+ * the context to fetch the box data corresponding to the `fun` string, and replaces the original
28
+ * box's `fun` property with the fetched data under the `data` property. All other properties
29
+ * of the box are preserved.
30
+ *
31
+ * @returns An asynchronous function that takes an element and a context, and returns the adapted element.
32
+ *
33
+ * @throws If the context does not provide a `getSmeupDataStructure` function when the `fun` property is used.
34
+ *
35
+ * @param element - The input element to be adapted.
36
+ * @param context - The conversion context, which must provide `getSmeupDataStructure` if the `fun` property is present.
37
+ */
38
+ const boxFunAdapter = () => {
39
+ return async (element, context) => {
40
+ if (!hasSmeupBox(element)) {
41
+ return element;
42
+ }
43
+ else {
44
+ if (!context.getSmeupDataStructure) {
45
+ throw new Error("getSmeupDataStructure function is required in context when the fun property is used");
46
+ }
47
+ else {
48
+ const elementWithBox = element;
49
+ const funStr = elementWithBox.box.smeup.fun;
50
+ const boxData = (await context.getSmeupDataStructure(funStr));
51
+ // Extract all properties except 'fun' from the smeup object
52
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
53
+ const { fun, ...smeupRest } = elementWithBox.box.smeup;
54
+ // Extract all properties except 'smeup' from the box object
55
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
56
+ const { smeup, ...boxRest } = elementWithBox.box;
57
+ return {
58
+ ...elementWithBox,
59
+ box: {
60
+ ...boxRest,
61
+ smeup: {
62
+ ...smeupRest,
63
+ data: boxData,
64
+ },
65
+ },
66
+ };
67
+ }
68
+ }
69
+ };
70
+ };
71
+ exports.boxFunAdapter = boxFunAdapter;
72
+ /**
73
+ * Adapts a Smeup box structure to PDFMake columns with cards.
74
+ *
75
+ * This adapter function checks if the provided element contains a box with data.
76
+ * If so, it generates columns containing cards from the data rows and replaces the box
77
+ * object with column structures. The number of columns and which data columns to display
78
+ * are determined by the options.
79
+ *
80
+ * @returns A function that takes an element and returns the adapted element for PDFMake,
81
+ * or the original element if it does not contain a valid box with data.
82
+ * @throws If options.Columns is missing or empty.
83
+ */
84
+ // Map of available layout builders
85
+ const layoutBuilders = {
86
+ "1": box_layouts_1.buildLayout1,
87
+ "2": box_layouts_1.buildLayout2,
88
+ "5": box_layouts_1.buildLayout5,
89
+ };
90
+ const boxDataAdapter = () => {
91
+ return async (element, context) => {
92
+ if (!hasSmeupBoxData(element)) {
93
+ return element;
94
+ }
95
+ const elementWithBox = element;
96
+ const data = elementWithBox.box.smeup.data;
97
+ const options = elementWithBox.box.smeup.options;
98
+ // Validate that options.Columns exists
99
+ if (!options?.Columns || options.Columns.trim().length === 0) {
100
+ throw new Error("options.Columns is required for box adapter");
101
+ }
102
+ // Parse column names from options.Columns (pipe-separated)
103
+ const columnNames = options.Columns.split("|")
104
+ .map(name => name.trim())
105
+ .filter(name => name.length > 0);
106
+ // Parse number of columns (default to 1)
107
+ const numCols = options.Cols ? parseInt(options.Cols, 10) : 1;
108
+ const cols = isNaN(numCols) || numCols < 1 ? 1 : numCols;
109
+ // Distribute rows horizontally across columns
110
+ const rows = data.rows;
111
+ const columnsArray = [];
112
+ // Select the appropriate layout builder (default: layout 1)
113
+ const buildLayout = layoutBuilders[options.LayoutNbr || "1"] || box_layouts_1.buildLayout1;
114
+ // Calculate how many complete rows of columns we'll have
115
+ let rowIndex = 0;
116
+ while (rowIndex < rows.length) {
117
+ const columnsInThisRow = [];
118
+ // Fill this row with up to 'cols' cards
119
+ for (let colIndex = 0; colIndex < cols && rowIndex < rows.length; colIndex++) {
120
+ const card = buildLayout(rows[rowIndex], data.columns, columnNames, context, options);
121
+ columnsInThisRow.push(card);
122
+ rowIndex++;
123
+ }
124
+ // Fill with empty objects to ensure the number of columns is always a multiple of cols
125
+ while (columnsInThisRow.length < cols) {
126
+ columnsInThisRow.push({});
127
+ }
128
+ // Add this row of columns to the array
129
+ columnsArray.push({
130
+ columns: columnsInThisRow,
131
+ columnGap: 10,
132
+ });
133
+ }
134
+ // Extract all properties except 'box' from the element
135
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
136
+ const { box, ...elementRest } = elementWithBox;
137
+ let processedValue = columnsArray;
138
+ if (context._adapters) {
139
+ processedValue = await (0, adapter_processor_1.processDocument)(columnsArray, context._adapters, context);
140
+ }
141
+ // Return the element with columns array replacing the box
142
+ return {
143
+ ...elementRest,
144
+ stack: processedValue,
145
+ };
146
+ };
147
+ };
148
+ exports.boxDataAdapter = boxDataAdapter;
149
+ /**
150
+ * Main box adapter that chains all box transformation adapters.
151
+ *
152
+ * This adapter first converts a `fun` property to box data using boxFunAdapter,
153
+ * then transforms the box data to columns with cards using boxDataAdapter.
154
+ *
155
+ * @returns An asynchronous function that applies all box adapters in sequence.
156
+ */
157
+ const boxAdapter = () => {
158
+ return async (element, context) => {
159
+ const adaptedElement = await (0, exports.boxFunAdapter)()(element, context);
160
+ return (0, exports.boxDataAdapter)()(adaptedElement, context);
161
+ };
162
+ };
163
+ exports.boxAdapter = boxAdapter;
164
+ //# sourceMappingURL=box-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"box-adapter.js","sourceRoot":"","sources":["../../../../../../src/converters/pdf/pdfmake/adapters/box/box-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["// ...\n\nimport { PdfMakeConverterContext } from \"../../pdfmake.types\";\n\nimport { SmeupDataStructureType } from \"../../../../../types/data-structures/smeupDataStructure\";\nimport { SmeupDataTable } from \"../../../../../types/data-structures/smeupDataTable\";\nimport { BoxOptions } from \"../../../../../types/component\";\nimport { buildLayout1, buildLayout2, buildLayout5 } from \"./box-layouts\";\nimport { processDocument } from \"../../adapter-processor\";\n\ninterface ContentBoxExtension {\n box: {\n smeup?: {\n data?: SmeupDataTable;\n fun?: string;\n options?: BoxOptions;\n };\n };\n}\n\ninterface ElementWithBoxExtension {\n box: ContentBoxExtension[\"box\"];\n [key: string]: unknown;\n}\n\nconst hasSmeupBoxData = (\n element: unknown,\n): element is ElementWithBoxExtension => {\n const box = (element as Record<string, unknown>)\n ?.box as ContentBoxExtension[\"box\"];\n const data = box?.smeup?.data as SmeupDataTable | undefined;\n return (\n data?.type === SmeupDataStructureType.SmeupDataTable &&\n Array.isArray(data?.rows) &&\n Array.isArray(data?.columns)\n );\n};\n\nconst hasSmeupBox = (element: unknown): element is ElementWithBoxExtension => {\n const box = (element as Record<string, unknown>)\n ?.box as ContentBoxExtension[\"box\"];\n const fun = box?.smeup?.fun;\n return typeof fun === \"string\" && fun.length > 0;\n};\n\n/**\n * Adapter function for converting a box element with a `fun` property to a Smeup box structure.\n *\n * This function returns an asynchronous converter that checks if the provided element contains\n * a box with a `fun` property. If present, it uses the `getSmeupDataStructure` function from\n * the context to fetch the box data corresponding to the `fun` string, and replaces the original\n * box's `fun` property with the fetched data under the `data` property. All other properties\n * of the box are preserved.\n *\n * @returns An asynchronous function that takes an element and a context, and returns the adapted element.\n *\n * @throws If the context does not provide a `getSmeupDataStructure` function when the `fun` property is used.\n *\n * @param element - The input element to be adapted.\n * @param context - The conversion context, which must provide `getSmeupDataStructure` if the `fun` property is present.\n */\nexport const boxFunAdapter = () => {\n return async (\n element: unknown,\n context: PdfMakeConverterContext,\n ): Promise<unknown> => {\n if (!hasSmeupBox(element)) {\n return element;\n } else {\n if (!context.getSmeupDataStructure) {\n throw new Error(\n \"getSmeupDataStructure function is required in context when the fun property is used\",\n );\n } else {\n const elementWithBox = element as ElementWithBoxExtension;\n const funStr = elementWithBox.box.smeup!.fun!;\n const boxData = (await context.getSmeupDataStructure(\n funStr,\n )) as SmeupDataTable;\n\n // Extract all properties except 'fun' from the smeup object\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { fun, ...smeupRest } = elementWithBox.box.smeup!;\n // Extract all properties except 'smeup' from the box object\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { smeup, ...boxRest } = elementWithBox.box;\n\n return {\n ...elementWithBox,\n box: {\n ...boxRest,\n smeup: {\n ...smeupRest,\n data: boxData,\n },\n },\n };\n }\n }\n };\n};\n\n/**\n * Adapts a Smeup box structure to PDFMake columns with cards.\n *\n * This adapter function checks if the provided element contains a box with data.\n * If so, it generates columns containing cards from the data rows and replaces the box\n * object with column structures. The number of columns and which data columns to display\n * are determined by the options.\n *\n * @returns A function that takes an element and returns the adapted element for PDFMake,\n * or the original element if it does not contain a valid box with data.\n * @throws If options.Columns is missing or empty.\n */\n// Map of available layout builders\nconst layoutBuilders: Record<string, typeof buildLayout1> = {\n \"1\": buildLayout1,\n \"2\": buildLayout2,\n \"5\": buildLayout5,\n};\n\nexport const boxDataAdapter = () => {\n return async (\n element: unknown,\n context: PdfMakeConverterContext,\n ): Promise<unknown> => {\n if (!hasSmeupBoxData(element)) {\n return element;\n }\n\n const elementWithBox = element as ElementWithBoxExtension;\n const data = elementWithBox.box.smeup!.data!;\n const options = elementWithBox.box.smeup!.options as BoxOptions | undefined;\n\n // Validate that options.Columns exists\n if (!options?.Columns || options.Columns.trim().length === 0) {\n throw new Error(\"options.Columns is required for box adapter\");\n }\n\n // Parse column names from options.Columns (pipe-separated)\n const columnNames = options.Columns.split(\"|\")\n .map(name => name.trim())\n .filter(name => name.length > 0);\n\n // Parse number of columns (default to 1)\n const numCols = options.Cols ? parseInt(options.Cols, 10) : 1;\n const cols = isNaN(numCols) || numCols < 1 ? 1 : numCols;\n\n // Distribute rows horizontally across columns\n const rows = data.rows;\n const columnsArray: unknown[] = [];\n\n // Select the appropriate layout builder (default: layout 1)\n const buildLayout =\n layoutBuilders[options.LayoutNbr || \"1\"] || buildLayout1;\n\n // Calculate how many complete rows of columns we'll have\n let rowIndex = 0;\n\n while (rowIndex < rows.length) {\n const columnsInThisRow: unknown[] = [];\n\n // Fill this row with up to 'cols' cards\n for (\n let colIndex = 0;\n colIndex < cols && rowIndex < rows.length;\n colIndex++\n ) {\n const card = buildLayout(\n rows[rowIndex],\n data.columns,\n columnNames,\n context,\n options,\n );\n columnsInThisRow.push(card);\n rowIndex++;\n }\n\n // Fill with empty objects to ensure the number of columns is always a multiple of cols\n while (columnsInThisRow.length < cols) {\n columnsInThisRow.push({});\n }\n\n // Add this row of columns to the array\n columnsArray.push({\n columns: columnsInThisRow,\n columnGap: 10,\n });\n }\n\n // Extract all properties except 'box' from the element\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { box, ...elementRest } = elementWithBox;\n\n let processedValue: unknown = columnsArray;\n if (context._adapters) {\n processedValue = await processDocument(\n columnsArray,\n context._adapters,\n context,\n );\n }\n\n // Return the element with columns array replacing the box\n return {\n ...elementRest,\n stack: processedValue,\n };\n };\n};\n\n/**\n * Main box adapter that chains all box transformation adapters.\n *\n * This adapter first converts a `fun` property to box data using boxFunAdapter,\n * then transforms the box data to columns with cards using boxDataAdapter.\n *\n * @returns An asynchronous function that applies all box adapters in sequence.\n */\nexport const boxAdapter = () => {\n return async (\n element: unknown,\n context: PdfMakeConverterContext,\n ): Promise<unknown> => {\n const adaptedElement = await boxFunAdapter()(element, context);\n return boxDataAdapter()(adaptedElement, context);\n };\n};\n"]}
@@ -0,0 +1,6 @@
1
+ import { SmeupDataRow, SmeupDataColumn } from "../../../../../types/data-structures/smeupDataTable";
2
+ import { PdfMakeConverterContext } from "../../pdfmake.types";
3
+ import { BoxOptions } from "../../../../../types/component";
4
+ export declare const buildLayout1: (row: SmeupDataRow, columns: SmeupDataColumn[], columnNames: string[], context: PdfMakeConverterContext, options: BoxOptions) => unknown;
5
+ export declare const buildLayout2: (row: SmeupDataRow, columns: SmeupDataColumn[], columnNames: string[], context: PdfMakeConverterContext, options: BoxOptions) => unknown;
6
+ export declare const buildLayout5: (row: SmeupDataRow, columns: SmeupDataColumn[], columnNames: string[], context: PdfMakeConverterContext, options: BoxOptions) => unknown;
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildLayout5 = exports.buildLayout2 = exports.buildLayout1 = void 0;
4
+ const types_1 = require("../../../../../types");
5
+ const commons_utility_1 = require("../../../../../utils/commons-utility");
6
+ const cells_utility_1 = require("../../../../../utils/cells-utility");
7
+ const helpers_1 = require("../helpers");
8
+ const buildLayout1 = (row, columns, columnNames, context, options) => {
9
+ return buildTwoColumnLayout(row, columns, columnNames, context, options, {}, { bold: true });
10
+ };
11
+ exports.buildLayout1 = buildLayout1;
12
+ const buildLayout2 = (row, columns, columnNames, context, options) => {
13
+ return buildTwoColumnLayout(row, columns, columnNames, context, options, {}, { bold: true, alignment: "right" });
14
+ };
15
+ exports.buildLayout2 = buildLayout2;
16
+ const buildLayout5 = (row, columns, columnNames, context, options) => {
17
+ const body = [];
18
+ // Check if there's an image cell
19
+ let imageCell = null;
20
+ const dataCells = [];
21
+ for (const columnName of columnNames) {
22
+ // Find the column definition
23
+ const columnDef = columns.find(col => col.name === columnName);
24
+ if (!columnDef) {
25
+ console.warn(`Column "${columnName}" not found in data columns`);
26
+ continue;
27
+ }
28
+ // Get the label (title with fallback to name)
29
+ const label = columnDef.title || columnDef.name;
30
+ // Get the cell
31
+ const cell = row.cells?.[columnName] ?? {
32
+ value: "",
33
+ obj: { t: "", p: "", k: "" },
34
+ };
35
+ // Check if this is an image cell
36
+ if ((0, cells_utility_1.cellIsImage)(cell) && !imageCell) {
37
+ imageCell = cell;
38
+ }
39
+ else {
40
+ const value = (0, commons_utility_1.calculateCellValue)(cell, types_1.SupportedExportFormats.PDF, context.webupManagerData);
41
+ dataCells.push({ label, value });
42
+ }
43
+ }
44
+ // Build the table body
45
+ const hasImage = imageCell !== null;
46
+ for (let i = 0; i < dataCells.length; i++) {
47
+ const { label, value } = dataCells[i];
48
+ const labelCell = {
49
+ text: label,
50
+ style: "box__label",
51
+ alignment: "right",
52
+ bold: false,
53
+ };
54
+ const valueCell = {
55
+ text: value,
56
+ style: "box__value",
57
+ bold: true,
58
+ };
59
+ const row = [];
60
+ // Add image column if present
61
+ if (hasImage) {
62
+ if (i === 0) {
63
+ // First row: include image with rowspan
64
+ row.push((0, helpers_1.buildImageCell)(imageCell, options, dataCells.length));
65
+ }
66
+ else {
67
+ // Subsequent rows: empty cell (handled by rowspan)
68
+ row.push({});
69
+ }
70
+ }
71
+ row.push(labelCell, valueCell);
72
+ body.push(row);
73
+ }
74
+ return buildCard({
75
+ table: {
76
+ widths: hasImage ? ["33%", "*", "*"] : ["*", "*"],
77
+ body: body,
78
+ },
79
+ layout: "noBorders",
80
+ padding: [10, 10, 10, 10],
81
+ });
82
+ };
83
+ exports.buildLayout5 = buildLayout5;
84
+ const buildTwoColumnLayout = (row, columns, columnNames, context, options, labelInnerStyle, valueInnerStyle) => {
85
+ const body = [];
86
+ for (const columnName of columnNames) {
87
+ // Find the column definition
88
+ const columnDef = columns.find(col => col.name === columnName);
89
+ if (!columnDef) {
90
+ console.warn(`Column "${columnName}" not found in data columns`);
91
+ continue;
92
+ }
93
+ // Get the label (title with fallback to name)
94
+ const label = columnDef.title || columnDef.name;
95
+ // Get the cell value (empty string if missing)
96
+ const cell = row.cells?.[columnName] ?? {
97
+ value: "",
98
+ obj: { t: "", p: "", k: "" },
99
+ };
100
+ const value = (0, commons_utility_1.calculateCellValue)(cell, types_1.SupportedExportFormats.PDF, context.webupManagerData);
101
+ body.push([
102
+ {
103
+ text: [{ text: label, ...labelInnerStyle }],
104
+ style: "box__label",
105
+ },
106
+ (0, cells_utility_1.cellIsImage)(cell)
107
+ ? (0, helpers_1.buildImageCell)(cell, options)
108
+ : {
109
+ text: [{ text: value, ...valueInnerStyle }],
110
+ style: "box__value",
111
+ },
112
+ ]);
113
+ }
114
+ return buildCard({
115
+ table: {
116
+ widths: ["*", "*"],
117
+ body: body,
118
+ },
119
+ layout: "noBorders",
120
+ padding: [10, 10, 10, 10],
121
+ });
122
+ };
123
+ const buildCard = (content) => {
124
+ return {
125
+ table: {
126
+ widths: ["*"],
127
+ body: [[content]],
128
+ },
129
+ layout: {
130
+ hLineWidth: function (_i, _node) {
131
+ return 1;
132
+ },
133
+ vLineWidth: function (_i, _node) {
134
+ return 1;
135
+ },
136
+ hLineColor: function (_i, _node) {
137
+ return "#CCCCCC";
138
+ },
139
+ vLineColor: function (_i, _node) {
140
+ return "#CCCCCC";
141
+ },
142
+ },
143
+ margin: [0, 0, 0, 10],
144
+ unbreakable: true,
145
+ };
146
+ };
147
+ //# sourceMappingURL=box-layouts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"box-layouts.js","sourceRoot":"","sources":["../../../../../../src/converters/pdf/pdfmake/adapters/box/box-layouts.ts"],"names":[],"mappings":"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","sourcesContent":["import { Content, Style } from \"pdfmake/interfaces\";\nimport { SupportedExportFormats } from \"../../../../../types\";\nimport {\n SmeupDataRow,\n SmeupDataColumn,\n SmeupDataCell,\n} from \"../../../../../types/data-structures/smeupDataTable\";\nimport { calculateCellValue } from \"../../../../../utils/commons-utility\";\nimport { PdfMakeConverterContext } from \"../../pdfmake.types\";\nimport { BoxOptions } from \"../../../../../types/component\";\nimport { cellIsImage } from \"../../../../../utils/cells-utility\";\nimport { buildImageCell } from \"../helpers\";\n\nexport const buildLayout1 = (\n row: SmeupDataRow,\n columns: SmeupDataColumn[],\n columnNames: string[],\n context: PdfMakeConverterContext,\n options: BoxOptions,\n): unknown => {\n return buildTwoColumnLayout(\n row,\n columns,\n columnNames,\n context,\n options,\n {},\n { bold: true },\n );\n};\n\nexport const buildLayout2 = (\n row: SmeupDataRow,\n columns: SmeupDataColumn[],\n columnNames: string[],\n context: PdfMakeConverterContext,\n options: BoxOptions,\n): unknown => {\n return buildTwoColumnLayout(\n row,\n columns,\n columnNames,\n context,\n options,\n {},\n { bold: true, alignment: \"right\" },\n );\n};\n\nexport const buildLayout5 = (\n row: SmeupDataRow,\n columns: SmeupDataColumn[],\n columnNames: string[],\n context: PdfMakeConverterContext,\n options: BoxOptions,\n): unknown => {\n const body: unknown[][] = [];\n\n // Check if there's an image cell\n let imageCell: SmeupDataCell | null = null;\n const dataCells: Array<{ label: string; value: string }> = [];\n\n for (const columnName of columnNames) {\n // Find the column definition\n const columnDef = columns.find(col => col.name === columnName);\n\n if (!columnDef) {\n console.warn(`Column \"${columnName}\" not found in data columns`);\n continue;\n }\n\n // Get the label (title with fallback to name)\n const label = columnDef.title || columnDef.name;\n\n // Get the cell\n const cell = (row.cells?.[columnName] as SmeupDataCell) ?? {\n value: \"\",\n obj: { t: \"\", p: \"\", k: \"\" },\n };\n\n // Check if this is an image cell\n if (cellIsImage(cell) && !imageCell) {\n imageCell = cell;\n } else {\n const value = calculateCellValue(\n cell,\n SupportedExportFormats.PDF,\n context.webupManagerData,\n ) as string;\n dataCells.push({ label, value });\n }\n }\n\n // Build the table body\n const hasImage = imageCell !== null;\n\n for (let i = 0; i < dataCells.length; i++) {\n const { label, value } = dataCells[i];\n\n const labelCell = {\n text: label,\n style: \"box__label\",\n alignment: \"right\",\n bold: false,\n };\n\n const valueCell = {\n text: value,\n style: \"box__value\",\n bold: true,\n };\n\n const row: unknown[] = [];\n\n // Add image column if present\n if (hasImage) {\n if (i === 0) {\n // First row: include image with rowspan\n row.push(buildImageCell(imageCell!, options, dataCells.length));\n } else {\n // Subsequent rows: empty cell (handled by rowspan)\n row.push({});\n }\n }\n\n row.push(labelCell, valueCell);\n body.push(row);\n }\n\n return buildCard({\n table: {\n widths: hasImage ? [\"33%\", \"*\", \"*\"] : [\"*\", \"*\"],\n body: body,\n },\n layout: \"noBorders\",\n padding: [10, 10, 10, 10],\n } as Content);\n};\n\nconst buildTwoColumnLayout = (\n row: SmeupDataRow,\n columns: SmeupDataColumn[],\n columnNames: string[],\n context: PdfMakeConverterContext,\n options: BoxOptions,\n labelInnerStyle: Style,\n valueInnerStyle: Style,\n): unknown => {\n const body: unknown[] = [];\n\n for (const columnName of columnNames) {\n // Find the column definition\n const columnDef = columns.find(col => col.name === columnName);\n\n if (!columnDef) {\n console.warn(`Column \"${columnName}\" not found in data columns`);\n continue;\n }\n\n // Get the label (title with fallback to name)\n const label = columnDef.title || columnDef.name;\n\n // Get the cell value (empty string if missing)\n const cell = (row.cells?.[columnName] as SmeupDataCell) ?? {\n value: \"\",\n obj: { t: \"\", p: \"\", k: \"\" },\n };\n const value = calculateCellValue(\n cell,\n SupportedExportFormats.PDF,\n context.webupManagerData,\n );\n\n body.push([\n {\n text: [{ text: label, ...labelInnerStyle }],\n style: \"box__label\",\n },\n cellIsImage(cell)\n ? buildImageCell(cell, options)\n : {\n text: [{ text: value, ...valueInnerStyle }],\n style: \"box__value\",\n },\n ]);\n }\n\n return buildCard({\n table: {\n widths: [\"*\", \"*\"],\n body: body,\n },\n layout: \"noBorders\",\n padding: [10, 10, 10, 10],\n } as Content);\n};\n\nconst buildCard = (content: Content): unknown => {\n return {\n table: {\n widths: [\"*\"],\n body: [[content]],\n },\n layout: {\n hLineWidth: function (_i: number, _node: unknown) {\n return 1;\n },\n vLineWidth: function (_i: number, _node: unknown) {\n return 1;\n },\n hLineColor: function (_i: number, _node: unknown) {\n return \"#CCCCCC\";\n },\n vLineColor: function (_i: number, _node: unknown) {\n return \"#CCCCCC\";\n },\n },\n margin: [0, 0, 0, 10],\n unbreakable: true,\n };\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { PdfMakeConverterContext, ElementWithChartExtension } from "../pdfmake.types";
1
+ import { PdfMakeConverterContext, ElementWithChartExtension } from "../../pdfmake.types";
2
2
  /**
3
3
  * Adapts a Smeup chart structure to the PDFMake SVG format.
4
4
  *
@@ -2,8 +2,8 @@
2
2
  // ...
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.chartAdapter = exports.funToSmeupChartAdapter = exports.smeupChartToPdfMakeSvgAdapter = void 0;
5
- const smeupDataStructure_1 = require("../../../../types/data-structures/smeupDataStructure");
6
- const charts_converter_1 = require("../../../images/charts-converter");
5
+ const smeupDataStructure_1 = require("../../../../../types/data-structures/smeupDataStructure");
6
+ const charts_converter_1 = require("../../../../images/charts-converter");
7
7
  const hasChartWithData = (element) => {
8
8
  const chart = element
9
9
  ?.chart;
@@ -35,16 +35,17 @@ const smeupChartToPdfMakeSvgAdapter = () => {
35
35
  }
36
36
  const elementWithChart = element;
37
37
  const options = elementWithChart.chart.smeup.options;
38
- const svg = await (0, charts_converter_1.dataTableToChart)(elementWithChart.chart.smeup.data, options);
39
- const width = options.ForceWidth ? Number(options.ForceWidth) : undefined;
40
- const height = options.ForceHeight
41
- ? Number(options.ForceHeight)
42
- : undefined;
38
+ let mergedOptions;
39
+ const svg = await (0, charts_converter_1.dataTableToChart)(elementWithChart.chart.smeup.data, options, (merged) => {
40
+ mergedOptions = merged;
41
+ });
42
+ const width = mergedOptions.ForceWidth;
43
+ const height = mergedOptions.ForceHeight;
43
44
  return {
44
45
  ...elementWithChart,
45
46
  svg: svg,
46
- ...(width ? { width } : {}),
47
- ...(height ? { height } : {}),
47
+ ...width,
48
+ ...height,
48
49
  };
49
50
  };
50
51
  };