@bsol-oss/react-datatable5 12.0.0-beta.40 → 12.0.0-beta.42

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.d.ts CHANGED
@@ -471,7 +471,8 @@ interface CustomJSONSchema7 extends JSONSchema7 {
471
471
  }) => ReactNode;
472
472
  dateFormat?: string;
473
473
  displayDateFormat?: string;
474
- format?: string;
474
+ timeFormat?: string;
475
+ displayTimeFormat?: string;
475
476
  }
476
477
 
477
478
  interface FormRootProps<TData extends FieldValues> {
package/dist/index.js CHANGED
@@ -4496,7 +4496,7 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
4496
4496
  borderRadius: "4px",
4497
4497
  border: "1px solid #ccc",
4498
4498
  fontSize: "14px",
4499
- }, children: [jsxRuntime.jsx("option", { value: "5", children: "5" }), jsxRuntime.jsx("option", { value: "10", children: "10" }), jsxRuntime.jsx("option", { value: "20", children: "20" }), jsxRuntime.jsx("option", { value: "50", children: "50" })] }) })] }), jsxRuntime.jsx(react.Grid, { gridTemplateColumns: "repeat(auto-fit, minmax(15rem, 1fr))", overflow: "auto", maxHeight: "50vh", children: dataList.length > 0 ? (jsxRuntime.jsx(react.Flex, { flexFlow: "column wrap", children: dataList.map((item) => {
4499
+ }, children: [jsxRuntime.jsx("option", { value: "5", children: "5" }), jsxRuntime.jsx("option", { value: "10", children: "10" }), jsxRuntime.jsx("option", { value: "20", children: "20" }), jsxRuntime.jsx("option", { value: "30", children: "30" })] }) })] }), jsxRuntime.jsx(react.Grid, { overflowY: "auto", children: dataList.length > 0 ? (jsxRuntime.jsx(react.Flex, { flexFlow: "column wrap", gap: 1, children: dataList.map((item) => {
4500
4500
  const selected = isMultiple
4501
4501
  ? watchIds.some((id) => item[column_ref] === id)
4502
4502
  : watchId === item[column_ref];
@@ -4734,7 +4734,7 @@ function TimePicker$1({ hour, setHour, minute, setMinute, meridiem, setMeridiem,
4734
4734
  // Refs for focus management
4735
4735
  const hourInputRef = React.useRef(null);
4736
4736
  const minuteInputRef = React.useRef(null);
4737
- const meridiemInputRef = React.useRef(null);
4737
+ React.useRef(null);
4738
4738
  // Centralized handler for key events, value changes, and focus management
4739
4739
  const handleKeyDown = (e, field) => {
4740
4740
  const input = e.target;
@@ -4786,9 +4786,10 @@ function TimePicker$1({ hour, setHour, minute, setMinute, meridiem, setMeridiem,
4786
4786
  if (e.key.match(/^[0-9]$/)) {
4787
4787
  const newValue = value + e.key;
4788
4788
  const numValue = parseInt(newValue, 10);
4789
+ console.log("newValue minute", newValue, numValue, numValue > 60, numValue >= 0 && numValue <= 59, e.key);
4789
4790
  if (numValue > 60) {
4790
4791
  const digitValue = parseInt(e.key, 10);
4791
- setHour(digitValue);
4792
+ setMinute(digitValue);
4792
4793
  onChange({ hour, minute: digitValue, meridiem });
4793
4794
  return;
4794
4795
  }
@@ -4797,93 +4798,7 @@ function TimePicker$1({ hour, setHour, minute, setMinute, meridiem, setMeridiem,
4797
4798
  // Set the minute value
4798
4799
  setMinute(numValue);
4799
4800
  onChange({ hour, minute: numValue, meridiem });
4800
- // Move to meridiem input
4801
- e.preventDefault();
4802
- meridiemInputRef.current?.focus();
4803
- }
4804
- }
4805
- }
4806
- else if (field === "meridiem") {
4807
- const key = e.key.toLowerCase();
4808
- if (key === "a") {
4809
- e.preventDefault();
4810
- setMeridiem("am");
4811
- onChange({ hour, minute, meridiem: "am" });
4812
- input.value = "am";
4813
- }
4814
- else if (key === "p") {
4815
- e.preventDefault();
4816
- setMeridiem("pm");
4817
- onChange({ hour, minute, meridiem: "pm" });
4818
- input.value = "pm";
4819
- }
4820
- }
4821
- };
4822
- // Handle input blur events to validate and format values
4823
- const handleBlur = (e, field) => {
4824
- const value = e.target.value;
4825
- if (field === "hour") {
4826
- if (value === "") {
4827
- if (hour !== null) {
4828
- setHour(null);
4829
- onChange({ hour: null, minute, meridiem });
4830
- }
4831
- return;
4832
- }
4833
- const numValue = parseInt(value, 10);
4834
- if (isNaN(numValue) || numValue < 1 || numValue > 12) {
4835
- setHour(null);
4836
- onChange({ hour: null, minute, meridiem });
4837
- }
4838
- else if (hour !== numValue) {
4839
- setHour(numValue);
4840
- onChange({ hour: numValue, minute, meridiem });
4841
- }
4842
- }
4843
- else if (field === "minute") {
4844
- if (value === "") {
4845
- if (minute !== null) {
4846
- setMinute(null);
4847
- onChange({ hour, minute: null, meridiem });
4848
- }
4849
- return;
4850
- }
4851
- const numValue = parseInt(value, 10);
4852
- if (isNaN(numValue) || numValue < 0 || numValue > 59) {
4853
- setMinute(null);
4854
- onChange({ hour, minute: null, meridiem });
4855
- }
4856
- else if (minute !== numValue) {
4857
- setMinute(numValue);
4858
- onChange({ hour, minute: numValue, meridiem });
4859
- }
4860
- }
4861
- else if (field === "meridiem") {
4862
- if (value === "") {
4863
- if (meridiem !== null) {
4864
- setMeridiem(null);
4865
- onChange({ hour, minute, meridiem: null });
4866
4801
  }
4867
- return;
4868
- }
4869
- const lowerValue = value.toLowerCase();
4870
- if (lowerValue !== "am" && lowerValue !== "pm") {
4871
- if (lowerValue === "a") {
4872
- setMeridiem("am");
4873
- onChange({ hour, minute, meridiem: "am" });
4874
- }
4875
- else if (lowerValue === "p") {
4876
- setMeridiem("pm");
4877
- onChange({ hour, minute, meridiem: "pm" });
4878
- }
4879
- else {
4880
- setMeridiem(null);
4881
- onChange({ hour, minute, meridiem: null });
4882
- }
4883
- }
4884
- else if (meridiem !== lowerValue) {
4885
- setMeridiem(lowerValue);
4886
- onChange({ hour, minute, meridiem: lowerValue });
4887
4802
  }
4888
4803
  }
4889
4804
  };
@@ -4900,26 +4815,25 @@ function TimePicker$1({ hour, setHour, minute, setMinute, meridiem, setMeridiem,
4900
4815
  // Focus the hour field after clearing
4901
4816
  hourInputRef.current?.focus();
4902
4817
  };
4903
- function handleFocus(event) {
4904
- event.target.select();
4905
- }
4906
- 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"), onBlur: (e) => handleBlur(e, "hour"), onFocus: handleFocus, 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"), onBlur: (e) => handleBlur(e, "minute"), onFocus: handleFocus, 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, {}) })] }) }));
4818
+ 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, {}) })] }) }));
4907
4819
  }
