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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -28,8 +28,8 @@ var gr = require('react-icons/gr');
28
28
  var hi = require('react-icons/hi');
29
29
  var reactI18next = require('react-i18next');
30
30
  var axios = require('axios');
31
- var dayjs = require('dayjs');
32
31
  var reactHookForm = require('react-hook-form');
32
+ var dayjs = require('dayjs');
33
33
  var ti = require('react-icons/ti');
34
34
 
35
35
  function _interopNamespaceDefault(e) {
@@ -3567,16 +3567,6 @@ const SchemaFormContext = React.createContext({
3567
3567
  requestOptions: {},
3568
3568
  });
3569
3569
 
3570
- const HoverCardContent = React__namespace.forwardRef(function HoverCardContent(props, ref) {
3571
- const { portalled = true, portalRef, ...rest } = props;
3572
- return (jsxRuntime.jsx(react.Portal, { disabled: !portalled, container: portalRef, children: jsxRuntime.jsx(react.HoverCard.Positioner, { children: jsxRuntime.jsx(react.HoverCard.Content, { ref: ref, ...rest }) }) }));
3573
- });
3574
- const HoverCardArrow = React__namespace.forwardRef(function HoverCardArrow(props, ref) {
3575
- return (jsxRuntime.jsx(react.HoverCard.Arrow, { ref: ref, ...props, children: jsxRuntime.jsx(react.HoverCard.ArrowTip, {}) }));
3576
- });
3577
- const HoverCardRoot = react.HoverCard.Root;
3578
- const HoverCardTrigger = react.HoverCard.Trigger;
3579
-
3580
3570
  const useSchemaContext = () => {
3581
3571
  const { schema, serverUrl, requestUrl, order, ignore, onSubmit, rowNumber, idMap, setIdMap, translate, requestOptions, } = React.useContext(SchemaFormContext);
3582
3572
  return {
@@ -3594,22 +3584,6 @@ const useSchemaContext = () => {
3594
3584
  };
3595
3585
  };
3596
3586
 
3597
- const IdViewer = ({ value, column }) => {
3598
- const { schema, idMap, translate } = useSchemaContext();
3599
- if (schema.properties == undefined) {
3600
- throw new Error("schema properties when using DatePicker");
3601
- }
3602
- const { foreign_key } = schema.properties[column];
3603
- if (foreign_key === undefined) {
3604
- throw new Error("foreign_key when variant is id-picker");
3605
- }
3606
- const { display_column } = foreign_key;
3607
- if (value === undefined) {
3608
- return (jsxRuntime.jsxs(react.Flex, { flexFlow: "column", children: [jsxRuntime.jsx(react.Text, { children: translate.t(`${column}.fieldLabel`) }), jsxRuntime.jsx(react.Text, { children: translate.t(`empty`) })] }));
3609
- }
3610
- return (jsxRuntime.jsxs(react.Flex, { flexFlow: "column", children: [jsxRuntime.jsx(react.Text, { children: translate.t(`${column}.fieldLabel`) }), jsxRuntime.jsxs(HoverCardRoot, { children: [jsxRuntime.jsx(HoverCardTrigger, { asChild: true, children: jsxRuntime.jsx(react.Text, { cursor: 'pointer', children: idMap[value][display_column] }) }), jsxRuntime.jsxs(HoverCardContent, { children: [jsxRuntime.jsx(HoverCardArrow, {}), jsxRuntime.jsx(RecordDisplay, { object: idMap[value] })] })] })] }));
3611
- };
3612
-
3613
3587
  const clearEmptyString = (object) => {
3614
3588
  return Object.fromEntries(Object.entries(object).filter(([, value]) => value !== ""));
3615
3589
  };
@@ -3624,20 +3598,24 @@ const AccordionItemContent = React__namespace.forwardRef(function AccordionItemC
3624
3598
  const AccordionRoot = react.Accordion.Root;
3625
3599
  const AccordionItem = react.Accordion.Item;
3626
3600
 
3627
- const ToggleTip = React__namespace.forwardRef(function ToggleTip(props, ref) {
3628
- const { showArrow, children, portalled = true, content, portalRef, ...rest } = props;
3629
- 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] }) }) })] }));
3630
- });
3631
- const InfoTip = React__namespace.forwardRef(function InfoTip(props, ref) {
3632
- const { children, ...rest } = props;
3633
- return (jsxRuntime.jsx(ToggleTip, { content: children, ...rest, ref: ref, children: jsxRuntime.jsx(react.IconButton, { variant: "ghost", "aria-label": "info", size: "2xs", colorPalette: "gray", children: jsxRuntime.jsx(hi.HiOutlineInformationCircle, {}) }) }));
3634
- });
3635
-
3636
- const DataListRoot = react.DataList.Root;
3637
- const DataListItem = React__namespace.forwardRef(function DataListItem(props, ref) {
3638
- const { label, info, value, children, grow, ...rest } = props;
3639
- 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] }));
3640
- });
3601
+ const ArrayRenderer = ({ schema, column, prefix, }) => {
3602
+ const { gridRow, gridColumn = "1/span 12", required, items } = schema;
3603
+ const { translate } = useSchemaContext();
3604
+ const colLabel = `${prefix}${column}`;
3605
+ 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`) }))] }));
3618
+ };
3641
3619
 
3642
3620
  const Field = React__namespace.forwardRef(function Field(props, ref) {
3643
3621
  const { label, children, helperText, errorText, optionalText, ...rest } = props;
@@ -4350,16 +4328,21 @@ const NumberInputField = ({ schema, column, prefix, }) => {
4350
4328
  };
4351
4329
 
4352
4330
  const ObjectInput = ({ schema, column, prefix }) => {
4353
- const { properties } = schema;
4331
+ const { properties, gridRow, gridColumn = "1/span 12", required } = schema;
4332
+ const { translate } = useSchemaContext();
4333
+ const colLabel = `${prefix}${column}`;
4334
+ const isRequired = required?.some((columnId) => columnId === column);
4335
+ const { watch, formState: { errors }, setValue, control, } = reactHookForm.useFormContext();
4354
4336
  if (properties === undefined) {
4355
4337
  throw new Error(`properties is undefined when using ObjectInput`);
4356
4338
  }
4357
- return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: Object.keys(properties ?? {}).map((key) => {
4358
- console.log(properties, key, "gkor");
4359
- return (jsxRuntime.jsx(ColumnRenderer, { column: `${key}`,
4360
- prefix: `${prefix}${column}.`,
4361
- properties }, `form-${column}`));
4362
- }) }));
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) => {
4340
+ return (
4341
+ // @ts-expect-error find suitable types
4342
+ jsxRuntime.jsx(ColumnRenderer, { column: `${key}`,
4343
+ prefix: `${prefix}${column}.`,
4344
+ properties }, `form-${column}`));
4345
+ }) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${colLabel}.fieldRequired`) }))] }));
4363
4346
  };
