@addsign/moje-agenda-shared-lib 1.0.18 → 1.0.20
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.
|
@@ -93,7 +93,7 @@ function SelectField({
|
|
|
93
93
|
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(
|
|
94
94
|
"div",
|
|
95
95
|
{
|
|
96
|
-
className: "w-full min-h-30 flex-col justify-start items-start gap-
|
|
96
|
+
className: "w-full min-h-30 flex-col justify-start items-start gap-0inline-flex " + className,
|
|
97
97
|
id: "selectField",
|
|
98
98
|
ref,
|
|
99
99
|
children: [
|
|
@@ -113,14 +113,14 @@ function SelectField({
|
|
|
113
113
|
/* @__PURE__ */ jsxs(
|
|
114
114
|
"div",
|
|
115
115
|
{
|
|
116
|
-
className: `self-stretch w-full px-3 py-1
|
|
116
|
+
className: `self-stretch w-full px-3 py-1 border justify-start items-center gap-0 inline-flex outline-none
|
|
117
117
|
${isFocused ? "outline-4 outline-indigo-200 outline-offset-0 border-indigo-300 " : ""}
|
|
118
118
|
${isFocused && ((_a = errors[name]) == null ? void 0 : _a.message) ? "outline-4 outline-red-200 outline-offset-0 border-none" : ""}
|
|
119
119
|
${rounded ? " rounded-lg " : " rounded-none "}
|
|
120
120
|
${!isFocused && ((_b = errors[name]) == null ? void 0 : _b.message) ? "border-red-200" : ""}
|
|
121
|
-
${disabled ? "bg-gray-100" : "bg-
|
|
121
|
+
${disabled ? "bg-gray-100" : "bg-white"}
|
|
122
122
|
`,
|
|
123
|
-
onClick: () => handleToggleFocus(),
|
|
123
|
+
onClick: () => !disabled ? handleToggleFocus() : null,
|
|
124
124
|
children: [
|
|
125
125
|
/* @__PURE__ */ jsxs("div", { className: "grow shrink basis-0 min-h-5 xl:!min-h-[32px] justify-start items-center gap-0 flex whitespace-nowrap w-[calc(100%-40px)] ", children: [
|
|
126
126
|
/* @__PURE__ */ jsxs(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectField.js","sources":["../../../lib/components/form/SelectField.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport { IFormFieldGlobalProps, IOptionItem } from \"../../types\";\r\nimport { MdCheck, MdClose, MdExpandLess, MdExpandMore } from \"react-icons/md\";\r\nimport { useClickAway } from \"react-use\";\r\n\r\nexport interface ISelectFieldProps extends IFormFieldGlobalProps {\r\n options?: IOptionItem[];\r\n valueKey?: string;\r\n labelKey?: string;\r\n}\r\n\r\nexport default function SelectField({\r\n label,\r\n name,\r\n value,\r\n description,\r\n onInputChange,\r\n options,\r\n placeholder,\r\n className,\r\n errors = {},\r\n clearable,\r\n required,\r\n disabled,\r\n rounded = true,\r\n}: ISelectFieldProps) {\r\n const [isFocused, setIsFocused] = React.useState(false);\r\n const ref = React.useRef(null);\r\n const handleClear = (e: any) => {\r\n // value;\r\n e.stopPropagation(); // Add this line\r\n\r\n setIsFocused(false);\r\n onInputChange({\r\n ...e,\r\n target: {\r\n value: \"\",\r\n name: name,\r\n },\r\n });\r\n };\r\n const handleToggleFocus = () => {\r\n setIsFocused((prev) => !prev);\r\n };\r\n\r\n useClickAway(ref, () => {\r\n setIsFocused(false);\r\n });\r\n\r\n const hangleChange = (option: IOptionItem) => {\r\n const tmp: any = {\r\n target: {\r\n value: option.value,\r\n name: name,\r\n },\r\n };\r\n\r\n onInputChange(tmp);\r\n setIsFocused(false);\r\n };\r\n const currentlySelectedOption = React.useMemo(() => {\r\n if (value === undefined || value === \"\") return null;\r\n return options?.find((option) => option.value === value);\r\n }, [options, value]);\r\n\r\n const listOfOptions = () => {\r\n if (!options) return [];\r\n return (\r\n <div\r\n id=\"list\"\r\n className=\"max-h-[390px] min-w-20 w-full whitespace-nowrap absolute z-[100000] -top-[1px] mt-[4px] bg-white rounded-lg shadow-xl border\r\n border-gray-200 justify-start items-start inline-flex overflow-auto cursor-default\"\r\n >\r\n <div className=\"grow shrink basis-0 py-1 flex-col justify-start items-start inline-flex\">\r\n {options.map((option, index) => {\r\n return (\r\n <div\r\n className=\"group self-stretch px-1.5 py-px justify-start items-center inline-flex hover:bg-gray-50 \"\r\n onClick={() => hangleChange(option)}\r\n key={index}\r\n >\r\n <div className=\"grow shrink basis-0 px-1 py-2 rounded-md flex-col justify-start items-start gap-2 inline-flex\">\r\n <div className=\"self-stretch justify-start items-center gap-2 inline-flex\">\r\n <div className=\"text-gray-900 text-sm font-normal leading-normal\">\r\n {option.label}\r\n </div>\r\n {option.description && (\r\n <div className=\"text-slate-600 sm-base font-normal leading-normal\">\r\n {option.description}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"w-5 h-5 relative\">\r\n {option.value === value && value !== \"\" && (\r\n <MdCheck size={22} className=\"text-primary\" />\r\n )}{\" \"}\r\n {option.value !== value && (\r\n <MdCheck\r\n size={22}\r\n className=\"text-transparent group-hover:text-gray-300\"\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <>\r\n <div\r\n className={\r\n \"w-full min-h-30 flex-col justify-start items-start gap-1.5 inline-flex \" +\r\n className\r\n }\r\n id=\"selectField\"\r\n ref={ref}\r\n >\r\n <div className=\"self-stretch flex-col justify-start items-start gap-1.5 flex\">\r\n {label && (\r\n <label\r\n className=\"text-slate-700 text-sm font-medium leading-tight\"\r\n htmlFor={name}\r\n >\r\n {label} {required ? \"*\" : \"\"}\r\n </label>\r\n )}\r\n <div\r\n className={`self-stretch w-full px-3 py-1 bg-white border justify-start items-center gap-0 inline-flex outline-none \r\n ${isFocused ? \"outline-4 outline-indigo-200 outline-offset-0 border-indigo-300 \" : \"\"}\r\n ${\r\n isFocused && errors[name]?.message\r\n ? \"outline-4 outline-red-200 outline-offset-0 border-none\"\r\n : \"\"\r\n } \r\n ${rounded ? \" rounded-lg \" : \" rounded-none \"}\r\n ${!isFocused && errors[name]?.message ? \"border-red-200\" : \"\"} \r\n ${disabled ? \"bg-gray-100\" : \"bg-transparent\"}\r\n `}\r\n onClick={() => handleToggleFocus()}\r\n >\r\n <div className=\"grow shrink basis-0 min-h-5 xl:!min-h-[32px] justify-start items-center gap-0 flex whitespace-nowrap w-[calc(100%-40px)] \">\r\n <div\r\n className=\"text-gray-900 text-sm font-normal leading-normal text-ellipsis overflow-hidden w-full\"\r\n id={name}\r\n >\r\n {currentlySelectedOption?.label}\r\n {!currentlySelectedOption?.label && placeholder && (\r\n <span className=\"text-slate-400 font-normal\">\r\n {\" \"}\r\n {placeholder}\r\n </span>\r\n )}\r\n </div>\r\n <div className=\"text-slate-600 text-base font-normal leading-normal\">\r\n {currentlySelectedOption?.description}\r\n </div>\r\n </div>\r\n {clearable &&\r\n value !== \"\" &&\r\n value !== null &&\r\n value !== undefined && (\r\n <div\r\n className=\"w-6 h-6 relative cursor-pointer \"\r\n id={name + \":clear\"}\r\n onClick={handleClear}\r\n >\r\n <div className=\"absolute inset-0 flex items-center justify-center hover:bg-gray-100 w-6 rounded-full text-lg\">\r\n <MdClose />\r\n </div>{\" \"}\r\n </div>\r\n )}\r\n <div className=\"w-6 h-6 relative cursor-pointer \">\r\n <div className=\"absolute inset-0 flex items-center justify-center hover:bg-gray-100 w-6 rounded-full text-lg\">\r\n {isFocused && <MdExpandLess />}\r\n {!isFocused && <MdExpandMore />}\r\n </div>\r\n </div>\r\n </div>\r\n </div>{\" \"}\r\n <div className=\"w-full relative\">{isFocused && listOfOptions()}</div>\r\n {description && !isFocused && (\r\n <div\r\n className=\"self-stretch text-slate-600 text-sm font-normal leading-tight\"\r\n id={name + \":description\"}\r\n >\r\n {description}\r\n </div>\r\n )}\r\n {errors[name] && (\r\n <div\r\n className=\"HintText self-stretch text-red-600 text-sm font-normal leading-tight\"\r\n id={name + \":error\"}\r\n >\r\n {errors[name]?.message}\r\n </div>\r\n )}\r\n </div>\r\n </>\r\n );\r\n}\r\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SelectField.js","sources":["../../../lib/components/form/SelectField.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport { IFormFieldGlobalProps, IOptionItem } from \"../../types\";\r\nimport { MdCheck, MdClose, MdExpandLess, MdExpandMore } from \"react-icons/md\";\r\nimport { useClickAway } from \"react-use\";\r\n\r\nexport interface ISelectFieldProps extends IFormFieldGlobalProps {\r\n options?: IOptionItem[];\r\n valueKey?: string;\r\n labelKey?: string;\r\n}\r\n\r\nexport default function SelectField({\r\n label,\r\n name,\r\n value,\r\n description,\r\n onInputChange,\r\n options,\r\n placeholder,\r\n className,\r\n errors = {},\r\n clearable,\r\n required,\r\n disabled,\r\n rounded = true,\r\n}: ISelectFieldProps) {\r\n const [isFocused, setIsFocused] = React.useState(false);\r\n const ref = React.useRef(null);\r\n const handleClear = (e: any) => {\r\n // value;\r\n e.stopPropagation(); // Add this line\r\n\r\n setIsFocused(false);\r\n onInputChange({\r\n ...e,\r\n target: {\r\n value: \"\",\r\n name: name,\r\n },\r\n });\r\n };\r\n const handleToggleFocus = () => {\r\n setIsFocused((prev) => !prev);\r\n };\r\n\r\n useClickAway(ref, () => {\r\n setIsFocused(false);\r\n });\r\n\r\n const hangleChange = (option: IOptionItem) => {\r\n const tmp: any = {\r\n target: {\r\n value: option.value,\r\n name: name,\r\n },\r\n };\r\n\r\n onInputChange(tmp);\r\n setIsFocused(false);\r\n };\r\n const currentlySelectedOption = React.useMemo(() => {\r\n if (value === undefined || value === \"\") return null;\r\n return options?.find((option) => option.value === value);\r\n }, [options, value]);\r\n\r\n const listOfOptions = () => {\r\n if (!options) return [];\r\n return (\r\n <div\r\n id=\"list\"\r\n className=\"max-h-[390px] min-w-20 w-full whitespace-nowrap absolute z-[100000] -top-[1px] mt-[4px] bg-white rounded-lg shadow-xl border\r\n border-gray-200 justify-start items-start inline-flex overflow-auto cursor-default\"\r\n >\r\n <div className=\"grow shrink basis-0 py-1 flex-col justify-start items-start inline-flex\">\r\n {options.map((option, index) => {\r\n return (\r\n <div\r\n className=\"group self-stretch px-1.5 py-px justify-start items-center inline-flex hover:bg-gray-50 \"\r\n onClick={() => hangleChange(option)}\r\n key={index}\r\n >\r\n <div className=\"grow shrink basis-0 px-1 py-2 rounded-md flex-col justify-start items-start gap-2 inline-flex\">\r\n <div className=\"self-stretch justify-start items-center gap-2 inline-flex\">\r\n <div className=\"text-gray-900 text-sm font-normal leading-normal\">\r\n {option.label}\r\n </div>\r\n {option.description && (\r\n <div className=\"text-slate-600 sm-base font-normal leading-normal\">\r\n {option.description}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"w-5 h-5 relative\">\r\n {option.value === value && value !== \"\" && (\r\n <MdCheck size={22} className=\"text-primary\" />\r\n )}{\" \"}\r\n {option.value !== value && (\r\n <MdCheck\r\n size={22}\r\n className=\"text-transparent group-hover:text-gray-300\"\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <>\r\n <div\r\n className={\r\n \"w-full min-h-30 flex-col justify-start items-start gap-0inline-flex \" +\r\n className\r\n }\r\n id=\"selectField\"\r\n ref={ref}\r\n >\r\n <div className=\"self-stretch flex-col justify-start items-start gap-1.5 flex\">\r\n {label && (\r\n <label\r\n className=\"text-slate-700 text-sm font-medium leading-tight\"\r\n htmlFor={name}\r\n >\r\n {label} {required ? \"*\" : \"\"}\r\n </label>\r\n )}\r\n <div\r\n className={`self-stretch w-full px-3 py-1 border justify-start items-center gap-0 inline-flex outline-none \r\n ${isFocused ? \"outline-4 outline-indigo-200 outline-offset-0 border-indigo-300 \" : \"\"}\r\n ${\r\n isFocused && errors[name]?.message\r\n ? \"outline-4 outline-red-200 outline-offset-0 border-none\"\r\n : \"\"\r\n } \r\n ${rounded ? \" rounded-lg \" : \" rounded-none \"}\r\n ${!isFocused && errors[name]?.message ? \"border-red-200\" : \"\"} \r\n ${disabled ? \"bg-gray-100\" : \"bg-white\"}\r\n `}\r\n onClick={() => (!disabled ? handleToggleFocus() : null)}\r\n >\r\n <div className=\"grow shrink basis-0 min-h-5 xl:!min-h-[32px] justify-start items-center gap-0 flex whitespace-nowrap w-[calc(100%-40px)] \">\r\n <div\r\n className=\"text-gray-900 text-sm font-normal leading-normal text-ellipsis overflow-hidden w-full\"\r\n id={name}\r\n >\r\n {currentlySelectedOption?.label}\r\n {!currentlySelectedOption?.label && placeholder && (\r\n <span className=\"text-slate-400 font-normal\">\r\n {\" \"}\r\n {placeholder}\r\n </span>\r\n )}\r\n </div>\r\n <div className=\"text-slate-600 text-base font-normal leading-normal\">\r\n {currentlySelectedOption?.description}\r\n </div>\r\n </div>\r\n {clearable &&\r\n value !== \"\" &&\r\n value !== null &&\r\n value !== undefined && (\r\n <div\r\n className=\"w-6 h-6 relative cursor-pointer \"\r\n id={name + \":clear\"}\r\n onClick={handleClear}\r\n >\r\n <div className=\"absolute inset-0 flex items-center justify-center hover:bg-gray-100 w-6 rounded-full text-lg\">\r\n <MdClose />\r\n </div>{\" \"}\r\n </div>\r\n )}\r\n <div className=\"w-6 h-6 relative cursor-pointer \">\r\n <div className=\"absolute inset-0 flex items-center justify-center hover:bg-gray-100 w-6 rounded-full text-lg\">\r\n {isFocused && <MdExpandLess />}\r\n {!isFocused && <MdExpandMore />}\r\n </div>\r\n </div>\r\n </div>\r\n </div>{\" \"}\r\n <div className=\"w-full relative\">{isFocused && listOfOptions()}</div>\r\n {description && !isFocused && (\r\n <div\r\n className=\"self-stretch text-slate-600 text-sm font-normal leading-tight\"\r\n id={name + \":description\"}\r\n >\r\n {description}\r\n </div>\r\n )}\r\n {errors[name] && (\r\n <div\r\n className=\"HintText self-stretch text-red-600 text-sm font-normal leading-tight\"\r\n id={name + \":error\"}\r\n >\r\n {errors[name]?.message}\r\n </div>\r\n )}\r\n </div>\r\n </>\r\n );\r\n}\r\n"],"names":[],"mappings":"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"}
|
package/dist/utils/PdfManager.js
CHANGED
|
@@ -72,6 +72,8 @@ class PDFManager {
|
|
|
72
72
|
// Default no offset
|
|
73
73
|
marginBottom = 0,
|
|
74
74
|
// Default no offset
|
|
75
|
+
marginLeft = 0,
|
|
76
|
+
// Default no offset
|
|
75
77
|
startX = 10,
|
|
76
78
|
// Default starting X position
|
|
77
79
|
fill = true
|
|
@@ -87,9 +89,9 @@ class PDFManager {
|
|
|
87
89
|
this.doc.setDrawColor(color);
|
|
88
90
|
}
|
|
89
91
|
if (fill) {
|
|
90
|
-
this.doc.rect(startX, this.currentYPosition, width, height, "F");
|
|
92
|
+
this.doc.rect(startX + marginLeft, this.currentYPosition, width, height, "F");
|
|
91
93
|
} else {
|
|
92
|
-
this.doc.rect(startX, this.currentYPosition, width, height, "S");
|
|
94
|
+
this.doc.rect(startX + marginLeft, this.currentYPosition, width, height, "S");
|
|
93
95
|
}
|
|
94
96
|
this.currentYPosition += height + marginBottom;
|
|
95
97
|
}
|
|
@@ -123,7 +125,7 @@ class PDFManager {
|
|
|
123
125
|
this.appendSquare({
|
|
124
126
|
color: "#002EA3",
|
|
125
127
|
// Green square
|
|
126
|
-
height: 0.
|
|
128
|
+
height: 0.2,
|
|
127
129
|
width: 180,
|
|
128
130
|
marginTop: -5,
|
|
129
131
|
// Add space between squares
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PdfManager.js","sources":["../../lib/utils/PdfManager.ts"],"sourcesContent":["import jsPDF from \"jspdf\";\r\nimport \"jspdf-autotable\";\r\nimport fontArial from \"../fonts/arial\";\r\nimport fontArialBold from \"../fonts/arialBold\";\r\n\r\nclass PDFManager {\r\n private doc: jsPDF;\r\n private currentYPosition: number;\r\n private pageHeight: number;\r\n\r\n constructor() {\r\n this.doc = new jsPDF();\r\n this.pageHeight = this.doc.internal.pageSize.height; // Get page height\r\n this.currentYPosition = 10; // Start position at the top of the page\r\n this.loadFonts();\r\n }\r\n\r\n private loadFonts() {\r\n this.doc.addFileToVFS(\"arial.ttf\", fontArial);\r\n this.doc.addFont(\"arial.ttf\", \"Arial\", \"normal\");\r\n this.doc.addFileToVFS(\"arialBold.ttf\", fontArialBold);\r\n this.doc.addFont(\"arialBold.ttf\", \"Arial\", \"bold\");\r\n this.doc.setFont(\"Arial\", \"normal\");\r\n }\r\n\r\n /**\r\n * Checks if a page break is needed and adds a new page if required.\r\n */\r\n private checkPageBreak(lineHeight: number) {\r\n if (this.currentYPosition + lineHeight >= this.pageHeight) {\r\n this.doc.addPage();\r\n this.currentYPosition = 10; // Reset Y position for the new page\r\n }\r\n }\r\n\r\n /**\r\n * Appends text to the current PDF document.\r\n */\r\n appendText(\r\n text: string,\r\n options: {\r\n fontSize?: number;\r\n bold?: boolean;\r\n marginLeft?: number;\r\n marginTop?: number;\r\n marginBottom?: number;\r\n } = {},\r\n textOptions: any = {},\r\n ) {\r\n const {\r\n fontSize = 12,\r\n bold = false,\r\n marginTop = 0,\r\n marginLeft = 0,\r\n marginBottom = 0,\r\n } = options;\r\n const lineHeight = fontSize * 0.5; // Approximate line height based on font size\r\n const maxWidth = textOptions.width || 180 - marginLeft; // Adjust width based on offset\r\n\r\n this.doc.setFontSize(fontSize);\r\n\r\n this.doc.setFont(\"Arial\", bold ? \"bold\" : \"normal\");\r\n\r\n // Split the text into multiple lines if it exceeds the maxWidth\r\n const textLines = this.doc.splitTextToSize(text, maxWidth);\r\n this.currentYPosition += marginTop;\r\n // Loop through each line and append it to the document\r\n textLines.forEach((line: string) => {\r\n this.checkPageBreak(lineHeight); // Check if new page is needed\r\n this.doc.text(line, 10 + marginLeft, this.currentYPosition, {\r\n maxWidth, ...textOptions\r\n });\r\n\r\n this.currentYPosition += lineHeight; // Update Y position after each line\r\n });\r\n this.currentYPosition += marginBottom;\r\n }\r\n\r\n appendSquare(\r\n options: {\r\n color?: [number, number, number] | string; // RGB color or string (default is black)\r\n height?: number; // Square height (default is 10 units)\r\n width?: number; // Square width (default is 10 units)\r\n marginTop?: number; // Space before the square (default is 0)\r\n marginBottom?: number; // Space after the square (default is 0)\r\n startX?: number; // X coordinate where the square starts (default is 10)\r\n fill?: boolean; // Whether the square should be filled or outlined (default is true)\r\n } = {},\r\n ) {\r\n const {\r\n color = [0, 0, 0], // Default black color\r\n height = 10, // Default square height\r\n width = 10, // Default square width\r\n marginTop = 0, // Default no offset\r\n marginBottom = 0, // Default no offset\r\n startX = 10, // Default starting X position\r\n fill = true, // Default to filled square\r\n } = options;\r\n\r\n // Adjust currentYPosition for any offset\r\n this.currentYPosition += marginTop;\r\n\r\n // Check if a new page is needed\r\n this.checkPageBreak(height + marginTop + marginBottom);\r\n\r\n // Set the color for the square\r\n if (Array.isArray(color)) {\r\n this.doc.setFillColor(...color); // For RGB color\r\n this.doc.setDrawColor(...color); // For outline color in case it's not filled\r\n } else {\r\n this.doc.setFillColor(color); // For string color (e.g., 'red', '#FF0000')\r\n this.doc.setDrawColor(color); // For outline color in case it's not filled\r\n }\r\n\r\n // Draw the square (filled or outlined)\r\n if (fill) {\r\n this.doc.rect(startX, this.currentYPosition, width, height, \"F\"); // F for filled\r\n } else {\r\n this.doc.rect(startX, this.currentYPosition, width, height, \"S\"); // S for outlined (stroke)\r\n }\r\n\r\n // Update Y position after the square (including bottom margin)\r\n this.currentYPosition += height + marginBottom;\r\n }\r\n appendTable(\r\n headers: string[], // The table headers\r\n data: any[][], // The table data as an array of arrays\r\n options: {\r\n bold?: boolean; // Bold font for headers\r\n marginLeft?: number; // Left margin before the table\r\n marginRight?: number; // Left margin before the table\r\n marginTop?: number; // Top margin before the table\r\n marginBottom?: number; // Bottom margin after the table\r\n } = {},\r\n tableOptions: any = {},\r\n ) {\r\n const {\r\n bold = true,\r\n marginLeft = 0,\r\n marginRight = 0,\r\n marginTop = 0,\r\n marginBottom = 0,\r\n } = options;\r\n\r\n // Adjust the current Y position with the top margin\r\n this.currentYPosition += marginTop;\r\n\r\n // Append the table using autoTable\r\n (this.doc as any).autoTable({\r\n head: [headers],\r\n body: data,\r\n startY: this.currentYPosition,\r\n margin: { left: 10 + marginLeft, right: 10 + marginRight }, // Adjust the left margin\r\n styles: { ...tableOptions.styles },\r\n headStyles: { fontStyle: bold ? \"bold\" : \"normal\" },\r\n ...tableOptions,\r\n });\r\n\r\n // Update the Y position after the table\r\n this.currentYPosition =\r\n (this.doc as any).lastAutoTable.finalY + marginBottom;\r\n }\r\n\r\n //helper function for appening title with square\r\n appendPageTitle(title: string) {\r\n this.appendText(title, { fontSize: 14, bold: true });\r\n\r\n }\r\n appendPageTitleWithLine(title: string) {\r\n this.appendText(title, { fontSize: 14, bold: true });\r\n this.appendSquare({\r\n color: \"#002EA3\", // Green square\r\n height: 0.5,\r\n width: 180,\r\n marginTop: -5, // Add space between squares\r\n marginBottom: 7, // Add space between squares\r\n startX: 10,\r\n fill: true, // Filled green square\r\n });\r\n }\r\n\r\n appendPageTitleWithSquare(title: string) {\r\n this.appendSquare({\r\n color: \"#002EA3\", // Green square\r\n height: 10,\r\n width: 10,\r\n marginTop: 0, // Add space between squares\r\n marginBottom: 0, // Add space between squares\r\n startX: 10,\r\n fill: true, // Filled green square\r\n });\r\n this.appendText(title, { fontSize: 14, bold: true, marginLeft: 12, marginTop: -6, marginBottom: 5 });\r\n\r\n }\r\n\r\n\r\n\r\n\r\n /**\r\n * Saves the current PDF document.\r\n */\r\n savePDF(fileName: string = \"report.pdf\") {\r\n this.doc.save(fileName);\r\n this.doc.close()\r\n }\r\n}\r\n\r\nexport default PDFManager;\r\n"],"names":["jsPDF"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PdfManager.js","sources":["../../lib/utils/PdfManager.ts"],"sourcesContent":["import jsPDF from \"jspdf\";\r\nimport \"jspdf-autotable\";\r\nimport fontArial from \"../fonts/arial\";\r\nimport fontArialBold from \"../fonts/arialBold\";\r\n\r\nclass PDFManager {\r\n private doc: jsPDF;\r\n private currentYPosition: number;\r\n private pageHeight: number;\r\n\r\n constructor() {\r\n this.doc = new jsPDF();\r\n this.pageHeight = this.doc.internal.pageSize.height; // Get page height\r\n this.currentYPosition = 10; // Start position at the top of the page\r\n this.loadFonts();\r\n }\r\n\r\n private loadFonts() {\r\n this.doc.addFileToVFS(\"arial.ttf\", fontArial);\r\n this.doc.addFont(\"arial.ttf\", \"Arial\", \"normal\");\r\n this.doc.addFileToVFS(\"arialBold.ttf\", fontArialBold);\r\n this.doc.addFont(\"arialBold.ttf\", \"Arial\", \"bold\");\r\n this.doc.setFont(\"Arial\", \"normal\");\r\n }\r\n\r\n /**\r\n * Checks if a page break is needed and adds a new page if required.\r\n */\r\n private checkPageBreak(lineHeight: number) {\r\n if (this.currentYPosition + lineHeight >= this.pageHeight) {\r\n this.doc.addPage();\r\n this.currentYPosition = 10; // Reset Y position for the new page\r\n }\r\n }\r\n\r\n /**\r\n * Appends text to the current PDF document.\r\n */\r\n appendText(\r\n text: string,\r\n options: {\r\n fontSize?: number;\r\n bold?: boolean;\r\n marginLeft?: number;\r\n marginTop?: number;\r\n marginBottom?: number;\r\n } = {},\r\n textOptions: any = {},\r\n ) {\r\n const {\r\n fontSize = 12,\r\n bold = false,\r\n marginTop = 0,\r\n marginLeft = 0,\r\n marginBottom = 0,\r\n } = options;\r\n const lineHeight = fontSize * 0.5; // Approximate line height based on font size\r\n const maxWidth = textOptions.width || 180 - marginLeft; // Adjust width based on offset\r\n\r\n this.doc.setFontSize(fontSize);\r\n\r\n this.doc.setFont(\"Arial\", bold ? \"bold\" : \"normal\");\r\n\r\n // Split the text into multiple lines if it exceeds the maxWidth\r\n const textLines = this.doc.splitTextToSize(text, maxWidth);\r\n this.currentYPosition += marginTop;\r\n // Loop through each line and append it to the document\r\n textLines.forEach((line: string) => {\r\n this.checkPageBreak(lineHeight); // Check if new page is needed\r\n this.doc.text(line, 10 + marginLeft, this.currentYPosition, {\r\n maxWidth, ...textOptions\r\n });\r\n\r\n this.currentYPosition += lineHeight; // Update Y position after each line\r\n });\r\n this.currentYPosition += marginBottom;\r\n }\r\n\r\n appendSquare(\r\n options: {\r\n color?: [number, number, number] | string; // RGB color or string (default is black)\r\n height?: number; // Square height (default is 10 units)\r\n width?: number; // Square width (default is 10 units)\r\n marginLeft?: number; // Left margin before the table\r\n marginTop?: number; // Top margin before the table\r\n marginBottom?: number; // Bottom margin after the table\r\n startX?: number; // X coordinate where the square starts (default is 10)\r\n fill?: boolean; // Whether the square should be filled or outlined (default is true)\r\n } = {},\r\n ) {\r\n const {\r\n color = [0, 0, 0], // Default black color\r\n height = 10, // Default square height\r\n width = 10, // Default square width\r\n marginTop = 0, // Default no offset\r\n marginBottom = 0, // Default no offset\r\n marginLeft = 0, // Default no offset\r\n startX = 10, // Default starting X position\r\n fill = true, // Default to filled square\r\n } = options;\r\n\r\n // Adjust currentYPosition for any offset\r\n this.currentYPosition += marginTop;\r\n\r\n // Check if a new page is needed\r\n this.checkPageBreak(height + marginTop + marginBottom);\r\n\r\n // Set the color for the square\r\n if (Array.isArray(color)) {\r\n this.doc.setFillColor(...color); // For RGB color\r\n this.doc.setDrawColor(...color); // For outline color in case it's not filled\r\n } else {\r\n this.doc.setFillColor(color); // For string color (e.g., 'red', '#FF0000')\r\n this.doc.setDrawColor(color); // For outline color in case it's not filled\r\n }\r\n\r\n // Draw the square (filled or outlined)\r\n if (fill) {\r\n this.doc.rect(startX + marginLeft, this.currentYPosition, width, height, \"F\"); // F for filled\r\n } else {\r\n this.doc.rect(startX + marginLeft, this.currentYPosition, width, height, \"S\"); // S for outlined (stroke)\r\n }\r\n\r\n // Update Y position after the square (including bottom margin)\r\n this.currentYPosition += height + marginBottom;\r\n }\r\n appendTable(\r\n headers: string[], // The table headers\r\n data: any[][], // The table data as an array of arrays\r\n options: {\r\n bold?: boolean; // Bold font for headers\r\n marginLeft?: number; // Left margin before the table\r\n marginRight?: number; // Left margin before the table\r\n marginTop?: number; // Top margin before the table\r\n marginBottom?: number; // Bottom margin after the table\r\n } = {},\r\n tableOptions: any = {},\r\n ) {\r\n const {\r\n bold = true,\r\n marginLeft = 0,\r\n marginRight = 0,\r\n marginTop = 0,\r\n marginBottom = 0,\r\n } = options;\r\n\r\n // Adjust the current Y position with the top margin\r\n this.currentYPosition += marginTop;\r\n\r\n // Append the table using autoTable\r\n (this.doc as any).autoTable({\r\n head: [headers],\r\n body: data,\r\n startY: this.currentYPosition,\r\n margin: { left: 10 + marginLeft, right: 10 + marginRight }, // Adjust the left margin\r\n styles: { ...tableOptions.styles },\r\n headStyles: { fontStyle: bold ? \"bold\" : \"normal\" },\r\n ...tableOptions,\r\n });\r\n\r\n // Update the Y position after the table\r\n this.currentYPosition =\r\n (this.doc as any).lastAutoTable.finalY + marginBottom;\r\n }\r\n\r\n //helper function for appening title with square\r\n appendPageTitle(title: string) {\r\n this.appendText(title, { fontSize: 14, bold: true });\r\n\r\n }\r\n appendPageTitleWithLine(title: string) {\r\n this.appendText(title, { fontSize: 14, bold: true });\r\n this.appendSquare({\r\n color: \"#002EA3\", // Green square\r\n height: 0.2,\r\n width: 180,\r\n marginTop: -5, // Add space between squares\r\n marginBottom: 7, // Add space between squares\r\n startX: 10,\r\n fill: true, // Filled green square\r\n });\r\n }\r\n\r\n appendPageTitleWithSquare(title: string) {\r\n this.appendSquare({\r\n color: \"#002EA3\", // Green square\r\n height: 10,\r\n width: 10,\r\n marginTop: 0, // Add space between squares\r\n marginBottom: 0, // Add space between squares\r\n startX: 10,\r\n fill: true, // Filled green square\r\n });\r\n this.appendText(title, { fontSize: 14, bold: true, marginLeft: 12, marginTop: -6, marginBottom: 5 });\r\n\r\n }\r\n\r\n\r\n\r\n\r\n /**\r\n * Saves the current PDF document.\r\n */\r\n savePDF(fileName: string = \"report.pdf\") {\r\n this.doc.save(fileName);\r\n this.doc.close()\r\n }\r\n}\r\n\r\nexport default PDFManager;\r\n"],"names":["jsPDF"],"mappings":"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"}
|