4908
4820
 
4909
4821
  const TimePicker = ({ column, schema, prefix }) => {
4910
4822
  const { watch, formState: { errors }, setValue, } = reactHookForm.useFormContext();
4911
4823
  const { translate } = useSchemaContext();
4912
- const { required, gridColumn = "span 4", gridRow = "span 1", format } = schema;
4824
+ const { required, gridColumn = "span 4", gridRow = "span 1", timeFormat = "HH:mm:ss", displayTimeFormat = "hh:mm A", } = schema;
4913
4825
  const isRequired = required?.some((columnId) => columnId === column);
4914
4826
  const colLabel = `${prefix}${column}`;
4915
4827
  const [open, setOpen] = React.useState(false);
4916
4828
  const value = watch(colLabel);
4917
- const formatedTime = value ? dayjs(value).format("hh:mm A") : "";
4829
+ const displayedTime = dayjs(`1970-01-01T${value}Z`).isValid()
4830
+ ? dayjs(`1970-01-01T${value}Z`).utc().format(displayTimeFormat)
4831
+ : "";
4918
4832
  // Parse the initial time parts from the ISO time string (HH:mm:ss)
4919
4833
  const parseTime = (isoTime) => {
4920
4834
  if (!isoTime)
4921
4835
  return { hour: 12, minute: 0, meridiem: "am" };
4922
- const parsed = dayjs(isoTime);
4836
+ const parsed = dayjs(`1970-01-01T${isoTime}Z`).utc();
4923
4837
  if (!parsed.isValid())
4924
4838
  return { hour: 12, minute: 0, meridiem: "am" };
4925
4839
  let hour = parsed.hour();
@@ -4950,7 +4864,9 @@ const TimePicker = ({ column, schema, prefix }) => {
4950
4864
  h = 0;
4951
4865
  else if (meridiem === "pm" && hour < 12)
4952
4866
  h = hour + 12;
4953
- return dayjs().hour(h).minute(minute).second(0).format(format);
4867
+ return dayjs(`1970-01-01T${h.toString().padStart(2, "0")}:${minute.toString().padStart(2, "0")}:00Z`)
4868
+ .utc()
4869
+ .format(timeFormat);
4954
4870
  };
4955
4871
  // Handle changes to time parts
4956
4872
  const handleTimeChange = ({ hour: newHour, minute: newMinute, meridiem: newMeridiem, }) => {
@@ -4964,7 +4880,7 @@ const TimePicker = ({ column, schema, prefix }) => {
4964
4880
  return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.field_label`))}`, required: isRequired, alignItems: "stretch", gridColumn,
4965
4881
  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: () => {
4966
4882
  setOpen(true);
4967
- }, justifyContent: "start", children: [jsxRuntime.jsx(io.IoMdClock, {}), value !== undefined ? `${formatedTime}` : ""] }) }), 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: {
4883
+ }, 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: {
4968
4884
  am: translate.t(removeIndex(`common.am`)),
4969
4885
  pm: translate.t(removeIndex(`common.pm`)),
4970
4886
  } }) }) }) }) })] }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }));
