@bsol-oss/react-datatable5 12.0.0-beta.41 → 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
|
-
|
|
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: "
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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",
|
|
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
|
|
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(
|
|
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
|
|
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:
|
|
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 (
|
|
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: "
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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",
|
|
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
|
|
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(
|
|
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
|
|
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:
|
|
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 (
|
|
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
|
-
|
|
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;
|