@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.
Files changed (50) hide show
  1. package/dist/index.d.ts +12 -5
  2. package/dist/index.js +841 -560
  3. package/dist/index.mjs +844 -564
  4. package/dist/types/components/DataTable/DataDisplay.d.ts +1 -1
  5. package/dist/types/components/DataTable/utils/getColumns.d.ts +2 -1
  6. package/dist/types/components/Form/Form.d.ts +8 -2
  7. package/dist/types/components/Form/SchemaFormContext.d.ts +1 -0
  8. package/dist/types/components/Form/components/ArrayRenderer.d.ts +7 -0
  9. package/dist/types/components/Form/components/BooleanPicker.d.ts +4 -1
  10. package/dist/types/components/Form/components/ColumnRenderer.d.ts +7 -0
  11. package/dist/types/components/Form/components/DatePicker.d.ts +4 -1
  12. package/dist/types/components/Form/components/EnumPicker.d.ts +4 -1
  13. package/dist/types/components/Form/components/FilePicker.d.ts +3 -1
  14. package/dist/types/components/Form/components/IdPicker.d.ts +4 -1
  15. package/dist/types/components/Form/components/NumberInputField.d.ts +4 -1
  16. package/dist/types/components/Form/components/ObjectInput.d.ts +5 -2
  17. package/dist/types/components/Form/components/RecordInput.d.ts +7 -0
  18. package/dist/types/components/Form/components/SchemaRenderer.d.ts +7 -0
  19. package/dist/types/components/Form/components/StringInputField.d.ts +4 -4
  20. package/dist/types/components/Form/components/TagPicker.d.ts +4 -1
  21. package/dist/types/components/Form/components/fields/ArrayRenderer.d.ts +7 -0
  22. package/dist/types/components/Form/components/fields/BooleanPicker.d.ts +7 -0
  23. package/dist/types/components/Form/components/fields/ColumnRenderer.d.ts +7 -0
  24. package/dist/types/components/Form/components/fields/DatePicker.d.ts +7 -0
  25. package/dist/types/components/Form/components/fields/EnumPicker.d.ts +8 -0
  26. package/dist/types/components/Form/components/fields/FilePicker.d.ts +5 -0
  27. package/dist/types/components/Form/components/fields/IdPicker.d.ts +8 -0
  28. package/dist/types/components/Form/components/fields/NumberInputField.d.ts +7 -0
  29. package/dist/types/components/Form/components/fields/ObjectInput.d.ts +7 -0
  30. package/dist/types/components/Form/components/fields/RecordInput.d.ts +7 -0
  31. package/dist/types/components/Form/components/fields/SchemaRenderer.d.ts +7 -0
  32. package/dist/types/components/Form/components/fields/StringInputField.d.ts +12 -0
  33. package/dist/types/components/Form/components/fields/TagPicker.d.ts +25 -0
  34. package/dist/types/components/Form/components/types/CustomJSONSchema7.d.ts +15 -0
  35. package/dist/types/components/Form/components/viewers/ArrayViewer.d.ts +7 -0
  36. package/dist/types/components/Form/components/viewers/BooleanViewer.d.ts +7 -0
  37. package/dist/types/components/Form/components/viewers/ColumnViewer.d.ts +7 -0
  38. package/dist/types/components/Form/components/viewers/DateViewer.d.ts +7 -0
  39. package/dist/types/components/Form/components/viewers/EnumViewer.d.ts +8 -0
  40. package/dist/types/components/Form/components/viewers/FileViewer.d.ts +5 -0
  41. package/dist/types/components/Form/components/viewers/IdViewer.d.ts +8 -0
  42. package/dist/types/components/Form/components/viewers/NumberViewer.d.ts +7 -0
  43. package/dist/types/components/Form/components/viewers/ObjectViewer.d.ts +7 -0
  44. package/dist/types/components/Form/components/viewers/RecordViewer.d.ts +7 -0
  45. package/dist/types/components/Form/components/viewers/SchemaViewer.d.ts +7 -0
  46. package/dist/types/components/Form/components/viewers/StringViewer.d.ts +12 -0
  47. package/dist/types/components/Form/components/viewers/TagViewer.d.ts +30 -0
  48. package/dist/types/components/Form/useSchemaContext.d.ts +2 -14
  49. package/dist/types/components/Form/utils/removeIndex.d.ts +1 -0
  50. 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 [order, setOrder] = React.useState(table.getAllLeafColumns().map((column) => {
2422
- return column.id;
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
- }, [order, table]);
2452
- return (jsxRuntime.jsx(react.Flex, { flexFlow: "column", gap: "0.25rem", children: table.getState().columnOrder.map((columnId, index) => {
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 formatValue = (value) => {
2628
- if (typeof value === "object") {
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
- if (variant == "horizontal") {
2651
- return (jsxRuntime.jsx(react.Flex, { flexFlow: "column", gap: "1", children: table.getRowModel().rows.map((row) => {
2652
- return (jsxRuntime.jsx(react.Card.Root, { children: jsxRuntime.jsx(react.Card.Body, { children: jsxRuntime.jsx(react.DataList.Root, { gap: 4, padding: 4, display: "grid", variant: "subtle", orientation: "horizontal", overflow: "auto", children: row.getVisibleCells().map((cell) => {
2653
- const showCustomDataDisplay = cell.column.columnDef.meta?.showCustomDisplay ?? false;
2654
- if (showCustomDataDisplay) {
2655
- return (jsxRuntime.jsx(react.Flex, { children: reactTable.flexRender(cell.column.columnDef.cell, cell.getContext()) }, cell.id));
2656
- }
2657
- const value = cell.getValue();
2658
- if (typeof value === "object") {
2659
- return (jsxRuntime.jsxs(react.DataList.Item, { children: [jsxRuntime.jsx(react.DataList.ItemLabel, { children: getLabel({ columnId: cell.column.id }) }), jsxRuntime.jsx(RecordDisplay, { boxProps: {
2660
- borderWidth: 1,
2661
- borderRadius: 4,
2662
- borderColor: "gray.400",
2663
- paddingX: 4,
2664
- paddingY: 2,
2665
- }, object: value })] }, cell.id));
2666
- }
2667
- return (jsxRuntime.jsxs(react.DataList.Item, { children: [jsxRuntime.jsx(react.DataList.ItemLabel, { children: getLabel({ columnId: cell.column.id }) }), jsxRuntime.jsx(react.DataList.ItemValue, { wordBreak: "break-word", textOverflow: "ellipsis", overflow: "hidden", children: `${formatValue(cell.getValue())}` })] }, cell.id));
2668
- }) }) }) }, `chakra-table-card-${row.id}`));
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
- if (variant == "stats") {
2672
- return (jsxRuntime.jsx(react.Flex, { flexFlow: "column", gap: "1", children: table.getRowModel().rows.map((row) => {
2673
- return (jsxRuntime.jsx(react.Card.Root, { children: jsxRuntime.jsx(react.Card.Body, { children: jsxRuntime.jsx(react.DataList.Root, { gap: 4, padding: 4, display: "flex", flexFlow: "row", variant: "subtle", overflow: "auto", children: row.getVisibleCells().map((cell) => {
2674
- const showCustomDataDisplay = cell.column.columnDef.meta?.showCustomDisplay ?? false;
2675
- if (showCustomDataDisplay) {
2676
- return (jsxRuntime.jsx(react.Flex, { children: reactTable.flexRender(cell.column.columnDef.cell, cell.getContext()) }, cell.id));
2677
- }
2678
- const value = cell.getValue();
2679
- if (typeof value === "object") {
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
- return (jsxRuntime.jsx(react.Card.Root, { children: jsxRuntime.jsx(react.Card.Body, { children: jsxRuntime.jsx(react.DataList.Root, { gap: 4, padding: 4, display: "grid", variant: "subtle", gridTemplateColumns: "repeat(auto-fit, minmax(20rem, 1fr))", children: row.getVisibleCells().map((cell) => {
2694
- const showCustomDataDisplay = cell.column.columnDef.meta?.showCustomDisplay ?? false;
2695
- if (showCustomDataDisplay) {
2696
- return (jsxRuntime.jsx(react.Flex, { children: reactTable.flexRender(cell.column.columnDef.cell, cell.getContext()) }, cell.id));
2697
- }
2698
- const value = cell.getValue();
2699
- if (typeof value === "object") {
2700
- return (jsxRuntime.jsxs(react.DataList.Item, { children: [jsxRuntime.jsx(react.DataList.ItemLabel, { children: getLabel({ columnId: cell.column.id }) }), jsxRuntime.jsx(RecordDisplay, { boxProps: {
2701
- borderWidth: 1,
2702
- borderRadius: 4,
2703
- borderColor: "gray.400",
2704
- paddingX: 4,
2705
- paddingY: 2,
2706
- }, object: value })] }, cell.id));
2707
- }
2708
- return (jsxRuntime.jsxs(react.DataList.Item, { children: [jsxRuntime.jsx(react.DataList.ItemLabel, { children: getLabel({ columnId: cell.column.id }) }), jsxRuntime.jsx(react.DataList.ItemValue, { wordBreak: "break-word", textOverflow: "ellipsis", overflow: "hidden", children: `${formatValue(cell.getValue())}` })] }, cell.id));
2709
- }) }) }) }, `chakra-table-card-${row.id}`));
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 ignored = keys.filter((key) => {
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
- const { schema, serverUrl, requestUrl, order, ignore, onSubmit, rowNumber, idMap, setIdMap, translate, requestOptions, } = React.useContext(SchemaFormContext);
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
- const ToggleTip = React__namespace.forwardRef(function ToggleTip(props, ref) {
3811
- const { showArrow, children, portalled = true, content, portalRef, ...rest } = props;
3812
- return (jsxRuntime.jsxs(react.Popover.Root, { ...rest, positioning: { ...rest.positioning, gutter: 4 }, children: [jsxRuntime.jsx(react.Popover.Trigger, { asChild: true, children: children }), jsxRuntime.jsx(react.Portal, { disabled: !portalled, container: portalRef, children: jsxRuntime.jsx(react.Popover.Positioner, { children: jsxRuntime.jsxs(react.Popover.Content, { width: "auto", px: "2", py: "1", textStyle: "xs", rounded: "sm", ref: ref, children: [showArrow && (jsxRuntime.jsx(react.Popover.Arrow, { children: jsxRuntime.jsx(react.Popover.ArrowTip, {}) })), content] }) }) })] }));
3813
- });
3814
- const InfoTip = React__namespace.forwardRef(function InfoTip(props, ref) {
3815
- const { children, ...rest } = props;
3816
- return (jsxRuntime.jsx(ToggleTip, { content: children, ...rest, ref: ref, children: jsxRuntime.jsx(react.IconButton, { variant: "ghost", "aria-label": "info", size: "2xs", colorPalette: "gray", children: jsxRuntime.jsx(hi.HiOutlineInformationCircle, {}) }) }));
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 DataListRoot = react.DataList.Root;
3820
- const DataListItem = React__namespace.forwardRef(function DataListItem(props, ref) {
3821
- const { label, info, value, children, grow, ...rest } = props;
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 { schema, translate } = useSchemaContext();
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 value = watch(column);
3831
- if (schema.properties == undefined) {
3832
- throw new Error("schema properties when using BooleanPicker");
3833
- }
3834
- const { gridColumn, gridRow } = schema.properties[column];
3835
- return (jsxRuntime.jsxs(Field, { label: `${translate.t(`${column}.fieldLabel`)}`, required: isRequired, alignItems: "stretch", gridColumn,
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 DatePicker = ({ column }) => {
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 { schema, translate } = useSchemaContext();
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(column);
3917
- if (schema.properties == undefined) {
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: ({ selected, selectable, date }) => {
3931
- setValue(column, dayjs(date).format("YYYY-MM-DD"));
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(`${column}.fieldRequired`) }))] }));
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 { schema, translate } = useSchemaContext();
3751
+ const { translate } = useSchemaContext();
3949
3752
  const { required } = schema;
3950
3753
  const isRequired = required?.some((columnId) => columnId === column);
3951
- if (schema.properties == undefined) {
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 watchEnum = watch(column);
3960
- const watchEnums = (watch(column) ?? []);
3961
- const properties = (schema.properties[column] ?? {});
3962
- const dataList = properties.enum ?? [];
3963
- const count = properties.enum?.length ?? 0;
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 ? renderDisplay(item) : item }));
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: "Add" })] })), !isMultiple && (jsxRuntime.jsx(Button, { variant: "outline", onClick: () => {
3783
+ }, children: translate.t(removeIndex(`${colLabel}.addMore`)) })] })), !isMultiple && (jsxRuntime.jsx(Button, { variant: "outline", onClick: () => {
3982
3784
  setOpenSearchResult(true);
3983
- }, children: 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) => {
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(column, item);
3797
+ setValue(colLabel, item);
3994
3798
  return;
3995
3799
  }
3996
3800
  const newSet = new Set([...(watchEnums ?? []), item]);
3997
- setValue(column, [...newSet]);
3998
- }, ...(selected ? { color: "gray.400/50" } : {}), children: !!renderDisplay === true ? renderDisplay(item) : item }, `${column}-${item}`));
3999
- }) }), isDirty && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [dataList.length <= 0 && jsxRuntime.jsx(jsxRuntime.Fragment, { children: "Empty Search Result" }), " "] }))] })] }) })] }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${column}.fieldRequired`) }))] }));
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 { schema, translate } = useSchemaContext();
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
- return (jsxRuntime.jsxs(Field, { label: `${translate.t(`${column}.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 }) => {
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(column, [...currentFiles, ...newFiles]);
4367
- }, placeholder: translate.t(`${column}.fileDropzone`) }), jsxRuntime.jsx(react.Flex, { flexFlow: "column", gap: 1, children: currentFiles.map((file) => {
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: 'row', alignItems: 'center', padding: '2', children: [jsxRuntime.jsx(react.Box, { children: file.name }), jsxRuntime.jsx(ti.TiDeleteOutline, {})] }) }, file.name));
4373
- }) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${column}.fieldRequired`) }))] }));
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 ObjectInput = ({ column }) => {
4377
- const { formState: { errors }, setValue, getValues, } = reactHookForm.useFormContext();
4378
- const { schema, translate } = useSchemaContext();
4379
- const { required } = schema;
4380
- const isRequired = required?.some((columnId) => columnId === column);
4381
- const entries = Object.entries(getValues(column) ?? {});
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 { schema, serverUrl } = useSchemaContext();
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.properties[column];
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, idMap, translate, requestOptions, } = useSchemaContext();
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 renderOrder = (order, origin_list) => {
4603
- const not_exist = origin_list.filter((columnA) => !order.some((columnB) => columnA === columnB));
4604
- return [...order, ...not_exist];
4605
- };
4606
- const ordered = renderOrder(order, Object.keys(properties));
4607
- const getDataListProps = (value) => {
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
- setIsError(false);
4621
- setIsSubmiting(false);
4622
- setIsSuccess(false);
4623
- setIsConfirming(false);
4624
- setValidatedData(undefined);
4625
- methods.reset();
4626
- }, formNoValidate: true, children: translate.t("submitAgain") })] }));
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(DataListRoot, { orientation: "horizontal", gap: 4, display: "grid", gridTemplateColumns: "repeat(12, 1fr)", gridTemplateRows: `repeat(${rowNumber ?? "auto-fit"}, auto)`, children: ordered.map((column) => {
4630
- if (properties === undefined) {
4631
- return jsxRuntime.jsx(jsxRuntime.Fragment, {});
4632
- }
4633
- const key = column;
4634
- const values = properties[column];
4635
- const shouldIgnore = ignore.some((column) => {
4636
- return column == key;
4637
- });
4638
- if (shouldIgnore) {
4639
- return jsxRuntime.jsx(jsxRuntime.Fragment, {});
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.jsxs(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) => {
4714
- if (properties === undefined) {
4715
- return jsxRuntime.jsx(jsxRuntime.Fragment, {});
4716
- }
4717
- const key = column;
4718
- const values = properties[column];
4719
- const shouldIgnore = ignore.some((column) => {
4720
- return column == key;
4721
- });
4722
- if (shouldIgnore) {
4723
- return jsxRuntime.jsx(jsxRuntime.Fragment, {});
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({ values: preLoadedValues });
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;