@sme.up/doc-alchemist 1.2.0 → 1.3.0-20250915074720

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.
@@ -4,7 +4,7 @@ export const getAutoTableOptions = (visibleHeaders, data, optimalFontSize, cellS
4
4
  return {
5
5
  head: [visibleHeaders],
6
6
  body: data.map(row => row.map(cell => cell.text)),
7
- startY: 20,
7
+ startY: 27,
8
8
  margin: { left: 5, right: 5, top: 20, bottom: 10 },
9
9
  styles,
10
10
  columnStyles,
@@ -53,6 +53,7 @@ const didParseCellHandler = (dataArg, cellStyles) => {
53
53
  }
54
54
  };
55
55
  const didDrawPageHandler = (dataArg, context) => {
56
+ let rightOffset = 0;
56
57
  const pageWidth = dataArg.doc.internal.pageSize.getWidth();
57
58
  // Add the logo on each page
58
59
  if (context?.logoBase64) {
@@ -63,21 +64,31 @@ const didDrawPageHandler = (dataArg, context) => {
63
64
  catch (error) {
64
65
  console.warn("Error adding logo:", error);
65
66
  }
67
+ rightOffset = logoWidth;
66
68
  }
67
- const textFontSize = 13;
69
+ let textFontSize = 11;
68
70
  const textX = 5;
69
71
  let textY = 10;
70
- // at this point I believe that, since the limited vertical space, if text is too long to be fit into one line, it should be trimmed (first element of split is taken into account)
72
+ // split on two lines at most
73
+ // remember to set measure before calling splitTextToSize otherwise it will not work!
71
74
  if (context?.title) {
72
- const title = dataArg.doc.splitTextToSize(context.title, pageWidth * 0.65)[0];
73
75
  dataArg.doc.setFontSize(textFontSize);
74
76
  dataArg.doc.setFont("helvetica", "normal");
75
- dataArg.doc.text(title, textX, textY, { align: "left" });
77
+ const title = dataArg.doc.splitTextToSize(context.title, pageWidth - rightOffset - textX * 2 - 10);
78
+ dataArg.doc.text(title[0], textX, textY, { align: "left" });
79
+ if (title[1]) {
80
+ textY += textFontSize / 2;
81
+ dataArg.doc.text(title[1], textX, textY, { align: "left" });
82
+ }
76
83
  }
84
+ // since the limited vertical space, if subtitle is too long to be fit into one line, it should be trimmed (first element of split is taken into account)`
77
85
  if (context?.subtitle) {
86
+ textFontSize -= 2;
78
87
  textY += textFontSize / 2;
79
- const subtitle = dataArg.doc.splitTextToSize(context.subtitle, pageWidth * 0.65)[0];
80
- dataArg.doc.text(subtitle, textX, textY, { align: "left" });
88
+ dataArg.doc.setFontSize(textFontSize);
89
+ dataArg.doc.setFont("helvetica", "normal");
90
+ const subtitle = dataArg.doc.splitTextToSize(context.subtitle, pageWidth - rightOffset - textX * 2 - 10);
91
+ dataArg.doc.text(subtitle[0], textX, textY, { align: "left" });
81
92
  }
82
93
  };
83
94
  //# sourceMappingURL=autotable-renderer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"autotable-renderer.js","sourceRoot":"","sources":["../../../src/converters/pdf/autotable-renderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { UserOptions } from \"jspdf-autotable\";\nimport { CellStyleData, CellValueProps } from \"./pdf-converter.types.js\";\nimport type {\n Styles,\n OverflowType,\n FontStyle,\n CellHookData,\n HookData,\n} from \"jspdf-autotable\";\nimport { getLogoPositionAndDimension } from \"../../utils/image-utils.js\";\nimport { ConverterContext } from \"../../types/converter.js\";\n\ntype TableStyles = {\n styles: Partial<Styles>;\n columnStyles: Record<string, Partial<Styles>>;\n headStyles: Partial<Styles>;\n};\n\nexport const getAutoTableOptions = (\n visibleHeaders: string[],\n data: CellValueProps[][],\n optimalFontSize: number,\n cellStyles: CellStyleData[][],\n context: ConverterContext,\n): UserOptions => {\n const { styles, columnStyles, headStyles } = getTableStyles(\n visibleHeaders,\n optimalFontSize,\n );\n return {\n head: [visibleHeaders],\n body: data.map(row => row.map(cell => cell.text)),\n startY: 20,\n margin: { left: 5, right: 5, top: 20, bottom: 10 },\n styles,\n columnStyles,\n headStyles,\n didDrawPage: dataArg => didDrawPageHandler(dataArg, context),\n didParseCell: dataArg => didParseCellHandler(dataArg, cellStyles),\n };\n};\n\nconst getTableStyles = (\n visibleHeaders: string[],\n optimalFontSize: number,\n): TableStyles => {\n const styles: Partial<Styles> = {\n font: \"helvetica\",\n fontSize: optimalFontSize + 1,\n cellPadding: 1,\n overflow: \"linebreak\" as OverflowType,\n cellWidth: \"auto\",\n minCellWidth: 5,\n };\n\n const columnStyles: { [key: string]: Partial<Styles> } = {\n ...Object.fromEntries(\n visibleHeaders.map((_, index) => [\n index,\n {\n cellWidth: \"auto\",\n halign: \"left\",\n overflow: \"linebreak\" as OverflowType,\n cellPadding: { top: 1, right: 1, bottom: 1, left: 1 },\n },\n ]),\n ),\n };\n\n const headStyles: Partial<Styles> = {\n fillColor: [255, 0, 0],\n textColor: [255, 255, 255],\n fontStyle: \"bold\" as FontStyle,\n halign: \"center\",\n };\n\n return { styles, columnStyles, headStyles };\n};\n\nconst didParseCellHandler = (\n dataArg: CellHookData,\n cellStyles: CellStyleData[][],\n) => {\n if (dataArg.section === \"body\") {\n const rowIndex = dataArg.row.index;\n const colIndex = dataArg.column.index;\n const cellStyle = cellStyles[rowIndex]?.[colIndex];\n\n if (cellStyle) {\n // Apply styles from the Excel cell\n Object.assign(dataArg.cell.styles, cellStyle);\n }\n }\n};\n\nconst didDrawPageHandler = (dataArg: HookData, context: ConverterContext) => {\n const pageWidth = dataArg.doc.internal.pageSize.getWidth();\n\n // Add the logo on each page\n if (context?.logoBase64) {\n const { logoWidth, logoHeight, logoX, logoY } = getLogoPositionAndDimension(\n dataArg.doc,\n context.logoBase64,\n );\n\n try {\n dataArg.doc.addImage(\n context.logoBase64,\n \"PNG\",\n logoX,\n logoY,\n logoWidth,\n logoHeight,\n );\n } catch (error) {\n console.warn(\"Error adding logo:\", error);\n }\n }\n\n const textFontSize = 13;\n const textX = 5;\n let textY = 10;\n\n // at this point I believe that, since the limited vertical space, if text is too long to be fit into one line, it should be trimmed (first element of split is taken into account)\n\n if (context?.title) {\n const title = dataArg.doc.splitTextToSize(\n context.title,\n pageWidth * 0.65,\n )[0];\n dataArg.doc.setFontSize(textFontSize);\n dataArg.doc.setFont(\"helvetica\", \"normal\");\n dataArg.doc.text(title, textX, textY, { align: \"left\" });\n }\n\n if (context?.subtitle) {\n textY += textFontSize / 2;\n const subtitle = dataArg.doc.splitTextToSize(\n context.subtitle,\n pageWidth * 0.65,\n )[0];\n dataArg.doc.text(subtitle, textX, textY, { align: \"left\" });\n }\n};\n"]}
1
+ {"version":3,"file":"autotable-renderer.js","sourceRoot":"","sources":["../../../src/converters/pdf/autotable-renderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { UserOptions } from \"jspdf-autotable\";\nimport { CellStyleData, CellValueProps } from \"./pdf-converter.types.js\";\nimport type {\n Styles,\n OverflowType,\n FontStyle,\n CellHookData,\n HookData,\n} from \"jspdf-autotable\";\nimport { getLogoPositionAndDimension } from \"../../utils/image-utils.js\";\nimport { ConverterContext } from \"../../types/converter.js\";\n\ntype TableStyles = {\n styles: Partial<Styles>;\n columnStyles: Record<string, Partial<Styles>>;\n headStyles: Partial<Styles>;\n};\n\nexport const getAutoTableOptions = (\n visibleHeaders: string[],\n data: CellValueProps[][],\n optimalFontSize: number,\n cellStyles: CellStyleData[][],\n context: ConverterContext,\n): UserOptions => {\n const { styles, columnStyles, headStyles } = getTableStyles(\n visibleHeaders,\n optimalFontSize,\n );\n return {\n head: [visibleHeaders],\n body: data.map(row => row.map(cell => cell.text)),\n startY: 27,\n margin: { left: 5, right: 5, top: 20, bottom: 10 },\n styles,\n columnStyles,\n headStyles,\n didDrawPage: dataArg => didDrawPageHandler(dataArg, context),\n didParseCell: dataArg => didParseCellHandler(dataArg, cellStyles),\n };\n};\n\nconst getTableStyles = (\n visibleHeaders: string[],\n optimalFontSize: number,\n): TableStyles => {\n const styles: Partial<Styles> = {\n font: \"helvetica\",\n fontSize: optimalFontSize + 1,\n cellPadding: 1,\n overflow: \"linebreak\" as OverflowType,\n cellWidth: \"auto\",\n minCellWidth: 5,\n };\n\n const columnStyles: { [key: string]: Partial<Styles> } = {\n ...Object.fromEntries(\n visibleHeaders.map((_, index) => [\n index,\n {\n cellWidth: \"auto\",\n halign: \"left\",\n overflow: \"linebreak\" as OverflowType,\n cellPadding: { top: 1, right: 1, bottom: 1, left: 1 },\n },\n ]),\n ),\n };\n\n const headStyles: Partial<Styles> = {\n fillColor: [255, 0, 0],\n textColor: [255, 255, 255],\n fontStyle: \"bold\" as FontStyle,\n halign: \"center\",\n };\n\n return { styles, columnStyles, headStyles };\n};\n\nconst didParseCellHandler = (\n dataArg: CellHookData,\n cellStyles: CellStyleData[][],\n) => {\n if (dataArg.section === \"body\") {\n const rowIndex = dataArg.row.index;\n const colIndex = dataArg.column.index;\n const cellStyle = cellStyles[rowIndex]?.[colIndex];\n\n if (cellStyle) {\n // Apply styles from the Excel cell\n Object.assign(dataArg.cell.styles, cellStyle);\n }\n }\n};\n\nconst didDrawPageHandler = (dataArg: HookData, context: ConverterContext) => {\n let rightOffset = 0;\n const pageWidth = dataArg.doc.internal.pageSize.getWidth();\n\n // Add the logo on each page\n if (context?.logoBase64) {\n const { logoWidth, logoHeight, logoX, logoY } = getLogoPositionAndDimension(\n dataArg.doc,\n context.logoBase64,\n );\n\n try {\n dataArg.doc.addImage(\n context.logoBase64,\n \"PNG\",\n logoX,\n logoY,\n logoWidth,\n logoHeight,\n );\n } catch (error) {\n console.warn(\"Error adding logo:\", error);\n }\n\n rightOffset = logoWidth;\n }\n\n let textFontSize = 11;\n const textX = 5;\n let textY = 10;\n\n // split on two lines at most\n // remember to set measure before calling splitTextToSize otherwise it will not work!\n\n if (context?.title) {\n dataArg.doc.setFontSize(textFontSize);\n dataArg.doc.setFont(\"helvetica\", \"normal\");\n const title = dataArg.doc.splitTextToSize(\n context.title,\n pageWidth - rightOffset - textX * 2 - 10,\n );\n dataArg.doc.text(title[0], textX, textY, { align: \"left\" });\n if (title[1]) {\n textY += textFontSize / 2;\n dataArg.doc.text(title[1], textX, textY, { align: \"left\" });\n }\n }\n\n // since the limited vertical space, if subtitle is too long to be fit into one line, it should be trimmed (first element of split is taken into account)`\n\n if (context?.subtitle) {\n textFontSize -= 2;\n textY += textFontSize / 2;\n dataArg.doc.setFontSize(textFontSize);\n dataArg.doc.setFont(\"helvetica\", \"normal\");\n const subtitle = dataArg.doc.splitTextToSize(\n context.subtitle,\n pageWidth - rightOffset - textX * 2 - 10,\n );\n dataArg.doc.text(subtitle[0], textX, textY, { align: \"left\" });\n }\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sme.up/doc-alchemist",
3
- "version": "1.2.0",
3
+ "version": "1.3.0-20250915074720",
4
4
  "description": "Library for generating documents in various formats, including Excel and PDF.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Smeup LAB <info@smeup.com> (https://www.smeup.com/)",