@bsol-oss/react-datatable5 12.0.0-beta.64 → 12.0.0-beta.66

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/index.js CHANGED
@@ -4114,7 +4114,7 @@ const EnumPicker = ({ column, isMultiple = false, schema, prefix, showTotalAndLi
4114
4114
  setOpenSearchResult(true);
4115
4115
  }, justifyContent: "start", children: !!watchEnum === false
4116
4116
  ? ""
4117
- : translate.t(removeIndex(`${colLabel}.${watchEnum ?? "null"}`)) })), jsxRuntime.jsxs(PopoverRoot, { open: openSearchResult, onOpenChange: (e) => setOpenSearchResult(e.open), closeOnInteractOutside: true, initialFocusEl: () => ref.current, positioning: { placement: "bottom-start" }, children: [jsxRuntime.jsx(PopoverTrigger, {}), jsxRuntime.jsx(PopoverContent, { children: jsxRuntime.jsxs(PopoverBody, { display: "grid", gap: 1, children: [jsxRuntime.jsx(react.Input, { placeholder: translate.t(`${colLabel}.type_to_search`), onChange: (event) => {
4117
+ : translate.t(removeIndex(`${colLabel}.${watchEnum ?? "null"}`)) })), jsxRuntime.jsxs(PopoverRoot, { open: openSearchResult, onOpenChange: (e) => setOpenSearchResult(e.open), closeOnInteractOutside: true, initialFocusEl: () => ref.current, positioning: { placement: "bottom-start" }, children: [jsxRuntime.jsx(PopoverTrigger, {}), jsxRuntime.jsx(PopoverContent, { portalled: false, children: jsxRuntime.jsxs(PopoverBody, { display: "grid", gap: 1, children: [jsxRuntime.jsx(react.Input, { placeholder: translate.t(`${colLabel}.type_to_search`), onChange: (event) => {
4118
4118
  onSearchChange(event);
4119
4119
  setOpenSearchResult(true);
4120
4120
  }, autoComplete: "off", ref: ref }), jsxRuntime.jsx(PopoverTitle, {}), showTotalAndLimit && (jsxRuntime.jsx(react.Text, { children: `${translate.t(removeIndex(`${colLabel}.total`))}: ${count}, ${translate.t(removeIndex(`${colLabel}.showing`))} ${limit}` })), jsxRuntime.jsxs(react.Grid, { overflow: "auto", maxHeight: "20rem", children: [jsxRuntime.jsx(react.Flex, { flexFlow: "column wrap", children: dataList
@@ -4701,7 +4701,7 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
4701
4701
  setOpenSearchResult(true);
4702
4702
  }, children: translate.t(removeIndex(`${colLabel}.add_more`)) })] })), !isMultiple && (jsxRuntime.jsx(Button, { variant: "outline", onClick: () => {
4703
4703
  setOpenSearchResult(true);
4704
- }, justifyContent: "start", children: queryDefault.isLoading ? jsxRuntime.jsx(react.Spinner, { size: "sm" }) : getPickedValue() })), jsxRuntime.jsxs(PopoverRoot, { open: openSearchResult, onOpenChange: (e) => setOpenSearchResult(e.open), closeOnInteractOutside: true, initialFocusEl: () => ref.current, positioning: { placement: "bottom-start", strategy: "fixed" }, children: [jsxRuntime.jsx(PopoverTrigger, {}), jsxRuntime.jsx(PopoverContent, { children: jsxRuntime.jsxs(PopoverBody, { display: "grid", gap: 1, children: [jsxRuntime.jsx(react.Input, { placeholder: translate.t(removeIndex(`${colLabel}.type_to_search`)), onChange: onSearchChange, autoComplete: "off", ref: ref, value: searchText }), jsxRuntime.jsx(PopoverTitle, {}), openSearchResult && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [(isFetching || isLoading || isPending) && jsxRuntime.jsx(react.Spinner, {}), isError && (jsxRuntime.jsx(react.Icon, { color: "red.400", children: jsxRuntime.jsx(bi.BiError, {}) })), jsxRuntime.jsxs(react.Flex, { justifyContent: "space-between", alignItems: "center", children: [jsxRuntime.jsxs(react.Flex, { alignItems: "center", gap: "2", children: [jsxRuntime.jsx(InfoTip, { children: `${translate.t(removeIndex(`${colLabel}.total`))} ${count}, ${translate.t(removeIndex(`${colLabel}.showing`))} ${limit} ${translate.t(removeIndex(`${colLabel}.per_page`), "per page")}` }), jsxRuntime.jsxs(react.Text, { fontSize: "sm", fontWeight: "bold", children: [count, jsxRuntime.jsxs(react.Text, { as: "span", fontSize: "xs", ml: "1", color: "gray.500", children: ["/ ", count > 0 ? `${page * limit + 1}-${Math.min((page + 1) * limit, count)}` : '0'] })] })] }), jsxRuntime.jsx(react.Box, { children: jsxRuntime.jsxs("select", { value: limit, onChange: handleLimitChange, style: {
4704
+ }, justifyContent: "start", children: queryDefault.isLoading ? jsxRuntime.jsx(react.Spinner, { size: "sm" }) : getPickedValue() })), jsxRuntime.jsxs(PopoverRoot, { open: openSearchResult, onOpenChange: (e) => setOpenSearchResult(e.open), closeOnInteractOutside: true, initialFocusEl: () => ref.current, positioning: { placement: "bottom-start", strategy: "fixed" }, children: [jsxRuntime.jsx(PopoverTrigger, {}), jsxRuntime.jsx(PopoverContent, { portalled: false, children: jsxRuntime.jsxs(PopoverBody, { display: "grid", gap: 1, children: [jsxRuntime.jsx(react.Input, { placeholder: translate.t(removeIndex(`${colLabel}.type_to_search`)), onChange: onSearchChange, autoComplete: "off", ref: ref, value: searchText }), jsxRuntime.jsx(PopoverTitle, {}), openSearchResult && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [(isFetching || isLoading || isPending) && jsxRuntime.jsx(react.Spinner, {}), isError && (jsxRuntime.jsx(react.Icon, { color: "red.400", children: jsxRuntime.jsx(bi.BiError, {}) })), jsxRuntime.jsxs(react.Flex, { justifyContent: "space-between", alignItems: "center", children: [jsxRuntime.jsxs(react.Flex, { alignItems: "center", gap: "2", children: [jsxRuntime.jsx(InfoTip, { children: `${translate.t(removeIndex(`${colLabel}.total`))} ${count}, ${translate.t(removeIndex(`${colLabel}.showing`))} ${limit} ${translate.t(removeIndex(`${colLabel}.per_page`), "per page")}` }), jsxRuntime.jsxs(react.Text, { fontSize: "sm", fontWeight: "bold", children: [count, jsxRuntime.jsxs(react.Text, { as: "span", fontSize: "xs", ml: "1", color: "gray.500", children: ["/ ", count > 0 ? `${page * limit + 1}-${Math.min((page + 1) * limit, count)}` : '0'] })] })] }), jsxRuntime.jsx(react.Box, { children: jsxRuntime.jsxs("select", { value: limit, onChange: handleLimitChange, style: {
4705
4705
  padding: "4px 8px",
4706
4706
  borderRadius: "4px",
4707
4707
  border: "1px solid #ccc",
@@ -5031,99 +5031,130 @@ const TextAreaInput = ({ column, schema, prefix, }) => {
5031
5031
  function TimePicker$1({ hour, setHour, minute, setMinute, meridiem, setMeridiem, meridiemLabel = {
5032
5032
  am: "am",
5033
5033
  pm: "pm",
5034
- }, onChange = (_newValue) => { }, }) {
5035
- // Refs for focus management
5036
- const hourInputRef = React.useRef(null);
5037
- const minuteInputRef = React.useRef(null);
5038
- React.useRef(null);
5039
- // Centralized handler for key events, value changes, and focus management
5040
- const handleKeyDown = (e, field) => {
5041
- const input = e.target;
5042
- const value = input.value;
5043
- // Handle navigation between fields
5044
- if (e.key === "Tab") {
5045
- // Tab is handled by the browser, no need to override
5034
+ }, onChange = (_newValue) => { }, timezone = "Asia/Hong_Kong", }) {
5035
+ const handleClear = () => {
5036
+ setHour(null);
5037
+ setMinute(null);
5038
+ setMeridiem(null);
5039
+ setInputValue("");
5040
+ setShowInput(false);
5041
+ onChange({ hour: null, minute: null, meridiem: null });
5042
+ };
5043
+ const getTimeString = (hour, minute, meridiem) => {
5044
+ if (hour === null || minute === null || meridiem === null) {
5045
+ return "";
5046
+ }
5047
+ // if the hour is 24, set the hour to 0
5048
+ if (hour === 24) {
5049
+ return dayjs().tz(timezone).hour(0).minute(minute).format("HH:mmZ");
5050
+ }
5051
+ // use dayjs to format the time at current timezone
5052
+ // if meridiem is pm, add 12 hours
5053
+ let newHour = hour;
5054
+ if (meridiem === "pm" && hour !== 12) {
5055
+ newHour = hour + 12;
5056
+ }
5057
+ // if the hour is 12, set the meridiem to am, and set the hour to 0
5058
+ else if (meridiem === "am" && hour === 12) {
5059
+ newHour = 0;
5060
+ }
5061
+ return dayjs().tz(timezone).hour(newHour).minute(minute).format("HH:mmZ");
5062
+ };
5063
+ const stringTime = getTimeString(hour, minute, meridiem);
5064
+ const [inputValue, setInputValue] = React.useState("");
5065
+ const [showInput, setShowInput] = React.useState(false);
5066
+ const handleBlur = (text) => {
5067
+ // ignore all non-numeric characters
5068
+ if (!text) {
5046
5069
  return;
5047
5070
  }
5048
- if (e.key === ":" && field === "hour") {
5049
- e.preventDefault();
5050
- minuteInputRef.current?.focus();
5071
+ const value = text.replace(/[^0-9apm]/g, "");
5072
+ if (value === "") {
5073
+ handleClear();
5051
5074
  return;
5052
5075
  }
5053
- if (e.key === "Backspace" && value === "") {
5054
- e.preventDefault();
5055
- if (field === "minute") {
5056
- hourInputRef.current?.focus();
5057
- }
5058
- else if (field === "meridiem") {
5059
- minuteInputRef.current?.focus();
5060
- }
5076
+ // if the value is a valid time, parse it and set the hour, minute, and meridiem
5077
+ // if the value is not a valid time, set the stringTime to the value
5078
+ // first two characters are the hour
5079
+ // next two characters are the minute
5080
+ // final two characters are the meridiem
5081
+ const hour = parseInt(value.slice(0, 2));
5082
+ const minute = parseInt(value.slice(2, 4));
5083
+ const meridiem = value.slice(4, 6);
5084
+ // validate the hour and minute
5085
+ if (isNaN(hour) || isNaN(minute)) {
5086
+ setInputValue("");
5061
5087
  return;
5062
5088
  }
5063
- // Handle number inputs
5064
- if (field === "hour") {
5065
- if (e.key.match(/^[0-9]$/)) {
5066
- const newValue = value + e.key;
5067
- const numValue = parseInt(newValue, 10);
5068
- console.log("newValue", newValue, numValue);
5069
- if (numValue > 12) {
5070
- const digitValue = parseInt(e.key, 10);
5071
- setHour(digitValue);
5072
- onChange({ hour: digitValue, minute, meridiem });
5073
- return;
5074
- }
5075
- // Auto-advance to minutes if we have a valid hour (1-12)
5076
- if (numValue >= 1 && numValue <= 12) {
5077
- // Set the hour value
5078
- setHour(numValue);
5079
- onChange({ hour: numValue, minute, meridiem });
5080
- // Move to minute input
5081
- e.preventDefault();
5082
- minuteInputRef.current?.focus();
5083
- }
5084
- }
5089
+ // if the hour is larger than 24, set the hour to 24
5090
+ if (hour > 24) {
5091
+ setInputValue("");
5092
+ return;
5085
5093
  }
5086
- else if (field === "minute") {
5087
- if (e.key.match(/^[0-9]$/)) {
5088
- const newValue = value + e.key;
5089
- const numValue = parseInt(newValue, 10);
5090
- console.log("newValue minute", newValue, numValue, numValue > 60, numValue >= 0 && numValue <= 59, e.key);
5091
- if (numValue > 60) {
5092
- const digitValue = parseInt(e.key, 10);
5093
- setMinute(digitValue);
5094
- onChange({ hour, minute: digitValue, meridiem });
5095
- return;
5096
- }
5097
- // Auto-advance to meridiem if we have a valid minute (0-59)
5098
- if (numValue >= 0 && numValue <= 59) {
5099
- // Set the minute value
5100
- setMinute(numValue);
5101
- onChange({ hour, minute: numValue, meridiem });
5102
- }
5103
- }
5094
+ let newHour = hour;
5095
+ let newMinute = minute;
5096
+ let newMeridiem = meridiem;
5097
+ // if the hour is 24, set the meridiem to am, and set the hour to 0
5098
+ if (hour === 24) {
5099
+ newMeridiem = "am";
5100
+ newHour = 0;
5104
5101
  }
5102
+ // if the hour is greater than 12, set the meridiem to pm, and subtract 12 from the hour
5103
+ else if (hour > 12) {
5104
+ newMeridiem = "pm";
5105
+ newHour = hour - 12;
5106
+ }
5107
+ // if the hour is 12, set the meridiem to pm, and set the hour to 12
5108
+ else if (hour === 12) {
5109
+ newMeridiem = "pm";
5110
+ newHour = 12;
5111
+ }
5112
+ // if the hour is 0, set the meridiem to am, and set the hour to 12
5113
+ else if (hour === 0) {
5114
+ newMeridiem = "am";
5115
+ newHour = 12;
5116
+ }
5117
+ else {
5118
+ newMeridiem = meridiem ?? "am";
5119
+ newHour = hour;
5120
+ }
5121
+ if (minute > 59) {
5122
+ newMinute = 0;
5123
+ }
5124
+ else {
5125
+ newMinute = minute;
5126
+ }
5127
+ onChange({
5128
+ hour: newHour,
5129
+ minute: newMinute,
5130
+ meridiem: newMeridiem,
5131
+ });
5132
+ setShowInput(false);
5105
5133
  };
5106
- // Handle meridiem button click
5107
- const handleMeridiemClick = (newMeridiem) => {
5108
- setMeridiem(newMeridiem);
5109
- onChange({ hour, minute, meridiem: newMeridiem });
5110
- };
5111
- const handleClear = () => {
5112
- setHour(null);
5113
- setMinute(null);
5114
- setMeridiem(null);
5115
- onChange({ hour: null, minute: null, meridiem: null });
5116
- // Focus the hour field after clearing
5117
- hourInputRef.current?.focus();
5134
+ const handleKeyDown = (e) => {
5135
+ if (e.key === "Enter") {
5136
+ handleBlur(e.currentTarget.value);
5137
+ }
5118
5138
  };
5119
- return (jsxRuntime.jsx(react.Flex, { direction: "column", gap: 3, children: jsxRuntime.jsxs(react.Grid, { justifyContent: "center", alignItems: "center", templateColumns: "60px 10px 60px 90px auto", gap: "2", width: "auto", minWidth: "250px", children: [jsxRuntime.jsx(react.Input, { ref: hourInputRef, type: "text", value: hour === null ? "" : hour.toString().padStart(2, "0"), onKeyDown: (e) => handleKeyDown(e, "hour"), placeholder: "HH", maxLength: 2, textAlign: "center" }), jsxRuntime.jsx(react.Text, { children: ":" }), jsxRuntime.jsx(react.Input, { ref: minuteInputRef, type: "text", value: minute === null ? "" : minute.toString().padStart(2, "0"), onKeyDown: (e) => handleKeyDown(e, "minute"), placeholder: "MM", maxLength: 2, textAlign: "center" }), jsxRuntime.jsxs(react.Flex, { gap: "1", children: [jsxRuntime.jsx(react.Button, { size: "sm", colorScheme: meridiem === "am" ? "blue" : "gray", variant: meridiem === "am" ? "solid" : "outline", onClick: () => handleMeridiemClick("am"), width: "40px", children: meridiemLabel.am }), jsxRuntime.jsx(react.Button, { size: "sm", colorScheme: meridiem === "pm" ? "blue" : "gray", variant: meridiem === "pm" ? "solid" : "outline", onClick: () => handleMeridiemClick("pm"), width: "40px", children: meridiemLabel.pm })] }), jsxRuntime.jsx(react.Button, { onClick: handleClear, size: "sm", variant: "ghost", children: jsxRuntime.jsx(md.MdCancel, {}) })] }) }));
5139
+ const inputRef = React.useRef(null);
5140
+ return (jsxRuntime.jsxs(react.Grid, { justifyContent: "center", alignItems: "center", templateColumns: "200px auto", gap: "2", width: "auto", minWidth: "250px", children: [jsxRuntime.jsx(react.Input, { onKeyDown: handleKeyDown, onChange: (e) => {
5141
+ setInputValue(e.currentTarget.value);
5142
+ }, onBlur: (e) => {
5143
+ handleBlur(e.currentTarget.value);
5144
+ }, value: inputValue, display: showInput ? undefined : "none", ref: inputRef }), jsxRuntime.jsxs(react.Button, { onClick: () => {
5145
+ setShowInput(true);
5146
+ setInputValue(dayjs(`1970-01-01T${getTimeString(hour, minute, meridiem)}`, "hh:mmZ").format("hh:mm a"));
5147
+ inputRef.current?.focus();
5148
+ }, display: showInput ? "none" : "flex", alignItems: "center", justifyContent: "start", variant: "outline", gap: 2, children: [jsxRuntime.jsx(react.Icon, { size: "sm", children: jsxRuntime.jsx(bs.BsClock, {}) }), jsxRuntime.jsx(react.Text, { fontSize: "sm", children: stringTime
5149
+ ? dayjs(`1970-01-01T${stringTime}`, "hh:mmZ").format("hh:mm a")
5150
+ : "" })] }), jsxRuntime.jsx(react.Button, { onClick: handleClear, size: "sm", variant: "ghost", children: jsxRuntime.jsx(md.MdCancel, {}) })] }));
5120
5151
  }
5121
5152
 
5122
5153
  dayjs.extend(timezone);
5123
5154
  const TimePicker = ({ column, schema, prefix }) => {
5124
5155
  const { watch, formState: { errors }, setValue, } = reactHookForm.useFormContext();
5125
5156
  const { translate, timezone } = useSchemaContext();
5126
- const { required, gridColumn = "span 4", gridRow = "span 1", timeFormat = "HH:mm:ssZ", displayTimeFormat = "hh:mm A", } = schema;
5157
+ const { required, gridColumn = "span 4", gridRow = "span 1", timeFormat = "HH:mmZ", displayTimeFormat = "hh:mm A", } = schema;
5127
5158
  const isRequired = required?.some((columnId) => columnId === column);
5128
5159
  const colLabel = `${prefix}${column}`;
5129
5160
  const [open, setOpen] = React.useState(false);
@@ -5131,13 +5162,14 @@ const TimePicker = ({ column, schema, prefix }) => {
5131
5162
  const displayedTime = dayjs(`1970-01-01T${value}`).tz(timezone).isValid()
5132
5163
  ? dayjs(`1970-01-01T${value}`).tz(timezone).format(displayTimeFormat)
5133
5164
  : "";
5134
- // Parse the initial time parts from the ISO time string (HH:mm:ss)
5135
- const parseTime = (isoTime) => {
5136
- if (!isoTime)
5165
+ // Parse the initial time parts from the time string (HH:mm:ssZ)
5166
+ const parseTime = (time) => {
5167
+ if (!time)
5137
5168
  return { hour: 12, minute: 0, meridiem: "am" };
5138
- const parsed = dayjs(`1970-01-01T${isoTime}`).tz(timezone);
5139
- if (!parsed.isValid())
5169
+ const parsed = dayjs(`1970-01-01T${time}`).tz(timezone);
5170
+ if (!parsed.isValid()) {
5140
5171
  return { hour: 12, minute: 0, meridiem: "am" };
5172
+ }
5141
5173
  let hour = parsed.hour();
5142
5174
  const minute = parsed.minute();
5143
5175
  const meridiem = hour >= 12 ? "pm" : "am";
@@ -5157,35 +5189,30 @@ const TimePicker = ({ column, schema, prefix }) => {
5157
5189
  setMinute(minute);
5158
5190
  setMeridiem(meridiem);
5159
5191
  }, [value]);
5160
- // Convert hour, minute, meridiem to 24-hour ISO time string
5161
- const toIsoTime = (hour, minute, meridiem) => {
5192
+ const getTimeString = (hour, minute, meridiem) => {
5162
5193
  if (hour === null || minute === null || meridiem === null)
5163
5194
  return null;
5164
- let h = hour;
5165
- if (meridiem === "am" && hour === 12)
5166
- h = 0;
5167
- else if (meridiem === "pm" && hour < 12)
5168
- h = hour + 12;
5169
- return dayjs(`1970-01-01T${h.toString().padStart(2, "0")}:${minute.toString().padStart(2, "0")}:00`)
5170
- .tz(timezone)
5171
- .format(timeFormat);
5195
+ let newHour = hour;
5196
+ if (meridiem === "pm" && hour !== 12) {
5197
+ newHour = hour + 12;
5198
+ }
5199
+ return dayjs().tz(timezone).hour(newHour).minute(minute).format(timeFormat);
5172
5200
  };
5173
5201
  // Handle changes to time parts
5174
5202
  const handleTimeChange = ({ hour: newHour, minute: newMinute, meridiem: newMeridiem, }) => {
5175
5203
  setHour(newHour);
5176
5204
  setMinute(newMinute);
5177
5205
  setMeridiem(newMeridiem);
5178
- const isoTime = toIsoTime(newHour, newMinute, newMeridiem);
5179
- setValue(colLabel, isoTime, { shouldValidate: true, shouldDirty: true });
5206
+ const timeString = getTimeString(newHour, newMinute, newMeridiem);
5207
+ setValue(colLabel, timeString, { shouldValidate: true, shouldDirty: true });
5180
5208
  };
5181
- const containerRef = React.useRef(null);
5182
5209
  return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.field_label`))}`, required: isRequired, alignItems: "stretch", gridColumn,
5183
5210
  gridRow, children: [jsxRuntime.jsxs(react.Popover.Root, { open: open, onOpenChange: (e) => setOpen(e.open), closeOnInteractOutside: true, children: [jsxRuntime.jsx(react.Popover.Trigger, { asChild: true, children: jsxRuntime.jsxs(Button, { size: "sm", variant: "outline", onClick: () => {
5184
5211
  setOpen(true);
5185
- }, justifyContent: "start", children: [jsxRuntime.jsx(io.IoMdClock, {}), !!value ? `${displayedTime}` : ""] }) }), jsxRuntime.jsx(react.Portal, { children: jsxRuntime.jsx(react.Popover.Positioner, { children: jsxRuntime.jsx(react.Popover.Content, { ref: containerRef, children: jsxRuntime.jsx(react.Popover.Body, { children: jsxRuntime.jsx(TimePicker$1, { hour: hour, setHour: setHour, minute: minute, setMinute: setMinute, meridiem: meridiem, setMeridiem: setMeridiem, onChange: handleTimeChange, meridiemLabel: {
5186
- am: translate.t(`common.am`, { defaultValue: "AM" }),
5187
- pm: translate.t(`common.pm`, { defaultValue: "PM" }),
5188
- } }) }) }) }) })] }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }));
5212
+ }, justifyContent: "start", children: [jsxRuntime.jsx(io.IoMdClock, {}), !!value ? `${displayedTime}` : ""] }) }), jsxRuntime.jsx(react.Popover.Positioner, { children: jsxRuntime.jsx(react.Popover.Content, { children: jsxRuntime.jsx(react.Popover.Body, { children: jsxRuntime.jsx(TimePicker$1, { hour: hour, setHour: setHour, minute: minute, setMinute: setMinute, meridiem: meridiem, setMeridiem: setMeridiem, onChange: handleTimeChange, meridiemLabel: {
5213
+ am: translate.t(`common.am`, { defaultValue: "AM" }),
5214
+ pm: translate.t(`common.pm`, { defaultValue: "PM" }),
5215
+ } }) }) }) })] }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }));
5189
5216
  };
5190
5217
 
5191
5218
  function IsoTimePicker({ hour, setHour, minute, setMinute, second, setSecond, onChange = (_newValue) => { }, }) {
package/dist/index.mjs CHANGED
@@ -20,7 +20,7 @@ import invariant from 'tiny-invariant';
20
20
  import { HiColorSwatch, HiOutlineInformationCircle } from 'react-icons/hi';
21
21
  import { flexRender, makeStateUpdater, functionalUpdate, useReactTable, getCoreRowModel, getFilteredRowModel, getSortedRowModel, getPaginationRowModel, createColumnHelper } from '@tanstack/react-table';
22
22
  import { rankItem } from '@tanstack/match-sorter-utils';
23
- import { BsExclamationCircleFill } from 'react-icons/bs';
23
+ import { BsExclamationCircleFill, BsClock } from 'react-icons/bs';
24
24
  import { useDebounce } from '@uidotdev/usehooks';
25
25
  import { useQueryClient, useQuery } from '@tanstack/react-query';
26
26
  import { IoReload } from 'react-icons/io5';
@@ -4094,7 +4094,7 @@ const EnumPicker = ({ column, isMultiple = false, schema, prefix, showTotalAndLi
4094
4094
  setOpenSearchResult(true);
4095
4095
  }, justifyContent: "start", children: !!watchEnum === false
4096
4096
  ? ""
4097
- : translate.t(removeIndex(`${colLabel}.${watchEnum ?? "null"}`)) })), jsxs(PopoverRoot, { open: openSearchResult, onOpenChange: (e) => setOpenSearchResult(e.open), closeOnInteractOutside: true, initialFocusEl: () => ref.current, positioning: { placement: "bottom-start" }, children: [jsx(PopoverTrigger, {}), jsx(PopoverContent, { children: jsxs(PopoverBody, { display: "grid", gap: 1, children: [jsx(Input, { placeholder: translate.t(`${colLabel}.type_to_search`), onChange: (event) => {
4097
+ : translate.t(removeIndex(`${colLabel}.${watchEnum ?? "null"}`)) })), jsxs(PopoverRoot, { open: openSearchResult, onOpenChange: (e) => setOpenSearchResult(e.open), closeOnInteractOutside: true, initialFocusEl: () => ref.current, positioning: { placement: "bottom-start" }, children: [jsx(PopoverTrigger, {}), jsx(PopoverContent, { portalled: false, children: jsxs(PopoverBody, { display: "grid", gap: 1, children: [jsx(Input, { placeholder: translate.t(`${colLabel}.type_to_search`), onChange: (event) => {
4098
4098
  onSearchChange(event);
4099
4099
  setOpenSearchResult(true);
4100
4100
  }, autoComplete: "off", ref: ref }), jsx(PopoverTitle, {}), showTotalAndLimit && (jsx(Text, { children: `${translate.t(removeIndex(`${colLabel}.total`))}: ${count}, ${translate.t(removeIndex(`${colLabel}.showing`))} ${limit}` })), jsxs(Grid, { overflow: "auto", maxHeight: "20rem", children: [jsx(Flex, { flexFlow: "column wrap", children: dataList
@@ -4681,7 +4681,7 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
4681
4681
  setOpenSearchResult(true);
4682
4682
  }, children: translate.t(removeIndex(`${colLabel}.add_more`)) })] })), !isMultiple && (jsx(Button, { variant: "outline", onClick: () => {
4683
4683
  setOpenSearchResult(true);
4684
- }, justifyContent: "start", children: queryDefault.isLoading ? jsx(Spinner, { size: "sm" }) : getPickedValue() })), jsxs(PopoverRoot, { open: openSearchResult, onOpenChange: (e) => setOpenSearchResult(e.open), closeOnInteractOutside: true, initialFocusEl: () => ref.current, positioning: { placement: "bottom-start", strategy: "fixed" }, children: [jsx(PopoverTrigger, {}), jsx(PopoverContent, { children: jsxs(PopoverBody, { display: "grid", gap: 1, children: [jsx(Input, { placeholder: translate.t(removeIndex(`${colLabel}.type_to_search`)), onChange: onSearchChange, autoComplete: "off", ref: ref, value: searchText }), jsx(PopoverTitle, {}), openSearchResult && (jsxs(Fragment, { children: [(isFetching || isLoading || isPending) && jsx(Spinner, {}), isError && (jsx(Icon, { color: "red.400", children: jsx(BiError, {}) })), jsxs(Flex, { justifyContent: "space-between", alignItems: "center", children: [jsxs(Flex, { alignItems: "center", gap: "2", children: [jsx(InfoTip, { children: `${translate.t(removeIndex(`${colLabel}.total`))} ${count}, ${translate.t(removeIndex(`${colLabel}.showing`))} ${limit} ${translate.t(removeIndex(`${colLabel}.per_page`), "per page")}` }), jsxs(Text, { fontSize: "sm", fontWeight: "bold", children: [count, jsxs(Text, { as: "span", fontSize: "xs", ml: "1", color: "gray.500", children: ["/ ", count > 0 ? `${page * limit + 1}-${Math.min((page + 1) * limit, count)}` : '0'] })] })] }), jsx(Box, { children: jsxs("select", { value: limit, onChange: handleLimitChange, style: {
4684
+ }, justifyContent: "start", children: queryDefault.isLoading ? jsx(Spinner, { size: "sm" }) : getPickedValue() })), jsxs(PopoverRoot, { open: openSearchResult, onOpenChange: (e) => setOpenSearchResult(e.open), closeOnInteractOutside: true, initialFocusEl: () => ref.current, positioning: { placement: "bottom-start", strategy: "fixed" }, children: [jsx(PopoverTrigger, {}), jsx(PopoverContent, { portalled: false, children: jsxs(PopoverBody, { display: "grid", gap: 1, children: [jsx(Input, { placeholder: translate.t(removeIndex(`${colLabel}.type_to_search`)), onChange: onSearchChange, autoComplete: "off", ref: ref, value: searchText }), jsx(PopoverTitle, {}), openSearchResult && (jsxs(Fragment, { children: [(isFetching || isLoading || isPending) && jsx(Spinner, {}), isError && (jsx(Icon, { color: "red.400", children: jsx(BiError, {}) })), jsxs(Flex, { justifyContent: "space-between", alignItems: "center", children: [jsxs(Flex, { alignItems: "center", gap: "2", children: [jsx(InfoTip, { children: `${translate.t(removeIndex(`${colLabel}.total`))} ${count}, ${translate.t(removeIndex(`${colLabel}.showing`))} ${limit} ${translate.t(removeIndex(`${colLabel}.per_page`), "per page")}` }), jsxs(Text, { fontSize: "sm", fontWeight: "bold", children: [count, jsxs(Text, { as: "span", fontSize: "xs", ml: "1", color: "gray.500", children: ["/ ", count > 0 ? `${page * limit + 1}-${Math.min((page + 1) * limit, count)}` : '0'] })] })] }), jsx(Box, { children: jsxs("select", { value: limit, onChange: handleLimitChange, style: {
4685
4685
  padding: "4px 8px",
4686
4686
  borderRadius: "4px",
4687
4687
  border: "1px solid #ccc",
@@ -5011,99 +5011,130 @@ const TextAreaInput = ({ column, schema, prefix, }) => {
5011
5011
  function TimePicker$1({ hour, setHour, minute, setMinute, meridiem, setMeridiem, meridiemLabel = {
5012
5012
  am: "am",
5013
5013
  pm: "pm",
5014
- }, onChange = (_newValue) => { }, }) {
5015
- // Refs for focus management
5016
- const hourInputRef = useRef(null);
5017
- const minuteInputRef = useRef(null);
5018
- useRef(null);
5019
- // Centralized handler for key events, value changes, and focus management
5020
- const handleKeyDown = (e, field) => {
5021
- const input = e.target;
5022
- const value = input.value;
5023
- // Handle navigation between fields
5024
- if (e.key === "Tab") {
5025
- // Tab is handled by the browser, no need to override
5014
+ }, onChange = (_newValue) => { }, timezone = "Asia/Hong_Kong", }) {
5015
+ const handleClear = () => {
5016
+ setHour(null);
5017
+ setMinute(null);
5018
+ setMeridiem(null);
5019
+ setInputValue("");
5020
+ setShowInput(false);
5021
+ onChange({ hour: null, minute: null, meridiem: null });
5022
+ };
5023
+ const getTimeString = (hour, minute, meridiem) => {
5024
+ if (hour === null || minute === null || meridiem === null) {
5025
+ return "";
5026
+ }
5027
+ // if the hour is 24, set the hour to 0
5028
+ if (hour === 24) {
5029
+ return dayjs().tz(timezone).hour(0).minute(minute).format("HH:mmZ");
5030
+ }
5031
+ // use dayjs to format the time at current timezone
5032
+ // if meridiem is pm, add 12 hours
5033
+ let newHour = hour;
5034
+ if (meridiem === "pm" && hour !== 12) {
5035
+ newHour = hour + 12;
5036
+ }
5037
+ // if the hour is 12, set the meridiem to am, and set the hour to 0
5038
+ else if (meridiem === "am" && hour === 12) {
5039
+ newHour = 0;
5040
+ }
5041
+ return dayjs().tz(timezone).hour(newHour).minute(minute).format("HH:mmZ");
5042
+ };
5043
+ const stringTime = getTimeString(hour, minute, meridiem);
5044
+ const [inputValue, setInputValue] = useState("");
5045
+ const [showInput, setShowInput] = useState(false);
5046
+ const handleBlur = (text) => {
5047
+ // ignore all non-numeric characters
5048
+ if (!text) {
5026
5049
  return;
5027
5050
  }
5028
- if (e.key === ":" && field === "hour") {
5029
- e.preventDefault();
5030
- minuteInputRef.current?.focus();
5051
+ const value = text.replace(/[^0-9apm]/g, "");
5052
+ if (value === "") {
5053
+ handleClear();
5031
5054
  return;
5032
5055
  }
5033
- if (e.key === "Backspace" && value === "") {
5034
- e.preventDefault();
5035
- if (field === "minute") {
5036
- hourInputRef.current?.focus();
5037
- }
5038
- else if (field === "meridiem") {
5039
- minuteInputRef.current?.focus();
5040
- }
5056
+ // if the value is a valid time, parse it and set the hour, minute, and meridiem
5057
+ // if the value is not a valid time, set the stringTime to the value
5058
+ // first two characters are the hour
5059
+ // next two characters are the minute
5060
+ // final two characters are the meridiem
5061
+ const hour = parseInt(value.slice(0, 2));
5062
+ const minute = parseInt(value.slice(2, 4));
5063
+ const meridiem = value.slice(4, 6);
5064
+ // validate the hour and minute
5065
+ if (isNaN(hour) || isNaN(minute)) {
5066
+ setInputValue("");
5041
5067
  return;
5042
5068
  }
5043
- // Handle number inputs
5044
- if (field === "hour") {
5045
- if (e.key.match(/^[0-9]$/)) {
5046
- const newValue = value + e.key;
5047
- const numValue = parseInt(newValue, 10);
5048
- console.log("newValue", newValue, numValue);
5049
- if (numValue > 12) {
5050
- const digitValue = parseInt(e.key, 10);
5051
- setHour(digitValue);
5052
- onChange({ hour: digitValue, minute, meridiem });
5053
- return;
5054
- }
5055
- // Auto-advance to minutes if we have a valid hour (1-12)
5056
- if (numValue >= 1 && numValue <= 12) {
5057
- // Set the hour value
5058
- setHour(numValue);
5059
- onChange({ hour: numValue, minute, meridiem });
5060
- // Move to minute input
5061
- e.preventDefault();
5062
- minuteInputRef.current?.focus();
5063
- }
5064
- }
5069
+ // if the hour is larger than 24, set the hour to 24
5070
+ if (hour > 24) {
5071
+ setInputValue("");
5072
+ return;
5065
5073
  }
5066
- else if (field === "minute") {
5067
- if (e.key.match(/^[0-9]$/)) {
5068
- const newValue = value + e.key;
5069
- const numValue = parseInt(newValue, 10);
5070
- console.log("newValue minute", newValue, numValue, numValue > 60, numValue >= 0 && numValue <= 59, e.key);
5071
- if (numValue > 60) {
5072
- const digitValue = parseInt(e.key, 10);
5073
- setMinute(digitValue);
5074
- onChange({ hour, minute: digitValue, meridiem });
5075
- return;
5076
- }
5077
- // Auto-advance to meridiem if we have a valid minute (0-59)
5078
- if (numValue >= 0 && numValue <= 59) {
5079
- // Set the minute value
5080
- setMinute(numValue);
5081
- onChange({ hour, minute: numValue, meridiem });
5082
- }
5083
- }
5074
+ let newHour = hour;
5075
+ let newMinute = minute;
5076
+ let newMeridiem = meridiem;
5077
+ // if the hour is 24, set the meridiem to am, and set the hour to 0
5078
+ if (hour === 24) {
5079
+ newMeridiem = "am";
5080
+ newHour = 0;
5084
5081
  }
5082
+ // if the hour is greater than 12, set the meridiem to pm, and subtract 12 from the hour
5083
+ else if (hour > 12) {
5084
+ newMeridiem = "pm";
5085
+ newHour = hour - 12;
5086
+ }
5087
+ // if the hour is 12, set the meridiem to pm, and set the hour to 12
5088
+ else if (hour === 12) {
5089
+ newMeridiem = "pm";
5090
+ newHour = 12;
5091
+ }
5092
+ // if the hour is 0, set the meridiem to am, and set the hour to 12
5093
+ else if (hour === 0) {
5094
+ newMeridiem = "am";
5095
+ newHour = 12;
5096
+ }
5097
+ else {
5098
+ newMeridiem = meridiem ?? "am";
5099
+ newHour = hour;
5100
+ }
5101
+ if (minute > 59) {
5102
+ newMinute = 0;
5103
+ }
5104
+ else {
5105
+ newMinute = minute;
5106
+ }
5107
+ onChange({
5108
+ hour: newHour,
5109
+ minute: newMinute,
5110
+ meridiem: newMeridiem,
5111
+ });
5112
+ setShowInput(false);
5085
5113
  };
5086
- // Handle meridiem button click
5087
- const handleMeridiemClick = (newMeridiem) => {
5088
- setMeridiem(newMeridiem);
5089
- onChange({ hour, minute, meridiem: newMeridiem });
5090
- };
5091
- const handleClear = () => {
5092
- setHour(null);
5093
- setMinute(null);
5094
- setMeridiem(null);
5095
- onChange({ hour: null, minute: null, meridiem: null });
5096
- // Focus the hour field after clearing
5097
- hourInputRef.current?.focus();
5114
+ const handleKeyDown = (e) => {
5115
+ if (e.key === "Enter") {
5116
+ handleBlur(e.currentTarget.value);
5117
+ }
5098
5118
  };
5099
- return (jsx(Flex, { direction: "column", gap: 3, children: jsxs(Grid, { justifyContent: "center", alignItems: "center", templateColumns: "60px 10px 60px 90px auto", gap: "2", width: "auto", minWidth: "250px", children: [jsx(Input, { ref: hourInputRef, type: "text", value: hour === null ? "" : hour.toString().padStart(2, "0"), onKeyDown: (e) => handleKeyDown(e, "hour"), placeholder: "HH", maxLength: 2, textAlign: "center" }), jsx(Text, { children: ":" }), jsx(Input, { ref: minuteInputRef, type: "text", value: minute === null ? "" : minute.toString().padStart(2, "0"), onKeyDown: (e) => handleKeyDown(e, "minute"), placeholder: "MM", maxLength: 2, textAlign: "center" }), jsxs(Flex, { gap: "1", children: [jsx(Button$1, { size: "sm", colorScheme: meridiem === "am" ? "blue" : "gray", variant: meridiem === "am" ? "solid" : "outline", onClick: () => handleMeridiemClick("am"), width: "40px", children: meridiemLabel.am }), jsx(Button$1, { size: "sm", colorScheme: meridiem === "pm" ? "blue" : "gray", variant: meridiem === "pm" ? "solid" : "outline", onClick: () => handleMeridiemClick("pm"), width: "40px", children: meridiemLabel.pm })] }), jsx(Button$1, { onClick: handleClear, size: "sm", variant: "ghost", children: jsx(MdCancel, {}) })] }) }));
5119
+ const inputRef = useRef(null);
5120
+ return (jsxs(Grid, { justifyContent: "center", alignItems: "center", templateColumns: "200px auto", gap: "2", width: "auto", minWidth: "250px", children: [jsx(Input, { onKeyDown: handleKeyDown, onChange: (e) => {
5121
+ setInputValue(e.currentTarget.value);
5122
+ }, onBlur: (e) => {
5123
+ handleBlur(e.currentTarget.value);
5124
+ }, value: inputValue, display: showInput ? undefined : "none", ref: inputRef }), jsxs(Button$1, { onClick: () => {
5125
+ setShowInput(true);
5126
+ setInputValue(dayjs(`1970-01-01T${getTimeString(hour, minute, meridiem)}`, "hh:mmZ").format("hh:mm a"));
5127
+ inputRef.current?.focus();
5128
+ }, display: showInput ? "none" : "flex", alignItems: "center", justifyContent: "start", variant: "outline", gap: 2, children: [jsx(Icon, { size: "sm", children: jsx(BsClock, {}) }), jsx(Text, { fontSize: "sm", children: stringTime
5129
+ ? dayjs(`1970-01-01T${stringTime}`, "hh:mmZ").format("hh:mm a")
5130
+ : "" })] }), jsx(Button$1, { onClick: handleClear, size: "sm", variant: "ghost", children: jsx(MdCancel, {}) })] }));
5100
5131
  }
5101
5132
 
5102
5133
  dayjs.extend(timezone);
5103
5134
  const TimePicker = ({ column, schema, prefix }) => {
5104
5135
  const { watch, formState: { errors }, setValue, } = useFormContext();
5105
5136
  const { translate, timezone } = useSchemaContext();
5106
- const { required, gridColumn = "span 4", gridRow = "span 1", timeFormat = "HH:mm:ssZ", displayTimeFormat = "hh:mm A", } = schema;
5137
+ const { required, gridColumn = "span 4", gridRow = "span 1", timeFormat = "HH:mmZ", displayTimeFormat = "hh:mm A", } = schema;
5107
5138
  const isRequired = required?.some((columnId) => columnId === column);
5108
5139
  const colLabel = `${prefix}${column}`;
5109
5140
  const [open, setOpen] = useState(false);
@@ -5111,13 +5142,14 @@ const TimePicker = ({ column, schema, prefix }) => {
5111
5142
  const displayedTime = dayjs(`1970-01-01T${value}`).tz(timezone).isValid()
5112
5143
  ? dayjs(`1970-01-01T${value}`).tz(timezone).format(displayTimeFormat)
5113
5144
  : "";
5114
- // Parse the initial time parts from the ISO time string (HH:mm:ss)
5115
- const parseTime = (isoTime) => {
5116
- if (!isoTime)
5145
+ // Parse the initial time parts from the time string (HH:mm:ssZ)
5146
+ const parseTime = (time) => {
5147
+ if (!time)
5117
5148
  return { hour: 12, minute: 0, meridiem: "am" };
5118
- const parsed = dayjs(`1970-01-01T${isoTime}`).tz(timezone);
5119
- if (!parsed.isValid())
5149
+ const parsed = dayjs(`1970-01-01T${time}`).tz(timezone);
5150
+ if (!parsed.isValid()) {
5120
5151
  return { hour: 12, minute: 0, meridiem: "am" };
5152
+ }
5121
5153
  let hour = parsed.hour();
5122
5154
  const minute = parsed.minute();
5123
5155
  const meridiem = hour >= 12 ? "pm" : "am";
@@ -5137,35 +5169,30 @@ const TimePicker = ({ column, schema, prefix }) => {
5137
5169
  setMinute(minute);
5138
5170
  setMeridiem(meridiem);
5139
5171
  }, [value]);
5140
- // Convert hour, minute, meridiem to 24-hour ISO time string
5141
- const toIsoTime = (hour, minute, meridiem) => {
5172
+ const getTimeString = (hour, minute, meridiem) => {
5142
5173
  if (hour === null || minute === null || meridiem === null)
5143
5174
  return null;
5144
- let h = hour;
5145
- if (meridiem === "am" && hour === 12)
5146
- h = 0;
5147
- else if (meridiem === "pm" && hour < 12)
5148
- h = hour + 12;
5149
- return dayjs(`1970-01-01T${h.toString().padStart(2, "0")}:${minute.toString().padStart(2, "0")}:00`)
5150
- .tz(timezone)
5151
- .format(timeFormat);
5175
+ let newHour = hour;
5176
+ if (meridiem === "pm" && hour !== 12) {
5177
+ newHour = hour + 12;
5178
+ }
5179
+ return dayjs().tz(timezone).hour(newHour).minute(minute).format(timeFormat);
5152
5180
  };
5153
5181
  // Handle changes to time parts
5154
5182
  const handleTimeChange = ({ hour: newHour, minute: newMinute, meridiem: newMeridiem, }) => {
5155
5183
  setHour(newHour);
5156
5184
  setMinute(newMinute);
5157
5185
  setMeridiem(newMeridiem);
5158
- const isoTime = toIsoTime(newHour, newMinute, newMeridiem);
5159
- setValue(colLabel, isoTime, { shouldValidate: true, shouldDirty: true });
5186
+ const timeString = getTimeString(newHour, newMinute, newMeridiem);
5187
+ setValue(colLabel, timeString, { shouldValidate: true, shouldDirty: true });
5160
5188
  };
5161
- const containerRef = useRef(null);
5162
5189
  return (jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.field_label`))}`, required: isRequired, alignItems: "stretch", gridColumn,
5163
5190
  gridRow, children: [jsxs(Popover.Root, { open: open, onOpenChange: (e) => setOpen(e.open), closeOnInteractOutside: true, children: [jsx(Popover.Trigger, { asChild: true, children: jsxs(Button, { size: "sm", variant: "outline", onClick: () => {
5164
5191
  setOpen(true);
5165
- }, justifyContent: "start", children: [jsx(IoMdClock, {}), !!value ? `${displayedTime}` : ""] }) }), jsx(Portal, { children: jsx(Popover.Positioner, { children: jsx(Popover.Content, { ref: containerRef, children: jsx(Popover.Body, { children: jsx(TimePicker$1, { hour: hour, setHour: setHour, minute: minute, setMinute: setMinute, meridiem: meridiem, setMeridiem: setMeridiem, onChange: handleTimeChange, meridiemLabel: {
5166
- am: translate.t(`common.am`, { defaultValue: "AM" }),
5167
- pm: translate.t(`common.pm`, { defaultValue: "PM" }),
5168
- } }) }) }) }) })] }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }));
5192
+ }, justifyContent: "start", children: [jsx(IoMdClock, {}), !!value ? `${displayedTime}` : ""] }) }), jsx(Popover.Positioner, { children: jsx(Popover.Content, { children: jsx(Popover.Body, { children: jsx(TimePicker$1, { hour: hour, setHour: setHour, minute: minute, setMinute: setMinute, meridiem: meridiem, setMeridiem: setMeridiem, onChange: handleTimeChange, meridiemLabel: {
5193
+ am: translate.t(`common.am`, { defaultValue: "AM" }),
5194
+ pm: translate.t(`common.pm`, { defaultValue: "PM" }),
5195
+ } }) }) }) })] }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }));
5169
5196
  };
5170
5197
 
5171
5198
  function IsoTimePicker({ hour, setHour, minute, setMinute, second, setSecond, onChange = (_newValue) => { }, }) {
@@ -15,6 +15,7 @@ interface TimePickerProps {
15
15
  am: string;
16
16
  pm: string;
17
17
  };
18
+ timezone?: string;
18
19
  }
19
- export declare function TimePicker({ hour, setHour, minute, setMinute, meridiem, setMeridiem, meridiemLabel, onChange, }: TimePickerProps): import("react/jsx-runtime").JSX.Element;
20
+ export declare function TimePicker({ hour, setHour, minute, setMinute, meridiem, setMeridiem, meridiemLabel, onChange, timezone, }: TimePickerProps): import("react/jsx-runtime").JSX.Element;
20
21
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bsol-oss/react-datatable5",
3
- "version": "12.0.0-beta.64",
3
+ "version": "12.0.0-beta.66",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",