@addsign/moje-agenda-shared-lib 2.0.79 → 2.0.81

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/assets/style.css +8 -0
  2. package/dist/components/Attachments.js +1 -0
  3. package/dist/components/Attachments.js.map +1 -1
  4. package/dist/components/datatable/DataTable.js +1 -0
  5. package/dist/components/datatable/DataTable.js.map +1 -1
  6. package/dist/components/datatable/DataTableServer.js +9 -0
  7. package/dist/components/datatable/DataTableServer.js.map +1 -1
  8. package/dist/components/form/AutocompleteSearchBar.js +1 -0
  9. package/dist/components/form/AutocompleteSearchBar.js.map +1 -1
  10. package/dist/components/form/AutocompleteSearchBarServer.js +1 -0
  11. package/dist/components/form/AutocompleteSearchBarServer.js.map +1 -1
  12. package/dist/components/form/FileInput.js +1 -0
  13. package/dist/components/form/FileInput.js.map +1 -1
  14. package/dist/components/form/FileInputForm.js +1 -0
  15. package/dist/components/form/FileInputForm.js.map +1 -1
  16. package/dist/components/form/FileInputFormMultiple.js +1 -0
  17. package/dist/components/form/FileInputFormMultiple.js.map +1 -1
  18. package/dist/components/form/FileInputMultiple.js +1 -0
  19. package/dist/components/form/FileInputMultiple.js.map +1 -1
  20. package/dist/components/form/FormField.js +1 -0
  21. package/dist/components/form/FormField.js.map +1 -1
  22. package/dist/components/form/PositionsSelectorSingle.js +1 -0
  23. package/dist/components/form/PositionsSelectorSingle.js.map +1 -1
  24. package/dist/components/form/SelectField.js +1 -0
  25. package/dist/components/form/SelectField.js.map +1 -1
  26. package/dist/components/layout/Neoptimizovano.js +1 -0
  27. package/dist/components/layout/Neoptimizovano.js.map +1 -1
  28. package/dist/components/profiles/ProfileOverview.js +1 -0
  29. package/dist/components/profiles/ProfileOverview.js.map +1 -1
  30. package/dist/components/ui/DateTimePicker.js +3 -44
  31. package/dist/components/ui/DateTimePicker.js.map +1 -1
  32. package/dist/components/ui/DateTimePicker2.d.ts +14 -0
  33. package/dist/components/ui/DateTimePicker2.js +196 -0
  34. package/dist/components/ui/DateTimePicker2.js.map +1 -0
  35. package/dist/main.d.ts +1 -0
  36. package/dist/main.js +4 -2
  37. package/dist/main.js.map +1 -1
  38. package/dist/set-BOUTbzpR.js +49 -0
  39. package/dist/set-BOUTbzpR.js.map +1 -0
  40. package/lib/components/datatable/DataTableServer.tsx +11 -0
  41. package/lib/components/ui/DateTimePicker2.tsx +242 -0
  42. package/lib/main.ts +1 -0
  43. package/package.json +1 -1
@@ -22,6 +22,7 @@ import "../ui/textarea.js";
22
22
  import "../ui/checkbox.js";
23
23
  import "../../Calendar-DWT4e7Th.js";
24
24
  import "../ui/DateTimePicker.js";
25
+ import "../ui/DateTimePicker2.js";
25
26
  import "../ui/DatePicker.js";
26
27
  import { u as useClickAway } from "../../useClickAway-CH9ykBsx.js";