@@ -5337,22 +5253,23 @@ const TextAreaViewer = ({ column, schema, prefix, }) => {
5337
5253
  return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.field_label`))}`, required: isRequired, gridColumn: gridColumn, gridRow: gridRow, children: [jsxRuntime.jsx(react.Text, { whiteSpace: "pre-wrap", children: value }), " ", errors[colLabel] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }) }));
5338
5254
  };
5339
5255
 
5340
- const TimeViewer = ({ column, schema, prefix }) => {
5256
+ const TimeViewer = ({ column, schema, prefix, }) => {
5341
5257
  const { watch, formState: { errors }, } = reactHookForm.useFormContext();
5342
5258
  const { translate } = useSchemaContext();
5343
- const { required, gridColumn = "span 4", gridRow = "span 1" } = schema;
5259
+ const { required, gridColumn = "span 4", gridRow = "span 1", displayTimeFormat = "hh:mm A" } = schema;
5344
5260
  const isRequired = required?.some((columnId) => columnId === column);
5345
5261
  const colLabel = `${prefix}${column}`;
5346
5262
  const selectedDate = watch(colLabel);
5263
+ const displayedTime = dayjs(`1970-01-01T${selectedDate}Z`).isValid()
5264
+ ? dayjs(`1970-01-01T${selectedDate}Z`).utc().format(displayTimeFormat)
5265
+ : "";
5347
5266
  return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${column}.field_label`))}`, required: isRequired, alignItems: "stretch", gridColumn,
5348
- gridRow, children: [jsxRuntime.jsx(react.Text, { children: selectedDate !== undefined
5349
- ? dayjs(selectedDate).format("hh:mm A")
5350
- : "" }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${column}.field_required`) }))] }));
5267
+ gridRow, children: [jsxRuntime.jsx(react.Text, { children: displayedTime }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${column}.field_required`) }))] }));
5351
5268
  };
