@bsol-oss/react-datatable5 11.0.0-beta.5 → 11.0.0-beta.7
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 +4 -3
- package/dist/index.js +472 -120
- package/dist/index.mjs +474 -122
- package/dist/types/components/DataTable/DataDisplay.d.ts +1 -1
- package/dist/types/components/DataTable/utils/getColumns.d.ts +2 -1
- 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
|
@@ -2625,8 +2625,8 @@ const RecordDisplay = ({ object, boxProps, translate, prefix = "", }) => {
|
|
|
2625
2625
|
}) }));
|
|
2626
2626
|
};
|
|
2627
2627
|
|
|
2628
|
-
const
|
|
2629
|
-
const {
|
|
2628
|
+
const CellRenderer = ({ cell }) => {
|
|
2629
|
+
const { translate } = useDataTableContext();
|
|
2630
2630
|
const getLabel = ({ columnId }) => {
|
|
2631
2631
|
if (translate !== undefined) {
|
|
2632
2632
|
return translate.t(`${columnId}`);
|
|
@@ -2651,66 +2651,51 @@ const DataDisplay = ({ variant = "", translate }) => {
|
|
|
2651
2651
|
}
|
|
2652
2652
|
throw new Error(`value is unknown, ${typeof value}`);
|
|
2653
2653
|
};
|
|
2654
|
-
|
|
2655
|
-
|
|
2656
|
-
|
|
2657
|
-
|
|
2658
|
-
|
|
2659
|
-
|
|
2660
|
-
|
|
2661
|
-
|
|
2662
|
-
|
|
2663
|
-
return (jsxRuntime.jsxs(react.DataList.Item, { children: [jsxRuntime.jsx(react.DataList.ItemLabel, { children: getLabel({ columnId: cell.column.id }) }), jsxRuntime.jsx(RecordDisplay, { boxProps: {
|
|
2664
|
-
borderWidth: 1,
|
|
2665
|
-
borderRadius: 4,
|
|
2666
|
-
borderColor: "gray.400",
|
|
2667
|
-
paddingX: 4,
|
|
2668
|
-
paddingY: 2,
|
|
2669
|
-
}, object: value })] }, cell.id));
|
|
2670
|
-
}
|
|
2671
|
-
return (jsxRuntime.jsxs(react.DataList.Item, { children: [jsxRuntime.jsx(react.DataList.ItemLabel, { children: getLabel({ columnId: cell.column.id }) }), jsxRuntime.jsx(react.DataList.ItemValue, { wordBreak: "break-word", textOverflow: "ellipsis", overflow: "hidden", children: `${formatValue(cell.getValue())}` })] }, cell.id));
|
|
2672
|
-
}) }) }) }, `chakra-table-card-${row.id}`));
|
|
2673
|
-
}) }));
|
|
2654
|
+
const showCustomDataDisplay = cell.column.columnDef.meta?.showCustomDisplay ?? false;
|
|
2655
|
+
const gridColumn = cell.column.columnDef.meta?.gridColumn ?? [
|
|
2656
|
+
"span 12",
|
|
2657
|
+
"span 6",
|
|
2658
|
+
"span 3",
|
|
2659
|
+
];
|
|
2660
|
+
const gridRow = cell.column.columnDef.meta?.gridRow ?? {};
|
|
2661
|
+
if (showCustomDataDisplay) {
|
|
2662
|
+
return (jsxRuntime.jsx(react.Flex, { gridColumn, gridRow, children: reactTable.flexRender(cell.column.columnDef.cell, cell.getContext()) }, cell.id));
|
|
2674
2663
|
}
|
|
2675
|
-
|
|
2676
|
-
|
|
2677
|
-
|
|
2678
|
-
|
|
2679
|
-
|
|
2680
|
-
|
|
2681
|
-
|
|
2682
|
-
|
|
2683
|
-
|
|
2684
|
-
return (jsxRuntime.jsxs(react.DataList.Item, { display: "inline-flex", flexFlow: "column", justifyContent: "center", alignItems: "center", flex: "1 0 0%", children: [jsxRuntime.jsx(react.DataList.ItemLabel, { children: getLabel({ columnId: cell.column.id }) }), jsxRuntime.jsx(RecordDisplay, { boxProps: {
|
|
2685
|
-
borderWidth: 1,
|
|
2686
|
-
borderRadius: 4,
|
|
2687
|
-
borderColor: "gray.400",
|
|
2688
|
-
paddingX: 4,
|
|
2689
|
-
paddingY: 2,
|
|
2690
|
-
}, object: value })] }));
|
|
2691
|
-
}
|
|
2692
|
-
return (jsxRuntime.jsxs(react.DataList.Item, { display: "flex", justifyContent: "center", alignItems: "center", flex: "1 0 0%", children: [jsxRuntime.jsx(react.DataList.ItemLabel, { children: getLabel({ columnId: cell.column.id }) }), jsxRuntime.jsx(react.DataList.ItemValue, { wordBreak: "break-word", textOverflow: "ellipsis", overflow: "hidden", children: `${formatValue(cell.getValue())}` })] }, cell.id));
|
|
2693
|
-
}) }) }) }, `chakra-table-card-${row.id}`));
|
|
2694
|
-
}) }));
|
|
2664
|
+
const value = cell.getValue();
|
|
2665
|
+
if (typeof value === "object") {
|
|
2666
|
+
return (jsxRuntime.jsxs(react.Box, { gridColumn, gridRow, children: [jsxRuntime.jsx(react.Box, { children: getLabel({ columnId: cell.column.id }) }), jsxRuntime.jsx(RecordDisplay, { boxProps: {
|
|
2667
|
+
borderWidth: 1,
|
|
2668
|
+
borderRadius: 4,
|
|
2669
|
+
borderColor: "gray.400",
|
|
2670
|
+
paddingX: 4,
|
|
2671
|
+
paddingY: 2,
|
|
2672
|
+
}, object: value })] }, cell.id));
|
|
2695
2673
|
}
|
|
2674
|
+
return (jsxRuntime.jsxs(react.Box, { gridColumn, gridRow, children: [jsxRuntime.jsx(react.Box, { color: 'gray.400', children: getLabel({ columnId: cell.column.id }) }), jsxRuntime.jsx(react.Box, { wordBreak: "break-word", textOverflow: "ellipsis", overflow: "hidden", children: `${formatValue(cell.getValue())}` })] }, cell.id));
|
|
2675
|
+
};
|
|
2676
|
+
const DataDisplay = ({ variant = "" }) => {
|
|
2677
|
+
const { table, translate } = useDataTableContext();
|
|
2696
2678
|
return (jsxRuntime.jsx(react.Flex, { flexFlow: "column", gap: "1", children: table.getRowModel().rows.map((row) => {
|
|
2697
|
-
|
|
2698
|
-
|
|
2699
|
-
|
|
2700
|
-
|
|
2701
|
-
|
|
2702
|
-
|
|
2703
|
-
|
|
2704
|
-
|
|
2705
|
-
|
|
2706
|
-
|
|
2707
|
-
|
|
2708
|
-
|
|
2709
|
-
|
|
2710
|
-
|
|
2711
|
-
|
|
2712
|
-
|
|
2713
|
-
|
|
2679
|
+
const rowId = row.id;
|
|
2680
|
+
return (jsxRuntime.jsx(react.Card.Root, { children: jsxRuntime.jsx(react.Card.Body, { display: "grid", gap: 4, padding: 4, gridTemplateColumns: "repeat(12, 1fr)", children: table.getAllColumns().map((column) => {
|
|
2681
|
+
const childCell = row.getAllCells().find((cell) => {
|
|
2682
|
+
return cell.id === `${rowId}_${column.id}`;
|
|
2683
|
+
});
|
|
2684
|
+
if (column.columns.length > 0) {
|
|
2685
|
+
return (jsxRuntime.jsxs(react.Card.Root, { margin: "1", gridColumn: "span 12", children: [jsxRuntime.jsx(react.Card.Header, { color: "gray.400", children: translate.t(column.id) }), jsxRuntime.jsx(react.Card.Body, { display: "grid", gap: "4", gridTemplateColumns: "repeat(12, 1fr)", children: column.columns.map((column) => {
|
|
2686
|
+
if (!column.getIsVisible()) {
|
|
2687
|
+
return jsxRuntime.jsx(jsxRuntime.Fragment, {});
|
|
2688
|
+
}
|
|
2689
|
+
const foundCell = row
|
|
2690
|
+
.getVisibleCells()
|
|
2691
|
+
.find((cell) => {
|
|
2692
|
+
return cell.id === `${rowId}_${column.id}`;
|
|
2693
|
+
});
|
|
2694
|
+
return jsxRuntime.jsx(CellRenderer, { cell: foundCell });
|
|
2695
|
+
}) })] }, `chakra-table-card-${childCell?.id}`));
|
|
2696
|
+
}
|
|
2697
|
+
return jsxRuntime.jsx(CellRenderer, { cell: childCell });
|
|
2698
|
+
}) }) }, `chakra-table-card-${rowId}`));
|
|
2714
2699
|
}) }));
|
|
2715
2700
|
};
|
|
2716
2701
|
|
|
@@ -3498,7 +3483,7 @@ const widthSanityCheck = (widthList, ignoreList, properties) => {
|
|
|
3498
3483
|
throw new Error(`The width list is too long given from the number of remaining properties after ignore some.`);
|
|
3499
3484
|
}
|
|
3500
3485
|
};
|
|
3501
|
-
const getColumns = ({ schema, ignore = [], width = [], meta = {}, defaultWidth = 400, translate, }) => {
|
|
3486
|
+
const getColumns = ({ schema, include = [], ignore = [], width = [], meta = {}, defaultWidth = 400, translate, }) => {
|
|
3502
3487
|
const { properties } = schema;
|
|
3503
3488
|
idListSanityCheck("ignore", ignore, properties);
|
|
3504
3489
|
widthSanityCheck(width, ignore, properties);
|
|
@@ -3510,7 +3495,8 @@ const getColumns = ({ schema, ignore = [], width = [], meta = {}, defaultWidth =
|
|
|
3510
3495
|
return snakeToLabel(column);
|
|
3511
3496
|
};
|
|
3512
3497
|
const keys = Object.keys(properties);
|
|
3513
|
-
const
|
|
3498
|
+
const included = include.length > 0 ? include : keys;
|
|
3499
|
+
const ignored = included.filter((key) => {
|
|
3514
3500
|
return !ignore.some((shouldIgnoreKey) => key === shouldIgnoreKey);
|
|
3515
3501
|
});
|
|
3516
3502
|
const columnHelper = reactTable.createColumnHelper();
|
|
@@ -3598,23 +3584,40 @@ const AccordionItemContent = React__namespace.forwardRef(function AccordionItemC
|
|
|
3598
3584
|
const AccordionRoot = react.Accordion.Root;
|
|
3599
3585
|
const AccordionItem = react.Accordion.Item;
|
|
3600
3586
|
|
|
3587
|
+
function removeIndex(str) {
|
|
3588
|
+
return str.replace(/\.\d+\./g, '.');
|
|
3589
|
+
}
|
|
3590
|
+
|
|
3601
3591
|
const ArrayRenderer = ({ schema, column, prefix, }) => {
|
|
3602
3592
|
const { gridRow, gridColumn = "1/span 12", required, items } = schema;
|
|
3593
|
+
// @ts-expect-error TODO: find suitable types
|
|
3594
|
+
const { type } = items;
|
|
3603
3595
|
const { translate } = useSchemaContext();
|
|
3604
3596
|
const colLabel = `${prefix}${column}`;
|
|
3605
3597
|
const isRequired = required?.some((columnId) => columnId === column);
|
|
3606
|
-
const { formState: { errors },
|
|
3607
|
-
const
|
|
3608
|
-
|
|
3609
|
-
|
|
3610
|
-
|
|
3611
|
-
|
|
3612
|
-
|
|
3613
|
-
|
|
3614
|
-
|
|
3615
|
-
|
|
3616
|
-
|
|
3617
|
-
|
|
3598
|
+
const { formState: { errors }, setValue, watch, } = reactHookForm.useFormContext();
|
|
3599
|
+
const fields = (watch(colLabel) ?? []);
|
|
3600
|
+
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}`,
|
|
3601
|
+
prefix: `${colLabel}.`,
|
|
3602
|
+
schema: items }) }), jsxRuntime.jsx(react.Flex, { justifyContent: "end", children: jsxRuntime.jsx(react.Button, { variant: "ghost", onClick: () => {
|
|
3603
|
+
setValue(colLabel, fields.filter((_, curIndex) => {
|
|
3604
|
+
return curIndex === index;
|
|
3605
|
+
}));
|
|
3606
|
+
}, children: translate.t(removeIndex(`${colLabel}.remove`)) }) })] }, `${colLabel}.${index}`))), jsxRuntime.jsx(react.Flex, { children: jsxRuntime.jsx(react.Button, { onClick: () => {
|
|
3607
|
+
if (type === "number") {
|
|
3608
|
+
setValue(colLabel, [...fields, 0]);
|
|
3609
|
+
return;
|
|
3610
|
+
}
|
|
3611
|
+
if (type === "string") {
|
|
3612
|
+
setValue(colLabel, [...fields, ""]);
|
|
3613
|
+
return;
|
|
3614
|
+
}
|
|
3615
|
+
if (type === "boolean") {
|
|
3616
|
+
setValue(colLabel, [...fields, false]);
|
|
3617
|
+
return;
|
|
3618
|
+
}
|
|
3619
|
+
setValue(colLabel, [...fields, {}]);
|
|
3620
|
+
}, children: translate.t(removeIndex(`${colLabel}.add`)) }) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
3618
3621
|
};
|
|
3619
3622
|
|
|
3620
3623
|
const Field = React__namespace.forwardRef(function Field(props, ref) {
|
|
@@ -3629,10 +3632,10 @@ const BooleanPicker = ({ schema, column, prefix }) => {
|
|
|
3629
3632
|
const isRequired = required?.some((columnId) => columnId === column);
|
|
3630
3633
|
const colLabel = `${prefix}${column}`;
|
|
3631
3634
|
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",
|
|
3635
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.fieldLabel`))}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
3636
|
+
gridRow, children: [jsxRuntime.jsx(CheckboxCard, { checked: value, variant: "surface", onChange: () => {
|
|
3634
3637
|
setValue(colLabel, !value);
|
|
3635
|
-
} }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${colLabel}.fieldRequired`) }))] }));
|
|
3638
|
+
} }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
3636
3639
|
};
|
|
3637
3640
|
|
|
3638
3641
|
const monthNamesShort = [
|
|
@@ -3730,7 +3733,7 @@ const DatePicker = ({ column, schema, prefix }) => {
|
|
|
3730
3733
|
const colLabel = `${prefix}${column}`;
|
|
3731
3734
|
const [open, setOpen] = React.useState(false);
|
|
3732
3735
|
const selectedDate = watch(colLabel);
|
|
3733
|
-
return (jsxRuntime.jsxs(Field, { label: `${translate.t(`${colLabel}.fieldLabel`)}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
3736
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.fieldLabel`))}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
3734
3737
|
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
3738
|
setOpen(true);
|
|
3736
3739
|
}, children: selectedDate !== undefined ? selectedDate : "" }) }), jsxRuntime.jsx(PopoverContent, { children: jsxRuntime.jsxs(PopoverBody, { children: [jsxRuntime.jsx(PopoverTitle, {}), jsxRuntime.jsx(DatePicker$1
|
|
@@ -3740,9 +3743,9 @@ const DatePicker = ({ column, schema, prefix }) => {
|
|
|
3740
3743
|
selected: new Date(selectedDate),
|
|
3741
3744
|
// @ts-expect-error TODO: find appropriate types
|
|
3742
3745
|
onDateSelected: ({ date }) => {
|
|
3743
|
-
setValue(
|
|
3746
|
+
setValue(colLabel, dayjs(date).format("YYYY-MM-DD"));
|
|
3744
3747
|
setOpen(false);
|
|
3745
|
-
} })] }) })] }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${
|
|
3748
|
+
} })] }) })] }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
3746
3749
|
};
|
|
3747
3750
|
|
|
3748
3751
|
function filterArray(array, searchTerm) {
|
|
@@ -3765,8 +3768,9 @@ const EnumPicker = ({ column, isMultiple = false, schema, prefix, }) => {
|
|
|
3765
3768
|
const [limit, setLimit] = React.useState(10);
|
|
3766
3769
|
const [openSearchResult, setOpenSearchResult] = React.useState();
|
|
3767
3770
|
const ref = React.useRef(null);
|
|
3768
|
-
const
|
|
3769
|
-
const
|
|
3771
|
+
const colLabel = `${prefix}${column}`;
|
|
3772
|
+
const watchEnum = watch(colLabel);
|
|
3773
|
+
const watchEnums = (watch(colLabel) ?? []);
|
|
3770
3774
|
const dataList = schema.enum ?? [];
|
|
3771
3775
|
const count = schema.enum?.length ?? 0;
|
|
3772
3776
|
const isDirty = (searchText?.length ?? 0) > 0;
|
|
@@ -3774,8 +3778,7 @@ const EnumPicker = ({ column, isMultiple = false, schema, prefix, }) => {
|
|
|
3774
3778
|
setSearchText(event.target.value);
|
|
3775
3779
|
setLimit(10);
|
|
3776
3780
|
};
|
|
3777
|
-
|
|
3778
|
-
return (jsxRuntime.jsxs(Field, { label: `${translate.t(`${column}.fieldLabel`)}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
3781
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${column}.fieldLabel`))}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
3779
3782
|
gridRow, children: [isMultiple && (jsxRuntime.jsxs(react.Flex, { flexFlow: "wrap", gap: 1, children: [watchEnums.map((enumValue) => {
|
|
3780
3783
|
const item = enumValue;
|
|
3781
3784
|
if (item === undefined) {
|
|
@@ -3784,12 +3787,16 @@ const EnumPicker = ({ column, isMultiple = false, schema, prefix, }) => {
|
|
|
3784
3787
|
return (jsxRuntime.jsx(Tag, { closable: true, onClick: () => {
|
|
3785
3788
|
// setSelectedEnums((state) => state.filter((id) => id != item));
|
|
3786
3789
|
setValue(column, watchEnums.filter((id) => id != item));
|
|
3787
|
-
}, children: !!renderDisplay === true
|
|
3790
|
+
}, children: !!renderDisplay === true
|
|
3791
|
+
? renderDisplay(item)
|
|
3792
|
+
: translate.t(removeIndex(`${colLabel}.${item}`)) }));
|
|
3788
3793
|
}), jsxRuntime.jsx(Tag, { cursor: "pointer", onClick: () => {
|
|
3789
3794
|
setOpenSearchResult(true);
|
|
3790
|
-
}, children:
|
|
3795
|
+
}, children: translate.t(removeIndex(`${colLabel}.addMore`)) })] })), !isMultiple && (jsxRuntime.jsx(Button, { variant: "outline", onClick: () => {
|
|
3791
3796
|
setOpenSearchResult(true);
|
|
3792
|
-
}, children: watchEnum
|
|
3797
|
+
}, children: watchEnum === undefined
|
|
3798
|
+
? ""
|
|
3799
|
+
: 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
3800
|
onSearchChange(event);
|
|
3794
3801
|
setOpenSearchResult(true);
|
|
3795
3802
|
}, 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 +3806,15 @@ const EnumPicker = ({ column, isMultiple = false, schema, prefix, }) => {
|
|
|
3799
3806
|
return (jsxRuntime.jsx(react.Box, { cursor: "pointer", onClick: () => {
|
|
3800
3807
|
if (!isMultiple) {
|
|
3801
3808
|
setOpenSearchResult(false);
|
|
3802
|
-
setValue(
|
|
3809
|
+
setValue(colLabel, item);
|
|
3803
3810
|
return;
|
|
3804
3811
|
}
|
|
3805
3812
|
const newSet = new Set([...(watchEnums ?? []), item]);
|
|
3806
|
-
setValue(
|
|
3813
|
+
setValue(colLabel, [...newSet]);
|
|
3807
3814
|
}, ...(selected ? { color: "gray.400/50" } : {}), children: !!renderDisplay === true
|
|
3808
3815
|
? renderDisplay(item)
|
|
3809
|
-
: translate.t(`${
|
|
3810
|
-
}) }), isDirty && (jsxRuntime.jsx(jsxRuntime.Fragment, { children: dataList.length <= 0 && (jsxRuntime.jsx(jsxRuntime.Fragment, { children: translate.t(`${
|
|
3816
|
+
: translate.t(removeIndex(`${colLabel}.${item}`)) }, `${colLabel}-${item}`));
|
|
3817
|
+
}) }), 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
3818
|
};
|
|
3812
3819
|
|
|
3813
3820
|
function isEnteringWindow(_ref) {
|
|
@@ -4168,17 +4175,17 @@ const FilePicker = ({ column, schema, prefix }) => {
|
|
|
4168
4175
|
const { required, gridColumn, gridRow } = schema;
|
|
4169
4176
|
const isRequired = required?.some((columnId) => columnId === column);
|
|
4170
4177
|
const currentFiles = (watch(column) ?? []);
|
|
4171
|
-
const
|
|
4172
|
-
return (jsxRuntime.jsxs(Field, { label: `${translate.t(`${
|
|
4178
|
+
const colLabel = `${prefix}${column}`;
|
|
4179
|
+
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
4180
|
const newFiles = files.filter(({ name }) => !currentFiles.some((cur) => cur.name === name));
|
|
4174
|
-
setValue(
|
|
4175
|
-
}, placeholder: translate.t(`${
|
|
4181
|
+
setValue(colLabel, [...currentFiles, ...newFiles]);
|
|
4182
|
+
}, placeholder: translate.t(removeIndex(`${colLabel}.fileDropzone`)) }), jsxRuntime.jsx(react.Flex, { flexFlow: "column", gap: 1, children: currentFiles.map((file) => {
|
|
4176
4183
|
return (jsxRuntime.jsx(react.Card.Root, { variant: "subtle", children: jsxRuntime.jsxs(react.Card.Body, { gap: "2", cursor: "pointer", onClick: () => {
|
|
4177
4184
|
setValue(column, currentFiles.filter(({ name }) => {
|
|
4178
4185
|
return name !== file.name;
|
|
4179
4186
|
}));
|
|
4180
4187
|
}, display: "flex", flexFlow: "row", alignItems: "center", padding: "2", children: [jsxRuntime.jsx(react.Box, { children: file.name }), jsxRuntime.jsx(ti.TiDeleteOutline, {})] }) }, file.name));
|
|
4181
|
-
}) }), errors[`${
|
|
4188
|
+
}) }), errors[`${colLabel}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
4182
4189
|
};
|
|
4183
4190
|
|
|
4184
4191
|
const getTableData = async ({ serverUrl, in_table, searching = "", where = [], limit = 10, offset = 0, }) => {
|
|
@@ -4220,7 +4227,6 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4220
4227
|
const [openSearchResult, setOpenSearchResult] = React.useState();
|
|
4221
4228
|
const [page, setPage] = React.useState(0);
|
|
4222
4229
|
const ref = React.useRef(null);
|
|
4223
|
-
const selectedIds = watch(column) ?? [];
|
|
4224
4230
|
const colLabel = `${prefix}${column}`;
|
|
4225
4231
|
const query = reactQuery.useQuery({
|
|
4226
4232
|
queryKey: [`idpicker`, { column, searchText, limit, page }],
|
|
@@ -4257,8 +4263,8 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4257
4263
|
setPage(0);
|
|
4258
4264
|
setLimit(10);
|
|
4259
4265
|
};
|
|
4260
|
-
const watchId = watch(
|
|
4261
|
-
const watchIds = (watch(
|
|
4266
|
+
const watchId = watch(colLabel);
|
|
4267
|
+
const watchIds = (watch(colLabel) ?? []);
|
|
4262
4268
|
const getPickedValue = () => {
|
|
4263
4269
|
if (Object.keys(idMap).length <= 0) {
|
|
4264
4270
|
return "";
|
|
@@ -4269,11 +4275,11 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4269
4275
|
}
|
|
4270
4276
|
return record[display_column];
|
|
4271
4277
|
};
|
|
4272
|
-
return (jsxRuntime.jsxs(Field, { label: `${translate.t(`${
|
|
4273
|
-
gridRow, children: [isMultiple && (jsxRuntime.jsxs(react.Flex, { flexFlow: "wrap", gap: 1, children: [
|
|
4278
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(removeIndex(`${column}.fieldLabel`)))}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
4279
|
+
gridRow, children: [isMultiple && (jsxRuntime.jsxs(react.Flex, { flexFlow: "wrap", gap: 1, children: [watchIds.map((id) => {
|
|
4274
4280
|
const item = idMap[id];
|
|
4275
4281
|
if (item === undefined) {
|
|
4276
|
-
return (jsxRuntime.
|
|
4282
|
+
return (jsxRuntime.jsx(react.Text, { children: translate.t(removeIndex(`${colLabel}.undefined`)) }, id));
|
|
4277
4283
|
}
|
|
4278
4284
|
return (jsxRuntime.jsx(Tag, { closable: true, onClick: () => {
|
|
4279
4285
|
setValue(column, watchIds.filter((id) => id != item[column_ref]));
|
|
@@ -4282,12 +4288,12 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4282
4288
|
: item[display_column] }, id));
|
|
4283
4289
|
}), jsxRuntime.jsx(Tag, { cursor: "pointer", onClick: () => {
|
|
4284
4290
|
setOpenSearchResult(true);
|
|
4285
|
-
}, children: translate.t(`${colLabel}.addMore`) })] })), !isMultiple && (jsxRuntime.jsx(Button, { variant: "outline", onClick: () => {
|
|
4291
|
+
}, children: translate.t(removeIndex(`${colLabel}.addMore`)) })] })), !isMultiple && (jsxRuntime.jsx(Button, { variant: "outline", onClick: () => {
|
|
4286
4292
|
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) => {
|
|
4293
|
+
}, 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
4294
|
onSearchChange(event);
|
|
4289
4295
|
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:
|
|
4296
|
+
}, 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
4297
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
4292
4298
|
dataList.map((item) => {
|
|
4293
4299
|
const selected = isMultiple
|
|
@@ -4303,11 +4309,11 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4303
4309
|
...(watchIds ?? []),
|
|
4304
4310
|
item[column_ref],
|
|
4305
4311
|
]);
|
|
4306
|
-
setValue(
|
|
4312
|
+
setValue(colLabel, [...newSet]);
|
|
4307
4313
|
}, opacity: 0.7, _hover: { opacity: 1 }, ...(selected ? { color: "gray.400/50" } : {}), children: !!renderDisplay === true
|
|
4308
4314
|
? renderDisplay(item)
|
|
4309
4315
|
: 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`) }))] }));
|
|
4316
|
+
}) }), 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
4317
|
};
|
|
4312
4318
|
|
|
4313
4319
|
const NumberInputRoot = React__namespace.forwardRef(function NumberInput(props, ref) {
|
|
@@ -4319,12 +4325,12 @@ react.NumberInput.Scrubber;
|
|
|
4319
4325
|
react.NumberInput.Label;
|
|
4320
4326
|
|
|
4321
4327
|
const NumberInputField = ({ schema, column, prefix, }) => {
|
|
4322
|
-
const { register, formState: { errors }, } = reactHookForm.useFormContext();
|
|
4328
|
+
const { register, formState: { errors }, watch } = reactHookForm.useFormContext();
|
|
4323
4329
|
const { translate } = useSchemaContext();
|
|
4324
4330
|
const { required, gridColumn, gridRow } = schema;
|
|
4325
4331
|
const isRequired = required?.some((columnId) => columnId === column);
|
|
4326
4332
|
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`) }))] }));
|
|
4333
|
+
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
4334
|
};
|
|
4329
4335
|
|
|
4330
4336
|
const ObjectInput = ({ schema, column, prefix }) => {
|
|
@@ -4332,20 +4338,20 @@ const ObjectInput = ({ schema, column, prefix }) => {
|
|
|
4332
4338
|
const { translate } = useSchemaContext();
|
|
4333
4339
|
const colLabel = `${prefix}${column}`;
|
|
4334
4340
|
const isRequired = required?.some((columnId) => columnId === column);
|
|
4335
|
-
const {
|
|
4341
|
+
const { formState: { errors }, } = reactHookForm.useFormContext();
|
|
4336
4342
|
if (properties === undefined) {
|
|
4337
4343
|
throw new Error(`properties is undefined when using ObjectInput`);
|
|
4338
4344
|
}
|
|
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) => {
|
|
4345
|
+
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
4346
|
return (
|
|
4341
4347
|
// @ts-expect-error find suitable types
|
|
4342
4348
|
jsxRuntime.jsx(ColumnRenderer, { column: `${key}`,
|
|
4343
4349
|
prefix: `${prefix}${column}.`,
|
|
4344
|
-
properties }, `form-${
|
|
4345
|
-
}) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${colLabel}.fieldRequired`) }))] }));
|
|
4350
|
+
properties }, `form-${colLabel}-${key}`));
|
|
4351
|
+
}) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
4346
4352
|
};
|
|
4347
4353
|
|
|
4348
|
-
const RecordInput = ({ column, schema, prefix }) => {
|
|
4354
|
+
const RecordInput$1 = ({ column, schema, prefix }) => {
|
|
4349
4355
|
const { formState: { errors }, setValue, getValues, } = reactHookForm.useFormContext();
|
|
4350
4356
|
const { translate } = useSchemaContext();
|
|
4351
4357
|
const { required, gridColumn, gridRow } = schema;
|
|
@@ -4403,7 +4409,7 @@ const StringInputField = ({ column, schema, prefix, }) => {
|
|
|
4403
4409
|
const { required, gridColumn, gridRow } = schema;
|
|
4404
4410
|
const isRequired = required?.some((columnId) => columnId === column);
|
|
4405
4411
|
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`) }))] }) }));
|
|
4412
|
+
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
4413
|
};
|
|
4408
4414
|
|
|
4409
4415
|
const RadioCardItem = React__namespace.forwardRef(function RadioCardItem(props, ref) {
|
|
@@ -4527,7 +4533,7 @@ const SchemaRenderer = ({ schema, prefix, column, }) => {
|
|
|
4527
4533
|
if (innerProperties) {
|
|
4528
4534
|
return jsxRuntime.jsx(ObjectInput, { schema: colSchema, prefix, column });
|
|
4529
4535
|
}
|
|
4530
|
-
return jsxRuntime.jsx(RecordInput, { schema: colSchema, prefix, column });
|
|
4536
|
+
return jsxRuntime.jsx(RecordInput$1, { schema: colSchema, prefix, column });
|
|
4531
4537
|
}
|
|
4532
4538
|
if (type === "array") {
|
|
4533
4539
|
if (variant === "id-picker") {
|
|
@@ -4552,15 +4558,355 @@ const SchemaRenderer = ({ schema, prefix, column, }) => {
|
|
|
4552
4558
|
};
|
|
4553
4559
|
|
|
4554
4560
|
const ColumnRenderer = ({ column, properties, prefix, }) => {
|
|
4561
|
+
const colSchema = properties[column];
|
|
4562
|
+
const colLabel = `${prefix}${column}`;
|
|
4563
|
+
if (colSchema === undefined) {
|
|
4564
|
+
throw new Error(`${colLabel} does not exist when using ColumnRenderer`);
|
|
4565
|
+
}
|
|
4566
|
+
return jsxRuntime.jsx(SchemaRenderer, { schema: colSchema, prefix, column });
|
|
4567
|
+
};
|
|
4568
|
+
|
|
4569
|
+
const ArrayViewer = ({ schema, column, prefix }) => {
|
|
4570
|
+
const { gridRow, gridColumn = "1/span 12", required, items } = schema;
|
|
4571
|
+
const { translate } = useSchemaContext();
|
|
4572
|
+
const colLabel = `${prefix}${column}`;
|
|
4573
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4574
|
+
const { watch, formState: { errors }, } = reactHookForm.useFormContext();
|
|
4575
|
+
const values = watch(colLabel) ?? [];
|
|
4576
|
+
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}`,
|
|
4577
|
+
prefix: `${colLabel}.`,
|
|
4578
|
+
schema: items }) }) }, `form-${prefix}${column}.${index}`))), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
4579
|
+
};
|
|
4580
|
+
|
|
4581
|
+
const BooleanViewer = ({ schema, column, prefix, }) => {
|
|
4582
|
+
const { watch, formState: { errors }, } = reactHookForm.useFormContext();
|
|
4583
|
+
const { translate } = useSchemaContext();
|
|
4584
|
+
const { required, gridColumn, gridRow } = schema;
|
|
4585
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4586
|
+
const colLabel = `${prefix}${column}`;
|
|
4587
|
+
const value = watch(colLabel);
|
|
4588
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.fieldLabel`))}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
4589
|
+
gridRow, children: [jsxRuntime.jsx(react.Text, { children: value
|
|
4590
|
+
? translate.t(removeIndex(`${colLabel}.true`))
|
|
4591
|
+
: translate.t(removeIndex(`${colLabel}.false`)) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
4592
|
+
};
|
|
4593
|
+
|
|
4594
|
+
const DateViewer = ({ column, schema, prefix }) => {
|
|
4595
|
+
const { watch, formState: { errors }, } = reactHookForm.useFormContext();
|
|
4596
|
+
const { translate } = useSchemaContext();
|
|
4597
|
+
const { required, gridColumn, gridRow } = schema;
|
|
4598
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4599
|
+
const colLabel = `${prefix}${column}`;
|
|
4600
|
+
const selectedDate = watch(colLabel);
|
|
4601
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${column}.fieldLabel`))}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
4602
|
+
gridRow, children: [jsxRuntime.jsxs(react.Text, { children: [" ", selectedDate !== undefined ? selectedDate : ""] }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${column}.fieldRequired`) }))] }));
|
|
4603
|
+
};
|
|
4604
|
+
|
|
4605
|
+
const EnumViewer = ({ column, isMultiple = false, schema, prefix, }) => {
|
|
4606
|
+
const { watch, formState: { errors }, } = reactHookForm.useFormContext();
|
|
4607
|
+
const { translate } = useSchemaContext();
|
|
4608
|
+
const { required } = schema;
|
|
4609
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4610
|
+
const { gridColumn, gridRow, renderDisplay } = schema;
|
|
4611
|
+
const colLabel = `${prefix}${column}`;
|
|
4612
|
+
const watchEnum = watch(colLabel);
|
|
4613
|
+
const watchEnums = (watch(colLabel) ?? []);
|
|
4614
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${column}.fieldLabel`))}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
4615
|
+
gridRow, children: [isMultiple && (jsxRuntime.jsx(react.Flex, { flexFlow: "wrap", gap: 1, children: watchEnums.map((enumValue) => {
|
|
4616
|
+
const item = enumValue;
|
|
4617
|
+
if (item === undefined) {
|
|
4618
|
+
return jsxRuntime.jsx(jsxRuntime.Fragment, { children: "undefined" });
|
|
4619
|
+
}
|
|
4620
|
+
return (jsxRuntime.jsx(Tag, { closable: true, children: !!renderDisplay === true
|
|
4621
|
+
? renderDisplay(item)
|
|
4622
|
+
: translate.t(removeIndex(`${colLabel}.${item}`)) }));
|
|
4623
|
+
}) })), !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`)) }))] }));
|
|
4624
|
+
};
|
|
4625
|
+
|
|
4626
|
+
const FileViewer = ({ column, schema, prefix }) => {
|
|
4627
|
+
const { setValue, formState: { errors }, watch, } = reactHookForm.useFormContext();
|
|
4628
|
+
const { translate } = useSchemaContext();
|
|
4629
|
+
const { required, gridColumn, gridRow } = schema;
|
|
4630
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4631
|
+
const currentFiles = (watch(column) ?? []);
|
|
4632
|
+
const colLabel = `${prefix}${column}`;
|
|
4633
|
+
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 }) => {
|
|
4634
|
+
const newFiles = files.filter(({ name }) => !currentFiles.some((cur) => cur.name === name));
|
|
4635
|
+
setValue(colLabel, [...currentFiles, ...newFiles]);
|
|
4636
|
+
}, placeholder: translate.t(`${colLabel}.fileDropzone`) }), jsxRuntime.jsx(react.Flex, { flexFlow: "column", gap: 1, children: currentFiles.map((file) => {
|
|
4637
|
+
return (jsxRuntime.jsx(react.Card.Root, { variant: "subtle", children: jsxRuntime.jsxs(react.Card.Body, { gap: "2", cursor: "pointer", onClick: () => {
|
|
4638
|
+
setValue(column, currentFiles.filter(({ name }) => {
|
|
4639
|
+
return name !== file.name;
|
|
4640
|
+
}));
|
|
4641
|
+
}, display: "flex", flexFlow: "row", alignItems: "center", padding: "2", children: [jsxRuntime.jsx(react.Box, { children: file.name }), jsxRuntime.jsx(ti.TiDeleteOutline, {})] }) }, file.name));
|
|
4642
|
+
}) }), errors[`${colLabel}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
4643
|
+
};
|
|
4644
|
+
|
|
4645
|
+
const IdViewer = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
4646
|
+
const { watch, formState: { errors }, } = reactHookForm.useFormContext();
|
|
4647
|
+
const { idMap, translate } = useSchemaContext();
|
|
4648
|
+
const { required, gridColumn, gridRow, renderDisplay, foreign_key } = schema;
|
|
4649
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4650
|
+
const { display_column } = foreign_key;
|
|
4651
|
+
const colLabel = `${prefix}${column}`;
|
|
4652
|
+
const watchId = watch(colLabel);
|
|
4653
|
+
const watchIds = (watch(colLabel) ?? []);
|
|
4654
|
+
const getPickedValue = () => {
|
|
4655
|
+
if (Object.keys(idMap).length <= 0) {
|
|
4656
|
+
return "";
|
|
4657
|
+
}
|
|
4658
|
+
const record = idMap[watchId];
|
|
4659
|
+
if (record === undefined) {
|
|
4660
|
+
return "";
|
|
4661
|
+
}
|
|
4662
|
+
return record[display_column];
|
|
4663
|
+
};
|
|
4664
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${column}.fieldLabel`))}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
4665
|
+
gridRow, children: [isMultiple && (jsxRuntime.jsx(react.Flex, { flexFlow: "wrap", gap: 1, children: watchIds.map((id) => {
|
|
4666
|
+
const item = idMap[id];
|
|
4667
|
+
if (item === undefined) {
|
|
4668
|
+
return (jsxRuntime.jsx(react.Text, { children: translate.t(removeIndex(`${colLabel}.undefined`)) }, id));
|
|
4669
|
+
}
|
|
4670
|
+
return (jsxRuntime.jsx(Tag, { closable: true, children: !!renderDisplay === true
|
|
4671
|
+
? renderDisplay(item)
|
|
4672
|
+
: item[display_column] }, id));
|
|
4673
|
+
}) })), !isMultiple && jsxRuntime.jsx(react.Text, { children: getPickedValue() }), errors[`${colLabel}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
4674
|
+
};
|
|
4675
|
+
|
|
4676
|
+
const NumberViewer = ({ schema, column, prefix, }) => {
|
|
4677
|
+
const { watch, formState: { errors }, } = reactHookForm.useFormContext();
|
|
4678
|
+
const { translate } = useSchemaContext();
|
|
4679
|
+
const { required, gridColumn, gridRow } = schema;
|
|
4680
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4681
|
+
const colLabel = `${prefix}${column}`;
|
|
4682
|
+
const value = watch(colLabel);
|
|
4683
|
+
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`)) }))] }));
|
|
4684
|
+
};
|
|
4685
|
+
|
|
4686
|
+
const ObjectViewer = ({ schema, column, prefix }) => {
|
|
4687
|
+
const { properties, gridRow, gridColumn = "1/span 12", required } = schema;
|
|
4688
|
+
const { translate } = useSchemaContext();
|
|
4689
|
+
const colLabel = `${prefix}${column}`;
|
|
4690
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4691
|
+
const { formState: { errors }, } = reactHookForm.useFormContext();
|
|
4692
|
+
if (properties === undefined) {
|
|
4693
|
+
throw new Error(`properties is undefined when using ObjectInput`);
|
|
4694
|
+
}
|
|
4695
|
+
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) => {
|
|
4696
|
+
return (
|
|
4697
|
+
// @ts-expect-error find suitable types
|
|
4698
|
+
jsxRuntime.jsx(ColumnViewer, { column: `${key}`,
|
|
4699
|
+
prefix: `${prefix}${column}.`,
|
|
4700
|
+
properties }, `form-objectviewer-${colLabel}-${key}`));
|
|
4701
|
+
}) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
4702
|
+
};
|
|
4703
|
+
|
|
4704
|
+
const RecordInput = ({ column, schema, prefix }) => {
|
|
4705
|
+
const { formState: { errors }, setValue, getValues, } = reactHookForm.useFormContext();
|
|
4706
|
+
const { translate } = useSchemaContext();
|
|
4707
|
+
const { required, gridColumn, gridRow } = schema;
|
|
4708
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4709
|
+
const entries = Object.entries(getValues(column) ?? {});
|
|
4710
|
+
const [showNewEntries, setShowNewEntries] = React.useState(false);
|
|
4711
|
+
const [newKey, setNewKey] = React.useState();
|
|
4712
|
+
const [newValue, setNewValue] = React.useState();
|
|
4713
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(`${column}.fieldLabel`)}`, required: isRequired, alignItems: "stretch", gridColumn, gridRow, children: [entries.map(([key, value]) => {
|
|
4714
|
+
return (jsxRuntime.jsxs(react.Grid, { templateColumns: "1fr 1fr auto", gap: 1, children: [jsxRuntime.jsx(react.Input, { value: key, onChange: (e) => {
|
|
4715
|
+
const filtered = entries.filter(([target]) => {
|
|
4716
|
+
return target !== key;
|
|
4717
|
+
});
|
|
4718
|
+
setValue(column, Object.fromEntries([...filtered, [e.target.value, value]]));
|
|
4719
|
+
}, autoComplete: "off" }), jsxRuntime.jsx(react.Input, { value: value, onChange: (e) => {
|
|
4720
|
+
setValue(column, {
|
|
4721
|
+
...getValues(column),
|
|
4722
|
+
[key]: e.target.value,
|
|
4723
|
+
});
|
|
4724
|
+
}, autoComplete: "off" }), jsxRuntime.jsx(react.IconButton, { variant: "ghost", onClick: () => {
|
|
4725
|
+
const filtered = entries.filter(([target]) => {
|
|
4726
|
+
return target !== key;
|
|
4727
|
+
});
|
|
4728
|
+
setValue(column, Object.fromEntries([...filtered]));
|
|
4729
|
+
}, children: jsxRuntime.jsx(cg.CgClose, {}) })] }));
|
|
4730
|
+
}), 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) => {
|
|
4731
|
+
setNewKey(e.target.value);
|
|
4732
|
+
}, autoComplete: "off" }), jsxRuntime.jsx(react.Input, { value: newValue, onChange: (e) => {
|
|
4733
|
+
setNewValue(e.target.value);
|
|
4734
|
+
}, autoComplete: "off" })] }) }), jsxRuntime.jsxs(react.Card.Footer, { justifyContent: "flex-end", children: [jsxRuntime.jsx(react.IconButton, { variant: "subtle", onClick: () => {
|
|
4735
|
+
setShowNewEntries(false);
|
|
4736
|
+
setNewKey(undefined);
|
|
4737
|
+
setNewValue(undefined);
|
|
4738
|
+
}, children: jsxRuntime.jsx(cg.CgClose, {}) }), jsxRuntime.jsx(Button, { onClick: () => {
|
|
4739
|
+
if (!!newKey === false) {
|
|
4740
|
+
setShowNewEntries(false);
|
|
4741
|
+
setNewKey(undefined);
|
|
4742
|
+
setNewValue(undefined);
|
|
4743
|
+
return;
|
|
4744
|
+
}
|
|
4745
|
+
setValue(column, Object.fromEntries([...entries, [newKey, newValue]]));
|
|
4746
|
+
setShowNewEntries(false);
|
|
4747
|
+
setNewKey(undefined);
|
|
4748
|
+
setNewValue(undefined);
|
|
4749
|
+
}, children: translate.t(`${column}.save`) })] })] }) }), jsxRuntime.jsx(Button, { onClick: () => {
|
|
4750
|
+
setShowNewEntries(true);
|
|
4751
|
+
setNewKey(undefined);
|
|
4752
|
+
setNewValue(undefined);
|
|
4753
|
+
}, children: translate.t(`${column}.addNew`) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${column}.fieldRequired`) }))] }));
|
|
4754
|
+
};
|
|
4755
|
+
|
|
4756
|
+
const TagViewer = ({ column, schema, prefix }) => {
|
|
4757
|
+
const { watch, formState: { errors }, setValue, } = reactHookForm.useFormContext();
|
|
4758
|
+
const { serverUrl } = useSchemaContext();
|
|
4759
|
+
if (schema.properties == undefined) {
|
|
4760
|
+
throw new Error("schema properties undefined when using DatePicker");
|
|
4761
|
+
}
|
|
4762
|
+
const { gridColumn, gridRow, in_table, object_id_column } = schema;
|
|
4763
|
+
if (in_table === undefined) {
|
|
4764
|
+
throw new Error("in_table is undefined when using TagPicker");
|
|
4765
|
+
}
|
|
4766
|
+
if (object_id_column === undefined) {
|
|
4767
|
+
throw new Error("object_id_column is undefined when using TagPicker");
|
|
4768
|
+
}
|
|
4769
|
+
const query = reactQuery.useQuery({
|
|
4770
|
+
queryKey: [`tagpicker`, in_table],
|
|
4771
|
+
queryFn: async () => {
|
|
4772
|
+
return await getTableData({
|
|
4773
|
+
serverUrl,
|
|
4774
|
+
in_table: "tables_tags_view",
|
|
4775
|
+
where: [
|
|
4776
|
+
{
|
|
4777
|
+
id: "table_name",
|
|
4778
|
+
value: [in_table],
|
|
4779
|
+
},
|
|
4780
|
+
],
|
|
4781
|
+
limit: 100,
|
|
4782
|
+
});
|
|
4783
|
+
},
|
|
4784
|
+
staleTime: 10000,
|
|
4785
|
+
});
|
|
4786
|
+
const object_id = watch(object_id_column);
|
|
4787
|
+
const existingTagsQuery = reactQuery.useQuery({
|
|
4788
|
+
queryKey: [`existing`, { in_table, object_id_column }, object_id],
|
|
4789
|
+
queryFn: async () => {
|
|
4790
|
+
return await getTableData({
|
|
4791
|
+
serverUrl,
|
|
4792
|
+
in_table: in_table,
|
|
4793
|
+
where: [
|
|
4794
|
+
{
|
|
4795
|
+
id: object_id_column,
|
|
4796
|
+
value: object_id[0],
|
|
4797
|
+
},
|
|
4798
|
+
],
|
|
4799
|
+
limit: 100,
|
|
4800
|
+
});
|
|
4801
|
+
},
|
|
4802
|
+
enabled: object_id != undefined,
|
|
4803
|
+
staleTime: 10000,
|
|
4804
|
+
});
|
|
4805
|
+
const { isLoading, isFetching, data, isPending, isError } = query;
|
|
4806
|
+
const dataList = data?.data ?? [];
|
|
4807
|
+
const existingTagList = existingTagsQuery.data?.data ?? [];
|
|
4808
|
+
if (!!object_id === false) {
|
|
4809
|
+
return jsxRuntime.jsx(jsxRuntime.Fragment, {});
|
|
4810
|
+
}
|
|
4811
|
+
return (jsxRuntime.jsxs(react.Flex, { flexFlow: "column", gap: 4, gridColumn,
|
|
4812
|
+
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 }) => {
|
|
4813
|
+
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) => {
|
|
4814
|
+
const existedTags = Object.values(all_tags)
|
|
4815
|
+
.filter(({ id }) => {
|
|
4816
|
+
return existingTagList.some(({ tag_id }) => tag_id === id);
|
|
4817
|
+
})
|
|
4818
|
+
.map(({ id }) => {
|
|
4819
|
+
return id;
|
|
4820
|
+
});
|
|
4821
|
+
setValue(`${column}.${parent_tag_name}.current`, [
|
|
4822
|
+
tagIds.value,
|
|
4823
|
+
]);
|
|
4824
|
+
setValue(`${column}.${parent_tag_name}.old`, existedTags);
|
|
4825
|
+
}, children: jsxRuntime.jsx(react.Flex, { flexFlow: "wrap", gap: 2, children: Object.entries(all_tags).map(([tagName, { id }]) => {
|
|
4826
|
+
if (existingTagList.some(({ tag_id }) => tag_id === id)) {
|
|
4827
|
+
return (jsxRuntime.jsx(RadioCardItem, { label: tagName, value: id, flex: "0 0 0%", disabled: true }, `${tagName}-${id}`));
|
|
4828
|
+
}
|
|
4829
|
+
return (jsxRuntime.jsx(RadioCardItem, { label: tagName, value: id, flex: "0 0 0%", colorPalette: "blue" }, `${tagName}-${id}`));
|
|
4830
|
+
}) }) })), !is_mutually_exclusive && (jsxRuntime.jsx(react.CheckboxGroup, { onValueChange: (tagIds) => {
|
|
4831
|
+
setValue(`${column}.${parent_tag_name}.current`, tagIds);
|
|
4832
|
+
}, children: jsxRuntime.jsx(react.Flex, { flexFlow: "wrap", gap: 2, children: Object.entries(all_tags).map(([tagName, { id }]) => {
|
|
4833
|
+
if (existingTagList.some(({ tag_id }) => tag_id === id)) {
|
|
4834
|
+
return (jsxRuntime.jsx(CheckboxCard, { label: tagName, value: id, flex: "0 0 0%", disabled: true, colorPalette: "blue" }, `${tagName}-${id}`));
|
|
4835
|
+
}
|
|
4836
|
+
return (jsxRuntime.jsx(CheckboxCard, { label: tagName, value: id, flex: "0 0 0%" }, `${tagName}-${id}`));
|
|
4837
|
+
}) }) }))] }, `tag-${parent_tag_name}`));
|
|
4838
|
+
}), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: (errors[`${column}`]?.message ?? "No error message") }))] }));
|
|
4839
|
+
};
|
|
4840
|
+
|
|
4841
|
+
const StringViewer = ({ column, schema, prefix, }) => {
|
|
4842
|
+
const { watch, formState: { errors }, } = reactHookForm.useFormContext();
|
|
4843
|
+
const { translate } = useSchemaContext();
|
|
4844
|
+
const { required, gridColumn, gridRow } = schema;
|
|
4845
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4846
|
+
const colLabel = `${prefix}${column}`;
|
|
4847
|
+
const value = watch(colLabel);
|
|
4848
|
+
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`)) }))] }) }));
|
|
4849
|
+
};
|
|
4850
|
+
|
|
4851
|
+
const SchemaViewer = ({ schema, prefix, column, }) => {
|
|
4852
|
+
const colSchema = schema;
|
|
4853
|
+
const { type, variant, properties: innerProperties, foreign_key, items, } = schema;
|
|
4854
|
+
if (type === "string") {
|
|
4855
|
+
if ((schema.enum ?? []).length > 0) {
|
|
4856
|
+
return jsxRuntime.jsx(EnumViewer, { schema: colSchema, prefix, column });
|
|
4857
|
+
}
|
|
4858
|
+
if (variant === "id-picker") {
|
|
4859
|
+
idPickerSanityCheck(column, foreign_key);
|
|
4860
|
+
return jsxRuntime.jsx(IdViewer, { schema: colSchema, prefix, column });
|
|
4861
|
+
}
|
|
4862
|
+
if (variant === "date-picker") {
|
|
4863
|
+
return jsxRuntime.jsx(DateViewer, { schema: colSchema, prefix, column });
|
|
4864
|
+
}
|
|
4865
|
+
return jsxRuntime.jsx(StringViewer, { schema: colSchema, prefix, column });
|
|
4866
|
+
}
|
|
4867
|
+
if (type === "number" || type === "integer") {
|
|
4868
|
+
return jsxRuntime.jsx(NumberViewer, { schema: colSchema, prefix, column });
|
|
4869
|
+
}
|
|
4870
|
+
if (type === "boolean") {
|
|
4871
|
+
return jsxRuntime.jsx(BooleanViewer, { schema: colSchema, prefix, column });
|
|
4872
|
+
}
|
|
4873
|
+
if (type === "object") {
|
|
4874
|
+
if (innerProperties) {
|
|
4875
|
+
return jsxRuntime.jsx(ObjectViewer, { schema: colSchema, prefix, column });
|
|
4876
|
+
}
|
|
4877
|
+
return jsxRuntime.jsx(RecordInput, { schema: colSchema, prefix, column });
|
|
4878
|
+
}
|
|
4879
|
+
if (type === "array") {
|
|
4880
|
+
if (variant === "id-picker") {
|
|
4881
|
+
idPickerSanityCheck(column, foreign_key);
|
|
4882
|
+
return (jsxRuntime.jsx(IdViewer, { schema: colSchema, prefix, column, isMultiple: true }));
|
|
4883
|
+
}
|
|
4884
|
+
if (variant === "tag-picker") {
|
|
4885
|
+
return jsxRuntime.jsx(TagViewer, { schema: colSchema, prefix, column });
|
|
4886
|
+
}
|
|
4887
|
+
if (variant === "file-picker") {
|
|
4888
|
+
return jsxRuntime.jsx(FileViewer, { schema: colSchema, prefix, column });
|
|
4889
|
+
}
|
|
4890
|
+
if (items) {
|
|
4891
|
+
return jsxRuntime.jsx(ArrayViewer, { schema: colSchema, prefix, column });
|
|
4892
|
+
}
|
|
4893
|
+
return jsxRuntime.jsx(react.Text, { children: `array ${column}` });
|
|
4894
|
+
}
|
|
4895
|
+
if (type === "null") {
|
|
4896
|
+
return jsxRuntime.jsx(react.Text, { children: `null ${column}` });
|
|
4897
|
+
}
|
|
4898
|
+
return jsxRuntime.jsx(react.Text, { children: "missing type" });
|
|
4899
|
+
};
|
|
4900
|
+
|
|
4901
|
+
const ColumnViewer = ({ column, properties, prefix, }) => {
|
|
4555
4902
|
if (properties === undefined) {
|
|
4556
4903
|
return jsxRuntime.jsx(jsxRuntime.Fragment, {});
|
|
4557
4904
|
}
|
|
4558
|
-
console.log(`${column} does not exist when using ColumnRenderer`, { properties, column, prefix }, "fdpok");
|
|
4559
4905
|
const colSchema = properties[column];
|
|
4560
4906
|
if (colSchema === undefined) {
|
|
4561
4907
|
throw new Error(`${column} does not exist when using ColumnRenderer`);
|
|
4562
4908
|
}
|
|
4563
|
-
return jsxRuntime.jsx(
|
|
4909
|
+
return jsxRuntime.jsx(SchemaViewer, { schema: colSchema, prefix, column });
|
|
4564
4910
|
};
|
|
4565
4911
|
|
|
4566
4912
|
const idPickerSanityCheck = (column, foreign_key) => {
|
|
@@ -4579,7 +4925,7 @@ const idPickerSanityCheck = (column, foreign_key) => {
|
|
|
4579
4925
|
}
|
|
4580
4926
|
};
|
|
4581
4927
|
const FormInternal = () => {
|
|
4582
|
-
const { schema, requestUrl, order,
|
|
4928
|
+
const { schema, requestUrl, order, onSubmit, rowNumber, translate, requestOptions, } = useSchemaContext();
|
|
4583
4929
|
const methods = reactHookForm.useFormContext();
|
|
4584
4930
|
const [isSuccess, setIsSuccess] = React.useState(false);
|
|
4585
4931
|
const [isError, setIsError] = React.useState(false);
|
|
@@ -4654,7 +5000,13 @@ const FormInternal = () => {
|
|
|
4654
5000
|
}, formNoValidate: true, children: translate.t("submitAgain") }) })] }));
|
|
4655
5001
|
}
|
|
4656
5002
|
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:
|
|
5003
|
+
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) => {
|
|
5004
|
+
return (jsxRuntime.jsx(ColumnViewer
|
|
5005
|
+
// @ts-expect-error find suitable types
|
|
5006
|
+
, {
|
|
5007
|
+
// @ts-expect-error find suitable types
|
|
5008
|
+
properties: properties, prefix: ``, column }, `form-viewer-${column}`));
|
|
5009
|
+
}) }), jsxRuntime.jsxs(react.Flex, { justifyContent: "end", gap: "2", children: [jsxRuntime.jsx(Button, { onClick: () => {
|
|
4658
5010
|
setIsConfirming(false);
|
|
4659
5011
|
}, variant: "subtle", children: translate.t("cancel") }), jsxRuntime.jsx(Button, { onClick: () => {
|
|
4660
5012
|
onFormSubmit(validatedData);
|
|
@@ -4665,7 +5017,7 @@ const FormInternal = () => {
|
|
|
4665
5017
|
// @ts-expect-error find suitable types
|
|
4666
5018
|
, {
|
|
4667
5019
|
// @ts-expect-error find suitable types
|
|
4668
|
-
properties: properties, prefix: ``, column }, `form-${column}`));
|
|
5020
|
+
properties: properties, prefix: ``, column }, `form-input-${column}`));
|
|
4669
5021
|
}) }), jsxRuntime.jsxs(react.Flex, { justifyContent: "end", gap: "2", children: [jsxRuntime.jsx(Button, { onClick: () => {
|
|
4670
5022
|
methods.reset();
|
|
4671
5023
|
}, variant: "subtle", children: translate.t("reset") }), jsxRuntime.jsx(Button, { onClick: () => {
|