@bsol-oss/react-datatable5 11.0.0-beta.4 → 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 +465 -197
- package/dist/index.mjs +467 -199
- package/dist/types/components/Form/Form.d.ts +1 -1
- package/dist/types/components/Form/components/ArrayRenderer.d.ts +7 -0
- package/dist/types/components/Form/components/SchemaRenderer.d.ts +7 -0
- 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
|
@@ -28,8 +28,8 @@ var gr = require('react-icons/gr');
|
|
|
28
28
|
var hi = require('react-icons/hi');
|
|
29
29
|
var reactI18next = require('react-i18next');
|
|
30
30
|
var axios = require('axios');
|
|
31
|
-
var dayjs = require('dayjs');
|
|
32
31
|
var reactHookForm = require('react-hook-form');
|
|
32
|
+
var dayjs = require('dayjs');
|
|
33
33
|
var ti = require('react-icons/ti');
|
|
34
34
|
|
|
35
35
|
function _interopNamespaceDefault(e) {
|
|
@@ -3567,16 +3567,6 @@ const SchemaFormContext = React.createContext({
|
|
|
3567
3567
|
requestOptions: {},
|
|
3568
3568
|
});
|
|
3569
3569
|
|
|
3570
|
-
const HoverCardContent = React__namespace.forwardRef(function HoverCardContent(props, ref) {
|
|
3571
|
-
const { portalled = true, portalRef, ...rest } = props;
|
|
3572
|
-
return (jsxRuntime.jsx(react.Portal, { disabled: !portalled, container: portalRef, children: jsxRuntime.jsx(react.HoverCard.Positioner, { children: jsxRuntime.jsx(react.HoverCard.Content, { ref: ref, ...rest }) }) }));
|
|
3573
|
-
});
|
|
3574
|
-
const HoverCardArrow = React__namespace.forwardRef(function HoverCardArrow(props, ref) {
|
|
3575
|
-
return (jsxRuntime.jsx(react.HoverCard.Arrow, { ref: ref, ...props, children: jsxRuntime.jsx(react.HoverCard.ArrowTip, {}) }));
|
|
3576
|
-
});
|
|
3577
|
-
const HoverCardRoot = react.HoverCard.Root;
|
|
3578
|
-
const HoverCardTrigger = react.HoverCard.Trigger;
|
|
3579
|
-
|
|
3580
3570
|
const useSchemaContext = () => {
|
|
3581
3571
|
const { schema, serverUrl, requestUrl, order, ignore, onSubmit, rowNumber, idMap, setIdMap, translate, requestOptions, } = React.useContext(SchemaFormContext);
|
|
3582
3572
|
return {
|
|
@@ -3594,22 +3584,6 @@ const useSchemaContext = () => {
|
|
|
3594
3584
|
};
|
|
3595
3585
|
};
|
|
3596
3586
|
|
|
3597
|
-
const IdViewer = ({ value, column }) => {
|
|
3598
|
-
const { schema, idMap, translate } = useSchemaContext();
|
|
3599
|
-
if (schema.properties == undefined) {
|
|
3600
|
-
throw new Error("schema properties when using DatePicker");
|
|
3601
|
-
}
|
|
3602
|
-
const { foreign_key } = schema.properties[column];
|
|
3603
|
-
if (foreign_key === undefined) {
|
|
3604
|
-
throw new Error("foreign_key when variant is id-picker");
|
|
3605
|
-
}
|
|
3606
|
-
const { display_column } = foreign_key;
|
|
3607
|
-
if (value === undefined) {
|
|
3608
|
-
return (jsxRuntime.jsxs(react.Flex, { flexFlow: "column", children: [jsxRuntime.jsx(react.Text, { children: translate.t(`${column}.fieldLabel`) }), jsxRuntime.jsx(react.Text, { children: translate.t(`empty`) })] }));
|
|
3609
|
-
}
|
|
3610
|
-
return (jsxRuntime.jsxs(react.Flex, { flexFlow: "column", children: [jsxRuntime.jsx(react.Text, { children: translate.t(`${column}.fieldLabel`) }), jsxRuntime.jsxs(HoverCardRoot, { children: [jsxRuntime.jsx(HoverCardTrigger, { asChild: true, children: jsxRuntime.jsx(react.Text, { cursor: 'pointer', children: idMap[value][display_column] }) }), jsxRuntime.jsxs(HoverCardContent, { children: [jsxRuntime.jsx(HoverCardArrow, {}), jsxRuntime.jsx(RecordDisplay, { object: idMap[value] })] })] })] }));
|
|
3611
|
-
};
|
|
3612
|
-
|
|
3613
3587
|
const clearEmptyString = (object) => {
|
|
3614
3588
|
return Object.fromEntries(Object.entries(object).filter(([, value]) => value !== ""));
|
|
3615
3589
|
};
|
|
@@ -3624,20 +3598,41 @@ const AccordionItemContent = React__namespace.forwardRef(function AccordionItemC
|
|
|
3624
3598
|
const AccordionRoot = react.Accordion.Root;
|
|
3625
3599
|
const AccordionItem = react.Accordion.Item;
|
|
3626
3600
|
|
|
3627
|
-
|
|
3628
|
-
|
|
3629
|
-
|
|
3630
|
-
});
|
|
3631
|
-
const InfoTip = React__namespace.forwardRef(function InfoTip(props, ref) {
|
|
3632
|
-
const { children, ...rest } = props;
|
|
3633
|
-
return (jsxRuntime.jsx(ToggleTip, { content: children, ...rest, ref: ref, children: jsxRuntime.jsx(react.IconButton, { variant: "ghost", "aria-label": "info", size: "2xs", colorPalette: "gray", children: jsxRuntime.jsx(hi.HiOutlineInformationCircle, {}) }) }));
|
|
3634
|
-
});
|
|
3601
|
+
function removeIndex(str) {
|
|
3602
|
+
return str.replace(/\.\d+\./g, '.');
|
|
3603
|
+
}
|
|
3635
3604
|
|
|
3636
|
-
const
|
|
3637
|
-
const
|
|
3638
|
-
|
|
3639
|
-
|
|
3640
|
-
});
|
|
3605
|
+
const ArrayRenderer = ({ schema, column, prefix, }) => {
|
|
3606
|
+
const { gridRow, gridColumn = "1/span 12", required, items } = schema;
|
|
3607
|
+
// @ts-expect-error TODO: find suitable types
|
|
3608
|
+
const { type } = items;
|
|
3609
|
+
const { translate } = useSchemaContext();
|
|
3610
|
+
const colLabel = `${prefix}${column}`;
|
|
3611
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
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`)) }))] }));
|
|
3635
|
+
};
|
|
3641
3636
|
|
|
3642
3637
|
const Field = React__namespace.forwardRef(function Field(props, ref) {
|
|
3643
3638
|
const { label, children, helperText, errorText, optionalText, ...rest } = props;
|
|
@@ -3651,10 +3646,10 @@ const BooleanPicker = ({ schema, column, prefix }) => {
|
|
|
3651
3646
|
const isRequired = required?.some((columnId) => columnId === column);
|
|
3652
3647
|
const colLabel = `${prefix}${column}`;
|
|
3653
3648
|
const value = watch(colLabel);
|
|
3654
|
-
return (jsxRuntime.jsxs(Field, { label: `${translate.t(`${colLabel}.fieldLabel`)}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
3655
|
-
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: () => {
|
|
3656
3651
|
setValue(colLabel, !value);
|
|
3657
|
-
} }), 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`)) }))] }));
|
|
3658
3653
|
};
|
|
3659
3654
|
|
|
3660
3655
|
const monthNamesShort = [
|
|
@@ -3752,7 +3747,7 @@ const DatePicker = ({ column, schema, prefix }) => {
|
|
|
3752
3747
|
const colLabel = `${prefix}${column}`;
|
|
3753
3748
|
const [open, setOpen] = React.useState(false);
|
|
3754
3749
|
const selectedDate = watch(colLabel);
|
|
3755
|
-
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,
|
|
3756
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: () => {
|
|
3757
3752
|
setOpen(true);
|
|
3758
3753
|
}, children: selectedDate !== undefined ? selectedDate : "" }) }), jsxRuntime.jsx(PopoverContent, { children: jsxRuntime.jsxs(PopoverBody, { children: [jsxRuntime.jsx(PopoverTitle, {}), jsxRuntime.jsx(DatePicker$1
|
|
@@ -3762,9 +3757,9 @@ const DatePicker = ({ column, schema, prefix }) => {
|
|
|
3762
3757
|
selected: new Date(selectedDate),
|
|
3763
3758
|
// @ts-expect-error TODO: find appropriate types
|
|
3764
3759
|
onDateSelected: ({ date }) => {
|
|
3765
|
-
setValue(
|
|
3760
|
+
setValue(colLabel, dayjs(date).format("YYYY-MM-DD"));
|
|
3766
3761
|
setOpen(false);
|
|
3767
|
-
} })] }) })] }), 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`)) }))] }));
|
|
3768
3763
|
};
|
|
3769
3764
|
|
|
3770
3765
|
function filterArray(array, searchTerm) {
|
|
@@ -3787,8 +3782,9 @@ const EnumPicker = ({ column, isMultiple = false, schema, prefix, }) => {
|
|
|
3787
3782
|
const [limit, setLimit] = React.useState(10);
|
|
3788
3783
|
const [openSearchResult, setOpenSearchResult] = React.useState();
|
|
3789
3784
|
const ref = React.useRef(null);
|
|
3790
|
-
const
|
|
3791
|
-
const
|
|
3785
|
+
const colLabel = `${prefix}${column}`;
|
|
3786
|
+
const watchEnum = watch(colLabel);
|
|
3787
|
+
const watchEnums = (watch(colLabel) ?? []);
|
|
3792
3788
|
const dataList = schema.enum ?? [];
|
|
3793
3789
|
const count = schema.enum?.length ?? 0;
|
|
3794
3790
|
const isDirty = (searchText?.length ?? 0) > 0;
|
|
@@ -3796,8 +3792,7 @@ const EnumPicker = ({ column, isMultiple = false, schema, prefix, }) => {
|
|
|
3796
3792
|
setSearchText(event.target.value);
|
|
3797
3793
|
setLimit(10);
|
|
3798
3794
|
};
|
|
3799
|
-
|
|
3800
|
-
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,
|
|
3801
3796
|
gridRow, children: [isMultiple && (jsxRuntime.jsxs(react.Flex, { flexFlow: "wrap", gap: 1, children: [watchEnums.map((enumValue) => {
|
|
3802
3797
|
const item = enumValue;
|
|
3803
3798
|
if (item === undefined) {
|
|
@@ -3806,12 +3801,16 @@ const EnumPicker = ({ column, isMultiple = false, schema, prefix, }) => {
|
|
|
3806
3801
|
return (jsxRuntime.jsx(Tag, { closable: true, onClick: () => {
|
|
3807
3802
|
// setSelectedEnums((state) => state.filter((id) => id != item));
|
|
3808
3803
|
setValue(column, watchEnums.filter((id) => id != item));
|
|
3809
|
-
}, children: !!renderDisplay === true
|
|
3804
|
+
}, children: !!renderDisplay === true
|
|
3805
|
+
? renderDisplay(item)
|
|
3806
|
+
: translate.t(removeIndex(`${colLabel}.${item}`)) }));
|
|
3810
3807
|
}), jsxRuntime.jsx(Tag, { cursor: "pointer", onClick: () => {
|
|
3811
3808
|
setOpenSearchResult(true);
|
|
3812
|
-
}, children:
|
|
3809
|
+
}, children: translate.t(removeIndex(`${colLabel}.addMore`)) })] })), !isMultiple && (jsxRuntime.jsx(Button, { variant: "outline", onClick: () => {
|
|
3813
3810
|
setOpenSearchResult(true);
|
|
3814
|
-
}, 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) => {
|
|
3815
3814
|
onSearchChange(event);
|
|
3816
3815
|
setOpenSearchResult(true);
|
|
3817
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) => {
|
|
@@ -3821,15 +3820,15 @@ const EnumPicker = ({ column, isMultiple = false, schema, prefix, }) => {
|
|
|
3821
3820
|
return (jsxRuntime.jsx(react.Box, { cursor: "pointer", onClick: () => {
|
|
3822
3821
|
if (!isMultiple) {
|
|
3823
3822
|
setOpenSearchResult(false);
|
|
3824
|
-
setValue(
|
|
3823
|
+
setValue(colLabel, item);
|
|
3825
3824
|
return;
|
|
3826
3825
|
}
|
|
3827
3826
|
const newSet = new Set([...(watchEnums ?? []), item]);
|
|
3828
|
-
setValue(
|
|
3827
|
+
setValue(colLabel, [...newSet]);
|
|
3829
3828
|
}, ...(selected ? { color: "gray.400/50" } : {}), children: !!renderDisplay === true
|
|
3830
3829
|
? renderDisplay(item)
|
|
3831
|
-
: translate.t(`${
|
|
3832
|
-
}) }), 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`)) }))] }));
|
|
3833
3832
|
};
|
|
3834
3833
|
|
|
3835
3834
|
function isEnteringWindow(_ref) {
|
|
@@ -4190,17 +4189,17 @@ const FilePicker = ({ column, schema, prefix }) => {
|
|
|
4190
4189
|
const { required, gridColumn, gridRow } = schema;
|
|
4191
4190
|
const isRequired = required?.some((columnId) => columnId === column);
|
|
4192
4191
|
const currentFiles = (watch(column) ?? []);
|
|
4193
|
-
const
|
|
4194
|
-
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 }) => {
|
|
4195
4194
|
const newFiles = files.filter(({ name }) => !currentFiles.some((cur) => cur.name === name));
|
|
4196
|
-
setValue(
|
|
4197
|
-
}, 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) => {
|
|
4198
4197
|
return (jsxRuntime.jsx(react.Card.Root, { variant: "subtle", children: jsxRuntime.jsxs(react.Card.Body, { gap: "2", cursor: "pointer", onClick: () => {
|
|
4199
4198
|
setValue(column, currentFiles.filter(({ name }) => {
|
|
4200
4199
|
return name !== file.name;
|
|
4201
4200
|
}));
|
|
4202
4201
|
}, display: "flex", flexFlow: "row", alignItems: "center", padding: "2", children: [jsxRuntime.jsx(react.Box, { children: file.name }), jsxRuntime.jsx(ti.TiDeleteOutline, {})] }) }, file.name));
|
|
4203
|
-
}) }), errors[`${
|
|
4202
|
+
}) }), errors[`${colLabel}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
4204
4203
|
};
|
|
4205
4204
|
|
|
4206
4205
|
const getTableData = async ({ serverUrl, in_table, searching = "", where = [], limit = 10, offset = 0, }) => {
|
|
@@ -4242,7 +4241,6 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4242
4241
|
const [openSearchResult, setOpenSearchResult] = React.useState();
|
|
4243
4242
|
const [page, setPage] = React.useState(0);
|
|
4244
4243
|
const ref = React.useRef(null);
|
|
4245
|
-
const selectedIds = watch(column) ?? [];
|
|
4246
4244
|
const colLabel = `${prefix}${column}`;
|
|
4247
4245
|
const query = reactQuery.useQuery({
|
|
4248
4246
|
queryKey: [`idpicker`, { column, searchText, limit, page }],
|
|
@@ -4279,8 +4277,8 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4279
4277
|
setPage(0);
|
|
4280
4278
|
setLimit(10);
|
|
4281
4279
|
};
|
|
4282
|
-
const watchId = watch(
|
|
4283
|
-
const watchIds = (watch(
|
|
4280
|
+
const watchId = watch(colLabel);
|
|
4281
|
+
const watchIds = (watch(colLabel) ?? []);
|
|
4284
4282
|
const getPickedValue = () => {
|
|
4285
4283
|
if (Object.keys(idMap).length <= 0) {
|
|
4286
4284
|
return "";
|
|
@@ -4291,11 +4289,11 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4291
4289
|
}
|
|
4292
4290
|
return record[display_column];
|
|
4293
4291
|
};
|
|
4294
|
-
return (jsxRuntime.jsxs(Field, { label: `${translate.t(`${
|
|
4295
|
-
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) => {
|
|
4296
4294
|
const item = idMap[id];
|
|
4297
4295
|
if (item === undefined) {
|
|
4298
|
-
return (jsxRuntime.
|
|
4296
|
+
return (jsxRuntime.jsx(react.Text, { children: translate.t(removeIndex(`${colLabel}.undefined`)) }, id));
|
|
4299
4297
|
}
|
|
4300
4298
|
return (jsxRuntime.jsx(Tag, { closable: true, onClick: () => {
|
|
4301
4299
|
setValue(column, watchIds.filter((id) => id != item[column_ref]));
|
|
@@ -4304,12 +4302,12 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4304
4302
|
: item[display_column] }, id));
|
|
4305
4303
|
}), jsxRuntime.jsx(Tag, { cursor: "pointer", onClick: () => {
|
|
4306
4304
|
setOpenSearchResult(true);
|
|
4307
|
-
}, 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: () => {
|
|
4308
4306
|
setOpenSearchResult(true);
|
|
4309
|
-
}, 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) => {
|
|
4310
4308
|
onSearchChange(event);
|
|
4311
4309
|
setOpenSearchResult(true);
|
|
4312
|
-
}, 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:
|
|
4313
4311
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
4314
4312
|
dataList.map((item) => {
|
|
4315
4313
|
const selected = isMultiple
|
|
@@ -4325,11 +4323,11 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4325
4323
|
...(watchIds ?? []),
|
|
4326
4324
|
item[column_ref],
|
|
4327
4325
|
]);
|
|
4328
|
-
setValue(
|
|
4326
|
+
setValue(colLabel, [...newSet]);
|
|
4329
4327
|
}, opacity: 0.7, _hover: { opacity: 1 }, ...(selected ? { color: "gray.400/50" } : {}), children: !!renderDisplay === true
|
|
4330
4328
|
? renderDisplay(item)
|
|
4331
4329
|
: item[display_column] }, item[column_ref]));
|
|
4332
|
-
}) }), 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`)) }))] }));
|
|
4333
4331
|
};
|
|
4334
4332
|
|
|
4335
4333
|
const NumberInputRoot = React__namespace.forwardRef(function NumberInput(props, ref) {
|
|
@@ -4341,28 +4339,33 @@ react.NumberInput.Scrubber;
|
|
|
4341
4339
|
react.NumberInput.Label;
|
|
4342
4340
|
|
|
4343
4341
|
const NumberInputField = ({ schema, column, prefix, }) => {
|
|
4344
|
-
const { register, formState: { errors }, } = reactHookForm.useFormContext();
|
|
4342
|
+
const { register, formState: { errors }, watch } = reactHookForm.useFormContext();
|
|
4345
4343
|
const { translate } = useSchemaContext();
|
|
4346
4344
|
const { required, gridColumn, gridRow } = schema;
|
|
4347
4345
|
const isRequired = required?.some((columnId) => columnId === column);
|
|
4348
4346
|
const colLabel = `${prefix}${column}`;
|
|
4349
|
-
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`)) }))] }));
|
|
4350
4348
|
};
|
|
4351
4349
|
|
|
4352
4350
|
const ObjectInput = ({ schema, column, prefix }) => {
|
|
4353
|
-
const { properties } = schema;
|
|
4351
|
+
const { properties, gridRow, gridColumn = "1/span 12", required } = schema;
|
|
4352
|
+
const { translate } = useSchemaContext();
|
|
4353
|
+
const colLabel = `${prefix}${column}`;
|
|
4354
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4355
|
+
const { formState: { errors }, } = reactHookForm.useFormContext();
|
|
4354
4356
|
if (properties === undefined) {
|
|
4355
4357
|
throw new Error(`properties is undefined when using ObjectInput`);
|
|
4356
4358
|
}
|
|
4357
|
-
return (jsxRuntime.jsx(jsxRuntime.
|
|
4358
|
-
|
|
4359
|
-
|
|
4360
|
-
|
|
4361
|
-
|
|
4362
|
-
|
|
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) => {
|
|
4360
|
+
return (
|
|
4361
|
+
// @ts-expect-error find suitable types
|
|
4362
|
+
jsxRuntime.jsx(ColumnRenderer, { column: `${key}`,
|
|
4363
|
+
prefix: `${prefix}${column}.`,
|
|
4364
|
+
properties }, `form-${colLabel}-${key}`));
|
|
4365
|
+
}) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
4363
4366
|
};
|
|
4364
4367
|
|
|
4365
|
-
const RecordInput = ({ column, schema, prefix }) => {
|
|
4368
|
+
const RecordInput$1 = ({ column, schema, prefix }) => {
|
|
4366
4369
|
const { formState: { errors }, setValue, getValues, } = reactHookForm.useFormContext();
|
|
4367
4370
|
const { translate } = useSchemaContext();
|
|
4368
4371
|
const { required, gridColumn, gridRow } = schema;
|
|
@@ -4420,7 +4423,7 @@ const StringInputField = ({ column, schema, prefix, }) => {
|
|
|
4420
4423
|
const { required, gridColumn, gridRow } = schema;
|
|
4421
4424
|
const isRequired = required?.some((columnId) => columnId === column);
|
|
4422
4425
|
const colLabel = `${prefix}${column}`;
|
|
4423
|
-
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`)) }))] }) }));
|
|
4424
4427
|
};
|
|
4425
4428
|
|
|
4426
4429
|
const RadioCardItem = React__namespace.forwardRef(function RadioCardItem(props, ref) {
|
|
@@ -4518,18 +4521,11 @@ const TagPicker = ({ column, schema, prefix }) => {
|
|
|
4518
4521
|
}), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: (errors[`${column}`]?.message ?? "No error message") }))] }));
|
|
4519
4522
|
};
|
|
4520
4523
|
|
|
4521
|
-
const
|
|
4522
|
-
|
|
4523
|
-
|
|
4524
|
-
}
|
|
4525
|
-
console.log(`${column} does not exist when using ColumnRenderer`, { properties, column, prefix }, "fdpok");
|
|
4526
|
-
const colSchema = properties[column];
|
|
4527
|
-
if (colSchema === undefined) {
|
|
4528
|
-
throw new Error(`${column} does not exist when using ColumnRenderer`);
|
|
4529
|
-
}
|
|
4530
|
-
const { type, variant, foreign_key, properties: innerProperties } = colSchema;
|
|
4524
|
+
const SchemaRenderer = ({ schema, prefix, column, }) => {
|
|
4525
|
+
const colSchema = schema;
|
|
4526
|
+
const { type, variant, properties: innerProperties, foreign_key, items, } = schema;
|
|
4531
4527
|
if (type === "string") {
|
|
4532
|
-
if ((
|
|
4528
|
+
if ((schema.enum ?? []).length > 0) {
|
|
4533
4529
|
return jsxRuntime.jsx(EnumPicker, { schema: colSchema, prefix, column });
|
|
4534
4530
|
}
|
|
4535
4531
|
if (variant === "id-picker") {
|
|
@@ -4551,7 +4547,7 @@ const ColumnRenderer = ({ column, properties, prefix, }) => {
|
|
|
4551
4547
|
if (innerProperties) {
|
|
4552
4548
|
return jsxRuntime.jsx(ObjectInput, { schema: colSchema, prefix, column });
|
|
4553
4549
|
}
|
|
4554
|
-
return jsxRuntime.jsx(RecordInput, { schema: colSchema, prefix, column });
|
|
4550
|
+
return jsxRuntime.jsx(RecordInput$1, { schema: colSchema, prefix, column });
|
|
4555
4551
|
}
|
|
4556
4552
|
if (type === "array") {
|
|
4557
4553
|
if (variant === "id-picker") {
|
|
@@ -4564,6 +4560,9 @@ const ColumnRenderer = ({ column, properties, prefix, }) => {
|
|
|
4564
4560
|
if (variant === "file-picker") {
|
|
4565
4561
|
return jsxRuntime.jsx(FilePicker, { schema: colSchema, prefix, column });
|
|
4566
4562
|
}
|
|
4563
|
+
if (items) {
|
|
4564
|
+
return jsxRuntime.jsx(ArrayRenderer, { schema: colSchema, prefix, column });
|
|
4565
|
+
}
|
|
4567
4566
|
return jsxRuntime.jsx(react.Text, { children: `array ${column}` });
|
|
4568
4567
|
}
|
|
4569
4568
|
if (type === "null") {
|
|
@@ -4572,6 +4571,358 @@ const ColumnRenderer = ({ column, properties, prefix, }) => {
|
|
|
4572
4571
|
return jsxRuntime.jsx(react.Text, { children: "missing type" });
|
|
4573
4572
|
};
|
|
4574
4573
|
|
|
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, }) => {
|
|
4916
|
+
if (properties === undefined) {
|
|
4917
|
+
return jsxRuntime.jsx(jsxRuntime.Fragment, {});
|
|
4918
|
+
}
|
|
4919
|
+
const colSchema = properties[column];
|
|
4920
|
+
if (colSchema === undefined) {
|
|
4921
|
+
throw new Error(`${column} does not exist when using ColumnRenderer`);
|
|
4922
|
+
}
|
|
4923
|
+
return jsxRuntime.jsx(SchemaViewer, { schema: colSchema, prefix, column });
|
|
4924
|
+
};
|
|
4925
|
+
|
|
4575
4926
|
const idPickerSanityCheck = (column, foreign_key) => {
|
|
4576
4927
|
if (!!foreign_key == false) {
|
|
4577
4928
|
throw new Error(`The key foreign_key does not exist in properties of column ${column} when using id-picker.`);
|
|
@@ -4588,7 +4939,7 @@ const idPickerSanityCheck = (column, foreign_key) => {
|
|
|
4588
4939
|
}
|
|
4589
4940
|
};
|
|
4590
4941
|
const FormInternal = () => {
|
|
4591
|
-
const { schema, requestUrl, order,
|
|
4942
|
+
const { schema, requestUrl, order, onSubmit, rowNumber, translate, requestOptions, } = useSchemaContext();
|
|
4592
4943
|
const methods = reactHookForm.useFormContext();
|
|
4593
4944
|
const [isSuccess, setIsSuccess] = React.useState(false);
|
|
4594
4945
|
const [isError, setIsError] = React.useState(false);
|
|
@@ -4652,19 +5003,8 @@ const FormInternal = () => {
|
|
|
4652
5003
|
return [...order, ...not_exist];
|
|
4653
5004
|
};
|
|
4654
5005
|
const ordered = renderOrder(order, Object.keys(properties));
|
|
4655
|
-
const getDataListProps = (value) => {
|
|
4656
|
-
if (value == undefined || value.length <= 0) {
|
|
4657
|
-
return {
|
|
4658
|
-
value: `<${translate.t("empty") ?? "Empty"}>`,
|
|
4659
|
-
color: "gray.400",
|
|
4660
|
-
};
|
|
4661
|
-
}
|
|
4662
|
-
return {
|
|
4663
|
-
value: value,
|
|
4664
|
-
};
|
|
4665
|
-
};
|
|
4666
5006
|
if (isSuccess) {
|
|
4667
|
-
return (jsxRuntime.jsxs(react.Grid, { gap: 2, children: [jsxRuntime.jsx(react.Heading, { children: translate.t("title") }), jsxRuntime.jsxs(react.Alert.Root, { status: "success", children: [jsxRuntime.jsx(react.Alert.Indicator, {}), jsxRuntime.jsx(react.Alert.Title, { children: translate.t("submitSuccess") })] }), jsxRuntime.jsx(react.Flex, { justifyContent:
|
|
5007
|
+
return (jsxRuntime.jsxs(react.Grid, { gap: 2, children: [jsxRuntime.jsx(react.Heading, { children: translate.t("title") }), jsxRuntime.jsxs(react.Alert.Root, { status: "success", children: [jsxRuntime.jsx(react.Alert.Indicator, {}), jsxRuntime.jsx(react.Alert.Title, { children: translate.t("submitSuccess") })] }), jsxRuntime.jsx(react.Flex, { justifyContent: "end", children: jsxRuntime.jsx(Button, { onClick: () => {
|
|
4668
5008
|
setIsError(false);
|
|
4669
5009
|
setIsSubmiting(false);
|
|
4670
5010
|
setIsSuccess(false);
|
|
@@ -4674,101 +5014,29 @@ const FormInternal = () => {
|
|
|
4674
5014
|
}, formNoValidate: true, children: translate.t("submitAgain") }) })] }));
|
|
4675
5015
|
}
|
|
4676
5016
|
if (isConfirming) {
|
|
4677
|
-
return (jsxRuntime.jsxs(react.Grid, { gap: 2, children: [jsxRuntime.jsxs(react.Heading, { children: [" ", translate.t("title")] }), jsxRuntime.jsx(
|
|
4678
|
-
|
|
4679
|
-
|
|
4680
|
-
|
|
4681
|
-
|
|
4682
|
-
|
|
4683
|
-
const shouldIgnore = ignore.some((column) => {
|
|
4684
|
-
return column == key;
|
|
4685
|
-
});
|
|
4686
|
-
if (shouldIgnore) {
|
|
4687
|
-
return jsxRuntime.jsx(jsxRuntime.Fragment, {});
|
|
4688
|
-
}
|
|
4689
|
-
const { type, variant, gridColumn, gridRow, foreign_key } = values;
|
|
4690
|
-
if (type === "string") {
|
|
4691
|
-
if (variant === "id-picker") {
|
|
4692
|
-
idPickerSanityCheck(column, foreign_key);
|
|
4693
|
-
return (jsxRuntime.jsx(IdViewer, { value: (validatedData ?? {})[column], column,
|
|
4694
|
-
dataListItemProps: { gridColumn, gridRow } }, `form-${key}`));
|
|
4695
|
-
}
|
|
4696
|
-
if (variant === "date-picker") {
|
|
4697
|
-
const value = (validatedData ?? {})[column];
|
|
4698
|
-
if (!!value === false) {
|
|
4699
|
-
return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(undefined) }, `form-${key}`));
|
|
4700
|
-
}
|
|
4701
|
-
const date = dayjs(value).format("YYYY-MM-DD");
|
|
4702
|
-
return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(date) }, `form-${key}`));
|
|
4703
|
-
}
|
|
4704
|
-
return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps((validatedData ?? {})[column]) }, `form-${key}`));
|
|
4705
|
-
}
|
|
4706
|
-
if (type === "object") {
|
|
4707
|
-
const value = (validatedData ?? {})[column];
|
|
4708
|
-
if (!!value === false) {
|
|
4709
|
-
return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(undefined) }, `form-${key}`));
|
|
4710
|
-
}
|
|
4711
|
-
return (jsxRuntime.jsxs(react.Flex, { flexFlow: "column", gap: 2, gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", children: [jsxRuntime.jsx(react.Text, { children: translate.t(`input.${column}`) }), jsxRuntime.jsx(DataListRoot, { orientation: "horizontal", padding: 4, borderColor: "gray.200", borderWidth: 1, borderRadius: 4, children: Object.entries(value).map(([key, value]) => {
|
|
4712
|
-
return (jsxRuntime.jsx(DataListItem, { label: `${key}`, ...getDataListProps(value) }, `form-${column}-${key}`));
|
|
4713
|
-
}) })] }, `form-${key}`));
|
|
4714
|
-
}
|
|
4715
|
-
if (type === "boolean") {
|
|
4716
|
-
return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps((validatedData ?? {})[column]) }, `form-${key}`));
|
|
4717
|
-
}
|
|
4718
|
-
if (type === "number" || type === "integer") {
|
|
4719
|
-
return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps((validatedData ?? {})[column]) }, `form-${key}`));
|
|
4720
|
-
}
|
|
4721
|
-
if (type === "array") {
|
|
4722
|
-
if (variant === "tag-picker") {
|
|
4723
|
-
const value = (validatedData ?? {})[column];
|
|
4724
|
-
return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(JSON.stringify(value)) }, `form-${key}`));
|
|
4725
|
-
}
|
|
4726
|
-
if (variant === "file-picker") {
|
|
4727
|
-
const fileNames = ((validatedData ?? {})[column] ?? []).map((file) => {
|
|
4728
|
-
return file.name;
|
|
4729
|
-
});
|
|
4730
|
-
return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(JSON.stringify(fileNames)) }, `form-${key}`));
|
|
4731
|
-
}
|
|
4732
|
-
if (variant === "id-picker") {
|
|
4733
|
-
const value = (validatedData ?? {})[column];
|
|
4734
|
-
if (schema.properties == undefined) {
|
|
4735
|
-
throw new Error("schema properties when using DatePicker");
|
|
4736
|
-
}
|
|
4737
|
-
const { foreign_key } = schema.properties[column];
|
|
4738
|
-
if (foreign_key === undefined) {
|
|
4739
|
-
throw new Error("foreign_key when variant is id-picker");
|
|
4740
|
-
}
|
|
4741
|
-
const { display_column } = foreign_key;
|
|
4742
|
-
const mapped = value.map((item) => {
|
|
4743
|
-
return idMap[item][display_column];
|
|
4744
|
-
});
|
|
4745
|
-
return (jsxRuntime.jsxs(react.Grid, { flexFlow: "column", gridColumn,
|
|
4746
|
-
gridRow, children: [jsxRuntime.jsx(react.Text, { children: translate.t(`input.${column}`) }), jsxRuntime.jsx(RecordDisplay, { object: mapped })] }, `form-${key}`));
|
|
4747
|
-
}
|
|
4748
|
-
const objectString = JSON.stringify((validatedData ?? {})[column]);
|
|
4749
|
-
return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(objectString) }, `form-${key}`));
|
|
4750
|
-
}
|
|
4751
|
-
if (type === "null") {
|
|
4752
|
-
return jsxRuntime.jsx(jsxRuntime.Fragment, { children: `null ${column}` });
|
|
4753
|
-
}
|
|
4754
|
-
return jsxRuntime.jsx(jsxRuntime.Fragment, { children: `unknown type ${column}` });
|
|
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}`));
|
|
4755
5023
|
}) }), jsxRuntime.jsxs(react.Flex, { justifyContent: "end", gap: "2", children: [jsxRuntime.jsx(Button, { onClick: () => {
|
|
4756
5024
|
setIsConfirming(false);
|
|
4757
5025
|
}, variant: "subtle", children: translate.t("cancel") }), jsxRuntime.jsx(Button, { onClick: () => {
|
|
4758
5026
|
onFormSubmit(validatedData);
|
|
4759
5027
|
}, children: translate.t("confirm") })] }), isSubmiting && (jsxRuntime.jsx(react.Box, { pos: "absolute", inset: "0", bg: "bg/80", children: jsxRuntime.jsx(react.Center, { h: "full", children: jsxRuntime.jsx(react.Spinner, { color: "teal.500" }) }) })), isError && (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx(react.Alert.Root, { status: "error", children: jsxRuntime.jsx(react.Alert.Title, { children: jsxRuntime.jsx(AccordionRoot, { collapsible: true, defaultValue: ["b"], children: jsxRuntime.jsxs(AccordionItem, { value: "b", children: [jsxRuntime.jsxs(AccordionItemTrigger, { children: [jsxRuntime.jsx(react.Alert.Indicator, {}), `${error}`] }), jsxRuntime.jsx(AccordionItemContent, { children: `${JSON.stringify(error)}` })] }) }) }) }) }))] }));
|
|
4760
5028
|
}
|
|
4761
|
-
return (jsxRuntime.
|
|
4762
|
-
|
|
5029
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: 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) => {
|
|
5030
|
+
return (jsxRuntime.jsx(ColumnRenderer
|
|
5031
|
+
// @ts-expect-error find suitable types
|
|
5032
|
+
, {
|
|
4763
5033
|
// @ts-expect-error find suitable types
|
|
4764
|
-
, {
|
|
4765
|
-
|
|
4766
|
-
|
|
4767
|
-
|
|
4768
|
-
|
|
4769
|
-
|
|
4770
|
-
methods.handleSubmit(onValid)();
|
|
4771
|
-
}, formNoValidate: true, children: translate.t("submit") })] })] }), isError && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: ["isError", jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [" ", `${error}`] })] }))] }));
|
|
5034
|
+
properties: properties, prefix: ``, column }, `form-input-${column}`));
|
|
5035
|
+
}) }), jsxRuntime.jsxs(react.Flex, { justifyContent: "end", gap: "2", children: [jsxRuntime.jsx(Button, { onClick: () => {
|
|
5036
|
+
methods.reset();
|
|
5037
|
+
}, variant: "subtle", children: translate.t("reset") }), jsxRuntime.jsx(Button, { onClick: () => {
|
|
5038
|
+
methods.handleSubmit(onValid)();
|
|
5039
|
+
}, formNoValidate: true, children: translate.t("submit") })] })] }) }));
|
|
4772
5040
|
};
|
|
4773
5041
|
const Form = ({ schema, idMap, setIdMap, form, serverUrl, translate, order = [], ignore = [], onSubmit = undefined, rowNumber = undefined, requestOptions = {}, }) => {
|
|
4774
5042
|
const { properties } = schema;
|