4364
4347
 
4365
4348
  const RecordInput = ({ column, schema, prefix }) => {
@@ -4433,13 +4416,13 @@ const RadioCardRoot = react.RadioCard.Root;
4433
4416
  react.RadioCard.Label;
4434
4417
  react.RadioCard.ItemIndicator;
4435
4418
 
4436
- const TagPicker = ({ column }) => {
4419
+ const TagPicker = ({ column, schema, prefix }) => {
4437
4420
  const { watch, formState: { errors }, setValue, } = reactHookForm.useFormContext();
4438
- const { schema, serverUrl } = useSchemaContext();
4421
+ const { serverUrl } = useSchemaContext();
4439
4422
  if (schema.properties == undefined) {
4440
4423
  throw new Error("schema properties undefined when using DatePicker");
4441
4424
  }
4442
- const { gridColumn, gridRow, in_table, object_id_column } = schema.properties[column];
4425
+ const { gridColumn, gridRow, in_table, object_id_column } = schema;
4443
4426
  if (in_table === undefined) {
4444
4427
  throw new Error("in_table is undefined when using TagPicker");
4445
4428
  }
@@ -4465,7 +4448,7 @@ const TagPicker = ({ column }) => {
4465
4448
  });
4466
4449
  const object_id = watch(object_id_column);
4467
4450
  const existingTagsQuery = reactQuery.useQuery({
4468
- queryKey: [`existing`, in_table, object_id_column, object_id],
4451
+ queryKey: [`existing`, { in_table, object_id_column }, object_id],
4469
4452
  queryFn: async () => {
4470
4453
  return await getTableData({
4471
4454
  serverUrl,
@@ -4518,20 +4501,11 @@ const TagPicker = ({ column }) => {
4518
4501
  }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: (errors[`${column}`]?.message ?? "No error message") }))] }));
4519
4502
  };
4520
4503
 
4521
- const ColumnRenderer = ({ column, properties, prefix, }) => {
4522
- if (properties === undefined) {
4523
- return jsxRuntime.jsx(jsxRuntime.Fragment, {});
4524
- }
4525
- console.log(`${column} does not exist when using ColumnRenderer`, { properties,
4526
- column,
4527
- prefix, }, "fdpok");
4528
- const colSchema = properties[column];
4529
- if (colSchema === undefined) {
4530
- throw new Error(`${column} does not exist when using ColumnRenderer`);
4531
- }
4532
- const { type, variant, foreign_key, properties: innerProperties } = colSchema;
4504
+ const SchemaRenderer = ({ schema, prefix, column, }) => {
4505
+ const colSchema = schema;
4506
+ const { type, variant, properties: innerProperties, foreign_key, items, } = schema;
4533
4507
  if (type === "string") {
4534
- if ((properties[column].enum ?? []).length > 0) {
4508
+ if ((schema.enum ?? []).length > 0) {
4535
4509
  return jsxRuntime.jsx(EnumPicker, { schema: colSchema, prefix, column });
4536
4510
  }
4537
4511
  if (variant === "id-picker") {
@@ -4566,6 +4540,9 @@ const ColumnRenderer = ({ column, properties, prefix, }) => {
4566
4540
  if (variant === "file-picker") {
4567
4541
  return jsxRuntime.jsx(FilePicker, { schema: colSchema, prefix, column });
4568
4542
  }
4543
+ if (items) {
4544
+ return jsxRuntime.jsx(ArrayRenderer, { schema: colSchema, prefix, column });
4545
+ }
4569
4546
  return jsxRuntime.jsx(react.Text, { children: `array ${column}` });
4570
4547
  }
4571
4548
  if (type === "null") {
@@ -4574,6 +4551,18 @@ const ColumnRenderer = ({ column, properties, prefix, }) => {
4574
4551
  return jsxRuntime.jsx(react.Text, { children: "missing type" });
4575
4552
  };
4576
4553
 
4554
+ const ColumnRenderer = ({ column, properties, prefix, }) => {
4555
+ if (properties === undefined) {
4556
+ return jsxRuntime.jsx(jsxRuntime.Fragment, {});
4557
+ }
4558
+ console.log(`${column} does not exist when using ColumnRenderer`, { properties, column, prefix }, "fdpok");
4559
+ const colSchema = properties[column];
4560
+ if (colSchema === undefined) {
4561
+ throw new Error(`${column} does not exist when using ColumnRenderer`);
4562
+ }
4563
+ return jsxRuntime.jsx(SchemaRenderer, { schema: colSchema, prefix, column });
4564
+ };
4565
+
4577
4566
  const idPickerSanityCheck = (column, foreign_key) => {
4578
4567
  if (!!foreign_key == false) {
4579
4568
  throw new Error(`The key foreign_key does not exist in properties of column ${column} when using id-picker.`);
@@ -4654,121 +4643,34 @@ const FormInternal = () => {
4654
4643
  return [...order, ...not_exist];
4655
4644
  };
4656
4645
  const ordered = renderOrder(order, Object.keys(properties));
4657
- const getDataListProps = (value) => {
4658
- if (value == undefined || value.length <= 0) {
4659
- return {
4660
- value: `<${translate.t("empty") ?? "Empty"}>`,
4661
- color: "gray.400",
4662
- };
4663
- }
4664
- return {
4665
- value: value,
4666
- };
4667
- };
4668
4646
  if (isSuccess) {
4669
- 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: () => {
4670
- setIsError(false);
4671
- setIsSubmiting(false);
4672
- setIsSuccess(false);
4673
- setIsConfirming(false);
4674
- setValidatedData(undefined);
4675
- methods.reset();
4676
- }, formNoValidate: true, children: translate.t("submitAgain") })] }));
4647
+ 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: () => {
4648
+ setIsError(false);
4649
+ setIsSubmiting(false);
4650
+ setIsSuccess(false);
4651
+ setIsConfirming(false);
4652
+ setValidatedData(undefined);
4653
+ methods.reset();
4654
+ }, formNoValidate: true, children: translate.t("submitAgain") }) })] }));
4677
4655
  }