5352
5269
 
5353
5270
  const SchemaViewer = ({ schema, prefix, column, }) => {
5354
5271
  const colSchema = schema;
5355
- const { type, variant, properties: innerProperties, foreign_key, items, } = schema;
5272
+ const { type, variant, properties: innerProperties, foreign_key, items, format, } = schema;
5356
5273
  if (variant === "custom-input") {
5357
5274
  return jsxRuntime.jsx(CustomViewer, { schema: colSchema, prefix, column });
5358
5275
  }
@@ -5364,12 +5281,12 @@ const SchemaViewer = ({ schema, prefix, column, }) => {
5364
5281
  idPickerSanityCheck(column, foreign_key);
5365
5282
  return jsxRuntime.jsx(IdViewer, { schema: colSchema, prefix, column });
5366
5283
  }
5367
- if (variant === "date-picker") {
5368
- return jsxRuntime.jsx(DateViewer, { schema: colSchema, prefix, column });
5369
- }
5370
- if (variant === "time-picker") {
5284
+ if (format === "time") {
5371
5285
  return jsxRuntime.jsx(TimeViewer, { schema: colSchema, prefix, column });
5372
5286
  }
5287
+ if (format === "date") {
5288
+ return jsxRuntime.jsx(DateViewer, { schema: colSchema, prefix, column });
5289
+ }
5373
5290
  if (variant === "text-area") {
5374
5291
  return jsxRuntime.jsx(TextAreaViewer, { schema: colSchema, prefix, column });
5375
5292
  }
package/dist/index.mjs CHANGED
@@ -4476,7 +4476,7 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
4476
4476
  borderRadius: "4px",
4477
4477
  border: "1px solid #ccc",
4478
4478
  fontSize: "14px",
4479
- }, children: [jsx("option", { value: "5", children: "5" }), jsx("option", { value: "10", children: "10" }), jsx("option", { value: "20", children: "20" }), jsx("option", { value: "50", children: "50" })] }) })] }), jsx(Grid, { gridTemplateColumns: "repeat(auto-fit, minmax(15rem, 1fr))", overflow: "auto", maxHeight: "50vh", children: dataList.length > 0 ? (jsx(Flex, { flexFlow: "column wrap", children: dataList.map((item) => {
4479
+ }, children: [jsx("option", { value: "5", children: "5" }), jsx("option", { value: "10", children: "10" }), jsx("option", { value: "20", children: "20" }), jsx("option", { value: "30", children: "30" })] }) })] }), jsx(Grid, { overflowY: "auto", children: dataList.length > 0 ? (jsx(Flex, { flexFlow: "column wrap", gap: 1, children: dataList.map((item) => {
4480
4480
  const selected = isMultiple
4481
4481
  ? watchIds.some((id) => item[column_ref] === id)
4482
4482
  : watchId === item[column_ref];
@@ -4714,7 +4714,7 @@ function TimePicker$1({ hour, setHour, minute, setMinute, meridiem, setMeridiem,
4714
4714
  // Refs for focus management
4715
4715
  const hourInputRef = useRef(null);
4716
4716
  const minuteInputRef = useRef(null);
4717
- const meridiemInputRef = useRef(null);
4717
+ useRef(null);
4718
4718
  // Centralized handler for key events, value changes, and focus management
4719
4719
  const handleKeyDown = (e, field) => {
4720
4720
  const input = e.target;
@@ -4766,9 +4766,10 @@ function TimePicker$1({ hour, setHour, minute, setMinute, meridiem, setMeridiem,
4766
4766
  if (e.key.match(/^[0-9]$/)) {
4767
4767
  const newValue = value + e.key;
4768
4768
  const numValue = parseInt(newValue, 10);
4769
+ console.log("newValue minute", newValue, numValue, numValue > 60, numValue >= 0 && numValue <= 59, e.key);
4769
4770
  if (numValue > 60) {
4770
4771
  const digitValue = parseInt(e.key, 10);
4771
- setHour(digitValue);
4772
+ setMinute(digitValue);
4772
4773
  onChange({ hour, minute: digitValue, meridiem });
4773
4774
  return;
4774
4775
  }
@@ -4777,93 +4778,7 @@ function TimePicker$1({ hour, setHour, minute, setMinute, meridiem, setMeridiem,
4777
4778
  // Set the minute value
4778
4779
  setMinute(numValue);
4779
4780
  onChange({ hour, minute: numValue, meridiem });
4780
- // Move to meridiem input
4781
- e.preventDefault();
4782
- meridiemInputRef.current?.focus();
4783
- }
4784
- }
4785
- }
4786
- else if (field === "meridiem") {
4787
- const key = e.key.toLowerCase();
4788
- if (key === "a") {
4789
- e.preventDefault();
4790
- setMeridiem("am");
4791
- onChange({ hour, minute, meridiem: "am" });
4792
- input.value = "am";
4793
- }
4794
- else if (key === "p") {
4795
- e.preventDefault();
4796
- setMeridiem("pm");
4797
- onChange({ hour, minute, meridiem: "pm" });
4798
- input.value = "pm";
4799
- }
4800
- }
4801
- };
4802
- // Handle input blur events to validate and format values
4803
- const handleBlur = (e, field) => {
4804
- const value = e.target.value;
4805
- if (field === "hour") {
4806
- if (value === "") {
4807
- if (hour !== null) {
4808
- setHour(null);
4809
- onChange({ hour: null, minute, meridiem });
4810
- }
4811
- return;
4812
- }
4813
- const numValue = parseInt(value, 10);
4814
- if (isNaN(numValue) || numValue < 1 || numValue > 12) {
4815
- setHour(null);
4816
- onChange({ hour: null, minute, meridiem });
4817
- }
4818
- else if (hour !== numValue) {
4819
- setHour(numValue);
4820
- onChange({ hour: numValue, minute, meridiem });
4821
- }
4822
- }
4823
- else if (field === "minute") {
4824
- if (value === "") {
4825
- if (minute !== null) {
4826
- setMinute(null);
4827
- onChange({ hour, minute: null, meridiem });
4828
- }
4829
- return;
4830
- }
4831
- const numValue = parseInt(value, 10);
4832
- if (isNaN(numValue) || numValue < 0 || numValue > 59) {
4833
- setMinute(null);
4834
- onChange({ hour, minute: null, meridiem });
4835
- }
4836
- else if (minute !== numValue) {
4837
- setMinute(numValue);
4838
- onChange({ hour, minute: numValue, meridiem });
4839
- }
4840
- }
4841
- else if (field === "meridiem") {
4842
- if (value === "") {
4843
- if (meridiem !== null) {
4844
- setMeridiem(null);
4845
- onChange({ hour, minute, meridiem: null });
4846
4781
  }
4847
- return;
4848
- }
4849
- const lowerValue = value.toLowerCase();
4850
- if (lowerValue !== "am" && lowerValue !== "pm") {
4851
- if (lowerValue === "a") {
4852
- setMeridiem("am");
4853
- onChange({ hour, minute, meridiem: "am" });
4854
- }
4855
- else if (lowerValue === "p") {
4856
- setMeridiem("pm");
4857
- onChange({ hour, minute, meridiem: "pm" });
4858
- }
4859
- else {
4860
- setMeridiem(null);
4861
- onChange({ hour, minute, meridiem: null });
4862
- }
4863
- }
4864
- else if (meridiem !== lowerValue) {
4865
- setMeridiem(lowerValue);
4866
- onChange({ hour, minute, meridiem: lowerValue });
4867
4782
  }
4868
4783
  }
4869
4784
  };
@@ -4880,26 +4795,25 @@ function TimePicker$1({ hour, setHour, minute, setMinute, meridiem, setMeridiem,
4880
4795
  // Focus the hour field after clearing
4881
4796
  hourInputRef.current?.focus();
4882
4797
  };
4883
- function handleFocus(event) {
4884
- event.target.select();
4885
- }
4886
- 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"), onBlur: (e) => handleBlur(e, "hour"), onFocus: handleFocus, 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"), onBlur: (e) => handleBlur(e, "minute"), onFocus: handleFocus, 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, {}) })] }) }));
4798
+ 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, {}) })] }) }));
4887
4799
  }
