@sme.up/doc-alchemist 1.7.0-SNAPSHOT-20251218155723 → 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.
- package/dist/converters/images/charts-converter.d.ts +1 -1
- package/dist/converters/images/charts-converter.js.map +1 -1
- package/dist/converters/images/charts-data-converter.d.ts +1 -1
- package/dist/converters/images/charts-data-converter.js +8 -8
- package/dist/converters/images/charts-data-converter.js.map +1 -1
- package/dist/converters/pdf/pdfmake/adapters/box/box-adapter.d.ts +28 -0
- package/dist/converters/pdf/pdfmake/adapters/box/box-adapter.js +164 -0
- package/dist/converters/pdf/pdfmake/adapters/box/box-adapter.js.map +1 -0
- package/dist/converters/pdf/pdfmake/adapters/box/box-layouts.d.ts +6 -0
- package/dist/converters/pdf/pdfmake/adapters/box/box-layouts.js +147 -0
- package/dist/converters/pdf/pdfmake/adapters/box/box-layouts.js.map +1 -0
- package/dist/converters/pdf/pdfmake/adapters/{chart-adapter.d.ts → chart/chart-adapter.d.ts} +1 -1
- package/dist/converters/pdf/pdfmake/adapters/{chart-adapter.js → chart/chart-adapter.js} +2 -2
- package/dist/converters/pdf/pdfmake/adapters/chart/chart-adapter.js.map +1 -0
- package/dist/converters/pdf/pdfmake/adapters/helpers.d.ts +3 -0
- package/dist/converters/pdf/pdfmake/adapters/helpers.js +18 -0
- package/dist/converters/pdf/pdfmake/adapters/helpers.js.map +1 -0
- package/dist/converters/pdf/pdfmake/adapters/{image-adapter.d.ts → image/image-adapter.d.ts} +1 -1
- package/dist/converters/pdf/pdfmake/adapters/image/image-adapter.js.map +1 -0
- package/dist/converters/pdf/pdfmake/adapters/{layout-adapter.d.ts → layout/layout-adapter.d.ts} +1 -1
- package/dist/converters/pdf/pdfmake/adapters/layout/layout-adapter.js.map +1 -0
- package/dist/converters/pdf/pdfmake/adapters/{page-element-adapter.d.ts → page-alement/page-element-adapter.d.ts} +1 -1
- package/dist/converters/pdf/pdfmake/adapters/{page-element-adapter.js → page-alement/page-element-adapter.js} +1 -1
- package/dist/converters/pdf/pdfmake/adapters/page-alement/page-element-adapter.js.map +1 -0
- package/dist/converters/pdf/pdfmake/adapters/{table-adapter.d.ts → table/table-adapter.d.ts} +1 -1
- package/dist/converters/pdf/pdfmake/adapters/{table-adapter.js → table/table-adapter.js} +16 -8
- package/dist/converters/pdf/pdfmake/adapters/table/table-adapter.js.map +1 -0
- package/dist/converters/pdf/pdfmake/pdfmake.types.d.ts +2 -3
- package/dist/converters/pdf/pdfmake/pdfmake.types.js.map +1 -1
- package/dist/converters/pdf-converter.js +7 -5
- package/dist/converters/pdf-converter.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/types/component.d.ts +34 -0
- package/dist/types/component.js +8 -1
- package/dist/types/component.js.map +1 -1
- package/dist/utils/cells-utility.d.ts +2 -0
- package/dist/utils/cells-utility.js +10 -0
- package/dist/utils/cells-utility.js.map +1 -0
- package/dist/utils/filters-utility.js +0 -1
- package/dist/utils/filters-utility.js.map +1 -1
- package/dist/utils/objects-utility.d.ts +1 -0
- package/dist/utils/objects-utility.js +7 -1
- package/dist/utils/objects-utility.js.map +1 -1
- package/package.json +1 -1
- package/dist/converters/images/charts-converter-types.d.ts +0 -15
- package/dist/converters/images/charts-converter-types.js +0 -11
- package/dist/converters/images/charts-converter-types.js.map +0 -1
- package/dist/converters/pdf/pdfmake/adapters/chart-adapter.js.map +0 -1
- package/dist/converters/pdf/pdfmake/adapters/image-adapter.js.map +0 -1
- package/dist/converters/pdf/pdfmake/adapters/layout-adapter.js.map +0 -1
- package/dist/converters/pdf/pdfmake/adapters/page-element-adapter.js.map +0 -1
- package/dist/converters/pdf/pdfmake/adapters/table-adapter.js.map +0 -1
- /package/dist/converters/pdf/pdfmake/adapters/{image-adapter.js → image/image-adapter.js} +0 -0
- /package/dist/converters/pdf/pdfmake/adapters/{layout-adapter.js → layout/layout-adapter.js} +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SmeupDataTable } from "../../types/data-structures/smeupDataTable";
|
|
2
|
-
import { ChartOptions } from "
|
|
2
|
+
import { ChartOptions } from "../../types/component";
|
|
3
3
|
/**
|
|
4
4
|
* Converts SmeupDataTable to chart SVG string
|
|
5
5
|
* @param dataTable - SmeupDataTable containing the data
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"charts-converter.js","sourceRoot":"","sources":["../../../src/converters/images/charts-converter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAAmC;AAGnC,mEAAwE;
|
|
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 "
|
|
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
|
|
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 ||
|
|
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 ===
|
|
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(
|
|
42
|
+
type: (Object.values(component_1.ChartType).includes(chartType)
|
|
43
43
|
? chartType
|
|
44
|
-
:
|
|
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 ===
|
|
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 ===
|
|
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 !==
|
|
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":";;AAOA,sEA4GC;AAjHD,
|
|
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"]}
|
|
@@ -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("
|
|
6
|
-
const charts_converter_1 = require("
|
|
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;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-adapter.js","sourceRoot":"","sources":["../../../../../../src/converters/pdf/pdfmake/adapters/chart/chart-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["// ...\n\nimport {\n PdfMakeConverterContext,\n ContentChartExtension,\n ElementWithChartExtension,\n} from \"../../pdfmake.types\";\n\nimport { SmeupDataStructureType } from \"../../../../../types/data-structures/smeupDataStructure\";\nimport { SmeupDataTable } from \"../../../../../types/data-structures/smeupDataTable\";\nimport { dataTableToChart } from \"../../../../images/charts-converter\";\nimport { ChartOptions } from \"../../../../../types/component\";\n\nconst hasChartWithData = (\n element: unknown,\n): element is ElementWithChartExtension => {\n const chart = (element as Record<string, unknown>)\n ?.chart as ContentChartExtension;\n const data = chart?.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 hasChartWithFun = (\n element: unknown,\n): element is ElementWithChartExtension => {\n const chart = (element as Record<string, unknown>)\n ?.chart as ContentChartExtension;\n const fun = chart?.smeup?.fun;\n return typeof fun === \"string\" && fun.length > 0;\n};\n\n/**\n * Adapts a Smeup chart structure to the PDFMake SVG format.\n *\n * This adapter function checks if the provided element contains a chart with data.\n * If so, it generates an SVG representation from the chart data and replaces the chart\n * object with an svg property. All properties of the original chart except `data` are preserved.\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 chart with data.\n */\nexport const smeupChartToPdfMakeSvgAdapter = () => {\n return async (\n element: unknown,\n _context: PdfMakeConverterContext,\n ): Promise<ElementWithChartExtension> => {\n if (!hasChartWithData(element)) {\n return element as ElementWithChartExtension;\n }\n\n const elementWithChart = element as ElementWithChartExtension;\n const options = elementWithChart.chart.smeup!.options as ChartOptions;\n\n let mergedOptions;\n\n const svg = await dataTableToChart(\n elementWithChart.chart.smeup!.data!,\n options,\n (merged: ChartOptions) => {\n mergedOptions = merged;\n },\n );\n\n const width = mergedOptions!.ForceWidth;\n const height = mergedOptions!.ForceHeight;\n\n return {\n ...elementWithChart,\n svg: svg,\n ...width,\n ...height,\n } as ElementWithChartExtension;\n };\n};\n\n/**\n * Adapter function for converting a chart element with a `fun` property to a Smeup chart structure.\n *\n * This function returns an asynchronous converter that checks if the provided element contains\n * a chart with a `fun` property. If present, it uses the `getSmeupDataStructure` function from\n * the context to fetch the chart data corresponding to the `fun` string, and replaces the original\n * chart's `fun` property with the fetched data under the `data` property. All other properties\n * of the chart 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 funToSmeupChartAdapter = () => {\n return async (\n element: unknown,\n context: PdfMakeConverterContext,\n ): Promise<ElementWithChartExtension> => {\n if (!hasChartWithFun(element)) {\n return element as ElementWithChartExtension;\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 elementWithChart = element as ElementWithChartExtension;\n const funStr = elementWithChart.chart.smeup!.fun!;\n const chartData = (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 } = elementWithChart.chart.smeup!;\n // Extract all properties except 'smeup' from the chart object\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { smeup, ...chartRest } = elementWithChart.chart;\n\n return {\n ...elementWithChart,\n chart: {\n ...chartRest,\n smeup: {\n ...smeupRest,\n data: chartData,\n },\n },\n };\n }\n }\n };\n};\n\n/**\n * Main chart adapter that chains all chart transformation adapters.\n *\n * This adapter first converts a `fun` property to chart data using funToSmeupChartAdapter,\n * then transforms the chart data to an SVG format using smeupChartToPdfMakeSvgAdapter.\n *\n * @returns An asynchronous function that applies all chart adapters in sequence.\n */\nexport const chartAdapter = () => {\n return async (\n element: unknown,\n context: PdfMakeConverterContext,\n ): Promise<ElementWithChartExtension> => {\n const adaptedElement = await funToSmeupChartAdapter()(element, context);\n return (await smeupChartToPdfMakeSvgAdapter()(\n adaptedElement,\n context,\n )) as ElementWithChartExtension;\n };\n};\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { BoxOptions } from "../../../../types/component";
|
|
2
|
+
import { SmeupDataCell } from "../../../../types/data-structures/smeupDataTable";
|
|
3
|
+
export declare const buildImageCell: (imageCell: SmeupDataCell, options: BoxOptions, rowSpan?: number, alignment?: "center" | "left" | "right") => unknown;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildImageCell = void 0;
|
|
4
|
+
const objects_utility_1 = require("../../../../utils/objects-utility");
|
|
5
|
+
const buildImageCell = (imageCell, options, rowSpan = 1, alignment = "left") => {
|
|
6
|
+
const fit = options.ImageFit ? parseInt(options.ImageFit) : 60;
|
|
7
|
+
const imageProvider = (0, objects_utility_1.objectsIsURL)(imageCell.obj)
|
|
8
|
+
? { url: imageCell.obj.k }
|
|
9
|
+
: { obj: { ...imageCell.obj } };
|
|
10
|
+
return {
|
|
11
|
+
image: { smeup: imageProvider },
|
|
12
|
+
fit: [fit, fit],
|
|
13
|
+
alignment: alignment,
|
|
14
|
+
rowSpan: rowSpan,
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
exports.buildImageCell = buildImageCell;
|
|
18
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../../src/converters/pdf/pdfmake/adapters/helpers.ts"],"names":[],"mappings":";;;AAEA,uEAAiE;AAE1D,MAAM,cAAc,GAAG,CAC5B,SAAwB,EACxB,OAAmB,EACnB,UAAkB,CAAC,EACnB,YAAyC,MAAM,EACtC,EAAE;IACX,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,MAAM,aAAa,GAAG,IAAA,8BAAY,EAAC,SAAS,CAAC,GAAG,CAAC;QAC/C,CAAC,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,GAAI,CAAC,CAAC,EAAE;QAC3B,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC;IAClC,OAAO;QACL,KAAK,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE;QAC/B,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;QACf,SAAS,EAAE,SAAS;QACpB,OAAO,EAAE,OAAO;KACjB,CAAC;AACJ,CAAC,CAAC;AAhBW,QAAA,cAAc,kBAgBzB","sourcesContent":["import { BoxOptions } from \"../../../../types/component\";\nimport { SmeupDataCell } from \"../../../../types/data-structures/smeupDataTable\";\nimport { objectsIsURL } from \"../../../../utils/objects-utility\";\n\nexport const buildImageCell = (\n imageCell: SmeupDataCell,\n options: BoxOptions,\n rowSpan: number = 1,\n alignment: \"center\" | \"left\" | \"right\" = \"left\",\n): unknown => {\n const fit = options.ImageFit ? parseInt(options.ImageFit) : 60;\n const imageProvider = objectsIsURL(imageCell.obj)\n ? { url: imageCell.obj!.k }\n : { obj: { ...imageCell.obj } };\n return {\n image: { smeup: imageProvider },\n fit: [fit, fit],\n alignment: alignment,\n rowSpan: rowSpan,\n };\n};\n"]}
|
package/dist/converters/pdf/pdfmake/adapters/{image-adapter.d.ts → image/image-adapter.d.ts}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ContentImageExtension, ElementWithImageExtension, PdfMakeConverterContext } from "
|
|
1
|
+
import { ContentImageExtension, ElementWithImageExtension, PdfMakeConverterContext } from "../../pdfmake.types";
|
|
2
2
|
/**
|
|
3
3
|
* Adapts a Smeup image structure to the PDFMake image format.
|
|
4
4
|
*
|