4678
4656
  if (isConfirming) {
4679
- 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) => {
4680
- if (properties === undefined) {
4681
- return jsxRuntime.jsx(jsxRuntime.Fragment, {});
4682
- }
4683
- const key = column;
4684
- const values = properties[column];
4685
- const shouldIgnore = ignore.some((column) => {
4686
- return column == key;
4687
- });
4688
- if (shouldIgnore) {
4689
- return jsxRuntime.jsx(jsxRuntime.Fragment, {});
4690
- }
4691
- const { type, variant, gridColumn, gridRow, foreign_key } = values;
4692
- if (type === "string") {
4693
- if (variant === "id-picker") {
4694
- idPickerSanityCheck(column, foreign_key);
4695
- return (jsxRuntime.jsx(IdViewer, { value: (validatedData ?? {})[column], column,
4696
- dataListItemProps: { gridColumn, gridRow } }, `form-${key}`));
4697
- }
4698
- if (variant === "date-picker") {
4699
- const value = (validatedData ?? {})[column];
4700
- if (!!value === false) {
4701
- return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(undefined) }, `form-${key}`));
4702
- }
4703
- const date = dayjs(value).format("YYYY-MM-DD");
4704
- return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(date) }, `form-${key}`));
4705
- }
4706
- return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps((validatedData ?? {})[column]) }, `form-${key}`));
4707
- }
4708
- if (type === "object") {
4709
- const value = (validatedData ?? {})[column];
4710
- if (!!value === false) {
4711
- return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(undefined) }, `form-${key}`));
4712
- }
4713
- 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]) => {
4714
- return (jsxRuntime.jsx(DataListItem, { label: `${key}`, ...getDataListProps(value) }, `form-${column}-${key}`));
4715
- }) })] }, `form-${key}`));
4716
- }
4717
- if (type === "boolean") {
4718
- return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps((validatedData ?? {})[column]) }, `form-${key}`));
4719
- }
4720
- if (type === "number" || type === "integer") {
4721
- return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps((validatedData ?? {})[column]) }, `form-${key}`));
4722
- }
4723
- if (type === "array") {
4724
- if (variant === "tag-picker") {
4725
- const value = (validatedData ?? {})[column];
4726
- return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(JSON.stringify(value)) }, `form-${key}`));
4727
- }
4728
- if (variant === "file-picker") {
4729
- const fileNames = ((validatedData ?? {})[column] ?? []).map((file) => {
4730
- return file.name;
4731
- });
4732
- return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(JSON.stringify(fileNames)) }, `form-${key}`));
4733
- }
4734
- if (variant === "id-picker") {
4735
- const value = (validatedData ?? {})[column];
4736
- if (schema.properties == undefined) {
4737
- throw new Error("schema properties when using DatePicker");
4738
- }
4739
- const { foreign_key } = schema.properties[column];
4740
- if (foreign_key === undefined) {
4741
- throw new Error("foreign_key when variant is id-picker");
4742
- }
4743
- const { display_column } = foreign_key;
4744
- const mapped = value.map((item) => {
4745
- return idMap[item][display_column];
4746
- });
4747
- return (jsxRuntime.jsxs(react.Grid, { flexFlow: "column", gridColumn,
4748
- gridRow, children: [jsxRuntime.jsx(react.Text, { children: translate.t(`input.${column}`) }), jsxRuntime.jsx(RecordDisplay, { object: mapped })] }, `form-${key}`));
4749
- }
4750
- const objectString = JSON.stringify((validatedData ?? {})[column]);
4751
- return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(objectString) }, `form-${key}`));
4752
- }
4753
- if (type === "null") {
4754
- return jsxRuntime.jsx(jsxRuntime.Fragment, { children: `null ${column}` });
4755
- }
4756
- return jsxRuntime.jsx(jsxRuntime.Fragment, { children: `unknown type ${column}` });
4757
- }) }), jsxRuntime.jsx(Button, { onClick: () => {
4758
- onFormSubmit(validatedData);
4759
- }, children: translate.t("confirm") }), jsxRuntime.jsx(Button, { onClick: () => {
4760
- setIsConfirming(false);
4761
- }, 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)}` })] }) }) }) }) }))] }));
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: () => {
4658
+ setIsConfirming(false);
4659
+ }, variant: "subtle", children: translate.t("cancel") }), jsxRuntime.jsx(Button, { onClick: () => {
4660
+ onFormSubmit(validatedData);
4661
+ }, 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)}` })] }) }) }) }) }))] }));
4762
4662
  }
4763
- 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) => {
4764
- return (jsxRuntime.jsx(ColumnRenderer
4663
+ 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) => {
4664
+ return (jsxRuntime.jsx(ColumnRenderer
4665
+ // @ts-expect-error find suitable types
4666
+ , {
4765
4667
  // @ts-expect-error find suitable types
4766
- , {
4767
- // @ts-expect-error find suitable types
4768
- properties: properties, prefix: ``, column }, `form-${column}`));
4769
- }) }), jsxRuntime.jsx(Button, { onClick: () => {
4770
- methods.handleSubmit(onValid)();
4771
- }, formNoValidate: true, children: translate.t("submit") })] }), isError && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: ["isError", jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [" ", `${error}`] })] }))] }));
4668
+ properties: properties, prefix: ``, column }, `form-${column}`));
4669
+ }) }), jsxRuntime.jsxs(react.Flex, { justifyContent: "end", gap: "2", children: [jsxRuntime.jsx(Button, { onClick: () => {
4670
+ methods.reset();
4671
+ }, variant: "subtle", children: translate.t("reset") }), jsxRuntime.jsx(Button, { onClick: () => {
4672
+ methods.handleSubmit(onValid)();
4673
+ }, formNoValidate: true, children: translate.t("submit") })] })] }) }));
4772
4674
  };
