@addsign/moje-agenda-shared-lib 2.0.77 → 2.0.79
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.
- package/dist/components/datatable/DataTableServer.js +32 -8
- package/dist/components/datatable/DataTableServer.js.map +1 -1
- package/dist/components/datatable/types.d.ts +1 -0
- package/dist/components/ui/DateTimePicker.d.ts +2 -0
- package/dist/components/ui/DateTimePicker.js +17 -12
- package/dist/components/ui/DateTimePicker.js.map +1 -1
- package/lib/components/datatable/DataTableServer.tsx +34 -7
- package/lib/components/datatable/types.ts +1 -0
- package/lib/components/ui/DateTimePicker.tsx +21 -13
- package/package.json +2 -1
|
@@ -7,6 +7,8 @@ interface DateTimePickerProps {
|
|
|
7
7
|
placeholder?: string;
|
|
8
8
|
clearable?: boolean;
|
|
9
9
|
disabled?: boolean;
|
|
10
|
+
/** Granularita času v minutách (musí dělit 60 beze zbytku). Default 30. */
|
|
11
|
+
minuteStep?: number;
|
|
10
12
|
}
|
|
11
13
|
declare const DateTimePicker: React.ForwardRefExoticComponent<DateTimePickerProps & React.RefAttributes<HTMLInputElement>>;
|
|
12
14
|
export default DateTimePicker;
|
|
@@ -62,14 +62,14 @@ function set(date, values) {
|
|
|
62
62
|
return _date;
|
|
63
63
|
}
|
|
64
64
|
const DATE_FORMAT = "dd.MM.yyyy HH:mm";
|
|
65
|
-
const
|
|
66
|
-
const
|
|
67
|
-
const
|
|
65
|
+
const roundToNearestStep = (date, stepMinutes) => {
|
|
66
|
+
const totalMinutes = date.getHours() * 60 + date.getMinutes();
|
|
67
|
+
const rounded = Math.round(totalMinutes / stepMinutes) * stepMinutes;
|
|
68
68
|
return set(date, {
|
|
69
69
|
seconds: 0,
|
|
70
70
|
milliseconds: 0,
|
|
71
|
-
|
|
72
|
-
|
|
71
|
+
hours: Math.floor(rounded / 60),
|
|
72
|
+
minutes: rounded % 60
|
|
73
73
|
});
|
|
74
74
|
};
|
|
75
75
|
const DateTimePicker = forwardRef(
|
|
@@ -80,20 +80,21 @@ const DateTimePicker = forwardRef(
|
|
|
80
80
|
clearable = true,
|
|
81
81
|
placeholder,
|
|
82
82
|
disabled,
|
|
83
|
+
minuteStep = 30,
|
|
83
84
|
...props
|
|
84
85
|
}, ref) => {
|
|
85
86
|
const [dateTime, setDateTime] = React__default.useState(value || null);
|
|
86
87
|
const [inputValue, setInputValue] = React__default.useState("");
|
|
87
88
|
useEffect(() => {
|
|
88
89
|
if (value) {
|
|
89
|
-
const roundedDate =
|
|
90
|
+
const roundedDate = roundToNearestStep(value, minuteStep);
|
|
90
91
|
setDateTime(roundedDate);
|
|
91
92
|
setInputValue(format(roundedDate, DATE_FORMAT));
|
|
92
93
|
} else {
|
|
93
94
|
setDateTime(null);
|
|
94
95
|
setInputValue("");
|
|
95
96
|
}
|
|
96
|
-
}, [value]);
|
|
97
|
+
}, [value, minuteStep]);
|
|
97
98
|
const handleInputChange = (event) => {
|
|
98
99
|
event.stopPropagation ? event.stopPropagation() : null;
|
|
99
100
|
console.log(
|
|
@@ -158,11 +159,15 @@ const DateTimePicker = forwardRef(
|
|
|
158
159
|
setDateTime(null);
|
|
159
160
|
onChange == null ? void 0 : onChange(null);
|
|
160
161
|
};
|
|
161
|
-
const timeOptions =
|
|
162
|
-
const
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
162
|
+
const timeOptions = React__default.useMemo(() => {
|
|
163
|
+
const count = Math.floor(24 * 60 / minuteStep);
|
|
164
|
+
return Array.from({ length: count }, (_, i) => {
|
|
165
|
+
const total = i * minuteStep;
|
|
166
|
+
const hours = Math.floor(total / 60);
|
|
167
|
+
const minutes = total % 60;
|
|
168
|
+
return `${hours.toString().padStart(2, "0")}:${minutes.toString().padStart(2, "0")}`;
|
|
169
|
+
});
|
|
170
|
+
}, [minuteStep]);
|
|
166
171
|
return /* @__PURE__ */ jsxs(Popover, { open: disabled ? false : void 0, children: [
|
|
167
172
|
/* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs("div", { className: cn("relative w-full", className), children: [
|
|
168
173
|
/* @__PURE__ */ jsx(
|
|
@@ -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}\n\n// Helper function to round to the nearest half-hour\nconst roundToNearestHalfHour = (date: Date) => {\n const minutes = date.getMinutes();\n const roundedMinutes = minutes < 15 ? 0 : minutes < 45 ? 30 : 60;\n return set(date, {\n seconds: 0,\n milliseconds: 0,\n minutes: roundedMinutes,\n hours: roundedMinutes === 60 ? date.getHours() + 1 : date.getHours(),\n });\n};\n\nconst DateTimePicker = forwardRef<HTMLInputElement, DateTimePickerProps>(\n (\n {\n value,\n onChange,\n className,\n clearable = true,\n placeholder,\n disabled,\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 = roundToNearestHalfHour(value);\n setDateTime(roundedDate);\n setInputValue(format(roundedDate, DATE_FORMAT));\n } else {\n setDateTime(null);\n setInputValue(\"\");\n }\n }, [value]);\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 = Array.from({ length: 48 }, (_, i) => {\n const hours = Math.floor(i / 2);\n const minutes = i % 2 === 0 ? \"00\" : \"30\";\n return `${hours.toString().padStart(2, \"0\")}:${minutes}`;\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 <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/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]}
|
|
@@ -989,6 +989,7 @@ function DataTableServer<T extends DataTableInternalItems>({
|
|
|
989
989
|
filterType,
|
|
990
990
|
filterParam,
|
|
991
991
|
filterParam2,
|
|
992
|
+
filterTransform,
|
|
992
993
|
},
|
|
993
994
|
index
|
|
994
995
|
) => (
|
|
@@ -1020,7 +1021,7 @@ function DataTableServer<T extends DataTableInternalItems>({
|
|
|
1020
1021
|
return (filterValue && filterValue !== "") || (filterValue2 && filterValue2 !== "");
|
|
1021
1022
|
}
|
|
1022
1023
|
|
|
1023
|
-
if (filterType === "date" || filterType === "text") {
|
|
1024
|
+
if (filterType === "date" || filterType === "text" || filterType === "number") {
|
|
1024
1025
|
return filterValue && filterValue !== "";
|
|
1025
1026
|
}
|
|
1026
1027
|
|
|
@@ -1169,7 +1170,7 @@ function DataTableServer<T extends DataTableInternalItems>({
|
|
|
1169
1170
|
onInputChange={(e) =>
|
|
1170
1171
|
filterHandler(
|
|
1171
1172
|
e.target.name as keyof T,
|
|
1172
|
-
e.target.value
|
|
1173
|
+
filterTransform ? filterTransform(e.target.value) : e.target.value
|
|
1173
1174
|
)
|
|
1174
1175
|
}
|
|
1175
1176
|
type={filterType}
|
|
@@ -1196,7 +1197,7 @@ function DataTableServer<T extends DataTableInternalItems>({
|
|
|
1196
1197
|
onInputChange={(e) =>
|
|
1197
1198
|
filterHandler(
|
|
1198
1199
|
e.target.name as keyof T,
|
|
1199
|
-
e.target.value
|
|
1200
|
+
filterTransform ? filterTransform(e.target.value) : e.target.value
|
|
1200
1201
|
)
|
|
1201
1202
|
}
|
|
1202
1203
|
type={filterType}
|
|
@@ -1213,12 +1214,15 @@ function DataTableServer<T extends DataTableInternalItems>({
|
|
|
1213
1214
|
/>
|
|
1214
1215
|
) : filterType === "text" ? (
|
|
1215
1216
|
<Input
|
|
1216
|
-
onChange={(e) =>
|
|
1217
|
+
onChange={(e) => {
|
|
1218
|
+
const val = filterTransform
|
|
1219
|
+
? filterTransform(e.target.value)
|
|
1220
|
+
: e.target.value;
|
|
1217
1221
|
filterHandler(
|
|
1218
1222
|
filterParam as keyof T,
|
|
1219
|
-
|
|
1220
|
-
)
|
|
1221
|
-
}
|
|
1223
|
+
val
|
|
1224
|
+
);
|
|
1225
|
+
}}
|
|
1222
1226
|
value={
|
|
1223
1227
|
mergedFilters?.[String(filterParam)] || ""
|
|
1224
1228
|
}
|
|
@@ -1231,6 +1235,29 @@ function DataTableServer<T extends DataTableInternalItems>({
|
|
|
1231
1235
|
placeholder={"Zadejte filtr"}
|
|
1232
1236
|
debounceTimeout={1000}
|
|
1233
1237
|
/>
|
|
1238
|
+
) : filterType === "number" ? (
|
|
1239
|
+
<Input
|
|
1240
|
+
onChange={(e) => {
|
|
1241
|
+
const val = filterTransform
|
|
1242
|
+
? filterTransform(e.target.value)
|
|
1243
|
+
: e.target.value;
|
|
1244
|
+
filterHandler(
|
|
1245
|
+
filterParam as keyof T,
|
|
1246
|
+
val
|
|
1247
|
+
);
|
|
1248
|
+
}}
|
|
1249
|
+
value={
|
|
1250
|
+
mergedFilters?.[String(filterParam)] || ""
|
|
1251
|
+
}
|
|
1252
|
+
disabled={Object.keys(
|
|
1253
|
+
(filters as object) || {}
|
|
1254
|
+
).includes(String(filterParam))}
|
|
1255
|
+
clearable
|
|
1256
|
+
className="min-w-[100px] px-2 font-normal placeholder-muted-foreground"
|
|
1257
|
+
placeholder={"Zadejte filtr"}
|
|
1258
|
+
debounceTimeout={1000}
|
|
1259
|
+
type="number"
|
|
1260
|
+
/>
|
|
1234
1261
|
) : null}
|
|
1235
1262
|
</div>
|
|
1236
1263
|
)}
|
|
@@ -25,17 +25,18 @@ interface DateTimePickerProps {
|
|
|
25
25
|
placeholder?: string;
|
|
26
26
|
clearable?: boolean;
|
|
27
27
|
disabled?: boolean;
|
|
28
|
+
/** Granularita času v minutách (musí dělit 60 beze zbytku). Default 30. */
|
|
29
|
+
minuteStep?: number;
|
|
28
30
|
}
|
|
29
31
|
|
|
30
|
-
|
|
31
|
-
const
|
|
32
|
-
const
|
|
33
|
-
const roundedMinutes = minutes < 15 ? 0 : minutes < 45 ? 30 : 60;
|
|
32
|
+
const roundToNearestStep = (date: Date, stepMinutes: number) => {
|
|
33
|
+
const totalMinutes = date.getHours() * 60 + date.getMinutes();
|
|
34
|
+
const rounded = Math.round(totalMinutes / stepMinutes) * stepMinutes;
|
|
34
35
|
return set(date, {
|
|
35
36
|
seconds: 0,
|
|
36
37
|
milliseconds: 0,
|
|
37
|
-
|
|
38
|
-
|
|
38
|
+
hours: Math.floor(rounded / 60),
|
|
39
|
+
minutes: rounded % 60,
|
|
39
40
|
});
|
|
40
41
|
};
|
|
41
42
|
|
|
@@ -48,6 +49,7 @@ const DateTimePicker = forwardRef<HTMLInputElement, DateTimePickerProps>(
|
|
|
48
49
|
clearable = true,
|
|
49
50
|
placeholder,
|
|
50
51
|
disabled,
|
|
52
|
+
minuteStep = 30,
|
|
51
53
|
...props
|
|
52
54
|
},
|
|
53
55
|
ref
|
|
@@ -57,14 +59,14 @@ const DateTimePicker = forwardRef<HTMLInputElement, DateTimePickerProps>(
|
|
|
57
59
|
|
|
58
60
|
useEffect(() => {
|
|
59
61
|
if (value) {
|
|
60
|
-
const roundedDate =
|
|
62
|
+
const roundedDate = roundToNearestStep(value, minuteStep);
|
|
61
63
|
setDateTime(roundedDate);
|
|
62
64
|
setInputValue(format(roundedDate, DATE_FORMAT));
|
|
63
65
|
} else {
|
|
64
66
|
setDateTime(null);
|
|
65
67
|
setInputValue("");
|
|
66
68
|
}
|
|
67
|
-
}, [value]);
|
|
69
|
+
}, [value, minuteStep]);
|
|
68
70
|
|
|
69
71
|
const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {
|
|
70
72
|
event.stopPropagation ? event.stopPropagation() : null; // Stop bubbling to prevent interference with other components
|
|
@@ -140,11 +142,17 @@ const DateTimePicker = forwardRef<HTMLInputElement, DateTimePickerProps>(
|
|
|
140
142
|
onChange?.(null);
|
|
141
143
|
};
|
|
142
144
|
|
|
143
|
-
const timeOptions =
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
145
|
+
const timeOptions = React.useMemo(() => {
|
|
146
|
+
const count = Math.floor((24 * 60) / minuteStep);
|
|
147
|
+
return Array.from({ length: count }, (_, i) => {
|
|
148
|
+
const total = i * minuteStep;
|
|
149
|
+
const hours = Math.floor(total / 60);
|
|
150
|
+
const minutes = total % 60;
|
|
151
|
+
return `${hours.toString().padStart(2, "0")}:${minutes
|
|
152
|
+
.toString()
|
|
153
|
+
.padStart(2, "0")}`;
|
|
154
|
+
});
|
|
155
|
+
}, [minuteStep]);
|
|
148
156
|
|
|
149
157
|
return (
|
|
150
158
|
<Popover open={disabled ? false : undefined}>
|
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.
|
|
4
|
+
"version": "2.0.79",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/main.js",
|
|
7
7
|
"types": "dist/main.d.ts",
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
"lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
|
|
20
20
|
"preview": "vite preview",
|
|
21
21
|
"prepublishOnly": "npm run build",
|
|
22
|
+
"release": "npm version patch && npm login && npm publish --access public",
|
|
22
23
|
"dev": "vite build --watch",
|
|
23
24
|
"storybook": "storybook dev -p 6006",
|
|
24
25
|
"build-storybook": "storybook build"
|