@bsol-oss/react-datatable5 11.0.0-beta.5 → 11.0.0-beta.6

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