@addsign/moje-agenda-shared-lib 1.0.17 → 1.0.18

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.
@@ -16,5 +16,6 @@ declare const AutocompleteSearchBarServer: React.FC<{
16
16
  value?: string;
17
17
  initOptions?: IOptionItem[];
18
18
  clearable?: boolean;
19
+ returnObject: boolean;
19
20
  }>;
20
21
  export default AutocompleteSearchBarServer;
@@ -19,7 +19,9 @@ const AutocompleteSearchBarServer = ({
19
19
  onChange,
20
20
  onFocus,
21
21
  onBlur,
22
- placeholder
22
+ placeholder,
23
+ returnObject,
24
+ value
23
25
  }) => {
24
26
  const [query, setQuery] = useState("");
25
27
  const [selectedOptionIndex, setSelectedOptionIndex] = useState(-1);
@@ -31,6 +33,12 @@ const AutocompleteSearchBarServer = ({
31
33
  const ref = useRef(null);
32
34
  const federationContext = useFederationContext();
33
35
  const [isFocused, setIsFocused] = useState(false);
36
+ useEffect(() => {
37
+ if (!value) {
38
+ setQuery("");
39
+ setSelectedOption(null);
40
+ }
41
+ }, [value]);
34
42
  useEffect(() => {
35
43
  const fetchOptions = async () => {
36
44
  const { data } = await federationContext.apiClient.get(fetchUrl + query);
@@ -44,7 +52,6 @@ const AutocompleteSearchBarServer = ({
44
52
  };
45
53
  setSearchResults([]);
46
54
  if (query && valueKey && labelKey && fetchUrl && !selectedOption) {
47
- console.log("fetching", query);
48
55
  fetchOptions();
49
56
  }
50
57
  }, [query, valueKey, labelKey, fetchUrl, federationContext.apiClient]);
@@ -88,7 +95,7 @@ const AutocompleteSearchBarServer = ({
88
95
  setSearchResults([]);
89
96
  setSelectedOptionIndex(-1);
90
97
  setQuery("");
91
- onChange(option.value);
98
+ onChange(returnObject ? option : option.value);
92
99
  setIsFocused(false);
93
100
  };
94
101
  const handleBlur = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"AutocompleteSearchBarServer.js","sources":["../../../lib/components/form/AutocompleteSearchBarServer.tsx"],"sourcesContent":["import { useState, useEffect, useRef } from \"react\";\r\nimport { useClickAway } from \"react-use\";\r\nimport { MdExpandLess, MdExpandMore } from \"react-icons/md\";\r\nimport { InputField, IOptionItem, useFederationContext } from \"../../main\";\r\n\r\ninterface OptionListProps {\r\n options: IOptionItem[];\r\n selectedOptionIndex: number;\r\n handleOptionClick: (option: IOptionItem) => void;\r\n label?: string;\r\n}\r\n\r\nconst AutocompleteSearchBarServer: React.FC<{\r\n label: string;\r\n name: string;\r\n required?: boolean;\r\n disabled?: boolean;\r\n description?: string;\r\n fetchUrl?: string;\r\n valueKey: string;\r\n labelKey: string | ((item: any) => string);\r\n onChange: (value: any) => void;\r\n onFocus: () => void;\r\n onBlur: () => void;\r\n placeholder?: string;\r\n value?: string;\r\n initOptions?: IOptionItem[];\r\n clearable?: boolean;\r\n}> = ({\r\n label,\r\n name,\r\n disabled,\r\n description,\r\n fetchUrl,\r\n valueKey,\r\n labelKey,\r\n onChange,\r\n onFocus,\r\n onBlur,\r\n placeholder,\r\n}) => {\r\n const [query, setQuery] = useState(\"\");\r\n const [selectedOptionIndex, setSelectedOptionIndex] = useState(-1);\r\n const [selectedOption, setSelectedOption] = useState<IOptionItem | null>(\r\n null\r\n );\r\n const [searchResults, setSearchResults] = useState<IOptionItem[]>([]);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n const ref = useRef(null);\r\n const federationContext = useFederationContext();\r\n const [isFocused, setIsFocused] = useState(false);\r\n // const [errors] = useState<any>({});\r\n\r\n //fetch options\r\n useEffect(() => {\r\n const fetchOptions = async () => {\r\n const { data } = await federationContext.apiClient.get(fetchUrl + query);\r\n const tmpData = data.content || data;\r\n\r\n setSearchResults(\r\n tmpData.map((item: any) => ({\r\n value: item[valueKey],\r\n label: labelKey instanceof Function ? labelKey(item) : item[labelKey],\r\n }))\r\n );\r\n };\r\n setSearchResults([]);\r\n\r\n if (query && valueKey && labelKey && fetchUrl && !selectedOption) {\r\n console.log(\"fetching\", query);\r\n fetchOptions();\r\n }\r\n }, [query, valueKey, labelKey, fetchUrl, federationContext.apiClient]);\r\n\r\n useClickAway(ref, () => {\r\n setSearchResults([]);\r\n setQuery(\"\");\r\n if (!selectedOption) {\r\n onChange(null);\r\n }\r\n onBlur();\r\n setIsFocused(false);\r\n });\r\n\r\n const handleQueryChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n if (event.target.value == selectedOption?.label) {\r\n return;\r\n } else if (event.target.value) {\r\n setSearchResults([]);\r\n setQuery(event.target.value);\r\n\r\n setSelectedOption(null);\r\n setSelectedOptionIndex(-1);\r\n } else {\r\n //clear handler\r\n onChange(null);\r\n setQuery(\"\");\r\n setSelectedOption(null);\r\n setTimeout(() => {\r\n setSelectedOptionIndex(-1);\r\n setSearchResults([]);\r\n }, 100);\r\n setIsFocused(false);\r\n }\r\n };\r\n const handleFocus = () => {\r\n setIsFocused(true);\r\n setSearchResults([]);\r\n onFocus();\r\n inputRef.current?.select(); // Add this line\r\n };\r\n\r\n const handleOptionClick = (option: IOptionItem) => {\r\n setSelectedOption(option);\r\n setSearchResults([]);\r\n setSelectedOptionIndex(-1);\r\n setQuery(\"\");\r\n onChange(option.value);\r\n setIsFocused(false);\r\n };\r\n const handleBlur = () => {\r\n setSearchResults([]);\r\n setTimeout(() => {\r\n if (!selectedOption) {\r\n setQuery(\"\");\r\n onChange(null);\r\n }\r\n }, 1);\r\n\r\n onBlur();\r\n setIsFocused(false);\r\n };\r\n\r\n return (\r\n <div\r\n className=\"w-full flex-col justify-start items-start gap-1.5 inline-flex relative\"\r\n ref={ref}\r\n >\r\n <InputField\r\n manualRef={inputRef}\r\n label={label}\r\n name={String(name) + \"_InputField\"}\r\n onInputChange={handleQueryChange}\r\n type=\"text\"\r\n value={selectedOption?.label || query}\r\n disabled={disabled}\r\n clearable\r\n className=\" min-w-[100px] px-0 \"\r\n rounded={true}\r\n placeholder={placeholder}\r\n debounceTimeout={1000}\r\n description={description}\r\n onFocus={handleFocus}\r\n onBlur={handleBlur}\r\n >\r\n <div className=\" h-6 w-6 items-center flex justify-center hover:bg-gray-100 rounded-full text-lg cursor-pointer\">\r\n {isFocused && <MdExpandLess />}\r\n {!isFocused && <MdExpandMore />}\r\n </div>\r\n </InputField>\r\n {searchResults.length == 0 && isFocused && !query && (\r\n <div\r\n className={`absolute text-sm py-2 px-4 w-full outline-4 bg-white text-gray-400 border border-gray-200 drop-shadow-xl z-50 ${label ? \"top-[68px]\" : \"top-[40px]\"}`}\r\n >\r\n Začněte psát...\r\n </div>\r\n )}\r\n {searchResults.length == 0 && isFocused && query && (\r\n <div\r\n className={`absolute text-sm py-2 px-4 w-full outline-4 bg-white border text-gray-400 border-gray-200 drop-shadow-xl z-50 ${label ? \"top-[68px]\" : \"top-[40px]\"}`}\r\n >\r\n Nic nenalezeno\r\n </div>\r\n )}\r\n {searchResults.length > 0 && isFocused && query && (\r\n <OptionList\r\n options={searchResults}\r\n selectedOptionIndex={selectedOptionIndex}\r\n handleOptionClick={handleOptionClick}\r\n label={label}\r\n />\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nconst OptionList: React.FC<OptionListProps> = ({\r\n options,\r\n selectedOptionIndex,\r\n handleOptionClick,\r\n label,\r\n}) => {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n // Ensure the selected option is scrolled into view\r\n if (selectedOptionIndex >= 0 && selectedOptionIndex < options.length) {\r\n const selectedElement = containerRef.current?.children[\r\n selectedOptionIndex\r\n ] as HTMLDivElement;\r\n selectedElement?.scrollIntoView({\r\n behavior: \"instant\",\r\n block: \"nearest\",\r\n });\r\n }\r\n }, [selectedOptionIndex, options.length]);\r\n const handleMouseDown = (event: any) => {\r\n event.preventDefault();\r\n };\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={`overflow-y-auto resultOptionContainer w-full max-h-96 outline-indigo-200 absolute outline-4 bg-white border border-gray-200 drop-shadow-xl z-50 ${label ? \"top-[68px]\" : \"top-[40px]\"} *:\r\n \r\n `}\r\n >\r\n {options?.map((option, index) => (\r\n <div\r\n key={option.value as string}\r\n className={`py-2 px-4 flex items-center justify-between gap-8 hover:bg-gray-200 cursor-pointer text-sm ${\r\n selectedOptionIndex === index ? \"bg-gray-200\" : \"\"\r\n }`}\r\n onClick={(e) => {\r\n e.preventDefault();\r\n handleOptionClick(option);\r\n }}\r\n onMouseDown={handleMouseDown}\r\n >\r\n <p className=\"font-normal\">{option.label}</p>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n};\r\n\r\nexport default AutocompleteSearchBarServer;\r\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AutocompleteSearchBarServer.js","sources":["../../../lib/components/form/AutocompleteSearchBarServer.tsx"],"sourcesContent":["import { useState, useEffect, useRef } from \"react\";\r\nimport { useClickAway } from \"react-use\";\r\nimport { MdExpandLess, MdExpandMore } from \"react-icons/md\";\r\nimport { InputField, IOptionItem, useFederationContext } from \"../../main\";\r\n\r\ninterface OptionListProps {\r\n options: IOptionItem[];\r\n selectedOptionIndex: number;\r\n handleOptionClick: (option: IOptionItem) => void;\r\n label?: string;\r\n}\r\n\r\nconst AutocompleteSearchBarServer: React.FC<{\r\n label: string;\r\n name: string;\r\n required?: boolean;\r\n disabled?: boolean;\r\n description?: string;\r\n fetchUrl?: string;\r\n valueKey: string;\r\n labelKey: string | ((item: any) => string);\r\n onChange: (value: any) => void;\r\n onFocus: () => void;\r\n onBlur: () => void;\r\n placeholder?: string;\r\n value?: string;\r\n initOptions?: IOptionItem[];\r\n clearable?: boolean;\r\n returnObject: boolean;\r\n}> = ({\r\n label,\r\n name,\r\n disabled,\r\n description,\r\n fetchUrl,\r\n valueKey,\r\n labelKey,\r\n onChange,\r\n onFocus,\r\n onBlur,\r\n placeholder,\r\n returnObject,\r\n value,\r\n}) => {\r\n const [query, setQuery] = useState(\"\");\r\n const [selectedOptionIndex, setSelectedOptionIndex] = useState(-1);\r\n const [selectedOption, setSelectedOption] = useState<IOptionItem | null>(\r\n null\r\n );\r\n const [searchResults, setSearchResults] = useState<IOptionItem[]>([]);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n const ref = useRef(null);\r\n const federationContext = useFederationContext();\r\n const [isFocused, setIsFocused] = useState(false);\r\n // const [errors] = useState<any>({});\r\n\r\n useEffect(() => {\r\n if (!value) {\r\n setQuery(\"\");\r\n setSelectedOption(null);\r\n }\r\n }, [value]);\r\n\r\n //fetch options\r\n useEffect(() => {\r\n const fetchOptions = async () => {\r\n const { data } = await federationContext.apiClient.get(fetchUrl + query);\r\n const tmpData = data.content || data;\r\n\r\n setSearchResults(\r\n tmpData.map((item: any) => ({\r\n value: item[valueKey],\r\n label: labelKey instanceof Function ? labelKey(item) : item[labelKey],\r\n }))\r\n );\r\n };\r\n setSearchResults([]);\r\n\r\n if (query && valueKey && labelKey && fetchUrl && !selectedOption) {\r\n fetchOptions();\r\n }\r\n }, [query, valueKey, labelKey, fetchUrl, federationContext.apiClient]);\r\n\r\n useClickAway(ref, () => {\r\n setSearchResults([]);\r\n setQuery(\"\");\r\n if (!selectedOption) {\r\n onChange(null);\r\n }\r\n onBlur();\r\n setIsFocused(false);\r\n });\r\n\r\n const handleQueryChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n if (event.target.value == selectedOption?.label) {\r\n return;\r\n } else if (event.target.value) {\r\n setSearchResults([]);\r\n setQuery(event.target.value);\r\n\r\n setSelectedOption(null);\r\n setSelectedOptionIndex(-1);\r\n } else {\r\n //clear handler\r\n onChange(null);\r\n setQuery(\"\");\r\n setSelectedOption(null);\r\n setTimeout(() => {\r\n setSelectedOptionIndex(-1);\r\n setSearchResults([]);\r\n }, 100);\r\n setIsFocused(false);\r\n }\r\n };\r\n const handleFocus = () => {\r\n setIsFocused(true);\r\n setSearchResults([]);\r\n onFocus();\r\n inputRef.current?.select(); // Add this line\r\n };\r\n\r\n const handleOptionClick = (option: IOptionItem) => {\r\n setSelectedOption(option);\r\n setSearchResults([]);\r\n setSelectedOptionIndex(-1);\r\n setQuery(\"\");\r\n onChange(returnObject ? option : option.value);\r\n setIsFocused(false);\r\n };\r\n const handleBlur = () => {\r\n setSearchResults([]);\r\n setTimeout(() => {\r\n if (!selectedOption) {\r\n setQuery(\"\");\r\n onChange(null);\r\n }\r\n }, 1);\r\n\r\n onBlur();\r\n setIsFocused(false);\r\n };\r\n return (\r\n <div\r\n className=\"w-full flex-col justify-start items-start gap-1.5 inline-flex relative\"\r\n ref={ref}\r\n >\r\n <InputField\r\n manualRef={inputRef}\r\n label={label}\r\n name={String(name) + \"_InputField\"}\r\n onInputChange={handleQueryChange}\r\n type=\"text\"\r\n value={selectedOption?.label || query}\r\n disabled={disabled}\r\n clearable\r\n className=\" min-w-[100px] px-0 \"\r\n rounded={true}\r\n placeholder={placeholder}\r\n debounceTimeout={1000}\r\n description={description}\r\n onFocus={handleFocus}\r\n onBlur={handleBlur}\r\n >\r\n <div className=\" h-6 w-6 items-center flex justify-center hover:bg-gray-100 rounded-full text-lg cursor-pointer\">\r\n {isFocused && <MdExpandLess />}\r\n {!isFocused && <MdExpandMore />}\r\n </div>\r\n </InputField>\r\n {searchResults.length == 0 && isFocused && !query && (\r\n <div\r\n className={`absolute text-sm py-2 px-4 w-full outline-4 bg-white text-gray-400 border border-gray-200 drop-shadow-xl z-50 ${label ? \"top-[68px]\" : \"top-[40px]\"}`}\r\n >\r\n Začněte psát...\r\n </div>\r\n )}\r\n {searchResults.length == 0 && isFocused && query && (\r\n <div\r\n className={`absolute text-sm py-2 px-4 w-full outline-4 bg-white border text-gray-400 border-gray-200 drop-shadow-xl z-50 ${label ? \"top-[68px]\" : \"top-[40px]\"}`}\r\n >\r\n Nic nenalezeno\r\n </div>\r\n )}\r\n {searchResults.length > 0 && isFocused && query && (\r\n <OptionList\r\n options={searchResults}\r\n selectedOptionIndex={selectedOptionIndex}\r\n handleOptionClick={handleOptionClick}\r\n label={label}\r\n />\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nconst OptionList: React.FC<OptionListProps> = ({\r\n options,\r\n selectedOptionIndex,\r\n handleOptionClick,\r\n label,\r\n}) => {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n // Ensure the selected option is scrolled into view\r\n if (selectedOptionIndex >= 0 && selectedOptionIndex < options.length) {\r\n const selectedElement = containerRef.current?.children[\r\n selectedOptionIndex\r\n ] as HTMLDivElement;\r\n selectedElement?.scrollIntoView({\r\n behavior: \"instant\",\r\n block: \"nearest\",\r\n });\r\n }\r\n }, [selectedOptionIndex, options.length]);\r\n const handleMouseDown = (event: any) => {\r\n event.preventDefault();\r\n };\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={`overflow-y-auto resultOptionContainer w-full max-h-96 outline-indigo-200 absolute outline-4 bg-white border border-gray-200 drop-shadow-xl z-50 ${label ? \"top-[68px]\" : \"top-[40px]\"} *:\r\n \r\n `}\r\n >\r\n {options?.map((option, index) => (\r\n <div\r\n key={option.value as string}\r\n className={`py-2 px-4 flex items-center justify-between gap-8 hover:bg-gray-200 cursor-pointer text-sm ${\r\n selectedOptionIndex === index ? \"bg-gray-200\" : \"\"\r\n }`}\r\n onClick={(e) => {\r\n e.preventDefault();\r\n handleOptionClick(option);\r\n }}\r\n onMouseDown={handleMouseDown}\r\n >\r\n <p className=\"font-normal\">{option.label}</p>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n};\r\n\r\nexport default AutocompleteSearchBarServer;\r\n"],"names":[],"mappings":"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"}
@@ -18,7 +18,7 @@ declare class PDFManager {
18
18
  marginLeft?: number;
19
19
  marginTop?: number;
20
20
  marginBottom?: number;
21
- }): void;
21
+ }, textOptions?: any): void;
22
22
  appendSquare(options?: {
23
23
  color?: [number, number, number] | string;
24
24
  height?: number;
@@ -36,7 +36,7 @@ class PDFManager {
36
36
  /**
37
37
  * Appends text to the current PDF document.
38
38
  */
39
- appendText(text, options = {}) {
39
+ appendText(text, options = {}, textOptions = {}) {
40
40
  const {
41
41
  fontSize = 12,
42
42
  bold = false,
@@ -45,7 +45,7 @@ class PDFManager {
45
45
  marginBottom = 0
46
46
  } = options;
47
47
  const lineHeight = fontSize * 0.5;
48
- const maxWidth = 180 - marginLeft;
48
+ const maxWidth = textOptions.width || 180 - marginLeft;
49
49
  this.doc.setFontSize(fontSize);
50
50
  this.doc.setFont("Arial", bold ? "bold" : "normal");
51
51
  const textLines = this.doc.splitTextToSize(text, maxWidth);
@@ -53,7 +53,8 @@ class PDFManager {
53
53
  textLines.forEach((line) => {
54
54
  this.checkPageBreak(lineHeight);
55
55
  this.doc.text(line, 10 + marginLeft, this.currentYPosition, {
56
- maxWidth
56
+ maxWidth,
57
+ ...textOptions
57
58
  });
58
59
  this.currentYPosition += lineHeight;
59
60
  });
@@ -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 ) {\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 = 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,\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 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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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@addsign/moje-agenda-shared-lib",
3
3
  "private": false,
4
- "version": "1.0.17",
4
+ "version": "1.0.18",
5
5
  "type": "module",
6
6
  "main": "dist/main.js",
7
7
  "types": "dist/main.d.ts",