4888
4800
 
4889
4801
  const TimePicker = ({ column, schema, prefix }) => {
4890
4802
  const { watch, formState: { errors }, setValue, } = useFormContext();
4891
4803
  const { translate } = useSchemaContext();
4892
- const { required, gridColumn = "span 4", gridRow = "span 1", format } = schema;
4804
+ const { required, gridColumn = "span 4", gridRow = "span 1", timeFormat = "HH:mm:ss", displayTimeFormat = "hh:mm A", } = schema;
4893
4805
  const isRequired = required?.some((columnId) => columnId === column);
4894
4806
  const colLabel = `${prefix}${column}`;
4895
4807
  const [open, setOpen] = useState(false);
4896
4808
  const value = watch(colLabel);
4897
- const formatedTime = value ? dayjs(value).format("hh:mm A") : "";
4809
+ const displayedTime = dayjs(`1970-01-01T${value}Z`).isValid()
4810
+ ? dayjs(`1970-01-01T${value}Z`).utc().format(displayTimeFormat)
4811
+ : "";
4898
4812
  // Parse the initial time parts from the ISO time string (HH:mm:ss)
4899
4813
  const parseTime = (isoTime) => {
4900
4814
  if (!isoTime)
4901
4815
  return { hour: 12, minute: 0, meridiem: "am" };
4902
- const parsed = dayjs(isoTime);
4816
+ const parsed = dayjs(`1970-01-01T${isoTime}Z`).utc();
4903
4817
  if (!parsed.isValid())
4904
4818
  return { hour: 12, minute: 0, meridiem: "am" };
4905
4819
  let hour = parsed.hour();
@@ -4930,7 +4844,9 @@ const TimePicker = ({ column, schema, prefix }) => {
4930
4844
  h = 0;
4931
4845
  else if (meridiem === "pm" && hour < 12)
4932
4846
  h = hour + 12;
4933
- return dayjs().hour(h).minute(minute).second(0).format(format);
4847
+ return dayjs(`1970-01-01T${h.toString().padStart(2, "0")}:${minute.toString().padStart(2, "0")}:00Z`)
4848
+ .utc()
4849
+ .format(timeFormat);
4934
4850
  };
4935
4851
  // Handle changes to time parts
4936
4852
  const handleTimeChange = ({ hour: newHour, minute: newMinute, meridiem: newMeridiem, }) => {
@@ -4944,7 +4860,7 @@ const TimePicker = ({ column, schema, prefix }) => {
4944
4860
  return (jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.field_label`))}`, required: isRequired, alignItems: "stretch", gridColumn,
4945
4861
  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: () => {
4946
4862
  setOpen(true);
4947
- }, justifyContent: "start", children: [jsx(IoMdClock, {}), value !== undefined ? `${formatedTime}` : ""] }) }), 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: {
4863
+ }, 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: {
4948
4864
  am: translate.t(removeIndex(`common.am`)),
4949
4865
  pm: translate.t(removeIndex(`common.pm`)),
4950
4866
  } }) }) }) }) })] }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }));