4773
4675
  const Form = ({ schema, idMap, setIdMap, form, serverUrl, translate, order = [], ignore = [], onSubmit = undefined, rowNumber = undefined, requestOptions = {}, }) => {
4774
4676
  const { properties } = schema;
@@ -4790,7 +4692,9 @@ const Form = ({ schema, idMap, setIdMap, form, serverUrl, translate, order = [],
4790
4692
  };
4791
4693
 
4792
4694
  const useForm = ({ preLoadedValues, keyPrefix }) => {
4793
- const form = reactHookForm.useForm({ values: preLoadedValues });
4695
+ const form = reactHookForm.useForm({
4696
+ values: preLoadedValues,
4697
+ });
4794
4698
  const [idMap, setIdMap] = React.useState({});
4795
4699
  const translate = reactI18next.useTranslation("", { keyPrefix });
4796
4700
  return {
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
- import { Button as Button$1, AbsoluteCenter, Spinner, Span, IconButton, Portal, Dialog, RadioGroup as RadioGroup$1, Grid, Box, Slider as Slider$1, HStack, For, Flex, Text, Tag as Tag$1, Input, useDisclosure, DialogBackdrop, CheckboxCard as CheckboxCard$1, Menu, createRecipeContext, createContext as createContext$1, Pagination as Pagination$1, usePaginationContext, Image, Card, DataList, Checkbox as Checkbox$1, Table as Table$1, Tooltip as Tooltip$1, Group, InputElement, Icon, MenuRoot as MenuRoot$1, MenuTrigger as MenuTrigger$1, EmptyState as EmptyState$2, VStack, List, Alert, HoverCard, Accordion, Popover, Field as Field$1, NumberInput, Show, RadioCard, CheckboxGroup, Heading, Center } from '@chakra-ui/react';
2
+ import { Button as Button$1, AbsoluteCenter, Spinner, Span, IconButton, Portal, Dialog, RadioGroup as RadioGroup$1, Grid, Box, Slider as Slider$1, HStack, For, Flex, Text, Tag as Tag$1, Input, useDisclosure, DialogBackdrop, CheckboxCard as CheckboxCard$1, Menu, createRecipeContext, createContext as createContext$1, Pagination as Pagination$1, usePaginationContext, Image, Card, DataList, Checkbox as Checkbox$1, Table as Table$1, Tooltip as Tooltip$1, Group, InputElement, Icon, MenuRoot as MenuRoot$1, MenuTrigger as MenuTrigger$1, EmptyState as EmptyState$2, VStack, List, Alert, Accordion, Field as Field$1, Popover, NumberInput, Show, RadioCard, CheckboxGroup, Heading, Center } from '@chakra-ui/react';
3
3
  import { AiOutlineColumnWidth } from 'react-icons/ai';
4
4
  import * as React from 'react';
5
5
  import React__default, { createContext, useContext, useState, useEffect, useRef } from 'react';
@@ -24,11 +24,11 @@ import { useDebounce } from '@uidotdev/usehooks';
24
24
  import { useQueryClient, useQuery } from '@tanstack/react-query';
25
25
  import { IoReload } from 'react-icons/io5';
26
26
  import { GrAscend, GrDescend } from 'react-icons/gr';
27
- import { HiColorSwatch, HiOutlineInformationCircle } from 'react-icons/hi';
27
+ import { HiColorSwatch } from 'react-icons/hi';
28
28
  import { useTranslation } from 'react-i18next';
29
29
  import axios from 'axios';
30
+ import { useFormContext, useFieldArray, FormProvider, useForm as useForm$1 } from 'react-hook-form';
30
31
  import dayjs from 'dayjs';
31
- import { useFormContext, FormProvider, useForm as useForm$1 } from 'react-hook-form';
32
32
  import { TiDeleteOutline } from 'react-icons/ti';
33
33
 
34
34
  const DataTableContext = createContext({
@@ -3547,16 +3547,6 @@ const SchemaFormContext = createContext({
3547
3547
  requestOptions: {},
3548
3548
  });
3549
3549
 
3550
- const HoverCardContent = React.forwardRef(function HoverCardContent(props, ref) {
3551
- const { portalled = true, portalRef, ...rest } = props;
3552
- return (jsx(Portal, { disabled: !portalled, container: portalRef, children: jsx(HoverCard.Positioner, { children: jsx(HoverCard.Content, { ref: ref, ...rest }) }) }));
3553
- });
3554
- const HoverCardArrow = React.forwardRef(function HoverCardArrow(props, ref) {
3555
- return (jsx(HoverCard.Arrow, { ref: ref, ...props, children: jsx(HoverCard.ArrowTip, {}) }));
3556
- });
3557
- const HoverCardRoot = HoverCard.Root;
3558
- const HoverCardTrigger = HoverCard.Trigger;
3559
-
3560
3550
  const useSchemaContext = () => {
3561
3551
  const { schema, serverUrl, requestUrl, order, ignore, onSubmit, rowNumber, idMap, setIdMap, translate, requestOptions, } = useContext(SchemaFormContext);
3562
3552
  return {
@@ -3574,22 +3564,6 @@ const useSchemaContext = () => {
3574
3564
  };
3575
3565
  };
3576
3566
 
3577
- const IdViewer = ({ value, column }) => {
3578
- const { schema, idMap, translate } = useSchemaContext();
3579
- if (schema.properties == undefined) {
3580
- throw new Error("schema properties when using DatePicker");
3581
- }
3582
- const { foreign_key } = schema.properties[column];
3583
- if (foreign_key === undefined) {
3584
- throw new Error("foreign_key when variant is id-picker");
3585
- }
3586
- const { display_column } = foreign_key;
3587
- if (value === undefined) {
3588
- return (jsxs(Flex, { flexFlow: "column", children: [jsx(Text, { children: translate.t(`${column}.fieldLabel`) }), jsx(Text, { children: translate.t(`empty`) })] }));
3589
- }
3590
- return (jsxs(Flex, { flexFlow: "column", children: [jsx(Text, { children: translate.t(`${column}.fieldLabel`) }), jsxs(HoverCardRoot, { children: [jsx(HoverCardTrigger, { asChild: true, children: jsx(Text, { cursor: 'pointer', children: idMap[value][display_column] }) }), jsxs(HoverCardContent, { children: [jsx(HoverCardArrow, {}), jsx(RecordDisplay, { object: idMap[value] })] })] })] }));
3591
- };
3592
-
3593
3567
  const clearEmptyString = (object) => {
3594
3568
  return Object.fromEntries(Object.entries(object).filter(([, value]) => value !== ""));
3595
3569
  };
@@ -3604,20 +3578,24 @@ const AccordionItemContent = React.forwardRef(function AccordionItemContent(prop
3604
3578
  const AccordionRoot = Accordion.Root;
3605
3579
  const AccordionItem = Accordion.Item;
3606
3580
 
3607
- const ToggleTip = React.forwardRef(function ToggleTip(props, ref) {
3608
- const { showArrow, children, portalled = true, content, portalRef, ...rest } = props;
3609
- return (jsxs(Popover.Root, { ...rest, positioning: { ...rest.positioning, gutter: 4 }, children: [jsx(Popover.Trigger, { asChild: true, children: children }), jsx(Portal, { disabled: !portalled, container: portalRef, children: jsx(Popover.Positioner, { children: jsxs(Popover.Content, { width: "auto", px: "2", py: "1", textStyle: "xs", rounded: "sm", ref: ref, children: [showArrow && (jsx(Popover.Arrow, { children: jsx(Popover.ArrowTip, {}) })), content] }) }) })] }));
3610
- });
3611
- const InfoTip = React.forwardRef(function InfoTip(props, ref) {
3612
- const { children, ...rest } = props;
3613
- return (jsx(ToggleTip, { content: children, ...rest, ref: ref, children: jsx(IconButton, { variant: "ghost", "aria-label": "info", size: "2xs", colorPalette: "gray", children: jsx(HiOutlineInformationCircle, {}) }) }));
3614
- });
3615
-
3616
- const DataListRoot = DataList.Root;
3617
- const DataListItem = React.forwardRef(function DataListItem(props, ref) {
3618
- const { label, info, value, children, grow, ...rest } = props;
3619
- return (jsxs(DataList.Item, { ref: ref, ...rest, children: [jsxs(DataList.ItemLabel, { flex: grow ? "1" : undefined, children: [label, info && jsx(InfoTip, { children: info })] }), jsx(DataList.ItemValue, { flex: grow ? "1" : undefined, children: value }), children] }));
3620
- });
3581
+ const ArrayRenderer = ({ schema, column, prefix, }) => {
3582
+ const { gridRow, gridColumn = "1/span 12", required, items } = schema;
3583
+ const { translate } = useSchemaContext();
3584
+ const colLabel = `${prefix}${column}`;
3585
+ const isRequired = required?.some((columnId) => columnId === column);
3586
+ const { formState: { errors }, control, } = useFormContext();
3587
+ const { fields, append, prepend, remove, swap, move, insert } = useFieldArray({
3588
+ control, // control props comes from useForm (optional: if you are using FormContext)
3589
+ name: "test", // unique name for your Field Array
3590
+ });
3591
+ return (jsxs(Box, { gridRow, gridColumn, children: [jsxs(Box, { as: "label", gridColumn: "1/span12", children: [`${translate.t(`${colLabel}.fieldLabel`)}`, isRequired && jsx("span", { children: "*" })] }), fields.map((field, index) => (jsxs(Flex, { flexFlow: "column", children: [jsx(Grid, { gap: "4", padding: "4", gridTemplateColumns: "repeat(12, 1fr)", gridTemplateRows: `repeat("auto-fit", auto)`, children: jsx(SchemaRenderer, { column: `${column}.${index}`,
3592
+ prefix: `${prefix}`,
3593
+ schema: items }, `form-${column}`) }), jsx(Flex, { justifyContent: "end", children: jsx(Button$1, { variant: "ghost", onClick: () => {
3594
+ remove(index);
3595
+ }, children: translate.t(`${colLabel}.remove`) }) })] }))), jsx(Flex, { children: jsx(Button$1, { onClick: () => {
3596
+ append({});
3597
+ }, children: translate.t(`${colLabel}.add`) }) }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: translate.t(`${colLabel}.fieldRequired`) }))] }));
3598
+ };
3621
3599
 
3622
3600
  const Field = React.forwardRef(function Field(props, ref) {
3623
3601
  const { label, children, helperText, errorText, optionalText, ...rest } = props;
@@ -4330,16 +4308,21 @@ const NumberInputField = ({ schema, column, prefix, }) => {
4330
4308
  };
4331
4309
 
4332
4310
  const ObjectInput = ({ schema, column, prefix }) => {
4333
- const { properties } = schema;
4311
+ const { properties, gridRow, gridColumn = "1/span 12", required } = schema;
4312
+ const { translate } = useSchemaContext();
4313
+ const colLabel = `${prefix}${column}`;
4314
+ const isRequired = required?.some((columnId) => columnId === column);
4315
+ const { watch, formState: { errors }, setValue, control, } = useFormContext();
4334
4316
  if (properties === undefined) {
4335
4317
  throw new Error(`properties is undefined when using ObjectInput`);
4336
4318
  }
4337
- return (jsx(Fragment, { children: Object.keys(properties ?? {}).map((key) => {
4338
- console.log(properties, key, "gkor");
4339
- return (jsx(ColumnRenderer, { column: `${key}`,
4340
- prefix: `${prefix}${column}.`,
4341
- properties }, `form-${column}`));
4342
- }) }));
4319
+ return (jsxs(Box, { gridRow, gridColumn, children: [jsxs(Box, { as: "label", gridColumn: "1/span12", children: [`${translate.t(`${colLabel}.fieldLabel`)}`, isRequired && jsx("span", { children: "*" })] }), jsx(Grid, { gap: "4", padding: "4", gridTemplateColumns: "repeat(12, 1fr)", gridTemplateRows: `repeat("auto-fit", auto)`, children: Object.keys(properties ?? {}).map((key) => {
4320
+ return (
4321
+ // @ts-expect-error find suitable types
4322
+ jsx(ColumnRenderer, { column: `${key}`,
4323
+ prefix: `${prefix}${column}.`,
4324
+ properties }, `form-${column}`));
4325
+ }) }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: translate.t(`${colLabel}.fieldRequired`) }))] }));
4343
4326
  };
4344
4327
 
4345
4328
  const RecordInput = ({ column, schema, prefix }) => {
@@ -4413,13 +4396,13 @@ const RadioCardRoot = RadioCard.Root;
4413
4396
  RadioCard.Label;
4414
4397
  RadioCard.ItemIndicator;
4415
4398
 
4416
- const TagPicker = ({ column }) => {
4399
+ const TagPicker = ({ column, schema, prefix }) => {
4417
4400
  const { watch, formState: { errors }, setValue, } = useFormContext();
4418
- const { schema, serverUrl } = useSchemaContext();
4401
+ const { serverUrl } = useSchemaContext();
4419
4402
  if (schema.properties == undefined) {
4420
4403
  throw new Error("schema properties undefined when using DatePicker");
4421
4404
  }
4422
- const { gridColumn, gridRow, in_table, object_id_column } = schema.properties[column];
4405
+ const { gridColumn, gridRow, in_table, object_id_column } = schema;
4423
4406
  if (in_table === undefined) {
4424
4407
  throw new Error("in_table is undefined when using TagPicker");
4425
4408
  }
@@ -4445,7 +4428,7 @@ const TagPicker = ({ column }) => {
4445
4428
  });
4446
4429
  const object_id = watch(object_id_column);
4447
4430
  const existingTagsQuery = useQuery({
4448
- queryKey: [`existing`, in_table, object_id_column, object_id],
4431
+ queryKey: [`existing`, { in_table, object_id_column }, object_id],
4449
4432
  queryFn: async () => {
4450
4433
  return await getTableData({
4451
4434
  serverUrl,
@@ -4498,20 +4481,11 @@ const TagPicker = ({ column }) => {
4498
4481
  }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: (errors[`${column}`]?.message ?? "No error message") }))] }));
4499
4482
  };
4500
4483
 
4501
- const ColumnRenderer = ({ column, properties, prefix, }) => {
4502
- if (properties === undefined) {
4503
- return jsx(Fragment, {});
4504
- }
4505
- console.log(`${column} does not exist when using ColumnRenderer`, { properties,
4506
- column,
4507
- prefix, }, "fdpok");
4508
- const colSchema = properties[column];
4509
- if (colSchema === undefined) {
4510
- throw new Error(`${column} does not exist when using ColumnRenderer`);
4511
- }
4512
- const { type, variant, foreign_key, properties: innerProperties } = colSchema;
4484
+ const SchemaRenderer = ({ schema, prefix, column, }) => {
4485
+ const colSchema = schema;
4486
+ const { type, variant, properties: innerProperties, foreign_key, items, } = schema;
4513
4487
  if (type === "string") {
4514
- if ((properties[column].enum ?? []).length > 0) {
4488
+ if ((schema.enum ?? []).length > 0) {
4515
4489
  return jsx(EnumPicker, { schema: colSchema, prefix, column });
4516
4490
  }
4517
4491
  if (variant === "id-picker") {
@@ -4546,6 +4520,9 @@ const ColumnRenderer = ({ column, properties, prefix, }) => {
4546
4520
  if (variant === "file-picker") {
4547
4521
  return jsx(FilePicker, { schema: colSchema, prefix, column });
4548
4522
  }
4523
+ if (items) {
4524
+ return jsx(ArrayRenderer, { schema: colSchema, prefix, column });
4525
+ }
4549
4526
  return jsx(Text, { children: `array ${column}` });
4550
4527
  }
4551
4528
  if (type === "null") {
@@ -4554,6 +4531,18 @@ const ColumnRenderer = ({ column, properties, prefix, }) => {
4554
4531
  return jsx(Text, { children: "missing type" });
4555
4532
  };
4556
4533
 
4534
+ const ColumnRenderer = ({ column, properties, prefix, }) => {
4535
+ if (properties === undefined) {
4536
+ return jsx(Fragment, {});
4537
+ }
4538
+ console.log(`${column} does not exist when using ColumnRenderer`, { properties, column, prefix }, "fdpok");
4539
+ const colSchema = properties[column];
4540
+ if (colSchema === undefined) {
4541
+ throw new Error(`${column} does not exist when using ColumnRenderer`);
4542
+ }
4543
+ return jsx(SchemaRenderer, { schema: colSchema, prefix, column });
4544
+ };
4545
+
4557
4546
  const idPickerSanityCheck = (column, foreign_key) => {
4558
4547
  if (!!foreign_key == false) {
4559
4548
  throw new Error(`The key foreign_key does not exist in properties of column ${column} when using id-picker.`);
@@ -4634,121 +4623,34 @@ const FormInternal = () => {
4634
4623
  return [...order, ...not_exist];
4635
4624
  };
4636
4625
  const ordered = renderOrder(order, Object.keys(properties));
4637
- const getDataListProps = (value) => {
4638
- if (value == undefined || value.length <= 0) {
4639
- return {
4640
- value: `<${translate.t("empty") ?? "Empty"}>`,
4641
- color: "gray.400",
4642
- };
4643
- }
4644
- return {
4645
- value: value,
4646
- };
4647
- };
4648
4626
  if (isSuccess) {
4649
- return (jsxs(Grid, { gap: 2, children: [jsx(Heading, { children: translate.t("title") }), jsxs(Alert.Root, { status: "success", children: [jsx(Alert.Indicator, {}), jsx(Alert.Title, { children: translate.t("submitSuccess") })] }), jsx(Button, { onClick: () => {
4650
- setIsError(false);
4651
- setIsSubmiting(false);
4652
- setIsSuccess(false);
4653
- setIsConfirming(false);
4654
- setValidatedData(undefined);
4655
- methods.reset();
4656
- }, formNoValidate: true, children: translate.t("submitAgain") })] }));
4627
+ return (jsxs(Grid, { gap: 2, children: [jsx(Heading, { children: translate.t("title") }), jsxs(Alert.Root, { status: "success", children: [jsx(Alert.Indicator, {}), jsx(Alert.Title, { children: translate.t("submitSuccess") })] }), jsx(Flex, { justifyContent: "end", children: jsx(Button, { onClick: () => {
4628
+ setIsError(false);
4629
+ setIsSubmiting(false);
4630
+ setIsSuccess(false);
4631
+ setIsConfirming(false);
4632
+ setValidatedData(undefined);
4633
+ methods.reset();
4634
+ }, formNoValidate: true, children: translate.t("submitAgain") }) })] }));
4657
4635
  }
4658
4636
  if (isConfirming) {
4659
- return (jsxs(Grid, { gap: 2, children: [jsxs(Heading, { children: [" ", translate.t("title")] }), jsx(DataListRoot, { orientation: "horizontal", gap: 4, display: "grid", gridTemplateColumns: "repeat(12, 1fr)", gridTemplateRows: `repeat(${rowNumber ?? "auto-fit"}, auto)`, children: ordered.map((column) => {
4660
- if (properties === undefined) {
4661
- return jsx(Fragment, {});
4662
- }
4663
- const key = column;
4664
- const values = properties[column];
4665
- const shouldIgnore = ignore.some((column) => {
4666
- return column == key;
4667
- });
4668
- if (shouldIgnore) {
4669
- return jsx(Fragment, {});
4670
- }
4671
- const { type, variant, gridColumn, gridRow, foreign_key } = values;
4672
- if (type === "string") {
4673
- if (variant === "id-picker") {
4674
- idPickerSanityCheck(column, foreign_key);
4675
- return (jsx(IdViewer, { value: (validatedData ?? {})[column], column,
4676
- dataListItemProps: { gridColumn, gridRow } }, `form-${key}`));
4677
- }
4678
- if (variant === "date-picker") {
4679
- const value = (validatedData ?? {})[column];
4680
- if (!!value === false) {
4681
- return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(undefined) }, `form-${key}`));
4682
- }
4683
- const date = dayjs(value).format("YYYY-MM-DD");
4684
- return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(date) }, `form-${key}`));
4685
- }
4686
- return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps((validatedData ?? {})[column]) }, `form-${key}`));
4687
- }
4688
- if (type === "object") {
4689
- const value = (validatedData ?? {})[column];
4690
- if (!!value === false) {
4691
- return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(undefined) }, `form-${key}`));
4692
- }
4693
- return (jsxs(Flex, { flexFlow: "column", gap: 2, gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", children: [jsx(Text, { children: translate.t(`input.${column}`) }), jsx(DataListRoot, { orientation: "horizontal", padding: 4, borderColor: "gray.200", borderWidth: 1, borderRadius: 4, children: Object.entries(value).map(([key, value]) => {
4694
- return (jsx(DataListItem, { label: `${key}`, ...getDataListProps(value) }, `form-${column}-${key}`));
4695
- }) })] }, `form-${key}`));
4696
- }
4697
- if (type === "boolean") {
4698
- return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps((validatedData ?? {})[column]) }, `form-${key}`));
4699
- }
4700
- if (type === "number" || type === "integer") {
4701
- return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps((validatedData ?? {})[column]) }, `form-${key}`));
4702
- }
4703
- if (type === "array") {
4704
- if (variant === "tag-picker") {
4705
- const value = (validatedData ?? {})[column];
4706
- return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(JSON.stringify(value)) }, `form-${key}`));
4707
- }
4708
- if (variant === "file-picker") {
4709
- const fileNames = ((validatedData ?? {})[column] ?? []).map((file) => {
4710
- return file.name;
4711
- });
4712
- return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(JSON.stringify(fileNames)) }, `form-${key}`));
4713
- }
4714
- if (variant === "id-picker") {
4715
- const value = (validatedData ?? {})[column];
4716
- if (schema.properties == undefined) {
4717
- throw new Error("schema properties when using DatePicker");
4718
- }
4719
- const { foreign_key } = schema.properties[column];
4720
- if (foreign_key === undefined) {
4721
- throw new Error("foreign_key when variant is id-picker");
4722
- }
4723
- const { display_column } = foreign_key;
4724
- const mapped = value.map((item) => {
4725
- return idMap[item][display_column];
4726
- });
4727
- return (jsxs(Grid, { flexFlow: "column", gridColumn,
4728
- gridRow, children: [jsx(Text, { children: translate.t(`input.${column}`) }), jsx(RecordDisplay, { object: mapped })] }, `form-${key}`));
4729
- }
4730
- const objectString = JSON.stringify((validatedData ?? {})[column]);
4731
- return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(objectString) }, `form-${key}`));
4732
- }
4733
- if (type === "null") {
4734
- return jsx(Fragment, { children: `null ${column}` });
4735
- }
4736
- return jsx(Fragment, { children: `unknown type ${column}` });
4737
- }) }), jsx(Button, { onClick: () => {
4738
- onFormSubmit(validatedData);
4739
- }, children: translate.t("confirm") }), jsx(Button, { onClick: () => {
4740
- setIsConfirming(false);
4741
- }, variant: "subtle", children: translate.t("cancel") }), isSubmiting && (jsx(Box, { pos: "absolute", inset: "0", bg: "bg/80", children: jsx(Center, { h: "full", children: jsx(Spinner, { color: "teal.500" }) }) })), isError && (jsx(Fragment, { children: jsx(Alert.Root, { status: "error", children: jsx(Alert.Title, { children: jsx(AccordionRoot, { collapsible: true, defaultValue: ["b"], children: jsxs(AccordionItem, { value: "b", children: [jsxs(AccordionItemTrigger, { children: [jsx(Alert.Indicator, {}), `${error}`] }), jsx(AccordionItemContent, { children: `${JSON.stringify(error)}` })] }) }) }) }) }))] }));
4637
+ return (jsxs(Grid, { gap: 2, children: [jsxs(Heading, { children: [" ", translate.t("title")] }), jsx(Grid, { gap: 4, gridTemplateColumns: "repeat(12, 1fr)", gridTemplateRows: `repeat(${rowNumber ?? "auto-fit"}, auto)`, children: jsx(RecordDisplay, { object: validatedData ?? {}, boxProps: { gridColumn: "1/span12" } }) }), jsxs(Flex, { justifyContent: "end", gap: "2", children: [jsx(Button, { onClick: () => {
4638
+ setIsConfirming(false);
4639
+ }, variant: "subtle", children: translate.t("cancel") }), jsx(Button, { onClick: () => {
4640
+ onFormSubmit(validatedData);
4641
+ }, children: translate.t("confirm") })] }), isSubmiting && (jsx(Box, { pos: "absolute", inset: "0", bg: "bg/80", children: jsx(Center, { h: "full", children: jsx(Spinner, { color: "teal.500" }) }) })), isError && (jsx(Fragment, { children: jsx(Alert.Root, { status: "error", children: jsx(Alert.Title, { children: jsx(AccordionRoot, { collapsible: true, defaultValue: ["b"], children: jsxs(AccordionItem, { value: "b", children: [jsxs(AccordionItemTrigger, { children: [jsx(Alert.Indicator, {}), `${error}`] }), jsx(AccordionItemContent, { children: `${JSON.stringify(error)}` })] }) }) }) }) }))] }));
4742
4642
  }