27
28
  const AutocompleteSearchBar = ({
@@ -1 +1 @@
1
- {"version":3,"file":"AutocompleteSearchBar.js","sources":["../../../lib/components/form/AutocompleteSearchBar.tsx"],"sourcesContent":["import { useState, useEffect, useRef } from \"react\";\nimport { useClickAway } from \"react-use\";\nimport { IOptionItem, useFederationContext } from \"../../main\";\nimport { MdClose, MdExpandLess, MdExpandMore } from \"react-icons/md\";\n\ninterface OptionListProps {\n options: IOptionItem[];\n selectedOptionIndex: number;\n handleOptionClick: (option: IOptionItem) => void;\n label?: string;\n}\n\ninterface SearchInputProps {\n value: string;\n onChange: (event: React.ChangeEvent<HTMLInputElement>) => void;\n onKeyDown: (event: React.KeyboardEvent<HTMLInputElement>) => void;\n onFocus: () => void;\n clearQuery: () => void;\n inputRef: React.RefObject<HTMLInputElement>;\n placeholder?: string;\n isFocused?: boolean;\n onBlur: () => void;\n isLoading?: boolean;\n clearable?: boolean;\n}\n\nconst AutocompleteSearchBar: React.FC<{\n label: string;\n name: string;\n required?: boolean;\n disabled?: boolean;\n description?: string;\n fetchUrl?: string;\n valueKey: string;\n labelKey: string;\n onChange: (value: any) => void;\n onFocus: () => void;\n onBlur: () => void;\n placeholder?: string;\n serverSearch?: boolean;\n value?: string;\n initOptions?: IOptionItem[];\n showId?: boolean;\n clearable?: boolean;\n rounded?: boolean;\n}> = ({\n label,\n name,\n required,\n disabled,\n description,\n fetchUrl,\n valueKey,\n labelKey,\n onChange,\n onFocus,\n onBlur,\n placeholder,\n serverSearch = false,\n value,\n initOptions,\n showId,\n clearable = true,\n rounded = true,\n}) => {\n const [query, setQuery] = useState(\"\");\n const [loading, setLoading] = useState(false);\n const [options, setOptions] = useState<IOptionItem[]>([]);\n const [selectedOptionIndex, setSelectedOptionIndex] = useState(-1);\n const [selectedOption, setSelectedOption] = useState<IOptionItem | null>(\n null\n );\n const [searchResults, setSearchResults] = useState<IOptionItem[]>([]);\n const inputRef = useRef<HTMLInputElement>(null);\n const ref = useRef(null);\n const federationContext = useFederationContext();\n\n const [isFocused, setIsFocused] = useState(false);\n\n const [errors] = useState<any>({});\n\n useEffect(() => {\n const fetchOptions = async () => {\n setLoading(true);\n\n const { data } = await federationContext.apiClient.get(fetchUrl || \"\");\n // osetreni obou variant navratu z BE\n const tmpData = data.content || data;\n\n setOptions(\n tmpData.map((item: any) => ({\n value: item[valueKey],\n label: item[labelKey] + (showId ? \" (\" + item[valueKey] + \")\" : \"\"),\n }))\n ); // Adjust map according to actual API response\n setLoading(false);\n };\n\n if (fetchUrl) fetchOptions();\n }, [fetchUrl, labelKey, showId, valueKey, federationContext.apiClient]);\n\n useEffect(() => {\n if (initOptions) setOptions(initOptions);\n }, [initOptions]);\n\n useEffect(() => {\n if (value && options) {\n const initOption = options.find((it) => it.value == value);\n\n if (initOption) {\n setQuery(initOption.label);\n setSelectedOption(initOption);\n }\n }\n }, [value, options]);\n\n useEffect(() => {\n if (!value) {\n setQuery(\"\");\n setSelectedOption(null);\n }\n }, [value]);\n\n useEffect(() => {\n const fetchOptions = async () => {\n setLoading(true);\n const { data } = await federationContext.apiClient.get(fetchUrl + query);\n setOptions(\n data.map((item: any) => ({\n value: item[valueKey],\n label: item[labelKey] + (showId ? \" (\" + item[valueKey] + \")\" : \"\"),\n }))\n ); // Adjust map according to actual API response\n setSearchResults(\n data.map((item: any) => ({\n value: item[valueKey],\n label: item[labelKey] + (showId ? \" (\" + item[valueKey] + \")\" : \"\"),\n }))\n ); // Adjust map according to actual API response\n\n setLoading(false);\n };\n\n if (serverSearch) fetchOptions();\n }, [\n query,\n serverSearch,\n valueKey,\n labelKey,\n fetchUrl,\n federationContext.apiClient,\n showId,\n ]);\n\n useClickAway(ref, () => {\n if (isFocused) {\n setSearchResults([]);\n if (!selectedOption) {\n setQuery(\"\");\n onChange(null);\n }\n\n handleBlur();\n onBlur();\n setIsFocused(false);\n }\n });\n\n const handleQueryChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setQuery(event.target.value);\n setSelectedOption(null);\n setSelectedOptionIndex(-1);\n setSearchResults(\n options.filter((option) =>\n option?.label\n ?.toLowerCase()\n .includes(event.target?.value?.toLowerCase())\n )\n );\n };\n const handleFocus = () => {\n setIsFocused(true);\n onFocus();\n setSearchResults(\n options /*.filter((option) =>\n option.label.toLowerCase().includes(query.toLowerCase()),\n ),*/\n );\n inputRef.current?.select(); // Add this line\n };\n\n const handleClearQuery = () => {\n setQuery(\"\");\n onChange(null);\n setSelectedOption(null);\n setTimeout(() => {\n setSelectedOptionIndex(-1);\n setSearchResults(options);\n }, 1000);\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"ArrowUp\" && searchResults.length > 0) {\n setSelectedOptionIndex((prevIndex) =>\n prevIndex > 0 ? prevIndex - 1 : searchResults.length - 1\n );\n } else if (event.key === \"ArrowDown\" && searchResults.length > 0) {\n setSelectedOptionIndex((prevIndex) =>\n prevIndex < searchResults.length - 1 ? prevIndex + 1 : 0\n );\n } else if (event.key === \"Enter\" && selectedOptionIndex !== -1) {\n handleOptionClick(searchResults[selectedOptionIndex]);\n } else if (event.key === \"Escape\" && selectedOptionIndex !== -1) {\n handleBlur();\n }\n };\n\n const handleOptionClick = (option: IOptionItem) => {\n setQuery(option.label);\n setSelectedOption(option);\n setSelectedOptionIndex(-1);\n\n onChange(option.value);\n\n handleBlur();\n };\n const handleBlur = () => {\n setSearchResults([]);\n onBlur();\n setIsFocused(false);\n };\n\n return (\n <div className=\"w-full flex-col justify-start items-start gap-1.5 inline-flex\">\n <div\n className=\"self-stretch flex-col justify-start items-start gap-1.5 flex relative\"\n ref={ref}\n >\n {label && (\n <label\n className=\"text-slate-700 text-sm leading-tight font-medium\"\n htmlFor={name}\n >\n {label} {required ? \"*\" : \"\"}\n </label>\n )}\n <div\n className={`self-stretch px-3 py-1.5 justify-start items-center gap-2 inline-flex outline-none border bg-white\n ${\n isFocused\n ? \"outline-4 outline-indigo-200 outline-offset-0 border-indigo-300\"\n : \"\"\n } \n ${\n isFocused && errors[name]?.message\n ? \"outline-4 outline-red-200 outline-offset-0 border-none\"\n : \"\"\n } \n ${!isFocused && errors[name]?.message ? \"border-red-200\" : \"\"} \n ${disabled ? \"bg-gray-100\" : \"bg-transparent\"}\n ${rounded ? \" rounded-lg \" : \" rounded-none \"}`}\n >\n <div className=\"Content grow shrink basis-0 min-h-5 lg:min-h-7 justify-start items-start gap-2 flex relative flex-col w-full mx-auto\">\n <SearchInput\n value={query}\n onChange={handleQueryChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus} // Pass the onFocus handler\n clearQuery={handleClearQuery} // Pass the onFocus handler\n inputRef={inputRef}\n placeholder={placeholder}\n isFocused={isFocused}\n onBlur={handleBlur}\n isLoading={loading}\n clearable={clearable}\n />\n </div>\n </div>\n {searchResults.length > 0 && isFocused && (\n <OptionList\n options={searchResults}\n selectedOptionIndex={selectedOptionIndex}\n handleOptionClick={handleOptionClick}\n label={label}\n />\n )}\n </div>\n {description && (\n <div className=\"HintText self-stretch text-slate-600 text-sm font-normal leading-tight\">\n {description}\n </div>\n )}\n </div>\n );\n};\n\nconst OptionList: React.FC<OptionListProps> = ({\n options,\n selectedOptionIndex,\n handleOptionClick,\n label,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n // Ensure the selected option is scrolled into view\n if (selectedOptionIndex >= 0 && selectedOptionIndex < options.length) {\n const selectedElement = containerRef.current?.children[\n selectedOptionIndex\n ] as HTMLDivElement;\n selectedElement?.scrollIntoView({\n behavior: \"instant\",\n block: \"nearest\",\n });\n }\n }, [selectedOptionIndex, options.length]);\n\n return (\n <div\n ref={containerRef}\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]\"} *:\n \n `}\n >\n {options?.map((option, index) => (\n <div\n key={option.value as string}\n className={`py-2 px-4 flex items-center justify-between gap-8 hover:bg-gray-200 cursor-pointer text-sm ${\n selectedOptionIndex === index ? \"bg-gray-200\" : \"\"\n }`}\n onClick={() => handleOptionClick(option)}\n >\n <p className=\"font-normal\">{option.label}</p>\n </div>\n ))}\n </div>\n );\n};\n\nconst SearchInput: React.FC<SearchInputProps> = ({\n value,\n onChange,\n onKeyDown,\n onFocus,\n onBlur,\n inputRef,\n placeholder,\n clearQuery,\n isFocused,\n isLoading,\n clearable = true,\n}) => {\n const handleExpandMoreClick = () => {\n inputRef.current?.focus();\n onFocus();\n };\n\n const handleClearQuery = () => {\n clearQuery();\n };\n\n return (\n <div className=\"relative flex items-center w-full sharedResource text-sm bg-white\">\n <input\n type=\"text\"\n className={`pl-1 py-1 border-gray-800 bg-white w-full ${\n isLoading ? \"pr-10 \" : \"pr-20\"\n }`}\n value={value}\n onChange={onChange}\n onKeyDown={onKeyDown}\n onFocus={onFocus}\n ref={inputRef}\n placeholder={placeholder}\n disabled={isLoading}\n />\n {isLoading && (\n <div className=\"loader absolute right-0 text-gray-500\">\n {/* You can replace this div with an SVG or another icon of your choice */}\n <svg\n className=\"animate-spin h-5 w-5\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8v4a4 4 0 00-4 4H4z\"\n />\n </svg>\n </div>\n )}\n {isFocused && !isLoading && (\n <MdExpandLess\n className=\"material-icons absolute right-0 cursor-pointer text-muted-foreground lext-lg\"\n onClick={onBlur}\n />\n )}\n {!isFocused && !isLoading && (\n <MdExpandMore\n className=\"material-icons absolute right-0 cursor-pointer text-muted-foreground lext-lg\"\n onClick={handleExpandMoreClick}\n />\n )}\n {value && clearable && !isLoading && (\n <MdClose\n className=\"material-icons absolute right-6 cursor-pointer text-muted-foreground lext-lg\"\n onClick={handleClearQuery}\n />\n )}\n </div>\n );\n};\n\nexport default AutocompleteSearchBar;\n"],"names":["_b","_a"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,MAAM,wBAmBD,CAAC;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,UAAU;AACZ,MAAM;;AACJ,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,EAAE;AACrC,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,SAAS,UAAU,IAAI,SAAwB,CAAE,CAAA;AACxD,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,SAAS,EAAE;AAC3D,QAAA,CAAC,gBAAgB,iBAAiB,IAAI;AAAA,IAC1C;AAAA,EAAA;AAEF,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAwB,CAAE,CAAA;AAC9D,QAAA,WAAW,OAAyB,IAAI;AACxC,QAAA,MAAM,OAAO,IAAI;AACvB,QAAM,oBAAoB;AAE1B,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAEhD,QAAM,CAAC,MAAM,IAAI,SAAc,CAAE,CAAA;AAEjC,YAAU,MAAM;AACd,UAAM,eAAe,YAAY;AAC/B,iBAAW,IAAI;AAET,YAAA,EAAE,KAAS,IAAA,MAAM,kBAAkB,UAAU,IAAI,YAAY,EAAE;AAE/D,YAAA,UAAU,KAAK,WAAW;AAEhC;AAAA,QACE,QAAQ,IAAI,CAAC,UAAe;AAAA,UAC1B,OAAO,KAAK,QAAQ;AAAA,UACpB,OAAO,KAAK,QAAQ,KAAK,SAAS,OAAO,KAAK,QAAQ,IAAI,MAAM;AAAA,QAAA,EAChE;AAAA,MAAA;AAEJ,iBAAW,KAAK;AAAA,IAAA;AAGd,QAAA;AAAuB;EAAA,GAC1B,CAAC,UAAU,UAAU,QAAQ,UAAU,kBAAkB,SAAS,CAAC;AAEtE,YAAU,MAAM;AACV,QAAA;AAAa,iBAAW,WAAW;AAAA,EAAA,GACtC,CAAC,WAAW,CAAC;AAEhB,YAAU,MAAM;AACd,QAAI,SAAS,SAAS;AACpB,YAAM,aAAa,QAAQ,KAAK,CAAC,OAAO,GAAG,SAAS,KAAK;AAEzD,UAAI,YAAY;AACd,iBAAS,WAAW,KAAK;AACzB,0BAAkB,UAAU;AAAA,MAC9B;AAAA,IACF;AAAA,EAAA,GACC,CAAC,OAAO,OAAO,CAAC;AAEnB,YAAU,MAAM;AACd,QAAI,CAAC,OAAO;AACV,eAAS,EAAE;AACX,wBAAkB,IAAI;AAAA,IACxB;AAAA,EAAA,GACC,CAAC,KAAK,CAAC;AAEV,YAAU,MAAM;AACd,UAAM,eAAe,YAAY;AAC/B,iBAAW,IAAI;AACT,YAAA,EAAE,KAAS,IAAA,MAAM,kBAAkB,UAAU,IAAI,WAAW,KAAK;AACvE;AAAA,QACE,KAAK,IAAI,CAAC,UAAe;AAAA,UACvB,OAAO,KAAK,QAAQ;AAAA,UACpB,OAAO,KAAK,QAAQ,KAAK,SAAS,OAAO,KAAK,QAAQ,IAAI,MAAM;AAAA,QAAA,EAChE;AAAA,MAAA;AAEJ;AAAA,QACE,KAAK,IAAI,CAAC,UAAe;AAAA,UACvB,OAAO,KAAK,QAAQ;AAAA,UACpB,OAAO,KAAK,QAAQ,KAAK,SAAS,OAAO,KAAK,QAAQ,IAAI,MAAM;AAAA,QAAA,EAChE;AAAA,MAAA;AAGJ,iBAAW,KAAK;AAAA,IAAA;AAGd,QAAA;AAA2B;EAAA,GAC9B;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,IAClB;AAAA,EAAA,CACD;AAED,eAAa,KAAK,MAAM;AACtB,QAAI,WAAW;AACb,uBAAiB,CAAE,CAAA;AACnB,UAAI,CAAC,gBAAgB;AACnB,iBAAS,EAAE;AACX,iBAAS,IAAI;AAAA,MACf;AAEW;AACJ;AACP,mBAAa,KAAK;AAAA,IACpB;AAAA,EAAA,CACD;AAEK,QAAA,oBAAoB,CAAC,UAA+C;AAC/D,aAAA,MAAM,OAAO,KAAK;AAC3B,sBAAkB,IAAI;AACtB,2BAAuB,EAAE;AACzB;AAAA,MACE,QAAQ;AAAA,QAAO,CAAC,WACd;;AAAA,wDAAQ,UAAR,mBACI,cACD,UAASA,OAAAC,MAAA,MAAM,WAAN,gBAAAA,IAAc,UAAd,gBAAAD,IAAqB;AAAA;AAAA,MACnC;AAAA,IAAA;AAAA,EACF;AAEF,QAAM,cAAc,MAAM;;AACxB,iBAAa,IAAI;AACT;AACR;AAAA,MACE;AAAA;AAAA;AAAA;AAAA,IAAA;AAIF,KAAAC,MAAA,SAAS,YAAT,gBAAAA,IAAkB;AAAA,EAAO;AAG3B,QAAM,mBAAmB,MAAM;AAC7B,aAAS,EAAE;AACX,aAAS,IAAI;AACb,sBAAkB,IAAI;AACtB,eAAW,MAAM;AACf,6BAAuB,EAAE;AACzB,uBAAiB,OAAO;AAAA,OACvB,GAAI;AAAA,EAAA;AAGH,QAAA,gBAAgB,CAAC,UAAiD;AACtE,QAAI,MAAM,QAAQ,aAAa,cAAc,SAAS,GAAG;AACvD;AAAA,QAAuB,CAAC,cACtB,YAAY,IAAI,YAAY,IAAI,cAAc,SAAS;AAAA,MAAA;AAAA,IACzD,WACS,MAAM,QAAQ,eAAe,cAAc,SAAS,GAAG;AAChE;AAAA,QAAuB,CAAC,cACtB,YAAY,cAAc,SAAS,IAAI,YAAY,IAAI;AAAA,MAAA;AAAA,IACzD,WACS,MAAM,QAAQ,WAAW,wBAAwB,IAAI;AAC5C,wBAAA,cAAc,mBAAmB,CAAC;AAAA,IAAA,WAC3C,MAAM,QAAQ,YAAY,wBAAwB,IAAI;AACpD;IACb;AAAA,EAAA;AAGI,QAAA,oBAAoB,CAAC,WAAwB;AACjD,aAAS,OAAO,KAAK;AACrB,sBAAkB,MAAM;AACxB,2BAAuB,EAAE;AAEzB,aAAS,OAAO,KAAK;AAEV;EAAA;AAEb,QAAM,aAAa,MAAM;AACvB,qBAAiB,CAAE,CAAA;AACZ;AACP,iBAAa,KAAK;AAAA,EAAA;AAIlB,SAAA,qBAAC,OAAI,EAAA,WAAU,kEACb,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV;AAAA,QAEC,UAAA;AAAA,UACC,SAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,SAAS;AAAA,cAER,UAAA;AAAA,gBAAA;AAAA,gBAAM;AAAA,gBAAE,WAAW,MAAM;AAAA,cAAA;AAAA,YAAA;AAAA,UAC5B;AAAA,UAEF;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAW;AAAA,cAEP,YACI,oEACA,EACN;AAAA,cAEE,eAAa,YAAO,IAAI,MAAX,mBAAc,WACvB,2DACA,EACN;AAAA,cACE,CAAC,eAAa,YAAO,IAAI,MAAX,mBAAc,WAAU,mBAAmB,EAAE;AAAA,cAC3D,WAAW,gBAAgB,gBAAgB;AAAA,cAC3C,UAAU,iBAAiB,gBAAgB;AAAA,cAE/C,UAAA,oBAAC,OAAI,EAAA,WAAU,0HACb,UAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAO;AAAA,kBACP,UAAU;AAAA,kBACV,WAAW;AAAA,kBACX,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,QAAQ;AAAA,kBACR,WAAW;AAAA,kBACX;AAAA,gBAAA;AAAA,cAAA,GAEJ;AAAA,YAAA;AAAA,UACF;AAAA,UACC,cAAc,SAAS,KAAK,aAC3B;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAAS;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,YAAA;AAAA,UACF;AAAA,QAAA;AAAA,MAAA;AAAA,IAEJ;AAAA,IACC,eACC,oBAAC,OAAI,EAAA,WAAU,0EACZ,UACH,aAAA;AAAA,EAEJ,EAAA,CAAA;AAEJ;AAEA,MAAM,aAAwC,CAAC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACE,QAAA,eAAe,OAAuB,IAAI;AAEhD,YAAU,MAAM;;AAEd,QAAI,uBAAuB,KAAK,sBAAsB,QAAQ,QAAQ;AACpE,YAAM,mBAAkB,kBAAa,YAAb,mBAAsB,SAC5C;AAEF,yDAAiB,eAAe;AAAA,QAC9B,UAAU;AAAA,QACV,OAAO;AAAA,MAAA;AAAA,IAEX;AAAA,EACC,GAAA,CAAC,qBAAqB,QAAQ,MAAM,CAAC;AAGtC,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW,oJAAoJ,QAAQ,eAAe,YAAY;AAAA;AAAA;AAAA,MAIjM,UAAS,mCAAA,IAAI,CAAC,QAAQ,UACrB;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,WAAW,8FACT,wBAAwB,QAAQ,gBAAgB,EAClD;AAAA,UACA,SAAS,MAAM,kBAAkB,MAAM;AAAA,UAEvC,UAAC,oBAAA,KAAA,EAAE,WAAU,eAAe,iBAAO,OAAM;AAAA,QAAA;AAAA,QANpC,OAAO;AAAA,MAAA;AAAA,IAQf;AAAA,EAAA;AAGP;AAEA,MAAM,cAA0C,CAAC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AACd,MAAM;AACJ,QAAM,wBAAwB,MAAM;;AAClC,mBAAS,YAAT,mBAAkB;AACV;EAAA;AAGV,QAAM,mBAAmB,MAAM;AAClB;EAAA;AAIX,SAAA,qBAAC,OAAI,EAAA,WAAU,qEACb,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAW,+CACT,YAAY,WAAW,OACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA,UAAU;AAAA,MAAA;AAAA,IACZ;AAAA,IACC,aACC,oBAAC,OAAI,EAAA,WAAU,yCAEb,UAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAM;AAAA,QACN,MAAK;AAAA,QACL,SAAQ;AAAA,QAER,UAAA;AAAA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,IAAG;AAAA,cACH,IAAG;AAAA,cACH,GAAE;AAAA,cACF,QAAO;AAAA,cACP,aAAY;AAAA,YAAA;AAAA,UACd;AAAA,UACA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,MAAK;AAAA,cACL,GAAE;AAAA,YAAA;AAAA,UACJ;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,GAEJ;AAAA,IAED,aAAa,CAAC,aACb;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,SAAS;AAAA,MAAA;AAAA,IACX;AAAA,IAED,CAAC,aAAa,CAAC,aACd;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,SAAS;AAAA,MAAA;AAAA,IACX;AAAA,IAED,SAAS,aAAa,CAAC,aACtB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,SAAS;AAAA,MAAA;AAAA,IACX;AAAA,EAEJ,EAAA,CAAA;AAEJ;"}
1
+ {"version":3,"file":"AutocompleteSearchBar.js","sources":["../../../lib/components/form/AutocompleteSearchBar.tsx"],"sourcesContent":["import { useState, useEffect, useRef } from \"react\";\nimport { useClickAway } from \"react-use\";\nimport { IOptionItem, useFederationContext } from \"../../main\";\nimport { MdClose, MdExpandLess, MdExpandMore } from \"react-icons/md\";\n\ninterface OptionListProps {\n options: IOptionItem[];\n selectedOptionIndex: number;\n handleOptionClick: (option: IOptionItem) => void;\n label?: string;\n}\n\ninterface SearchInputProps {\n value: string;\n onChange: (event: React.ChangeEvent<HTMLInputElement>) => void;\n onKeyDown: (event: React.KeyboardEvent<HTMLInputElement>) => void;\n onFocus: () => void;\n clearQuery: () => void;\n inputRef: React.RefObject<HTMLInputElement>;\n placeholder?: string;\n isFocused?: boolean;\n onBlur: () => void;\n isLoading?: boolean;\n clearable?: boolean;\n}\n\nconst AutocompleteSearchBar: React.FC<{\n label: string;\n name: string;\n required?: boolean;\n disabled?: boolean;\n description?: string;\n fetchUrl?: string;\n valueKey: string;\n labelKey: string;\n onChange: (value: any) => void;\n onFocus: () => void;\n onBlur: () => void;\n placeholder?: string;\n serverSearch?: boolean;\n value?: string;\n initOptions?: IOptionItem[];\n showId?: boolean;\n clearable?: boolean;\n rounded?: boolean;\n}> = ({\n label,\n name,\n required,\n disabled,\n description,\n fetchUrl,\n valueKey,\n labelKey,\n onChange,\n onFocus,\n onBlur,\n placeholder,\n serverSearch = false,\n value,\n initOptions,\n showId,\n clearable = true,\n rounded = true,\n}) => {\n const [query, setQuery] = useState(\"\");\n const [loading, setLoading] = useState(false);\n const [options, setOptions] = useState<IOptionItem[]>([]);\n const [selectedOptionIndex, setSelectedOptionIndex] = useState(-1);\n const [selectedOption, setSelectedOption] = useState<IOptionItem | null>(\n null\n );\n const [searchResults, setSearchResults] = useState<IOptionItem[]>([]);\n const inputRef = useRef<HTMLInputElement>(null);\n const ref = useRef(null);\n const federationContext = useFederationContext();\n\n const [isFocused, setIsFocused] = useState(false);\n\n const [errors] = useState<any>({});\n\n useEffect(() => {\n const fetchOptions = async () => {\n setLoading(true);\n\n const { data } = await federationContext.apiClient.get(fetchUrl || \"\");\n // osetreni obou variant navratu z BE\n const tmpData = data.content || data;\n\n setOptions(\n tmpData.map((item: any) => ({\n value: item[valueKey],\n label: item[labelKey] + (showId ? \" (\" + item[valueKey] + \")\" : \"\"),\n }))\n ); // Adjust map according to actual API response\n setLoading(false);\n };\n\n if (fetchUrl) fetchOptions();\n }, [fetchUrl, labelKey, showId, valueKey, federationContext.apiClient]);\n\n useEffect(() => {\n if (initOptions) setOptions(initOptions);\n }, [initOptions]);\n\n useEffect(() => {\n if (value && options) {\n const initOption = options.find((it) => it.value == value);\n\n if (initOption) {\n setQuery(initOption.label);\n setSelectedOption(initOption);\n }\n }\n }, [value, options]);\n\n useEffect(() => {\n if (!value) {\n setQuery(\"\");\n setSelectedOption(null);\n }\n }, [value]);\n\n useEffect(() => {\n const fetchOptions = async () => {\n setLoading(true);\n const { data } = await federationContext.apiClient.get(fetchUrl + query);\n setOptions(\n data.map((item: any) => ({\n value: item[valueKey],\n label: item[labelKey] + (showId ? \" (\" + item[valueKey] + \")\" : \"\"),\n }))\n ); // Adjust map according to actual API response\n setSearchResults(\n data.map((item: any) => ({\n value: item[valueKey],\n label: item[labelKey] + (showId ? \" (\" + item[valueKey] + \")\" : \"\"),\n }))\n ); // Adjust map according to actual API response\n\n setLoading(false);\n };\n\n if (serverSearch) fetchOptions();\n }, [\n query,\n serverSearch,\n valueKey,\n labelKey,\n fetchUrl,\n federationContext.apiClient,\n showId,\n ]);\n\n useClickAway(ref, () => {\n if (isFocused) {\n setSearchResults([]);\n if (!selectedOption) {\n setQuery(\"\");\n onChange(null);\n }\n\n handleBlur();\n onBlur();\n setIsFocused(false);\n }\n });\n\n const handleQueryChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setQuery(event.target.value);\n setSelectedOption(null);\n setSelectedOptionIndex(-1);\n setSearchResults(\n options.filter((option) =>\n option?.label\n ?.toLowerCase()\n .includes(event.target?.value?.toLowerCase())\n )\n );\n };\n const handleFocus = () => {\n setIsFocused(true);\n onFocus();\n setSearchResults(\n options /*.filter((option) =>\n option.label.toLowerCase().includes(query.toLowerCase()),\n ),*/\n );\n inputRef.current?.select(); // Add this line\n };\n\n const handleClearQuery = () => {\n setQuery(\"\");\n onChange(null);\n setSelectedOption(null);\n setTimeout(() => {\n setSelectedOptionIndex(-1);\n setSearchResults(options);\n }, 1000);\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"ArrowUp\" && searchResults.length > 0) {\n setSelectedOptionIndex((prevIndex) =>\n prevIndex > 0 ? prevIndex - 1 : searchResults.length - 1\n );\n } else if (event.key === \"ArrowDown\" && searchResults.length > 0) {\n setSelectedOptionIndex((prevIndex) =>\n prevIndex < searchResults.length - 1 ? prevIndex + 1 : 0\n );\n } else if (event.key === \"Enter\" && selectedOptionIndex !== -1) {\n handleOptionClick(searchResults[selectedOptionIndex]);\n } else if (event.key === \"Escape\" && selectedOptionIndex !== -1) {\n handleBlur();\n }\n };\n\n const handleOptionClick = (option: IOptionItem) => {\n setQuery(option.label);\n setSelectedOption(option);\n setSelectedOptionIndex(-1);\n\n onChange(option.value);\n\n handleBlur();\n };\n const handleBlur = () => {\n setSearchResults([]);\n onBlur();\n setIsFocused(false);\n };\n\n return (\n <div className=\"w-full flex-col justify-start items-start gap-1.5 inline-flex\">\n <div\n className=\"self-stretch flex-col justify-start items-start gap-1.5 flex relative\"\n ref={ref}\n >\n {label && (\n <label\n className=\"text-slate-700 text-sm leading-tight font-medium\"\n htmlFor={name}\n >\n {label} {required ? \"*\" : \"\"}\n </label>\n )}\n <div\n className={`self-stretch px-3 py-1.5 justify-start items-center gap-2 inline-flex outline-none border bg-white\n ${\n isFocused\n ? \"outline-4 outline-indigo-200 outline-offset-0 border-indigo-300\"\n : \"\"\n } \n ${\n isFocused && errors[name]?.message\n ? \"outline-4 outline-red-200 outline-offset-0 border-none\"\n : \"\"\n } \n ${!isFocused && errors[name]?.message ? \"border-red-200\" : \"\"} \n ${disabled ? \"bg-gray-100\" : \"bg-transparent\"}\n ${rounded ? \" rounded-lg \" : \" rounded-none \"}`}\n >\n <div className=\"Content grow shrink basis-0 min-h-5 lg:min-h-7 justify-start items-start gap-2 flex relative flex-col w-full mx-auto\">\n <SearchInput\n value={query}\n onChange={handleQueryChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus} // Pass the onFocus handler\n clearQuery={handleClearQuery} // Pass the onFocus handler\n inputRef={inputRef}\n placeholder={placeholder}\n isFocused={isFocused}\n onBlur={handleBlur}\n isLoading={loading}\n clearable={clearable}\n />\n </div>\n </div>\n {searchResults.length > 0 && isFocused && (\n <OptionList\n options={searchResults}\n selectedOptionIndex={selectedOptionIndex}\n handleOptionClick={handleOptionClick}\n label={label}\n />\n )}\n </div>\n {description && (\n <div className=\"HintText self-stretch text-slate-600 text-sm font-normal leading-tight\">\n {description}\n </div>\n )}\n </div>\n );\n};\n\nconst OptionList: React.FC<OptionListProps> = ({\n options,\n selectedOptionIndex,\n handleOptionClick,\n label,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n // Ensure the selected option is scrolled into view\n if (selectedOptionIndex >= 0 && selectedOptionIndex < options.length) {\n const selectedElement = containerRef.current?.children[\n selectedOptionIndex\n ] as HTMLDivElement;\n selectedElement?.scrollIntoView({\n behavior: \"instant\",\n block: \"nearest\",\n });\n }\n }, [selectedOptionIndex, options.length]);\n\n return (\n <div\n ref={containerRef}\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]\"} *:\n \n `}\n >\n {options?.map((option, index) => (\n <div\n key={option.value as string}\n className={`py-2 px-4 flex items-center justify-between gap-8 hover:bg-gray-200 cursor-pointer text-sm ${\n selectedOptionIndex === index ? \"bg-gray-200\" : \"\"\n }`}\n onClick={() => handleOptionClick(option)}\n >\n <p className=\"font-normal\">{option.label}</p>\n </div>\n ))}\n </div>\n );\n};\n\nconst SearchInput: React.FC<SearchInputProps> = ({\n value,\n onChange,\n onKeyDown,\n onFocus,\n onBlur,\n inputRef,\n placeholder,\n clearQuery,\n isFocused,\n isLoading,\n clearable = true,\n}) => {\n const handleExpandMoreClick = () => {\n inputRef.current?.focus();\n onFocus();\n };\n\n const handleClearQuery = () => {\n clearQuery();\n };\n\n return (\n <div className=\"relative flex items-center w-full sharedResource text-sm bg-white\">\n <input\n type=\"text\"\n className={`pl-1 py-1 border-gray-800 bg-white w-full ${\n isLoading ? \"pr-10 \" : \"pr-20\"\n }`}\n value={value}\n onChange={onChange}\n onKeyDown={onKeyDown}\n onFocus={onFocus}\n ref={inputRef}\n placeholder={placeholder}\n disabled={isLoading}\n />\n {isLoading && (\n <div className=\"loader absolute right-0 text-gray-500\">\n {/* You can replace this div with an SVG or another icon of your choice */}\n <svg\n className=\"animate-spin h-5 w-5\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8v4a4 4 0 00-4 4H4z\"\n />\n </svg>\n </div>\n )}\n {isFocused && !isLoading && (\n <MdExpandLess\n className=\"material-icons absolute right-0 cursor-pointer text-muted-foreground lext-lg\"\n onClick={onBlur}\n />\n )}\n {!isFocused && !isLoading && (\n <MdExpandMore\n className=\"material-icons absolute right-0 cursor-pointer text-muted-foreground lext-lg\"\n onClick={handleExpandMoreClick}\n />\n )}\n {value && clearable && !isLoading && (\n <MdClose\n className=\"material-icons absolute right-6 cursor-pointer text-muted-foreground lext-lg\"\n onClick={handleClearQuery}\n />\n )}\n </div>\n );\n};\n\nexport default AutocompleteSearchBar;\n"],"names":["_b","_a"],"mappings":"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"}
@@ -23,6 +23,7 @@ import "../ui/textarea.js";
23
23
  import "../ui/checkbox.js";
24
24
  import "../../Calendar-DWT4e7Th.js";
25
25
  import "../ui/DateTimePicker.js";
26
+ import "../ui/DateTimePicker2.js";
26
27
  import "../ui/DatePicker.js";
27
28
  import { u as useClickAway } from "../../useClickAway-CH9ykBsx.js";
28
29
  const AutocompleteSearchBarServer = ({
@@ -1 +1 @@
1
- {"version":3,"file":"AutocompleteSearchBarServer.js","sources":["../../../lib/components/form/AutocompleteSearchBarServer.tsx"],"sourcesContent":["import { useState, useEffect, useRef } from \"react\";\nimport { useClickAway } from \"react-use\";\nimport { MdExpandLess, MdExpandMore } from \"react-icons/md\";\nimport { InputField, IOptionItem, useFederationContext } from \"../../main\";\n\ninterface OptionListProps {\n options: IOptionItem[];\n selectedOptionIndex: number;\n handleOptionClick: (option: IOptionItem) => void;\n label?: string;\n}\n\nconst AutocompleteSearchBarServer: React.FC<{\n label: string;\n name: string;\n required?: boolean;\n disabled?: boolean;\n description?: string;\n fetchUrl?: string;\n valueKey: string;\n labelKey: string | ((item: any) => string);\n onChange: (value: any) => void;\n onFocus: () => void;\n onBlur: () => void;\n placeholder?: string;\n value?: string;\n initOptions?: IOptionItem[];\n clearable?: boolean;\n returnObject: boolean;\n}> = ({\n label,\n name,\n disabled,\n description,\n fetchUrl,\n valueKey,\n labelKey,\n onChange,\n onFocus,\n onBlur,\n placeholder,\n returnObject,\n value,\n required,\n}) => {\n const [query, setQuery] = useState(\"\");\n const [selectedOptionIndex, setSelectedOptionIndex] = useState(-1);\n const [selectedOption, setSelectedOption] = useState<IOptionItem | null>(\n null\n );\n const [searchResults, setSearchResults] = useState<IOptionItem[]>([]);\n const inputRef = useRef<HTMLInputElement>(null);\n const ref = useRef(null);\n const federationContext = useFederationContext();\n const [isFocused, setIsFocused] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n // const [errors] = useState<any>({});\n\n useEffect(() => {\n if (!value) {\n setQuery(\"\");\n setSelectedOption(null);\n }\n }, [value]);\n\n //fetch options\n useEffect(() => {\n const fetchOptions = async () => {\n setIsLoading(true);\n const { data } = await federationContext.apiClient.get(fetchUrl + query);\n setIsLoading(false);\n const tmpData = data.content || data;\n\n setSearchResults(\n tmpData.map((item: any) => ({\n value: item[valueKey],\n label: labelKey instanceof Function ? labelKey(item) : item[labelKey],\n }))\n );\n };\n setSearchResults([]);\n\n if (query && valueKey && labelKey && fetchUrl && !selectedOption) {\n fetchOptions();\n }\n }, [\n query,\n valueKey,\n labelKey,\n fetchUrl,\n federationContext.apiClient,\n selectedOption,\n ]);\n\n useClickAway(ref, () => {\n if (isFocused) {\n setIsLoading(false);\n setSearchResults([]);\n setQuery(\"\");\n if (!selectedOption) {\n onChange(null);\n }\n onBlur();\n setIsFocused(false);\n }\n });\n\n const handleQueryChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (event.target.value == selectedOption?.label) {\n return;\n } else if (event.target.value) {\n setIsFocused(true);\n setSearchResults([]);\n setQuery(event.target.value);\n\n setSelectedOption(null);\n setSelectedOptionIndex(-1);\n } else {\n //clear handler\n onChange(null);\n setQuery(\"\");\n setSelectedOption(null);\n setTimeout(() => {\n setSelectedOptionIndex(-1);\n setSearchResults([]);\n }, 100);\n setIsFocused(false);\n }\n };\n const handleFocus = () => {\n setIsFocused(true);\n setSearchResults([]);\n onFocus();\n inputRef.current?.select(); // Add this line\n };\n\n const handleOptionClick = (option: IOptionItem) => {\n setSelectedOption(option);\n setSearchResults([]);\n setSelectedOptionIndex(-1);\n setQuery(\"\");\n onChange(returnObject ? option : option.value);\n setIsFocused(false);\n };\n const handleBlur = () => {\n setSearchResults([]);\n setTimeout(() => {\n if (!selectedOption) {\n setQuery(\"\");\n onChange(null);\n }\n }, 1);\n\n onBlur();\n setIsFocused(false);\n };\n\n return (\n <div\n className=\"w-full flex-col justify-start items-start gap-1.5 inline-flex relative\"\n ref={ref}\n >\n <InputField\n manualRef={inputRef}\n label={label}\n name={String(name) + \"_InputField\"}\n onInputChange={handleQueryChange}\n required={required}\n type=\"text\"\n value={selectedOption?.label || query}\n disabled={disabled}\n clearable\n className=\" min-w-[100px] px-0 \"\n rounded={true}\n placeholder={placeholder}\n debounceTimeout={1000}\n description={description}\n onFocus={handleFocus}\n onBlur={handleBlur}\n disableAutocomplete\n >\n {isFocused && (\n <div className=\" h-6 w-6 items-center flex justify-center hover:bg-gray-100 rounded-full text-lg cursor-pointer\">\n <MdExpandLess />\n {false && !isFocused && <MdExpandMore />}\n </div>\n )}\n </InputField>\n {searchResults.length == 0 && isFocused && !query && (\n <div\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]\"}`}\n >\n Začněte psát...\n </div>\n )}\n {searchResults.length == 0 && isFocused && query && (\n <div\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]\"}`}\n >\n {!isLoading && \"Nic nenalezeno\"}\n </div>\n )}\n {searchResults.length > 0 && isFocused && query && (\n <OptionList\n options={searchResults}\n selectedOptionIndex={selectedOptionIndex}\n handleOptionClick={handleOptionClick}\n label={label}\n />\n )}\n </div>\n );\n};\n\nconst OptionList: React.FC<OptionListProps> = ({\n options,\n selectedOptionIndex,\n handleOptionClick,\n label,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n // Ensure the selected option is scrolled into view\n if (selectedOptionIndex >= 0 && selectedOptionIndex < options.length) {\n const selectedElement = containerRef.current?.children[\n selectedOptionIndex\n ] as HTMLDivElement;\n selectedElement?.scrollIntoView({\n behavior: \"instant\",\n block: \"nearest\",\n });\n }\n }, [selectedOptionIndex, options.length]);\n const handleMouseDown = (event: any) => {\n event.preventDefault();\n };\n return (\n <div\n ref={containerRef}\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]\"} *:\n \n `}\n >\n {options?.map((option, index) => (\n <div\n key={option.value as string}\n className={`py-2 px-4 flex items-center justify-between gap-8 hover:bg-gray-200 cursor-pointer text-sm ${\n selectedOptionIndex === index ? \"bg-gray-200\" : \"\"\n }`}\n onClick={(e) => {\n e.preventDefault();\n handleOptionClick(option);\n }}\n onMouseDown={handleMouseDown}\n >\n <p className=\"font-normal\">{option.label}</p>\n </div>\n ))}\n </div>\n );\n};\n\nexport default AutocompleteSearchBarServer;\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,MAAM,8BAiBD,CAAC;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,EAAE;AACrC,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,SAAS,EAAE;AAC3D,QAAA,CAAC,gBAAgB,iBAAiB,IAAI;AAAA,IAC1C;AAAA,EAAA;AAEF,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAwB,CAAE,CAAA;AAC9D,QAAA,WAAW,OAAyB,IAAI;AACxC,QAAA,MAAM,OAAO,IAAI;AACvB,QAAM,oBAAoB;AAC1B,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAChD,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAGhD,YAAU,MAAM;AACd,QAAI,CAAC,OAAO;AACV,eAAS,EAAE;AACX,wBAAkB,IAAI;AAAA,IACxB;AAAA,EAAA,GACC,CAAC,KAAK,CAAC;AAGV,YAAU,MAAM;AACd,UAAM,eAAe,YAAY;AAC/B,mBAAa,IAAI;AACX,YAAA,EAAE,KAAS,IAAA,MAAM,kBAAkB,UAAU,IAAI,WAAW,KAAK;AACvE,mBAAa,KAAK;AACZ,YAAA,UAAU,KAAK,WAAW;AAEhC;AAAA,QACE,QAAQ,IAAI,CAAC,UAAe;AAAA,UAC1B,OAAO,KAAK,QAAQ;AAAA,UACpB,OAAO,oBAAoB,WAAW,SAAS,IAAI,IAAI,KAAK,QAAQ;AAAA,QAAA,EACpE;AAAA,MAAA;AAAA,IACJ;AAEF,qBAAiB,CAAE,CAAA;AAEnB,QAAI,SAAS,YAAY,YAAY,YAAY,CAAC,gBAAgB;AACnD;IACf;AAAA,EAAA,GACC;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,IAClB;AAAA,EAAA,CACD;AAED,eAAa,KAAK,MAAM;AACtB,QAAI,WAAW;AACb,mBAAa,KAAK;AAClB,uBAAiB,CAAE,CAAA;AACnB,eAAS,EAAE;AACX,UAAI,CAAC,gBAAgB;AACnB,iBAAS,IAAI;AAAA,MACf;AACO;AACP,mBAAa,KAAK;AAAA,IACpB;AAAA,EAAA,CACD;AAEK,QAAA,oBAAoB,CAAC,UAA+C;AACxE,QAAI,MAAM,OAAO,UAAS,iDAAgB,QAAO;AAC/C;AAAA,IAAA,WACS,MAAM,OAAO,OAAO;AAC7B,mBAAa,IAAI;AACjB,uBAAiB,CAAE,CAAA;AACV,eAAA,MAAM,OAAO,KAAK;AAE3B,wBAAkB,IAAI;AACtB,6BAAuB,EAAE;AAAA,IAAA,OACpB;AAEL,eAAS,IAAI;AACb,eAAS,EAAE;AACX,wBAAkB,IAAI;AACtB,iBAAW,MAAM;AACf,+BAAuB,EAAE;AACzB,yBAAiB,CAAE,CAAA;AAAA,SAClB,GAAG;AACN,mBAAa,KAAK;AAAA,IACpB;AAAA,EAAA;AAEF,QAAM,cAAc,MAAM;;AACxB,iBAAa,IAAI;AACjB,qBAAiB,CAAE,CAAA;AACX;AACR,mBAAS,YAAT,mBAAkB;AAAA,EAAO;AAGrB,QAAA,oBAAoB,CAAC,WAAwB;AACjD,sBAAkB,MAAM;AACxB,qBAAiB,CAAE,CAAA;AACnB,2BAAuB,EAAE;AACzB,aAAS,EAAE;AACF,aAAA,eAAe,SAAS,OAAO,KAAK;AAC7C,iBAAa,KAAK;AAAA,EAAA;AAEpB,QAAM,aAAa,MAAM;AACvB,qBAAiB,CAAE,CAAA;AACnB,eAAW,MAAM;AACf,UAAI,CAAC,gBAAgB;AACnB,iBAAS,EAAE;AACX,iBAAS,IAAI;AAAA,MACf;AAAA,OACC,CAAC;AAEG;AACP,iBAAa,KAAK;AAAA,EAAA;AAIlB,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV;AAAA,MAEA,UAAA;AAAA,QAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW;AAAA,YACX;AAAA,YACA,MAAM,OAAO,IAAI,IAAI;AAAA,YACrB,eAAe;AAAA,YACf;AAAA,YACA,MAAK;AAAA,YACL,QAAO,iDAAgB,UAAS;AAAA,YAChC;AAAA,YACA,WAAS;AAAA,YACT,WAAU;AAAA,YACV,SAAS;AAAA,YACT;AAAA,YACA,iBAAiB;AAAA,YACjB;AAAA,YACA,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,qBAAmB;AAAA,YAElB,UACC,aAAA,qBAAC,OAAI,EAAA,WAAU,uGACb,UAAA;AAAA,cAAA,oBAAC,cAAa,EAAA;AAAA,cACb;AAAA,YAAA,GACH;AAAA,UAAA;AAAA,QAEJ;AAAA,QACC,cAAc,UAAU,KAAK,aAAa,CAAC,SAC1C;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW,mHAAmH,QAAQ,eAAe,YAAY;AAAA,YAClK,UAAA;AAAA,UAAA;AAAA,QAED;AAAA,QAED,cAAc,UAAU,KAAK,aAAa,SACzC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW,oHAAoH,QAAQ,eAAe,YAAY;AAAA,YAEjK,WAAC,aAAa;AAAA,UAAA;AAAA,QACjB;AAAA,QAED,cAAc,SAAS,KAAK,aAAa,SACxC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;AAEA,MAAM,aAAwC,CAAC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACE,QAAA,eAAe,OAAuB,IAAI;AAEhD,YAAU,MAAM;;AAEd,QAAI,uBAAuB,KAAK,sBAAsB,QAAQ,QAAQ;AACpE,YAAM,mBAAkB,kBAAa,YAAb,mBAAsB,SAC5C;AAEF,yDAAiB,eAAe;AAAA,QAC9B,UAAU;AAAA,QACV,OAAO;AAAA,MAAA;AAAA,IAEX;AAAA,EACC,GAAA,CAAC,qBAAqB,QAAQ,MAAM,CAAC;AAClC,QAAA,kBAAkB,CAAC,UAAe;AACtC,UAAM,eAAe;AAAA,EAAA;AAGrB,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW,oJAAoJ,QAAQ,eAAe,YAAY;AAAA;AAAA;AAAA,MAIjM,UAAS,mCAAA,IAAI,CAAC,QAAQ,UACrB;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,WAAW,8FACT,wBAAwB,QAAQ,gBAAgB,EAClD;AAAA,UACA,SAAS,CAAC,MAAM;AACd,cAAE,eAAe;AACjB,8BAAkB,MAAM;AAAA,UAC1B;AAAA,UACA,aAAa;AAAA,UAEb,UAAC,oBAAA,KAAA,EAAE,WAAU,eAAe,iBAAO,OAAM;AAAA,QAAA;AAAA,QAVpC,OAAO;AAAA,MAAA;AAAA,IAYf;AAAA,EAAA;AAGP;"}
1
+ {"version":3,"file":"AutocompleteSearchBarServer.js","sources":["../../../lib/components/form/AutocompleteSearchBarServer.tsx"],"sourcesContent":["import { useState, useEffect, useRef } from \"react\";\nimport { useClickAway } from \"react-use\";\nimport { MdExpandLess, MdExpandMore } from \"react-icons/md\";\nimport { InputField, IOptionItem, useFederationContext } from \"../../main\";\n\ninterface OptionListProps {\n options: IOptionItem[];\n selectedOptionIndex: number;\n handleOptionClick: (option: IOptionItem) => void;\n label?: string;\n}\n\nconst AutocompleteSearchBarServer: React.FC<{\n label: string;\n name: string;\n required?: boolean;\n disabled?: boolean;\n description?: string;\n fetchUrl?: string;\n valueKey: string;\n labelKey: string | ((item: any) => string);\n onChange: (value: any) => void;\n onFocus: () => void;\n onBlur: () => void;\n placeholder?: string;\n value?: string;\n initOptions?: IOptionItem[];\n clearable?: boolean;\n returnObject: boolean;\n}> = ({\n label,\n name,\n disabled,\n description,\n fetchUrl,\n valueKey,\n labelKey,\n onChange,\n onFocus,\n onBlur,\n placeholder,\n returnObject,\n value,\n required,\n}) => {\n const [query, setQuery] = useState(\"\");\n const [selectedOptionIndex, setSelectedOptionIndex] = useState(-1);\n const [selectedOption, setSelectedOption] = useState<IOptionItem | null>(\n null\n );\n const [searchResults, setSearchResults] = useState<IOptionItem[]>([]);\n const inputRef = useRef<HTMLInputElement>(null);\n const ref = useRef(null);\n const federationContext = useFederationContext();\n const [isFocused, setIsFocused] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n // const [errors] = useState<any>({});\n\n useEffect(() => {\n if (!value) {\n setQuery(\"\");\n setSelectedOption(null);\n }\n }, [value]);\n\n //fetch options\n useEffect(() => {\n const fetchOptions = async () => {\n setIsLoading(true);\n const { data } = await federationContext.apiClient.get(fetchUrl + query);\n setIsLoading(false);\n const tmpData = data.content || data;\n\n setSearchResults(\n tmpData.map((item: any) => ({\n value: item[valueKey],\n label: labelKey instanceof Function ? labelKey(item) : item[labelKey],\n }))\n );\n };\n setSearchResults([]);\n\n if (query && valueKey && labelKey && fetchUrl && !selectedOption) {\n fetchOptions();\n }\n }, [\n query,\n valueKey,\n labelKey,\n fetchUrl,\n federationContext.apiClient,\n selectedOption,\n ]);\n\n useClickAway(ref, () => {\n if (isFocused) {\n setIsLoading(false);\n setSearchResults([]);\n setQuery(\"\");\n if (!selectedOption) {\n onChange(null);\n }\n onBlur();\n setIsFocused(false);\n }\n });\n\n const handleQueryChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (event.target.value == selectedOption?.label) {\n return;\n } else if (event.target.value) {\n setIsFocused(true);\n setSearchResults([]);\n setQuery(event.target.value);\n\n setSelectedOption(null);\n setSelectedOptionIndex(-1);\n } else {\n //clear handler\n onChange(null);\n setQuery(\"\");\n setSelectedOption(null);\n setTimeout(() => {\n setSelectedOptionIndex(-1);\n setSearchResults([]);\n }, 100);\n setIsFocused(false);\n }\n };\n const handleFocus = () => {\n setIsFocused(true);\n setSearchResults([]);\n onFocus();\n inputRef.current?.select(); // Add this line\n };\n\n const handleOptionClick = (option: IOptionItem) => {\n setSelectedOption(option);\n setSearchResults([]);\n setSelectedOptionIndex(-1);\n setQuery(\"\");\n onChange(returnObject ? option : option.value);\n setIsFocused(false);\n };\n const handleBlur = () => {\n setSearchResults([]);\n setTimeout(() => {\n if (!selectedOption) {\n setQuery(\"\");\n onChange(null);\n }\n }, 1);\n\n onBlur();\n setIsFocused(false);\n };\n\n return (\n <div\n className=\"w-full flex-col justify-start items-start gap-1.5 inline-flex relative\"\n ref={ref}\n >\n <InputField\n manualRef={inputRef}\n label={label}\n name={String(name) + \"_InputField\"}\n onInputChange={handleQueryChange}\n required={required}\n type=\"text\"\n value={selectedOption?.label || query}\n disabled={disabled}\n clearable\n className=\" min-w-[100px] px-0 \"\n rounded={true}\n placeholder={placeholder}\n debounceTimeout={1000}\n description={description}\n onFocus={handleFocus}\n onBlur={handleBlur}\n disableAutocomplete\n >\n {isFocused && (\n <div className=\" h-6 w-6 items-center flex justify-center hover:bg-gray-100 rounded-full text-lg cursor-pointer\">\n <MdExpandLess />\n {false && !isFocused && <MdExpandMore />}\n </div>\n )}\n </InputField>\n {searchResults.length == 0 && isFocused && !query && (\n <div\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]\"}`}\n >\n Začněte psát...\n </div>\n )}\n {searchResults.length == 0 && isFocused && query && (\n <div\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]\"}`}\n >\n {!isLoading && \"Nic nenalezeno\"}\n </div>\n )}\n {searchResults.length > 0 && isFocused && query && (\n <OptionList\n options={searchResults}\n selectedOptionIndex={selectedOptionIndex}\n handleOptionClick={handleOptionClick}\n label={label}\n />\n )}\n </div>\n );\n};\n\nconst OptionList: React.FC<OptionListProps> = ({\n options,\n selectedOptionIndex,\n handleOptionClick,\n label,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n // Ensure the selected option is scrolled into view\n if (selectedOptionIndex >= 0 && selectedOptionIndex < options.length) {\n const selectedElement = containerRef.current?.children[\n selectedOptionIndex\n ] as HTMLDivElement;\n selectedElement?.scrollIntoView({\n behavior: \"instant\",\n block: \"nearest\",\n });\n }\n }, [selectedOptionIndex, options.length]);\n const handleMouseDown = (event: any) => {\n event.preventDefault();\n };\n return (\n <div\n ref={containerRef}\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]\"} *:\n \n `}\n >\n {options?.map((option, index) => (\n <div\n key={option.value as string}\n className={`py-2 px-4 flex items-center justify-between gap-8 hover:bg-gray-200 cursor-pointer text-sm ${\n selectedOptionIndex === index ? \"bg-gray-200\" : \"\"\n }`}\n onClick={(e) => {\n e.preventDefault();\n handleOptionClick(option);\n }}\n onMouseDown={handleMouseDown}\n >\n <p className=\"font-normal\">{option.label}</p>\n </div>\n ))}\n </div>\n );\n};\n\nexport default AutocompleteSearchBarServer;\n"],"names":[],"mappings":"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"}
@@ -25,6 +25,7 @@ import "../ui/textarea.js";
25
25
  import "../ui/checkbox.js";
26
26
  import "../../Calendar-DWT4e7Th.js";
27
27
  import "../ui/DateTimePicker.js";
28
+ import "../ui/DateTimePicker2.js";
28
29
  import "../ui/DatePicker.js";
29
30
  const MAX_FILE_SIZE = 1024 * 1024;
30
31
  const FileInput = ({
@@ -1 +1 @@
1
- {"version":3,"file":"FileInput.js","sources":["../../../lib/components/form/FileInput.tsx"],"sourcesContent":["import React, { useState, useEffect, useCallback } from \"react\";\nimport { useDropzone } from \"react-dropzone\";\nimport { handleErrors, useFederationContext } from \"../../main\";\nimport { MdDeleteOutline, MdInsertDriveFile } from \"react-icons/md\";\nimport { AxiosError } from \"axios\";\nimport { cn } from \"../../utils/utils\";\n\nexport interface FileData {\n id: number;\n mimeType: string;\n size: number;\n filename: string;\n createdByEmpId: string;\n created: string;\n}\n\nexport interface FileInputProps {\n name: string;\n label?: string;\n initialFile?: FileData;\n onFileChanged: (e: any) => void;\n required?: boolean;\n description?: string;\n disabled?: boolean;\n attachmentName?: string;\n attachmentType?: string;\n hasError?: boolean;\n}\n\nconst MAX_FILE_SIZE = 1024 * 1024; // 1MB\n\nconst FileInput: React.FC<FileInputProps> = ({\n initialFile,\n onFileChanged,\n label,\n name,\n required,\n description,\n disabled,\n attachmentName,\n attachmentType,\n hasError,\n}) => {\n const [fileData, setFileData] = useState<FileData | null>(\n initialFile || null\n );\n const [isFocused, setIsFocused] = useState(false);\n\n const federationContext = useFederationContext();\n useEffect(() => {\n if (initialFile) {\n setFileData(initialFile);\n }\n }, [initialFile]);\n\n const onDrop = useCallback(\n async (acceptedFiles: File[]) => {\n if (acceptedFiles.length > 0) {\n const file = acceptedFiles[0];\n\n if (file.size > MAX_FILE_SIZE) {\n // Handle the case when the file size is exceeded\n federationContext.emitter.emit(\"message\", {\n title: \"Velikost souboru byla překročena\",\n message: `Maximální povolená velikost je ${MAX_FILE_SIZE / (1024 * 1024)} MB.`,\n classes: \"bg-danger \",\n timeout: 0,\n type: \"error\",\n });\n return;\n }\n\n const formData = new FormData();\n\n // Add the JSON data object\n const dataObject = {\n ...(attachmentName && { attachmentName }),\n ...(attachmentType && { attachmentType }),\n };\n\n formData.append(\n \"data\",\n new Blob([JSON.stringify(dataObject)], { type: \"application/json\" })\n );\n formData.append(\"file\", file);\n\n try {\n const response = await federationContext.apiClient.post<FileData>(\n \"/files/upload\",\n formData,\n {\n headers: {\n \"Content-Type\": \"multipart/form-data\",\n },\n }\n );\n setFileData(response.data);\n onFileChanged({\n target: { name, value: response.data.id.toString() },\n });\n setIsFocused(false);\n } catch (error) {\n handleErrors(error as AxiosError, federationContext.emitter);\n console.error(\"There was an error!\", error);\n }\n }\n },\n [\n federationContext.apiClient,\n federationContext.emitter,\n onFileChanged,\n name,\n attachmentName,\n attachmentType,\n ]\n );\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop,\n disabled,\n multiple: false,\n });\n\n const handleRemove = () => {\n setFileData(null);\n onFileChanged({ target: { name, value: null } });\n };\n\n return (\n <div className=\"w-full min-h-30 flex-col justify-start items-start gap-1.5 inline-flex sharedLibrary\">\n <div className=\"self-stretch flex-col justify-start items-start gap-1.5 flex\">\n {label && (\n <label\n className=\"text-slate-700 text-sm leading-tight font-medium\"\n htmlFor={name}\n >\n {label} {required ? \"*\" : \"\"}\n </label>\n )}\n <div\n className={cn(\n `self-stretch px-2 py-2 rounded-lg justify-start items-center gap-2 inline-flex outline-none border`,\n isFocused &&\n !hasError &&\n \"outline-4 outline-indigo-200 outline-offset-0 border-indigo-300\",\n\n hasError &&\n \"outline-4 outline-red-200 outline-offset-0 border-none\",\n !isFocused && hasError && \"border-red-200 \",\n disabled ? \"bg-gray-100\" : \"bg-transparent\"\n )}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n >\n <div className=\"flex relative grow shrink basis-0 min-h-5 lg:min-h-[32px] justify-start items-stretch gap-2 max-w-full \">\n {!fileData ? (\n <div\n {...getRootProps()}\n className={`w-full p-4 border-dashed border-2 rounded-lg text-center ${\n isDragActive\n ? \"border-indigo-300 bg-indigo-50\"\n : \"border-gray-300\"\n }`}\n >\n <input {...getInputProps()} id={name} />\n <p className=\"text-gray-500\">\n {isDragActive\n ? \"Sem přetáhněte soubor\"\n : \"Klikněte pro nahrání, nebo nahrajte přetažením souboru\"}\n </p>\n </div>\n ) : (\n <div className=\"w-full flex items-center justify-between\">\n <div className=\" flex\">\n <MdInsertDriveFile style={{ fontSize: \"2rem\" }} />\n <a\n href={`/api/files/download/${fileData.id}`}\n className=\"pl-2 text-left underline text-primary\"\n target=\"_blank\"\n >\n {fileData.filename}\n </a>\n </div>\n {!disabled && (\n <div\n onClick={handleRemove}\n className=\"text-gray-600 cursor-pointer hover:text-primary hover:bg-gray-200 rounded-full ml-4\"\n >\n <MdDeleteOutline\n style={{ fontSize: \"1.5rem\", margin: \"15px\" }}\n />\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n {description && (\n <div\n className=\"HintText self-stretch text-slate-600 text-sm font-normal leading-tight\"\n id={name + \":description\"}\n >\n {description}\n </div>\n )}\n </div>\n );\n};\n\nexport default FileInput;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FileInput.js","sources":["../../../lib/components/form/FileInput.tsx"],"sourcesContent":["import React, { useState, useEffect, useCallback } from \"react\";\nimport { useDropzone } from \"react-dropzone\";\nimport { handleErrors, useFederationContext } from \"../../main\";\nimport { MdDeleteOutline, MdInsertDriveFile } from \"react-icons/md\";\nimport { AxiosError } from \"axios\";\nimport { cn } from \"../../utils/utils\";\n\nexport interface FileData {\n id: number;\n mimeType: string;\n size: number;\n filename: string;\n createdByEmpId: string;\n created: string;\n}\n\nexport interface FileInputProps {\n name: string;\n label?: string;\n initialFile?: FileData;\n onFileChanged: (e: any) => void;\n required?: boolean;\n description?: string;\n disabled?: boolean;\n attachmentName?: string;\n attachmentType?: string;\n hasError?: boolean;\n}\n\nconst MAX_FILE_SIZE = 1024 * 1024; // 1MB\n\nconst FileInput: React.FC<FileInputProps> = ({\n initialFile,\n onFileChanged,\n label,\n name,\n required,\n description,\n disabled,\n attachmentName,\n attachmentType,\n hasError,\n}) => {\n const [fileData, setFileData] = useState<FileData | null>(\n initialFile || null\n );\n const [isFocused, setIsFocused] = useState(false);\n\n const federationContext = useFederationContext();\n useEffect(() => {\n if (initialFile) {\n setFileData(initialFile);\n }\n }, [initialFile]);\n\n const onDrop = useCallback(\n async (acceptedFiles: File[]) => {\n if (acceptedFiles.length > 0) {\n const file = acceptedFiles[0];\n\n if (file.size > MAX_FILE_SIZE) {\n // Handle the case when the file size is exceeded\n federationContext.emitter.emit(\"message\", {\n title: \"Velikost souboru byla překročena\",\n message: `Maximální povolená velikost je ${MAX_FILE_SIZE / (1024 * 1024)} MB.`,\n classes: \"bg-danger \",\n timeout: 0,\n type: \"error\",\n });\n return;\n }\n\n const formData = new FormData();\n\n // Add the JSON data object\n const dataObject = {\n ...(attachmentName && { attachmentName }),\n ...(attachmentType && { attachmentType }),\n };\n\n formData.append(\n \"data\",\n new Blob([JSON.stringify(dataObject)], { type: \"application/json\" })\n );\n formData.append(\"file\", file);\n\n try {\n const response = await federationContext.apiClient.post<FileData>(\n \"/files/upload\",\n formData,\n {\n headers: {\n \"Content-Type\": \"multipart/form-data\",\n },\n }\n );\n setFileData(response.data);\n onFileChanged({\n target: { name, value: response.data.id.toString() },\n });\n setIsFocused(false);\n } catch (error) {\n handleErrors(error as AxiosError, federationContext.emitter);\n console.error(\"There was an error!\", error);\n }\n }\n },\n [\n federationContext.apiClient,\n federationContext.emitter,\n onFileChanged,\n name,\n attachmentName,\n attachmentType,\n ]\n );\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop,\n disabled,\n multiple: false,\n });\n\n const handleRemove = () => {\n setFileData(null);\n onFileChanged({ target: { name, value: null } });\n };\n\n return (\n <div className=\"w-full min-h-30 flex-col justify-start items-start gap-1.5 inline-flex sharedLibrary\">\n <div className=\"self-stretch flex-col justify-start items-start gap-1.5 flex\">\n {label && (\n <label\n className=\"text-slate-700 text-sm leading-tight font-medium\"\n htmlFor={name}\n >\n {label} {required ? \"*\" : \"\"}\n </label>\n )}\n <div\n className={cn(\n `self-stretch px-2 py-2 rounded-lg justify-start items-center gap-2 inline-flex outline-none border`,\n isFocused &&\n !hasError &&\n \"outline-4 outline-indigo-200 outline-offset-0 border-indigo-300\",\n\n hasError &&\n \"outline-4 outline-red-200 outline-offset-0 border-none\",\n !isFocused && hasError && \"border-red-200 \",\n disabled ? \"bg-gray-100\" : \"bg-transparent\"\n )}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n >\n <div className=\"flex relative grow shrink basis-0 min-h-5 lg:min-h-[32px] justify-start items-stretch gap-2 max-w-full \">\n {!fileData ? (\n <div\n {...getRootProps()}\n className={`w-full p-4 border-dashed border-2 rounded-lg text-center ${\n isDragActive\n ? \"border-indigo-300 bg-indigo-50\"\n : \"border-gray-300\"\n }`}\n >\n <input {...getInputProps()} id={name} />\n <p className=\"text-gray-500\">\n {isDragActive\n ? \"Sem přetáhněte soubor\"\n : \"Klikněte pro nahrání, nebo nahrajte přetažením souboru\"}\n </p>\n </div>\n ) : (\n <div className=\"w-full flex items-center justify-between\">\n <div className=\" flex\">\n <MdInsertDriveFile style={{ fontSize: \"2rem\" }} />\n <a\n href={`/api/files/download/${fileData.id}`}\n className=\"pl-2 text-left underline text-primary\"\n target=\"_blank\"\n >\n {fileData.filename}\n </a>\n </div>\n {!disabled && (\n <div\n onClick={handleRemove}\n className=\"text-gray-600 cursor-pointer hover:text-primary hover:bg-gray-200 rounded-full ml-4\"\n >\n <MdDeleteOutline\n style={{ fontSize: \"1.5rem\", margin: \"15px\" }}\n />\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n {description && (\n <div\n className=\"HintText self-stretch text-slate-600 text-sm font-normal leading-tight\"\n id={name + \":description\"}\n >\n {description}\n </div>\n )}\n </div>\n );\n};\n\nexport default FileInput;\n"],"names":[],"mappings":"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"}
@@ -25,6 +25,7 @@ import "../ui/textarea.js";
25
25
  import "../ui/checkbox.js";
26
26
  import "../../Calendar-DWT4e7Th.js";
27
27
  import "../ui/DateTimePicker.js";
28
+ import "../ui/DateTimePicker2.js";
28
29
  import "../ui/DatePicker.js";
29
30
  const MAX_FILE_SIZE = 1024 * 1024;
30
31
  const FileInputForm = ({
@@ -1 +1 @@
1
- {"version":3,"file":"FileInputForm.js","sources":["../../../lib/components/form/FileInputForm.tsx"],"sourcesContent":["import React, { useState, useEffect, useCallback } from \"react\";\nimport { useDropzone } from \"react-dropzone\";\nimport { MdDeleteOutline, MdInsertDriveFile } from \"react-icons/md\";\nimport { AxiosError } from \"axios\";\nimport { LoaderCircleIcon } from \"lucide-react\";\nimport { cn } from \"../../utils/utils\";\nimport { IAttachment } from \"../../types\";\nimport { handleErrors, useFederationContext, useFormField } from \"../../main\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n} from \"../ui/Dialog\";\nimport { Input } from \"../ui/input\";\nimport { Button } from \"../ui/button\";\n\nexport interface FileInputFormProps {\n name: string;\n value?: IAttachment | null;\n onFileChanged: (file: IAttachment | null) => void;\n description?: string;\n disabled?: boolean;\n attachmentName?: string;\n attachmentType?: string;\n askForAttachmentName?: boolean;\n}\n\nconst MAX_FILE_SIZE = 1024 * 1024; // 1MB\n\nconst FileInputForm: React.FC<FileInputFormProps> = ({\n value,\n onFileChanged,\n name,\n description,\n disabled,\n attachmentName,\n attachmentType,\n askForAttachmentName = false,\n}) => {\n const [fileData, setFileData] = useState<IAttachment | null>(value || null);\n const [isFocused, setIsFocused] = useState(false);\n const [pendingFile, setPendingFile] = useState<File | null>(null);\n const [isDialogOpen, setIsDialogOpen] = useState(false);\n const [fileName, setFileName] = useState<string>(\"\");\n const [isUploading, setIsUploading] = useState(false);\n\n const federationContext = useFederationContext();\n const { error } = useFormField();\n const hasError = !!error;\n useEffect(() => {\n setFileData(value || null);\n }, [value]);\n const uploadFile = useCallback(\n async (file: File, customName?: string) => {\n if (file.size > MAX_FILE_SIZE) {\n // Handle the case when the file size is exceeded\n federationContext.emitter.emit(\"message\", {\n title: \"Velikost souboru byla překročena\",\n message: `Maximální povolená velikost je ${MAX_FILE_SIZE / (1024 * 1024)} MB.`,\n classes: \"bg-danger \",\n timeout: 0,\n type: \"error\",\n });\n return;\n }\n\n setIsUploading(true);\n const formData = new FormData();\n\n // Add the JSON data object\n const dataObject = {\n ...(customName\n ? { attachmentName: customName }\n : attachmentName && { attachmentName }),\n ...(attachmentType && { attachmentType }),\n };\n\n formData.append(\n \"data\",\n new Blob([JSON.stringify(dataObject)], { type: \"application/json\" })\n );\n formData.append(\"file\", file);\n\n try {\n const response = await federationContext.apiClient.post<IAttachment>(\n \"/files/upload\",\n formData,\n {\n headers: {\n \"Content-Type\": \"multipart/form-data\",\n },\n }\n );\n const uploadedFile = response.data;\n setFileData(uploadedFile);\n onFileChanged(uploadedFile);\n setIsFocused(false);\n } catch (error) {\n handleErrors(error as AxiosError, federationContext.emitter);\n console.error(\"There was an error!\", error);\n } finally {\n setIsUploading(false);\n }\n },\n [\n federationContext.apiClient,\n federationContext.emitter,\n onFileChanged,\n attachmentName,\n attachmentType,\n ]\n );\n\n const onDrop = useCallback(\n async (acceptedFiles: File[]) => {\n if (acceptedFiles.length > 0) {\n const file = acceptedFiles[0];\n\n if (file.size > MAX_FILE_SIZE) {\n // Handle the case when the file size is exceeded\n federationContext.emitter.emit(\"message\", {\n title: \"Velikost souboru byla překročena\",\n message: `Maximální povolená velikost je ${MAX_FILE_SIZE / (1024 * 1024)} MB.`,\n classes: \"bg-danger \",\n timeout: 0,\n type: \"error\",\n });\n return;\n }\n\n if (askForAttachmentName) {\n setPendingFile(file);\n setFileName(file.name);\n setIsDialogOpen(true);\n } else {\n await uploadFile(file);\n }\n }\n },\n [askForAttachmentName, uploadFile, federationContext]\n );\n\n const handleDialogSubmit = async () => {\n if (pendingFile) {\n setIsDialogOpen(false);\n await uploadFile(pendingFile, fileName);\n setPendingFile(null);\n setFileName(\"\");\n }\n };\n\n const handleDialogCancel = () => {\n setIsDialogOpen(false);\n setPendingFile(null);\n setFileName(\"\");\n };\n\n const formatFileSize = (bytes: number): string => {\n if (bytes === 0) return \"0 Bytes\";\n const k = 1024;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + \" \" + sizes[i];\n };\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop,\n disabled: disabled || isUploading,\n multiple: false,\n });\n\n const handleRemove = () => {\n setFileData(null);\n onFileChanged(null);\n };\n\n return (\n <>\n <div className=\"w-full min-h-30 flex-col justify-start items-start gap-1.5 inline-flex sharedLibrary\">\n <div className=\"self-stretch flex-col justify-start items-start gap-1.5 flex\">\n <div\n className={cn(\n `self-stretch px-2 py-2 rounded-lg justify-start items-center gap-2 inline-flex outline-none border relative`,\n isFocused &&\n !hasError &&\n \"outline-4 outline-indigo-200 outline-offset-0 border-indigo-300\",\n\n hasError &&\n \"outline-4 outline-red-200 outline-offset-0 border-none\",\n !isFocused && hasError && \"border-red-200 \",\n disabled ? \"bg-gray-100\" : \"bg-transparent\"\n )}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n >\n {isUploading && (\n <div className=\"absolute inset-0 bg-white/80 backdrop-blur-sm rounded-lg z-10 flex items-center justify-center\">\n <div className=\"flex flex-col items-center gap-2\">\n <LoaderCircleIcon className=\"h-8 w-8 animate-spin text-primary\" />\n <p className=\"text-sm text-gray-600\">Nahrávání...</p>\n </div>\n </div>\n )}\n <div className=\"flex relative grow shrink basis-0 min-h-5 lg:min-h-[32px] justify-start items-stretch gap-2 max-w-full \">\n {!fileData ? (\n <div\n {...getRootProps()}\n className={cn(\n `w-full p-4 border-dashed border-2 rounded-lg text-center`,\n isUploading\n ? \"cursor-not-allowed opacity-50\"\n : \"cursor-pointer hover:bg-gray-100\",\n isDragActive ? \"border-indigo-300 bg-indigo-50\" : \"border-gray-300\"\n )}\n >\n <input {...getInputProps()} id={name} />\n <p className=\"text-gray-500\">\n {isDragActive\n ? \"Sem přetáhněte soubor\"\n : \"Klikněte pro nahrání, nebo nahrajte přetažením souboru\"}\n </p>\n </div>\n ) : (\n <div className=\"w-full flex items-center justify-between py-2 border-b\">\n <div className=\"flex flex-col flex-1\">\n <div className=\"flex items-center gap-2\">\n <MdInsertDriveFile style={{ fontSize: \"2rem\" }} />\n <div className=\"flex flex-col flex-1\">\n <a\n href={`/api/files/download/${fileData.id}`}\n className=\"text-left underline text-primary text-sm cursor-pointer\"\n target=\"_blank\"\n >\n {fileData.filename}\n </a>\n {fileData.attachmentName && (\n <div className=\"text-sm text-gray-600\">\n {fileData.attachmentName}\n </div>\n )}\n </div>\n </div>\n </div>\n {!disabled && !isUploading && (\n <div\n onClick={handleRemove}\n className=\"text-gray-600 cursor-pointer hover:text-primary hover:bg-gray-200 rounded-full ml-4\"\n >\n <MdDeleteOutline\n style={{ fontSize: \"1.5rem\", margin: \"15px\" }}\n />\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n {description && (\n <div\n className=\"HintText self-stretch text-slate-600 text-sm font-normal leading-tight\"\n id={name + \":description\"}\n >\n {description}\n </div>\n )}\n </div>\n\n <Dialog\n open={isDialogOpen}\n onOpenChange={(open) => {\n setIsDialogOpen(open);\n if (!open) {\n handleDialogCancel();\n }\n }}\n >\n <DialogContent className=\"max-w-lg\">\n <DialogHeader>\n <DialogTitle>Zadejte popis přílohy</DialogTitle>\n </DialogHeader>\n {pendingFile && (\n <div className=\"space-y-4 py-4\">\n <div className=\"flex flex-col gap-2 p-4 border rounded-lg\">\n <div className=\"flex items-center gap-2\">\n <MdInsertDriveFile style={{ fontSize: \"1.5rem\" }} />\n <div className=\"flex-1\">\n <div className=\"font-medium text-sm\">{pendingFile.name}</div>\n <div className=\"text-xs text-gray-500\">\n {formatFileSize(pendingFile.size)}\n </div>\n </div>\n </div>\n <div className=\"mt-2\">\n <label className=\"text-sm font-medium mb-1 block\">\n Popis přílohy:\n </label>\n <Input\n value={fileName}\n onChange={(e) => setFileName(e.target.value)}\n placeholder=\"Zadejte popis přílohy\"\n />\n </div>\n </div>\n </div>\n )}\n <DialogFooter>\n <Button variant=\"outline\" onClick={handleDialogCancel} disabled={isUploading}>\n Zrušit\n </Button>\n <Button onClick={handleDialogSubmit} disabled={isUploading}>\n {isUploading ? (\n <>\n <LoaderCircleIcon className=\"h-4 w-4 animate-spin mr-2\" />\n Nahrávání...\n </>\n ) : (\n \"Nahrát\"\n )}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </>\n );\n};\n\nexport default FileInputForm;\n"],"names":["error","LoaderCircleIcon"],"mappings":"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"}
1
+ {"version":3,"file":"FileInputForm.js","sources":["../../../lib/components/form/FileInputForm.tsx"],"sourcesContent":["import React, { useState, useEffect, useCallback } from \"react\";\nimport { useDropzone } from \"react-dropzone\";\nimport { MdDeleteOutline, MdInsertDriveFile } from \"react-icons/md\";\nimport { AxiosError } from \"axios\";\nimport { LoaderCircleIcon } from \"lucide-react\";\nimport { cn } from \"../../utils/utils\";\nimport { IAttachment } from \"../../types\";\nimport { handleErrors, useFederationContext, useFormField } from \"../../main\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n} from \"../ui/Dialog\";\nimport { Input } from \"../ui/input\";\nimport { Button } from \"../ui/button\";\n\nexport interface FileInputFormProps {\n name: string;\n value?: IAttachment | null;\n onFileChanged: (file: IAttachment | null) => void;\n description?: string;\n disabled?: boolean;\n attachmentName?: string;\n attachmentType?: string;\n askForAttachmentName?: boolean;\n}\n\nconst MAX_FILE_SIZE = 1024 * 1024; // 1MB\n\nconst FileInputForm: React.FC<FileInputFormProps> = ({\n value,\n onFileChanged,\n name,\n description,\n disabled,\n attachmentName,\n attachmentType,\n askForAttachmentName = false,\n}) => {\n const [fileData, setFileData] = useState<IAttachment | null>(value || null);\n const [isFocused, setIsFocused] = useState(false);\n const [pendingFile, setPendingFile] = useState<File | null>(null);\n const [isDialogOpen, setIsDialogOpen] = useState(false);\n const [fileName, setFileName] = useState<string>(\"\");\n const [isUploading, setIsUploading] = useState(false);\n\n const federationContext = useFederationContext();\n const { error } = useFormField();\n const hasError = !!error;\n useEffect(() => {\n setFileData(value || null);\n }, [value]);\n const uploadFile = useCallback(\n async (file: File, customName?: string) => {\n if (file.size > MAX_FILE_SIZE) {\n // Handle the case when the file size is exceeded\n federationContext.emitter.emit(\"message\", {\n title: \"Velikost souboru byla překročena\",\n message: `Maximální povolená velikost je ${MAX_FILE_SIZE / (1024 * 1024)} MB.`,\n classes: \"bg-danger \",\n timeout: 0,\n type: \"error\",\n });\n return;\n }\n\n setIsUploading(true);\n const formData = new FormData();\n\n // Add the JSON data object\n const dataObject = {\n ...(customName\n ? { attachmentName: customName }\n : attachmentName && { attachmentName }),\n ...(attachmentType && { attachmentType }),\n };\n\n formData.append(\n \"data\",\n new Blob([JSON.stringify(dataObject)], { type: \"application/json\" })\n );\n formData.append(\"file\", file);\n\n try {\n const response = await federationContext.apiClient.post<IAttachment>(\n \"/files/upload\",\n formData,\n {\n headers: {\n \"Content-Type\": \"multipart/form-data\",\n },\n }\n );\n const uploadedFile = response.data;\n setFileData(uploadedFile);\n onFileChanged(uploadedFile);\n setIsFocused(false);\n } catch (error) {\n handleErrors(error as AxiosError, federationContext.emitter);\n console.error(\"There was an error!\", error);\n } finally {\n setIsUploading(false);\n }\n },\n [\n federationContext.apiClient,\n federationContext.emitter,\n onFileChanged,\n attachmentName,\n attachmentType,\n ]\n );\n\n const onDrop = useCallback(\n async (acceptedFiles: File[]) => {\n if (acceptedFiles.length > 0) {\n const file = acceptedFiles[0];\n\n if (file.size > MAX_FILE_SIZE) {\n // Handle the case when the file size is exceeded\n federationContext.emitter.emit(\"message\", {\n title: \"Velikost souboru byla překročena\",\n message: `Maximální povolená velikost je ${MAX_FILE_SIZE / (1024 * 1024)} MB.`,\n classes: \"bg-danger \",\n timeout: 0,\n type: \"error\",\n });\n return;\n }\n\n if (askForAttachmentName) {\n setPendingFile(file);\n setFileName(file.name);\n setIsDialogOpen(true);\n } else {\n await uploadFile(file);\n }\n }\n },\n [askForAttachmentName, uploadFile, federationContext]\n );\n\n const handleDialogSubmit = async () => {\n if (pendingFile) {\n setIsDialogOpen(false);\n await uploadFile(pendingFile, fileName);\n setPendingFile(null);\n setFileName(\"\");\n }\n };\n\n const handleDialogCancel = () => {\n setIsDialogOpen(false);\n setPendingFile(null);\n setFileName(\"\");\n };\n\n const formatFileSize = (bytes: number): string => {\n if (bytes === 0) return \"0 Bytes\";\n const k = 1024;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + \" \" + sizes[i];\n };\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop,\n disabled: disabled || isUploading,\n multiple: false,\n });\n\n const handleRemove = () => {\n setFileData(null);\n onFileChanged(null);\n };\n\n return (\n <>\n <div className=\"w-full min-h-30 flex-col justify-start items-start gap-1.5 inline-flex sharedLibrary\">\n <div className=\"self-stretch flex-col justify-start items-start gap-1.5 flex\">\n <div\n className={cn(\n `self-stretch px-2 py-2 rounded-lg justify-start items-center gap-2 inline-flex outline-none border relative`,\n isFocused &&\n !hasError &&\n \"outline-4 outline-indigo-200 outline-offset-0 border-indigo-300\",\n\n hasError &&\n \"outline-4 outline-red-200 outline-offset-0 border-none\",\n !isFocused && hasError && \"border-red-200 \",\n disabled ? \"bg-gray-100\" : \"bg-transparent\"\n )}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n >\n {isUploading && (\n <div className=\"absolute inset-0 bg-white/80 backdrop-blur-sm rounded-lg z-10 flex items-center justify-center\">\n <div className=\"flex flex-col items-center gap-2\">\n <LoaderCircleIcon className=\"h-8 w-8 animate-spin text-primary\" />\n <p className=\"text-sm text-gray-600\">Nahrávání...</p>\n </div>\n </div>\n )}\n <div className=\"flex relative grow shrink basis-0 min-h-5 lg:min-h-[32px] justify-start items-stretch gap-2 max-w-full \">\n {!fileData ? (\n <div\n {...getRootProps()}\n className={cn(\n `w-full p-4 border-dashed border-2 rounded-lg text-center`,\n isUploading\n ? \"cursor-not-allowed opacity-50\"\n : \"cursor-pointer hover:bg-gray-100\",\n isDragActive ? \"border-indigo-300 bg-indigo-50\" : \"border-gray-300\"\n )}\n >\n <input {...getInputProps()} id={name} />\n <p className=\"text-gray-500\">\n {isDragActive\n ? \"Sem přetáhněte soubor\"\n : \"Klikněte pro nahrání, nebo nahrajte přetažením souboru\"}\n </p>\n </div>\n ) : (\n <div className=\"w-full flex items-center justify-between py-2 border-b\">\n <div className=\"flex flex-col flex-1\">\n <div className=\"flex items-center gap-2\">\n <MdInsertDriveFile style={{ fontSize: \"2rem\" }} />\n <div className=\"flex flex-col flex-1\">\n <a\n href={`/api/files/download/${fileData.id}`}\n className=\"text-left underline text-primary text-sm cursor-pointer\"\n target=\"_blank\"\n >\n {fileData.filename}\n </a>\n {fileData.attachmentName && (\n <div className=\"text-sm text-gray-600\">\n {fileData.attachmentName}\n </div>\n )}\n </div>\n </div>\n </div>\n {!disabled && !isUploading && (\n <div\n onClick={handleRemove}\n className=\"text-gray-600 cursor-pointer hover:text-primary hover:bg-gray-200 rounded-full ml-4\"\n >\n <MdDeleteOutline\n style={{ fontSize: \"1.5rem\", margin: \"15px\" }}\n />\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n {description && (\n <div\n className=\"HintText self-stretch text-slate-600 text-sm font-normal leading-tight\"\n id={name + \":description\"}\n >\n {description}\n </div>\n )}\n </div>\n\n <Dialog\n open={isDialogOpen}\n onOpenChange={(open) => {\n setIsDialogOpen(open);\n if (!open) {\n handleDialogCancel();\n }\n }}\n >\n <DialogContent className=\"max-w-lg\">\n <DialogHeader>\n <DialogTitle>Zadejte popis přílohy</DialogTitle>\n </DialogHeader>\n {pendingFile && (\n <div className=\"space-y-4 py-4\">\n <div className=\"flex flex-col gap-2 p-4 border rounded-lg\">\n <div className=\"flex items-center gap-2\">\n <MdInsertDriveFile style={{ fontSize: \"1.5rem\" }} />\n <div className=\"flex-1\">\n <div className=\"font-medium text-sm\">{pendingFile.name}</div>\n <div className=\"text-xs text-gray-500\">\n {formatFileSize(pendingFile.size)}\n </div>\n </div>\n </div>\n <div className=\"mt-2\">\n <label className=\"text-sm font-medium mb-1 block\">\n Popis přílohy:\n </label>\n <Input\n value={fileName}\n onChange={(e) => setFileName(e.target.value)}\n placeholder=\"Zadejte popis přílohy\"\n />\n </div>\n </div>\n </div>\n )}\n <DialogFooter>\n <Button variant=\"outline\" onClick={handleDialogCancel} disabled={isUploading}>\n Zrušit\n </Button>\n <Button onClick={handleDialogSubmit} disabled={isUploading}>\n {isUploading ? (\n <>\n <LoaderCircleIcon className=\"h-4 w-4 animate-spin mr-2\" />\n Nahrávání...\n </>\n ) : (\n \"Nahrát\"\n )}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </>\n );\n};\n\nexport default FileInputForm;\n"],"names":["error","LoaderCircleIcon"],"mappings":"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"}
@@ -25,6 +25,7 @@ import "../ui/textarea.js";
25
25
  import "../ui/checkbox.js";
26
26
  import "../../Calendar-DWT4e7Th.js";
27
27
  import "../ui/DateTimePicker.js";
28
+ import "../ui/DateTimePicker2.js";
28
29
  import "../ui/DatePicker.js";
29
30
  const MAX_FILE_SIZE = 1024 * 1024;
30
31
  const FileInputFormMultiple = ({
@@ -1 +1 @@
1
- {"version":3,"file":"FileInputFormMultiple.js","sources":["../../../lib/components/form/FileInputFormMultiple.tsx"],"sourcesContent":["import { useState, useCallback, useEffect } from \"react\";\nimport { useDropzone } from \"react-dropzone\";\nimport { MdDeleteOutline, MdInsertDriveFile } from \"react-icons/md\";\nimport { AxiosError } from \"axios\";\nimport { LoaderCircleIcon } from \"lucide-react\";\nimport { cn } from \"../../utils/utils\";\nimport { IAttachment } from \"../../types\";\nimport { handleErrors, useFederationContext, useFormField } from \"../../main\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n} from \"../ui/Dialog\";\nimport { Input } from \"../ui/input\";\nimport { Button } from \"../ui/button\";\n\ninterface FileInputFormMultipleProps {\n name: string;\n value?: IAttachment[] | null;\n onFilesChanged: (files: IAttachment[]) => void;\n description?: string;\n disabled?: boolean;\n initialFilesReadOnly?: boolean;\n initialFileIds?: number[];\n attachmentName?: string;\n attachmentType?: string;\n askForAttachmentName?: boolean;\n}\n\ninterface IAttachmentReadOnly extends IAttachment {\n readonly?: boolean;\n}\n\nconst MAX_FILE_SIZE = 1024 * 1024; // 1MB\n\nconst FileInputFormMultiple: React.FC<FileInputFormMultipleProps> = ({\n value,\n onFilesChanged,\n name,\n description,\n disabled,\n initialFilesReadOnly = true,\n initialFileIds,\n attachmentName,\n attachmentType,\n askForAttachmentName = false,\n}) => {\n const [fileDataList, setFileDataList] = useState<IAttachmentReadOnly[]>(\n value?.map((file) => ({\n ...file,\n readonly: initialFilesReadOnly && initialFileIds?.includes(file.id),\n })) || []\n );\n\n const [pendingFiles, setPendingFiles] = useState<File[]>([]);\n const [isDialogOpen, setIsDialogOpen] = useState(false);\n const [fileNames, setFileNames] = useState<Record<string, string>>({});\n const [isUploading, setIsUploading] = useState(false);\n\n const federationContext = useFederationContext();\n\n const { error } = useFormField();\n const hasError = !!error;\n useEffect(() => {\n if (!value || value.length === 0) {\n setFileDataList([]);\n return;\n }\n\n setFileDataList(\n value.map((file) => ({\n ...file,\n readonly: initialFilesReadOnly && initialFileIds?.includes(file.id),\n }))\n );\n }, [value, initialFilesReadOnly, initialFileIds]);\n\n const uploadFiles = useCallback(\n async (files: File[], customNames?: Record<string, string>) => {\n setIsUploading(true);\n const uploadedFiles = await Promise.all(\n files.map(async (file) => {\n if (file.size > MAX_FILE_SIZE) {\n // Handle the case when the file size is exceeded\n federationContext.emitter.emit(\"message\", {\n title: \"Velikost souboru byla překročena\",\n message: `Maximální povolená velikost je ${MAX_FILE_SIZE / (1024 * 1024)} MB.`,\n classes: \"bg-danger \",\n timeout: 0,\n type: \"error\",\n });\n\n return null;\n }\n\n const formData = new FormData();\n\n // Add the JSON data object\n const dataObject = {\n ...(customNames?.[file.name]\n ? { attachmentName: customNames[file.name] }\n : attachmentName && { attachmentName }),\n ...(attachmentType && { attachmentType }),\n };\n\n formData.append(\n \"data\",\n new Blob([JSON.stringify(dataObject)], { type: \"application/json\" })\n );\n formData.append(\"file\", file);\n\n try {\n const response =\n await federationContext.apiClient.post<IAttachment>(\n \"/files/upload\",\n formData,\n {\n headers: {\n \"Content-Type\": \"multipart/form-data\",\n },\n }\n );\n return response.data;\n } catch (error) {\n handleErrors(error as AxiosError, federationContext.emitter);\n console.error(\"There was an error!\", error);\n return null;\n }\n })\n );\n\n const validFiles = uploadedFiles.filter(\n (file) => file !== null\n ) as IAttachment[];\n const updatedFileDataList = [...fileDataList, ...validFiles];\n setFileDataList(updatedFileDataList);\n onFilesChanged(updatedFileDataList);\n setIsUploading(false);\n },\n [\n federationContext,\n fileDataList,\n onFilesChanged,\n attachmentName,\n attachmentType,\n ]\n );\n\n const onDrop = useCallback(\n async (acceptedFiles: File[]) => {\n // Filter out files that exceed size limit\n const validFiles = acceptedFiles.filter((file) => {\n if (file.size > MAX_FILE_SIZE) {\n federationContext.emitter.emit(\"message\", {\n title: \"Velikost souboru byla překročena\",\n message: `Maximální povolená velikost je ${MAX_FILE_SIZE / (1024 * 1024)} MB.`,\n classes: \"bg-danger \",\n timeout: 0,\n type: \"error\",\n });\n return false;\n }\n return true;\n });\n\n if (validFiles.length === 0) {\n return;\n }\n\n if (askForAttachmentName) {\n // Initialize file names with original file names\n const initialNames: Record<string, string> = {};\n validFiles.forEach((file) => {\n initialNames[file.name] = file.name;\n });\n setFileNames(initialNames);\n setPendingFiles(validFiles);\n setIsDialogOpen(true);\n } else {\n await uploadFiles(validFiles);\n }\n },\n [askForAttachmentName, uploadFiles, federationContext]\n );\n\n const handleDialogSubmit = async () => {\n setIsDialogOpen(false);\n await uploadFiles(pendingFiles, fileNames);\n setPendingFiles([]);\n setFileNames({});\n };\n\n const handleDialogCancel = () => {\n setIsDialogOpen(false);\n setPendingFiles([]);\n setFileNames({});\n };\n\n const formatFileSize = (bytes: number): string => {\n if (bytes === 0) return \"0 Bytes\";\n const k = 1024;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + \" \" + sizes[i];\n };\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop,\n disabled: disabled || isUploading,\n });\n\n const handleRemove = (fileId: number) => {\n const updatedFileDataList = fileDataList.filter(\n (file) => file.id !== fileId\n );\n setFileDataList(updatedFileDataList);\n onFilesChanged(updatedFileDataList);\n };\n\n if (disabled === true && fileDataList.length === 0) {\n return null;\n }\n\n return (\n <>\n <div\n className=\"w-full min-h-30 flex-col justify-start items-start gap-1.5 inline-flex sharedLibrary\"\n data-cy={\"file-input-form-multiple-\" + name}\n >\n <div className=\"self-stretch flex-col justify-start items-start gap-1.5 flex\">\n <div\n className={cn(\n `self-stretch px-3 py-2 rounded-lg justify-start items-center gap-2 outline-none border bg-transparent relative`,\n hasError &&\n \"outline-4 outline-red-200 outline-offset-0 border-none \",\n disabled ? \"bg-gray-100\" : \"bg-transparent\"\n )}\n >\n {isUploading && (\n <div className=\"absolute inset-0 bg-white/80 backdrop-blur-sm rounded-lg z-10 flex items-center justify-center\">\n <div className=\"flex flex-col items-center gap-2\">\n <LoaderCircleIcon className=\"h-8 w-8 animate-spin text-primary\" />\n <p className=\"text-sm text-gray-600\">Nahrávání...</p>\n </div>\n </div>\n )}\n {!disabled && (\n <div\n {...getRootProps()}\n className={cn(\n `w-full p-4 border-dashed border-2 rounded-lg text-center`,\n isUploading\n ? \"cursor-not-allowed opacity-50\"\n : \"cursor-pointer hover:bg-gray-100\",\n isDragActive ? \"border-indigo-300 bg-indigo-50\" : \"border-gray-300\"\n )}\n >\n <input {...getInputProps()} id={name} />\n <p className=\"text-gray-500\">\n {isDragActive\n ? \"Sem přetáhněte soubory\"\n : \"Klikněte pro nahrání, nebo nahrajte přetažením souborů\"}\n </p>\n </div>\n )}\n <div className=\"w-full\">\n {fileDataList.map((file) => (\n <div\n key={file.id}\n className=\"w-full flex items-center justify-between py-2 border-b \"\n >\n <div className=\"flex flex-col flex-1\">\n <div className=\"flex items-center content-center gap-2\">\n <MdInsertDriveFile style={{ fontSize: \"2rem\" }} />\n\n <div className=\"flex flex-col flex-1\">\n <a\n href={`/api/files/download/${file.id}`}\n className=\"text-left underline text-primary text-sm\"\n target=\"_blank\"\n >\n {file.filename}\n </a>\n {file.attachmentName && (\n <div className=\"text-sm text-gray-600\">\n {file.attachmentName}\n </div>\n )}\n </div>\n </div>\n\n </div>\n {!disabled && file.readonly !== true && !isUploading && (\n <div\n onClick={() => handleRemove(file.id)}\n className=\"text-gray-600 cursor-pointer hover:text-primary hover:bg-gray-200 rounded-full ml-4\"\n >\n <MdDeleteOutline\n style={{ fontSize: \"1.5rem\", margin: \"10px\" }}\n />\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n </div>\n {description && (\n <div\n className=\"HintText self-stretch text-slate-600 text-sm font-normal leading-tight\"\n id={name + \":description\"}\n >\n {description}\n </div>\n )}\n </div>\n\n <Dialog\n open={isDialogOpen}\n onOpenChange={(open) => {\n setIsDialogOpen(open);\n if (!open) {\n handleDialogCancel();\n }\n }}\n >\n <DialogContent className=\"max-w-2xl max-h-[80vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>Zadejte popisy příloh</DialogTitle>\n </DialogHeader>\n <div className=\"space-y-4 py-4\">\n {pendingFiles.map((file) => (\n <div\n key={file.name}\n className=\"flex flex-col gap-2 p-4 border rounded-lg\"\n >\n <div className=\"flex items-center gap-2\">\n <MdInsertDriveFile style={{ fontSize: \"1.5rem\" }} />\n <div className=\"flex-1\">\n <div className=\"font-medium text-sm\">{file.name}</div>\n <div className=\"text-xs text-gray-500\">\n {formatFileSize(file.size)}\n </div>\n </div>\n </div>\n <div className=\"mt-2\">\n <label className=\"text-sm font-medium mb-1 block\">\n Popis přílohy:\n </label>\n <Input\n value={fileNames[file.name] || file.name}\n onChange={(e) =>\n setFileNames({\n ...fileNames,\n [file.name]: e.target.value,\n })\n }\n placeholder=\"Zadejte popis přílohy\"\n />\n </div>\n </div>\n ))}\n </div>\n <DialogFooter>\n <Button variant=\"outline\" onClick={handleDialogCancel} disabled={isUploading}>\n Zrušit\n </Button>\n <Button onClick={handleDialogSubmit} disabled={isUploading}>\n {isUploading ? (\n <>\n <LoaderCircleIcon className=\"h-4 w-4 animate-spin mr-2\" />\n Nahrávání...\n </>\n ) : (\n \"Nahrát\"\n )}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </>\n );\n};\n\nexport default FileInputFormMultiple;\n"],"names":["error","LoaderCircleIcon"],"mappings":"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"}
1
+ {"version":3,"file":"FileInputFormMultiple.js","sources":["../../../lib/components/form/FileInputFormMultiple.tsx"],"sourcesContent":["import { useState, useCallback, useEffect } from \"react\";\nimport { useDropzone } from \"react-dropzone\";\nimport { MdDeleteOutline, MdInsertDriveFile } from \"react-icons/md\";\nimport { AxiosError } from \"axios\";\nimport { LoaderCircleIcon } from \"lucide-react\";\nimport { cn } from \"../../utils/utils\";\nimport { IAttachment } from \"../../types\";\nimport { handleErrors, useFederationContext, useFormField } from \"../../main\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n} from \"../ui/Dialog\";\nimport { Input } from \"../ui/input\";\nimport { Button } from \"../ui/button\";\n\ninterface FileInputFormMultipleProps {\n name: string;\n value?: IAttachment[] | null;\n onFilesChanged: (files: IAttachment[]) => void;\n description?: string;\n disabled?: boolean;\n initialFilesReadOnly?: boolean;\n initialFileIds?: number[];\n attachmentName?: string;\n attachmentType?: string;\n askForAttachmentName?: boolean;\n}\n\ninterface IAttachmentReadOnly extends IAttachment {\n readonly?: boolean;\n}\n\nconst MAX_FILE_SIZE = 1024 * 1024; // 1MB\n\nconst FileInputFormMultiple: React.FC<FileInputFormMultipleProps> = ({\n value,\n onFilesChanged,\n name,\n description,\n disabled,\n initialFilesReadOnly = true,\n initialFileIds,\n attachmentName,\n attachmentType,\n askForAttachmentName = false,\n}) => {\n const [fileDataList, setFileDataList] = useState<IAttachmentReadOnly[]>(\n value?.map((file) => ({\n ...file,\n readonly: initialFilesReadOnly && initialFileIds?.includes(file.id),\n })) || []\n );\n\n const [pendingFiles, setPendingFiles] = useState<File[]>([]);\n const [isDialogOpen, setIsDialogOpen] = useState(false);\n const [fileNames, setFileNames] = useState<Record<string, string>>({});\n const [isUploading, setIsUploading] = useState(false);\n\n const federationContext = useFederationContext();\n\n const { error } = useFormField();\n const hasError = !!error;\n useEffect(() => {\n if (!value || value.length === 0) {\n setFileDataList([]);\n return;\n }\n\n setFileDataList(\n value.map((file) => ({\n ...file,\n readonly: initialFilesReadOnly && initialFileIds?.includes(file.id),\n }))\n );\n }, [value, initialFilesReadOnly, initialFileIds]);\n\n const uploadFiles = useCallback(\n async (files: File[], customNames?: Record<string, string>) => {\n setIsUploading(true);\n const uploadedFiles = await Promise.all(\n files.map(async (file) => {\n if (file.size > MAX_FILE_SIZE) {\n // Handle the case when the file size is exceeded\n federationContext.emitter.emit(\"message\", {\n title: \"Velikost souboru byla překročena\",\n message: `Maximální povolená velikost je ${MAX_FILE_SIZE / (1024 * 1024)} MB.`,\n classes: \"bg-danger \",\n timeout: 0,\n type: \"error\",\n });\n\n return null;\n }\n\n const formData = new FormData();\n\n // Add the JSON data object\n const dataObject = {\n ...(customNames?.[file.name]\n ? { attachmentName: customNames[file.name] }\n : attachmentName && { attachmentName }),\n ...(attachmentType && { attachmentType }),\n };\n\n formData.append(\n \"data\",\n new Blob([JSON.stringify(dataObject)], { type: \"application/json\" })\n );\n formData.append(\"file\", file);\n\n try {\n const response =\n await federationContext.apiClient.post<IAttachment>(\n \"/files/upload\",\n formData,\n {\n headers: {\n \"Content-Type\": \"multipart/form-data\",\n },\n }\n );\n return response.data;\n } catch (error) {\n handleErrors(error as AxiosError, federationContext.emitter);\n console.error(\"There was an error!\", error);\n return null;\n }\n })\n );\n\n const validFiles = uploadedFiles.filter(\n (file) => file !== null\n ) as IAttachment[];\n const updatedFileDataList = [...fileDataList, ...validFiles];\n setFileDataList(updatedFileDataList);\n onFilesChanged(updatedFileDataList);\n setIsUploading(false);\n },\n [\n federationContext,\n fileDataList,\n onFilesChanged,\n attachmentName,\n attachmentType,\n ]\n );\n\n const onDrop = useCallback(\n async (acceptedFiles: File[]) => {\n // Filter out files that exceed size limit\n const validFiles = acceptedFiles.filter((file) => {\n if (file.size > MAX_FILE_SIZE) {\n federationContext.emitter.emit(\"message\", {\n title: \"Velikost souboru byla překročena\",\n message: `Maximální povolená velikost je ${MAX_FILE_SIZE / (1024 * 1024)} MB.`,\n classes: \"bg-danger \",\n timeout: 0,\n type: \"error\",\n });\n return false;\n }\n return true;\n });\n\n if (validFiles.length === 0) {\n return;\n }\n\n if (askForAttachmentName) {\n // Initialize file names with original file names\n const initialNames: Record<string, string> = {};\n validFiles.forEach((file) => {\n initialNames[file.name] = file.name;\n });\n setFileNames(initialNames);\n setPendingFiles(validFiles);\n setIsDialogOpen(true);\n } else {\n await uploadFiles(validFiles);\n }\n },\n [askForAttachmentName, uploadFiles, federationContext]\n );\n\n const handleDialogSubmit = async () => {\n setIsDialogOpen(false);\n await uploadFiles(pendingFiles, fileNames);\n setPendingFiles([]);\n setFileNames({});\n };\n\n const handleDialogCancel = () => {\n setIsDialogOpen(false);\n setPendingFiles([]);\n setFileNames({});\n };\n\n const formatFileSize = (bytes: number): string => {\n if (bytes === 0) return \"0 Bytes\";\n const k = 1024;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + \" \" + sizes[i];\n };\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop,\n disabled: disabled || isUploading,\n });\n\n const handleRemove = (fileId: number) => {\n const updatedFileDataList = fileDataList.filter(\n (file) => file.id !== fileId\n );\n setFileDataList(updatedFileDataList);\n onFilesChanged(updatedFileDataList);\n };\n\n if (disabled === true && fileDataList.length === 0) {\n return null;\n }\n\n return (\n <>\n <div\n className=\"w-full min-h-30 flex-col justify-start items-start gap-1.5 inline-flex sharedLibrary\"\n data-cy={\"file-input-form-multiple-\" + name}\n >\n <div className=\"self-stretch flex-col justify-start items-start gap-1.5 flex\">\n <div\n className={cn(\n `self-stretch px-3 py-2 rounded-lg justify-start items-center gap-2 outline-none border bg-transparent relative`,\n hasError &&\n \"outline-4 outline-red-200 outline-offset-0 border-none \",\n disabled ? \"bg-gray-100\" : \"bg-transparent\"\n )}\n >\n {isUploading && (\n <div className=\"absolute inset-0 bg-white/80 backdrop-blur-sm rounded-lg z-10 flex items-center justify-center\">\n <div className=\"flex flex-col items-center gap-2\">\n <LoaderCircleIcon className=\"h-8 w-8 animate-spin text-primary\" />\n <p className=\"text-sm text-gray-600\">Nahrávání...</p>\n </div>\n </div>\n )}\n {!disabled && (\n <div\n {...getRootProps()}\n className={cn(\n `w-full p-4 border-dashed border-2 rounded-lg text-center`,\n isUploading\n ? \"cursor-not-allowed opacity-50\"\n : \"cursor-pointer hover:bg-gray-100\",\n isDragActive ? \"border-indigo-300 bg-indigo-50\" : \"border-gray-300\"\n )}\n >\n <input {...getInputProps()} id={name} />\n <p className=\"text-gray-500\">\n {isDragActive\n ? \"Sem přetáhněte soubory\"\n : \"Klikněte pro nahrání, nebo nahrajte přetažením souborů\"}\n </p>\n </div>\n )}\n <div className=\"w-full\">\n {fileDataList.map((file) => (\n <div\n key={file.id}\n className=\"w-full flex items-center justify-between py-2 border-b \"\n >\n <div className=\"flex flex-col flex-1\">\n <div className=\"flex items-center content-center gap-2\">\n <MdInsertDriveFile style={{ fontSize: \"2rem\" }} />\n\n <div className=\"flex flex-col flex-1\">\n <a\n href={`/api/files/download/${file.id}`}\n className=\"text-left underline text-primary text-sm\"\n target=\"_blank\"\n >\n {file.filename}\n </a>\n {file.attachmentName && (\n <div className=\"text-sm text-gray-600\">\n {file.attachmentName}\n </div>\n )}\n </div>\n </div>\n\n </div>\n {!disabled && file.readonly !== true && !isUploading && (\n <div\n onClick={() => handleRemove(file.id)}\n className=\"text-gray-600 cursor-pointer hover:text-primary hover:bg-gray-200 rounded-full ml-4\"\n >\n <MdDeleteOutline\n style={{ fontSize: \"1.5rem\", margin: \"10px\" }}\n />\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n </div>\n {description && (\n <div\n className=\"HintText self-stretch text-slate-600 text-sm font-normal leading-tight\"\n id={name + \":description\"}\n >\n {description}\n </div>\n )}\n </div>\n\n <Dialog\n open={isDialogOpen}\n onOpenChange={(open) => {\n setIsDialogOpen(open);\n if (!open) {\n handleDialogCancel();\n }\n }}\n >\n <DialogContent className=\"max-w-2xl max-h-[80vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>Zadejte popisy příloh</DialogTitle>\n </DialogHeader>\n <div className=\"space-y-4 py-4\">\n {pendingFiles.map((file) => (\n <div\n key={file.name}\n className=\"flex flex-col gap-2 p-4 border rounded-lg\"\n >\n <div className=\"flex items-center gap-2\">\n <MdInsertDriveFile style={{ fontSize: \"1.5rem\" }} />\n <div className=\"flex-1\">\n <div className=\"font-medium text-sm\">{file.name}</div>\n <div className=\"text-xs text-gray-500\">\n {formatFileSize(file.size)}\n </div>\n </div>\n </div>\n <div className=\"mt-2\">\n <label className=\"text-sm font-medium mb-1 block\">\n Popis přílohy:\n </label>\n <Input\n value={fileNames[file.name] || file.name}\n onChange={(e) =>\n setFileNames({\n ...fileNames,\n [file.name]: e.target.value,\n })\n }\n placeholder=\"Zadejte popis přílohy\"\n />\n </div>\n </div>\n ))}\n </div>\n <DialogFooter>\n <Button variant=\"outline\" onClick={handleDialogCancel} disabled={isUploading}>\n Zrušit\n </Button>\n <Button onClick={handleDialogSubmit} disabled={isUploading}>\n {isUploading ? (\n <>\n <LoaderCircleIcon className=\"h-4 w-4 animate-spin mr-2\" />\n Nahrávání...\n </>\n ) : (\n \"Nahrát\"\n )}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </>\n );\n};\n\nexport default FileInputFormMultiple;\n"],"names":["error","LoaderCircleIcon"],"mappings":"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"}
@@ -25,6 +25,7 @@ import "../ui/textarea.js";
25
25
  import "../ui/checkbox.js";
26
26
  import "../../Calendar-DWT4e7Th.js";
27
27
  import "../ui/DateTimePicker.js";
28
+ import "../ui/DateTimePicker2.js";
28
29
  import "../ui/DatePicker.js";
29
30
  const MAX_FILE_SIZE = 1024 * 1024;
30
31
  const FileInputMultiple = ({
@@ -1 +1 @@
1
- {"version":3,"file":"FileInputMultiple.js","sources":["../../../lib/components/form/FileInputMultiple.tsx"],"sourcesContent":["import React, { useState, useCallback, useEffect } from \"react\";\nimport { useDropzone } from \"react-dropzone\";\nimport { MdDeleteOutline, MdInsertDriveFile } from \"react-icons/md\";\nimport { IAttachment } from \"../../types\";\nimport { handleErrors, useFederationContext } from \"../../main\";\nimport { AxiosError } from \"axios\";\nimport { cn } from \"../../utils/utils\";\n\ninterface FileInputMultipleProps {\n name: string;\n label?: string;\n initialFiles?: IAttachment[];\n onFilesChanged: (e: any) => void;\n required?: boolean;\n description?: string;\n disabled?: boolean;\n initialFilesReadOnly?: boolean;\n attachmentName?: string;\n attachmentType?: string;\n hasError?: boolean;\n}\n\ninterface IAttachmentReadOnly extends IAttachment {\n readonly?: boolean;\n}\n\nconst MAX_FILE_SIZE = 1024 * 1024; // 1MB\n\nconst FileInputMultiple: React.FC<FileInputMultipleProps> = ({\n initialFiles,\n onFilesChanged,\n label,\n name,\n required,\n description,\n disabled,\n initialFilesReadOnly = true,\n attachmentName,\n attachmentType,\n hasError,\n}) => {\n const [fileDataList, setFileDataList] = useState<IAttachmentReadOnly[]>(\n initialFiles\n ? [...initialFiles].map((file) => ({\n ...file,\n readonly: initialFilesReadOnly,\n }))\n : []\n );\n const federationContext = useFederationContext();\n\n useEffect(() => {\n console.log(\n \"%clibcomponents\\formFileInputMultiple.tsx:40 initialFiles\",\n \"color: #007acc;\",\n initialFiles\n );\n if (!initialFiles || initialFiles.length === 0) return;\n setFileDataList(\n [...initialFiles].map((file) => ({\n ...file,\n readonly: initialFilesReadOnly,\n }))\n );\n }, [initialFiles, initialFilesReadOnly]);\n\n const onDrop = useCallback(\n async (acceptedFiles: File[]) => {\n const uploadedFiles = await Promise.all(\n acceptedFiles.map(async (file) => {\n if (file.size > MAX_FILE_SIZE) {\n // Handle the case when the file size is exceeded\n\n federationContext.emitter.emit(\"message\", {\n title: \"Velikost souboru byla překročena\",\n message: `Maximální povolená velikost je ${MAX_FILE_SIZE / (1024 * 1024)} MB.`,\n classes: \"bg-danger \",\n timeout: 0,\n type: \"error\",\n });\n\n return null;\n }\n\n const formData = new FormData();\n\n // Add the JSON data object\n const dataObject = {\n ...(attachmentName && { attachmentName }),\n ...(attachmentType && { attachmentType }),\n };\n\n formData.append(\n \"data\",\n new Blob([JSON.stringify(dataObject)], { type: \"application/json\" })\n );\n formData.append(\"file\", file);\n\n try {\n const response =\n await federationContext.apiClient.post<IAttachment>(\n \"/files/upload\",\n formData,\n {\n headers: {\n \"Content-Type\": \"multipart/form-data\",\n },\n }\n );\n return response.data;\n } catch (error) {\n handleErrors(error as AxiosError, federationContext.emitter);\n console.error(\"There was an error!\", error);\n return null;\n }\n })\n );\n\n const validFiles = uploadedFiles.filter(\n (file) => file !== null\n ) as IAttachment[];\n const updatedFileDataList = [...fileDataList, ...validFiles];\n setFileDataList(updatedFileDataList);\n onFilesChanged({\n target: {\n name,\n value: updatedFileDataList.map((file) => file.id.toString()),\n },\n });\n },\n [\n federationContext,\n fileDataList,\n onFilesChanged,\n name,\n attachmentName,\n attachmentType,\n ]\n );\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop,\n disabled,\n });\n\n const handleRemove = (fileId: number) => {\n const updatedFileDataList = fileDataList.filter(\n (file) => file.id !== fileId\n );\n setFileDataList(updatedFileDataList);\n onFilesChanged({\n target: {\n name,\n value: updatedFileDataList.map((file) => file.id.toString()),\n },\n });\n };\n if (disabled === true && fileDataList.length === 0) {\n return null;\n }\n\n return (\n <div className=\"w-full min-h-30 flex-col justify-start items-start gap-1.5 inline-flex sharedLibrary\">\n <div className=\"self-stretch flex-col justify-start items-start gap-1.5 flex\">\n {label && (\n <label\n className=\"text-slate-700 text-sm leading-tight font-medium\"\n htmlFor={name}\n >\n {label} {required ? \"*\" : \"\"}\n </label>\n )}\n <div\n className={cn(\n `self-stretch px-3 py-2 rounded-lg justify-start items-center gap-2 outline-none border bg-transparent `,\n hasError &&\n \"outline-4 outline-red-200 outline-offset-0 border-none \",\n disabled ? \"bg-gray-100\" : \"bg-transparent\"\n )}\n >\n {!disabled && (\n <div\n {...getRootProps()}\n className={`w-full p-4 border-dashed cursor-pointer \n border-2 rounded-lg text-center hover:bg-gray-100\n ${isDragActive ? \"border-indigo-300 bg-indigo-50\" : \"border-gray-300\"}`}\n >\n <input {...getInputProps()} id={name} />\n <p className=\"text-gray-500\">\n {isDragActive\n ? \"Sem přetáhněte soubory\"\n : \"Klikněte pro nahrání, nebo nahrajte přetažením souborů\"}\n </p>\n </div>\n )}\n <div className=\"w-full\">\n {fileDataList.map((file) => (\n <div\n key={file.id}\n className=\"w-full flex items-center justify-between py-2 border-b \"\n >\n <div className=\"flex items-center content-center\">\n <MdInsertDriveFile style={{ fontSize: \"2rem\" }} />\n <a\n href={`/api/files/download/${file.id}`}\n className=\"pl-2 text-left underline text-primary\"\n target=\"_blank\"\n >\n {file.filename}\n </a>\n </div>\n {!disabled && file.readonly !== true && (\n <div\n onClick={() => handleRemove(file.id)}\n className=\"text-gray-600 cursor-pointer hover:text-primary hover:bg-gray-200 rounded-full ml-4\"\n >\n <MdDeleteOutline\n style={{ fontSize: \"1.5rem\", margin: \"10px\" }}\n />\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n </div>\n {description && (\n <div\n className=\"HintText self-stretch text-slate-600 text-sm font-normal leading-tight\"\n id={name + \":description\"}\n >\n {description}\n </div>\n )}\n </div>\n );\n};\n\nexport default FileInputMultiple;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FileInputMultiple.js","sources":["../../../lib/components/form/FileInputMultiple.tsx"],"sourcesContent":["import React, { useState, useCallback, useEffect } from \"react\";\nimport { useDropzone } from \"react-dropzone\";\nimport { MdDeleteOutline, MdInsertDriveFile } from \"react-icons/md\";\nimport { IAttachment } from \"../../types\";\nimport { handleErrors, useFederationContext } from \"../../main\";\nimport { AxiosError } from \"axios\";\nimport { cn } from \"../../utils/utils\";\n\ninterface FileInputMultipleProps {\n name: string;\n label?: string;\n initialFiles?: IAttachment[];\n onFilesChanged: (e: any) => void;\n required?: boolean;\n description?: string;\n disabled?: boolean;\n initialFilesReadOnly?: boolean;\n attachmentName?: string;\n attachmentType?: string;\n hasError?: boolean;\n}\n\ninterface IAttachmentReadOnly extends IAttachment {\n readonly?: boolean;\n}\n\nconst MAX_FILE_SIZE = 1024 * 1024; // 1MB\n\nconst FileInputMultiple: React.FC<FileInputMultipleProps> = ({\n initialFiles,\n onFilesChanged,\n label,\n name,\n required,\n description,\n disabled,\n initialFilesReadOnly = true,\n attachmentName,\n attachmentType,\n hasError,\n}) => {\n const [fileDataList, setFileDataList] = useState<IAttachmentReadOnly[]>(\n initialFiles\n ? [...initialFiles].map((file) => ({\n ...file,\n readonly: initialFilesReadOnly,\n }))\n : []\n );\n const federationContext = useFederationContext();\n\n useEffect(() => {\n console.log(\n \"%clibcomponents\\formFileInputMultiple.tsx:40 initialFiles\",\n \"color: #007acc;\",\n initialFiles\n );\n if (!initialFiles || initialFiles.length === 0) return;\n setFileDataList(\n [...initialFiles].map((file) => ({\n ...file,\n readonly: initialFilesReadOnly,\n }))\n );\n }, [initialFiles, initialFilesReadOnly]);\n\n const onDrop = useCallback(\n async (acceptedFiles: File[]) => {\n const uploadedFiles = await Promise.all(\n acceptedFiles.map(async (file) => {\n if (file.size > MAX_FILE_SIZE) {\n // Handle the case when the file size is exceeded\n\n federationContext.emitter.emit(\"message\", {\n title: \"Velikost souboru byla překročena\",\n message: `Maximální povolená velikost je ${MAX_FILE_SIZE / (1024 * 1024)} MB.`,\n classes: \"bg-danger \",\n timeout: 0,\n type: \"error\",\n });\n\n return null;\n }\n\n const formData = new FormData();\n\n // Add the JSON data object\n const dataObject = {\n ...(attachmentName && { attachmentName }),\n ...(attachmentType && { attachmentType }),\n };\n\n formData.append(\n \"data\",\n new Blob([JSON.stringify(dataObject)], { type: \"application/json\" })\n );\n formData.append(\"file\", file);\n\n try {\n const response =\n await federationContext.apiClient.post<IAttachment>(\n \"/files/upload\",\n formData,\n {\n headers: {\n \"Content-Type\": \"multipart/form-data\",\n },\n }\n );\n return response.data;\n } catch (error) {\n handleErrors(error as AxiosError, federationContext.emitter);\n console.error(\"There was an error!\", error);\n return null;\n }\n })\n );\n\n const validFiles = uploadedFiles.filter(\n (file) => file !== null\n ) as IAttachment[];\n const updatedFileDataList = [...fileDataList, ...validFiles];\n setFileDataList(updatedFileDataList);\n onFilesChanged({\n target: {\n name,\n value: updatedFileDataList.map((file) => file.id.toString()),\n },\n });\n },\n [\n federationContext,\n fileDataList,\n onFilesChanged,\n name,\n attachmentName,\n attachmentType,\n ]\n );\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop,\n disabled,\n });\n\n const handleRemove = (fileId: number) => {\n const updatedFileDataList = fileDataList.filter(\n (file) => file.id !== fileId\n );\n setFileDataList(updatedFileDataList);\n onFilesChanged({\n target: {\n name,\n value: updatedFileDataList.map((file) => file.id.toString()),\n },\n });\n };\n if (disabled === true && fileDataList.length === 0) {\n return null;\n }\n\n return (\n <div className=\"w-full min-h-30 flex-col justify-start items-start gap-1.5 inline-flex sharedLibrary\">\n <div className=\"self-stretch flex-col justify-start items-start gap-1.5 flex\">\n {label && (\n <label\n className=\"text-slate-700 text-sm leading-tight font-medium\"\n htmlFor={name}\n >\n {label} {required ? \"*\" : \"\"}\n </label>\n )}\n <div\n className={cn(\n `self-stretch px-3 py-2 rounded-lg justify-start items-center gap-2 outline-none border bg-transparent `,\n hasError &&\n \"outline-4 outline-red-200 outline-offset-0 border-none \",\n disabled ? \"bg-gray-100\" : \"bg-transparent\"\n )}\n >\n {!disabled && (\n <div\n {...getRootProps()}\n className={`w-full p-4 border-dashed cursor-pointer \n border-2 rounded-lg text-center hover:bg-gray-100\n ${isDragActive ? \"border-indigo-300 bg-indigo-50\" : \"border-gray-300\"}`}\n >\n <input {...getInputProps()} id={name} />\n <p className=\"text-gray-500\">\n {isDragActive\n ? \"Sem přetáhněte soubory\"\n : \"Klikněte pro nahrání, nebo nahrajte přetažením souborů\"}\n </p>\n </div>\n )}\n <div className=\"w-full\">\n {fileDataList.map((file) => (\n <div\n key={file.id}\n className=\"w-full flex items-center justify-between py-2 border-b \"\n >\n <div className=\"flex items-center content-center\">\n <MdInsertDriveFile style={{ fontSize: \"2rem\" }} />\n <a\n href={`/api/files/download/${file.id}`}\n className=\"pl-2 text-left underline text-primary\"\n target=\"_blank\"\n >\n {file.filename}\n </a>\n </div>\n {!disabled && file.readonly !== true && (\n <div\n onClick={() => handleRemove(file.id)}\n className=\"text-gray-600 cursor-pointer hover:text-primary hover:bg-gray-200 rounded-full ml-4\"\n >\n <MdDeleteOutline\n style={{ fontSize: \"1.5rem\", margin: \"10px\" }}\n />\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n </div>\n {description && (\n <div\n className=\"HintText self-stretch text-slate-600 text-sm font-normal leading-tight\"\n id={name + \":description\"}\n >\n {description}\n </div>\n )}\n </div>\n );\n};\n\nexport default FileInputMultiple;\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,MAAM,gBAAgB,OAAO;AAE7B,MAAM,oBAAsD,CAAC;AAAA,EAC3D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,uBAAuB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACE,QAAA,CAAC,cAAc,eAAe,IAAI;AAAA,IACtC,eACI,CAAC,GAAG,YAAY,EAAE,IAAI,CAAC,UAAU;AAAA,MAC/B,GAAG;AAAA,MACH,UAAU;AAAA,IACZ,EAAE,IACF,CAAC;AAAA,EAAA;AAEP,QAAM,oBAAoB;AAE1B,YAAU,MAAM;AACN,YAAA;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAEE,QAAA,CAAC,gBAAgB,aAAa,WAAW;AAAG;AAChD;AAAA,MACE,CAAC,GAAG,YAAY,EAAE,IAAI,CAAC,UAAU;AAAA,QAC/B,GAAG;AAAA,QACH,UAAU;AAAA,MAAA,EACV;AAAA,IAAA;AAAA,EACJ,GACC,CAAC,cAAc,oBAAoB,CAAC;AAEvC,QAAM,SAAS;AAAA,IACb,OAAO,kBAA0B;AACzB,YAAA,gBAAgB,MAAM,QAAQ;AAAA,QAClC,cAAc,IAAI,OAAO,SAAS;AAC5B,cAAA,KAAK,OAAO,eAAe;AAGX,8BAAA,QAAQ,KAAK,WAAW;AAAA,cACxC,OAAO;AAAA,cACP,SAAS,kCAAkC,iBAAiB,OAAO,KAAK;AAAA,cACxE,SAAS;AAAA,cACT,SAAS;AAAA,cACT,MAAM;AAAA,YAAA,CACP;AAEM,mBAAA;AAAA,UACT;AAEM,gBAAA,WAAW,IAAI;AAGrB,gBAAM,aAAa;AAAA,YACjB,GAAI,kBAAkB,EAAE,eAAe;AAAA,YACvC,GAAI,kBAAkB,EAAE,eAAe;AAAA,UAAA;AAGhC,mBAAA;AAAA,YACP;AAAA,YACA,IAAI,KAAK,CAAC,KAAK,UAAU,UAAU,CAAC,GAAG,EAAE,MAAM,oBAAoB;AAAA,UAAA;AAE5D,mBAAA,OAAO,QAAQ,IAAI;AAExB,cAAA;AACI,kBAAA,WACJ,MAAM,kBAAkB,UAAU;AAAA,cAChC;AAAA,cACA;AAAA,cACA;AAAA,gBACE,SAAS;AAAA,kBACP,gBAAgB;AAAA,gBAClB;AAAA,cACF;AAAA,YAAA;AAEJ,mBAAO,SAAS;AAAA,mBACT,OAAO;AACD,yBAAA,OAAqB,kBAAkB,OAAO;AACnD,oBAAA,MAAM,uBAAuB,KAAK;AACnC,mBAAA;AAAA,UACT;AAAA,QAAA,CACD;AAAA,MAAA;AAGH,YAAM,aAAa,cAAc;AAAA,QAC/B,CAAC,SAAS,SAAS;AAAA,MAAA;AAErB,YAAM,sBAAsB,CAAC,GAAG,cAAc,GAAG,UAAU;AAC3D,sBAAgB,mBAAmB;AACpB,qBAAA;AAAA,QACb,QAAQ;AAAA,UACN;AAAA,UACA,OAAO,oBAAoB,IAAI,CAAC,SAAS,KAAK,GAAG,UAAU;AAAA,QAC7D;AAAA,MAAA,CACD;AAAA,IACH;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EAAA;AAGF,QAAM,EAAE,cAAc,eAAe,aAAA,IAAiB,YAAY;AAAA,IAChE;AAAA,IACA;AAAA,EAAA,CACD;AAEK,QAAA,eAAe,CAAC,WAAmB;AACvC,UAAM,sBAAsB,aAAa;AAAA,MACvC,CAAC,SAAS,KAAK,OAAO;AAAA,IAAA;AAExB,oBAAgB,mBAAmB;AACpB,mBAAA;AAAA,MACb,QAAQ;AAAA,QACN;AAAA,QACA,OAAO,oBAAoB,IAAI,CAAC,SAAS,KAAK,GAAG,UAAU;AAAA,MAC7D;AAAA,IAAA,CACD;AAAA,EAAA;AAEH,MAAI,aAAa,QAAQ,aAAa,WAAW,GAAG;AAC3C,WAAA;AAAA,EACT;AAGE,SAAA,qBAAC,OAAI,EAAA,WAAU,wFACb,UAAA;AAAA,IAAC,qBAAA,OAAA,EAAI,WAAU,gEACZ,UAAA;AAAA,MACC,SAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAS;AAAA,UAER,UAAA;AAAA,YAAA;AAAA,YAAM;AAAA,YAAE,WAAW,MAAM;AAAA,UAAA;AAAA,QAAA;AAAA,MAC5B;AAAA,MAEF;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA,YACE;AAAA,YACF,WAAW,gBAAgB;AAAA,UAC7B;AAAA,UAEC,UAAA;AAAA,YAAA,CAAC,YACA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACE,GAAG,aAAa;AAAA,gBACjB,WAAW;AAAA;AAAA,kBAEP,eAAe,mCAAmC,iBAAiB;AAAA,gBAEvE,UAAA;AAAA,kBAAA,oBAAC,SAAO,EAAA,GAAG,cAAc,GAAG,IAAI,MAAM;AAAA,sCACrC,KAAE,EAAA,WAAU,iBACV,UAAA,eACG,2BACA,0DACN;AAAA,gBAAA;AAAA,cAAA;AAAA,YACF;AAAA,gCAED,OAAI,EAAA,WAAU,UACZ,UAAa,aAAA,IAAI,CAAC,SACjB;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,WAAU;AAAA,gBAEV,UAAA;AAAA,kBAAC,qBAAA,OAAA,EAAI,WAAU,oCACb,UAAA;AAAA,oBAAA,oBAAC,mBAAkB,EAAA,OAAO,EAAE,UAAU,UAAU;AAAA,oBAChD;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,MAAM,uBAAuB,KAAK,EAAE;AAAA,wBACpC,WAAU;AAAA,wBACV,QAAO;AAAA,wBAEN,UAAK,KAAA;AAAA,sBAAA;AAAA,oBACR;AAAA,kBAAA,GACF;AAAA,kBACC,CAAC,YAAY,KAAK,aAAa,QAC9B;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,SAAS,MAAM,aAAa,KAAK,EAAE;AAAA,sBACnC,WAAU;AAAA,sBAEV,UAAA;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,OAAO,EAAE,UAAU,UAAU,QAAQ,OAAO;AAAA,wBAAA;AAAA,sBAC9C;AAAA,oBAAA;AAAA,kBACF;AAAA,gBAAA;AAAA,cAAA;AAAA,cArBG,KAAK;AAAA,YAwBb,CAAA,GACH;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA,GACF;AAAA,IACC,eACC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,IAAI,OAAO;AAAA,QAEV,UAAA;AAAA,MAAA;AAAA,IACH;AAAA,EAEJ,EAAA,CAAA;AAEJ;"}
@@ -22,6 +22,7 @@ import "../ui/textarea.js";
22
22
  import "../ui/checkbox.js";
23
23
  import "../../Calendar-DWT4e7Th.js";
24
24
  import "../ui/DateTimePicker.js";
25
+ import "../ui/DateTimePicker2.js";
25
26
  import "../ui/DatePicker.js";
26
27
  const FormField = ({
27
28
  label,