@@ -5317,22 +5233,23 @@ const TextAreaViewer = ({ column, schema, prefix, }) => {
5317
5233
  return (jsx(Fragment, { children: jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.field_label`))}`, required: isRequired, gridColumn: gridColumn, gridRow: gridRow, children: [jsx(Text, { whiteSpace: "pre-wrap", children: value }), " ", errors[colLabel] && (jsx(Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }) }));
5318
5234
  };
5319
5235
 
5320
- const TimeViewer = ({ column, schema, prefix }) => {
5236
+ const TimeViewer = ({ column, schema, prefix, }) => {
5321
5237
  const { watch, formState: { errors }, } = useFormContext();
5322
5238
  const { translate } = useSchemaContext();
5323
- const { required, gridColumn = "span 4", gridRow = "span 1" } = schema;
5239
+ const { required, gridColumn = "span 4", gridRow = "span 1", displayTimeFormat = "hh:mm A" } = schema;
5324
5240
  const isRequired = required?.some((columnId) => columnId === column);
5325
5241
  const colLabel = `${prefix}${column}`;
5326
5242
  const selectedDate = watch(colLabel);
5243
+ const displayedTime = dayjs(`1970-01-01T${selectedDate}Z`).isValid()
5244
+ ? dayjs(`1970-01-01T${selectedDate}Z`).utc().format(displayTimeFormat)
5245
+ : "";
5327
5246
  return (jsxs(Field, { label: `${translate.t(removeIndex(`${column}.field_label`))}`, required: isRequired, alignItems: "stretch", gridColumn,
5328
- gridRow, children: [jsx(Text, { children: selectedDate !== undefined
5329
- ? dayjs(selectedDate).format("hh:mm A")
5330
- : "" }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: translate.t(`${column}.field_required`) }))] }));
5247
+ gridRow, children: [jsx(Text, { children: displayedTime }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: translate.t(`${column}.field_required`) }))] }));
5331
5248
  };
