@bsol-oss/react-datatable5 11.0.0-beta.5 → 11.0.0-beta.6
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 +1 -1
- package/dist/index.js +425 -59
- package/dist/index.mjs +426 -60
- package/dist/types/components/Form/Form.d.ts +1 -1
- package/dist/types/components/Form/components/fields/ArrayRenderer.d.ts +7 -0
- package/dist/types/components/Form/components/fields/BooleanPicker.d.ts +7 -0
- package/dist/types/components/Form/components/fields/ColumnRenderer.d.ts +7 -0
- package/dist/types/components/Form/components/fields/DatePicker.d.ts +7 -0
- package/dist/types/components/Form/components/fields/EnumPicker.d.ts +8 -0
- package/dist/types/components/Form/components/fields/FilePicker.d.ts +5 -0
- package/dist/types/components/Form/components/fields/IdPicker.d.ts +8 -0
- package/dist/types/components/Form/components/fields/NumberInputField.d.ts +7 -0
- package/dist/types/components/Form/components/fields/ObjectInput.d.ts +7 -0
- package/dist/types/components/Form/components/fields/RecordInput.d.ts +7 -0
- package/dist/types/components/Form/components/fields/SchemaRenderer.d.ts +7 -0
- package/dist/types/components/Form/components/fields/StringInputField.d.ts +12 -0
- package/dist/types/components/Form/components/fields/TagPicker.d.ts +25 -0
- package/dist/types/components/Form/components/types/CustomJSONSchema7.d.ts +15 -0
- package/dist/types/components/Form/components/viewers/ArrayViewer.d.ts +7 -0
- package/dist/types/components/Form/components/viewers/BooleanViewer.d.ts +7 -0
- package/dist/types/components/Form/components/viewers/ColumnViewer.d.ts +7 -0
- package/dist/types/components/Form/components/viewers/DateViewer.d.ts +7 -0
- package/dist/types/components/Form/components/viewers/EnumViewer.d.ts +8 -0
- package/dist/types/components/Form/components/viewers/FileViewer.d.ts +5 -0
- package/dist/types/components/Form/components/viewers/IdViewer.d.ts +8 -0
- package/dist/types/components/Form/components/viewers/NumberViewer.d.ts +7 -0
- package/dist/types/components/Form/components/viewers/ObjectViewer.d.ts +7 -0
- package/dist/types/components/Form/components/viewers/RecordViewer.d.ts +7 -0
- package/dist/types/components/Form/components/viewers/SchemaViewer.d.ts +7 -0
- package/dist/types/components/Form/components/viewers/StringViewer.d.ts +12 -0
- package/dist/types/components/Form/components/viewers/TagViewer.d.ts +30 -0
- package/dist/types/components/Form/utils/removeIndex.d.ts +1 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -3598,23 +3598,40 @@ const AccordionItemContent = React__namespace.forwardRef(function AccordionItemC
|
|
|
3598
3598
|
const AccordionRoot = react.Accordion.Root;
|
|
3599
3599
|
const AccordionItem = react.Accordion.Item;
|
|
3600
3600
|
|
|
3601
|
+
function removeIndex(str) {
|
|
3602
|
+
return str.replace(/\.\d+\./g, '.');
|
|
3603
|
+
}
|
|
3604
|
+
|
|
3601
3605
|
const ArrayRenderer = ({ schema, column, prefix, }) => {
|
|
3602
3606
|
const { gridRow, gridColumn = "1/span 12", required, items } = schema;
|
|
3607
|
+
// @ts-expect-error TODO: find suitable types
|
|
3608
|
+
const { type } = items;
|
|
3603
3609
|
const { translate } = useSchemaContext();
|
|
3604
3610
|
const colLabel = `${prefix}${column}`;
|
|
3605
3611
|
const isRequired = required?.some((columnId) => columnId === column);
|
|
3606
|
-
const { formState: { errors },
|
|
3607
|
-
const
|
|
3608
|
-
|
|
3609
|
-
|
|
3610
|
-
|
|
3611
|
-
|
|
3612
|
-
|
|
3613
|
-
|
|
3614
|
-
|
|
3615
|
-
|
|
3616
|
-
|
|
3617
|
-
|
|
3612
|
+
const { formState: { errors }, setValue, watch, } = reactHookForm.useFormContext();
|
|
3613
|
+
const fields = (watch(colLabel) ?? []);
|
|
3614
|
+
return (jsxRuntime.jsxs(react.Box, { gridRow, gridColumn, children: [jsxRuntime.jsxs(react.Box, { as: "label", gridColumn: "1/span12", children: [`${translate.t(removeIndex(`${colLabel}.fieldLabel`))}`, isRequired && jsxRuntime.jsx("span", { children: "*" })] }), fields.map((field, index) => (jsxRuntime.jsxs(react.Flex, { flexFlow: "column", children: [jsxRuntime.jsx(react.Grid, { gap: "4", padding: "4", gridTemplateColumns: "repeat(12, 1fr)", gridTemplateRows: `repeat("auto-fit", auto)`, children: jsxRuntime.jsx(SchemaRenderer, { column: `${index}`,
|
|
3615
|
+
prefix: `${colLabel}.`,
|
|
3616
|
+
schema: items }) }), jsxRuntime.jsx(react.Flex, { justifyContent: "end", children: jsxRuntime.jsx(react.Button, { variant: "ghost", onClick: () => {
|
|
3617
|
+
setValue(colLabel, fields.filter((_, curIndex) => {
|
|
3618
|
+
return curIndex === index;
|
|
3619
|
+
}));
|
|
3620
|
+
}, children: translate.t(removeIndex(`${colLabel}.remove`)) }) })] }, `${colLabel}.${index}`))), jsxRuntime.jsx(react.Flex, { children: jsxRuntime.jsx(react.Button, { onClick: () => {
|
|
3621
|
+
if (type === "number") {
|
|
3622
|
+
setValue(colLabel, [...fields, 0]);
|
|
3623
|
+
return;
|
|
3624
|
+
}
|
|
3625
|
+
if (type === "string") {
|
|
3626
|
+
setValue(colLabel, [...fields, ""]);
|
|
3627
|
+
return;
|
|
3628
|
+
}
|
|
3629
|
+
if (type === "boolean") {
|
|
3630
|
+
setValue(colLabel, [...fields, false]);
|
|
3631
|
+
return;
|
|
3632
|
+
}
|
|
3633
|
+
setValue(colLabel, [...fields, {}]);
|
|
3634
|
+
}, children: translate.t(removeIndex(`${colLabel}.add`)) }) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
3618
3635
|
};
|
|
3619
3636
|
|
|
3620
3637
|
const Field = React__namespace.forwardRef(function Field(props, ref) {
|
|
@@ -3629,10 +3646,10 @@ const BooleanPicker = ({ schema, column, prefix }) => {
|
|
|
3629
3646
|
const isRequired = required?.some((columnId) => columnId === column);
|
|
3630
3647
|
const colLabel = `${prefix}${column}`;
|
|
3631
3648
|
const value = watch(colLabel);
|
|
3632
|
-
return (jsxRuntime.jsxs(Field, { label: `${translate.t(`${colLabel}.fieldLabel`)}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
3633
|
-
gridRow, children: [jsxRuntime.jsx(CheckboxCard, { checked: value, variant: "surface",
|
|
3649
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.fieldLabel`))}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
3650
|
+
gridRow, children: [jsxRuntime.jsx(CheckboxCard, { checked: value, variant: "surface", onChange: () => {
|
|
3634
3651
|
setValue(colLabel, !value);
|
|
3635
|
-
} }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${colLabel}.fieldRequired`) }))] }));
|
|
3652
|
+
} }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
3636
3653
|
};
|
|
3637
3654
|
|
|
3638
3655
|
const monthNamesShort = [
|
|
@@ -3730,7 +3747,7 @@ const DatePicker = ({ column, schema, prefix }) => {
|
|
|
3730
3747
|
const colLabel = `${prefix}${column}`;
|
|
3731
3748
|
const [open, setOpen] = React.useState(false);
|
|
3732
3749
|
const selectedDate = watch(colLabel);
|
|
3733
|
-
return (jsxRuntime.jsxs(Field, { label: `${translate.t(`${colLabel}.fieldLabel`)}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
3750
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.fieldLabel`))}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
3734
3751
|
gridRow, children: [jsxRuntime.jsxs(PopoverRoot, { open: open, onOpenChange: (e) => setOpen(e.open), closeOnInteractOutside: true, children: [jsxRuntime.jsx(PopoverTrigger, { asChild: true, children: jsxRuntime.jsx(Button, { size: "sm", variant: "outline", onClick: () => {
|
|
3735
3752
|
setOpen(true);
|
|
3736
3753
|
}, children: selectedDate !== undefined ? selectedDate : "" }) }), jsxRuntime.jsx(PopoverContent, { children: jsxRuntime.jsxs(PopoverBody, { children: [jsxRuntime.jsx(PopoverTitle, {}), jsxRuntime.jsx(DatePicker$1
|
|
@@ -3740,9 +3757,9 @@ const DatePicker = ({ column, schema, prefix }) => {
|
|
|
3740
3757
|
selected: new Date(selectedDate),
|
|
3741
3758
|
// @ts-expect-error TODO: find appropriate types
|
|
3742
3759
|
onDateSelected: ({ date }) => {
|
|
3743
|
-
setValue(
|
|
3760
|
+
setValue(colLabel, dayjs(date).format("YYYY-MM-DD"));
|
|
3744
3761
|
setOpen(false);
|
|
3745
|
-
} })] }) })] }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${
|
|
3762
|
+
} })] }) })] }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
3746
3763
|
};
|
|
3747
3764
|
|
|
3748
3765
|
function filterArray(array, searchTerm) {
|
|
@@ -3765,8 +3782,9 @@ const EnumPicker = ({ column, isMultiple = false, schema, prefix, }) => {
|
|
|
3765
3782
|
const [limit, setLimit] = React.useState(10);
|
|
3766
3783
|
const [openSearchResult, setOpenSearchResult] = React.useState();
|
|
3767
3784
|
const ref = React.useRef(null);
|
|
3768
|
-
const
|
|
3769
|
-
const
|
|
3785
|
+
const colLabel = `${prefix}${column}`;
|
|
3786
|
+
const watchEnum = watch(colLabel);
|
|
3787
|
+
const watchEnums = (watch(colLabel) ?? []);
|
|
3770
3788
|
const dataList = schema.enum ?? [];
|
|
3771
3789
|
const count = schema.enum?.length ?? 0;
|
|
3772
3790
|
const isDirty = (searchText?.length ?? 0) > 0;
|
|
@@ -3774,8 +3792,7 @@ const EnumPicker = ({ column, isMultiple = false, schema, prefix, }) => {
|
|
|
3774
3792
|
setSearchText(event.target.value);
|
|
3775
3793
|
setLimit(10);
|
|
3776
3794
|
};
|
|
3777
|
-
|
|
3778
|
-
return (jsxRuntime.jsxs(Field, { label: `${translate.t(`${column}.fieldLabel`)}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
3795
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${column}.fieldLabel`))}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
3779
3796
|
gridRow, children: [isMultiple && (jsxRuntime.jsxs(react.Flex, { flexFlow: "wrap", gap: 1, children: [watchEnums.map((enumValue) => {
|
|
3780
3797
|
const item = enumValue;
|
|
3781
3798
|
if (item === undefined) {
|
|
@@ -3784,12 +3801,16 @@ const EnumPicker = ({ column, isMultiple = false, schema, prefix, }) => {
|
|
|
3784
3801
|
return (jsxRuntime.jsx(Tag, { closable: true, onClick: () => {
|
|
3785
3802
|
// setSelectedEnums((state) => state.filter((id) => id != item));
|
|
3786
3803
|
setValue(column, watchEnums.filter((id) => id != item));
|
|
3787
|
-
}, children: !!renderDisplay === true
|
|
3804
|
+
}, children: !!renderDisplay === true
|
|
3805
|
+
? renderDisplay(item)
|
|
3806
|
+
: translate.t(removeIndex(`${colLabel}.${item}`)) }));
|
|
3788
3807
|
}), jsxRuntime.jsx(Tag, { cursor: "pointer", onClick: () => {
|
|
3789
3808
|
setOpenSearchResult(true);
|
|
3790
|
-
}, children:
|
|
3809
|
+
}, children: translate.t(removeIndex(`${colLabel}.addMore`)) })] })), !isMultiple && (jsxRuntime.jsx(Button, { variant: "outline", onClick: () => {
|
|
3791
3810
|
setOpenSearchResult(true);
|
|
3792
|
-
}, children: watchEnum
|
|
3811
|
+
}, children: watchEnum === undefined
|
|
3812
|
+
? ""
|
|
3813
|
+
: translate.t(removeIndex(`${colLabel}.${watchEnum}`)) })), 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(`${column}.typeToSearch`), onChange: (event) => {
|
|
3793
3814
|
onSearchChange(event);
|
|
3794
3815
|
setOpenSearchResult(true);
|
|
3795
3816
|
}, autoComplete: "off", ref: ref }), jsxRuntime.jsx(PopoverTitle, {}), jsxRuntime.jsx(react.Text, { children: `${translate.t(`${column}.total`)}: ${count}, ${translate.t(`${column}.showing`)} ${limit}` }), jsxRuntime.jsxs(react.Grid, { gridTemplateColumns: "repeat(auto-fit, minmax(15rem, 1fr))", overflow: "auto", maxHeight: "50vh", children: [jsxRuntime.jsx(react.Flex, { flexFlow: "column wrap", children: filterArray(dataList, searchText ?? "").map((item) => {
|
|
@@ -3799,15 +3820,15 @@ const EnumPicker = ({ column, isMultiple = false, schema, prefix, }) => {
|
|
|
3799
3820
|
return (jsxRuntime.jsx(react.Box, { cursor: "pointer", onClick: () => {
|
|
3800
3821
|
if (!isMultiple) {
|
|
3801
3822
|
setOpenSearchResult(false);
|
|
3802
|
-
setValue(
|
|
3823
|
+
setValue(colLabel, item);
|
|
3803
3824
|
return;
|
|
3804
3825
|
}
|
|
3805
3826
|
const newSet = new Set([...(watchEnums ?? []), item]);
|
|
3806
|
-
setValue(
|
|
3827
|
+
setValue(colLabel, [...newSet]);
|
|
3807
3828
|
}, ...(selected ? { color: "gray.400/50" } : {}), children: !!renderDisplay === true
|
|
3808
3829
|
? renderDisplay(item)
|
|
3809
|
-
: translate.t(`${
|
|
3810
|
-
}) }), isDirty && (jsxRuntime.jsx(jsxRuntime.Fragment, { children: dataList.length <= 0 && (jsxRuntime.jsx(jsxRuntime.Fragment, { children: translate.t(`${
|
|
3830
|
+
: translate.t(removeIndex(`${colLabel}.${item}`)) }, `${colLabel}-${item}`));
|
|
3831
|
+
}) }), isDirty && (jsxRuntime.jsx(jsxRuntime.Fragment, { children: dataList.length <= 0 && (jsxRuntime.jsx(jsxRuntime.Fragment, { children: translate.t(removeIndex(`${colLabel}.emptySearchResult`)) })) }))] })] }) })] }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
3811
3832
|
};
|
|
3812
3833
|
|
|
3813
3834
|
function isEnteringWindow(_ref) {
|
|
@@ -4168,17 +4189,17 @@ const FilePicker = ({ column, schema, prefix }) => {
|
|
|
4168
4189
|
const { required, gridColumn, gridRow } = schema;
|
|
4169
4190
|
const isRequired = required?.some((columnId) => columnId === column);
|
|
4170
4191
|
const currentFiles = (watch(column) ?? []);
|
|
4171
|
-
const
|
|
4172
|
-
return (jsxRuntime.jsxs(Field, { label: `${translate.t(`${
|
|
4192
|
+
const colLabel = `${prefix}${column}`;
|
|
4193
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(`${colLabel}.fieldLabel`)}`, required: isRequired, gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", display: "grid", gridTemplateRows: "auto 1fr auto", alignItems: "stretch", children: [jsxRuntime.jsx(FileDropzone, { onDrop: ({ files }) => {
|
|
4173
4194
|
const newFiles = files.filter(({ name }) => !currentFiles.some((cur) => cur.name === name));
|
|
4174
|
-
setValue(
|
|
4175
|
-
}, placeholder: translate.t(`${
|
|
4195
|
+
setValue(colLabel, [...currentFiles, ...newFiles]);
|
|
4196
|
+
}, placeholder: translate.t(removeIndex(`${colLabel}.fileDropzone`)) }), jsxRuntime.jsx(react.Flex, { flexFlow: "column", gap: 1, children: currentFiles.map((file) => {
|
|
4176
4197
|
return (jsxRuntime.jsx(react.Card.Root, { variant: "subtle", children: jsxRuntime.jsxs(react.Card.Body, { gap: "2", cursor: "pointer", onClick: () => {
|
|
4177
4198
|
setValue(column, currentFiles.filter(({ name }) => {
|
|
4178
4199
|
return name !== file.name;
|
|
4179
4200
|
}));
|
|
4180
4201
|
}, display: "flex", flexFlow: "row", alignItems: "center", padding: "2", children: [jsxRuntime.jsx(react.Box, { children: file.name }), jsxRuntime.jsx(ti.TiDeleteOutline, {})] }) }, file.name));
|
|
4181
|
-
}) }), errors[`${
|
|
4202
|
+
}) }), errors[`${colLabel}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
4182
4203
|
};
|
|
4183
4204
|
|
|
4184
4205
|
const getTableData = async ({ serverUrl, in_table, searching = "", where = [], limit = 10, offset = 0, }) => {
|
|
@@ -4220,7 +4241,6 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4220
4241
|
const [openSearchResult, setOpenSearchResult] = React.useState();
|
|
4221
4242
|
const [page, setPage] = React.useState(0);
|
|
4222
4243
|
const ref = React.useRef(null);
|
|
4223
|
-
const selectedIds = watch(column) ?? [];
|
|
4224
4244
|
const colLabel = `${prefix}${column}`;
|
|
4225
4245
|
const query = reactQuery.useQuery({
|
|
4226
4246
|
queryKey: [`idpicker`, { column, searchText, limit, page }],
|
|
@@ -4257,8 +4277,8 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4257
4277
|
setPage(0);
|
|
4258
4278
|
setLimit(10);
|
|
4259
4279
|
};
|
|
4260
|
-
const watchId = watch(
|
|
4261
|
-
const watchIds = (watch(
|
|
4280
|
+
const watchId = watch(colLabel);
|
|
4281
|
+
const watchIds = (watch(colLabel) ?? []);
|
|
4262
4282
|
const getPickedValue = () => {
|
|
4263
4283
|
if (Object.keys(idMap).length <= 0) {
|
|
4264
4284
|
return "";
|
|
@@ -4269,11 +4289,11 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4269
4289
|
}
|
|
4270
4290
|
return record[display_column];
|
|
4271
4291
|
};
|
|
4272
|
-
return (jsxRuntime.jsxs(Field, { label: `${translate.t(`${
|
|
4273
|
-
gridRow, children: [isMultiple && (jsxRuntime.jsxs(react.Flex, { flexFlow: "wrap", gap: 1, children: [
|
|
4292
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(removeIndex(`${column}.fieldLabel`)))}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
4293
|
+
gridRow, children: [isMultiple && (jsxRuntime.jsxs(react.Flex, { flexFlow: "wrap", gap: 1, children: [watchIds.map((id) => {
|
|
4274
4294
|
const item = idMap[id];
|
|
4275
4295
|
if (item === undefined) {
|
|
4276
|
-
return (jsxRuntime.
|
|
4296
|
+
return (jsxRuntime.jsx(react.Text, { children: translate.t(removeIndex(`${colLabel}.undefined`)) }, id));
|
|
4277
4297
|
}
|
|
4278
4298
|
return (jsxRuntime.jsx(Tag, { closable: true, onClick: () => {
|
|
4279
4299
|
setValue(column, watchIds.filter((id) => id != item[column_ref]));
|
|
@@ -4282,12 +4302,12 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4282
4302
|
: item[display_column] }, id));
|
|
4283
4303
|
}), jsxRuntime.jsx(Tag, { cursor: "pointer", onClick: () => {
|
|
4284
4304
|
setOpenSearchResult(true);
|
|
4285
|
-
}, children: translate.t(`${colLabel}.addMore`) })] })), !isMultiple && (jsxRuntime.jsx(Button, { variant: "outline", onClick: () => {
|
|
4305
|
+
}, children: translate.t(removeIndex(`${colLabel}.addMore`)) })] })), !isMultiple && (jsxRuntime.jsx(Button, { variant: "outline", onClick: () => {
|
|
4286
4306
|
setOpenSearchResult(true);
|
|
4287
|
-
}, children: 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(`${colLabel}.typeToSearch`), onChange: (event) => {
|
|
4307
|
+
}, children: 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}.typeToSearch`)), onChange: (event) => {
|
|
4288
4308
|
onSearchChange(event);
|
|
4289
4309
|
setOpenSearchResult(true);
|
|
4290
|
-
}, autoComplete: "off", ref: ref }), jsxRuntime.jsx(PopoverTitle, {}), (searchText?.length ?? 0) > 0 && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [isFetching && jsxRuntime.jsx(jsxRuntime.Fragment, { children: "isFetching" }), isLoading && jsxRuntime.jsx(jsxRuntime.Fragment, { children: "isLoading" }), isPending && jsxRuntime.jsx(jsxRuntime.Fragment, { children: "isPending" }), isError && jsxRuntime.jsx(jsxRuntime.Fragment, { children: "isError" }), jsxRuntime.jsx(react.Text, { justifySelf: "center", children: `${translate.t(`${colLabel}.total`)} ${count}, ${translate.t(`${colLabel}.showing`)} ${limit}` }), jsxRuntime.jsxs(react.Grid, { gridTemplateColumns: "repeat(auto-fit, minmax(15rem, 1fr))", overflow: "auto", maxHeight: "50vh", children: [jsxRuntime.jsx(react.Flex, { flexFlow: "column wrap", children:
|
|
4310
|
+
}, autoComplete: "off", ref: ref }), jsxRuntime.jsx(PopoverTitle, {}), (searchText?.length ?? 0) > 0 && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [isFetching && jsxRuntime.jsx(jsxRuntime.Fragment, { children: "isFetching" }), isLoading && jsxRuntime.jsx(jsxRuntime.Fragment, { children: "isLoading" }), isPending && jsxRuntime.jsx(jsxRuntime.Fragment, { children: "isPending" }), isError && jsxRuntime.jsx(jsxRuntime.Fragment, { children: "isError" }), jsxRuntime.jsx(react.Text, { justifySelf: "center", children: `${translate.t(removeIndex(`${colLabel}.total`))} ${count}, ${translate.t(removeIndex(`${colLabel}.showing`))} ${limit}` }), jsxRuntime.jsxs(react.Grid, { gridTemplateColumns: "repeat(auto-fit, minmax(15rem, 1fr))", overflow: "auto", maxHeight: "50vh", children: [jsxRuntime.jsx(react.Flex, { flexFlow: "column wrap", children:
|
|
4291
4311
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
4292
4312
|
dataList.map((item) => {
|
|
4293
4313
|
const selected = isMultiple
|
|
@@ -4303,11 +4323,11 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4303
4323
|
...(watchIds ?? []),
|
|
4304
4324
|
item[column_ref],
|
|
4305
4325
|
]);
|
|
4306
|
-
setValue(
|
|
4326
|
+
setValue(colLabel, [...newSet]);
|
|
4307
4327
|
}, opacity: 0.7, _hover: { opacity: 1 }, ...(selected ? { color: "gray.400/50" } : {}), children: !!renderDisplay === true
|
|
4308
4328
|
? renderDisplay(item)
|
|
4309
4329
|
: item[display_column] }, item[column_ref]));
|
|
4310
|
-
}) }), isDirty && (jsxRuntime.jsx(jsxRuntime.Fragment, { children: dataList.length <= 0 && (jsxRuntime.jsx(react.Text, { children: translate.t(`${colLabel}.emptySearchResult`) })) }))] }), jsxRuntime.jsx(PaginationRoot, { justifySelf: "center", count: query?.data?.count ?? 0, pageSize: 10, defaultPage: 1, page: page + 1, onPageChange: (e) => setPage(e.page - 1), children: jsxRuntime.jsxs(react.HStack, { gap: "4", children: [jsxRuntime.jsx(PaginationPrevTrigger, {}), jsxRuntime.jsx(PaginationPageText, {}), jsxRuntime.jsx(PaginationNextTrigger, {})] }) })] }))] }) })] }), errors[`${colLabel}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${colLabel}.fieldRequired`) }))] }));
|
|
4330
|
+
}) }), isDirty && (jsxRuntime.jsx(jsxRuntime.Fragment, { children: dataList.length <= 0 && (jsxRuntime.jsx(react.Text, { children: translate.t(removeIndex(`${colLabel}.emptySearchResult`)) })) }))] }), jsxRuntime.jsx(PaginationRoot, { justifySelf: "center", count: query?.data?.count ?? 0, pageSize: 10, defaultPage: 1, page: page + 1, onPageChange: (e) => setPage(e.page - 1), children: jsxRuntime.jsxs(react.HStack, { gap: "4", children: [jsxRuntime.jsx(PaginationPrevTrigger, {}), jsxRuntime.jsx(PaginationPageText, {}), jsxRuntime.jsx(PaginationNextTrigger, {})] }) })] }))] }) })] }), errors[`${colLabel}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
4311
4331
|
};
|
|
4312
4332
|
|
|
4313
4333
|
const NumberInputRoot = React__namespace.forwardRef(function NumberInput(props, ref) {
|
|
@@ -4319,12 +4339,12 @@ react.NumberInput.Scrubber;
|
|
|
4319
4339
|
react.NumberInput.Label;
|
|
4320
4340
|
|
|
4321
4341
|
const NumberInputField = ({ schema, column, prefix, }) => {
|
|
4322
|
-
const { register, formState: { errors }, } = reactHookForm.useFormContext();
|
|
4342
|
+
const { register, formState: { errors }, watch } = reactHookForm.useFormContext();
|
|
4323
4343
|
const { translate } = useSchemaContext();
|
|
4324
4344
|
const { required, gridColumn, gridRow } = schema;
|
|
4325
4345
|
const isRequired = required?.some((columnId) => columnId === column);
|
|
4326
4346
|
const colLabel = `${prefix}${column}`;
|
|
4327
|
-
return (jsxRuntime.jsxs(Field, { label: `${translate.t(`${colLabel}.fieldLabel`)}`, required: isRequired, gridColumn, gridRow, children: [jsxRuntime.jsx(NumberInputRoot, { children: jsxRuntime.jsx(NumberInputField$1, { ...register(`${colLabel}`, { required: isRequired }) }) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${colLabel}.fieldRequired`) }))] }));
|
|
4347
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.fieldLabel`))}`, required: isRequired, gridColumn, gridRow, children: [jsxRuntime.jsx(NumberInputRoot, { children: jsxRuntime.jsx(NumberInputField$1, { ...register(`${colLabel}`, { required: isRequired }) }) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
4328
4348
|
};
|
|
4329
4349
|
|
|
4330
4350
|
const ObjectInput = ({ schema, column, prefix }) => {
|
|
@@ -4332,20 +4352,20 @@ const ObjectInput = ({ schema, column, prefix }) => {
|
|
|
4332
4352
|
const { translate } = useSchemaContext();
|
|
4333
4353
|
const colLabel = `${prefix}${column}`;
|
|
4334
4354
|
const isRequired = required?.some((columnId) => columnId === column);
|
|
4335
|
-
const {
|
|
4355
|
+
const { formState: { errors }, } = reactHookForm.useFormContext();
|
|
4336
4356
|
if (properties === undefined) {
|
|
4337
4357
|
throw new Error(`properties is undefined when using ObjectInput`);
|
|
4338
4358
|
}
|
|
4339
|
-
return (jsxRuntime.jsxs(react.Box, { gridRow, gridColumn, children: [jsxRuntime.jsxs(react.Box, { as: "label", gridColumn: "1/span12", children: [`${translate.t(`${colLabel}.fieldLabel`)}`, isRequired && jsxRuntime.jsx("span", { children: "*" })] }), jsxRuntime.jsx(react.Grid, { gap: "4", padding: "4", gridTemplateColumns: "repeat(12, 1fr)", gridTemplateRows: `repeat("auto-fit", auto)`, children: Object.keys(properties ?? {}).map((key) => {
|
|
4359
|
+
return (jsxRuntime.jsxs(react.Box, { gridRow, gridColumn, children: [jsxRuntime.jsxs(react.Box, { as: "label", gridColumn: "1/span12", children: [`${translate.t(removeIndex(`${colLabel}.fieldLabel`))}`, isRequired && jsxRuntime.jsx("span", { children: "*" })] }), jsxRuntime.jsx(react.Grid, { gap: "4", padding: "4", gridTemplateColumns: "repeat(12, 1fr)", gridTemplateRows: `repeat("auto-fit", auto)`, children: Object.keys(properties ?? {}).map((key) => {
|
|
4340
4360
|
return (
|
|
4341
4361
|
// @ts-expect-error find suitable types
|
|
4342
4362
|
jsxRuntime.jsx(ColumnRenderer, { column: `${key}`,
|
|
4343
4363
|
prefix: `${prefix}${column}.`,
|
|
4344
|
-
properties }, `form-${
|
|
4345
|
-
}) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${colLabel}.fieldRequired`) }))] }));
|
|
4364
|
+
properties }, `form-${colLabel}-${key}`));
|
|
4365
|
+
}) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
4346
4366
|
};
|
|
4347
4367
|
|
|
4348
|
-
const RecordInput = ({ column, schema, prefix }) => {
|
|
4368
|
+
const RecordInput$1 = ({ column, schema, prefix }) => {
|
|
4349
4369
|
const { formState: { errors }, setValue, getValues, } = reactHookForm.useFormContext();
|
|
4350
4370
|
const { translate } = useSchemaContext();
|
|
4351
4371
|
const { required, gridColumn, gridRow } = schema;
|
|
@@ -4403,7 +4423,7 @@ const StringInputField = ({ column, schema, prefix, }) => {
|
|
|
4403
4423
|
const { required, gridColumn, gridRow } = schema;
|
|
4404
4424
|
const isRequired = required?.some((columnId) => columnId === column);
|
|
4405
4425
|
const colLabel = `${prefix}${column}`;
|
|
4406
|
-
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs(Field, { label: `${translate.t(`${colLabel}.fieldLabel`)}`, required: isRequired, gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", children: [jsxRuntime.jsx(react.Input, { ...register(`${colLabel}`, { required: isRequired }), autoComplete: "off" }), errors[colLabel] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${colLabel}.fieldRequired`) }))] }) }));
|
|
4426
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.fieldLabel`))}`, required: isRequired, gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", children: [jsxRuntime.jsx(react.Input, { ...register(`${colLabel}`, { required: isRequired }), autoComplete: "off" }), errors[colLabel] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }) }));
|
|
4407
4427
|
};
|
|
4408
4428
|
|
|
4409
4429
|
const RadioCardItem = React__namespace.forwardRef(function RadioCardItem(props, ref) {
|
|
@@ -4527,7 +4547,7 @@ const SchemaRenderer = ({ schema, prefix, column, }) => {
|
|
|
4527
4547
|
if (innerProperties) {
|
|
4528
4548
|
return jsxRuntime.jsx(ObjectInput, { schema: colSchema, prefix, column });
|
|
4529
4549
|
}
|
|
4530
|
-
return jsxRuntime.jsx(RecordInput, { schema: colSchema, prefix, column });
|
|
4550
|
+
return jsxRuntime.jsx(RecordInput$1, { schema: colSchema, prefix, column });
|
|
4531
4551
|
}
|
|
4532
4552
|
if (type === "array") {
|
|
4533
4553
|
if (variant === "id-picker") {
|
|
@@ -4552,15 +4572,355 @@ const SchemaRenderer = ({ schema, prefix, column, }) => {
|
|
|
4552
4572
|
};
|
|
4553
4573
|
|
|
4554
4574
|
const ColumnRenderer = ({ column, properties, prefix, }) => {
|
|
4575
|
+
const colSchema = properties[column];
|
|
4576
|
+
const colLabel = `${prefix}${column}`;
|
|
4577
|
+
if (colSchema === undefined) {
|
|
4578
|
+
throw new Error(`${colLabel} does not exist when using ColumnRenderer`);
|
|
4579
|
+
}
|
|
4580
|
+
return jsxRuntime.jsx(SchemaRenderer, { schema: colSchema, prefix, column });
|
|
4581
|
+
};
|
|
4582
|
+
|
|
4583
|
+
const ArrayViewer = ({ schema, column, prefix }) => {
|
|
4584
|
+
const { gridRow, gridColumn = "1/span 12", required, items } = schema;
|
|
4585
|
+
const { translate } = useSchemaContext();
|
|
4586
|
+
const colLabel = `${prefix}${column}`;
|
|
4587
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4588
|
+
const { watch, formState: { errors }, } = reactHookForm.useFormContext();
|
|
4589
|
+
const values = watch(colLabel) ?? [];
|
|
4590
|
+
return (jsxRuntime.jsxs(react.Box, { gridRow, gridColumn, children: [jsxRuntime.jsxs(react.Box, { as: "label", gridColumn: "1/span12", children: [`${translate.t(removeIndex(`${colLabel}.fieldLabel`))}`, isRequired && jsxRuntime.jsx("span", { children: "*" })] }), values.map((field, index) => (jsxRuntime.jsx(react.Flex, { flexFlow: "column", children: jsxRuntime.jsx(react.Grid, { gap: "4", padding: "4", gridTemplateColumns: "repeat(12, 1fr)", gridTemplateRows: `repeat("auto-fit", auto)`, children: jsxRuntime.jsx(SchemaViewer, { column: `${index}`,
|
|
4591
|
+
prefix: `${colLabel}.`,
|
|
4592
|
+
schema: items }) }) }, `form-${prefix}${column}.${index}`))), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
4593
|
+
};
|
|
4594
|
+
|
|
4595
|
+
const BooleanViewer = ({ schema, column, prefix, }) => {
|
|
4596
|
+
const { watch, formState: { errors }, } = reactHookForm.useFormContext();
|
|
4597
|
+
const { translate } = useSchemaContext();
|
|
4598
|
+
const { required, gridColumn, gridRow } = schema;
|
|
4599
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4600
|
+
const colLabel = `${prefix}${column}`;
|
|
4601
|
+
const value = watch(colLabel);
|
|
4602
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.fieldLabel`))}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
4603
|
+
gridRow, children: [jsxRuntime.jsx(react.Text, { children: value
|
|
4604
|
+
? translate.t(removeIndex(`${colLabel}.true`))
|
|
4605
|
+
: translate.t(removeIndex(`${colLabel}.false`)) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
4606
|
+
};
|
|
4607
|
+
|
|
4608
|
+
const DateViewer = ({ column, schema, prefix }) => {
|
|
4609
|
+
const { watch, formState: { errors }, } = reactHookForm.useFormContext();
|
|
4610
|
+
const { translate } = useSchemaContext();
|
|
4611
|
+
const { required, gridColumn, gridRow } = schema;
|
|
4612
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4613
|
+
const colLabel = `${prefix}${column}`;
|
|
4614
|
+
const selectedDate = watch(colLabel);
|
|
4615
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${column}.fieldLabel`))}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
4616
|
+
gridRow, children: [jsxRuntime.jsxs(react.Text, { children: [" ", selectedDate !== undefined ? selectedDate : ""] }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${column}.fieldRequired`) }))] }));
|
|
4617
|
+
};
|
|
4618
|
+
|
|
4619
|
+
const EnumViewer = ({ column, isMultiple = false, schema, prefix, }) => {
|
|
4620
|
+
const { watch, formState: { errors }, } = reactHookForm.useFormContext();
|
|
4621
|
+
const { translate } = useSchemaContext();
|
|
4622
|
+
const { required } = schema;
|
|
4623
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4624
|
+
const { gridColumn, gridRow, renderDisplay } = schema;
|
|
4625
|
+
const colLabel = `${prefix}${column}`;
|
|
4626
|
+
const watchEnum = watch(colLabel);
|
|
4627
|
+
const watchEnums = (watch(colLabel) ?? []);
|
|
4628
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${column}.fieldLabel`))}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
4629
|
+
gridRow, children: [isMultiple && (jsxRuntime.jsx(react.Flex, { flexFlow: "wrap", gap: 1, children: watchEnums.map((enumValue) => {
|
|
4630
|
+
const item = enumValue;
|
|
4631
|
+
if (item === undefined) {
|
|
4632
|
+
return jsxRuntime.jsx(jsxRuntime.Fragment, { children: "undefined" });
|
|
4633
|
+
}
|
|
4634
|
+
return (jsxRuntime.jsx(Tag, { closable: true, children: !!renderDisplay === true
|
|
4635
|
+
? renderDisplay(item)
|
|
4636
|
+
: translate.t(removeIndex(`${colLabel}.${item}`)) }));
|
|
4637
|
+
}) })), !isMultiple && (jsxRuntime.jsx(react.Text, { children: translate.t(removeIndex(`${colLabel}.${watchEnum}`)) })), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
4638
|
+
};
|
|
4639
|
+
|
|
4640
|
+
const FileViewer = ({ column, schema, prefix }) => {
|
|
4641
|
+
const { setValue, formState: { errors }, watch, } = reactHookForm.useFormContext();
|
|
4642
|
+
const { translate } = useSchemaContext();
|
|
4643
|
+
const { required, gridColumn, gridRow } = schema;
|
|
4644
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4645
|
+
const currentFiles = (watch(column) ?? []);
|
|
4646
|
+
const colLabel = `${prefix}${column}`;
|
|
4647
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(`${colLabel}.fieldLabel`)}`, required: isRequired, gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", display: "grid", gridTemplateRows: "auto 1fr auto", alignItems: "stretch", children: [jsxRuntime.jsx(FileDropzone, { onDrop: ({ files }) => {
|
|
4648
|
+
const newFiles = files.filter(({ name }) => !currentFiles.some((cur) => cur.name === name));
|
|
4649
|
+
setValue(colLabel, [...currentFiles, ...newFiles]);
|
|
4650
|
+
}, placeholder: translate.t(`${colLabel}.fileDropzone`) }), jsxRuntime.jsx(react.Flex, { flexFlow: "column", gap: 1, children: currentFiles.map((file) => {
|
|
4651
|
+
return (jsxRuntime.jsx(react.Card.Root, { variant: "subtle", children: jsxRuntime.jsxs(react.Card.Body, { gap: "2", cursor: "pointer", onClick: () => {
|
|
4652
|
+
setValue(column, currentFiles.filter(({ name }) => {
|
|
4653
|
+
return name !== file.name;
|
|
4654
|
+
}));
|
|
4655
|
+
}, display: "flex", flexFlow: "row", alignItems: "center", padding: "2", children: [jsxRuntime.jsx(react.Box, { children: file.name }), jsxRuntime.jsx(ti.TiDeleteOutline, {})] }) }, file.name));
|
|
4656
|
+
}) }), errors[`${colLabel}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
4657
|
+
};
|
|
4658
|
+
|
|
4659
|
+
const IdViewer = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
4660
|
+
const { watch, formState: { errors }, } = reactHookForm.useFormContext();
|
|
4661
|
+
const { idMap, translate } = useSchemaContext();
|
|
4662
|
+
const { required, gridColumn, gridRow, renderDisplay, foreign_key } = schema;
|
|
4663
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4664
|
+
const { display_column } = foreign_key;
|
|
4665
|
+
const colLabel = `${prefix}${column}`;
|
|
4666
|
+
const watchId = watch(colLabel);
|
|
4667
|
+
const watchIds = (watch(colLabel) ?? []);
|
|
4668
|
+
const getPickedValue = () => {
|
|
4669
|
+
if (Object.keys(idMap).length <= 0) {
|
|
4670
|
+
return "";
|
|
4671
|
+
}
|
|
4672
|
+
const record = idMap[watchId];
|
|
4673
|
+
if (record === undefined) {
|
|
4674
|
+
return "";
|
|
4675
|
+
}
|
|
4676
|
+
return record[display_column];
|
|
4677
|
+
};
|
|
4678
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${column}.fieldLabel`))}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
4679
|
+
gridRow, children: [isMultiple && (jsxRuntime.jsx(react.Flex, { flexFlow: "wrap", gap: 1, children: watchIds.map((id) => {
|
|
4680
|
+
const item = idMap[id];
|
|
4681
|
+
if (item === undefined) {
|
|
4682
|
+
return (jsxRuntime.jsx(react.Text, { children: translate.t(removeIndex(`${colLabel}.undefined`)) }, id));
|
|
4683
|
+
}
|
|
4684
|
+
return (jsxRuntime.jsx(Tag, { closable: true, children: !!renderDisplay === true
|
|
4685
|
+
? renderDisplay(item)
|
|
4686
|
+
: item[display_column] }, id));
|
|
4687
|
+
}) })), !isMultiple && jsxRuntime.jsx(react.Text, { children: getPickedValue() }), errors[`${colLabel}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
4688
|
+
};
|
|
4689
|
+
|
|
4690
|
+
const NumberViewer = ({ schema, column, prefix, }) => {
|
|
4691
|
+
const { watch, formState: { errors }, } = reactHookForm.useFormContext();
|
|
4692
|
+
const { translate } = useSchemaContext();
|
|
4693
|
+
const { required, gridColumn, gridRow } = schema;
|
|
4694
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4695
|
+
const colLabel = `${prefix}${column}`;
|
|
4696
|
+
const value = watch(colLabel);
|
|
4697
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.fieldLabel`))}`, required: isRequired, gridColumn, gridRow, children: [jsxRuntime.jsx(react.Text, { children: value }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
4698
|
+
};
|
|
4699
|
+
|
|
4700
|
+
const ObjectViewer = ({ schema, column, prefix }) => {
|
|
4701
|
+
const { properties, gridRow, gridColumn = "1/span 12", required } = schema;
|
|
4702
|
+
const { translate } = useSchemaContext();
|
|
4703
|
+
const colLabel = `${prefix}${column}`;
|
|
4704
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4705
|
+
const { formState: { errors }, } = reactHookForm.useFormContext();
|
|
4706
|
+
if (properties === undefined) {
|
|
4707
|
+
throw new Error(`properties is undefined when using ObjectInput`);
|
|
4708
|
+
}
|
|
4709
|
+
return (jsxRuntime.jsxs(react.Box, { gridRow, gridColumn, children: [jsxRuntime.jsxs(react.Box, { as: "label", gridColumn: "1/span12", children: [`${translate.t(removeIndex(`${colLabel}.fieldLabel`))}`, isRequired && jsxRuntime.jsx("span", { children: "*" })] }), jsxRuntime.jsx(react.Grid, { gap: "4", padding: "4", gridTemplateColumns: "repeat(12, 1fr)", gridTemplateRows: `repeat("auto-fit", auto)`, children: Object.keys(properties ?? {}).map((key) => {
|
|
4710
|
+
return (
|
|
4711
|
+
// @ts-expect-error find suitable types
|
|
4712
|
+
jsxRuntime.jsx(ColumnViewer, { column: `${key}`,
|
|
4713
|
+
prefix: `${prefix}${column}.`,
|
|
4714
|
+
properties }, `form-objectviewer-${colLabel}-${key}`));
|
|
4715
|
+
}) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
4716
|
+
};
|
|
4717
|
+
|
|
4718
|
+
const RecordInput = ({ column, schema, prefix }) => {
|
|
4719
|
+
const { formState: { errors }, setValue, getValues, } = reactHookForm.useFormContext();
|
|
4720
|
+
const { translate } = useSchemaContext();
|
|
4721
|
+
const { required, gridColumn, gridRow } = schema;
|
|
4722
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4723
|
+
const entries = Object.entries(getValues(column) ?? {});
|
|
4724
|
+
const [showNewEntries, setShowNewEntries] = React.useState(false);
|
|
4725
|
+
const [newKey, setNewKey] = React.useState();
|
|
4726
|
+
const [newValue, setNewValue] = React.useState();
|
|
4727
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(`${column}.fieldLabel`)}`, required: isRequired, alignItems: "stretch", gridColumn, gridRow, children: [entries.map(([key, value]) => {
|
|
4728
|
+
return (jsxRuntime.jsxs(react.Grid, { templateColumns: "1fr 1fr auto", gap: 1, children: [jsxRuntime.jsx(react.Input, { value: key, onChange: (e) => {
|
|
4729
|
+
const filtered = entries.filter(([target]) => {
|
|
4730
|
+
return target !== key;
|
|
4731
|
+
});
|
|
4732
|
+
setValue(column, Object.fromEntries([...filtered, [e.target.value, value]]));
|
|
4733
|
+
}, autoComplete: "off" }), jsxRuntime.jsx(react.Input, { value: value, onChange: (e) => {
|
|
4734
|
+
setValue(column, {
|
|
4735
|
+
...getValues(column),
|
|
4736
|
+
[key]: e.target.value,
|
|
4737
|
+
});
|
|
4738
|
+
}, autoComplete: "off" }), jsxRuntime.jsx(react.IconButton, { variant: "ghost", onClick: () => {
|
|
4739
|
+
const filtered = entries.filter(([target]) => {
|
|
4740
|
+
return target !== key;
|
|
4741
|
+
});
|
|
4742
|
+
setValue(column, Object.fromEntries([...filtered]));
|
|
4743
|
+
}, children: jsxRuntime.jsx(cg.CgClose, {}) })] }));
|
|
4744
|
+
}), jsxRuntime.jsx(react.Show, { when: showNewEntries, children: jsxRuntime.jsxs(react.Card.Root, { children: [jsxRuntime.jsx(react.Card.Body, { gap: "2", children: jsxRuntime.jsxs(react.Grid, { templateColumns: "1fr 1fr auto", gap: 1, children: [jsxRuntime.jsx(react.Input, { value: newKey, onChange: (e) => {
|
|
4745
|
+
setNewKey(e.target.value);
|
|
4746
|
+
}, autoComplete: "off" }), jsxRuntime.jsx(react.Input, { value: newValue, onChange: (e) => {
|
|
4747
|
+
setNewValue(e.target.value);
|
|
4748
|
+
}, autoComplete: "off" })] }) }), jsxRuntime.jsxs(react.Card.Footer, { justifyContent: "flex-end", children: [jsxRuntime.jsx(react.IconButton, { variant: "subtle", onClick: () => {
|
|
4749
|
+
setShowNewEntries(false);
|
|
4750
|
+
setNewKey(undefined);
|
|
4751
|
+
setNewValue(undefined);
|
|
4752
|
+
}, children: jsxRuntime.jsx(cg.CgClose, {}) }), jsxRuntime.jsx(Button, { onClick: () => {
|
|
4753
|
+
if (!!newKey === false) {
|
|
4754
|
+
setShowNewEntries(false);
|
|
4755
|
+
setNewKey(undefined);
|
|
4756
|
+
setNewValue(undefined);
|
|
4757
|
+
return;
|
|
4758
|
+
}
|
|
4759
|
+
setValue(column, Object.fromEntries([...entries, [newKey, newValue]]));
|
|
4760
|
+
setShowNewEntries(false);
|
|
4761
|
+
setNewKey(undefined);
|
|
4762
|
+
setNewValue(undefined);
|
|
4763
|
+
}, children: translate.t(`${column}.save`) })] })] }) }), jsxRuntime.jsx(Button, { onClick: () => {
|
|
4764
|
+
setShowNewEntries(true);
|
|
4765
|
+
setNewKey(undefined);
|
|
4766
|
+
setNewValue(undefined);
|
|
4767
|
+
}, children: translate.t(`${column}.addNew`) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${column}.fieldRequired`) }))] }));
|
|
4768
|
+
};
|
|
4769
|
+
|
|
4770
|
+
const TagViewer = ({ column, schema, prefix }) => {
|
|
4771
|
+
const { watch, formState: { errors }, setValue, } = reactHookForm.useFormContext();
|
|
4772
|
+
const { serverUrl } = useSchemaContext();
|
|
4773
|
+
if (schema.properties == undefined) {
|
|
4774
|
+
throw new Error("schema properties undefined when using DatePicker");
|
|
4775
|
+
}
|
|
4776
|
+
const { gridColumn, gridRow, in_table, object_id_column } = schema;
|
|
4777
|
+
if (in_table === undefined) {
|
|
4778
|
+
throw new Error("in_table is undefined when using TagPicker");
|
|
4779
|
+
}
|
|
4780
|
+
if (object_id_column === undefined) {
|
|
4781
|
+
throw new Error("object_id_column is undefined when using TagPicker");
|
|
4782
|
+
}
|
|
4783
|
+
const query = reactQuery.useQuery({
|
|
4784
|
+
queryKey: [`tagpicker`, in_table],
|
|
4785
|
+
queryFn: async () => {
|
|
4786
|
+
return await getTableData({
|
|
4787
|
+
serverUrl,
|
|
4788
|
+
in_table: "tables_tags_view",
|
|
4789
|
+
where: [
|
|
4790
|
+
{
|
|
4791
|
+
id: "table_name",
|
|
4792
|
+
value: [in_table],
|
|
4793
|
+
},
|
|
4794
|
+
],
|
|
4795
|
+
limit: 100,
|
|
4796
|
+
});
|
|
4797
|
+
},
|
|
4798
|
+
staleTime: 10000,
|
|
4799
|
+
});
|
|
4800
|
+
const object_id = watch(object_id_column);
|
|
4801
|
+
const existingTagsQuery = reactQuery.useQuery({
|
|
4802
|
+
queryKey: [`existing`, { in_table, object_id_column }, object_id],
|
|
4803
|
+
queryFn: async () => {
|
|
4804
|
+
return await getTableData({
|
|
4805
|
+
serverUrl,
|
|
4806
|
+
in_table: in_table,
|
|
4807
|
+
where: [
|
|
4808
|
+
{
|
|
4809
|
+
id: object_id_column,
|
|
4810
|
+
value: object_id[0],
|
|
4811
|
+
},
|
|
4812
|
+
],
|
|
4813
|
+
limit: 100,
|
|
4814
|
+
});
|
|
4815
|
+
},
|
|
4816
|
+
enabled: object_id != undefined,
|
|
4817
|
+
staleTime: 10000,
|
|
4818
|
+
});
|
|
4819
|
+
const { isLoading, isFetching, data, isPending, isError } = query;
|
|
4820
|
+
const dataList = data?.data ?? [];
|
|
4821
|
+
const existingTagList = existingTagsQuery.data?.data ?? [];
|
|
4822
|
+
if (!!object_id === false) {
|
|
4823
|
+
return jsxRuntime.jsx(jsxRuntime.Fragment, {});
|
|
4824
|
+
}
|
|
4825
|
+
return (jsxRuntime.jsxs(react.Flex, { flexFlow: "column", gap: 4, gridColumn,
|
|
4826
|
+
gridRow, children: [isFetching && jsxRuntime.jsx(jsxRuntime.Fragment, { children: "isFetching" }), isLoading && jsxRuntime.jsx(jsxRuntime.Fragment, { children: "isLoading" }), isPending && jsxRuntime.jsx(jsxRuntime.Fragment, { children: "isPending" }), isError && jsxRuntime.jsx(jsxRuntime.Fragment, { children: "isError" }), dataList.map(({ parent_tag_name, all_tags, is_mutually_exclusive }) => {
|
|
4827
|
+
return (jsxRuntime.jsxs(react.Flex, { flexFlow: "column", gap: 2, children: [jsxRuntime.jsx(react.Text, { children: parent_tag_name }), is_mutually_exclusive && (jsxRuntime.jsx(RadioCardRoot, { defaultValue: "next", variant: "surface", onValueChange: (tagIds) => {
|
|
4828
|
+
const existedTags = Object.values(all_tags)
|
|
4829
|
+
.filter(({ id }) => {
|
|
4830
|
+
return existingTagList.some(({ tag_id }) => tag_id === id);
|
|
4831
|
+
})
|
|
4832
|
+
.map(({ id }) => {
|
|
4833
|
+
return id;
|
|
4834
|
+
});
|
|
4835
|
+
setValue(`${column}.${parent_tag_name}.current`, [
|
|
4836
|
+
tagIds.value,
|
|
4837
|
+
]);
|
|
4838
|
+
setValue(`${column}.${parent_tag_name}.old`, existedTags);
|
|
4839
|
+
}, children: jsxRuntime.jsx(react.Flex, { flexFlow: "wrap", gap: 2, children: Object.entries(all_tags).map(([tagName, { id }]) => {
|
|
4840
|
+
if (existingTagList.some(({ tag_id }) => tag_id === id)) {
|
|
4841
|
+
return (jsxRuntime.jsx(RadioCardItem, { label: tagName, value: id, flex: "0 0 0%", disabled: true }, `${tagName}-${id}`));
|
|
4842
|
+
}
|
|
4843
|
+
return (jsxRuntime.jsx(RadioCardItem, { label: tagName, value: id, flex: "0 0 0%", colorPalette: "blue" }, `${tagName}-${id}`));
|
|
4844
|
+
}) }) })), !is_mutually_exclusive && (jsxRuntime.jsx(react.CheckboxGroup, { onValueChange: (tagIds) => {
|
|
4845
|
+
setValue(`${column}.${parent_tag_name}.current`, tagIds);
|
|
4846
|
+
}, children: jsxRuntime.jsx(react.Flex, { flexFlow: "wrap", gap: 2, children: Object.entries(all_tags).map(([tagName, { id }]) => {
|
|
4847
|
+
if (existingTagList.some(({ tag_id }) => tag_id === id)) {
|
|
4848
|
+
return (jsxRuntime.jsx(CheckboxCard, { label: tagName, value: id, flex: "0 0 0%", disabled: true, colorPalette: "blue" }, `${tagName}-${id}`));
|
|
4849
|
+
}
|
|
4850
|
+
return (jsxRuntime.jsx(CheckboxCard, { label: tagName, value: id, flex: "0 0 0%" }, `${tagName}-${id}`));
|
|
4851
|
+
}) }) }))] }, `tag-${parent_tag_name}`));
|
|
4852
|
+
}), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: (errors[`${column}`]?.message ?? "No error message") }))] }));
|
|
4853
|
+
};
|
|
4854
|
+
|
|
4855
|
+
const StringViewer = ({ column, schema, prefix, }) => {
|
|
4856
|
+
const { watch, formState: { errors }, } = reactHookForm.useFormContext();
|
|
4857
|
+
const { translate } = useSchemaContext();
|
|
4858
|
+
const { required, gridColumn, gridRow } = schema;
|
|
4859
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4860
|
+
const colLabel = `${prefix}${column}`;
|
|
4861
|
+
const value = watch(colLabel);
|
|
4862
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.fieldLabel`))}`, required: isRequired, gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", children: [jsxRuntime.jsx(react.Text, { children: value }), errors[colLabel] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }) }));
|
|
4863
|
+
};
|
|
4864
|
+
|
|
4865
|
+
const SchemaViewer = ({ schema, prefix, column, }) => {
|
|
4866
|
+
const colSchema = schema;
|
|
4867
|
+
const { type, variant, properties: innerProperties, foreign_key, items, } = schema;
|
|
4868
|
+
if (type === "string") {
|
|
4869
|
+
if ((schema.enum ?? []).length > 0) {
|
|
4870
|
+
return jsxRuntime.jsx(EnumViewer, { schema: colSchema, prefix, column });
|
|
4871
|
+
}
|
|
4872
|
+
if (variant === "id-picker") {
|
|
4873
|
+
idPickerSanityCheck(column, foreign_key);
|
|
4874
|
+
return jsxRuntime.jsx(IdViewer, { schema: colSchema, prefix, column });
|
|
4875
|
+
}
|
|
4876
|
+
if (variant === "date-picker") {
|
|
4877
|
+
return jsxRuntime.jsx(DateViewer, { schema: colSchema, prefix, column });
|
|
4878
|
+
}
|
|
4879
|
+
return jsxRuntime.jsx(StringViewer, { schema: colSchema, prefix, column });
|
|
4880
|
+
}
|
|
4881
|
+
if (type === "number" || type === "integer") {
|
|
4882
|
+
return jsxRuntime.jsx(NumberViewer, { schema: colSchema, prefix, column });
|
|
4883
|
+
}
|
|
4884
|
+
if (type === "boolean") {
|
|
4885
|
+
return jsxRuntime.jsx(BooleanViewer, { schema: colSchema, prefix, column });
|
|
4886
|
+
}
|
|
4887
|
+
if (type === "object") {
|
|
4888
|
+
if (innerProperties) {
|
|
4889
|
+
return jsxRuntime.jsx(ObjectViewer, { schema: colSchema, prefix, column });
|
|
4890
|
+
}
|
|
4891
|
+
return jsxRuntime.jsx(RecordInput, { schema: colSchema, prefix, column });
|
|
4892
|
+
}
|
|
4893
|
+
if (type === "array") {
|
|
4894
|
+
if (variant === "id-picker") {
|
|
4895
|
+
idPickerSanityCheck(column, foreign_key);
|
|
4896
|
+
return (jsxRuntime.jsx(IdViewer, { schema: colSchema, prefix, column, isMultiple: true }));
|
|
4897
|
+
}
|
|
4898
|
+
if (variant === "tag-picker") {
|
|
4899
|
+
return jsxRuntime.jsx(TagViewer, { schema: colSchema, prefix, column });
|
|
4900
|
+
}
|
|
4901
|
+
if (variant === "file-picker") {
|
|
4902
|
+
return jsxRuntime.jsx(FileViewer, { schema: colSchema, prefix, column });
|
|
4903
|
+
}
|
|
4904
|
+
if (items) {
|
|
4905
|
+
return jsxRuntime.jsx(ArrayViewer, { schema: colSchema, prefix, column });
|
|
4906
|
+
}
|
|
4907
|
+
return jsxRuntime.jsx(react.Text, { children: `array ${column}` });
|
|
4908
|
+
}
|
|
4909
|
+
if (type === "null") {
|
|
4910
|
+
return jsxRuntime.jsx(react.Text, { children: `null ${column}` });
|
|
4911
|
+
}
|
|
4912
|
+
return jsxRuntime.jsx(react.Text, { children: "missing type" });
|
|
4913
|
+
};
|
|
4914
|
+
|
|
4915
|
+
const ColumnViewer = ({ column, properties, prefix, }) => {
|
|
4555
4916
|
if (properties === undefined) {
|
|
4556
4917
|
return jsxRuntime.jsx(jsxRuntime.Fragment, {});
|
|
4557
4918
|
}
|
|
4558
|
-
console.log(`${column} does not exist when using ColumnRenderer`, { properties, column, prefix }, "fdpok");
|
|
4559
4919
|
const colSchema = properties[column];
|
|
4560
4920
|
if (colSchema === undefined) {
|
|
4561
4921
|
throw new Error(`${column} does not exist when using ColumnRenderer`);
|
|
4562
4922
|
}
|
|
4563
|
-
return jsxRuntime.jsx(
|
|
4923
|
+
return jsxRuntime.jsx(SchemaViewer, { schema: colSchema, prefix, column });
|
|
4564
4924
|
};
|
|
4565
4925
|
|
|
4566
4926
|
const idPickerSanityCheck = (column, foreign_key) => {
|
|
@@ -4579,7 +4939,7 @@ const idPickerSanityCheck = (column, foreign_key) => {
|
|
|
4579
4939
|
}
|
|
4580
4940
|
};
|
|
4581
4941
|
const FormInternal = () => {
|
|
4582
|
-
const { schema, requestUrl, order,
|
|
4942
|
+
const { schema, requestUrl, order, onSubmit, rowNumber, translate, requestOptions, } = useSchemaContext();
|
|
4583
4943
|
const methods = reactHookForm.useFormContext();
|
|
4584
4944
|
const [isSuccess, setIsSuccess] = React.useState(false);
|
|
4585
4945
|
const [isError, setIsError] = React.useState(false);
|
|
@@ -4654,7 +5014,13 @@ const FormInternal = () => {
|
|
|
4654
5014
|
}, formNoValidate: true, children: translate.t("submitAgain") }) })] }));
|
|
4655
5015
|
}
|
|
4656
5016
|
if (isConfirming) {
|
|
4657
|
-
return (jsxRuntime.jsxs(react.Grid, { gap: 2, children: [jsxRuntime.jsxs(react.Heading, { children: [" ", translate.t("title")] }), jsxRuntime.jsx(react.Grid, { gap: 4, gridTemplateColumns: "repeat(12, 1fr)", gridTemplateRows: `repeat(${rowNumber ?? "auto-fit"}, auto)`, children:
|
|
5017
|
+
return (jsxRuntime.jsxs(react.Grid, { gap: 2, children: [jsxRuntime.jsxs(react.Heading, { children: [" ", translate.t("title")] }), jsxRuntime.jsx(react.Grid, { gap: 4, gridTemplateColumns: "repeat(12, 1fr)", gridTemplateRows: `repeat(${rowNumber ?? "auto-fit"}, auto)`, children: ordered.map((column) => {
|
|
5018
|
+
return (jsxRuntime.jsx(ColumnViewer
|
|
5019
|
+
// @ts-expect-error find suitable types
|
|
5020
|
+
, {
|
|
5021
|
+
// @ts-expect-error find suitable types
|
|
5022
|
+
properties: properties, prefix: ``, column }, `form-viewer-${column}`));
|
|
5023
|
+
}) }), jsxRuntime.jsxs(react.Flex, { justifyContent: "end", gap: "2", children: [jsxRuntime.jsx(Button, { onClick: () => {
|
|
4658
5024
|
setIsConfirming(false);
|
|
4659
5025
|
}, variant: "subtle", children: translate.t("cancel") }), jsxRuntime.jsx(Button, { onClick: () => {
|
|
4660
5026
|
onFormSubmit(validatedData);
|
|
@@ -4665,7 +5031,7 @@ const FormInternal = () => {
|
|
|
4665
5031
|
// @ts-expect-error find suitable types
|
|
4666
5032
|
, {
|
|
4667
5033
|
// @ts-expect-error find suitable types
|
|
4668
|
-
properties: properties, prefix: ``, column }, `form-${column}`));
|
|
5034
|
+
properties: properties, prefix: ``, column }, `form-input-${column}`));
|
|
4669
5035
|
}) }), jsxRuntime.jsxs(react.Flex, { justifyContent: "end", gap: "2", children: [jsxRuntime.jsx(Button, { onClick: () => {
|
|
4670
5036
|
methods.reset();
|
|
4671
5037
|
}, variant: "subtle", children: translate.t("reset") }), jsxRuntime.jsx(Button, { onClick: () => {
|