@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
@@ -24,6 +24,7 @@ import "../ui/textarea.js";
24
24
  import "../ui/checkbox.js";
25
25
  import "../../Calendar-DWT4e7Th.js";
26
26
  import "../ui/DateTimePicker.js";
27
+ import "../ui/DateTimePicker2.js";
27
28
  import "../ui/DatePicker.js";
28
29
  import { u as useClickAway } from "../../useClickAway-CH9ykBsx.js";
29
30
  function SelectField({
@@ -1 +1 @@
1
- {"version":3,"file":"SelectField.js","sources":["../../../lib/components/form/SelectField.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { IFormFieldGlobalProps, IOptionItem } from \"../../types\";\nimport { MdCheck, MdClose, MdExpandLess, MdExpandMore } from \"react-icons/md\";\nimport { useClickAway } from \"react-use\";\nimport { SpinnerIcon, useFederationContext } from \"../../main\";\nimport { FaSpinner } from \"react-icons/fa\";\n\nexport interface ISelectFieldProps extends IFormFieldGlobalProps {\n options?: IOptionItem[];\n valueKey?: string;\n labelKey?: string | ((item: any) => string);\n fetchUrl?: string;\n loading?: boolean;\n}\n\nexport default function SelectField({\n label,\n name,\n value,\n description,\n onInputChange,\n options,\n placeholder,\n className,\n errors = {},\n clearable,\n required,\n disabled,\n rounded = true,\n fetchUrl,\n valueKey,\n labelKey,\n loading,\n}: ISelectFieldProps) {\n const [isFocused, setIsFocused] = React.useState(false);\n const [isLoading, setIsLoading] = React.useState(false);\n const apiClient = useFederationContext()?.apiClient;\n const [localOptions, setLocalOptions] = React.useState(options);\n\n const ref = React.useRef(null);\n const handleClear = (e: any) => {\n // value;\n e.stopPropagation(); // Add this line\n\n setIsFocused(false);\n onInputChange({\n ...e,\n target: {\n value: \"\",\n name: name,\n },\n });\n };\n\n React.useEffect(() => {\n const fetchOptions = async (fetchUrl: string) => {\n setIsLoading(true);\n const { data } = await apiClient.get(fetchUrl);\n\n // Check if the first item in the data array is a number to determine the data type\n const isArrayOfNumbers = typeof data[0] === \"number\";\n const isInPageable =\n data &&\n typeof data === \"object\" &&\n Object.prototype.hasOwnProperty.call(data, \"content\");\n\n // Transform data based on its type\n const transformedOptions = (isInPageable ? data.content : data).map(\n (item: any) => {\n if (isArrayOfNumbers) {\n // If it's a number, use the number for both value and label\n return { value: item, label: item.toString() };\n } else {\n // Otherwise, extract using predefined keys or defaults\n return {\n value: item[valueKey || \"id\"],\n label:\n labelKey instanceof Function && labelKey !== undefined\n ? labelKey(item)\n : item[labelKey as string],\n };\n }\n }\n );\n\n setLocalOptions([\n { value: null, label: \" \" }, // Add an empty option as the first item\n ...transformedOptions,\n ]);\n setIsLoading(false);\n };\n\n if (fetchUrl) fetchOptions(fetchUrl);\n if (options) setLocalOptions(options);\n }, [fetchUrl, options, apiClient, valueKey, labelKey]); // ensure valueKey and labelKey are also in the dependency array if they are dynamic\n\n const handleToggleFocus = () => {\n setIsFocused((prev) => !prev);\n };\n\n useClickAway(ref, () => {\n setIsFocused(false);\n });\n\n const hangleChange = (option: IOptionItem) => {\n const tmp: any = {\n target: {\n value: option.value,\n name: name,\n },\n };\n\n onInputChange(tmp);\n setIsFocused(false);\n };\n const currentlySelectedOption = React.useMemo(() => {\n if (value === undefined || value === \"\") return null;\n return localOptions?.find((option) => option.value == value);\n }, [localOptions, value]);\n\n const listOfOptions = () => {\n if (!localOptions) return [];\n return (\n <div\n id=\"list\"\n className=\"max-h-[390px] min-w-20 w-auto whitespace-nowrap absolute z-[100000] -top-[1px] mt-[4px] bg-white rounded-lg shadow-xl border\n border-gray-200 justify-start items-start inline-flex overflow-auto cursor-default\"\n >\n <div className=\"grow shrink basis-0 py-1 flex-col justify-start items-start inline-flex\">\n {localOptions.map((option, index) => {\n return (\n <div\n className=\"group self-stretch px-1.5 py-px justify-start items-center inline-flex hover:bg-gray-50 \"\n onClick={() => hangleChange(option)}\n key={index}\n >\n <div className=\"grow shrink basis-0 px-1 py-2 rounded-md flex-col justify-start items-start gap-2 inline-flex\">\n <div className=\"self-stretch justify-start items-center gap-2 inline-flex\">\n <div className=\"text-muted-foreground text-sm font-normal leading-normal\">\n {option.label}\n </div>\n {option.description && (\n <div className=\"text-slate-600 sm-base font-normal leading-normal\">\n {option.description}\n </div>\n )}\n </div>\n </div>\n <div className=\"w-5 h-5 relative\">\n {option.value === value && value !== \"\" && (\n <MdCheck size={22} className=\"text-primary\" />\n )}{\" \"}\n {option.value !== value && (\n <MdCheck\n size={22}\n className=\"text-transparent group-hover:text-gray-300\"\n />\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n };\n\n return (\n <>\n <div\n className={\n \"w-full min-h-30 flex-col justify-start items-start gap-0inline-flex \" +\n className\n }\n id=\"selectField\"\n ref={ref}\n >\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 font-medium leading-tight\"\n htmlFor={name}\n >\n {label} {required ? \"*\" : \"\"}\n </label>\n )}\n <div\n className={`self-stretch w-full px-3 py-1 bg-white border justify-start items-center gap-0 inline-flex outline-none \n ${isFocused ? \"outline-4 outline-indigo-200 outline-offset-0 border-indigo-300 \" : \"\"}\n ${\n isFocused && errors[name]?.message\n ? \"outline-4 outline-red-200 outline-offset-0 border-none\"\n : \"\"\n } \n ${rounded ? \" rounded-lg \" : \" rounded-none \"}\n ${!isFocused && errors[name]?.message ? \"border-red-200\" : \"\"} \n ${disabled || isLoading ? \"opacity-80 cursor-not-allowed \" : \"\"}\n `}\n onClick={() =>\n !disabled && !isLoading ? handleToggleFocus() : null\n }\n >\n <div className=\"grow shrink basis-0 min-h-[32px] justify-start items-center gap-0 flex whitespace-nowrap w-[calc(100%-40px)] \">\n <div\n className=\"text-muted-foreground text-sm font-normal leading-normal text-ellipsis overflow-hidden w-full\"\n id={name}\n >\n {currentlySelectedOption?.label}\n {!currentlySelectedOption?.label && placeholder && (\n <span className=\"text-muted-foreground font-normal\">\n {\" \"}\n {placeholder}\n </span>\n )}\n </div>\n <div className=\"text-slate-600 text-base font-normal leading-normal\">\n {currentlySelectedOption?.description}\n </div>\n </div>\n {clearable &&\n value !== \"\" &&\n value !== null &&\n value !== undefined &&\n !disabled && (\n <div\n className=\"w-6 h-6 relative cursor-pointer \"\n id={name + \":clear\"}\n onClick={handleClear}\n >\n <div className=\"absolute inset-0 flex items-center justify-center hover:bg-gray-100 w-6 rounded-full text-lg\">\n <MdClose />\n </div>{\" \"}\n </div>\n )}\n {isLoading === true ||\n (loading && (\n <div className=\"w-6 h-6 relative flex items-center justify-center align-middle\">\n <SpinnerIcon icon={<FaSpinner />} />\n </div>\n ))}\n\n <div className=\"w-6 h-6 relative cursor-pointer \">\n <div className=\"absolute inset-0 flex items-center justify-center hover:bg-gray-100 w-6 rounded-full text-lg\">\n {isFocused && !disabled && <MdExpandLess />}\n {!isFocused && !disabled && <MdExpandMore />}\n </div>\n </div>\n </div>\n </div>{\" \"}\n <div className=\"w-full relative\">{isFocused && listOfOptions()}</div>\n {description && !isFocused && (\n <div\n className=\"self-stretch text-slate-600 text-sm font-normal leading-tight\"\n id={name + \":description\"}\n >\n {description}\n </div>\n )}\n {errors[name] && (\n <div\n className=\"HintText self-stretch text-red-600 text-sm font-normal leading-tight\"\n id={name + \":error\"}\n >\n {errors[name]?.message}\n </div>\n )}\n </div>\n </>\n );\n}\n"],"names":["fetchUrl"],"mappings":"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"}
1
+ {"version":3,"file":"SelectField.js","sources":["../../../lib/components/form/SelectField.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { IFormFieldGlobalProps, IOptionItem } from \"../../types\";\nimport { MdCheck, MdClose, MdExpandLess, MdExpandMore } from \"react-icons/md\";\nimport { useClickAway } from \"react-use\";\nimport { SpinnerIcon, useFederationContext } from \"../../main\";\nimport { FaSpinner } from \"react-icons/fa\";\n\nexport interface ISelectFieldProps extends IFormFieldGlobalProps {\n options?: IOptionItem[];\n valueKey?: string;\n labelKey?: string | ((item: any) => string);\n fetchUrl?: string;\n loading?: boolean;\n}\n\nexport default function SelectField({\n label,\n name,\n value,\n description,\n onInputChange,\n options,\n placeholder,\n className,\n errors = {},\n clearable,\n required,\n disabled,\n rounded = true,\n fetchUrl,\n valueKey,\n labelKey,\n loading,\n}: ISelectFieldProps) {\n const [isFocused, setIsFocused] = React.useState(false);\n const [isLoading, setIsLoading] = React.useState(false);\n const apiClient = useFederationContext()?.apiClient;\n const [localOptions, setLocalOptions] = React.useState(options);\n\n const ref = React.useRef(null);\n const handleClear = (e: any) => {\n // value;\n e.stopPropagation(); // Add this line\n\n setIsFocused(false);\n onInputChange({\n ...e,\n target: {\n value: \"\",\n name: name,\n },\n });\n };\n\n React.useEffect(() => {\n const fetchOptions = async (fetchUrl: string) => {\n setIsLoading(true);\n const { data } = await apiClient.get(fetchUrl);\n\n // Check if the first item in the data array is a number to determine the data type\n const isArrayOfNumbers = typeof data[0] === \"number\";\n const isInPageable =\n data &&\n typeof data === \"object\" &&\n Object.prototype.hasOwnProperty.call(data, \"content\");\n\n // Transform data based on its type\n const transformedOptions = (isInPageable ? data.content : data).map(\n (item: any) => {\n if (isArrayOfNumbers) {\n // If it's a number, use the number for both value and label\n return { value: item, label: item.toString() };\n } else {\n // Otherwise, extract using predefined keys or defaults\n return {\n value: item[valueKey || \"id\"],\n label:\n labelKey instanceof Function && labelKey !== undefined\n ? labelKey(item)\n : item[labelKey as string],\n };\n }\n }\n );\n\n setLocalOptions([\n { value: null, label: \" \" }, // Add an empty option as the first item\n ...transformedOptions,\n ]);\n setIsLoading(false);\n };\n\n if (fetchUrl) fetchOptions(fetchUrl);\n if (options) setLocalOptions(options);\n }, [fetchUrl, options, apiClient, valueKey, labelKey]); // ensure valueKey and labelKey are also in the dependency array if they are dynamic\n\n const handleToggleFocus = () => {\n setIsFocused((prev) => !prev);\n };\n\n useClickAway(ref, () => {\n setIsFocused(false);\n });\n\n const hangleChange = (option: IOptionItem) => {\n const tmp: any = {\n target: {\n value: option.value,\n name: name,\n },\n };\n\n onInputChange(tmp);\n setIsFocused(false);\n };\n const currentlySelectedOption = React.useMemo(() => {\n if (value === undefined || value === \"\") return null;\n return localOptions?.find((option) => option.value == value);\n }, [localOptions, value]);\n\n const listOfOptions = () => {\n if (!localOptions) return [];\n return (\n <div\n id=\"list\"\n className=\"max-h-[390px] min-w-20 w-auto whitespace-nowrap absolute z-[100000] -top-[1px] mt-[4px] bg-white rounded-lg shadow-xl border\n border-gray-200 justify-start items-start inline-flex overflow-auto cursor-default\"\n >\n <div className=\"grow shrink basis-0 py-1 flex-col justify-start items-start inline-flex\">\n {localOptions.map((option, index) => {\n return (\n <div\n className=\"group self-stretch px-1.5 py-px justify-start items-center inline-flex hover:bg-gray-50 \"\n onClick={() => hangleChange(option)}\n key={index}\n >\n <div className=\"grow shrink basis-0 px-1 py-2 rounded-md flex-col justify-start items-start gap-2 inline-flex\">\n <div className=\"self-stretch justify-start items-center gap-2 inline-flex\">\n <div className=\"text-muted-foreground text-sm font-normal leading-normal\">\n {option.label}\n </div>\n {option.description && (\n <div className=\"text-slate-600 sm-base font-normal leading-normal\">\n {option.description}\n </div>\n )}\n </div>\n </div>\n <div className=\"w-5 h-5 relative\">\n {option.value === value && value !== \"\" && (\n <MdCheck size={22} className=\"text-primary\" />\n )}{\" \"}\n {option.value !== value && (\n <MdCheck\n size={22}\n className=\"text-transparent group-hover:text-gray-300\"\n />\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n };\n\n return (\n <>\n <div\n className={\n \"w-full min-h-30 flex-col justify-start items-start gap-0inline-flex \" +\n className\n }\n id=\"selectField\"\n ref={ref}\n >\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 font-medium leading-tight\"\n htmlFor={name}\n >\n {label} {required ? \"*\" : \"\"}\n </label>\n )}\n <div\n className={`self-stretch w-full px-3 py-1 bg-white border justify-start items-center gap-0 inline-flex outline-none \n ${isFocused ? \"outline-4 outline-indigo-200 outline-offset-0 border-indigo-300 \" : \"\"}\n ${\n isFocused && errors[name]?.message\n ? \"outline-4 outline-red-200 outline-offset-0 border-none\"\n : \"\"\n } \n ${rounded ? \" rounded-lg \" : \" rounded-none \"}\n ${!isFocused && errors[name]?.message ? \"border-red-200\" : \"\"} \n ${disabled || isLoading ? \"opacity-80 cursor-not-allowed \" : \"\"}\n `}\n onClick={() =>\n !disabled && !isLoading ? handleToggleFocus() : null\n }\n >\n <div className=\"grow shrink basis-0 min-h-[32px] justify-start items-center gap-0 flex whitespace-nowrap w-[calc(100%-40px)] \">\n <div\n className=\"text-muted-foreground text-sm font-normal leading-normal text-ellipsis overflow-hidden w-full\"\n id={name}\n >\n {currentlySelectedOption?.label}\n {!currentlySelectedOption?.label && placeholder && (\n <span className=\"text-muted-foreground font-normal\">\n {\" \"}\n {placeholder}\n </span>\n )}\n </div>\n <div className=\"text-slate-600 text-base font-normal leading-normal\">\n {currentlySelectedOption?.description}\n </div>\n </div>\n {clearable &&\n value !== \"\" &&\n value !== null &&\n value !== undefined &&\n !disabled && (\n <div\n className=\"w-6 h-6 relative cursor-pointer \"\n id={name + \":clear\"}\n onClick={handleClear}\n >\n <div className=\"absolute inset-0 flex items-center justify-center hover:bg-gray-100 w-6 rounded-full text-lg\">\n <MdClose />\n </div>{\" \"}\n </div>\n )}\n {isLoading === true ||\n (loading && (\n <div className=\"w-6 h-6 relative flex items-center justify-center align-middle\">\n <SpinnerIcon icon={<FaSpinner />} />\n </div>\n ))}\n\n <div className=\"w-6 h-6 relative cursor-pointer \">\n <div className=\"absolute inset-0 flex items-center justify-center hover:bg-gray-100 w-6 rounded-full text-lg\">\n {isFocused && !disabled && <MdExpandLess />}\n {!isFocused && !disabled && <MdExpandMore />}\n </div>\n </div>\n </div>\n </div>{\" \"}\n <div className=\"w-full relative\">{isFocused && listOfOptions()}</div>\n {description && !isFocused && (\n <div\n className=\"self-stretch text-slate-600 text-sm font-normal leading-tight\"\n id={name + \":description\"}\n >\n {description}\n </div>\n )}\n {errors[name] && (\n <div\n className=\"HintText self-stretch text-red-600 text-sm font-normal leading-tight\"\n id={name + \":error\"}\n >\n {errors[name]?.message}\n </div>\n )}\n </div>\n </>\n );\n}\n"],"names":["fetchUrl"],"mappings":"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"}
@@ -20,6 +20,7 @@ import "../ui/textarea.js";
20
20
  import "../ui/checkbox.js";
21
21
  import "../../Calendar-DWT4e7Th.js";
22
22
  import "../ui/DateTimePicker.js";
23
+ import "../ui/DateTimePicker2.js";
23
24
  import "../ui/DatePicker.js";
24
25
  function Neoptimizovano() {
25
26
  return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2 flex-1 items-center justify-center min-h-[50vh] text-center", children: [
@@ -1 +1 @@
1
- {"version":3,"file":"Neoptimizovano.js","sources":["../../../lib/components/layout/Neoptimizovano.tsx"],"sourcesContent":["import { ButtonCN } from \"../../main\";\n\nexport default function Neoptimizovano() {\n return (\n <div className=\"flex flex-col gap-2 flex-1 items-center justify-center min-h-[50vh] text-center\">\n <h1>Není optimalizováno pro toto rozlišení</h1>\n <ButtonCN onClick={() => history.back()}>Zpět</ButtonCN>\n </div>\n );\n}\n"],"names":["ButtonCN"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAEA,SAAwB,iBAAiB;AAErC,SAAA,qBAAC,OAAI,EAAA,WAAU,mFACb,UAAA;AAAA,IAAA,oBAAC,QAAG,UAAsC,yCAAA,CAAA;AAAA,wBACzCA,QAAS,EAAA,SAAS,MAAM,QAAQ,QAAQ,UAAI,QAAA;AAAA,EAC/C,EAAA,CAAA;AAEJ;"}
1
+ {"version":3,"file":"Neoptimizovano.js","sources":["../../../lib/components/layout/Neoptimizovano.tsx"],"sourcesContent":["import { ButtonCN } from \"../../main\";\n\nexport default function Neoptimizovano() {\n return (\n <div className=\"flex flex-col gap-2 flex-1 items-center justify-center min-h-[50vh] text-center\">\n <h1>Není optimalizováno pro toto rozlišení</h1>\n <ButtonCN onClick={() => history.back()}>Zpět</ButtonCN>\n </div>\n );\n}\n"],"names":["ButtonCN"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAEA,SAAwB,iBAAiB;AAErC,SAAA,qBAAC,OAAI,EAAA,WAAU,mFACb,UAAA;AAAA,IAAA,oBAAC,QAAG,UAAsC,yCAAA,CAAA;AAAA,wBACzCA,QAAS,EAAA,SAAS,MAAM,QAAQ,QAAQ,UAAI,QAAA;AAAA,EAC/C,EAAA,CAAA;AAEJ;"}
@@ -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
  import IconInCircle from "../layout/IconInCircle.js";
30
31
  const approverRoleGroups = [
@@ -1 +1 @@
1
- {"version":3,"file":"ProfileOverview.js","sources":["../../../lib/components/profiles/ProfileOverview.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport SectionTitle from \"../layout/SectionTitle\";\nimport {\n EApproverRoles,\n IProfileApprover,\n IStep,\n getFullName,\n handleErrors,\n useFederationContext,\n} from \"../../main\";\nimport { AxiosResponse } from \"axios\";\nimport IconInCircle from \"../layout/IconInCircle\";\n\ninterface ProfileOverviewProps {\n employeeId?: number;\n onProfileApproversChange?: (data: IProfileApprover[]) => void;\n steps: IStep[];\n}\n\ninterface IApproverRoleGroup {\n name: string;\n roles: EApproverRoles[];\n all: boolean;\n parallel: boolean;\n stepType: number;\n}\n\nconst approverRoleGroups: IApproverRoleGroup[] = [\n {\n name: \"Předschvalovatelé\",\n roles: [EApproverRoles.predschvalovatel],\n all: true,\n parallel: true,\n stepType: 1,\n },\n {\n name: \"Schvalovatelé\",\n roles: [\n EApproverRoles.vedouci,\n EApproverRoles.zastupce,\n EApproverRoles.zastupce9,\n EApproverRoles.vyssiSchvalovatel,\n EApproverRoles.vyssiSchvalovatelZastupce,\n EApproverRoles.vyssiSchvalovatelZastupce9,\n ],\n all: false,\n parallel: true,\n stepType: 2,\n },\n {\n name: \"Docházkový vedoucí\",\n roles: [EApproverRoles.dochazkovyVedouci],\n all: true,\n parallel: false,\n stepType: 3,\n },\n];\n\nexport default function ProfileOverview({\n employeeId,\n onProfileApproversChange,\n steps,\n}: ProfileOverviewProps) {\n const [profileApprovers, setProfileApprovers] = useState<\n Array<IProfileApprover>\n >([]);\n const context = useFederationContext();\n\n const currentApprovers = useMemo(() => {\n return approverRoleGroups.map((group) => {\n const groupApprovers = profileApprovers.filter((approver) =>\n group.roles.includes(approver.role)\n );\n\n const groupApprovedSteps = steps.filter(\n (step) =>\n step.type == group.stepType &&\n groupApprovers.some(\n (approver) =>\n step.employee.employeeId == approver?.approver?.employeeId\n )\n );\n\n return {\n ...group,\n numberOfApprovers: groupApprovers.length,\n numberOfApprovedSteps: groupApprovedSteps.length,\n isComplete:\n (group.all && groupApprovers.length == groupApprovedSteps.length) ||\n (!group.all && groupApprovedSteps.length > 0),\n };\n });\n }, [profileApprovers, steps]);\n\n useEffect(() => {\n context.apiClient\n .get<IProfileApprover[]>(\n \"/timeoff/approve-profile\" + (employeeId ? \"/\" + employeeId : \"\")\n )\n .then((response: AxiosResponse) => {\n setProfileApprovers(response.data);\n })\n .catch((error) => {\n handleErrors(\n error,\n context.emitter,\n \"Nepodařilo se dohledat schvalovací profil pro uživatele \" +\n employeeId\n );\n console.error(\"Error submitting form:\", error);\n });\n }, [employeeId, context.emitter, context.apiClient]);\n\n const decisionsTranslations = (decision: string): string | null => {\n const translations: { [key: string]: string } = {\n approved: \"Schváleno\",\n rejected: \"Zamítnuto\",\n cancelled: \"Stornováno\",\n evided: \"Zaevidováno\",\n };\n\n return translations[decision] || null;\n };\n // pri nacteni profileApprovers se muze dat vedet parent componente inbfo o aktualnich schvalovatelich\n useEffect(() => {\n if (onProfileApproversChange) onProfileApproversChange(profileApprovers);\n }, [profileApprovers, onProfileApproversChange]);\n\n const findStep = (\n steps: IStep[],\n group: IApproverRoleGroup,\n row: IProfileApprover\n ) => {\n return steps.find(\n (step) =>\n step.type == group.stepType &&\n step.employee.employeeId == row.position?.employee?.employeeId\n );\n };\n\n return (\n <>\n <SectionTitle>Postup schvalování</SectionTitle>\n <div className=\"flex gap-4\">\n {currentApprovers.map((group, index) => (\n <div\n key={group.name}\n className={\n \"w-full lg:w-1/3 rounded-lg shadow-xl p-5 border gap-4 flex flex-col \"\n }\n >\n <div className=\"flex justify-between\">\n <h3 className=\"text-xl font-bold\">\n {group.name} - {index}\n </h3>\n\n <IconInCircle\n isComplete={group.isComplete}\n title={\n group.numberOfApprovedSteps + \" / \" + group.numberOfApprovers\n }\n isPending={!group.isComplete}\n ></IconInCircle>\n </div>\n {profileApprovers\n .filter((it) => group.roles.includes(it.role))\n .map((row, index) => (\n <div\n key={index}\n className=\" border rounded-lg p-4 flex justify-between gap-5\"\n >\n <div>\n <h3 className=\"\">\n {getFullName(row.position?.employee, true, true)}\n </h3>\n <p className=\"text-sm \">{row.roleTxt}</p>\n {findStep(steps, group, row) && (\n <>\n <p className=\"text-sm \"></p>{\" \"}\n {findStep(steps, group, row)?.decision && (\n <p className=\"text-sm \">\n {decisionsTranslations(\n findStep(steps, group, row)?.decision || \"\"\n )}{\" \"}\n (\n {new Date(\n findStep(steps, group, row)?.date || 0\n ).toLocaleString()}\n )\n </p>\n )}\n {findStep(steps, group, row)?.comment && (\n <p className=\"text-sm \">\n <b>Komentář</b>:{\" \"}\n {findStep(steps, group, row)?.comment}{\" \"}\n </p>\n )}\n </>\n )}\n </div>\n <IconInCircle\n isComplete={findStep(steps, group, row) != null}\n isPending={!group.isComplete}\n />\n </div>\n ))}\n </div>\n ))}\n </div>\n </>\n );\n}\n"],"names":["steps","index"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,MAAM,qBAA2C;AAAA,EAC/C;AAAA,IACE,MAAM;AAAA,IACN,OAAO,CAAC,eAAe,gBAAgB;AAAA,IACvC,KAAK;AAAA,IACL,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,MACL,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe;AAAA,IACjB;AAAA,IACA,KAAK;AAAA,IACL,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO,CAAC,eAAe,iBAAiB;AAAA,IACxC,KAAK;AAAA,IACL,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AACF;AAEA,SAAwB,gBAAgB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAE9C,CAAE,CAAA;AACJ,QAAM,UAAU;AAEV,QAAA,mBAAmB,QAAQ,MAAM;AAC9B,WAAA,mBAAmB,IAAI,CAAC,UAAU;AACvC,YAAM,iBAAiB,iBAAiB;AAAA,QAAO,CAAC,aAC9C,MAAM,MAAM,SAAS,SAAS,IAAI;AAAA,MAAA;AAGpC,YAAM,qBAAqB,MAAM;AAAA,QAC/B,CAAC,SACC,KAAK,QAAQ,MAAM,YACnB,eAAe;AAAA,UACb,CAAC,aACC;;AAAA,wBAAK,SAAS,gBAAc,0CAAU,aAAV,mBAAoB;AAAA;AAAA,QACpD;AAAA,MAAA;AAGG,aAAA;AAAA,QACL,GAAG;AAAA,QACH,mBAAmB,eAAe;AAAA,QAClC,uBAAuB,mBAAmB;AAAA,QAC1C,YACG,MAAM,OAAO,eAAe,UAAU,mBAAmB,UACzD,CAAC,MAAM,OAAO,mBAAmB,SAAS;AAAA,MAAA;AAAA,IAC/C,CACD;AAAA,EAAA,GACA,CAAC,kBAAkB,KAAK,CAAC;AAE5B,YAAU,MAAM;AACd,YAAQ,UACL;AAAA,MACC,8BAA8B,aAAa,MAAM,aAAa;AAAA,IAAA,EAE/D,KAAK,CAAC,aAA4B;AACjC,0BAAoB,SAAS,IAAI;AAAA,IAAA,CAClC,EACA,MAAM,CAAC,UAAU;AAChB;AAAA,QACE;AAAA,QACA,QAAQ;AAAA,QACR,6DACE;AAAA,MAAA;AAEI,cAAA,MAAM,0BAA0B,KAAK;AAAA,IAAA,CAC9C;AAAA,EAAA,GACF,CAAC,YAAY,QAAQ,SAAS,QAAQ,SAAS,CAAC;AAE7C,QAAA,wBAAwB,CAAC,aAAoC;AACjE,UAAM,eAA0C;AAAA,MAC9C,UAAU;AAAA,MACV,UAAU;AAAA,MACV,WAAW;AAAA,MACX,QAAQ;AAAA,IAAA;AAGH,WAAA,aAAa,QAAQ,KAAK;AAAA,EAAA;AAGnC,YAAU,MAAM;AACV,QAAA;AAA0B,+BAAyB,gBAAgB;AAAA,EAAA,GACtE,CAAC,kBAAkB,wBAAwB,CAAC;AAE/C,QAAM,WAAW,CACfA,QACA,OACA,QACG;AACH,WAAOA,OAAM;AAAA,MACX,CAAC,SACC;;AAAA,oBAAK,QAAQ,MAAM,YACnB,KAAK,SAAS,gBAAc,eAAI,aAAJ,mBAAc,aAAd,mBAAwB;AAAA;AAAA,IAAA;AAAA,EACxD;AAGF,SAEI,qBAAA,UAAA,EAAA,UAAA;AAAA,IAAA,oBAAC,gBAAa,UAAkB,qBAAA,CAAA;AAAA,IAChC,oBAAC,SAAI,WAAU,cACZ,2BAAiB,IAAI,CAAC,OAAO,UAC5B;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WACE;AAAA,QAGF,UAAA;AAAA,UAAC,qBAAA,OAAA,EAAI,WAAU,wBACb,UAAA;AAAA,YAAC,qBAAA,MAAA,EAAG,WAAU,qBACX,UAAA;AAAA,cAAM,MAAA;AAAA,cAAK;AAAA,cAAI;AAAA,YAAA,GAClB;AAAA,YAEA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,YAAY,MAAM;AAAA,gBAClB,OACE,MAAM,wBAAwB,QAAQ,MAAM;AAAA,gBAE9C,WAAW,CAAC,MAAM;AAAA,cAAA;AAAA,YACnB;AAAA,UAAA,GACH;AAAA,UACC,iBACE,OAAO,CAAC,OAAO,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,EAC5C,IAAI,CAAC,KAAKC,WACT;;AAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,WAAU;AAAA,gBAEV,UAAA;AAAA,kBAAA,qBAAC,OACC,EAAA,UAAA;AAAA,oBAAC,oBAAA,MAAA,EAAG,WAAU,IACX,UAAA,aAAY,SAAI,aAAJ,mBAAc,UAAU,MAAM,IAAI,EACjD,CAAA;AAAA,oBACC,oBAAA,KAAA,EAAE,WAAU,YAAY,cAAI,SAAQ;AAAA,oBACpC,SAAS,OAAO,OAAO,GAAG,KAEvB,qBAAA,UAAA,EAAA,UAAA;AAAA,sBAAC,oBAAA,KAAA,EAAE,WAAU,WAAW,CAAA;AAAA,sBAAK;AAAA,wBAC5B,cAAS,OAAO,OAAO,GAAG,MAA1B,mBAA6B,aAC5B,qBAAC,KAAE,EAAA,WAAU,YACV,UAAA;AAAA,wBAAA;AAAA,4BACC,cAAS,OAAO,OAAO,GAAG,MAA1B,mBAA6B,aAAY;AAAA,wBAC3C;AAAA,wBAAG;AAAA,wBAAI;AAAA,wBAEN,IAAI;AAAA,4BACH,cAAS,OAAO,OAAO,GAAG,MAA1B,mBAA6B,SAAQ;AAAA,0BACrC,eAAe;AAAA,wBAAE;AAAA,sBAAA,GAErB;AAAA,wBAED,cAAS,OAAO,OAAO,GAAG,MAA1B,mBAA6B,YAC5B,qBAAC,KAAE,EAAA,WAAU,YACX,UAAA;AAAA,wBAAA,oBAAC,OAAE,UAAQ,WAAA,CAAA;AAAA,wBAAI;AAAA,wBAAE;AAAA,yBAChB,cAAS,OAAO,OAAO,GAAG,MAA1B,mBAA6B;AAAA,wBAAS;AAAA,sBAAA,GACzC;AAAA,oBAAA,GAEJ;AAAA,kBAAA,GAEJ;AAAA,kBACA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,YAAY,SAAS,OAAO,OAAO,GAAG,KAAK;AAAA,sBAC3C,WAAW,CAAC,MAAM;AAAA,oBAAA;AAAA,kBACpB;AAAA,gBAAA;AAAA,cAAA;AAAA,cAnCKA;AAAAA,YAAA;AAAA,WAqCR;AAAA,QAAA;AAAA,MAAA;AAAA,MA3DE,MAAM;AAAA,IA6Dd,CAAA,GACH;AAAA,EACF,EAAA,CAAA;AAEJ;"}
1
+ {"version":3,"file":"ProfileOverview.js","sources":["../../../lib/components/profiles/ProfileOverview.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport SectionTitle from \"../layout/SectionTitle\";\nimport {\n EApproverRoles,\n IProfileApprover,\n IStep,\n getFullName,\n handleErrors,\n useFederationContext,\n} from \"../../main\";\nimport { AxiosResponse } from \"axios\";\nimport IconInCircle from \"../layout/IconInCircle\";\n\ninterface ProfileOverviewProps {\n employeeId?: number;\n onProfileApproversChange?: (data: IProfileApprover[]) => void;\n steps: IStep[];\n}\n\ninterface IApproverRoleGroup {\n name: string;\n roles: EApproverRoles[];\n all: boolean;\n parallel: boolean;\n stepType: number;\n}\n\nconst approverRoleGroups: IApproverRoleGroup[] = [\n {\n name: \"Předschvalovatelé\",\n roles: [EApproverRoles.predschvalovatel],\n all: true,\n parallel: true,\n stepType: 1,\n },\n {\n name: \"Schvalovatelé\",\n roles: [\n EApproverRoles.vedouci,\n EApproverRoles.zastupce,\n EApproverRoles.zastupce9,\n EApproverRoles.vyssiSchvalovatel,\n EApproverRoles.vyssiSchvalovatelZastupce,\n EApproverRoles.vyssiSchvalovatelZastupce9,\n ],\n all: false,\n parallel: true,\n stepType: 2,\n },\n {\n name: \"Docházkový vedoucí\",\n roles: [EApproverRoles.dochazkovyVedouci],\n all: true,\n parallel: false,\n stepType: 3,\n },\n];\n\nexport default function ProfileOverview({\n employeeId,\n onProfileApproversChange,\n steps,\n}: ProfileOverviewProps) {\n const [profileApprovers, setProfileApprovers] = useState<\n Array<IProfileApprover>\n >([]);\n const context = useFederationContext();\n\n const currentApprovers = useMemo(() => {\n return approverRoleGroups.map((group) => {\n const groupApprovers = profileApprovers.filter((approver) =>\n group.roles.includes(approver.role)\n );\n\n const groupApprovedSteps = steps.filter(\n (step) =>\n step.type == group.stepType &&\n groupApprovers.some(\n (approver) =>\n step.employee.employeeId == approver?.approver?.employeeId\n )\n );\n\n return {\n ...group,\n numberOfApprovers: groupApprovers.length,\n numberOfApprovedSteps: groupApprovedSteps.length,\n isComplete:\n (group.all && groupApprovers.length == groupApprovedSteps.length) ||\n (!group.all && groupApprovedSteps.length > 0),\n };\n });\n }, [profileApprovers, steps]);\n\n useEffect(() => {\n context.apiClient\n .get<IProfileApprover[]>(\n \"/timeoff/approve-profile\" + (employeeId ? \"/\" + employeeId : \"\")\n )\n .then((response: AxiosResponse) => {\n setProfileApprovers(response.data);\n })\n .catch((error) => {\n handleErrors(\n error,\n context.emitter,\n \"Nepodařilo se dohledat schvalovací profil pro uživatele \" +\n employeeId\n );\n console.error(\"Error submitting form:\", error);\n });\n }, [employeeId, context.emitter, context.apiClient]);\n\n const decisionsTranslations = (decision: string): string | null => {\n const translations: { [key: string]: string } = {\n approved: \"Schváleno\",\n rejected: \"Zamítnuto\",\n cancelled: \"Stornováno\",\n evided: \"Zaevidováno\",\n };\n\n return translations[decision] || null;\n };\n // pri nacteni profileApprovers se muze dat vedet parent componente inbfo o aktualnich schvalovatelich\n useEffect(() => {\n if (onProfileApproversChange) onProfileApproversChange(profileApprovers);\n }, [profileApprovers, onProfileApproversChange]);\n\n const findStep = (\n steps: IStep[],\n group: IApproverRoleGroup,\n row: IProfileApprover\n ) => {\n return steps.find(\n (step) =>\n step.type == group.stepType &&\n step.employee.employeeId == row.position?.employee?.employeeId\n );\n };\n\n return (\n <>\n <SectionTitle>Postup schvalování</SectionTitle>\n <div className=\"flex gap-4\">\n {currentApprovers.map((group, index) => (\n <div\n key={group.name}\n className={\n \"w-full lg:w-1/3 rounded-lg shadow-xl p-5 border gap-4 flex flex-col \"\n }\n >\n <div className=\"flex justify-between\">\n <h3 className=\"text-xl font-bold\">\n {group.name} - {index}\n </h3>\n\n <IconInCircle\n isComplete={group.isComplete}\n title={\n group.numberOfApprovedSteps + \" / \" + group.numberOfApprovers\n }\n isPending={!group.isComplete}\n ></IconInCircle>\n </div>\n {profileApprovers\n .filter((it) => group.roles.includes(it.role))\n .map((row, index) => (\n <div\n key={index}\n className=\" border rounded-lg p-4 flex justify-between gap-5\"\n >\n <div>\n <h3 className=\"\">\n {getFullName(row.position?.employee, true, true)}\n </h3>\n <p className=\"text-sm \">{row.roleTxt}</p>\n {findStep(steps, group, row) && (\n <>\n <p className=\"text-sm \"></p>{\" \"}\n {findStep(steps, group, row)?.decision && (\n <p className=\"text-sm \">\n {decisionsTranslations(\n findStep(steps, group, row)?.decision || \"\"\n )}{\" \"}\n (\n {new Date(\n findStep(steps, group, row)?.date || 0\n ).toLocaleString()}\n )\n </p>\n )}\n {findStep(steps, group, row)?.comment && (\n <p className=\"text-sm \">\n <b>Komentář</b>:{\" \"}\n {findStep(steps, group, row)?.comment}{\" \"}\n </p>\n )}\n </>\n )}\n </div>\n <IconInCircle\n isComplete={findStep(steps, group, row) != null}\n isPending={!group.isComplete}\n />\n </div>\n ))}\n </div>\n ))}\n </div>\n </>\n );\n}\n"],"names":["steps","index"],"mappings":"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"}
@@ -1,28 +1,15 @@
1
1
  import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { Button } from "./button.js";
3
- import { t as toDate, c as constructFrom, s as setMonth, f as format, C as Calendar, i as isValid } from "../../Calendar-DWT4e7Th.js";
3
+ import { f as format, C as Calendar, i as isValid } from "../../Calendar-DWT4e7Th.js";
4
4
  import { P as Popover, a as PopoverTrigger, b as PopoverContent, c as PopoverClose } from "../../popover-DpJhfyvx.js";
5
5
  import { cn } from "../../utils/utils.js";
6
6
  import React__default, { forwardRef, useEffect } from "react";
7
7
  import { I as Input } from "../../input-Cm_FjJOF.js";
8
8
  import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from "./select.js";
9
- import { c as createLucideIcon } from "../../createLucideIcon-KSoQd4Wi.js";
9
+ import { C as CalendarClock, s as set } from "../../set-BOUTbzpR.js";
10
10
  import { X } from "../../x-DciOkaU0.js";
11
+ import { c as createLucideIcon } from "../../createLucideIcon-KSoQd4Wi.js";
11
12
  import { p as parse } from "../../parse-D2yb8751.js";
12
- /**
13
- * @license lucide-react v0.456.0 - ISC
14
- *
15
- * This source code is licensed under the ISC license.
16
- * See the LICENSE file in the root directory of this source tree.
17
- */
18
- const CalendarClock = createLucideIcon("CalendarClock", [
19
- ["path", { d: "M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5", key: "1osxxc" }],
20
- ["path", { d: "M16 2v4", key: "4m81vk" }],
21
- ["path", { d: "M8 2v4", key: "1cmpym" }],
22
- ["path", { d: "M3 10h5", key: "r794hk" }],
23
- ["path", { d: "M17.5 17.5 16 16.3V14", key: "akvzfd" }],
24
- ["circle", { cx: "16", cy: "16", r: "6", key: "qoo3c4" }]
25
- ]);
26
13
  /**
27
14
  * @license lucide-react v0.456.0 - ISC
28
15
  *
@@ -33,34 +20,6 @@ const Clock = createLucideIcon("Clock", [
33
20
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
34
21
  ["polyline", { points: "12 6 12 12 16 14", key: "68esgv" }]
35
22
  ]);
36
- function set(date, values) {
37
- let _date = toDate(date);
38
- if (isNaN(+_date)) {
39
- return constructFrom(date, NaN);
40
- }
41
- if (values.year != null) {
42
- _date.setFullYear(values.year);
43
- }
44
- if (values.month != null) {
45
- _date = setMonth(_date, values.month);
46
- }
47
- if (values.date != null) {
48
- _date.setDate(values.date);
49
- }
50
- if (values.hours != null) {
51
- _date.setHours(values.hours);
52
- }
53
- if (values.minutes != null) {
54
- _date.setMinutes(values.minutes);
55
- }
56
- if (values.seconds != null) {
57
- _date.setSeconds(values.seconds);
58
- }
59
- if (values.milliseconds != null) {
60
- _date.setMilliseconds(values.milliseconds);
61
- }
62
- return _date;
63
- }
64
23
  const DATE_FORMAT = "dd.MM.yyyy HH:mm";
65
24
  const roundToNearestStep = (date, stepMinutes) => {
66
25
  const totalMinutes = date.getHours() * 60 + date.getMinutes();
@@ -1 +1 @@
1
- {"version":3,"file":"DateTimePicker.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/calendar-clock.js","../../../node_modules/lucide-react/dist/esm/icons/clock.js","../../../node_modules/date-fns/set.mjs","../../../lib/components/ui/DateTimePicker.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.456.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CalendarClock = createLucideIcon(\"CalendarClock\", [\n [\"path\", { d: \"M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5\", key: \"1osxxc\" }],\n [\"path\", { d: \"M16 2v4\", key: \"4m81vk\" }],\n [\"path\", { d: \"M8 2v4\", key: \"1cmpym\" }],\n [\"path\", { d: \"M3 10h5\", key: \"r794hk\" }],\n [\"path\", { d: \"M17.5 17.5 16 16.3V14\", key: \"akvzfd\" }],\n [\"circle\", { cx: \"16\", cy: \"16\", r: \"6\", key: \"qoo3c4\" }]\n]);\n\nexport { CalendarClock as default };\n//# sourceMappingURL=calendar-clock.js.map\n","/**\n * @license lucide-react v0.456.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Clock = createLucideIcon(\"Clock\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"polyline\", { points: \"12 6 12 12 16 14\", key: \"68esgv\" }]\n]);\n\nexport { Clock as default };\n//# sourceMappingURL=clock.js.map\n","import { constructFrom } from \"./constructFrom.mjs\";\nimport { setMonth } from \"./setMonth.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n/**\n * @name set\n * @category Common Helpers\n * @summary Set date values to a given date.\n *\n * @description\n * Set date values to a given date.\n *\n * Sets time values to date from object `values`.\n * A value is not set if it is undefined or null or doesn't exist in `values`.\n *\n * Note about bundle size: `set` does not internally use `setX` functions from date-fns but instead opts\n * to use native `Date#setX` methods. If you use this function, you may not want to include the\n * other `setX` functions that date-fns provides if you are concerned about the bundle size.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The date to be changed\n * @param values - The date values to be set\n *\n * @returns The new date with options set\n *\n * @example\n * // Transform 1 September 2014 into 20 October 2015 in a single line:\n * const result = set(new Date(2014, 8, 20), { year: 2015, month: 9, date: 20 })\n * //=> Tue Oct 20 2015 00:00:00\n *\n * @example\n * // Set 12 PM to 1 September 2014 01:23:45 to 1 September 2014 12:00:00:\n * const result = set(new Date(2014, 8, 1, 1, 23, 45), { hours: 12 })\n * //=> Mon Sep 01 2014 12:23:45\n */\n\nexport function set(date, values) {\n let _date = toDate(date);\n\n // Check if date is Invalid Date because Date.prototype.setFullYear ignores the value of Invalid Date\n if (isNaN(+_date)) {\n return constructFrom(date, NaN);\n }\n\n if (values.year != null) {\n _date.setFullYear(values.year);\n }\n\n if (values.month != null) {\n _date = setMonth(_date, values.month);\n }\n\n if (values.date != null) {\n _date.setDate(values.date);\n }\n\n if (values.hours != null) {\n _date.setHours(values.hours);\n }\n\n if (values.minutes != null) {\n _date.setMinutes(values.minutes);\n }\n\n if (values.seconds != null) {\n _date.setSeconds(values.seconds);\n }\n\n if (values.milliseconds != null) {\n _date.setMilliseconds(values.milliseconds);\n }\n\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default set;\n","import { format, parse, isValid, set } from \"date-fns\";\nimport { CalendarClockIcon, Clock, XIcon } from \"lucide-react\";\n\nimport { Button } from \"./button\";\nimport { Calendar } from \"./Calendar\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover\";\nimport { cn } from \"../../utils/utils\";\nimport React, { forwardRef, useEffect } from \"react\";\nimport { Input } from \"./input\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"./select\";\nimport { PopoverClose } from \"@radix-ui/react-popover\";\n\nconst DATE_FORMAT = \"dd.MM.yyyy HH:mm\";\n\ninterface DateTimePickerProps {\n value?: Date;\n onChange?: (date: Date | undefined | null) => void;\n className?: string;\n placeholder?: string;\n clearable?: boolean;\n disabled?: boolean;\n /** Granularita času v minutách (musí dělit 60 beze zbytku). Default 30. */\n minuteStep?: number;\n}\n\nconst roundToNearestStep = (date: Date, stepMinutes: number) => {\n const totalMinutes = date.getHours() * 60 + date.getMinutes();\n const rounded = Math.round(totalMinutes / stepMinutes) * stepMinutes;\n return set(date, {\n seconds: 0,\n milliseconds: 0,\n hours: Math.floor(rounded / 60),\n minutes: rounded % 60,\n });\n};\n\nconst DateTimePicker = forwardRef<HTMLInputElement, DateTimePickerProps>(\n (\n {\n value,\n onChange,\n className,\n clearable = true,\n placeholder,\n disabled,\n minuteStep = 30,\n ...props\n },\n ref\n ) => {\n const [dateTime, setDateTime] = React.useState<Date | null>(value || null);\n const [inputValue, setInputValue] = React.useState<string | null>(\"\");\n\n useEffect(() => {\n if (value) {\n const roundedDate = roundToNearestStep(value, minuteStep);\n setDateTime(roundedDate);\n setInputValue(format(roundedDate, DATE_FORMAT));\n } else {\n setDateTime(null);\n setInputValue(\"\");\n }\n }, [value, minuteStep]);\n\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n event.stopPropagation ? event.stopPropagation() : null; // Stop bubbling to prevent interference with other components\n console.log(\n \"%clibcomponentsateTimePicker.tsx:71 event\",\n \"color: #007acc;\",\n event\n );\n setInputValue(event.target.value);\n const parsedDateTime = parse(event.target.value, DATE_FORMAT, new Date());\n\n if (isValid(parsedDateTime)) {\n setDateTime(parsedDateTime);\n onChange?.(parsedDateTime);\n setInputValue(format(parsedDateTime, DATE_FORMAT));\n } else {\n setInputValue(\"\");\n setDateTime(null);\n onChange?.(null);\n }\n };\n\n const handleInputBlur = () => {\n if (inputValue === \"\") {\n setDateTime(null);\n onChange?.(null);\n return;\n }\n\n const parsedDateTime = parse(inputValue || \"\", DATE_FORMAT, new Date());\n if (isValid(parsedDateTime)) {\n setDateTime(parsedDateTime);\n onChange?.(parsedDateTime);\n setInputValue(format(parsedDateTime, DATE_FORMAT));\n } else {\n setInputValue(\"\");\n setDateTime(null);\n onChange?.(null);\n }\n };\n\n const handleDateSelect = (selectedDate: Date | undefined | null) => {\n if (selectedDate) {\n const newDateTime = dateTime\n ? set(dateTime, {\n year: selectedDate.getFullYear(),\n month: selectedDate.getMonth(),\n date: selectedDate.getDate(),\n })\n : set(selectedDate, { hours: 12, minutes: 0 });\n setDateTime(newDateTime);\n onChange?.(newDateTime);\n setInputValue(format(newDateTime, DATE_FORMAT));\n } else {\n setDateTime(null);\n setInputValue(\"\");\n onChange?.(null);\n }\n };\n\n const handleTimeSelect = (time: string) => {\n const [hours, minutes] = time.split(\":\").map(Number);\n\n const newDateTime = set(dateTime ?? new Date(), { hours, minutes });\n setDateTime(newDateTime);\n onChange?.(newDateTime);\n setInputValue(format(newDateTime, DATE_FORMAT));\n };\n\n const handleClear = () => {\n setInputValue(\"\");\n setDateTime(null);\n onChange?.(null);\n };\n\n const timeOptions = React.useMemo(() => {\n const count = Math.floor((24 * 60) / minuteStep);\n return Array.from({ length: count }, (_, i) => {\n const total = i * minuteStep;\n const hours = Math.floor(total / 60);\n const minutes = total % 60;\n return `${hours.toString().padStart(2, \"0\")}:${minutes\n .toString()\n .padStart(2, \"0\")}`;\n });\n }, [minuteStep]);\n\n return (\n <Popover open={disabled ? false : undefined}>\n <PopoverTrigger asChild>\n <div className={cn(\"relative w-full\", className)}>\n <Input\n ref={ref}\n type=\"text\"\n disabled={disabled}\n value={inputValue || \"\"}\n onChange={handleInputChange}\n onBlur={handleInputBlur}\n placeholder={placeholder}\n className={cn(\n \"w-full pl-8 pr-8\",\n !dateTime && \"text-muted-foreground\"\n )}\n {...props}\n />\n <CalendarClockIcon className=\"absolute left-2 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n {clearable && !disabled && inputValue && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"absolute right-2 top-1/2 -translate-y-1/2 h-4 w-4 p-0\"\n onClick={handleClear}\n >\n <XIcon className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"sr-only\">Smazat datum a čas</span>\n </Button>\n )}\n </div>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <Calendar\n mode=\"single\"\n selected={dateTime || undefined}\n onSelect={handleDateSelect}\n initialFocus\n />\n <div className=\"p-3 border-t border-border\">\n <div className=\"flex items-center justify-between\">\n <Select\n onValueChange={handleTimeSelect}\n value={dateTime ? format(dateTime, \"HH:mm\") : undefined}\n >\n <SelectTrigger>\n <SelectValue placeholder=\"Zvolte čas\">\n {dateTime ? (\n <div className=\"flex items-center\">\n <Clock className=\"mr-2 h-4 w-4\" />\n {format(dateTime, \"HH:mm\")}\n </div>\n ) : (\n \"Zvolte čas\"\n )}\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {timeOptions.map((time) => (\n <SelectItem key={time} value={time}>\n {time}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <PopoverClose asChild>\n <Button className=\"ml-2 px-3\">OK</Button>\n </PopoverClose>\n </div>\n </div>\n </PopoverContent>\n </Popover>\n );\n }\n);\n\nDateTimePicker.displayName = \"DateTimePicker\";\n\nexport default DateTimePicker;\n"],"names":["React","CalendarClockIcon","XIcon"],"mappings":"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","x_google_ignoreList":[0,1,2]}
1
+ {"version":3,"file":"DateTimePicker.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/clock.js","../../../lib/components/ui/DateTimePicker.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.456.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Clock = createLucideIcon(\"Clock\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"polyline\", { points: \"12 6 12 12 16 14\", key: \"68esgv\" }]\n]);\n\nexport { Clock as default };\n//# sourceMappingURL=clock.js.map\n","import { format, parse, isValid, set } from \"date-fns\";\nimport { CalendarClockIcon, Clock, XIcon } from \"lucide-react\";\n\nimport { Button } from \"./button\";\nimport { Calendar } from \"./Calendar\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover\";\nimport { cn } from \"../../utils/utils\";\nimport React, { forwardRef, useEffect } from \"react\";\nimport { Input } from \"./input\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"./select\";\nimport { PopoverClose } from \"@radix-ui/react-popover\";\n\nconst DATE_FORMAT = \"dd.MM.yyyy HH:mm\";\n\ninterface DateTimePickerProps {\n value?: Date;\n onChange?: (date: Date | undefined | null) => void;\n className?: string;\n placeholder?: string;\n clearable?: boolean;\n disabled?: boolean;\n /** Granularita času v minutách (musí dělit 60 beze zbytku). Default 30. */\n minuteStep?: number;\n}\n\nconst roundToNearestStep = (date: Date, stepMinutes: number) => {\n const totalMinutes = date.getHours() * 60 + date.getMinutes();\n const rounded = Math.round(totalMinutes / stepMinutes) * stepMinutes;\n return set(date, {\n seconds: 0,\n milliseconds: 0,\n hours: Math.floor(rounded / 60),\n minutes: rounded % 60,\n });\n};\n\nconst DateTimePicker = forwardRef<HTMLInputElement, DateTimePickerProps>(\n (\n {\n value,\n onChange,\n className,\n clearable = true,\n placeholder,\n disabled,\n minuteStep = 30,\n ...props\n },\n ref\n ) => {\n const [dateTime, setDateTime] = React.useState<Date | null>(value || null);\n const [inputValue, setInputValue] = React.useState<string | null>(\"\");\n\n useEffect(() => {\n if (value) {\n const roundedDate = roundToNearestStep(value, minuteStep);\n setDateTime(roundedDate);\n setInputValue(format(roundedDate, DATE_FORMAT));\n } else {\n setDateTime(null);\n setInputValue(\"\");\n }\n }, [value, minuteStep]);\n\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n event.stopPropagation ? event.stopPropagation() : null; // Stop bubbling to prevent interference with other components\n console.log(\n \"%clibcomponentsateTimePicker.tsx:71 event\",\n \"color: #007acc;\",\n event\n );\n setInputValue(event.target.value);\n const parsedDateTime = parse(event.target.value, DATE_FORMAT, new Date());\n\n if (isValid(parsedDateTime)) {\n setDateTime(parsedDateTime);\n onChange?.(parsedDateTime);\n setInputValue(format(parsedDateTime, DATE_FORMAT));\n } else {\n setInputValue(\"\");\n setDateTime(null);\n onChange?.(null);\n }\n };\n\n const handleInputBlur = () => {\n if (inputValue === \"\") {\n setDateTime(null);\n onChange?.(null);\n return;\n }\n\n const parsedDateTime = parse(inputValue || \"\", DATE_FORMAT, new Date());\n if (isValid(parsedDateTime)) {\n setDateTime(parsedDateTime);\n onChange?.(parsedDateTime);\n setInputValue(format(parsedDateTime, DATE_FORMAT));\n } else {\n setInputValue(\"\");\n setDateTime(null);\n onChange?.(null);\n }\n };\n\n const handleDateSelect = (selectedDate: Date | undefined | null) => {\n if (selectedDate) {\n const newDateTime = dateTime\n ? set(dateTime, {\n year: selectedDate.getFullYear(),\n month: selectedDate.getMonth(),\n date: selectedDate.getDate(),\n })\n : set(selectedDate, { hours: 12, minutes: 0 });\n setDateTime(newDateTime);\n onChange?.(newDateTime);\n setInputValue(format(newDateTime, DATE_FORMAT));\n } else {\n setDateTime(null);\n setInputValue(\"\");\n onChange?.(null);\n }\n };\n\n const handleTimeSelect = (time: string) => {\n const [hours, minutes] = time.split(\":\").map(Number);\n\n const newDateTime = set(dateTime ?? new Date(), { hours, minutes });\n setDateTime(newDateTime);\n onChange?.(newDateTime);\n setInputValue(format(newDateTime, DATE_FORMAT));\n };\n\n const handleClear = () => {\n setInputValue(\"\");\n setDateTime(null);\n onChange?.(null);\n };\n\n const timeOptions = React.useMemo(() => {\n const count = Math.floor((24 * 60) / minuteStep);\n return Array.from({ length: count }, (_, i) => {\n const total = i * minuteStep;\n const hours = Math.floor(total / 60);\n const minutes = total % 60;\n return `${hours.toString().padStart(2, \"0\")}:${minutes\n .toString()\n .padStart(2, \"0\")}`;\n });\n }, [minuteStep]);\n\n return (\n <Popover open={disabled ? false : undefined}>\n <PopoverTrigger asChild>\n <div className={cn(\"relative w-full\", className)}>\n <Input\n ref={ref}\n type=\"text\"\n disabled={disabled}\n value={inputValue || \"\"}\n onChange={handleInputChange}\n onBlur={handleInputBlur}\n placeholder={placeholder}\n className={cn(\n \"w-full pl-8 pr-8\",\n !dateTime && \"text-muted-foreground\"\n )}\n {...props}\n />\n <CalendarClockIcon className=\"absolute left-2 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n {clearable && !disabled && inputValue && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"absolute right-2 top-1/2 -translate-y-1/2 h-4 w-4 p-0\"\n onClick={handleClear}\n >\n <XIcon className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"sr-only\">Smazat datum a čas</span>\n </Button>\n )}\n </div>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <Calendar\n mode=\"single\"\n selected={dateTime || undefined}\n onSelect={handleDateSelect}\n initialFocus\n />\n <div className=\"p-3 border-t border-border\">\n <div className=\"flex items-center justify-between\">\n <Select\n onValueChange={handleTimeSelect}\n value={dateTime ? format(dateTime, \"HH:mm\") : undefined}\n >\n <SelectTrigger>\n <SelectValue placeholder=\"Zvolte čas\">\n {dateTime ? (\n <div className=\"flex items-center\">\n <Clock className=\"mr-2 h-4 w-4\" />\n {format(dateTime, \"HH:mm\")}\n </div>\n ) : (\n \"Zvolte čas\"\n )}\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {timeOptions.map((time) => (\n <SelectItem key={time} value={time}>\n {time}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <PopoverClose asChild>\n <Button className=\"ml-2 px-3\">OK</Button>\n </PopoverClose>\n </div>\n </div>\n </PopoverContent>\n </Popover>\n );\n }\n);\n\nDateTimePicker.displayName = \"DateTimePicker\";\n\nexport default DateTimePicker;\n"],"names":["React","CalendarClockIcon","XIcon"],"mappings":"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","x_google_ignoreList":[0]}
@@ -0,0 +1,14 @@
1
+ import { default as React } from 'react';
2
+
3
+ interface DateTimePicker2Props {
4
+ value?: Date;
5
+ onChange?: (date: Date | undefined | null) => void;
6
+ className?: string;
7
+ placeholder?: string;
8
+ clearable?: boolean;
9
+ disabled?: boolean;
10
+ /** Granularita minut (musí dělit 60 beze zbytku). Default 5. */
11
+ minuteStep?: number;
12
+ }
13
+ declare const DateTimePicker2: React.ForwardRefExoticComponent<DateTimePicker2Props & React.RefAttributes<HTMLInputElement>>;
14
+ export default DateTimePicker2;
@@ -0,0 +1,196 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { Button } from "./button.js";
3
+ import { f as format, C as Calendar, i as isValid } from "../../Calendar-DWT4e7Th.js";
4
+ import { P as Popover, a as PopoverTrigger, b as PopoverContent, c as PopoverClose } from "../../popover-DpJhfyvx.js";
5
+ import { ScrollArea } from "./ScrollArea.js";
6
+ import { cn } from "../../utils/utils.js";
7
+ import React__default, { forwardRef, useEffect } from "react";
8
+ import { I as Input } from "../../input-Cm_FjJOF.js";
9
+ import { C as CalendarClock, s as set } from "../../set-BOUTbzpR.js";
10
+ import { X } from "../../x-DciOkaU0.js";
11
+ import { p as parse } from "../../parse-D2yb8751.js";
12
+ const DATE_FORMAT = "dd.MM.yyyy HH:mm";
13
+ const roundToNearestStep = (date, stepMinutes) => {
14
+ const totalMinutes = date.getHours() * 60 + date.getMinutes();
15
+ const rounded = Math.round(totalMinutes / stepMinutes) * stepMinutes;
16
+ return set(date, {
17
+ seconds: 0,
18
+ milliseconds: 0,
19
+ hours: Math.floor(rounded / 60),
20
+ minutes: rounded % 60
21
+ });
22
+ };
23
+ const DateTimePicker2 = forwardRef(
24
+ ({
25
+ value,
26
+ onChange,
27
+ className,
28
+ clearable = true,
29
+ placeholder,
30
+ disabled,
31
+ minuteStep = 5,
32
+ ...props
33
+ }, ref) => {
34
+ const [dateTime, setDateTime] = React__default.useState(value || null);
35
+ const [inputValue, setInputValue] = React__default.useState("");
36
+ useEffect(() => {
37
+ if (value) {
38
+ const roundedDate = roundToNearestStep(value, minuteStep);
39
+ setDateTime(roundedDate);
40
+ setInputValue(format(roundedDate, DATE_FORMAT));
41
+ } else {
42
+ setDateTime(null);
43
+ setInputValue("");
44
+ }
45
+ }, [value, minuteStep]);
46
+ const hours = React__default.useMemo(
47
+ () => Array.from({ length: 24 }, (_, i) => i),
48
+ []
49
+ );
50
+ const minutes = React__default.useMemo(() => {
51
+ const count = Math.floor(60 / minuteStep);
52
+ return Array.from({ length: count }, (_, i) => i * minuteStep);
53
+ }, [minuteStep]);
54
+ const commit = (newDate) => {
55
+ setDateTime(newDate);
56
+ onChange == null ? void 0 : onChange(newDate);
57
+ setInputValue(newDate ? format(newDate, DATE_FORMAT) : "");
58
+ };
59
+ const handleInputChange = (event) => {
60
+ var _a;
61
+ (_a = event.stopPropagation) == null ? void 0 : _a.call(event);
62
+ setInputValue(event.target.value);
63
+ const parsedDateTime = parse(event.target.value, DATE_FORMAT, /* @__PURE__ */ new Date());
64
+ if (isValid(parsedDateTime)) {
65
+ setDateTime(parsedDateTime);
66
+ onChange == null ? void 0 : onChange(parsedDateTime);
67
+ setInputValue(format(parsedDateTime, DATE_FORMAT));
68
+ } else {
69
+ setInputValue("");
70
+ setDateTime(null);
71
+ onChange == null ? void 0 : onChange(null);
72
+ }
73
+ };
74
+ const handleInputBlur = () => {
75
+ if (inputValue === "") {
76
+ setDateTime(null);
77
+ onChange == null ? void 0 : onChange(null);
78
+ return;
79
+ }
80
+ const parsedDateTime = parse(inputValue || "", DATE_FORMAT, /* @__PURE__ */ new Date());
81
+ if (isValid(parsedDateTime)) {
82
+ setDateTime(parsedDateTime);
83
+ onChange == null ? void 0 : onChange(parsedDateTime);
84
+ setInputValue(format(parsedDateTime, DATE_FORMAT));
85
+ } else {
86
+ setInputValue("");
87
+ setDateTime(null);
88
+ onChange == null ? void 0 : onChange(null);
89
+ }
90
+ };
91
+ const handleDateSelect = (selectedDate) => {
92
+ if (selectedDate) {
93
+ const newDateTime = dateTime ? set(dateTime, {
94
+ year: selectedDate.getFullYear(),
95
+ month: selectedDate.getMonth(),
96
+ date: selectedDate.getDate()
97
+ }) : set(selectedDate, { hours: 12, minutes: 0, seconds: 0, milliseconds: 0 });
98
+ commit(newDateTime);
99
+ } else {
100
+ commit(null);
101
+ }
102
+ };
103
+ const handleHourSelect = (hour) => {
104
+ const base = dateTime ?? set(/* @__PURE__ */ new Date(), { minutes: 0, seconds: 0, milliseconds: 0 });
105
+ const newDateTime = set(base, { hours: hour, seconds: 0, milliseconds: 0 });
106
+ commit(newDateTime);
107
+ };
108
+ const handleMinuteSelect = (minute) => {
109
+ const base = dateTime ?? set(/* @__PURE__ */ new Date(), { seconds: 0, milliseconds: 0 });
110
+ const newDateTime = set(base, { minutes: minute, seconds: 0, milliseconds: 0 });
111
+ commit(newDateTime);
112
+ };
113
+ const handleClear = () => {
114
+ commit(null);
115
+ };
116
+ return /* @__PURE__ */ jsxs(Popover, { open: disabled ? false : void 0, children: [
117
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs("div", { className: cn("relative w-full", className), children: [
118
+ /* @__PURE__ */ jsx(
119
+ Input,
120
+ {
121
+ ref,
122
+ type: "text",
123
+ disabled,
124
+ value: inputValue || "",
125
+ onChange: handleInputChange,
126
+ onBlur: handleInputBlur,
127
+ placeholder,
128
+ className: cn(
129
+ "w-full pl-8 pr-8",
130
+ !dateTime && "text-muted-foreground"
131
+ ),
132
+ ...props
133
+ }
134
+ ),
135
+ /* @__PURE__ */ jsx(CalendarClock, { className: "absolute left-2 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" }),
136
+ clearable && !disabled && inputValue && /* @__PURE__ */ jsxs(
137
+ Button,
138
+ {
139
+ type: "button",
140
+ variant: "ghost",
141
+ size: "icon",
142
+ className: "absolute right-2 top-1/2 -translate-y-1/2 h-4 w-4 p-0",
143
+ onClick: handleClear,
144
+ children: [
145
+ /* @__PURE__ */ jsx(X, { className: "h-4 w-4 text-muted-foreground" }),
146
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Smazat datum a čas" })
147
+ ]
148
+ }
149
+ )
150
+ ] }) }),
151
+ /* @__PURE__ */ jsxs(PopoverContent, { className: "w-auto p-0", align: "start", children: [
152
+ /* @__PURE__ */ jsxs("div", { className: "flex", children: [
153
+ /* @__PURE__ */ jsx(
154
+ Calendar,
155
+ {
156
+ mode: "single",
157
+ selected: dateTime || void 0,
158
+ onSelect: handleDateSelect,
159
+ initialFocus: true
160
+ }
161
+ ),
162
+ /* @__PURE__ */ jsxs("div", { className: "flex h-[300px] divide-x border-l border-border", children: [
163
+ /* @__PURE__ */ jsx(ScrollArea, { className: "w-16", children: /* @__PURE__ */ jsx("div", { className: "flex flex-col p-2", children: hours.map((hour) => /* @__PURE__ */ jsx(
164
+ Button,
165
+ {
166
+ size: "icon",
167
+ variant: dateTime && dateTime.getHours() === hour ? "default" : "ghost",
168
+ className: "w-full shrink-0 aspect-square",
169
+ onClick: () => handleHourSelect(hour),
170
+ children: hour.toString().padStart(2, "0")
171
+ },
172
+ hour
173
+ )) }) }),
174
+ /* @__PURE__ */ jsx(ScrollArea, { className: "w-16", children: /* @__PURE__ */ jsx("div", { className: "flex flex-col p-2", children: minutes.map((minute) => /* @__PURE__ */ jsx(
175
+ Button,
176
+ {
177
+ size: "icon",
178
+ variant: dateTime && dateTime.getMinutes() === minute ? "default" : "ghost",
179
+ className: "w-full shrink-0 aspect-square",
180
+ onClick: () => handleMinuteSelect(minute),
181
+ children: minute.toString().padStart(2, "0")
182
+ },
183
+ minute
184
+ )) }) })
185
+ ] })
186
+ ] }),
187
+ /* @__PURE__ */ jsx("div", { className: "flex justify-end p-2 border-t border-border", children: /* @__PURE__ */ jsx(PopoverClose, { asChild: true, children: /* @__PURE__ */ jsx(Button, { className: "px-3", children: "OK" }) }) })
188
+ ] })
189
+ ] });
190
+ }
191
+ );
192
+ DateTimePicker2.displayName = "DateTimePicker2";
193
+ export {
194
+ DateTimePicker2 as default
195
+ };
196
+ //# sourceMappingURL=DateTimePicker2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DateTimePicker2.js","sources":["../../../lib/components/ui/DateTimePicker2.tsx"],"sourcesContent":["import { format, parse, isValid, set } from \"date-fns\";\nimport { CalendarClockIcon, XIcon } from \"lucide-react\";\n\nimport { Button } from \"./button\";\nimport { Calendar } from \"./Calendar\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover\";\nimport { ScrollArea } from \"./ScrollArea\";\nimport { cn } from \"../../utils/utils\";\nimport React, { forwardRef, useEffect } from \"react\";\nimport { Input } from \"./input\";\nimport { PopoverClose } from \"@radix-ui/react-popover\";\n\nconst DATE_FORMAT = \"dd.MM.yyyy HH:mm\";\n\ninterface DateTimePicker2Props {\n value?: Date;\n onChange?: (date: Date | undefined | null) => void;\n className?: string;\n placeholder?: string;\n clearable?: boolean;\n disabled?: boolean;\n /** Granularita minut (musí dělit 60 beze zbytku). Default 5. */\n minuteStep?: number;\n}\n\nconst roundToNearestStep = (date: Date, stepMinutes: number) => {\n const totalMinutes = date.getHours() * 60 + date.getMinutes();\n const rounded = Math.round(totalMinutes / stepMinutes) * stepMinutes;\n return set(date, {\n seconds: 0,\n milliseconds: 0,\n hours: Math.floor(rounded / 60),\n minutes: rounded % 60,\n });\n};\n\nconst DateTimePicker2 = forwardRef<HTMLInputElement, DateTimePicker2Props>(\n (\n {\n value,\n onChange,\n className,\n clearable = true,\n placeholder,\n disabled,\n minuteStep = 5,\n ...props\n },\n ref\n ) => {\n const [dateTime, setDateTime] = React.useState<Date | null>(value || null);\n const [inputValue, setInputValue] = React.useState<string | null>(\"\");\n\n useEffect(() => {\n if (value) {\n const roundedDate = roundToNearestStep(value, minuteStep);\n setDateTime(roundedDate);\n setInputValue(format(roundedDate, DATE_FORMAT));\n } else {\n setDateTime(null);\n setInputValue(\"\");\n }\n }, [value, minuteStep]);\n\n const hours = React.useMemo(\n () => Array.from({ length: 24 }, (_, i) => i),\n []\n );\n\n const minutes = React.useMemo(() => {\n const count = Math.floor(60 / minuteStep);\n return Array.from({ length: count }, (_, i) => i * minuteStep);\n }, [minuteStep]);\n\n const commit = (newDate: Date | null) => {\n setDateTime(newDate);\n onChange?.(newDate);\n setInputValue(newDate ? format(newDate, DATE_FORMAT) : \"\");\n };\n\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n event.stopPropagation?.();\n setInputValue(event.target.value);\n const parsedDateTime = parse(event.target.value, DATE_FORMAT, new Date());\n\n if (isValid(parsedDateTime)) {\n setDateTime(parsedDateTime);\n onChange?.(parsedDateTime);\n setInputValue(format(parsedDateTime, DATE_FORMAT));\n } else {\n setInputValue(\"\");\n setDateTime(null);\n onChange?.(null);\n }\n };\n\n const handleInputBlur = () => {\n if (inputValue === \"\") {\n setDateTime(null);\n onChange?.(null);\n return;\n }\n\n const parsedDateTime = parse(inputValue || \"\", DATE_FORMAT, new Date());\n if (isValid(parsedDateTime)) {\n setDateTime(parsedDateTime);\n onChange?.(parsedDateTime);\n setInputValue(format(parsedDateTime, DATE_FORMAT));\n } else {\n setInputValue(\"\");\n setDateTime(null);\n onChange?.(null);\n }\n };\n\n const handleDateSelect = (selectedDate: Date | undefined | null) => {\n if (selectedDate) {\n const newDateTime = dateTime\n ? set(dateTime, {\n year: selectedDate.getFullYear(),\n month: selectedDate.getMonth(),\n date: selectedDate.getDate(),\n })\n : set(selectedDate, { hours: 12, minutes: 0, seconds: 0, milliseconds: 0 });\n commit(newDateTime);\n } else {\n commit(null);\n }\n };\n\n const handleHourSelect = (hour: number) => {\n const base = dateTime ?? set(new Date(), { minutes: 0, seconds: 0, milliseconds: 0 });\n const newDateTime = set(base, { hours: hour, seconds: 0, milliseconds: 0 });\n commit(newDateTime);\n };\n\n const handleMinuteSelect = (minute: number) => {\n const base = dateTime ?? set(new Date(), { seconds: 0, milliseconds: 0 });\n const newDateTime = set(base, { minutes: minute, seconds: 0, milliseconds: 0 });\n commit(newDateTime);\n };\n\n const handleClear = () => {\n commit(null);\n };\n\n return (\n <Popover open={disabled ? false : undefined}>\n <PopoverTrigger asChild>\n <div className={cn(\"relative w-full\", className)}>\n <Input\n ref={ref}\n type=\"text\"\n disabled={disabled}\n value={inputValue || \"\"}\n onChange={handleInputChange}\n onBlur={handleInputBlur}\n placeholder={placeholder}\n className={cn(\n \"w-full pl-8 pr-8\",\n !dateTime && \"text-muted-foreground\"\n )}\n {...props}\n />\n <CalendarClockIcon className=\"absolute left-2 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n {clearable && !disabled && inputValue && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"absolute right-2 top-1/2 -translate-y-1/2 h-4 w-4 p-0\"\n onClick={handleClear}\n >\n <XIcon className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"sr-only\">Smazat datum a čas</span>\n </Button>\n )}\n </div>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <div className=\"flex\">\n <Calendar\n mode=\"single\"\n selected={dateTime || undefined}\n onSelect={handleDateSelect}\n initialFocus\n />\n <div className=\"flex h-[300px] divide-x border-l border-border\">\n <ScrollArea className=\"w-16\">\n <div className=\"flex flex-col p-2\">\n {hours.map((hour) => (\n <Button\n key={hour}\n size=\"icon\"\n variant={\n dateTime && dateTime.getHours() === hour\n ? \"default\"\n : \"ghost\"\n }\n className=\"w-full shrink-0 aspect-square\"\n onClick={() => handleHourSelect(hour)}\n >\n {hour.toString().padStart(2, \"0\")}\n </Button>\n ))}\n </div>\n </ScrollArea>\n <ScrollArea className=\"w-16\">\n <div className=\"flex flex-col p-2\">\n {minutes.map((minute) => (\n <Button\n key={minute}\n size=\"icon\"\n variant={\n dateTime && dateTime.getMinutes() === minute\n ? \"default\"\n : \"ghost\"\n }\n className=\"w-full shrink-0 aspect-square\"\n onClick={() => handleMinuteSelect(minute)}\n >\n {minute.toString().padStart(2, \"0\")}\n </Button>\n ))}\n </div>\n </ScrollArea>\n </div>\n </div>\n <div className=\"flex justify-end p-2 border-t border-border\">\n <PopoverClose asChild>\n <Button className=\"px-3\">OK</Button>\n </PopoverClose>\n </div>\n </PopoverContent>\n </Popover>\n );\n }\n);\n\nDateTimePicker2.displayName = \"DateTimePicker2\";\n\nexport default DateTimePicker2;\n"],"names":["React","CalendarClockIcon","XIcon"],"mappings":"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"}
package/dist/main.d.ts CHANGED
@@ -52,4 +52,5 @@ export * from './components/ui/multi-select.tsx';
52
52
  export { Button as ButtonCN, buttonVariants } from './components/ui/button.tsx';
53
53
  export { Calendar as CalendarCn } from './components/ui/Calendar.tsx';
54
54
  export { default as DateTimePicker } from './components/ui/DateTimePicker.tsx';
55
+ export { default as DateTimePicker2 } from './components/ui/DateTimePicker2.tsx';
55
56
  export { default as DatePicker } from './components/ui/DatePicker.tsx';
package/dist/main.js CHANGED
@@ -51,7 +51,8 @@ import { MultiSelect } from "./components/ui/multi-select.js";
51
51
  import { Button, buttonVariants } from "./components/ui/button.js";
52
52
  import { C } from "./Calendar-DWT4e7Th.js";
53
53
  import { default as default26 } from "./components/ui/DateTimePicker.js";
54
- import { default as default27 } from "./components/ui/DatePicker.js";
54
+ import { default as default27 } from "./components/ui/DateTimePicker2.js";
55
+ import { default as default28 } from "./components/ui/DatePicker.js";
55
56
  export {
56
57
  default3 as AutocompleteSearchBar,
57
58
  default4 as AutocompleteSearchBarServer,
@@ -74,9 +75,10 @@ export {
74
75
  default18 as DataTable,
75
76
  default21 as DataTableServer,
76
77
  default23 as DateField,
77
- default27 as DatePicker,
78
+ default28 as DatePicker,
78
79
  default22 as DateRangeField,
79
80
  default26 as DateTimePicker,
81
+ default27 as DateTimePicker2,
80
82
  D as Dialog,
81
83
  c as DialogClose,
82
84
  e as DialogContent,
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"main.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}