5332
5249
 
5333
5250
  const SchemaViewer = ({ schema, prefix, column, }) => {
5334
5251
  const colSchema = schema;
5335
- const { type, variant, properties: innerProperties, foreign_key, items, } = schema;
5252
+ const { type, variant, properties: innerProperties, foreign_key, items, format, } = schema;
5336
5253
  if (variant === "custom-input") {
5337
5254
  return jsx(CustomViewer, { schema: colSchema, prefix, column });
5338
5255
  }
@@ -5344,12 +5261,12 @@ const SchemaViewer = ({ schema, prefix, column, }) => {
5344
5261
  idPickerSanityCheck(column, foreign_key);
5345
5262
  return jsx(IdViewer, { schema: colSchema, prefix, column });
5346
5263
  }
5347
- if (variant === "date-picker") {
5348
- return jsx(DateViewer, { schema: colSchema, prefix, column });
5349
- }
5350
- if (variant === "time-picker") {
5264
+ if (format === "time") {
5351
5265
  return jsx(TimeViewer, { schema: colSchema, prefix, column });
5352
5266
  }
5267
+ if (format === "date") {
5268
+ return jsx(DateViewer, { schema: colSchema, prefix, column });
5269
+ }
5353
5270
  if (variant === "text-area") {
5354
5271
  return jsx(TextAreaViewer, { schema: colSchema, prefix, column });
5355
5272
  }
@@ -22,7 +22,8 @@ export interface CustomJSONSchema7 extends JSONSchema7 {
22
22
  }) => ReactNode;
23
23
  dateFormat?: string;
24
24
  displayDateFormat?: string;
25
- format?: string;
25
+ timeFormat?: string;
26
+ displayTimeFormat?: string;
26
27
  }
27
28
  export interface TagPickerProps {
28
29
  column: string;
@@ -4,4 +4,4 @@ export interface TimeViewerProps {
4
4
  schema: CustomJSONSchema7;
5
5
  prefix: string;
6
6
  }
7
- export declare const TimeViewer: ({ column, schema, prefix }: TimeViewerProps) => import("react/jsx-runtime").JSX.Element;
7
+ export declare const TimeViewer: ({ column, schema, prefix, }: TimeViewerProps) => import("react/jsx-runtime").JSX.Element;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bsol-oss/react-datatable5",
3
- "version": "12.0.0-beta.40",
3
+ "version": "12.0.0-beta.42",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",