4743
- return (jsxs(Fragment, { children: [jsxs(Grid, { gap: 2, children: [jsxs(Heading, { children: [" ", translate.t("title")] }), jsx(Grid, { gap: 4, gridTemplateColumns: "repeat(12, 1fr)", gridTemplateRows: `repeat(${rowNumber ?? "auto-fit"}, auto)`, children: ordered.map((column) => {
4744
- return (jsx(ColumnRenderer
4643
+ return (jsx(Fragment, { children: jsxs(Grid, { gap: "2", children: [jsxs(Heading, { children: [" ", translate.t("title")] }), jsx(Grid, { gap: "4", gridTemplateColumns: "repeat(12, 1fr)", gridTemplateRows: `repeat(${rowNumber ?? "auto-fit"}, auto)`, children: ordered.map((column) => {
4644
+ return (jsx(ColumnRenderer
4645
+ // @ts-expect-error find suitable types
4646
+ , {
4745
4647
  // @ts-expect-error find suitable types
4746
- , {
4747
- // @ts-expect-error find suitable types
4748
- properties: properties, prefix: ``, column }, `form-${column}`));
4749
- }) }), jsx(Button, { onClick: () => {
4750
- methods.handleSubmit(onValid)();
4751
- }, formNoValidate: true, children: translate.t("submit") })] }), isError && (jsxs(Fragment, { children: ["isError", jsxs(Fragment, { children: [" ", `${error}`] })] }))] }));
4648
+ properties: properties, prefix: ``, column }, `form-${column}`));
4649
+ }) }), jsxs(Flex, { justifyContent: "end", gap: "2", children: [jsx(Button, { onClick: () => {
4650
+ methods.reset();
4651
+ }, variant: "subtle", children: translate.t("reset") }), jsx(Button, { onClick: () => {
4652
+ methods.handleSubmit(onValid)();
4653
+ }, formNoValidate: true, children: translate.t("submit") })] })] }) }));
4752
4654
  };
