@bsol-oss/react-datatable5 11.0.0-beta.1 → 11.0.0-beta.10
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 +12 -5
- package/dist/index.js +841 -560
- package/dist/index.mjs +844 -564
- 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 +8 -2
- package/dist/types/components/Form/SchemaFormContext.d.ts +1 -0
- package/dist/types/components/Form/components/ArrayRenderer.d.ts +7 -0
- package/dist/types/components/Form/components/BooleanPicker.d.ts +4 -1
- package/dist/types/components/Form/components/ColumnRenderer.d.ts +7 -0
- package/dist/types/components/Form/components/DatePicker.d.ts +4 -1
- package/dist/types/components/Form/components/EnumPicker.d.ts +4 -1
- package/dist/types/components/Form/components/FilePicker.d.ts +3 -1
- package/dist/types/components/Form/components/IdPicker.d.ts +4 -1
- package/dist/types/components/Form/components/NumberInputField.d.ts +4 -1
- package/dist/types/components/Form/components/ObjectInput.d.ts +5 -2
- package/dist/types/components/Form/components/RecordInput.d.ts +7 -0
- package/dist/types/components/Form/components/SchemaRenderer.d.ts +7 -0
- package/dist/types/components/Form/components/StringInputField.d.ts +4 -4
- package/dist/types/components/Form/components/TagPicker.d.ts +4 -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/useSchemaContext.d.ts +2 -14
- package/dist/types/components/Form/utils/removeIndex.d.ts +1 -0
- package/package.json +3 -4
package/dist/index.js
CHANGED
|
@@ -2380,7 +2380,7 @@ function ColumnCard({ columnId }) {
|
|
|
2380
2380
|
onDrop: () => setDragging(false), // NEW
|
|
2381
2381
|
});
|
|
2382
2382
|
}, [columnId, table]);
|
|
2383
|
-
return (jsxRuntime.jsxs(react.Grid, { ref: ref, templateColumns: "auto 1fr", gap: "0.5rem", alignItems: "center", style: dragging ? { opacity: 0.4 } : {}, children: [jsxRuntime.jsx(react.Flex, { alignItems: "center", padding: "0", children: jsxRuntime.jsx(fa6.FaGripLinesVertical, { color: "gray.400" }) }), jsxRuntime.jsx(react.Flex, { justifyContent: "space-between", alignItems: "center", children: jsxRuntime.jsx(CheckboxCard, { variant: "surface", label: displayName, checked: column.getIsVisible(), onChange: column.getToggleVisibilityHandler() }) })] }));
|
|
2383
|
+
return (jsxRuntime.jsxs(react.Grid, { ref: ref, templateColumns: "auto 1fr", gap: "0.5rem", alignItems: "center", style: dragging ? { opacity: 0.4 } : {}, children: [jsxRuntime.jsx(react.Flex, { alignItems: "center", padding: "0", cursor: 'grab', children: jsxRuntime.jsx(fa6.FaGripLinesVertical, { color: "gray.400" }) }), jsxRuntime.jsx(react.Flex, { justifyContent: "space-between", alignItems: "center", children: jsxRuntime.jsx(CheckboxCard, { variant: "surface", label: displayName, checked: column.getIsVisible(), onChange: column.getToggleVisibilityHandler() }) })] }));
|
|
2384
2384
|
}
|
|
2385
2385
|
function CardContainer({ location, children }) {
|
|
2386
2386
|
const ref = React.useRef(null);
|
|
@@ -2418,9 +2418,11 @@ function CardContainer({ location, children }) {
|
|
|
2418
2418
|
}
|
|
2419
2419
|
const TableViewer = () => {
|
|
2420
2420
|
const { table } = useDataTableContext();
|
|
2421
|
-
const
|
|
2422
|
-
|
|
2423
|
-
|
|
2421
|
+
const order = table.getState().columnOrder.length > 0
|
|
2422
|
+
? table.getState().columnOrder
|
|
2423
|
+
: table.getAllLeafColumns().map(({ id }) => {
|
|
2424
|
+
return id;
|
|
2425
|
+
});
|
|
2424
2426
|
React.useEffect(() => {
|
|
2425
2427
|
return monitorForElements({
|
|
2426
2428
|
onDrop({ source, location }) {
|
|
@@ -2445,11 +2447,10 @@ const TableViewer = () => {
|
|
|
2445
2447
|
...columnAfter,
|
|
2446
2448
|
].filter((id) => id != "<marker>");
|
|
2447
2449
|
table.setColumnOrder(newOrder);
|
|
2448
|
-
setOrder(newOrder);
|
|
2449
2450
|
},
|
|
2450
2451
|
});
|
|
2451
|
-
}, [
|
|
2452
|
-
return (jsxRuntime.jsx(react.Flex, { flexFlow: "column", gap: "0.25rem", children:
|
|
2452
|
+
}, [table]);
|
|
2453
|
+
return (jsxRuntime.jsx(react.Flex, { flexFlow: "column", gap: "0.25rem", children: order.map((columnId, index) => {
|
|
2453
2454
|
return (jsxRuntime.jsx(CardContainer, { location: index, children: jsxRuntime.jsx(ColumnCard, { columnId: columnId }) }));
|
|
2454
2455
|
}) }));
|
|
2455
2456
|
};
|
|
@@ -2624,89 +2625,77 @@ const RecordDisplay = ({ object, boxProps, translate, prefix = "", }) => {
|
|
|
2624
2625
|
}) }));
|
|
2625
2626
|
};
|
|
2626
2627
|
|
|
2627
|
-
const
|
|
2628
|
-
|
|
2629
|
-
return JSON.stringify(value);
|
|
2630
|
-
}
|
|
2631
|
-
if (typeof value === "string") {
|
|
2632
|
-
return value;
|
|
2633
|
-
}
|
|
2634
|
-
if (typeof value === "number" || typeof value === "boolean") {
|
|
2635
|
-
return `${value}`;
|
|
2636
|
-
}
|
|
2637
|
-
if (value === undefined) {
|
|
2638
|
-
return `undefined`;
|
|
2639
|
-
}
|
|
2640
|
-
throw new Error(`value is unknown, ${typeof value}`);
|
|
2641
|
-
};
|
|
2642
|
-
const DataDisplay = ({ variant = "", translate }) => {
|
|
2643
|
-
const { table } = useDataTableContext();
|
|
2628
|
+
const CellRenderer = ({ cell }) => {
|
|
2629
|
+
const { translate } = useDataTableContext();
|
|
2644
2630
|
const getLabel = ({ columnId }) => {
|
|
2645
2631
|
if (translate !== undefined) {
|
|
2646
2632
|
return translate.t(`${columnId}`);
|
|
2647
2633
|
}
|
|
2648
2634
|
return snakeToLabel(columnId);
|
|
2649
2635
|
};
|
|
2650
|
-
|
|
2651
|
-
|
|
2652
|
-
|
|
2653
|
-
|
|
2654
|
-
|
|
2655
|
-
|
|
2656
|
-
|
|
2657
|
-
|
|
2658
|
-
|
|
2659
|
-
|
|
2660
|
-
|
|
2661
|
-
|
|
2662
|
-
|
|
2663
|
-
|
|
2664
|
-
|
|
2665
|
-
|
|
2666
|
-
|
|
2667
|
-
|
|
2668
|
-
|
|
2669
|
-
|
|
2636
|
+
const formatValue = (value) => {
|
|
2637
|
+
if (typeof value === "object") {
|
|
2638
|
+
return JSON.stringify(value);
|
|
2639
|
+
}
|
|
2640
|
+
if (typeof value === "string") {
|
|
2641
|
+
return value;
|
|
2642
|
+
}
|
|
2643
|
+
if (typeof value === "number" || typeof value === "boolean") {
|
|
2644
|
+
return `${value}`;
|
|
2645
|
+
}
|
|
2646
|
+
if (value === undefined) {
|
|
2647
|
+
if (translate !== undefined) {
|
|
2648
|
+
return translate.t(`undefined`);
|
|
2649
|
+
}
|
|
2650
|
+
return `undefined`;
|
|
2651
|
+
}
|
|
2652
|
+
throw new Error(`value is unknown, ${typeof value}`);
|
|
2653
|
+
};
|
|
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));
|
|
2670
2663
|
}
|
|
2671
|
-
|
|
2672
|
-
|
|
2673
|
-
|
|
2674
|
-
|
|
2675
|
-
|
|
2676
|
-
|
|
2677
|
-
|
|
2678
|
-
|
|
2679
|
-
|
|
2680
|
-
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: {
|
|
2681
|
-
borderWidth: 1,
|
|
2682
|
-
borderRadius: 4,
|
|
2683
|
-
borderColor: "gray.400",
|
|
2684
|
-
paddingX: 4,
|
|
2685
|
-
paddingY: 2,
|
|
2686
|
-
}, object: value })] }));
|
|
2687
|
-
}
|
|
2688
|
-
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));
|
|
2689
|
-
}) }) }) }, `chakra-table-card-${row.id}`));
|
|
2690
|
-
}) }));
|
|
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));
|
|
2691
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();
|
|
2692
2678
|
return (jsxRuntime.jsx(react.Flex, { flexFlow: "column", gap: "1", children: table.getRowModel().rows.map((row) => {
|
|
2693
|
-
|
|
2694
|
-
|
|
2695
|
-
|
|
2696
|
-
|
|
2697
|
-
|
|
2698
|
-
|
|
2699
|
-
|
|
2700
|
-
|
|
2701
|
-
|
|
2702
|
-
|
|
2703
|
-
|
|
2704
|
-
|
|
2705
|
-
|
|
2706
|
-
|
|
2707
|
-
|
|
2708
|
-
|
|
2709
|
-
|
|
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}`));
|
|
2710
2699
|
}) }));
|
|
2711
2700
|
};
|
|
2712
2701
|
|
|
@@ -3494,7 +3483,7 @@ const widthSanityCheck = (widthList, ignoreList, properties) => {
|
|
|
3494
3483
|
throw new Error(`The width list is too long given from the number of remaining properties after ignore some.`);
|
|
3495
3484
|
}
|
|
3496
3485
|
};
|
|
3497
|
-
const getColumns = ({ schema, ignore = [], width = [], meta = {}, defaultWidth = 400, translate, }) => {
|
|
3486
|
+
const getColumns = ({ schema, include = [], ignore = [], width = [], meta = {}, defaultWidth = 400, translate, }) => {
|
|
3498
3487
|
const { properties } = schema;
|
|
3499
3488
|
idListSanityCheck("ignore", ignore, properties);
|
|
3500
3489
|
widthSanityCheck(width, ignore, properties);
|
|
@@ -3506,7 +3495,8 @@ const getColumns = ({ schema, ignore = [], width = [], meta = {}, defaultWidth =
|
|
|
3506
3495
|
return snakeToLabel(column);
|
|
3507
3496
|
};
|
|
3508
3497
|
const keys = Object.keys(properties);
|
|
3509
|
-
const
|
|
3498
|
+
const included = include.length > 0 ? include : keys;
|
|
3499
|
+
const ignored = included.filter((key) => {
|
|
3510
3500
|
return !ignore.some((shouldIgnoreKey) => key === shouldIgnoreKey);
|
|
3511
3501
|
});
|
|
3512
3502
|
const columnHelper = reactTable.createColumnHelper();
|
|
@@ -3558,239 +3548,14 @@ const SchemaFormContext = React.createContext({
|
|
|
3558
3548
|
requestUrl: "",
|
|
3559
3549
|
order: [],
|
|
3560
3550
|
ignore: [],
|
|
3551
|
+
include: [],
|
|
3561
3552
|
onSubmit: async () => { },
|
|
3562
3553
|
rowNumber: 0,
|
|
3563
3554
|
requestOptions: {},
|
|
3564
3555
|
});
|
|
3565
3556
|
|
|
3566
|
-
const PopoverContent = React__namespace.forwardRef(function PopoverContent(props, ref) {
|
|
3567
|
-
const { portalled = true, portalRef, ...rest } = props;
|
|
3568
|
-
return (jsxRuntime.jsx(react.Portal, { disabled: !portalled, container: portalRef, children: jsxRuntime.jsx(react.Popover.Positioner, { children: jsxRuntime.jsx(react.Popover.Content, { ref: ref, ...rest }) }) }));
|
|
3569
|
-
});
|
|
3570
|
-
React__namespace.forwardRef(function PopoverArrow(props, ref) {
|
|
3571
|
-
return (jsxRuntime.jsx(react.Popover.Arrow, { ...props, ref: ref, children: jsxRuntime.jsx(react.Popover.ArrowTip, {}) }));
|
|
3572
|
-
});
|
|
3573
|
-
React__namespace.forwardRef(function PopoverCloseTrigger(props, ref) {
|
|
3574
|
-
return (jsxRuntime.jsx(react.Popover.CloseTrigger, { position: "absolute", top: "1", insetEnd: "1", ...props, asChild: true, ref: ref, children: jsxRuntime.jsx(CloseButton, { size: "sm" }) }));
|
|
3575
|
-
});
|
|
3576
|
-
const PopoverTitle = react.Popover.Title;
|
|
3577
|
-
react.Popover.Description;
|
|
3578
|
-
react.Popover.Footer;
|
|
3579
|
-
react.Popover.Header;
|
|
3580
|
-
const PopoverRoot = react.Popover.Root;
|
|
3581
|
-
const PopoverBody = react.Popover.Body;
|
|
3582
|
-
const PopoverTrigger = react.Popover.Trigger;
|
|
3583
|
-
|
|
3584
|
-
const Field = React__namespace.forwardRef(function Field(props, ref) {
|
|
3585
|
-
const { label, children, helperText, errorText, optionalText, ...rest } = props;
|
|
3586
|
-
return (jsxRuntime.jsxs(react.Field.Root, { ref: ref, ...rest, children: [label && (jsxRuntime.jsxs(react.Field.Label, { children: [label, jsxRuntime.jsx(react.Field.RequiredIndicator, { fallback: optionalText })] })), children, helperText && (jsxRuntime.jsx(react.Field.HelperText, { children: helperText })), errorText && (jsxRuntime.jsx(react.Field.ErrorText, { children: errorText }))] }));
|
|
3587
|
-
});
|
|
3588
|
-
|
|
3589
3557
|
const useSchemaContext = () => {
|
|
3590
|
-
|
|
3591
|
-
return {
|
|
3592
|
-
schema,
|
|
3593
|
-
serverUrl,
|
|
3594
|
-
requestUrl,
|
|
3595
|
-
order,
|
|
3596
|
-
ignore,
|
|
3597
|
-
onSubmit,
|
|
3598
|
-
rowNumber,
|
|
3599
|
-
idMap,
|
|
3600
|
-
setIdMap,
|
|
3601
|
-
translate,
|
|
3602
|
-
requestOptions,
|
|
3603
|
-
};
|
|
3604
|
-
};
|
|
3605
|
-
|
|
3606
|
-
const getTableData = async ({ serverUrl, in_table, searching = "", where = [], limit = 10, offset = 0, }) => {
|
|
3607
|
-
if (serverUrl === undefined || serverUrl.length == 0) {
|
|
3608
|
-
throw new Error("The serverUrl is missing");
|
|
3609
|
-
}
|
|
3610
|
-
if (in_table === undefined || in_table.length == 0) {
|
|
3611
|
-
throw new Error("The in_table is missing");
|
|
3612
|
-
}
|
|
3613
|
-
const options = {
|
|
3614
|
-
method: "GET",
|
|
3615
|
-
url: `${serverUrl}/api/g/${in_table}`,
|
|
3616
|
-
params: {
|
|
3617
|
-
searching,
|
|
3618
|
-
where,
|
|
3619
|
-
limit,
|
|
3620
|
-
offset
|
|
3621
|
-
},
|
|
3622
|
-
};
|
|
3623
|
-
try {
|
|
3624
|
-
const { data } = await axios.request(options);
|
|
3625
|
-
console.log(data);
|
|
3626
|
-
return data;
|
|
3627
|
-
}
|
|
3628
|
-
catch (error) {
|
|
3629
|
-
console.error(error);
|
|
3630
|
-
throw error;
|
|
3631
|
-
}
|
|
3632
|
-
};
|
|
3633
|
-
|
|
3634
|
-
const IdPicker = ({ column, isMultiple = false }) => {
|
|
3635
|
-
const { watch, formState: { errors }, setValue, } = reactHookForm.useFormContext();
|
|
3636
|
-
const { schema, serverUrl, idMap, setIdMap, translate } = useSchemaContext();
|
|
3637
|
-
const { required } = schema;
|
|
3638
|
-
const isRequired = required?.some((columnId) => columnId === column);
|
|
3639
|
-
if (schema.properties == undefined) {
|
|
3640
|
-
throw new Error("schema properties is undefined when using DatePicker");
|
|
3641
|
-
}
|
|
3642
|
-
const { gridColumn, gridRow, renderDisplay, foreign_key } = schema.properties[column];
|
|
3643
|
-
const { table, column: column_ref, display_column, } = foreign_key;
|
|
3644
|
-
const [searchText, setSearchText] = React.useState();
|
|
3645
|
-
const [limit, setLimit] = React.useState(10);
|
|
3646
|
-
const [openSearchResult, setOpenSearchResult] = React.useState();
|
|
3647
|
-
const [page, setPage] = React.useState(0);
|
|
3648
|
-
const ref = React.useRef(null);
|
|
3649
|
-
const selectedIds = watch(column) ?? [];
|
|
3650
|
-
const query = reactQuery.useQuery({
|
|
3651
|
-
queryKey: [`idpicker`, { column, searchText, limit, page }],
|
|
3652
|
-
queryFn: async () => {
|
|
3653
|
-
const data = await getTableData({
|
|
3654
|
-
serverUrl,
|
|
3655
|
-
searching: searchText ?? "",
|
|
3656
|
-
in_table: table,
|
|
3657
|
-
limit: limit,
|
|
3658
|
-
offset: page * 10,
|
|
3659
|
-
});
|
|
3660
|
-
const newMap = Object.fromEntries((data ?? { data: [] }).data.map((item) => {
|
|
3661
|
-
return [
|
|
3662
|
-
item[column_ref],
|
|
3663
|
-
{
|
|
3664
|
-
...item,
|
|
3665
|
-
},
|
|
3666
|
-
];
|
|
3667
|
-
}));
|
|
3668
|
-
setIdMap((state) => {
|
|
3669
|
-
return { ...state, ...newMap };
|
|
3670
|
-
});
|
|
3671
|
-
return data;
|
|
3672
|
-
},
|
|
3673
|
-
enabled: (searchText ?? "")?.length > 0,
|
|
3674
|
-
staleTime: 300000,
|
|
3675
|
-
});
|
|
3676
|
-
const { isLoading, isFetching, data, isPending, isError } = query;
|
|
3677
|
-
const dataList = data?.data ?? [];
|
|
3678
|
-
const count = data?.count ?? 0;
|
|
3679
|
-
const isDirty = (searchText?.length ?? 0) > 0;
|
|
3680
|
-
const onSearchChange = async (event) => {
|
|
3681
|
-
setSearchText(event.target.value);
|
|
3682
|
-
setPage(0);
|
|
3683
|
-
setLimit(10);
|
|
3684
|
-
};
|
|
3685
|
-
const watchId = watch(column);
|
|
3686
|
-
const watchIds = (watch(column) ?? []);
|
|
3687
|
-
const getPickedValue = () => {
|
|
3688
|
-
if (Object.keys(idMap).length <= 0) {
|
|
3689
|
-
return "";
|
|
3690
|
-
}
|
|
3691
|
-
const record = idMap[watchId];
|
|
3692
|
-
if (record === undefined) {
|
|
3693
|
-
return "";
|
|
3694
|
-
}
|
|
3695
|
-
return record[display_column];
|
|
3696
|
-
};
|
|
3697
|
-
return (jsxRuntime.jsxs(Field, { label: `${translate.t(`${column}.fieldLabel`)}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
3698
|
-
gridRow, children: [isMultiple && (jsxRuntime.jsxs(react.Flex, { flexFlow: "wrap", gap: 1, children: [selectedIds.map((id) => {
|
|
3699
|
-
const item = idMap[id];
|
|
3700
|
-
if (item === undefined) {
|
|
3701
|
-
return jsxRuntime.jsx(react.Text, { children: "undefined" }, id);
|
|
3702
|
-
}
|
|
3703
|
-
return (jsxRuntime.jsx(Tag, { closable: true, onClick: () => {
|
|
3704
|
-
setValue(column, watchIds.filter((id) => id != item[column_ref]));
|
|
3705
|
-
}, children: !!renderDisplay === true
|
|
3706
|
-
? renderDisplay(item)
|
|
3707
|
-
: item[display_column] }, id));
|
|
3708
|
-
}), jsxRuntime.jsx(Tag, { cursor: "pointer", onClick: () => {
|
|
3709
|
-
setOpenSearchResult(true);
|
|
3710
|
-
}, children: "Add" })] })), !isMultiple && (jsxRuntime.jsx(Button, { variant: "outline", onClick: () => {
|
|
3711
|
-
setOpenSearchResult(true);
|
|
3712
|
-
}, 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(`${column}.typeToSearch`), onChange: (event) => {
|
|
3713
|
-
onSearchChange(event);
|
|
3714
|
-
setOpenSearchResult(true);
|
|
3715
|
-
}, 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(`${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:
|
|
3716
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
3717
|
-
dataList.map((item) => {
|
|
3718
|
-
const selected = isMultiple
|
|
3719
|
-
? watchIds.some((id) => item[column_ref] === id)
|
|
3720
|
-
: watchId === item[column_ref];
|
|
3721
|
-
return (jsxRuntime.jsx(react.Box, { cursor: "pointer", onClick: () => {
|
|
3722
|
-
if (!isMultiple) {
|
|
3723
|
-
setOpenSearchResult(false);
|
|
3724
|
-
setValue(column, item[column_ref]);
|
|
3725
|
-
return;
|
|
3726
|
-
}
|
|
3727
|
-
const newSet = new Set([
|
|
3728
|
-
...(watchIds ?? []),
|
|
3729
|
-
item[column_ref],
|
|
3730
|
-
]);
|
|
3731
|
-
setValue(column, [...newSet]);
|
|
3732
|
-
}, opacity: 0.7, _hover: { opacity: 1 }, ...(selected ? { color: "gray.400/50" } : {}), children: !!renderDisplay === true
|
|
3733
|
-
? renderDisplay(item)
|
|
3734
|
-
: item[display_column] }, item[column_ref]));
|
|
3735
|
-
}) }), isDirty && (jsxRuntime.jsx(jsxRuntime.Fragment, { children: dataList.length <= 0 && (jsxRuntime.jsx(react.Text, { children: translate.t(`${column}.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[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${column}.fieldRequired`) }))] }));
|
|
3736
|
-
};
|
|
3737
|
-
|
|
3738
|
-
const HoverCardContent = React__namespace.forwardRef(function HoverCardContent(props, ref) {
|
|
3739
|
-
const { portalled = true, portalRef, ...rest } = props;
|
|
3740
|
-
return (jsxRuntime.jsx(react.Portal, { disabled: !portalled, container: portalRef, children: jsxRuntime.jsx(react.HoverCard.Positioner, { children: jsxRuntime.jsx(react.HoverCard.Content, { ref: ref, ...rest }) }) }));
|
|
3741
|
-
});
|
|
3742
|
-
const HoverCardArrow = React__namespace.forwardRef(function HoverCardArrow(props, ref) {
|
|
3743
|
-
return (jsxRuntime.jsx(react.HoverCard.Arrow, { ref: ref, ...props, children: jsxRuntime.jsx(react.HoverCard.ArrowTip, {}) }));
|
|
3744
|
-
});
|
|
3745
|
-
const HoverCardRoot = react.HoverCard.Root;
|
|
3746
|
-
const HoverCardTrigger = react.HoverCard.Trigger;
|
|
3747
|
-
|
|
3748
|
-
const IdViewer = ({ value, column }) => {
|
|
3749
|
-
const { schema, idMap, translate } = useSchemaContext();
|
|
3750
|
-
if (schema.properties == undefined) {
|
|
3751
|
-
throw new Error("schema properties when using DatePicker");
|
|
3752
|
-
}
|
|
3753
|
-
const { foreign_key } = schema.properties[column];
|
|
3754
|
-
if (foreign_key === undefined) {
|
|
3755
|
-
throw new Error("foreign_key when variant is id-picker");
|
|
3756
|
-
}
|
|
3757
|
-
const { display_column } = foreign_key;
|
|
3758
|
-
if (value === undefined) {
|
|
3759
|
-
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`) })] }));
|
|
3760
|
-
}
|
|
3761
|
-
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] })] })] })] }));
|
|
3762
|
-
};
|
|
3763
|
-
|
|
3764
|
-
const NumberInputRoot = React__namespace.forwardRef(function NumberInput(props, ref) {
|
|
3765
|
-
const { children, ...rest } = props;
|
|
3766
|
-
return (jsxRuntime.jsxs(react.NumberInput.Root, { ref: ref, variant: "outline", ...rest, children: [children, jsxRuntime.jsxs(react.NumberInput.Control, { children: [jsxRuntime.jsx(react.NumberInput.IncrementTrigger, {}), jsxRuntime.jsx(react.NumberInput.DecrementTrigger, {})] })] }));
|
|
3767
|
-
});
|
|
3768
|
-
const NumberInputField$1 = react.NumberInput.Input;
|
|
3769
|
-
react.NumberInput.Scrubber;
|
|
3770
|
-
react.NumberInput.Label;
|
|
3771
|
-
|
|
3772
|
-
const NumberInputField = ({ column }) => {
|
|
3773
|
-
const { register, formState: { errors }, } = reactHookForm.useFormContext();
|
|
3774
|
-
const { schema, translate } = useSchemaContext();
|
|
3775
|
-
const { required } = schema;
|
|
3776
|
-
const isRequired = required?.some((columnId) => columnId === column);
|
|
3777
|
-
if (schema.properties == undefined) {
|
|
3778
|
-
throw new Error("schema properties when using String Input Field");
|
|
3779
|
-
}
|
|
3780
|
-
const { gridColumn, gridRow } = schema.properties[column];
|
|
3781
|
-
return (jsxRuntime.jsxs(Field, { label: `${translate.t(`${column}.fieldLabel`)}`, required: isRequired, gridColumn, gridRow, children: [jsxRuntime.jsx(NumberInputRoot, { children: jsxRuntime.jsx(NumberInputField$1, { ...register(column, { required: isRequired }) }) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${column}.fieldRequired`) }))] }));
|
|
3782
|
-
};
|
|
3783
|
-
|
|
3784
|
-
const StringInputField = ({ column }) => {
|
|
3785
|
-
const { register, formState: { errors }, } = reactHookForm.useFormContext();
|
|
3786
|
-
const { schema, translate } = useSchemaContext();
|
|
3787
|
-
const { required } = schema;
|
|
3788
|
-
const isRequired = required?.some((columnId) => columnId === column);
|
|
3789
|
-
if (schema.properties == undefined) {
|
|
3790
|
-
throw new Error("schema properties when using String Input Field");
|
|
3791
|
-
}
|
|
3792
|
-
const { gridColumn, gridRow } = schema.properties[column];
|
|
3793
|
-
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs(Field, { label: `${translate.t(`${column}.fieldLabel`)}`, required: isRequired, gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", children: [jsxRuntime.jsx(react.Input, { ...register(column, { required: isRequired }), autoComplete: "off" }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${column}.fieldRequired`) }))] }) }));
|
|
3558
|
+
return React.useContext(SchemaFormContext);
|
|
3794
3559
|
};
|
|
3795
3560
|
|
|
3796
3561
|
const clearEmptyString = (object) => {
|
|
@@ -3807,35 +3572,58 @@ const AccordionItemContent = React__namespace.forwardRef(function AccordionItemC
|
|
|
3807
3572
|
const AccordionRoot = react.Accordion.Root;
|
|
3808
3573
|
const AccordionItem = react.Accordion.Item;
|
|
3809
3574
|
|
|
3810
|
-
|
|
3811
|
-
|
|
3812
|
-
|
|
3813
|
-
|
|
3814
|
-
const
|
|
3815
|
-
const {
|
|
3816
|
-
|
|
3817
|
-
}
|
|
3575
|
+
function removeIndex(str) {
|
|
3576
|
+
return str.replace(/\.\d+\./g, '.');
|
|
3577
|
+
}
|
|
3578
|
+
|
|
3579
|
+
const ArrayRenderer = ({ schema, column, prefix, }) => {
|
|
3580
|
+
const { gridRow, gridColumn = "1/span 12", required, items } = schema;
|
|
3581
|
+
// @ts-expect-error TODO: find suitable types
|
|
3582
|
+
const { type } = items;
|
|
3583
|
+
const { translate } = useSchemaContext();
|
|
3584
|
+
const colLabel = `${prefix}${column}`;
|
|
3585
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
3586
|
+
const { formState: { errors }, setValue, watch, } = reactHookForm.useFormContext();
|
|
3587
|
+
const fields = (watch(colLabel) ?? []);
|
|
3588
|
+
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}`,
|
|
3589
|
+
prefix: `${colLabel}.`,
|
|
3590
|
+
schema: items }) }), jsxRuntime.jsx(react.Flex, { justifyContent: "end", children: jsxRuntime.jsx(react.Button, { variant: "ghost", onClick: () => {
|
|
3591
|
+
setValue(colLabel, fields.filter((_, curIndex) => {
|
|
3592
|
+
return curIndex === index;
|
|
3593
|
+
}));
|
|
3594
|
+
}, children: translate.t(removeIndex(`${colLabel}.remove`)) }) })] }, `${colLabel}.${index}`))), jsxRuntime.jsx(react.Flex, { children: jsxRuntime.jsx(react.Button, { onClick: () => {
|
|
3595
|
+
if (type === "number") {
|
|
3596
|
+
setValue(colLabel, [...fields, 0]);
|
|
3597
|
+
return;
|
|
3598
|
+
}
|
|
3599
|
+
if (type === "string") {
|
|
3600
|
+
setValue(colLabel, [...fields, ""]);
|
|
3601
|
+
return;
|
|
3602
|
+
}
|
|
3603
|
+
if (type === "boolean") {
|
|
3604
|
+
setValue(colLabel, [...fields, false]);
|
|
3605
|
+
return;
|
|
3606
|
+
}
|
|
3607
|
+
setValue(colLabel, [...fields, {}]);
|
|
3608
|
+
}, children: translate.t(removeIndex(`${colLabel}.add`)) }) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
3609
|
+
};
|
|
3818
3610
|
|
|
3819
|
-
const
|
|
3820
|
-
const
|
|
3821
|
-
|
|
3822
|
-
return (jsxRuntime.jsxs(react.DataList.Item, { ref: ref, ...rest, children: [jsxRuntime.jsxs(react.DataList.ItemLabel, { flex: grow ? "1" : undefined, children: [label, info && jsxRuntime.jsx(InfoTip, { children: info })] }), jsxRuntime.jsx(react.DataList.ItemValue, { flex: grow ? "1" : undefined, children: value }), children] }));
|
|
3611
|
+
const Field = React__namespace.forwardRef(function Field(props, ref) {
|
|
3612
|
+
const { label, children, helperText, errorText, optionalText, ...rest } = props;
|
|
3613
|
+
return (jsxRuntime.jsxs(react.Field.Root, { ref: ref, ...rest, children: [label && (jsxRuntime.jsxs(react.Field.Label, { children: [label, jsxRuntime.jsx(react.Field.RequiredIndicator, { fallback: optionalText })] })), children, helperText && (jsxRuntime.jsx(react.Field.HelperText, { children: helperText })), errorText && (jsxRuntime.jsx(react.Field.ErrorText, { children: errorText }))] }));
|
|
3823
3614
|
});
|
|
3824
3615
|
|
|
3825
|
-
const BooleanPicker = ({ column }) => {
|
|
3616
|
+
const BooleanPicker = ({ schema, column, prefix }) => {
|
|
3826
3617
|
const { watch, formState: { errors }, setValue, } = reactHookForm.useFormContext();
|
|
3827
|
-
const {
|
|
3828
|
-
const { required } = schema;
|
|
3618
|
+
const { translate } = useSchemaContext();
|
|
3619
|
+
const { required, gridColumn, gridRow } = schema;
|
|
3829
3620
|
const isRequired = required?.some((columnId) => columnId === column);
|
|
3830
|
-
const
|
|
3831
|
-
|
|
3832
|
-
|
|
3833
|
-
|
|
3834
|
-
|
|
3835
|
-
|
|
3836
|
-
gridRow, children: [jsxRuntime.jsx(CheckboxCard, { checked: value, variant: "surface", onSelect: () => {
|
|
3837
|
-
setValue(column, !value);
|
|
3838
|
-
} }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${column}.fieldRequired`) }))] }));
|
|
3621
|
+
const colLabel = `${prefix}${column}`;
|
|
3622
|
+
const value = watch(colLabel);
|
|
3623
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.fieldLabel`))}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
3624
|
+
gridRow, children: [jsxRuntime.jsx(CheckboxCard, { checked: value, variant: "surface", onChange: () => {
|
|
3625
|
+
setValue(colLabel, !value);
|
|
3626
|
+
} }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
3839
3627
|
};
|
|
3840
3628
|
|
|
3841
3629
|
const monthNamesShort = [
|
|
@@ -3907,18 +3695,33 @@ let DatePicker$1 = class DatePicker extends React.Component {
|
|
|
3907
3695
|
}
|
|
3908
3696
|
};
|
|
3909
3697
|
|
|
3910
|
-
const
|
|
3698
|
+
const PopoverContent = React__namespace.forwardRef(function PopoverContent(props, ref) {
|
|
3699
|
+
const { portalled = true, portalRef, ...rest } = props;
|
|
3700
|
+
return (jsxRuntime.jsx(react.Portal, { disabled: !portalled, container: portalRef, children: jsxRuntime.jsx(react.Popover.Positioner, { children: jsxRuntime.jsx(react.Popover.Content, { ref: ref, ...rest }) }) }));
|
|
3701
|
+
});
|
|
3702
|
+
React__namespace.forwardRef(function PopoverArrow(props, ref) {
|
|
3703
|
+
return (jsxRuntime.jsx(react.Popover.Arrow, { ...props, ref: ref, children: jsxRuntime.jsx(react.Popover.ArrowTip, {}) }));
|
|
3704
|
+
});
|
|
3705
|
+
React__namespace.forwardRef(function PopoverCloseTrigger(props, ref) {
|
|
3706
|
+
return (jsxRuntime.jsx(react.Popover.CloseTrigger, { position: "absolute", top: "1", insetEnd: "1", ...props, asChild: true, ref: ref, children: jsxRuntime.jsx(CloseButton, { size: "sm" }) }));
|
|
3707
|
+
});
|
|
3708
|
+
const PopoverTitle = react.Popover.Title;
|
|
3709
|
+
react.Popover.Description;
|
|
3710
|
+
react.Popover.Footer;
|
|
3711
|
+
react.Popover.Header;
|
|
3712
|
+
const PopoverRoot = react.Popover.Root;
|
|
3713
|
+
const PopoverBody = react.Popover.Body;
|
|
3714
|
+
const PopoverTrigger = react.Popover.Trigger;
|
|
3715
|
+
|
|
3716
|
+
const DatePicker = ({ column, schema, prefix }) => {
|
|
3911
3717
|
const { watch, formState: { errors }, setValue, } = reactHookForm.useFormContext();
|
|
3912
|
-
const {
|
|
3913
|
-
const { required } = schema;
|
|
3718
|
+
const { translate } = useSchemaContext();
|
|
3719
|
+
const { required, gridColumn, gridRow } = schema;
|
|
3914
3720
|
const isRequired = required?.some((columnId) => columnId === column);
|
|
3721
|
+
const colLabel = `${prefix}${column}`;
|
|
3915
3722
|
const [open, setOpen] = React.useState(false);
|
|
3916
|
-
const selectedDate = watch(
|
|
3917
|
-
|
|
3918
|
-
throw new Error("schema properties when using DatePicker");
|
|
3919
|
-
}
|
|
3920
|
-
const { gridColumn, gridRow } = schema.properties[column];
|
|
3921
|
-
return (jsxRuntime.jsxs(Field, { label: `${translate.t(`${column}.fieldLabel`)}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
3723
|
+
const selectedDate = watch(colLabel);
|
|
3724
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.fieldLabel`))}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
3922
3725
|
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: () => {
|
|
3923
3726
|
setOpen(true);
|
|
3924
3727
|
}, children: selectedDate !== undefined ? selectedDate : "" }) }), jsxRuntime.jsx(PopoverContent, { children: jsxRuntime.jsxs(PopoverBody, { children: [jsxRuntime.jsx(PopoverTitle, {}), jsxRuntime.jsx(DatePicker$1
|
|
@@ -3927,10 +3730,10 @@ const DatePicker = ({ column }) => {
|
|
|
3927
3730
|
// @ts-expect-error TODO: find appropriate types
|
|
3928
3731
|
selected: new Date(selectedDate),
|
|
3929
3732
|
// @ts-expect-error TODO: find appropriate types
|
|
3930
|
-
onDateSelected: ({
|
|
3931
|
-
setValue(
|
|
3733
|
+
onDateSelected: ({ date }) => {
|
|
3734
|
+
setValue(colLabel, dayjs(date).format("YYYY-MM-DD"));
|
|
3932
3735
|
setOpen(false);
|
|
3933
|
-
} })] }) })] }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${
|
|
3736
|
+
} })] }) })] }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
3934
3737
|
};
|
|
3935
3738
|
|
|
3936
3739
|
function filterArray(array, searchTerm) {
|
|
@@ -3943,30 +3746,27 @@ function filterArray(array, searchTerm) {
|
|
|
3943
3746
|
});
|
|
3944
3747
|
}
|
|
3945
3748
|
|
|
3946
|
-
const EnumPicker = ({ column, isMultiple = false }) => {
|
|
3749
|
+
const EnumPicker = ({ column, isMultiple = false, schema, prefix, }) => {
|
|
3947
3750
|
const { watch, formState: { errors }, setValue, } = reactHookForm.useFormContext();
|
|
3948
|
-
const {
|
|
3751
|
+
const { translate } = useSchemaContext();
|
|
3949
3752
|
const { required } = schema;
|
|
3950
3753
|
const isRequired = required?.some((columnId) => columnId === column);
|
|
3951
|
-
|
|
3952
|
-
throw new Error("schema properties when using DatePicker");
|
|
3953
|
-
}
|
|
3954
|
-
const { gridColumn, gridRow, renderDisplay } = schema.properties[column];
|
|
3754
|
+
const { gridColumn, gridRow, renderDisplay } = schema;
|
|
3955
3755
|
const [searchText, setSearchText] = React.useState();
|
|
3956
3756
|
const [limit, setLimit] = React.useState(10);
|
|
3957
3757
|
const [openSearchResult, setOpenSearchResult] = React.useState();
|
|
3958
3758
|
const ref = React.useRef(null);
|
|
3959
|
-
const
|
|
3960
|
-
const
|
|
3961
|
-
const
|
|
3962
|
-
const dataList =
|
|
3963
|
-
const count =
|
|
3759
|
+
const colLabel = `${prefix}${column}`;
|
|
3760
|
+
const watchEnum = watch(colLabel);
|
|
3761
|
+
const watchEnums = (watch(colLabel) ?? []);
|
|
3762
|
+
const dataList = schema.enum ?? [];
|
|
3763
|
+
const count = schema.enum?.length ?? 0;
|
|
3964
3764
|
const isDirty = (searchText?.length ?? 0) > 0;
|
|
3965
3765
|
const onSearchChange = async (event) => {
|
|
3966
3766
|
setSearchText(event.target.value);
|
|
3967
3767
|
setLimit(10);
|
|
3968
3768
|
};
|
|
3969
|
-
return (jsxRuntime.jsxs(Field, { label: `${translate.t(`${column}.fieldLabel`)}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
3769
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${column}.fieldLabel`))}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
3970
3770
|
gridRow, children: [isMultiple && (jsxRuntime.jsxs(react.Flex, { flexFlow: "wrap", gap: 1, children: [watchEnums.map((enumValue) => {
|
|
3971
3771
|
const item = enumValue;
|
|
3972
3772
|
if (item === undefined) {
|
|
@@ -3975,12 +3775,16 @@ const EnumPicker = ({ column, isMultiple = false }) => {
|
|
|
3975
3775
|
return (jsxRuntime.jsx(Tag, { closable: true, onClick: () => {
|
|
3976
3776
|
// setSelectedEnums((state) => state.filter((id) => id != item));
|
|
3977
3777
|
setValue(column, watchEnums.filter((id) => id != item));
|
|
3978
|
-
}, children: !!renderDisplay === true
|
|
3778
|
+
}, children: !!renderDisplay === true
|
|
3779
|
+
? renderDisplay(item)
|
|
3780
|
+
: translate.t(removeIndex(`${colLabel}.${item}`)) }));
|
|
3979
3781
|
}), jsxRuntime.jsx(Tag, { cursor: "pointer", onClick: () => {
|
|
3980
3782
|
setOpenSearchResult(true);
|
|
3981
|
-
}, children:
|
|
3783
|
+
}, children: translate.t(removeIndex(`${colLabel}.addMore`)) })] })), !isMultiple && (jsxRuntime.jsx(Button, { variant: "outline", onClick: () => {
|
|
3982
3784
|
setOpenSearchResult(true);
|
|
3983
|
-
}, children: watchEnum
|
|
3785
|
+
}, children: watchEnum === undefined
|
|
3786
|
+
? ""
|
|
3787
|
+
: 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) => {
|
|
3984
3788
|
onSearchChange(event);
|
|
3985
3789
|
setOpenSearchResult(true);
|
|
3986
3790
|
}, 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) => {
|
|
@@ -3990,13 +3794,15 @@ const EnumPicker = ({ column, isMultiple = false }) => {
|
|
|
3990
3794
|
return (jsxRuntime.jsx(react.Box, { cursor: "pointer", onClick: () => {
|
|
3991
3795
|
if (!isMultiple) {
|
|
3992
3796
|
setOpenSearchResult(false);
|
|
3993
|
-
setValue(
|
|
3797
|
+
setValue(colLabel, item);
|
|
3994
3798
|
return;
|
|
3995
3799
|
}
|
|
3996
3800
|
const newSet = new Set([...(watchEnums ?? []), item]);
|
|
3997
|
-
setValue(
|
|
3998
|
-
}, ...(selected ? { color: "gray.400/50" } : {}), children: !!renderDisplay === true
|
|
3999
|
-
|
|
3801
|
+
setValue(colLabel, [...newSet]);
|
|
3802
|
+
}, ...(selected ? { color: "gray.400/50" } : {}), children: !!renderDisplay === true
|
|
3803
|
+
? renderDisplay(item)
|
|
3804
|
+
: translate.t(removeIndex(`${colLabel}.${item}`)) }, `${colLabel}-${item}`));
|
|
3805
|
+
}) }), 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`)) }))] }));
|
|
4000
3806
|
};
|
|
4001
3807
|
|
|
4002
3808
|
function isEnteringWindow(_ref) {
|
|
@@ -4351,41 +4157,222 @@ const FileDropzone = ({ children = undefined, gridProps = {}, onDrop = () => { }
|
|
|
4351
4157
|
return (jsxRuntime.jsxs(react.Grid, { ...getColor(isDraggedOver), ref: ref, cursor: "pointer", onClick: handleClick, borderStyle: "dashed", borderColor: "gray.400", alignContent: "center", justifyContent: "center", borderWidth: 1, borderRadius: 4, ...gridProps, children: [children, !!children === false && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(react.Flex, { children: placeholder }), jsxRuntime.jsx(react.Input, { type: "file", multiple: true, style: { display: "none" }, ref: fileInput, onChange: handleChange })] }))] }));
|
|
4352
4158
|
};
|
|
4353
4159
|
|
|
4354
|
-
const FilePicker = ({ column }) => {
|
|
4160
|
+
const FilePicker = ({ column, schema, prefix }) => {
|
|
4355
4161
|
const { setValue, formState: { errors }, watch, } = reactHookForm.useFormContext();
|
|
4356
|
-
const {
|
|
4357
|
-
const { required } = schema;
|
|
4162
|
+
const { translate } = useSchemaContext();
|
|
4163
|
+
const { required, gridColumn, gridRow } = schema;
|
|
4358
4164
|
const isRequired = required?.some((columnId) => columnId === column);
|
|
4359
|
-
if (schema.properties == undefined) {
|
|
4360
|
-
throw new Error("schema properties when using String Input Field");
|
|
4361
|
-
}
|
|
4362
|
-
const { gridColumn, gridRow } = schema.properties[column];
|
|
4363
4165
|
const currentFiles = (watch(column) ?? []);
|
|
4364
|
-
|
|
4166
|
+
const colLabel = `${prefix}${column}`;
|
|
4167
|
+
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 }) => {
|
|
4365
4168
|
const newFiles = files.filter(({ name }) => !currentFiles.some((cur) => cur.name === name));
|
|
4366
|
-
setValue(
|
|
4367
|
-
}, placeholder: translate.t(`${
|
|
4169
|
+
setValue(colLabel, [...currentFiles, ...newFiles]);
|
|
4170
|
+
}, placeholder: translate.t(removeIndex(`${colLabel}.fileDropzone`)) }), jsxRuntime.jsx(react.Flex, { flexFlow: "column", gap: 1, children: currentFiles.map((file) => {
|
|
4368
4171
|
return (jsxRuntime.jsx(react.Card.Root, { variant: "subtle", children: jsxRuntime.jsxs(react.Card.Body, { gap: "2", cursor: "pointer", onClick: () => {
|
|
4369
4172
|
setValue(column, currentFiles.filter(({ name }) => {
|
|
4370
4173
|
return name !== file.name;
|
|
4371
4174
|
}));
|
|
4372
|
-
}, display: "flex", flexFlow:
|
|
4373
|
-
}) }), errors[`${
|
|
4175
|
+
}, display: "flex", flexFlow: "row", alignItems: "center", padding: "2", children: [jsxRuntime.jsx(react.Box, { children: file.name }), jsxRuntime.jsx(ti.TiDeleteOutline, {})] }) }, file.name));
|
|
4176
|
+
}) }), errors[`${colLabel}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
4374
4177
|
};
|
|
4375
4178
|
|
|
4376
|
-
const
|
|
4377
|
-
|
|
4378
|
-
|
|
4379
|
-
|
|
4380
|
-
|
|
4381
|
-
|
|
4179
|
+
const getTableData = async ({ serverUrl, in_table, searching = "", where = [], limit = 10, offset = 0, }) => {
|
|
4180
|
+
if (serverUrl === undefined || serverUrl.length == 0) {
|
|
4181
|
+
throw new Error("The serverUrl is missing");
|
|
4182
|
+
}
|
|
4183
|
+
if (in_table === undefined || in_table.length == 0) {
|
|
4184
|
+
throw new Error("The in_table is missing");
|
|
4185
|
+
}
|
|
4186
|
+
const options = {
|
|
4187
|
+
method: "GET",
|
|
4188
|
+
url: `${serverUrl}/api/g/${in_table}`,
|
|
4189
|
+
params: {
|
|
4190
|
+
searching,
|
|
4191
|
+
where,
|
|
4192
|
+
limit,
|
|
4193
|
+
offset
|
|
4194
|
+
},
|
|
4195
|
+
};
|
|
4196
|
+
try {
|
|
4197
|
+
const { data } = await axios.request(options);
|
|
4198
|
+
console.log(data);
|
|
4199
|
+
return data;
|
|
4200
|
+
}
|
|
4201
|
+
catch (error) {
|
|
4202
|
+
console.error(error);
|
|
4203
|
+
throw error;
|
|
4204
|
+
}
|
|
4205
|
+
};
|
|
4206
|
+
|
|
4207
|
+
const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
4208
|
+
const { watch, formState: { errors }, setValue, } = reactHookForm.useFormContext();
|
|
4209
|
+
const { serverUrl, idMap, setIdMap, translate } = useSchemaContext();
|
|
4210
|
+
const { required, gridColumn, gridRow, renderDisplay, foreign_key } = schema;
|
|
4211
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4212
|
+
const { table, column: column_ref, display_column, } = foreign_key;
|
|
4213
|
+
const [searchText, setSearchText] = React.useState();
|
|
4214
|
+
const [limit, setLimit] = React.useState(10);
|
|
4215
|
+
const [openSearchResult, setOpenSearchResult] = React.useState();
|
|
4216
|
+
const [page, setPage] = React.useState(0);
|
|
4217
|
+
const ref = React.useRef(null);
|
|
4218
|
+
const colLabel = `${prefix}${column}`;
|
|
4219
|
+
const query = reactQuery.useQuery({
|
|
4220
|
+
queryKey: [`idpicker`, { column, searchText, limit, page }],
|
|
4221
|
+
queryFn: async () => {
|
|
4222
|
+
const data = await getTableData({
|
|
4223
|
+
serverUrl,
|
|
4224
|
+
searching: searchText ?? "",
|
|
4225
|
+
in_table: table,
|
|
4226
|
+
limit: limit,
|
|
4227
|
+
offset: page * 10,
|
|
4228
|
+
});
|
|
4229
|
+
const newMap = Object.fromEntries((data ?? { data: [] }).data.map((item) => {
|
|
4230
|
+
return [
|
|
4231
|
+
item[column_ref],
|
|
4232
|
+
{
|
|
4233
|
+
...item,
|
|
4234
|
+
},
|
|
4235
|
+
];
|
|
4236
|
+
}));
|
|
4237
|
+
setIdMap((state) => {
|
|
4238
|
+
return { ...state, ...newMap };
|
|
4239
|
+
});
|
|
4240
|
+
return data;
|
|
4241
|
+
},
|
|
4242
|
+
enabled: (searchText ?? "")?.length > 0,
|
|
4243
|
+
staleTime: 300000,
|
|
4244
|
+
});
|
|
4245
|
+
const { isLoading, isFetching, data, isPending, isError } = query;
|
|
4246
|
+
const dataList = data?.data ?? [];
|
|
4247
|
+
const count = data?.count ?? 0;
|
|
4248
|
+
const isDirty = (searchText?.length ?? 0) > 0;
|
|
4249
|
+
const watchId = watch(colLabel);
|
|
4250
|
+
const watchIds = (watch(colLabel) ?? []);
|
|
4251
|
+
reactQuery.useQuery({
|
|
4252
|
+
queryKey: [`idpicker`, { column, searchText, limit, page }],
|
|
4253
|
+
queryFn: async () => {
|
|
4254
|
+
const data = await getTableData({
|
|
4255
|
+
serverUrl,
|
|
4256
|
+
searching: watchId,
|
|
4257
|
+
in_table: table,
|
|
4258
|
+
limit: limit,
|
|
4259
|
+
offset: page * 10,
|
|
4260
|
+
});
|
|
4261
|
+
const newMap = Object.fromEntries((data ?? { data: [] }).data.map((item) => {
|
|
4262
|
+
return [
|
|
4263
|
+
item[column_ref],
|
|
4264
|
+
{
|
|
4265
|
+
...item,
|
|
4266
|
+
},
|
|
4267
|
+
];
|
|
4268
|
+
}));
|
|
4269
|
+
setIdMap((state) => {
|
|
4270
|
+
return { ...state, ...newMap };
|
|
4271
|
+
});
|
|
4272
|
+
return data;
|
|
4273
|
+
},
|
|
4274
|
+
staleTime: 300000,
|
|
4275
|
+
});
|
|
4276
|
+
const onSearchChange = async (event) => {
|
|
4277
|
+
setSearchText(event.target.value);
|
|
4278
|
+
setPage(0);
|
|
4279
|
+
setLimit(10);
|
|
4280
|
+
};
|
|
4281
|
+
const getPickedValue = () => {
|
|
4282
|
+
if (Object.keys(idMap).length <= 0) {
|
|
4283
|
+
return "";
|
|
4284
|
+
}
|
|
4285
|
+
const record = idMap[watchId];
|
|
4286
|
+
if (record === undefined) {
|
|
4287
|
+
return "";
|
|
4288
|
+
}
|
|
4289
|
+
return record[display_column];
|
|
4290
|
+
};
|
|
4291
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(removeIndex(`${column}.fieldLabel`)))}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
4292
|
+
gridRow, children: [isMultiple && (jsxRuntime.jsxs(react.Flex, { flexFlow: "wrap", gap: 1, children: [watchIds.map((id) => {
|
|
4293
|
+
const item = idMap[id];
|
|
4294
|
+
if (item === undefined) {
|
|
4295
|
+
return (jsxRuntime.jsx(react.Text, { children: translate.t(removeIndex(`${colLabel}.undefined`)) }, id));
|
|
4296
|
+
}
|
|
4297
|
+
return (jsxRuntime.jsx(Tag, { closable: true, onClick: () => {
|
|
4298
|
+
setValue(column, watchIds.filter((id) => id != item[column_ref]));
|
|
4299
|
+
}, children: !!renderDisplay === true
|
|
4300
|
+
? renderDisplay(item)
|
|
4301
|
+
: item[display_column] }, id));
|
|
4302
|
+
}), jsxRuntime.jsx(Tag, { cursor: "pointer", onClick: () => {
|
|
4303
|
+
setOpenSearchResult(true);
|
|
4304
|
+
}, children: translate.t(removeIndex(`${colLabel}.addMore`)) })] })), !isMultiple && (jsxRuntime.jsx(Button, { variant: "outline", onClick: () => {
|
|
4305
|
+
setOpenSearchResult(true);
|
|
4306
|
+
}, 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) => {
|
|
4307
|
+
onSearchChange(event);
|
|
4308
|
+
setOpenSearchResult(true);
|
|
4309
|
+
}, 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" }), (isFetching || isLoading || isPending) && jsxRuntime.jsx(react.Spinner, {}), isError && (jsxRuntime.jsx(react.Icon, { color: "red.400", children: jsxRuntime.jsx(bi.BiError, {}) })), 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:
|
|
4310
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
4311
|
+
dataList.map((item) => {
|
|
4312
|
+
const selected = isMultiple
|
|
4313
|
+
? watchIds.some((id) => item[column_ref] === id)
|
|
4314
|
+
: watchId === item[column_ref];
|
|
4315
|
+
return (jsxRuntime.jsx(react.Box, { cursor: "pointer", onClick: () => {
|
|
4316
|
+
if (!isMultiple) {
|
|
4317
|
+
setOpenSearchResult(false);
|
|
4318
|
+
setValue(colLabel, item[column_ref]);
|
|
4319
|
+
return;
|
|
4320
|
+
}
|
|
4321
|
+
const newSet = new Set([
|
|
4322
|
+
...(watchIds ?? []),
|
|
4323
|
+
item[column_ref],
|
|
4324
|
+
]);
|
|
4325
|
+
setValue(colLabel, [...newSet]);
|
|
4326
|
+
}, opacity: 0.7, _hover: { opacity: 1 }, ...(selected ? { color: "gray.400/50" } : {}), children: !!renderDisplay === true
|
|
4327
|
+
? renderDisplay(item)
|
|
4328
|
+
: item[display_column] }, item[column_ref]));
|
|
4329
|
+
}) }), 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: count, pageSize: 10, defaultPage: 1, page: page + 1, onPageChange: (e) => setPage(e.page - 1), children: jsxRuntime.jsxs(react.HStack, { gap: "4", children: [jsxRuntime.jsx(PaginationPrevTrigger, {}), count > 0 && jsxRuntime.jsx(PaginationPageText, {}), jsxRuntime.jsx(PaginationNextTrigger, {})] }) })] }))] }) })] }), errors[`${colLabel}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
4330
|
+
};
|
|
4331
|
+
|
|
4332
|
+
const NumberInputRoot = React__namespace.forwardRef(function NumberInput(props, ref) {
|
|
4333
|
+
const { children, ...rest } = props;
|
|
4334
|
+
return (jsxRuntime.jsxs(react.NumberInput.Root, { ref: ref, variant: "outline", ...rest, children: [children, jsxRuntime.jsxs(react.NumberInput.Control, { children: [jsxRuntime.jsx(react.NumberInput.IncrementTrigger, {}), jsxRuntime.jsx(react.NumberInput.DecrementTrigger, {})] })] }));
|
|
4335
|
+
});
|
|
4336
|
+
const NumberInputField$1 = react.NumberInput.Input;
|
|
4337
|
+
react.NumberInput.Scrubber;
|
|
4338
|
+
react.NumberInput.Label;
|
|
4339
|
+
|
|
4340
|
+
const NumberInputField = ({ schema, column, prefix, }) => {
|
|
4341
|
+
const { register, formState: { errors }, watch } = reactHookForm.useFormContext();
|
|
4342
|
+
const { translate } = useSchemaContext();
|
|
4343
|
+
const { required, gridColumn, gridRow } = schema;
|
|
4344
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4345
|
+
const colLabel = `${prefix}${column}`;
|
|
4346
|
+
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`)) }))] }));
|
|
4347
|
+
};
|
|
4348
|
+
|
|
4349
|
+
const ObjectInput = ({ schema, column, prefix }) => {
|
|
4350
|
+
const { properties, gridRow, gridColumn = "1/span 12", required } = schema;
|
|
4351
|
+
const { translate } = useSchemaContext();
|
|
4352
|
+
const colLabel = `${prefix}${column}`;
|
|
4353
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4354
|
+
const { formState: { errors }, } = reactHookForm.useFormContext();
|
|
4355
|
+
if (properties === undefined) {
|
|
4356
|
+
throw new Error(`properties is undefined when using ObjectInput`);
|
|
4357
|
+
}
|
|
4358
|
+
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) => {
|
|
4359
|
+
return (
|
|
4360
|
+
// @ts-expect-error find suitable types
|
|
4361
|
+
jsxRuntime.jsx(ColumnRenderer, { column: `${key}`,
|
|
4362
|
+
prefix: `${prefix}${column}.`,
|
|
4363
|
+
properties }, `form-${colLabel}-${key}`));
|
|
4364
|
+
}) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
4365
|
+
};
|
|
4366
|
+
|
|
4367
|
+
const RecordInput$1 = ({ column, schema, prefix }) => {
|
|
4368
|
+
const { formState: { errors }, setValue, getValues, } = reactHookForm.useFormContext();
|
|
4369
|
+
const { translate } = useSchemaContext();
|
|
4370
|
+
const { required, gridColumn, gridRow } = schema;
|
|
4371
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4372
|
+
const entries = Object.entries(getValues(column) ?? {});
|
|
4382
4373
|
const [showNewEntries, setShowNewEntries] = React.useState(false);
|
|
4383
4374
|
const [newKey, setNewKey] = React.useState();
|
|
4384
4375
|
const [newValue, setNewValue] = React.useState();
|
|
4385
|
-
if (schema.properties == undefined) {
|
|
4386
|
-
throw new Error("schema properties when using DatePicker");
|
|
4387
|
-
}
|
|
4388
|
-
const { gridColumn, gridRow } = schema.properties[column];
|
|
4389
4376
|
return (jsxRuntime.jsxs(Field, { label: `${translate.t(`${column}.fieldLabel`)}`, required: isRequired, alignItems: "stretch", gridColumn, gridRow, children: [entries.map(([key, value]) => {
|
|
4390
4377
|
return (jsxRuntime.jsxs(react.Grid, { templateColumns: "1fr 1fr auto", gap: 1, children: [jsxRuntime.jsx(react.Input, { value: key, onChange: (e) => {
|
|
4391
4378
|
const filtered = entries.filter(([target]) => {
|
|
@@ -4429,6 +4416,15 @@ const ObjectInput = ({ column }) => {
|
|
|
4429
4416
|
}, children: translate.t(`${column}.addNew`) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${column}.fieldRequired`) }))] }));
|
|
4430
4417
|
};
|
|
4431
4418
|
|
|
4419
|
+
const StringInputField = ({ column, schema, prefix, }) => {
|
|
4420
|
+
const { register, formState: { errors }, } = reactHookForm.useFormContext();
|
|
4421
|
+
const { translate } = useSchemaContext();
|
|
4422
|
+
const { required, gridColumn, gridRow } = schema;
|
|
4423
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4424
|
+
const colLabel = `${prefix}${column}`;
|
|
4425
|
+
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`)) }))] }) }));
|
|
4426
|
+
};
|
|
4427
|
+
|
|
4432
4428
|
const RadioCardItem = React__namespace.forwardRef(function RadioCardItem(props, ref) {
|
|
4433
4429
|
const { inputProps, label, description, addon, icon, indicator = jsxRuntime.jsx(react.RadioCard.ItemIndicator, {}), indicatorPlacement = "end", ...rest } = props;
|
|
4434
4430
|
const hasContent = label || description || icon;
|
|
@@ -4439,13 +4435,344 @@ const RadioCardRoot = react.RadioCard.Root;
|
|
|
4439
4435
|
react.RadioCard.Label;
|
|
4440
4436
|
react.RadioCard.ItemIndicator;
|
|
4441
4437
|
|
|
4442
|
-
const TagPicker = ({ column }) => {
|
|
4438
|
+
const TagPicker = ({ column, schema, prefix }) => {
|
|
4439
|
+
const { watch, formState: { errors }, setValue, } = reactHookForm.useFormContext();
|
|
4440
|
+
const { serverUrl } = useSchemaContext();
|
|
4441
|
+
if (schema.properties == undefined) {
|
|
4442
|
+
throw new Error("schema properties undefined when using DatePicker");
|
|
4443
|
+
}
|
|
4444
|
+
const { gridColumn, gridRow, in_table, object_id_column } = schema;
|
|
4445
|
+
if (in_table === undefined) {
|
|
4446
|
+
throw new Error("in_table is undefined when using TagPicker");
|
|
4447
|
+
}
|
|
4448
|
+
if (object_id_column === undefined) {
|
|
4449
|
+
throw new Error("object_id_column is undefined when using TagPicker");
|
|
4450
|
+
}
|
|
4451
|
+
const query = reactQuery.useQuery({
|
|
4452
|
+
queryKey: [`tagpicker`, in_table],
|
|
4453
|
+
queryFn: async () => {
|
|
4454
|
+
return await getTableData({
|
|
4455
|
+
serverUrl,
|
|
4456
|
+
in_table: "tables_tags_view",
|
|
4457
|
+
where: [
|
|
4458
|
+
{
|
|
4459
|
+
id: "table_name",
|
|
4460
|
+
value: [in_table],
|
|
4461
|
+
},
|
|
4462
|
+
],
|
|
4463
|
+
limit: 100,
|
|
4464
|
+
});
|
|
4465
|
+
},
|
|
4466
|
+
staleTime: 10000,
|
|
4467
|
+
});
|
|
4468
|
+
const object_id = watch(object_id_column);
|
|
4469
|
+
const existingTagsQuery = reactQuery.useQuery({
|
|
4470
|
+
queryKey: [`existing`, { in_table, object_id_column }, object_id],
|
|
4471
|
+
queryFn: async () => {
|
|
4472
|
+
return await getTableData({
|
|
4473
|
+
serverUrl,
|
|
4474
|
+
in_table: in_table,
|
|
4475
|
+
where: [
|
|
4476
|
+
{
|
|
4477
|
+
id: object_id_column,
|
|
4478
|
+
value: object_id[0],
|
|
4479
|
+
},
|
|
4480
|
+
],
|
|
4481
|
+
limit: 100,
|
|
4482
|
+
});
|
|
4483
|
+
},
|
|
4484
|
+
enabled: object_id != undefined,
|
|
4485
|
+
staleTime: 10000,
|
|
4486
|
+
});
|
|
4487
|
+
const { isLoading, isFetching, data, isPending, isError } = query;
|
|
4488
|
+
const dataList = data?.data ?? [];
|
|
4489
|
+
const existingTagList = existingTagsQuery.data?.data ?? [];
|
|
4490
|
+
if (!!object_id === false) {
|
|
4491
|
+
return jsxRuntime.jsx(jsxRuntime.Fragment, {});
|
|
4492
|
+
}
|
|
4493
|
+
return (jsxRuntime.jsxs(react.Flex, { flexFlow: "column", gap: 4, gridColumn,
|
|
4494
|
+
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 }) => {
|
|
4495
|
+
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) => {
|
|
4496
|
+
const existedTags = Object.values(all_tags)
|
|
4497
|
+
.filter(({ id }) => {
|
|
4498
|
+
return existingTagList.some(({ tag_id }) => tag_id === id);
|
|
4499
|
+
})
|
|
4500
|
+
.map(({ id }) => {
|
|
4501
|
+
return id;
|
|
4502
|
+
});
|
|
4503
|
+
setValue(`${column}.${parent_tag_name}.current`, [
|
|
4504
|
+
tagIds.value,
|
|
4505
|
+
]);
|
|
4506
|
+
setValue(`${column}.${parent_tag_name}.old`, existedTags);
|
|
4507
|
+
}, children: jsxRuntime.jsx(react.Flex, { flexFlow: "wrap", gap: 2, children: Object.entries(all_tags).map(([tagName, { id }]) => {
|
|
4508
|
+
if (existingTagList.some(({ tag_id }) => tag_id === id)) {
|
|
4509
|
+
return (jsxRuntime.jsx(RadioCardItem, { label: tagName, value: id, flex: "0 0 0%", disabled: true }, `${tagName}-${id}`));
|
|
4510
|
+
}
|
|
4511
|
+
return (jsxRuntime.jsx(RadioCardItem, { label: tagName, value: id, flex: "0 0 0%", colorPalette: "blue" }, `${tagName}-${id}`));
|
|
4512
|
+
}) }) })), !is_mutually_exclusive && (jsxRuntime.jsx(react.CheckboxGroup, { onValueChange: (tagIds) => {
|
|
4513
|
+
setValue(`${column}.${parent_tag_name}.current`, tagIds);
|
|
4514
|
+
}, children: jsxRuntime.jsx(react.Flex, { flexFlow: "wrap", gap: 2, children: Object.entries(all_tags).map(([tagName, { id }]) => {
|
|
4515
|
+
if (existingTagList.some(({ tag_id }) => tag_id === id)) {
|
|
4516
|
+
return (jsxRuntime.jsx(CheckboxCard, { label: tagName, value: id, flex: "0 0 0%", disabled: true, colorPalette: "blue" }, `${tagName}-${id}`));
|
|
4517
|
+
}
|
|
4518
|
+
return (jsxRuntime.jsx(CheckboxCard, { label: tagName, value: id, flex: "0 0 0%" }, `${tagName}-${id}`));
|
|
4519
|
+
}) }) }))] }, `tag-${parent_tag_name}`));
|
|
4520
|
+
}), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: (errors[`${column}`]?.message ?? "No error message") }))] }));
|
|
4521
|
+
};
|
|
4522
|
+
|
|
4523
|
+
const SchemaRenderer = ({ schema, prefix, column, }) => {
|
|
4524
|
+
const colSchema = schema;
|
|
4525
|
+
const { type, variant, properties: innerProperties, foreign_key, items, } = schema;
|
|
4526
|
+
if (type === "string") {
|
|
4527
|
+
if ((schema.enum ?? []).length > 0) {
|
|
4528
|
+
return jsxRuntime.jsx(EnumPicker, { schema: colSchema, prefix, column });
|
|
4529
|
+
}
|
|
4530
|
+
if (variant === "id-picker") {
|
|
4531
|
+
idPickerSanityCheck(column, foreign_key);
|
|
4532
|
+
return jsxRuntime.jsx(IdPicker, { schema: colSchema, prefix, column });
|
|
4533
|
+
}
|
|
4534
|
+
if (variant === "date-picker") {
|
|
4535
|
+
return jsxRuntime.jsx(DatePicker, { schema: colSchema, prefix, column });
|
|
4536
|
+
}
|
|
4537
|
+
return jsxRuntime.jsx(StringInputField, { schema: colSchema, prefix, column });
|
|
4538
|
+
}
|
|
4539
|
+
if (type === "number" || type === "integer") {
|
|
4540
|
+
return jsxRuntime.jsx(NumberInputField, { schema: colSchema, prefix, column });
|
|
4541
|
+
}
|
|
4542
|
+
if (type === "boolean") {
|
|
4543
|
+
return jsxRuntime.jsx(BooleanPicker, { schema: colSchema, prefix, column });
|
|
4544
|
+
}
|
|
4545
|
+
if (type === "object") {
|
|
4546
|
+
if (innerProperties) {
|
|
4547
|
+
return jsxRuntime.jsx(ObjectInput, { schema: colSchema, prefix, column });
|
|
4548
|
+
}
|
|
4549
|
+
return jsxRuntime.jsx(RecordInput$1, { schema: colSchema, prefix, column });
|
|
4550
|
+
}
|
|
4551
|
+
if (type === "array") {
|
|
4552
|
+
if (variant === "id-picker") {
|
|
4553
|
+
idPickerSanityCheck(column, foreign_key);
|
|
4554
|
+
return (jsxRuntime.jsx(IdPicker, { schema: colSchema, prefix, column, isMultiple: true }));
|
|
4555
|
+
}
|
|
4556
|
+
if (variant === "tag-picker") {
|
|
4557
|
+
return jsxRuntime.jsx(TagPicker, { schema: colSchema, prefix, column });
|
|
4558
|
+
}
|
|
4559
|
+
if (variant === "file-picker") {
|
|
4560
|
+
return jsxRuntime.jsx(FilePicker, { schema: colSchema, prefix, column });
|
|
4561
|
+
}
|
|
4562
|
+
if (items) {
|
|
4563
|
+
return jsxRuntime.jsx(ArrayRenderer, { schema: colSchema, prefix, column });
|
|
4564
|
+
}
|
|
4565
|
+
return jsxRuntime.jsx(react.Text, { children: `array ${column}` });
|
|
4566
|
+
}
|
|
4567
|
+
if (type === "null") {
|
|
4568
|
+
return jsxRuntime.jsx(react.Text, { children: `null ${column}` });
|
|
4569
|
+
}
|
|
4570
|
+
return jsxRuntime.jsx(react.Text, { children: "missing type" });
|
|
4571
|
+
};
|
|
4572
|
+
|
|
4573
|
+
const ColumnRenderer = ({ column, properties, prefix, }) => {
|
|
4574
|
+
const colSchema = properties[column];
|
|
4575
|
+
const colLabel = `${prefix}${column}`;
|
|
4576
|
+
if (colSchema === undefined) {
|
|
4577
|
+
throw new Error(`${colLabel} does not exist when using ColumnRenderer`);
|
|
4578
|
+
}
|
|
4579
|
+
return jsxRuntime.jsx(SchemaRenderer, { schema: colSchema, prefix, column });
|
|
4580
|
+
};
|
|
4581
|
+
|
|
4582
|
+
const ArrayViewer = ({ schema, column, prefix }) => {
|
|
4583
|
+
const { gridRow, gridColumn = "1/span 12", required, items } = schema;
|
|
4584
|
+
const { translate } = useSchemaContext();
|
|
4585
|
+
const colLabel = `${prefix}${column}`;
|
|
4586
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4587
|
+
const { watch, formState: { errors }, } = reactHookForm.useFormContext();
|
|
4588
|
+
const values = watch(colLabel) ?? [];
|
|
4589
|
+
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}`,
|
|
4590
|
+
prefix: `${colLabel}.`,
|
|
4591
|
+
schema: items }) }) }, `form-${prefix}${column}.${index}`))), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
4592
|
+
};
|
|
4593
|
+
|
|
4594
|
+
const BooleanViewer = ({ schema, column, 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 value = watch(colLabel);
|
|
4601
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.fieldLabel`))}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
4602
|
+
gridRow, children: [jsxRuntime.jsx(react.Text, { children: value
|
|
4603
|
+
? translate.t(removeIndex(`${colLabel}.true`))
|
|
4604
|
+
: translate.t(removeIndex(`${colLabel}.false`)) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
4605
|
+
};
|
|
4606
|
+
|
|
4607
|
+
const DateViewer = ({ column, schema, prefix }) => {
|
|
4608
|
+
const { watch, formState: { errors }, } = reactHookForm.useFormContext();
|
|
4609
|
+
const { translate } = useSchemaContext();
|
|
4610
|
+
const { required, gridColumn, gridRow } = schema;
|
|
4611
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4612
|
+
const colLabel = `${prefix}${column}`;
|
|
4613
|
+
const selectedDate = watch(colLabel);
|
|
4614
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${column}.fieldLabel`))}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
4615
|
+
gridRow, children: [jsxRuntime.jsxs(react.Text, { children: [" ", selectedDate !== undefined ? selectedDate : ""] }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${column}.fieldRequired`) }))] }));
|
|
4616
|
+
};
|
|
4617
|
+
|
|
4618
|
+
const EnumViewer = ({ column, isMultiple = false, schema, prefix, }) => {
|
|
4619
|
+
const { watch, formState: { errors }, } = reactHookForm.useFormContext();
|
|
4620
|
+
const { translate } = useSchemaContext();
|
|
4621
|
+
const { required } = schema;
|
|
4622
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4623
|
+
const { gridColumn, gridRow, renderDisplay } = schema;
|
|
4624
|
+
const colLabel = `${prefix}${column}`;
|
|
4625
|
+
const watchEnum = watch(colLabel);
|
|
4626
|
+
const watchEnums = (watch(colLabel) ?? []);
|
|
4627
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${column}.fieldLabel`))}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
4628
|
+
gridRow, children: [isMultiple && (jsxRuntime.jsx(react.Flex, { flexFlow: "wrap", gap: 1, children: watchEnums.map((enumValue) => {
|
|
4629
|
+
const item = enumValue;
|
|
4630
|
+
if (item === undefined) {
|
|
4631
|
+
return jsxRuntime.jsx(jsxRuntime.Fragment, { children: "undefined" });
|
|
4632
|
+
}
|
|
4633
|
+
return (jsxRuntime.jsx(Tag, { closable: true, children: !!renderDisplay === true
|
|
4634
|
+
? renderDisplay(item)
|
|
4635
|
+
: translate.t(removeIndex(`${colLabel}.${item}`)) }));
|
|
4636
|
+
}) })), !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`)) }))] }));
|
|
4637
|
+
};
|
|
4638
|
+
|
|
4639
|
+
const FileViewer = ({ column, schema, prefix }) => {
|
|
4640
|
+
const { setValue, formState: { errors }, watch, } = reactHookForm.useFormContext();
|
|
4641
|
+
const { translate } = useSchemaContext();
|
|
4642
|
+
const { required, gridColumn, gridRow } = schema;
|
|
4643
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4644
|
+
const currentFiles = (watch(column) ?? []);
|
|
4645
|
+
const colLabel = `${prefix}${column}`;
|
|
4646
|
+
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 }) => {
|
|
4647
|
+
const newFiles = files.filter(({ name }) => !currentFiles.some((cur) => cur.name === name));
|
|
4648
|
+
setValue(colLabel, [...currentFiles, ...newFiles]);
|
|
4649
|
+
}, placeholder: translate.t(`${colLabel}.fileDropzone`) }), jsxRuntime.jsx(react.Flex, { flexFlow: "column", gap: 1, children: currentFiles.map((file) => {
|
|
4650
|
+
return (jsxRuntime.jsx(react.Card.Root, { variant: "subtle", children: jsxRuntime.jsxs(react.Card.Body, { gap: "2", cursor: "pointer", onClick: () => {
|
|
4651
|
+
setValue(column, currentFiles.filter(({ name }) => {
|
|
4652
|
+
return name !== file.name;
|
|
4653
|
+
}));
|
|
4654
|
+
}, display: "flex", flexFlow: "row", alignItems: "center", padding: "2", children: [jsxRuntime.jsx(react.Box, { children: file.name }), jsxRuntime.jsx(ti.TiDeleteOutline, {})] }) }, file.name));
|
|
4655
|
+
}) }), errors[`${colLabel}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
4656
|
+
};
|
|
4657
|
+
|
|
4658
|
+
const IdViewer = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
4659
|
+
const { watch, formState: { errors }, } = reactHookForm.useFormContext();
|
|
4660
|
+
const { idMap, translate } = useSchemaContext();
|
|
4661
|
+
const { required, gridColumn, gridRow, renderDisplay, foreign_key } = schema;
|
|
4662
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4663
|
+
const { display_column } = foreign_key;
|
|
4664
|
+
const colLabel = `${prefix}${column}`;
|
|
4665
|
+
const watchId = watch(colLabel);
|
|
4666
|
+
const watchIds = (watch(colLabel) ?? []);
|
|
4667
|
+
const getPickedValue = () => {
|
|
4668
|
+
if (Object.keys(idMap).length <= 0) {
|
|
4669
|
+
return "";
|
|
4670
|
+
}
|
|
4671
|
+
const record = idMap[watchId];
|
|
4672
|
+
if (record === undefined) {
|
|
4673
|
+
return "";
|
|
4674
|
+
}
|
|
4675
|
+
return record[display_column];
|
|
4676
|
+
};
|
|
4677
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${column}.fieldLabel`))}`, required: isRequired, alignItems: "stretch", gridColumn,
|
|
4678
|
+
gridRow, children: [isMultiple && (jsxRuntime.jsx(react.Flex, { flexFlow: "wrap", gap: 1, children: watchIds.map((id) => {
|
|
4679
|
+
const item = idMap[id];
|
|
4680
|
+
if (item === undefined) {
|
|
4681
|
+
return (jsxRuntime.jsx(react.Text, { children: translate.t(removeIndex(`${colLabel}.undefined`)) }, id));
|
|
4682
|
+
}
|
|
4683
|
+
return (jsxRuntime.jsx(Tag, { closable: true, children: !!renderDisplay === true
|
|
4684
|
+
? renderDisplay(item)
|
|
4685
|
+
: item[display_column] }, id));
|
|
4686
|
+
}) })), !isMultiple && jsxRuntime.jsx(react.Text, { children: getPickedValue() }), errors[`${colLabel}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
4687
|
+
};
|
|
4688
|
+
|
|
4689
|
+
const NumberViewer = ({ schema, column, prefix, }) => {
|
|
4690
|
+
const { watch, formState: { errors }, } = reactHookForm.useFormContext();
|
|
4691
|
+
const { translate } = useSchemaContext();
|
|
4692
|
+
const { required, gridColumn, gridRow } = schema;
|
|
4693
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4694
|
+
const colLabel = `${prefix}${column}`;
|
|
4695
|
+
const value = watch(colLabel);
|
|
4696
|
+
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`)) }))] }));
|
|
4697
|
+
};
|
|
4698
|
+
|
|
4699
|
+
const ObjectViewer = ({ schema, column, prefix }) => {
|
|
4700
|
+
const { properties, gridRow, gridColumn = "1/span 12", required } = schema;
|
|
4701
|
+
const { translate } = useSchemaContext();
|
|
4702
|
+
const colLabel = `${prefix}${column}`;
|
|
4703
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4704
|
+
const { formState: { errors }, } = reactHookForm.useFormContext();
|
|
4705
|
+
if (properties === undefined) {
|
|
4706
|
+
throw new Error(`properties is undefined when using ObjectInput`);
|
|
4707
|
+
}
|
|
4708
|
+
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) => {
|
|
4709
|
+
return (
|
|
4710
|
+
// @ts-expect-error find suitable types
|
|
4711
|
+
jsxRuntime.jsx(ColumnViewer, { column: `${key}`,
|
|
4712
|
+
prefix: `${prefix}${column}.`,
|
|
4713
|
+
properties }, `form-objectviewer-${colLabel}-${key}`));
|
|
4714
|
+
}) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.fieldRequired`)) }))] }));
|
|
4715
|
+
};
|
|
4716
|
+
|
|
4717
|
+
const RecordInput = ({ column, schema, prefix }) => {
|
|
4718
|
+
const { formState: { errors }, setValue, getValues, } = reactHookForm.useFormContext();
|
|
4719
|
+
const { translate } = useSchemaContext();
|
|
4720
|
+
const { required, gridColumn, gridRow } = schema;
|
|
4721
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4722
|
+
const entries = Object.entries(getValues(column) ?? {});
|
|
4723
|
+
const [showNewEntries, setShowNewEntries] = React.useState(false);
|
|
4724
|
+
const [newKey, setNewKey] = React.useState();
|
|
4725
|
+
const [newValue, setNewValue] = React.useState();
|
|
4726
|
+
return (jsxRuntime.jsxs(Field, { label: `${translate.t(`${column}.fieldLabel`)}`, required: isRequired, alignItems: "stretch", gridColumn, gridRow, children: [entries.map(([key, value]) => {
|
|
4727
|
+
return (jsxRuntime.jsxs(react.Grid, { templateColumns: "1fr 1fr auto", gap: 1, children: [jsxRuntime.jsx(react.Input, { value: key, onChange: (e) => {
|
|
4728
|
+
const filtered = entries.filter(([target]) => {
|
|
4729
|
+
return target !== key;
|
|
4730
|
+
});
|
|
4731
|
+
setValue(column, Object.fromEntries([...filtered, [e.target.value, value]]));
|
|
4732
|
+
}, autoComplete: "off" }), jsxRuntime.jsx(react.Input, { value: value, onChange: (e) => {
|
|
4733
|
+
setValue(column, {
|
|
4734
|
+
...getValues(column),
|
|
4735
|
+
[key]: e.target.value,
|
|
4736
|
+
});
|
|
4737
|
+
}, autoComplete: "off" }), jsxRuntime.jsx(react.IconButton, { variant: "ghost", onClick: () => {
|
|
4738
|
+
const filtered = entries.filter(([target]) => {
|
|
4739
|
+
return target !== key;
|
|
4740
|
+
});
|
|
4741
|
+
setValue(column, Object.fromEntries([...filtered]));
|
|
4742
|
+
}, children: jsxRuntime.jsx(cg.CgClose, {}) })] }));
|
|
4743
|
+
}), 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) => {
|
|
4744
|
+
setNewKey(e.target.value);
|
|
4745
|
+
}, autoComplete: "off" }), jsxRuntime.jsx(react.Input, { value: newValue, onChange: (e) => {
|
|
4746
|
+
setNewValue(e.target.value);
|
|
4747
|
+
}, autoComplete: "off" })] }) }), jsxRuntime.jsxs(react.Card.Footer, { justifyContent: "flex-end", children: [jsxRuntime.jsx(react.IconButton, { variant: "subtle", onClick: () => {
|
|
4748
|
+
setShowNewEntries(false);
|
|
4749
|
+
setNewKey(undefined);
|
|
4750
|
+
setNewValue(undefined);
|
|
4751
|
+
}, children: jsxRuntime.jsx(cg.CgClose, {}) }), jsxRuntime.jsx(Button, { onClick: () => {
|
|
4752
|
+
if (!!newKey === false) {
|
|
4753
|
+
setShowNewEntries(false);
|
|
4754
|
+
setNewKey(undefined);
|
|
4755
|
+
setNewValue(undefined);
|
|
4756
|
+
return;
|
|
4757
|
+
}
|
|
4758
|
+
setValue(column, Object.fromEntries([...entries, [newKey, newValue]]));
|
|
4759
|
+
setShowNewEntries(false);
|
|
4760
|
+
setNewKey(undefined);
|
|
4761
|
+
setNewValue(undefined);
|
|
4762
|
+
}, children: translate.t(`${column}.save`) })] })] }) }), jsxRuntime.jsx(Button, { onClick: () => {
|
|
4763
|
+
setShowNewEntries(true);
|
|
4764
|
+
setNewKey(undefined);
|
|
4765
|
+
setNewValue(undefined);
|
|
4766
|
+
}, children: translate.t(`${column}.addNew`) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${column}.fieldRequired`) }))] }));
|
|
4767
|
+
};
|
|
4768
|
+
|
|
4769
|
+
const TagViewer = ({ column, schema, prefix }) => {
|
|
4443
4770
|
const { watch, formState: { errors }, setValue, } = reactHookForm.useFormContext();
|
|
4444
|
-
const {
|
|
4771
|
+
const { serverUrl } = useSchemaContext();
|
|
4445
4772
|
if (schema.properties == undefined) {
|
|
4446
4773
|
throw new Error("schema properties undefined when using DatePicker");
|
|
4447
4774
|
}
|
|
4448
|
-
const { gridColumn, gridRow, in_table, object_id_column } = schema
|
|
4775
|
+
const { gridColumn, gridRow, in_table, object_id_column } = schema;
|
|
4449
4776
|
if (in_table === undefined) {
|
|
4450
4777
|
throw new Error("in_table is undefined when using TagPicker");
|
|
4451
4778
|
}
|
|
@@ -4471,7 +4798,7 @@ const TagPicker = ({ column }) => {
|
|
|
4471
4798
|
});
|
|
4472
4799
|
const object_id = watch(object_id_column);
|
|
4473
4800
|
const existingTagsQuery = reactQuery.useQuery({
|
|
4474
|
-
queryKey: [`existing`, in_table, object_id_column, object_id],
|
|
4801
|
+
queryKey: [`existing`, { in_table, object_id_column }, object_id],
|
|
4475
4802
|
queryFn: async () => {
|
|
4476
4803
|
return await getTableData({
|
|
4477
4804
|
serverUrl,
|
|
@@ -4524,6 +4851,77 @@ const TagPicker = ({ column }) => {
|
|
|
4524
4851
|
}), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: (errors[`${column}`]?.message ?? "No error message") }))] }));
|
|
4525
4852
|
};
|
|
4526
4853
|
|
|
4854
|
+
const StringViewer = ({ column, schema, prefix, }) => {
|
|
4855
|
+
const { watch, formState: { errors }, } = reactHookForm.useFormContext();
|
|
4856
|
+
const { translate } = useSchemaContext();
|
|
4857
|
+
const { required, gridColumn, gridRow } = schema;
|
|
4858
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4859
|
+
const colLabel = `${prefix}${column}`;
|
|
4860
|
+
const value = watch(colLabel);
|
|
4861
|
+
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`)) }))] }) }));
|
|
4862
|
+
};
|
|
4863
|
+
|
|
4864
|
+
const SchemaViewer = ({ schema, prefix, column, }) => {
|
|
4865
|
+
const colSchema = schema;
|
|
4866
|
+
const { type, variant, properties: innerProperties, foreign_key, items, } = schema;
|
|
4867
|
+
if (type === "string") {
|
|
4868
|
+
if ((schema.enum ?? []).length > 0) {
|
|
4869
|
+
return jsxRuntime.jsx(EnumViewer, { schema: colSchema, prefix, column });
|
|
4870
|
+
}
|
|
4871
|
+
if (variant === "id-picker") {
|
|
4872
|
+
idPickerSanityCheck(column, foreign_key);
|
|
4873
|
+
return jsxRuntime.jsx(IdViewer, { schema: colSchema, prefix, column });
|
|
4874
|
+
}
|
|
4875
|
+
if (variant === "date-picker") {
|
|
4876
|
+
return jsxRuntime.jsx(DateViewer, { schema: colSchema, prefix, column });
|
|
4877
|
+
}
|
|
4878
|
+
return jsxRuntime.jsx(StringViewer, { schema: colSchema, prefix, column });
|
|
4879
|
+
}
|
|
4880
|
+
if (type === "number" || type === "integer") {
|
|
4881
|
+
return jsxRuntime.jsx(NumberViewer, { schema: colSchema, prefix, column });
|
|
4882
|
+
}
|
|
4883
|
+
if (type === "boolean") {
|
|
4884
|
+
return jsxRuntime.jsx(BooleanViewer, { schema: colSchema, prefix, column });
|
|
4885
|
+
}
|
|
4886
|
+
if (type === "object") {
|
|
4887
|
+
if (innerProperties) {
|
|
4888
|
+
return jsxRuntime.jsx(ObjectViewer, { schema: colSchema, prefix, column });
|
|
4889
|
+
}
|
|
4890
|
+
return jsxRuntime.jsx(RecordInput, { schema: colSchema, prefix, column });
|
|
4891
|
+
}
|
|
4892
|
+
if (type === "array") {
|
|
4893
|
+
if (variant === "id-picker") {
|
|
4894
|
+
idPickerSanityCheck(column, foreign_key);
|
|
4895
|
+
return (jsxRuntime.jsx(IdViewer, { schema: colSchema, prefix, column, isMultiple: true }));
|
|
4896
|
+
}
|
|
4897
|
+
if (variant === "tag-picker") {
|
|
4898
|
+
return jsxRuntime.jsx(TagViewer, { schema: colSchema, prefix, column });
|
|
4899
|
+
}
|
|
4900
|
+
if (variant === "file-picker") {
|
|
4901
|
+
return jsxRuntime.jsx(FileViewer, { schema: colSchema, prefix, column });
|
|
4902
|
+
}
|
|
4903
|
+
if (items) {
|
|
4904
|
+
return jsxRuntime.jsx(ArrayViewer, { schema: colSchema, prefix, column });
|
|
4905
|
+
}
|
|
4906
|
+
return jsxRuntime.jsx(react.Text, { children: `array ${column}` });
|
|
4907
|
+
}
|
|
4908
|
+
if (type === "null") {
|
|
4909
|
+
return jsxRuntime.jsx(react.Text, { children: `null ${column}` });
|
|
4910
|
+
}
|
|
4911
|
+
return jsxRuntime.jsx(react.Text, { children: "missing type" });
|
|
4912
|
+
};
|
|
4913
|
+
|
|
4914
|
+
const ColumnViewer = ({ column, properties, prefix, }) => {
|
|
4915
|
+
if (properties === undefined) {
|
|
4916
|
+
return jsxRuntime.jsx(jsxRuntime.Fragment, {});
|
|
4917
|
+
}
|
|
4918
|
+
const colSchema = properties[column];
|
|
4919
|
+
if (colSchema === undefined) {
|
|
4920
|
+
throw new Error(`${column} does not exist when using ColumnRenderer`);
|
|
4921
|
+
}
|
|
4922
|
+
return jsxRuntime.jsx(SchemaViewer, { schema: colSchema, prefix, column });
|
|
4923
|
+
};
|
|
4924
|
+
|
|
4527
4925
|
const idPickerSanityCheck = (column, foreign_key) => {
|
|
4528
4926
|
if (!!foreign_key == false) {
|
|
4529
4927
|
throw new Error(`The key foreign_key does not exist in properties of column ${column} when using id-picker.`);
|
|
@@ -4540,7 +4938,7 @@ const idPickerSanityCheck = (column, foreign_key) => {
|
|
|
4540
4938
|
}
|
|
4541
4939
|
};
|
|
4542
4940
|
const FormInternal = () => {
|
|
4543
|
-
const { schema, requestUrl, order, ignore, onSubmit, rowNumber,
|
|
4941
|
+
const { schema, requestUrl, order, ignore, include, onSubmit, rowNumber, translate, requestOptions, } = useSchemaContext();
|
|
4544
4942
|
const methods = reactHookForm.useFormContext();
|
|
4545
4943
|
const [isSuccess, setIsSuccess] = React.useState(false);
|
|
4546
4944
|
const [isError, setIsError] = React.useState(false);
|
|
@@ -4599,184 +4997,64 @@ const FormInternal = () => {
|
|
|
4599
4997
|
setIsError(false);
|
|
4600
4998
|
setIsConfirming(true);
|
|
4601
4999
|
};
|
|
4602
|
-
const
|
|
4603
|
-
const
|
|
4604
|
-
|
|
4605
|
-
|
|
4606
|
-
|
|
4607
|
-
|
|
4608
|
-
if (value == undefined || value.length <= 0) {
|
|
4609
|
-
return {
|
|
4610
|
-
value: `<${translate.t("empty") ?? "Empty"}>`,
|
|
4611
|
-
color: "gray.400",
|
|
4612
|
-
};
|
|
4613
|
-
}
|
|
4614
|
-
return {
|
|
4615
|
-
value: value,
|
|
4616
|
-
};
|
|
5000
|
+
const renderColumns = ({ order, keys, ignore, include, }) => {
|
|
5001
|
+
const included = include.length > 0 ? include : keys;
|
|
5002
|
+
const not_exist = included.filter((columnA) => !order.some((columnB) => columnA === columnB));
|
|
5003
|
+
const ordered = [...order, ...not_exist];
|
|
5004
|
+
const ignored = ordered.filter((column) => !ignore.some((shouldIgnore) => column === shouldIgnore));
|
|
5005
|
+
return ignored;
|
|
4617
5006
|
};
|
|
5007
|
+
const ordered = renderColumns({
|
|
5008
|
+
order,
|
|
5009
|
+
keys: Object.keys(properties),
|
|
5010
|
+
ignore,
|
|
5011
|
+
include,
|
|
5012
|
+
});
|
|
4618
5013
|
if (isSuccess) {
|
|
4619
|
-
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(Button, { onClick: () => {
|
|
4620
|
-
|
|
4621
|
-
|
|
4622
|
-
|
|
4623
|
-
|
|
4624
|
-
|
|
4625
|
-
|
|
4626
|
-
|
|
5014
|
+
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: () => {
|
|
5015
|
+
setIsError(false);
|
|
5016
|
+
setIsSubmiting(false);
|
|
5017
|
+
setIsSuccess(false);
|
|
5018
|
+
setIsConfirming(false);
|
|
5019
|
+
setValidatedData(undefined);
|
|
5020
|
+
methods.reset();
|
|
5021
|
+
}, formNoValidate: true, children: translate.t("submitAgain") }) })] }));
|
|
4627
5022
|
}
|
|
4628
5023
|
if (isConfirming) {
|
|
4629
|
-
return (jsxRuntime.jsxs(react.Grid, { gap: 2, children: [jsxRuntime.jsxs(react.Heading, { children: [" ", translate.t("title")] }), jsxRuntime.jsx(
|
|
4630
|
-
|
|
4631
|
-
|
|
4632
|
-
|
|
4633
|
-
|
|
4634
|
-
|
|
4635
|
-
|
|
4636
|
-
|
|
4637
|
-
|
|
4638
|
-
|
|
4639
|
-
|
|
4640
|
-
}
|
|
4641
|
-
const { type, variant, gridColumn, gridRow, foreign_key } = values;
|
|
4642
|
-
if (type === "string") {
|
|
4643
|
-
if (variant === "id-picker") {
|
|
4644
|
-
idPickerSanityCheck(column, foreign_key);
|
|
4645
|
-
return (jsxRuntime.jsx(IdViewer, { value: (validatedData ?? {})[column], column,
|
|
4646
|
-
dataListItemProps: { gridColumn, gridRow } }, `form-${key}`));
|
|
4647
|
-
}
|
|
4648
|
-
if (variant === "date-picker") {
|
|
4649
|
-
const value = (validatedData ?? {})[column];
|
|
4650
|
-
if (!!value === false) {
|
|
4651
|
-
return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(undefined) }, `form-${key}`));
|
|
4652
|
-
}
|
|
4653
|
-
const date = dayjs(value).format("YYYY-MM-DD");
|
|
4654
|
-
return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(date) }, `form-${key}`));
|
|
4655
|
-
}
|
|
4656
|
-
return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps((validatedData ?? {})[column]) }, `form-${key}`));
|
|
4657
|
-
}
|
|
4658
|
-
if (type === "object") {
|
|
4659
|
-
const value = (validatedData ?? {})[column];
|
|
4660
|
-
if (!!value === false) {
|
|
4661
|
-
return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(undefined) }, `form-${key}`));
|
|
4662
|
-
}
|
|
4663
|
-
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]) => {
|
|
4664
|
-
return (jsxRuntime.jsx(DataListItem, { label: `${key}`, ...getDataListProps(value) }, `form-${column}-${key}`));
|
|
4665
|
-
}) })] }, `form-${key}`));
|
|
4666
|
-
}
|
|
4667
|
-
if (type === "boolean") {
|
|
4668
|
-
return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps((validatedData ?? {})[column]) }, `form-${key}`));
|
|
4669
|
-
}
|
|
4670
|
-
if (type === "number" || type === "integer") {
|
|
4671
|
-
return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps((validatedData ?? {})[column]) }, `form-${key}`));
|
|
4672
|
-
}
|
|
4673
|
-
if (type === "array") {
|
|
4674
|
-
if (variant === "tag-picker") {
|
|
4675
|
-
const value = (validatedData ?? {})[column];
|
|
4676
|
-
return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(JSON.stringify(value)) }, `form-${key}`));
|
|
4677
|
-
}
|
|
4678
|
-
if (variant === "file-picker") {
|
|
4679
|
-
const fileNames = ((validatedData ?? {})[column] ?? []).map((file) => {
|
|
4680
|
-
return file.name;
|
|
4681
|
-
});
|
|
4682
|
-
return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(JSON.stringify(fileNames)) }, `form-${key}`));
|
|
4683
|
-
}
|
|
4684
|
-
if (variant === "id-picker") {
|
|
4685
|
-
const value = (validatedData ?? {})[column];
|
|
4686
|
-
if (schema.properties == undefined) {
|
|
4687
|
-
throw new Error("schema properties when using DatePicker");
|
|
4688
|
-
}
|
|
4689
|
-
const { foreign_key } = schema.properties[column];
|
|
4690
|
-
if (foreign_key === undefined) {
|
|
4691
|
-
throw new Error("foreign_key when variant is id-picker");
|
|
4692
|
-
}
|
|
4693
|
-
const { display_column } = foreign_key;
|
|
4694
|
-
const mapped = value.map((item) => {
|
|
4695
|
-
return idMap[item][display_column];
|
|
4696
|
-
});
|
|
4697
|
-
return (jsxRuntime.jsxs(react.Grid, { flexFlow: "column", gridColumn,
|
|
4698
|
-
gridRow, children: [jsxRuntime.jsx(react.Text, { children: translate.t(`input.${column}`) }), jsxRuntime.jsx(RecordDisplay, { object: mapped })] }, `form-${key}`));
|
|
4699
|
-
}
|
|
4700
|
-
const objectString = JSON.stringify((validatedData ?? {})[column]);
|
|
4701
|
-
return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(objectString) }, `form-${key}`));
|
|
4702
|
-
}
|
|
4703
|
-
if (type === "null") {
|
|
4704
|
-
return jsxRuntime.jsx(jsxRuntime.Fragment, { children: `null ${column}` });
|
|
4705
|
-
}
|
|
4706
|
-
return jsxRuntime.jsx(jsxRuntime.Fragment, { children: `unknown type ${column}` });
|
|
4707
|
-
}) }), jsxRuntime.jsx(Button, { onClick: () => {
|
|
4708
|
-
onFormSubmit(validatedData);
|
|
4709
|
-
}, children: translate.t("confirm") }), jsxRuntime.jsx(Button, { onClick: () => {
|
|
4710
|
-
setIsConfirming(false);
|
|
4711
|
-
}, variant: "subtle", children: translate.t("cancel") }), 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)}` })] }) }) }) }) }))] }));
|
|
5024
|
+
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) => {
|
|
5025
|
+
return (jsxRuntime.jsx(ColumnViewer
|
|
5026
|
+
// @ts-expect-error find suitable types
|
|
5027
|
+
, {
|
|
5028
|
+
// @ts-expect-error find suitable types
|
|
5029
|
+
properties: properties, prefix: ``, column }, `form-viewer-${column}`));
|
|
5030
|
+
}) }), jsxRuntime.jsxs(react.Flex, { justifyContent: "end", gap: "2", children: [jsxRuntime.jsx(Button, { onClick: () => {
|
|
5031
|
+
setIsConfirming(false);
|
|
5032
|
+
}, variant: "subtle", children: translate.t("cancel") }), jsxRuntime.jsx(Button, { onClick: () => {
|
|
5033
|
+
onFormSubmit(validatedData);
|
|
5034
|
+
}, 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)}` })] }) }) }) }) }))] }));
|
|
4712
5035
|
}
|
|
4713
|
-
return (jsxRuntime.
|
|
4714
|
-
|
|
4715
|
-
|
|
4716
|
-
|
|
4717
|
-
|
|
4718
|
-
|
|
4719
|
-
|
|
4720
|
-
|
|
4721
|
-
})
|
|
4722
|
-
|
|
4723
|
-
|
|
4724
|
-
}
|
|
4725
|
-
//@ts-expect-error TODO: add more fields to support form-creation
|
|
4726
|
-
const { type, variant, foreign_key } = values;
|
|
4727
|
-
if (type === "string") {
|
|
4728
|
-
// @ts-expect-error enum should exists
|
|
4729
|
-
if ((values.enum ?? []).length > 0) {
|
|
4730
|
-
return jsxRuntime.jsx(EnumPicker, { column: key }, `form-${key}`);
|
|
4731
|
-
}
|
|
4732
|
-
if (variant === "id-picker") {
|
|
4733
|
-
idPickerSanityCheck(column, foreign_key);
|
|
4734
|
-
return jsxRuntime.jsx(IdPicker, { column: key }, `form-${key}`);
|
|
4735
|
-
}
|
|
4736
|
-
if (variant === "date-picker") {
|
|
4737
|
-
return jsxRuntime.jsx(DatePicker, { column: key }, `form-${key}`);
|
|
4738
|
-
}
|
|
4739
|
-
return jsxRuntime.jsx(StringInputField, { column: key }, `form-${key}`);
|
|
4740
|
-
}
|
|
4741
|
-
if (type === "number" || type === "integer") {
|
|
4742
|
-
return jsxRuntime.jsx(NumberInputField, { column: key }, `form-${key}`);
|
|
4743
|
-
}
|
|
4744
|
-
if (type === "boolean") {
|
|
4745
|
-
return jsxRuntime.jsx(BooleanPicker, { column: key }, `form-${key}`);
|
|
4746
|
-
}
|
|
4747
|
-
if (type === "object") {
|
|
4748
|
-
return jsxRuntime.jsx(ObjectInput, { column: key }, `form-${key}`);
|
|
4749
|
-
}
|
|
4750
|
-
if (type === "array") {
|
|
4751
|
-
if (variant === "id-picker") {
|
|
4752
|
-
idPickerSanityCheck(column, foreign_key);
|
|
4753
|
-
return jsxRuntime.jsx(IdPicker, { column: key, isMultiple: true }, `form-${key}`);
|
|
4754
|
-
}
|
|
4755
|
-
if (variant === "tag-picker") {
|
|
4756
|
-
return jsxRuntime.jsx(TagPicker, { column: key }, `form-${key}`);
|
|
4757
|
-
}
|
|
4758
|
-
if (variant === "file-picker") {
|
|
4759
|
-
return jsxRuntime.jsx(FilePicker, { column: key }, `form-${key}`);
|
|
4760
|
-
}
|
|
4761
|
-
return jsxRuntime.jsx(react.Text, { children: `array ${column}` }, `form-${key}`);
|
|
4762
|
-
}
|
|
4763
|
-
if (type === "null") {
|
|
4764
|
-
return jsxRuntime.jsx(react.Text, { children: `null ${column}` }, `form-${key}`);
|
|
4765
|
-
}
|
|
4766
|
-
return jsxRuntime.jsx(react.Text, { children: "missing type" }, `form-${key}`);
|
|
4767
|
-
}) }), jsxRuntime.jsx(Button, { onClick: () => {
|
|
4768
|
-
methods.handleSubmit(onValid)();
|
|
4769
|
-
}, formNoValidate: true, children: translate.t("submit") })] }), isError && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: ["isError", jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [" ", `${error}`] })] }))] }));
|
|
5036
|
+
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) => {
|
|
5037
|
+
return (jsxRuntime.jsx(ColumnRenderer
|
|
5038
|
+
// @ts-expect-error find suitable types
|
|
5039
|
+
, {
|
|
5040
|
+
// @ts-expect-error find suitable types
|
|
5041
|
+
properties: properties, prefix: ``, column }, `form-input-${column}`));
|
|
5042
|
+
}) }), jsxRuntime.jsxs(react.Flex, { justifyContent: "end", gap: "2", children: [jsxRuntime.jsx(Button, { onClick: () => {
|
|
5043
|
+
methods.reset();
|
|
5044
|
+
}, variant: "subtle", children: translate.t("reset") }), jsxRuntime.jsx(Button, { onClick: () => {
|
|
5045
|
+
methods.handleSubmit(onValid)();
|
|
5046
|
+
}, formNoValidate: true, children: translate.t("submit") })] })] }) }));
|
|
4770
5047
|
};
|
|
4771
|
-
const Form = ({ schema, idMap, setIdMap, form, serverUrl, translate, order = [], ignore = [], onSubmit = undefined, rowNumber = undefined, requestOptions = {}, }) => {
|
|
4772
|
-
const { properties } = schema;
|
|
4773
|
-
idListSanityCheck("order", order, properties);
|
|
4774
|
-
idListSanityCheck("ignore", ignore, properties);
|
|
5048
|
+
const Form = ({ schema, idMap, setIdMap, form, serverUrl, translate, order = [], ignore = [], include = [], onSubmit = undefined, rowNumber = undefined, requestOptions = {}, }) => {
|
|
5049
|
+
// const { properties } = schema;
|
|
5050
|
+
// idListSanityCheck("order", order, properties as object);
|
|
5051
|
+
// idListSanityCheck("ignore", ignore, properties as object);
|
|
4775
5052
|
return (jsxRuntime.jsx(SchemaFormContext.Provider, { value: {
|
|
4776
5053
|
schema,
|
|
4777
5054
|
serverUrl,
|
|
4778
5055
|
order,
|
|
4779
5056
|
ignore,
|
|
5057
|
+
include,
|
|
4780
5058
|
// @ts-expect-error TODO: find appropriate types
|
|
4781
5059
|
onSubmit,
|
|
4782
5060
|
rowNumber,
|
|
@@ -4788,7 +5066,9 @@ const Form = ({ schema, idMap, setIdMap, form, serverUrl, translate, order = [],
|
|
|
4788
5066
|
};
|
|
4789
5067
|
|
|
4790
5068
|
const useForm = ({ preLoadedValues, keyPrefix }) => {
|
|
4791
|
-
const form = reactHookForm.useForm({
|
|
5069
|
+
const form = reactHookForm.useForm({
|
|
5070
|
+
values: preLoadedValues,
|
|
5071
|
+
});
|
|
4792
5072
|
const [idMap, setIdMap] = React.useState({});
|
|
4793
5073
|
const translate = reactI18next.useTranslation("", { keyPrefix });
|
|
4794
5074
|
return {
|
|
@@ -4858,6 +5138,7 @@ exports.ViewDialog = ViewDialog;
|
|
|
4858
5138
|
exports.getColumns = getColumns;
|
|
4859
5139
|
exports.getMultiDates = getMultiDates;
|
|
4860
5140
|
exports.getRangeDates = getRangeDates;
|
|
5141
|
+
exports.idPickerSanityCheck = idPickerSanityCheck;
|
|
4861
5142
|
exports.useDataTable = useDataTable;
|
|
4862
5143
|
exports.useDataTableContext = useDataTableContext;
|
|
4863
5144
|
exports.useDataTableServer = useDataTableServer;
|