@addsign/moje-agenda-shared-lib 2.0.59 → 2.0.61

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.
@@ -163,13 +163,14 @@ const DateTimePicker = forwardRef(
163
163
  const minutes = i % 2 === 0 ? "00" : "30";
164
164
  return `${hours.toString().padStart(2, "0")}:${minutes}`;
165
165
  });
166
- return /* @__PURE__ */ jsxs(Popover, { children: [
166
+ return /* @__PURE__ */ jsxs(Popover, { open: disabled ? false : void 0, children: [
167
167
  /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs("div", { className: cn("relative w-full", className), children: [
168
168
  /* @__PURE__ */ jsx(
169
169
  Input,
170
170
  {
171
171
  ref,
172
172
  type: "text",
173
+ disabled,
173
174
  value: inputValue || "",
174
175
  onChange: handleInputChange,
175
176
  onBlur: handleInputBlur,
@@ -182,7 +183,7 @@ const DateTimePicker = forwardRef(
182
183
  }
183
184
  ),
184
185
  /* @__PURE__ */ jsx(CalendarClock, { className: "absolute left-2 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" }),
185
- clearable && disabled && inputValue && /* @__PURE__ */ jsxs(
186
+ clearable && !disabled && inputValue && /* @__PURE__ */ jsxs(
186
187
  Button,
187
188
  {
188
189
  type: "button",
@@ -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\";\r\nimport { CalendarClockIcon, Clock, XIcon } from \"lucide-react\";\r\n\r\nimport { Button } from \"./button\";\r\nimport { Calendar } from \"./Calendar\";\r\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover\";\r\nimport { cn } from \"../../utils/utils\";\r\nimport React, { forwardRef, useEffect } from \"react\";\r\nimport { Input } from \"./input\";\r\nimport {\r\n Select,\r\n SelectContent,\r\n SelectItem,\r\n SelectTrigger,\r\n SelectValue,\r\n} from \"./select\";\r\nimport { PopoverClose } from \"@radix-ui/react-popover\";\r\n\r\nconst DATE_FORMAT = \"dd.MM.yyyy HH:mm\";\r\n\r\ninterface DateTimePickerProps {\r\n value?: Date;\r\n onChange?: (date: Date | undefined | null) => void;\r\n className?: string;\r\n placeholder?: string;\r\n clearable?: boolean;\r\n disabled?: boolean;\r\n}\r\n\r\n// Helper function to round to the nearest half-hour\r\nconst roundToNearestHalfHour = (date: Date) => {\r\n const minutes = date.getMinutes();\r\n const roundedMinutes = minutes < 15 ? 0 : minutes < 45 ? 30 : 60;\r\n return set(date, {\r\n seconds: 0,\r\n milliseconds: 0,\r\n minutes: roundedMinutes,\r\n hours: roundedMinutes === 60 ? date.getHours() + 1 : date.getHours(),\r\n });\r\n};\r\n\r\nconst DateTimePicker = forwardRef<HTMLInputElement, DateTimePickerProps>(\r\n (\r\n {\r\n value,\r\n onChange,\r\n className,\r\n clearable = true,\r\n placeholder,\r\n disabled,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const [dateTime, setDateTime] = React.useState<Date | null>(value || null);\r\n const [inputValue, setInputValue] = React.useState<string | null>(\"\");\r\n\r\n useEffect(() => {\r\n if (value) {\r\n const roundedDate = roundToNearestHalfHour(value);\r\n setDateTime(roundedDate);\r\n setInputValue(format(roundedDate, DATE_FORMAT));\r\n } else {\r\n setDateTime(null);\r\n setInputValue(\"\");\r\n }\r\n }, [value]);\r\n\r\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n event.stopPropagation ? event.stopPropagation() : null; // Stop bubbling to prevent interference with other components\r\n console.log(\r\n \"%clibcomponentsateTimePicker.tsx:71 event\",\r\n \"color: #007acc;\",\r\n event\r\n );\r\n setInputValue(event.target.value);\r\n const parsedDateTime = parse(event.target.value, DATE_FORMAT, new Date());\r\n\r\n if (isValid(parsedDateTime)) {\r\n setDateTime(parsedDateTime);\r\n onChange?.(parsedDateTime);\r\n setInputValue(format(parsedDateTime, DATE_FORMAT));\r\n } else {\r\n setInputValue(\"\");\r\n setDateTime(null);\r\n onChange?.(null);\r\n }\r\n };\r\n\r\n const handleInputBlur = () => {\r\n if (inputValue === \"\") {\r\n setDateTime(null);\r\n onChange?.(null);\r\n return;\r\n }\r\n\r\n const parsedDateTime = parse(inputValue || \"\", DATE_FORMAT, new Date());\r\n if (isValid(parsedDateTime)) {\r\n setDateTime(parsedDateTime);\r\n onChange?.(parsedDateTime);\r\n setInputValue(format(parsedDateTime, DATE_FORMAT));\r\n } else {\r\n setInputValue(\"\");\r\n setDateTime(null);\r\n onChange?.(null);\r\n }\r\n };\r\n\r\n const handleDateSelect = (selectedDate: Date | undefined | null) => {\r\n if (selectedDate) {\r\n const newDateTime = dateTime\r\n ? set(dateTime, {\r\n year: selectedDate.getFullYear(),\r\n month: selectedDate.getMonth(),\r\n date: selectedDate.getDate(),\r\n })\r\n : set(selectedDate, { hours: 12, minutes: 0 });\r\n setDateTime(newDateTime);\r\n onChange?.(newDateTime);\r\n setInputValue(format(newDateTime, DATE_FORMAT));\r\n } else {\r\n setDateTime(null);\r\n setInputValue(\"\");\r\n onChange?.(null);\r\n }\r\n };\r\n\r\n const handleTimeSelect = (time: string) => {\r\n const [hours, minutes] = time.split(\":\").map(Number);\r\n\r\n const newDateTime = set(dateTime ?? new Date(), { hours, minutes });\r\n setDateTime(newDateTime);\r\n onChange?.(newDateTime);\r\n setInputValue(format(newDateTime, DATE_FORMAT));\r\n };\r\n\r\n const handleClear = () => {\r\n setInputValue(\"\");\r\n setDateTime(null);\r\n onChange?.(null);\r\n };\r\n\r\n const timeOptions = Array.from({ length: 48 }, (_, i) => {\r\n const hours = Math.floor(i / 2);\r\n const minutes = i % 2 === 0 ? \"00\" : \"30\";\r\n return `${hours.toString().padStart(2, \"0\")}:${minutes}`;\r\n });\r\n\r\n return (\r\n <Popover>\r\n <PopoverTrigger asChild>\r\n <div className={cn(\"relative w-full\", className)}>\r\n <Input\r\n ref={ref}\r\n type=\"text\"\r\n value={inputValue || \"\"}\r\n onChange={handleInputChange}\r\n onBlur={handleInputBlur}\r\n placeholder={placeholder}\r\n className={cn(\r\n \"w-full pl-8 pr-8\",\r\n !dateTime && \"text-muted-foreground\"\r\n )}\r\n {...props}\r\n />\r\n <CalendarClockIcon className=\"absolute left-2 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\r\n {clearable && disabled && inputValue && (\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"absolute right-2 top-1/2 -translate-y-1/2 h-4 w-4 p-0\"\r\n onClick={handleClear}\r\n >\r\n <XIcon className=\"h-4 w-4 text-muted-foreground\" />\r\n <span className=\"sr-only\">Smazat datum a čas</span>\r\n </Button>\r\n )}\r\n </div>\r\n </PopoverTrigger>\r\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\r\n <Calendar\r\n mode=\"single\"\r\n selected={dateTime || undefined}\r\n onSelect={handleDateSelect}\r\n initialFocus\r\n />\r\n <div className=\"p-3 border-t border-border\">\r\n <div className=\"flex items-center justify-between\">\r\n <Select\r\n onValueChange={handleTimeSelect}\r\n value={dateTime ? format(dateTime, \"HH:mm\") : undefined}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Zvolte čas\">\r\n {dateTime ? (\r\n <div className=\"flex items-center\">\r\n <Clock className=\"mr-2 h-4 w-4\" />\r\n {format(dateTime, \"HH:mm\")}\r\n </div>\r\n ) : (\r\n \"Zvolte čas\"\r\n )}\r\n </SelectValue>\r\n </SelectTrigger>\r\n <SelectContent>\r\n {timeOptions.map((time) => (\r\n <SelectItem key={time} value={time}>\r\n {time}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n <PopoverClose asChild>\r\n <Button className=\"ml-2 px-3\">OK</Button>\r\n </PopoverClose>\r\n </div>\r\n </div>\r\n </PopoverContent>\r\n </Popover>\r\n );\r\n }\r\n);\r\n\r\nDateTimePicker.displayName = \"DateTimePicker\";\r\n\r\nexport default DateTimePicker;\r\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/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\";\r\nimport { CalendarClockIcon, Clock, XIcon } from \"lucide-react\";\r\n\r\nimport { Button } from \"./button\";\r\nimport { Calendar } from \"./Calendar\";\r\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover\";\r\nimport { cn } from \"../../utils/utils\";\r\nimport React, { forwardRef, useEffect } from \"react\";\r\nimport { Input } from \"./input\";\r\nimport {\r\n Select,\r\n SelectContent,\r\n SelectItem,\r\n SelectTrigger,\r\n SelectValue,\r\n} from \"./select\";\r\nimport { PopoverClose } from \"@radix-ui/react-popover\";\r\n\r\nconst DATE_FORMAT = \"dd.MM.yyyy HH:mm\";\r\n\r\ninterface DateTimePickerProps {\r\n value?: Date;\r\n onChange?: (date: Date | undefined | null) => void;\r\n className?: string;\r\n placeholder?: string;\r\n clearable?: boolean;\r\n disabled?: boolean;\r\n}\r\n\r\n// Helper function to round to the nearest half-hour\r\nconst roundToNearestHalfHour = (date: Date) => {\r\n const minutes = date.getMinutes();\r\n const roundedMinutes = minutes < 15 ? 0 : minutes < 45 ? 30 : 60;\r\n return set(date, {\r\n seconds: 0,\r\n milliseconds: 0,\r\n minutes: roundedMinutes,\r\n hours: roundedMinutes === 60 ? date.getHours() + 1 : date.getHours(),\r\n });\r\n};\r\n\r\nconst DateTimePicker = forwardRef<HTMLInputElement, DateTimePickerProps>(\r\n (\r\n {\r\n value,\r\n onChange,\r\n className,\r\n clearable = true,\r\n placeholder,\r\n disabled,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const [dateTime, setDateTime] = React.useState<Date | null>(value || null);\r\n const [inputValue, setInputValue] = React.useState<string | null>(\"\");\r\n\r\n useEffect(() => {\r\n if (value) {\r\n const roundedDate = roundToNearestHalfHour(value);\r\n setDateTime(roundedDate);\r\n setInputValue(format(roundedDate, DATE_FORMAT));\r\n } else {\r\n setDateTime(null);\r\n setInputValue(\"\");\r\n }\r\n }, [value]);\r\n\r\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n event.stopPropagation ? event.stopPropagation() : null; // Stop bubbling to prevent interference with other components\r\n console.log(\r\n \"%clibcomponentsateTimePicker.tsx:71 event\",\r\n \"color: #007acc;\",\r\n event\r\n );\r\n setInputValue(event.target.value);\r\n const parsedDateTime = parse(event.target.value, DATE_FORMAT, new Date());\r\n\r\n if (isValid(parsedDateTime)) {\r\n setDateTime(parsedDateTime);\r\n onChange?.(parsedDateTime);\r\n setInputValue(format(parsedDateTime, DATE_FORMAT));\r\n } else {\r\n setInputValue(\"\");\r\n setDateTime(null);\r\n onChange?.(null);\r\n }\r\n };\r\n\r\n const handleInputBlur = () => {\r\n if (inputValue === \"\") {\r\n setDateTime(null);\r\n onChange?.(null);\r\n return;\r\n }\r\n\r\n const parsedDateTime = parse(inputValue || \"\", DATE_FORMAT, new Date());\r\n if (isValid(parsedDateTime)) {\r\n setDateTime(parsedDateTime);\r\n onChange?.(parsedDateTime);\r\n setInputValue(format(parsedDateTime, DATE_FORMAT));\r\n } else {\r\n setInputValue(\"\");\r\n setDateTime(null);\r\n onChange?.(null);\r\n }\r\n };\r\n\r\n const handleDateSelect = (selectedDate: Date | undefined | null) => {\r\n if (selectedDate) {\r\n const newDateTime = dateTime\r\n ? set(dateTime, {\r\n year: selectedDate.getFullYear(),\r\n month: selectedDate.getMonth(),\r\n date: selectedDate.getDate(),\r\n })\r\n : set(selectedDate, { hours: 12, minutes: 0 });\r\n setDateTime(newDateTime);\r\n onChange?.(newDateTime);\r\n setInputValue(format(newDateTime, DATE_FORMAT));\r\n } else {\r\n setDateTime(null);\r\n setInputValue(\"\");\r\n onChange?.(null);\r\n }\r\n };\r\n\r\n const handleTimeSelect = (time: string) => {\r\n const [hours, minutes] = time.split(\":\").map(Number);\r\n\r\n const newDateTime = set(dateTime ?? new Date(), { hours, minutes });\r\n setDateTime(newDateTime);\r\n onChange?.(newDateTime);\r\n setInputValue(format(newDateTime, DATE_FORMAT));\r\n };\r\n\r\n const handleClear = () => {\r\n setInputValue(\"\");\r\n setDateTime(null);\r\n onChange?.(null);\r\n };\r\n\r\n const timeOptions = Array.from({ length: 48 }, (_, i) => {\r\n const hours = Math.floor(i / 2);\r\n const minutes = i % 2 === 0 ? \"00\" : \"30\";\r\n return `${hours.toString().padStart(2, \"0\")}:${minutes}`;\r\n });\r\n\r\n return (\r\n <Popover open={disabled ? false : undefined}>\r\n <PopoverTrigger asChild>\r\n <div className={cn(\"relative w-full\", className)}>\r\n <Input\r\n ref={ref}\r\n type=\"text\"\r\n disabled={disabled}\r\n value={inputValue || \"\"}\r\n onChange={handleInputChange}\r\n onBlur={handleInputBlur}\r\n placeholder={placeholder}\r\n className={cn(\r\n \"w-full pl-8 pr-8\",\r\n !dateTime && \"text-muted-foreground\"\r\n )}\r\n {...props}\r\n />\r\n <CalendarClockIcon className=\"absolute left-2 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\r\n {clearable && !disabled && inputValue && (\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"absolute right-2 top-1/2 -translate-y-1/2 h-4 w-4 p-0\"\r\n onClick={handleClear}\r\n >\r\n <XIcon className=\"h-4 w-4 text-muted-foreground\" />\r\n <span className=\"sr-only\">Smazat datum a čas</span>\r\n </Button>\r\n )}\r\n </div>\r\n </PopoverTrigger>\r\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\r\n <Calendar\r\n mode=\"single\"\r\n selected={dateTime || undefined}\r\n onSelect={handleDateSelect}\r\n initialFocus\r\n />\r\n <div className=\"p-3 border-t border-border\">\r\n <div className=\"flex items-center justify-between\">\r\n <Select\r\n onValueChange={handleTimeSelect}\r\n value={dateTime ? format(dateTime, \"HH:mm\") : undefined}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Zvolte čas\">\r\n {dateTime ? (\r\n <div className=\"flex items-center\">\r\n <Clock className=\"mr-2 h-4 w-4\" />\r\n {format(dateTime, \"HH:mm\")}\r\n </div>\r\n ) : (\r\n \"Zvolte čas\"\r\n )}\r\n </SelectValue>\r\n </SelectTrigger>\r\n <SelectContent>\r\n {timeOptions.map((time) => (\r\n <SelectItem key={time} value={time}>\r\n {time}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n <PopoverClose asChild>\r\n <Button className=\"ml-2 px-3\">OK</Button>\r\n </PopoverClose>\r\n </div>\r\n </div>\r\n </PopoverContent>\r\n </Popover>\r\n );\r\n }\r\n);\r\n\r\nDateTimePicker.displayName = \"DateTimePicker\";\r\n\r\nexport default DateTimePicker;\r\n"],"names":["React","CalendarClockIcon","XIcon"],"mappings":"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","x_google_ignoreList":[0,1,2]}
@@ -128,7 +128,7 @@ function DataTableServer<T extends DataTableInternalItems>({
128
128
  const tableRef = useRef<HTMLTableElement | null>(null);
129
129
  const syncWidthRef = useRef<HTMLDivElement | null>(null);
130
130
 
131
- const [itemsPerPageLocal, setItemsPerPageLocal] = useState<number>();
131
+ const [itemsPerPageLocal, setItemsPerPageLocal] = useState<number>(10);
132
132
  const federationContext = useFederationContext();
133
133
  const [data, setData] = useState<IPageable<T>>();
134
134
  const [isLoading, setIsLoading] = useState(false);
@@ -137,15 +137,17 @@ function DataTableServer<T extends DataTableInternalItems>({
137
137
 
138
138
  const [hasMounted, setHasMounted] = useState(false);
139
139
 
140
- const [currentPage, setCurrentPage] = useState<number>();
140
+ const [currentPage, setCurrentPage] = useState<number>(0);
141
141
  const [selectedItems, setSelectedItems] = useState<T[]>([]);
142
142
  const [fulltextSearch, setFulltextSearch] = useState("");
143
143
  const [filterOptions, setFilterOptions] = useState<Record<string, any[]>>({});
144
144
  const [columnFilters, setColumnFilters] = useState<{ [key: string]: any }>(
145
145
  {}
146
146
  );
147
- const [showColFilters, setShowColFilters] = useState<boolean>();
147
+ const [showColFilters, setShowColFilters] = useState<boolean>(false);
148
148
  const [sortConfig, setSortConfig] = useState<ISortConfig | null>(null);
149
+ const prevDepsRef = useRef<any[]>([]);
150
+ const prevFilterDepsRef = useRef<any[]>([]);
149
151
 
150
152
  const createDataPageable = (
151
153
  response: any,
@@ -171,24 +173,53 @@ function DataTableServer<T extends DataTableInternalItems>({
171
173
  const mergedFilters: { [key: string]: any } = useMemo(() => {
172
174
  return showColFilters ? { ...columnFilters, ...filters } : filters || {};
173
175
  }, [columnFilters, filters, showColFilters]);
174
-
175
176
  useEffect(() => {
176
- setReloadData(true);
177
+ const currentDeps = [
178
+ url,
179
+ showColFilters,
180
+ columnFilters,
181
+ itemsPerPageLocal,
182
+ currentPage,
183
+ sortConfig,
184
+ filters,
185
+ tableKey,
186
+ ];
187
+
188
+ // Kontrola, jestli se skutečně něco změnilo
189
+ const hasChanged = currentDeps.some((dep, index) => {
190
+ return JSON.stringify(dep) !== JSON.stringify(prevDepsRef.current[index]);
191
+ });
192
+
193
+ if (hasChanged) {
194
+ console.log(
195
+ "setting reloadData - actual change detected",
196
+ url,
197
+ showColFilters,
198
+ columnFilters,
199
+ itemsPerPageLocal,
200
+ currentPage,
201
+ sortConfig,
202
+ filters,
203
+ tableKey,
204
+ reloadData
205
+ );
206
+ setReloadData(true);
207
+ }
208
+
209
+ prevDepsRef.current = currentDeps;
177
210
  }, [
178
211
  url,
179
212
  showColFilters,
180
- // id,
181
213
  columnFilters,
182
214
  itemsPerPageLocal,
183
215
  currentPage,
184
216
  sortConfig,
185
- federationContext.apiClient,
186
- federationContext.emitter,
187
217
  filters,
188
218
  tableKey,
189
219
  ]);
190
220
 
191
221
  useEffect(() => {
222
+ console.log("reloadData", reloadData);
192
223
  if (reloadData) {
193
224
  if (abortControllerRef.current) {
194
225
  abortControllerRef.current.abort();
@@ -307,66 +338,92 @@ function DataTableServer<T extends DataTableInternalItems>({
307
338
  }, [id]);
308
339
 
309
340
  useEffect(() => {
310
- const fetchFilterOptions = async (column: DataTableColumn<T>) => {
311
- if (column.filterOptions) {
312
- return column.filterOptions;
313
- } else if (column.filterSource) {
314
- try {
315
- const response = await federationContext.apiClient.get(
316
- column.filterSource
317
- );
318
-
319
- const options = response.data.map((item: any) => ({
320
- value: item[column.filterValueKey as keyof typeof item]?.toString(),
321
- label: item[column.filterLabelKey as keyof typeof item]?.toString(),
322
- }));
323
- return options;
324
- } catch (error) {
325
- console.error("Error fetching filter options:", error);
326
- return [];
327
- }
341
+ const currentFilterDeps = [columns, federationContext.apiClient];
342
+
343
+ // Kontrola, jestli se skutečně něco změnilo
344
+ const hasFilterChanged = currentFilterDeps.some((dep, index) => {
345
+ const prev = prevFilterDepsRef.current[index];
346
+ if (index === 1) {
347
+ // federationContext.apiClient (index 1) - referenční porovnání
348
+ return dep !== prev;
328
349
  } else {
329
- return [];
350
+ // columns (index 0) - deep porovnání
351
+ return JSON.stringify(dep) !== JSON.stringify(prev);
330
352
  }
331
- };
353
+ });
332
354
 
333
- const updateFilterOptions = async () => {
334
- const newFilterOptions: Record<string, any[]> = {};
335
-
336
- for (const column of columns) {
337
- if (
338
- (column.filterType === "select" ||
339
- column.filterType === "multi-select") &&
340
- (column.filterSource || column.filterOptions) &&
341
- column.filterValueKey &&
342
- column.filterLabelKey &&
343
- column.filterParam
344
- ) {
345
- const options = await fetchFilterOptions(column);
346
-
347
- if (options && column.filterType === "select") {
348
- // Filter out empty values and add a "clear" option
349
- const filteredOptions = options.filter(
350
- (option: IOptionItem) =>
351
- option.value !== null &&
352
- option.value !== undefined &&
353
- option.value !== ""
355
+ if (hasFilterChanged) {
356
+ const fetchFilterOptions = async (column: DataTableColumn<T>) => {
357
+ if (column.filterOptions) {
358
+ return column.filterOptions;
359
+ } else if (column.filterSource) {
360
+ try {
361
+ const response = await federationContext.apiClient.get(
362
+ column.filterSource
354
363
  );
355
- newFilterOptions[column.filterParam as string] = [
356
- { value: "__clear__", label: "Všechny" },
357
- ...filteredOptions,
358
- ];
359
- } else if (options && column.filterType === "multi-select") {
360
- newFilterOptions[column.filterParam as string] = options;
364
+
365
+ const options = response.data.map((item: any) => ({
366
+ value:
367
+ item[column.filterValueKey as keyof typeof item]?.toString(),
368
+ label:
369
+ item[column.filterLabelKey as keyof typeof item]?.toString(),
370
+ }));
371
+ return options;
372
+ } catch (error) {
373
+ console.error("Error fetching filter options:", error);
374
+ return [];
375
+ }
376
+ } else {
377
+ return [];
378
+ }
379
+ };
380
+
381
+ const updateFilterOptions = async () => {
382
+ const newFilterOptions: Record<string, any[]> = {};
383
+
384
+ for (const column of columns) {
385
+ if (
386
+ (column.filterType === "select" ||
387
+ column.filterType === "multi-select") &&
388
+ (column.filterSource || column.filterOptions) &&
389
+ column.filterValueKey &&
390
+ column.filterLabelKey &&
391
+ column.filterParam
392
+ ) {
393
+ const options = await fetchFilterOptions(column);
394
+
395
+ if (options && column.filterType === "select") {
396
+ // Filter out empty values and add a "clear" option
397
+ const filteredOptions = options.filter(
398
+ (option: IOptionItem) =>
399
+ option.value !== null &&
400
+ option.value !== undefined &&
401
+ option.value !== ""
402
+ );
403
+ newFilterOptions[column.filterParam as string] = [
404
+ { value: "__clear__", label: "Všechny" },
405
+ ...filteredOptions,
406
+ ];
407
+ } else if (options && column.filterType === "multi-select") {
408
+ newFilterOptions[column.filterParam as string] = options;
409
+ }
361
410
  }
362
411
  }
363
- }
364
412
 
365
- setFilterOptions(newFilterOptions);
366
- };
413
+ setFilterOptions(newFilterOptions);
414
+ };
415
+
416
+ console.log(
417
+ "updateFilterOptions - actual change detected",
418
+ columns,
419
+ federationContext.apiClient
420
+ );
421
+ updateFilterOptions();
422
+ }
367
423
 
368
- updateFilterOptions();
424
+ prevFilterDepsRef.current = currentFilterDeps;
369
425
  }, [columns, federationContext.apiClient]);
426
+
370
427
  const hasSomeColFilters = useMemo(() => {
371
428
  return columns.some((column) => !!column.filterParam);
372
429
  }, [columns]);
@@ -848,7 +905,12 @@ function DataTableServer<T extends DataTableInternalItems>({
848
905
  <div
849
906
  className="p-0 m-0 pb-2"
850
907
  onClick={(e) => e.stopPropagation()}
851
- data-cy={"datatable-filter-container-" + id + "-" + String(key)}
908
+ data-cy={
909
+ "datatable-filter-container-" +
910
+ id +
911
+ "-" +
912
+ String(key)
913
+ }
852
914
  >
853
915
  {filterType === "select" ? (
854
916
  <Select
@@ -867,15 +929,11 @@ function DataTableServer<T extends DataTableInternalItems>({
867
929
  String(filterParam)
868
930
  ]?.toString() || "__clear__"
869
931
  }
870
-
871
932
  disabled={Object.keys(
872
933
  (filters as object) || {}
873
934
  ).includes(String(filterParam))}
874
935
  >
875
- <SelectTrigger
876
-
877
- className="flex-1 w-full px-2 font-normal placeholder-muted-foreground"
878
- >
936
+ <SelectTrigger className="flex-1 w-full px-2 font-normal placeholder-muted-foreground">
879
937
  <SelectValue placeholder="Zadejte filtr" />
880
938
  </SelectTrigger>
881
939
  <SelectContent>
@@ -921,7 +979,7 @@ function DataTableServer<T extends DataTableInternalItems>({
921
979
  ).includes(String(filterParam))}
922
980
  variant="secondary"
923
981
  maxCount={0}
924
- />
982
+ />
925
983
  ) : filterType === "dateRange" ? (
926
984
  <DateRangeField
927
985
  // key={JSON.stringify(mergedFilters)}
@@ -147,12 +147,13 @@ const DateTimePicker = forwardRef<HTMLInputElement, DateTimePickerProps>(
147
147
  });
148
148
 
149
149
  return (
150
- <Popover>
150
+ <Popover open={disabled ? false : undefined}>
151
151
  <PopoverTrigger asChild>
152
152
  <div className={cn("relative w-full", className)}>
153
153
  <Input
154
154
  ref={ref}
155
155
  type="text"
156
+ disabled={disabled}
156
157
  value={inputValue || ""}
157
158
  onChange={handleInputChange}
158
159
  onBlur={handleInputBlur}
@@ -164,7 +165,7 @@ const DateTimePicker = forwardRef<HTMLInputElement, DateTimePickerProps>(
164
165
  {...props}
165
166
  />
166
167
  <CalendarClockIcon className="absolute left-2 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" />
167
- {clearable && disabled && inputValue && (
168
+ {clearable && !disabled && inputValue && (
168
169
  <Button
169
170
  type="button"
170
171
  variant="ghost"
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@addsign/moje-agenda-shared-lib",
3
3
  "private": false,
4
- "version": "2.0.59",
4
+ "version": "2.0.61",
5
5
  "type": "module",
6
6
  "main": "dist/main.js",
7
7
  "types": "dist/main.d.ts",