4753
4655
  const Form = ({ schema, idMap, setIdMap, form, serverUrl, translate, order = [], ignore = [], onSubmit = undefined, rowNumber = undefined, requestOptions = {}, }) => {
4754
4656
  const { properties } = schema;
@@ -4770,7 +4672,9 @@ const Form = ({ schema, idMap, setIdMap, form, serverUrl, translate, order = [],
4770
4672
  };
4771
4673
 
4772
4674
  const useForm = ({ preLoadedValues, keyPrefix }) => {
4773
- const form = useForm$1({ values: preLoadedValues });
4675
+ const form = useForm$1({
4676
+ values: preLoadedValues,
4677
+ });
4774
4678
  const [idMap, setIdMap] = useState({});
4775
4679
  const translate = useTranslation("", { keyPrefix });
4776
4680
  return {
@@ -0,0 +1,7 @@
1
+ import { CustomJSONSchema7 } from "./StringInputField";
2
+ export interface ArrayRendererProps {
3
+ column: string;
4
+ schema: CustomJSONSchema7;
5
+ prefix: string;
6
+ }
7
+ export declare const ArrayRenderer: ({ schema, column, prefix, }: ArrayRendererProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,7 @@
1
+ import { CustomJSONSchema7 } from "./StringInputField";
2
+ export interface SchemaRendererProps {
3
+ column: string;
4
+ schema: CustomJSONSchema7;
5
+ prefix: string;
6
+ }
7
+ export declare const SchemaRenderer: ({ schema, prefix, column, }: SchemaRendererProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,5 +1,8 @@
1
+ import { CustomJSONSchema7 } from "./StringInputField";
1
2
  export interface TagPickerProps {
2
3
  column: string;
4
+ schema: CustomJSONSchema7;
5
+ prefix: string;
3
6
  }
4
7
  export interface Tag {
5
8
  id: string;
@@ -24,4 +27,4 @@ export interface TagData {
24
27
  export interface TagResponse {
25
28
  data: TagData[];
26
29
  }
27
- export declare const TagPicker: ({ column }: TagPickerProps) => import("react/jsx-runtime").JSX.Element;
30
+ export declare const TagPicker: ({ column, schema, prefix }: TagPickerProps) => import("react/jsx-runtime").JSX.Element;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bsol-oss/react-datatable5",
3
- "version": "11.0.0-beta.3",
3
+ "version": "11.0.0-beta.5",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",