@bsol-oss/react-datatable5 12.0.0-beta.91 → 12.0.0-beta.92

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 (23) hide show
  1. package/dist/index.d.ts +11 -5
  2. package/dist/index.js +345 -273
  3. package/dist/index.mjs +345 -274
  4. package/dist/types/components/DataTable/display/RecordDisplay.d.ts +2 -2
  5. package/dist/types/components/Form/SchemaFormContext.d.ts +2 -1
  6. package/dist/types/components/Form/components/core/FormRoot.d.ts +3 -4
  7. package/dist/types/components/Form/components/fields/ArrayRenderer.d.ts +1 -1
  8. package/dist/types/components/Form/components/fields/StringInputField.d.ts +0 -1
  9. package/dist/types/components/Form/components/fields/TextAreaInput.d.ts +0 -5
  10. package/dist/types/components/Form/components/types/CustomJSONSchema7.d.ts +8 -0
  11. package/dist/types/components/Form/components/viewers/ArrayViewer.d.ts +1 -1
  12. package/dist/types/components/Form/components/viewers/BooleanViewer.d.ts +1 -1
  13. package/dist/types/components/Form/components/viewers/DateTimeViewer.d.ts +1 -1
  14. package/dist/types/components/Form/components/viewers/DateViewer.d.ts +1 -1
  15. package/dist/types/components/Form/components/viewers/IdViewer.d.ts +1 -1
  16. package/dist/types/components/Form/components/viewers/ObjectViewer.d.ts +1 -1
  17. package/dist/types/components/Form/components/viewers/RecordViewer.d.ts +2 -2
  18. package/dist/types/components/Form/components/viewers/StringViewer.d.ts +1 -6
  19. package/dist/types/components/Form/components/viewers/TextAreaViewer.d.ts +1 -6
  20. package/dist/types/components/Form/components/viewers/TimeViewer.d.ts +1 -1
  21. package/dist/types/components/Form/utils/useFormI18n.d.ts +5 -3
  22. package/dist/types/components/ui/pagination.d.ts +10 -7
  23. package/package.json +4 -4
package/dist/index.js CHANGED
@@ -562,16 +562,111 @@ const { withContext } = react.createRecipeContext({ key: "button" });
562
562
  const LinkButton = withContext("a");
563
563
 
564
564
  const [RootPropsProvider, useRootProps] = react.createContext({
565
- name: "RootPropsProvider",
565
+ name: 'RootPropsProvider',
566
566
  });
567
567
  const variantMap = {
568
- outline: { default: "ghost", ellipsis: "plain", current: "outline" },
569
- solid: { default: "outline", ellipsis: "outline", current: "solid" },
570
- subtle: { default: "ghost", ellipsis: "plain", current: "subtle" },
568
+ outline: { default: 'ghost', ellipsis: 'plain', current: 'outline' },
569
+ solid: { default: 'outline', ellipsis: 'outline', current: 'solid' },
570
+ subtle: { default: 'ghost', ellipsis: 'plain', current: 'subtle' },
571
571
  };
572
572
  const PaginationRoot = React__namespace.forwardRef(function PaginationRoot(props, ref) {
573
- const { size = "sm", variant = "outline", getHref, ...rest } = props;
574
- return (jsxRuntime.jsx(RootPropsProvider, { value: { size, variantMap: variantMap[variant], getHref }, children: jsxRuntime.jsx(react.Pagination.Root, { ref: ref, type: getHref ? "link" : "button", ...rest }) }));
573
+ const { size = 'sm', variant = 'outline', getHref, siblingCount, minSiblingCount = 1, maxSiblingCount, ...rest } = props;
574
+ const containerRef = React__namespace.useRef(null);
575
+ const [calculatedSiblingCount, setCalculatedSiblingCount] = React__namespace.useState(siblingCount);
576
+ React__namespace.useEffect(() => {
577
+ if (siblingCount !== undefined || !containerRef.current) {
578
+ setCalculatedSiblingCount(siblingCount);
579
+ return;
580
+ }
581
+ const container = containerRef.current;
582
+ let rafId = null;
583
+ const calculateSiblingCount = () => {
584
+ if (!container)
585
+ return;
586
+ const width = container.offsetWidth;
587
+ if (width === 0)
588
+ return;
589
+ // Estimate button width based on size
590
+ // These are approximate widths including padding for different button sizes
591
+ const buttonWidthMap = {
592
+ xs: 28,
593
+ sm: 36,
594
+ md: 40,
595
+ lg: 44,
596
+ };
597
+ let buttonWidth = buttonWidthMap[size] || 36;
598
+ // Try to measure actual button if available (for more accuracy)
599
+ const buttons = container.querySelectorAll('button');
600
+ if (buttons.length > 0) {
601
+ const firstButton = buttons[0];
602
+ if (firstButton.offsetWidth > 0) {
603
+ // Use measured width, but account for text content variation
604
+ const measuredWidth = firstButton.offsetWidth;
605
+ // Page number buttons might be slightly wider due to text, use measured width
606
+ buttonWidth = Math.max(buttonWidth, measuredWidth);
607
+ }
608
+ }
609
+ // Account for prev/next buttons and gaps
610
+ // HStack gap is typically 8px in Chakra UI
611
+ const gap = 8;
612
+ const prevNextWidth = buttonWidth * 2 + gap;
613
+ const availableWidth = Math.max(0, width - prevNextWidth);
614
+ // Each page button takes buttonWidth + gap
615
+ const buttonWithGap = buttonWidth + gap;
616
+ const maxButtons = Math.floor(availableWidth / buttonWithGap);
617
+ // Calculate sibling count
618
+ // Minimum structure: [prev] [1] [current] [last] [next] = 5 buttons
619
+ // With siblings: [prev] [1] [...] [current-N] ... [current] ... [current+N] [...] [last] [next]
620
+ // We need: prev(1) + first(1) + ellipsis(1) + siblings*2 + current(1) + ellipsis(1) + last(1) + next(1)
621
+ // Minimum: 5 buttons (prev, first, current, last, next)
622
+ // With siblings: 5 + siblings*2 + ellipsis*2 (if needed)
623
+ const minRequired = 5;
624
+ const extraButtons = Math.max(0, maxButtons - minRequired);
625
+ // Calculate sibling count
626
+ // If we have enough space for ellipsis (2 buttons), account for that
627
+ let calculated = minSiblingCount;
628
+ if (extraButtons >= 4) {
629
+ // Space for ellipsis (2) + siblings
630
+ calculated = Math.floor((extraButtons - 2) / 2);
631
+ }
632
+ else if (extraButtons >= 2) {
633
+ // Space for some siblings but not ellipsis
634
+ calculated = Math.floor(extraButtons / 2);
635
+ }
636
+ // Apply max limit if provided
637
+ if (maxSiblingCount !== undefined) {
638
+ calculated = Math.min(calculated, maxSiblingCount);
639
+ }
640
+ setCalculatedSiblingCount(Math.max(minSiblingCount, calculated));
641
+ };
642
+ const resizeObserver = new ResizeObserver(() => {
643
+ // Use requestAnimationFrame to debounce and ensure DOM is updated
644
+ if (rafId !== null) {
645
+ cancelAnimationFrame(rafId);
646
+ }
647
+ rafId = requestAnimationFrame(calculateSiblingCount);
648
+ });
649
+ resizeObserver.observe(container);
650
+ // Initial calculation after a short delay to ensure buttons are rendered
651
+ const timeoutId = setTimeout(calculateSiblingCount, 100);
652
+ return () => {
653
+ resizeObserver.disconnect();
654
+ if (rafId !== null) {
655
+ cancelAnimationFrame(rafId);
656
+ }
657
+ clearTimeout(timeoutId);
658
+ };
659
+ }, [size, siblingCount, minSiblingCount, maxSiblingCount]);
660
+ const mergedRef = React__namespace.useCallback((node) => {
661
+ if (typeof ref === 'function') {
662
+ ref(node);
663
+ }
664
+ else if (ref) {
665
+ ref.current = node;
666
+ }
667
+ containerRef.current = node;
668
+ }, [ref]);
669
+ return (jsxRuntime.jsx(RootPropsProvider, { value: { size, variantMap: variantMap[variant], getHref }, children: jsxRuntime.jsx(react.Pagination.Root, { ref: mergedRef, type: getHref ? 'link' : 'button', siblingCount: calculatedSiblingCount, ...rest }) }));
575
670
  });
576
671
  const PaginationEllipsis = React__namespace.forwardRef(function PaginationEllipsis(props, ref) {
577
672
  const { size, variantMap } = useRootProps();
@@ -605,16 +700,16 @@ const PaginationNextTrigger = React__namespace.forwardRef(function PaginationNex
605
700
  });
606
701
  const PaginationItems = (props) => {
607
702
  return (jsxRuntime.jsx(react.Pagination.Context, { children: ({ pages }) => pages.map((page, index) => {
608
- return page.type === "ellipsis" ? (jsxRuntime.jsx(PaginationEllipsis, { index: index, ...props }, index)) : (jsxRuntime.jsx(PaginationItem, { type: "page", value: page.value, ...props }, index));
703
+ return page.type === 'ellipsis' ? (jsxRuntime.jsx(PaginationEllipsis, { index: index, ...props }, index)) : (jsxRuntime.jsx(PaginationItem, { type: "page", value: page.value, ...props }, index));
609
704
  }) }));
610
705
  };
611
706
  React__namespace.forwardRef(function PaginationPageText(props, ref) {
612
- const { format = "compact", ...rest } = props;
707
+ const { format = 'compact', ...rest } = props;
613
708
  const { page, totalPages, pageRange, count } = react.usePaginationContext();
614
709
  const content = React__namespace.useMemo(() => {
615
- if (format === "short")
710
+ if (format === 'short')
616
711
  return `${page} / ${totalPages}`;
617
- if (format === "compact")
712
+ if (format === 'compact')
618
713
  return `${page} / ${totalPages}`;
619
714
  return `${pageRange.start + 1} - ${Math.min(pageRange.end, count)} / ${count}`;
620
715
  }, [format, page, totalPages, pageRange, count]);
@@ -3102,14 +3197,14 @@ const DefaultCardTitle = () => {
3102
3197
  const TableCards = ({ isSelectable = false, showDisplayNameOnly = false, renderTitle = DefaultCardTitle, cardBodyProps = {}, }) => {
3103
3198
  const { table, rowSelection, setRowSelection } = useDataTableContext();
3104
3199
  return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: table.getRowModel().rows.map((row) => {
3105
- return (jsxRuntime.jsx(react.Card.Root, { flex: '1 0 20rem', children: jsxRuntime.jsxs(react.Card.Body, { display: 'flex', flexFlow: 'column', gap: '0.5rem', ...cardBodyProps, children: [isSelectable && (jsxRuntime.jsx(Checkbox, { isChecked: isRowSelected(row.id, rowSelection),
3200
+ return (jsxRuntime.jsx(react.Card.Root, { flex: '1 0 20rem', children: jsxRuntime.jsxs(react.Card.Body, { display: 'flex', flexFlow: 'column', gap: '0.5rem', ...cardBodyProps, children: [isSelectable && (jsxRuntime.jsx(Checkbox, { checked: isRowSelected(row.id, rowSelection),
3106
3201
  disabled: !canRowSelect(row),
3107
3202
  // indeterminate: row.getIsSomeSelected(),
3108
3203
  onChange: createRowToggleHandler(row, rowSelection, setRowSelection) })), renderTitle(row), jsxRuntime.jsx(react.Grid, { templateColumns: 'auto 1fr', gap: '1rem', children: row.getVisibleCells().map((cell) => {
3109
- return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs(react.Box, { children: [showDisplayNameOnly && (jsxRuntime.jsx(react.Text, { fontWeight: 'bold', children: cell.column.columnDef.meta?.displayName ??
3204
+ return (jsxRuntime.jsxs(react.Box, { display: "contents", children: [jsxRuntime.jsxs(react.Box, { children: [showDisplayNameOnly && (jsxRuntime.jsx(react.Text, { fontWeight: 'bold', children: cell.column.columnDef.meta?.displayName ??
3110
3205
  cell.column.id })), !showDisplayNameOnly && (jsxRuntime.jsx(jsxRuntime.Fragment, { children: reactTable.flexRender(cell.column.columnDef.header,
3111
3206
  // @ts-expect-error Assuming the CellContext interface is the same as HeaderContext
3112
- cell.getContext()) }))] }, `chakra-table-cardcolumnid-${row.id}`), jsxRuntime.jsx(react.Box, { justifySelf: 'end', children: reactTable.flexRender(cell.column.columnDef.cell, cell.getContext()) }, `chakra-table-cardcolumn-${row.id}`)] }));
3207
+ cell.getContext()) }))] }), jsxRuntime.jsx(react.Box, { justifySelf: 'end', children: reactTable.flexRender(cell.column.columnDef.cell, cell.getContext()) })] }, `chakra-table-cardcell-${cell.id}`));
3113
3208
  }) })] }) }, `chakra-table-card-${row.id}`));
3114
3209
  }) }));
3115
3210
  };
@@ -3140,9 +3235,13 @@ const TableFooter = ({ showSelector = false, alwaysShowSelector = true, }) => {
3140
3235
  }
3141
3236
  return false;
3142
3237
  };
3143
- return (jsxRuntime.jsx(react.Table.Footer, { children: table.getFooterGroups().map((footerGroup) => (jsxRuntime.jsxs(react.Table.Row, { display: 'flex', children: [showSelector && (jsxRuntime.jsxs(react.Table.Header, { padding: `${table.getDensityValue()}px`, onMouseEnter: () => handleRowHover(true), onMouseLeave: () => handleRowHover(false), display: 'grid', children: [isCheckBoxVisible() && (jsxRuntime.jsx(react.Box, { margin: '0rem', display: 'grid', justifyItems: 'center', alignItems: 'center', children: jsxRuntime.jsx(Checkbox, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px`, isChecked: areAllRowsSelected(table, rowSelection),
3144
- // indeterminate: areSomeRowsSelected(table, rowSelection),
3145
- onChange: createToggleAllRowsHandler(table, rowSelection, setRowSelection) }) })), !isCheckBoxVisible() && (jsxRuntime.jsx(react.Box, { as: "span", margin: '0rem', display: 'grid', justifyItems: 'center', alignItems: 'center', width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px` }))] })), footerGroup.headers.map((header) => (jsxRuntime.jsx(react.Table.Cell, { padding: '0', columnSpan: `${header.colSpan}`,
3238
+ return (jsxRuntime.jsx(react.Table.Footer, { children: table.getFooterGroups().map((footerGroup) => (jsxRuntime.jsxs(react.Table.Row, { display: 'flex', children: [showSelector && (jsxRuntime.jsx(react.Table.Cell, { padding: `${table.getDensityValue()}px`, onMouseEnter: () => handleRowHover(true), onMouseLeave: () => handleRowHover(false), display: 'grid', justifyItems: 'center', alignItems: 'center', color: {
3239
+ base: 'colorPalette.900',
3240
+ _dark: 'colorPalette.100',
3241
+ },
3242
+ bg: { base: 'colorPalette.50', _dark: 'colorPalette.950' }, children: isCheckBoxVisible() ? (jsxRuntime.jsx(Checkbox, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px`, checked: areAllRowsSelected(table, rowSelection),
3243
+ // indeterminate: areSomeRowsSelected(table, rowSelection),
3244
+ onChange: createToggleAllRowsHandler(table, rowSelection, setRowSelection) })) : (jsxRuntime.jsx(react.Box, { as: "span", width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px` })) })), footerGroup.headers.map((header) => (jsxRuntime.jsx(react.Table.Cell, { padding: '0', columnSpan: `${header.colSpan}`,
3146
3245
  // styling resize and pinning start
3147
3246
  maxWidth: `${header.getSize()}px`, width: `${header.getSize()}px`, display: 'grid', children: jsxRuntime.jsx(react.MenuRoot, { children: jsxRuntime.jsx(react.MenuTrigger, { asChild: true, children: jsxRuntime.jsx(react.Box, { padding: `${table.getDensityValue()}px`, display: 'flex', alignItems: 'center', justifyContent: 'start', borderRadius: '0rem', children: jsxRuntime.jsxs(react.Flex, { gap: "0.5rem", alignItems: 'center', children: [header.isPlaceholder
3148
3247
  ? null
@@ -3374,7 +3473,7 @@ const TextWithCopy = ({ text, globalFilter, highlightedText, }) => {
3374
3473
  const displayText = highlightedText !== undefined
3375
3474
  ? highlightedText
3376
3475
  : highlightText$1(textValue, globalFilter);
3377
- return (jsxRuntime.jsxs(react.HStack, { gap: 2, alignItems: "center", children: [jsxRuntime.jsx(react.Text, { as: "span", children: displayText }), jsxRuntime.jsx(react.Clipboard.Root, { value: textValue, children: jsxRuntime.jsx(react.Clipboard.Trigger, { asChild: true, children: jsxRuntime.jsx(react.IconButton, { size: "xs", variant: "ghost", "aria-label": "Copy", children: jsxRuntime.jsx(react.Clipboard.Indicator, { copied: jsxRuntime.jsx(lu.LuCheck, {}), children: jsxRuntime.jsx(lu.LuCopy, {}) }) }) }) })] }));
3476
+ return (jsxRuntime.jsxs(react.HStack, { gap: 2, alignItems: "center", children: [jsxRuntime.jsx(react.Text, { as: "span", children: displayText }), jsxRuntime.jsx(react.Clipboard.Root, { value: textValue, children: jsxRuntime.jsx(react.Clipboard.Trigger, { asChild: true, children: jsxRuntime.jsx(react.IconButton, { size: "xs", variant: "ghost", "aria-label": "Copy", fontSize: "1em", children: jsxRuntime.jsx(react.Clipboard.Indicator, { copied: jsxRuntime.jsx(lu.LuCheck, {}), children: jsxRuntime.jsx(lu.LuCopy, {}) }) }) }) })] }));
3378
3477
  };
3379
3478
 
3380
3479
  // Helper function to highlight matching text
@@ -3628,7 +3727,7 @@ const snakeToLabel = (str) => {
3628
3727
  .join(" "); // Join with space
3629
3728
  };
3630
3729
 
3631
- const RecordDisplay = ({ object, boxProps, translate, prefix = "", }) => {
3730
+ const RecordDisplay = ({ object, boxProps, translate, prefix = '', }) => {
3632
3731
  const getColumn = ({ field }) => {
3633
3732
  if (translate !== undefined) {
3634
3733
  return translate.t(`${prefix}${field}`);
@@ -3638,8 +3737,9 @@ const RecordDisplay = ({ object, boxProps, translate, prefix = "", }) => {
3638
3737
  if (object === null) {
3639
3738
  return jsxRuntime.jsx(jsxRuntime.Fragment, { children: "null" });
3640
3739
  }
3641
- return (jsxRuntime.jsx(react.Grid, { rowGap: 1, padding: 1, overflow: "auto", ...boxProps, children: Object.entries(object).map(([field, value]) => {
3642
- return (jsxRuntime.jsxs(react.Grid, { columnGap: 2, gridTemplateColumns: "auto 1fr", children: [jsxRuntime.jsx(react.Text, { color: "colorPalette.400", children: getColumn({ field }) }), typeof value === "object" ? (jsxRuntime.jsx(RecordDisplay, { object: value, prefix: `${prefix}${field}.`, translate: translate })) : (jsxRuntime.jsx(react.Text, { children: JSON.stringify(value) }))] }, field));
3740
+ return (jsxRuntime.jsx(react.Grid, { rowGap: 1, padding: 1, overflow: 'auto', ...boxProps, children: Object.entries(object).map(([field, value], index) => {
3741
+ const uniqueKey = `${prefix}${field}-${index}`;
3742
+ return (jsxRuntime.jsxs(react.Grid, { columnGap: 2, gridTemplateColumns: 'auto 1fr', children: [jsxRuntime.jsx(react.Text, { color: 'colorPalette.400', children: getColumn({ field }) }), typeof value === 'object' && value !== null ? (jsxRuntime.jsx(RecordDisplay, { object: value, prefix: `${prefix}${field}.`, translate: translate })) : (jsxRuntime.jsx(react.Text, { children: JSON.stringify(value) }))] }, uniqueKey));
3643
3743
  }) }));
3644
3744
  };
3645
3745
 
@@ -3930,13 +4030,10 @@ const idPickerSanityCheck = (column, foreign_key) => {
3930
4030
  if (!!foreign_key == false) {
3931
4031
  throw new Error(`The key foreign_key does not exist in properties of column ${column} when using id-picker.`);
3932
4032
  }
3933
- const { table, column: foreignKeyColumn, display_column } = foreign_key;
4033
+ const { table, column: foreignKeyColumn } = foreign_key;
3934
4034
  if (!!table == false) {
3935
4035
  throw new Error(`The key table does not exist in properties of column ${table} when using id-picker.`);
3936
4036
  }
3937
- if (!!display_column == false) {
3938
- throw new Error(`The key display_column does not exist in properties of column ${column} when using id-picker.`);
3939
- }
3940
4037
  if (!!foreignKeyColumn == false) {
3941
4038
  throw new Error(`The key column does not exist in properties of column ${column} when using id-picker.`);
3942
4039
  }
@@ -3945,7 +4042,7 @@ const FormRoot = ({ schema, idMap, setIdMap, form, serverUrl, translate, childre
3945
4042
  showSubmitButton: true,
3946
4043
  showResetButton: true,
3947
4044
  showTitle: true,
3948
- }, requireConfirmation = false, dateTimePickerLabels, idPickerLabels, enumPickerLabels, filePickerLabels, insideDialog = false, }) => {
4045
+ }, requireConfirmation = false, dateTimePickerLabels, idPickerLabels, enumPickerLabels, filePickerLabels, formButtonLabels, insideDialog = false, }) => {
3949
4046
  const [isSuccess, setIsSuccess] = React.useState(false);
3950
4047
  const [isError, setIsError] = React.useState(false);
3951
4048
  const [isSubmiting, setIsSubmiting] = React.useState(false);
@@ -4035,6 +4132,7 @@ const FormRoot = ({ schema, idMap, setIdMap, form, serverUrl, translate, childre
4035
4132
  idPickerLabels,
4036
4133
  enumPickerLabels,
4037
4134
  filePickerLabels,
4135
+ formButtonLabels,
4038
4136
  ajvResolver: ajvResolver(schema),
4039
4137
  insideDialog,
4040
4138
  }, children: jsxRuntime.jsx(reactHookForm.FormProvider, { ...form, children: children }) }));
@@ -4044,40 +4142,107 @@ function removeIndex(str) {
4044
4142
  return str.replace(/\.\d+\./g, ".");
4045
4143
  }
4046
4144
 
4145
+ /**
4146
+ * Custom hook to simplify i18n translation for form fields.
4147
+ * Automatically handles colLabel construction and removeIndex logic.
4148
+ *
4149
+ * @param column - The column name
4150
+ * @param prefix - The prefix for the field (usually empty string or parent path)
4151
+ * @returns Object with translation helper functions
4152
+ *
4153
+ * @example
4154
+ * ```tsx
4155
+ * const formI18n = useFormI18n(column, prefix);
4156
+ *
4157
+ * // Get field label
4158
+ * <Field label={formI18n.label()} />
4159
+ *
4160
+ * // Get error message
4161
+ * <Text>{formI18n.required()}</Text>
4162
+ *
4163
+ * // Get custom translation key
4164
+ * <Text>{formI18n.t('add_more')}</Text>
4165
+ *
4166
+ * // Access the raw colLabel
4167
+ * const colLabel = formI18n.colLabel;
4168
+ * ```
4169
+ */
4170
+ const useFormI18n$1 = (column, prefix = '', schema) => {
4171
+ const { translate } = useSchemaContext();
4172
+ const colLabel = `${prefix}${column}`;
4173
+ return {
4174
+ /**
4175
+ * The constructed column label (prefix + column)
4176
+ */
4177
+ colLabel,
4178
+ /**
4179
+ * Get the field label from schema title prop, or fall back to translation
4180
+ * Uses schema.title if available, otherwise: translate.t(removeIndex(`${colLabel}.field_label`))
4181
+ */
4182
+ label: (options) => {
4183
+ if (schema?.title) {
4184
+ return schema.title;
4185
+ }
4186
+ return translate.t(removeIndex(`${colLabel}.field_label`), options);
4187
+ },
4188
+ /**
4189
+ * Get the required error message translation
4190
+ * Equivalent to: translate.t(removeIndex(`${colLabel}.field_required`))
4191
+ */
4192
+ required: (options) => {
4193
+ return translate.t(removeIndex(`${colLabel}.field_required`), options);
4194
+ },
4195
+ /**
4196
+ * Get a translation for any custom key relative to the field
4197
+ * Equivalent to: translate.t(removeIndex(`${colLabel}.${key}`))
4198
+ *
4199
+ * @param key - The translation key suffix (e.g., 'add_more', 'total', etc.)
4200
+ * @param options - Optional translation options (e.g., defaultValue, interpolation variables)
4201
+ */
4202
+ t: (key, options) => {
4203
+ return translate.t(removeIndex(`${colLabel}.${key}`), options);
4204
+ },
4205
+ /**
4206
+ * Access to the original translate object for edge cases
4207
+ */
4208
+ translate,
4209
+ };
4210
+ };
4211
+
4047
4212
  const ArrayRenderer = ({ schema, column, prefix, }) => {
4048
- const { gridRow, gridColumn = "1/span 12", required, items } = schema;
4213
+ const { gridRow, gridColumn = '1/span 12', required, items } = schema;
4049
4214
  // @ts-expect-error TODO: find suitable types
4050
4215
  const { type } = items;
4051
- const { translate } = useSchemaContext();
4052
4216
  const colLabel = `${prefix}${column}`;
4053
4217
  const isRequired = required?.some((columnId) => columnId === column);
4218
+ const formI18n = useFormI18n$1(column, prefix, schema);
4054
4219
  const { formState: { errors }, setValue, watch, } = reactHookForm.useFormContext();
4055
4220
  const fields = (watch(colLabel) ?? []);
4056
- return (jsxRuntime.jsxs(react.Flex, { gridRow, gridColumn, flexFlow: "column", gap: 2, children: [jsxRuntime.jsxs(react.Box, { as: "label", children: [`${translate.t(removeIndex(`${colLabel}.field_label`))}`, isRequired && jsxRuntime.jsx("span", { children: "*" })] }), jsxRuntime.jsx(react.Flex, { flexFlow: "column", gap: 2, children: fields.map((field, index) => (jsxRuntime.jsxs(react.Grid, { gridTemplateColumns: '1fr auto', gap: 2, bgColor: { base: "colorPalette.100", _dark: "colorPalette.900" }, p: 2, borderRadius: 4, borderWidth: 1, borderColor: {
4057
- base: "colorPalette.200",
4058
- _dark: "colorPalette.800",
4059
- }, children: [jsxRuntime.jsx(react.Grid, { gridTemplateColumns: "repeat(12, 1fr)", autoFlow: "row", children: jsxRuntime.jsx(SchemaRenderer, { column: `${index}`,
4221
+ return (jsxRuntime.jsxs(react.Flex, { gridRow, gridColumn, flexFlow: 'column', gap: 2, children: [jsxRuntime.jsxs(react.Box, { as: "label", children: [formI18n.label(), isRequired && jsxRuntime.jsx("span", { children: "*" })] }), jsxRuntime.jsx(react.Flex, { flexFlow: 'column', gap: 2, children: fields.map((field, index) => (jsxRuntime.jsxs(react.Grid, { gridTemplateColumns: '1fr auto', gap: 2, bgColor: { base: 'colorPalette.100', _dark: 'colorPalette.900' }, p: 2, borderRadius: 4, borderWidth: 1, borderColor: {
4222
+ base: 'colorPalette.200',
4223
+ _dark: 'colorPalette.800',
4224
+ }, children: [jsxRuntime.jsx(react.Grid, { gridTemplateColumns: 'repeat(12, 1fr)', autoFlow: 'row', children: jsxRuntime.jsx(SchemaRenderer, { column: `${index}`,
4060
4225
  prefix: `${colLabel}.`,
4061
4226
  // @ts-expect-error find suitable types
4062
- schema: { showLabel: false, ...(items ?? {}) } }) }), jsxRuntime.jsx(react.Flex, { justifyContent: "end", children: jsxRuntime.jsx(react.Button, { variant: "ghost", onClick: () => {
4227
+ schema: { showLabel: false, ...(items ?? {}) } }) }), jsxRuntime.jsx(react.Flex, { justifyContent: 'end', children: jsxRuntime.jsx(react.Button, { variant: 'ghost', onClick: () => {
4063
4228
  setValue(colLabel, fields.filter((_, curIndex) => {
4064
4229
  return curIndex !== index;
4065
4230
  }));
4066
4231
  }, children: jsxRuntime.jsx(react.Icon, { children: jsxRuntime.jsx(cg.CgTrash, {}) }) }) })] }, `${colLabel}.${index}`))) }), jsxRuntime.jsx(react.Flex, { children: jsxRuntime.jsx(react.Button, { onClick: () => {
4067
- if (type === "number") {
4232
+ if (type === 'number') {
4068
4233
  setValue(colLabel, [...fields, 0]);
4069
4234
  return;
4070
4235
  }
4071
- if (type === "string") {
4072
- setValue(colLabel, [...fields, ""]);
4236
+ if (type === 'string') {
4237
+ setValue(colLabel, [...fields, '']);
4073
4238
  return;
4074
4239
  }
4075
- if (type === "boolean") {
4240
+ if (type === 'boolean') {
4076
4241
  setValue(colLabel, [...fields, false]);
4077
4242
  return;
4078
4243
  }
4079
4244
  setValue(colLabel, [...fields, {}]);
4080
- }, children: translate.t(removeIndex(`${colLabel}.add`)) }) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }));
4245
+ }, children: translate.t(removeIndex(`${colLabel}.add`)) }) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: 'red.400', children: formI18n.required() }))] }));
4081
4246
  };
4082
4247
 
4083
4248
  const Field = React__namespace.forwardRef(function Field(props, ref) {
@@ -4087,15 +4252,13 @@ const Field = React__namespace.forwardRef(function Field(props, ref) {
4087
4252
 
4088
4253
  const BooleanPicker = ({ schema, column, prefix }) => {
4089
4254
  const { watch, formState: { errors }, setValue, } = reactHookForm.useFormContext();
4090
- const { translate } = useSchemaContext();
4091
4255
  const { required, gridColumn = 'span 12', gridRow = 'span 1' } = schema;
4092
4256
  const isRequired = required?.some((columnId) => columnId === column);
4093
4257
  const colLabel = `${prefix}${column}`;
4094
4258
  const value = watch(colLabel);
4095
- return (jsxRuntime.jsx(Field, { label: `${translate.t(removeIndex(`${colLabel}.field_label`))}`, required: isRequired, alignItems: 'stretch', gridColumn,
4096
- gridRow, errorText: errors[`${colLabel}`]
4097
- ? translate.t(removeIndex(`${colLabel}.field_required`))
4098
- : undefined, invalid: !!errors[colLabel], children: jsxRuntime.jsx(CheckboxCard, { checked: value, variant: 'surface', onChange: () => {
4259
+ const formI18n = useFormI18n$1(column, prefix, schema);
4260
+ return (jsxRuntime.jsx(Field, { label: formI18n.label(), required: isRequired, alignItems: 'stretch', gridColumn,
4261
+ gridRow, errorText: errors[`${colLabel}`] ? formI18n.required() : undefined, invalid: !!errors[colLabel], children: jsxRuntime.jsx(CheckboxCard, { checked: value, variant: 'surface', onChange: () => {
4099
4262
  setValue(colLabel, !value);
4100
4263
  } }) }));
4101
4264
  };
@@ -4211,76 +4374,12 @@ let DatePicker$1 = class DatePicker extends React.Component {
4211
4374
  }
4212
4375
  };
4213
4376
 
4214
- /**
4215
- * Custom hook to simplify i18n translation for form fields.
4216
- * Automatically handles colLabel construction and removeIndex logic.
4217
- *
4218
- * @param column - The column name
4219
- * @param prefix - The prefix for the field (usually empty string or parent path)
4220
- * @returns Object with translation helper functions
4221
- *
4222
- * @example
4223
- * ```tsx
4224
- * const formI18n = useFormI18n(column, prefix);
4225
- *
4226
- * // Get field label
4227
- * <Field label={formI18n.label()} />
4228
- *
4229
- * // Get error message
4230
- * <Text>{formI18n.required()}</Text>
4231
- *
4232
- * // Get custom translation key
4233
- * <Text>{formI18n.t('add_more')}</Text>
4234
- *
4235
- * // Access the raw colLabel
4236
- * const colLabel = formI18n.colLabel;
4237
- * ```
4238
- */
4239
- const useFormI18n = (column, prefix = "") => {
4240
- const { translate } = useSchemaContext();
4241
- const colLabel = `${prefix}${column}`;
4242
- return {
4243
- /**
4244
- * The constructed column label (prefix + column)
4245
- */
4246
- colLabel,
4247
- /**
4248
- * Get the field label translation
4249
- * Equivalent to: translate.t(removeIndex(`${colLabel}.field_label`))
4250
- */
4251
- label: (options) => {
4252
- return translate.t(removeIndex(`${colLabel}.field_label`), options);
4253
- },
4254
- /**
4255
- * Get the required error message translation
4256
- * Equivalent to: translate.t(removeIndex(`${colLabel}.field_required`))
4257
- */
4258
- required: (options) => {
4259
- return translate.t(removeIndex(`${colLabel}.field_required`), options);
4260
- },
4261
- /**
4262
- * Get a translation for any custom key relative to the field
4263
- * Equivalent to: translate.t(removeIndex(`${colLabel}.${key}`))
4264
- *
4265
- * @param key - The translation key suffix (e.g., 'add_more', 'total', etc.)
4266
- * @param options - Optional translation options (e.g., defaultValue, interpolation variables)
4267
- */
4268
- t: (key, options) => {
4269
- return translate.t(removeIndex(`${colLabel}.${key}`), options);
4270
- },
4271
- /**
4272
- * Access to the original translate object for edge cases
4273
- */
4274
- translate,
4275
- };
4276
- };
4277
-
4278
4377
  dayjs.extend(utc);
4279
4378
  dayjs.extend(timezone);
4280
4379
  const DatePicker = ({ column, schema, prefix }) => {
4281
4380
  const { watch, formState: { errors }, setValue, } = reactHookForm.useFormContext();
4282
4381
  const { timezone, dateTimePickerLabels, insideDialog } = useSchemaContext();
4283
- const formI18n = useFormI18n(column, prefix);
4382
+ const formI18n = useFormI18n$1(column, prefix, schema);
4284
4383
  const { required, gridColumn = 'span 12', gridRow = 'span 1', displayDateFormat = 'YYYY-MM-DD', dateFormat = 'YYYY-MM-DD', } = schema;
4285
4384
  const isRequired = required?.some((columnId) => columnId === column);
4286
4385
  const colLabel = formI18n.colLabel;
@@ -4398,7 +4497,7 @@ dayjs.extend(timezone);
4398
4497
  const DateRangePicker = ({ column, schema, prefix, }) => {
4399
4498
  const { watch, formState: { errors }, setValue, } = reactHookForm.useFormContext();
4400
4499
  const { timezone, insideDialog } = useSchemaContext();
4401
- const formI18n = useFormI18n(column, prefix);
4500
+ const formI18n = useFormI18n$1(column, prefix);
4402
4501
  const { required, gridColumn = 'span 12', gridRow = 'span 1', displayDateFormat = 'YYYY-MM-DD', dateFormat = 'YYYY-MM-DD', } = schema;
4403
4502
  const isRequired = required?.some((columnId) => columnId === column);
4404
4503
  const colLabel = formI18n.colLabel;
@@ -4496,7 +4595,7 @@ const DateRangePicker = ({ column, schema, prefix, }) => {
4496
4595
  const EnumPicker = ({ column, isMultiple = false, schema, prefix, showTotalAndLimit = false, }) => {
4497
4596
  const { watch, formState: { errors }, setValue, } = reactHookForm.useFormContext();
4498
4597
  const { enumPickerLabels, insideDialog } = useSchemaContext();
4499
- const formI18n = useFormI18n(column, prefix);
4598
+ const formI18n = useFormI18n$1(column, prefix, schema);
4500
4599
  const { required, variant } = schema;
4501
4600
  const isRequired = required?.some((columnId) => columnId === column);
4502
4601
  const { gridColumn = 'span 12', gridRow = 'span 1', renderDisplay } = schema;
@@ -5140,7 +5239,7 @@ function MediaBrowserDialog({ open, onClose, onSelect, title, filterImageOnly =
5140
5239
  const FilePicker = ({ column, schema, prefix }) => {
5141
5240
  const { setValue, formState: { errors }, watch, } = reactHookForm.useFormContext();
5142
5241
  const { filePickerLabels } = useSchemaContext();
5143
- const formI18n = useFormI18n(column, prefix);
5242
+ const formI18n = useFormI18n$1(column, prefix);
5144
5243
  const { required, gridColumn = 'span 12', gridRow = 'span 1', type, } = schema;
5145
5244
  const isRequired = required?.some((columnId) => columnId === column);
5146
5245
  const isSingleSelect = type === 'string';
@@ -5216,7 +5315,7 @@ const FilePicker = ({ column, schema, prefix }) => {
5216
5315
  const FormMediaLibraryBrowser = ({ column, schema, prefix, }) => {
5217
5316
  const { setValue, formState: { errors }, watch, } = reactHookForm.useFormContext();
5218
5317
  const { filePickerLabels } = useSchemaContext();
5219
- const formI18n = useFormI18n(column, prefix);
5318
+ const formI18n = useFormI18n$1(column, prefix);
5220
5319
  const { required, gridColumn = 'span 12', gridRow = 'span 1', filePicker, type, } = schema;
5221
5320
  const isRequired = required?.some((columnId) => columnId === column);
5222
5321
  const isSingleSelect = type === 'string';
@@ -5357,13 +5456,18 @@ const getTableData = async ({ serverUrl, in_table, searching = "", where = [], l
5357
5456
  }
5358
5457
  };
5359
5458
 
5459
+ // Default renderDisplay function that stringifies JSON
5460
+ const defaultRenderDisplay = (item) => {
5461
+ return JSON.stringify(item);
5462
+ };
5463
+
5360
5464
  const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
5361
5465
  const { watch, getValues, formState: { errors }, setValue, } = reactHookForm.useFormContext();
5362
5466
  const { serverUrl, idMap, setIdMap, idPickerLabels, insideDialog } = useSchemaContext();
5363
- const formI18n = useFormI18n(column, prefix);
5467
+ const formI18n = useFormI18n$1(column, prefix, schema);
5364
5468
  const { required, gridColumn = 'span 12', gridRow = 'span 1', renderDisplay, foreign_key, } = schema;
5365
5469
  const isRequired = required?.some((columnId) => columnId === column);
5366
- const { table, column: column_ref, display_column, customQueryFn, } = foreign_key;
5470
+ const { table, column: column_ref, customQueryFn, } = foreign_key;
5367
5471
  const [searchText, setSearchText] = React.useState('');
5368
5472
  const [debouncedSearchText, setDebouncedSearchText] = React.useState('');
5369
5473
  const [limit] = React.useState(50); // Increased limit for combobox
@@ -5444,12 +5548,16 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
5444
5548
  // label is used for filtering/searching (must be a string)
5445
5549
  // raw item is stored for custom rendering
5446
5550
  const comboboxItems = React.useMemo(() => {
5447
- return dataList.map((item) => ({
5448
- label: String(item[display_column] ?? ''), // Always use display_column for filtering
5449
- value: String(item[column_ref]),
5450
- raw: item,
5451
- }));
5452
- }, [dataList, display_column, column_ref]);
5551
+ const renderFn = renderDisplay || defaultRenderDisplay;
5552
+ return dataList.map((item) => {
5553
+ const rendered = renderFn(item);
5554
+ return {
5555
+ label: typeof rendered === 'string' ? rendered : JSON.stringify(item), // Use string for filtering
5556
+ value: String(item[column_ref]),
5557
+ raw: item,
5558
+ };
5559
+ });
5560
+ }, [dataList, column_ref, renderDisplay]);
5453
5561
  // Use filter hook for combobox
5454
5562
  const { contains } = react.useFilter({ sensitivity: 'base' });
5455
5563
  // Create collection for combobox
@@ -5495,9 +5603,9 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
5495
5603
  return (jsxRuntime.jsx(Tag, { closable: true, onClick: () => {
5496
5604
  const newValue = currentValue.filter((itemId) => itemId !== id);
5497
5605
  setValue(colLabel, newValue);
5498
- }, children: !!renderDisplay === true
5606
+ }, children: renderDisplay
5499
5607
  ? renderDisplay(item)
5500
- : item[display_column] }, id));
5608
+ : defaultRenderDisplay(item) }, id));
5501
5609
  }) })), jsxRuntime.jsxs(react.Combobox.Root, { collection: collection, value: currentValue, onValueChange: handleValueChange, onInputValueChange: handleInputValueChange, multiple: isMultiple, closeOnSelect: !isMultiple, openOnClick: true, invalid: !!errors[colLabel], width: "100%", positioning: insideDialog
5502
5610
  ? { strategy: 'fixed', hideWhenDetached: true }
5503
5611
  : undefined, children: [jsxRuntime.jsxs(react.Combobox.Control, { children: [jsxRuntime.jsx(react.Combobox.Input, { placeholder: idPickerLabels?.typeToSearch ?? formI18n.t('type_to_search') }), jsxRuntime.jsxs(react.Combobox.IndicatorGroup, { children: [(isFetching || isLoading || isPending) && jsxRuntime.jsx(react.Spinner, { size: "xs" }), isError && (jsxRuntime.jsx(react.Icon, { color: "fg.error", children: jsxRuntime.jsx(bi.BiError, {}) })), !isMultiple && currentValue.length > 0 && (jsxRuntime.jsx(react.Combobox.ClearTrigger, { onClick: () => {
@@ -5586,15 +5694,15 @@ const extractErrorMessage = (error) => {
5586
5694
 
5587
5695
  const NumberInputField = ({ schema, column, prefix, }) => {
5588
5696
  const { setValue, formState: { errors }, watch, } = reactHookForm.useFormContext();
5589
- const { translate } = useSchemaContext();
5590
5697
  const { required, gridColumn = 'span 12', gridRow = 'span 1', numberStorageType = 'number', } = schema;
5591
5698
  const isRequired = required?.some((columnId) => columnId === column);
5592
5699
  const colLabel = `${prefix}${column}`;
5593
5700
  const value = watch(`${colLabel}`);
5594
5701
  const fieldError = getFieldError(errors, colLabel);
5595
- return (jsxRuntime.jsx(Field, { label: `${translate.t(removeIndex(`${colLabel}.field_label`))}`, required: isRequired, gridColumn, gridRow, errorText: fieldError
5702
+ const formI18n = useFormI18n$1(column, prefix, schema);
5703
+ return (jsxRuntime.jsx(Field, { label: formI18n.label(), required: isRequired, gridColumn, gridRow, errorText: fieldError
5596
5704
  ? fieldError.includes('required')
5597
- ? translate.t(removeIndex(`${colLabel}.field_required`))
5705
+ ? formI18n.required()
5598
5706
  : fieldError
5599
5707
  : undefined, invalid: !!fieldError, children: jsxRuntime.jsx(NumberInputRoot, { value: value, onValueChange: (details) => {
5600
5708
  // Store as string or number based on configuration, default to number
@@ -5607,14 +5715,14 @@ const NumberInputField = ({ schema, column, prefix, }) => {
5607
5715
 
5608
5716
  const ObjectInput = ({ schema, column, prefix }) => {
5609
5717
  const { properties, gridColumn = 'span 12', gridRow = 'span 1', required, showLabel = true, } = schema;
5610
- const { translate } = useSchemaContext();
5611
5718
  const colLabel = `${prefix}${column}`;
5612
5719
  const isRequired = required?.some((columnId) => columnId === column);
5720
+ const formI18n = useFormI18n$1(column, prefix, schema);
5613
5721
  const { formState: { errors }, } = reactHookForm.useFormContext();
5614
5722
  if (properties === undefined) {
5615
5723
  throw new Error(`properties is undefined when using ObjectInput`);
5616
5724
  }
5617
- return (jsxRuntime.jsxs(react.Box, { gridRow, gridColumn, children: [showLabel && (jsxRuntime.jsxs(react.Box, { as: "label", children: [`${translate.t(removeIndex(`${colLabel}.field_label`))}`, isRequired && jsxRuntime.jsx("span", { children: "*" })] })), jsxRuntime.jsx(react.Grid, { bgColor: { base: 'colorPalette.100', _dark: 'colorPalette.900' }, p: 2, borderRadius: 4, borderWidth: 1, borderColor: {
5725
+ return (jsxRuntime.jsxs(react.Box, { gridRow, gridColumn, children: [showLabel && (jsxRuntime.jsxs(react.Box, { as: "label", children: [formI18n.label(), isRequired && jsxRuntime.jsx("span", { children: "*" })] })), jsxRuntime.jsx(react.Grid, { bgColor: { base: 'colorPalette.100', _dark: 'colorPalette.900' }, p: 2, borderRadius: 4, borderWidth: 1, borderColor: {
5618
5726
  base: 'colorPalette.200',
5619
5727
  _dark: 'colorPalette.800',
5620
5728
  }, gap: "4", padding: '4', gridTemplateColumns: 'repeat(12, 1fr)', autoFlow: 'row', children: Object.keys(properties ?? {}).map((key) => {
@@ -5624,10 +5732,10 @@ const ObjectInput = ({ schema, column, prefix }) => {
5624
5732
  prefix: `${prefix}${column}.`,
5625
5733
  properties,
5626
5734
  parentRequired: required }, `form-${colLabel}-${key}`));
5627
- }) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: 'red.400', children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }));
5735
+ }) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: 'red.400', children: formI18n.required() }))] }));
5628
5736
  };
5629
5737
 
5630
- const RecordInput$1 = ({ column, schema, prefix }) => {
5738
+ const RecordInput = ({ column, schema, prefix }) => {
5631
5739
  const { formState: { errors }, setValue, getValues, } = reactHookForm.useFormContext();
5632
5740
  const { translate } = useSchemaContext();
5633
5741
  const { required, gridColumn = 'span 12', gridRow = 'span 1' } = schema;
@@ -5636,9 +5744,8 @@ const RecordInput$1 = ({ column, schema, prefix }) => {
5636
5744
  const [showNewEntries, setShowNewEntries] = React.useState(false);
5637
5745
  const [newKey, setNewKey] = React.useState();
5638
5746
  const [newValue, setNewValue] = React.useState();
5639
- return (jsxRuntime.jsxs(Field, { label: `${translate.t(`${column}.field_label`)}`, required: isRequired, alignItems: 'stretch', gridColumn, gridRow, errorText: errors[`${column}`]
5640
- ? translate.t(`${column}.field_required`)
5641
- : undefined, invalid: !!errors[column], children: [entries.map(([key, value]) => {
5747
+ const formI18n = useFormI18n$1(column, prefix, schema);
5748
+ return (jsxRuntime.jsxs(Field, { label: formI18n.label(), required: isRequired, alignItems: 'stretch', gridColumn, gridRow, errorText: errors[`${column}`] ? formI18n.required() : undefined, invalid: !!errors[column], children: [entries.map(([key, value]) => {
5642
5749
  return (jsxRuntime.jsxs(react.Grid, { templateColumns: '1fr 1fr auto', gap: 1, children: [jsxRuntime.jsx(react.Input, { value: key, onChange: (e) => {
5643
5750
  const filtered = entries.filter(([target]) => {
5644
5751
  return target !== key;
@@ -5683,12 +5790,12 @@ const RecordInput$1 = ({ column, schema, prefix }) => {
5683
5790
 
5684
5791
  const StringInputField = ({ column, schema, prefix, }) => {
5685
5792
  const { register, formState: { errors }, } = reactHookForm.useFormContext();
5686
- const { translate } = useSchemaContext();
5687
5793
  const { required, gridColumn = 'span 12', gridRow = 'span 1' } = schema;
5688
5794
  const isRequired = required?.some((columnId) => columnId === column);
5689
5795
  const colLabel = `${prefix}${column}`;
5690
5796
  const fieldError = getFieldError(errors, colLabel);
5691
- return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx(Field, { label: `${translate.t(removeIndex(`${colLabel}.field_label`))}`, required: isRequired, gridColumn: gridColumn, gridRow: gridRow, errorText: fieldError, invalid: !!fieldError, children: jsxRuntime.jsx(react.Input, { ...register(`${colLabel}`, { required: isRequired }), autoComplete: "off" }) }) }));
5797
+ const formI18n = useFormI18n$1(column, prefix, schema);
5798
+ return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx(Field, { label: formI18n.label(), required: isRequired, gridColumn: gridColumn, gridRow: gridRow, errorText: fieldError, invalid: !!fieldError, children: jsxRuntime.jsx(react.Input, { ...register(`${colLabel}`, { required: isRequired }), autoComplete: "off" }) }) }));
5692
5799
  };
5693
5800
 
5694
5801
  const RadioCardItem = React__namespace.forwardRef(function RadioCardItem(props, ref) {
@@ -5873,17 +5980,17 @@ Textarea.displayName = "Textarea";
5873
5980
 
5874
5981
  const TextAreaInput = ({ column, schema, prefix, }) => {
5875
5982
  const { register, formState: { errors }, } = reactHookForm.useFormContext();
5876
- const { translate } = useSchemaContext();
5877
5983
  const { required, gridColumn = 'span 12', gridRow = 'span 1' } = schema;
5878
5984
  const isRequired = required?.some((columnId) => columnId === column);
5879
5985
  const colLabel = `${prefix}${column}`;
5880
5986
  const form = reactHookForm.useFormContext();
5881
5987
  const { setValue, watch } = form;
5882
5988
  const fieldError = getFieldError(errors, colLabel);
5989
+ const formI18n = useFormI18n$1(column, prefix, schema);
5883
5990
  const watchValue = watch(colLabel);
5884
- return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx(Field, { label: `${translate.t(removeIndex(`${colLabel}.field_label`))}`, required: isRequired, gridColumn: gridColumn ?? 'span 4', gridRow: gridRow ?? 'span 1', display: "grid", errorText: fieldError
5991
+ return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx(Field, { label: formI18n.label(), required: isRequired, gridColumn: gridColumn ?? 'span 4', gridRow: gridRow ?? 'span 1', display: "grid", errorText: fieldError
5885
5992
  ? fieldError.includes('required')
5886
- ? translate.t(removeIndex(`${colLabel}.field_required`))
5993
+ ? formI18n.required()
5887
5994
  : fieldError
5888
5995
  : undefined, invalid: !!fieldError, children: jsxRuntime.jsx(Textarea, { value: watchValue, onChange: (value) => setValue(colLabel, value) }) }) }));
5889
5996
  };
@@ -6205,10 +6312,11 @@ onChange = (_newValue) => { }, timezone = 'Asia/Hong_Kong', startTime, selectedD
6205
6312
  dayjs.extend(timezone);
6206
6313
  const TimePicker = ({ column, schema, prefix }) => {
6207
6314
  const { watch, formState: { errors }, setValue, } = reactHookForm.useFormContext();
6208
- const { translate, timezone, insideDialog } = useSchemaContext();
6315
+ const { timezone, insideDialog } = useSchemaContext();
6209
6316
  const { required, gridColumn = 'span 12', gridRow = 'span 1', timeFormat = 'HH:mm:ssZ', displayTimeFormat = 'hh:mm A', } = schema;
6210
6317
  const isRequired = required?.some((columnId) => columnId === column);
6211
6318
  const colLabel = `${prefix}${column}`;
6319
+ const formI18n = useFormI18n$1(column, prefix, schema);
6212
6320
  const [open, setOpen] = React.useState(false);
6213
6321
  const value = watch(colLabel);
6214
6322
  const displayedTime = dayjs(`1970-01-01T${value}`).tz(timezone).isValid()
@@ -6263,10 +6371,8 @@ const TimePicker = ({ column, schema, prefix }) => {
6263
6371
  const timeString = getTimeString(newHour, newMinute, newMeridiem);
6264
6372
  setValue(colLabel, timeString, { shouldValidate: true, shouldDirty: true });
6265
6373
  };
6266
- return (jsxRuntime.jsx(Field, { label: `${translate.t(removeIndex(`${colLabel}.field_label`))}`, required: isRequired, alignItems: 'stretch', gridColumn,
6267
- gridRow, errorText: errors[`${colLabel}`]
6268
- ? translate.t(removeIndex(`${colLabel}.field_required`))
6269
- : undefined, invalid: !!errors[colLabel], children: jsxRuntime.jsxs(react.Popover.Root, { open: open, onOpenChange: (e) => setOpen(e.open), closeOnInteractOutside: true, children: [jsxRuntime.jsx(react.Popover.Trigger, { asChild: true, children: jsxRuntime.jsxs(Button, { size: "sm", variant: "outline", onClick: () => {
6374
+ return (jsxRuntime.jsx(Field, { label: formI18n.label(), required: isRequired, alignItems: 'stretch', gridColumn,
6375
+ gridRow, errorText: errors[`${colLabel}`] ? formI18n.required() : undefined, invalid: !!errors[colLabel], children: jsxRuntime.jsxs(react.Popover.Root, { open: open, onOpenChange: (e) => setOpen(e.open), closeOnInteractOutside: true, children: [jsxRuntime.jsx(react.Popover.Trigger, { asChild: true, children: jsxRuntime.jsxs(Button, { size: "sm", variant: "outline", onClick: () => {
6270
6376
  setOpen(true);
6271
6377
  }, justifyContent: 'start', children: [jsxRuntime.jsx(io.IoMdClock, {}), !!value ? `${displayedTime}` : ''] }) }), insideDialog ? (jsxRuntime.jsx(react.Popover.Positioner, { children: jsxRuntime.jsx(react.Popover.Content, { maxH: "70vh", overflowY: "auto", children: jsxRuntime.jsx(react.Popover.Body, { overflow: "visible", children: jsxRuntime.jsx(TimePicker$1, { hour: hour, setHour: setHour, minute: minute, setMinute: setMinute, meridiem: meridiem, setMeridiem: setMeridiem, onChange: handleTimeChange, meridiemLabel: {
6272
6378
  am: translate.t(`common.am`, { defaultValue: 'AM' }),
@@ -7156,7 +7262,7 @@ dayjs.extend(timezone);
7156
7262
  const DateTimePicker = ({ column, schema, prefix, }) => {
7157
7263
  const { watch, formState: { errors }, setValue, } = reactHookForm.useFormContext();
7158
7264
  const { timezone, dateTimePickerLabels, insideDialog } = useSchemaContext();
7159
- const formI18n = useFormI18n(column, prefix);
7265
+ const formI18n = useFormI18n$1(column, prefix, schema);
7160
7266
  const { required, gridColumn = 'span 12', gridRow = 'span 1', displayDateFormat = 'YYYY-MM-DD HH:mm:ss',
7161
7267
  // with timezone
7162
7268
  dateFormat = 'YYYY-MM-DD[T]HH:mm:ssZ', } = schema;
@@ -7298,7 +7404,7 @@ const SchemaRenderer = ({ schema, prefix, column, }) => {
7298
7404
  if (innerProperties) {
7299
7405
  return jsxRuntime.jsx(ObjectInput, { schema: colSchema, prefix, column });
7300
7406
  }
7301
- return jsxRuntime.jsx(RecordInput$1, { schema: colSchema, prefix, column });
7407
+ return jsxRuntime.jsx(RecordInput, { schema: colSchema, prefix, column });
7302
7408
  }
7303
7409
  if (type === 'array') {
7304
7410
  if (variant === 'id-picker') {
@@ -7352,32 +7458,30 @@ const ColumnRenderer = ({ column, properties, prefix, parentRequired, }) => {
7352
7458
  };
7353
7459
 
7354
7460
  const ArrayViewer = ({ schema, column, prefix }) => {
7355
- const { gridColumn = "span 12", gridRow = "span 1", required, items, } = schema;
7356
- const { translate } = useSchemaContext();
7461
+ const { gridColumn = 'span 12', gridRow = 'span 1', required, items, } = schema;
7357
7462
  const colLabel = `${prefix}${column}`;
7358
7463
  const isRequired = required?.some((columnId) => columnId === column);
7464
+ const formI18n = useFormI18n$1(column, prefix, schema);
7359
7465
  const { watch, formState: { errors }, } = reactHookForm.useFormContext();
7360
7466
  const values = watch(colLabel) ?? [];
7361
- return (jsxRuntime.jsxs(react.Box, { gridRow, gridColumn, children: [jsxRuntime.jsxs(react.Box, { as: "label", gridColumn: "1/span12", children: [`${translate.t(removeIndex(`${colLabel}.field_label`))}`, isRequired && jsxRuntime.jsx("span", { children: "*" })] }), jsxRuntime.jsx(react.Flex, { flexFlow: "column", gap: 1, children: values.map((field, index) => (jsxRuntime.jsx(react.Flex, { flexFlow: "column", bgColor: { base: "colorPalette.100", _dark: "colorPalette.900" }, p: "2", borderRadius: "md", borderWidth: "thin", borderColor: {
7362
- base: "colorPalette.200",
7363
- _dark: "colorPalette.800",
7364
- }, children: jsxRuntime.jsx(react.Grid, { gap: "4", gridTemplateColumns: "repeat(12, 1fr)", autoFlow: "row", children: jsxRuntime.jsx(SchemaViewer, { column: `${index}`,
7467
+ return (jsxRuntime.jsxs(react.Box, { gridRow, gridColumn, children: [jsxRuntime.jsxs(react.Box, { as: "label", gridColumn: '1/span12', children: [formI18n.label(), isRequired && jsxRuntime.jsx("span", { children: "*" })] }), jsxRuntime.jsx(react.Flex, { flexFlow: 'column', gap: 1, children: values.map((field, index) => (jsxRuntime.jsx(react.Flex, { flexFlow: 'column', bgColor: { base: 'colorPalette.100', _dark: 'colorPalette.900' }, p: '2', borderRadius: 'md', borderWidth: 'thin', borderColor: {
7468
+ base: 'colorPalette.200',
7469
+ _dark: 'colorPalette.800',
7470
+ }, children: jsxRuntime.jsx(react.Grid, { gap: "4", gridTemplateColumns: 'repeat(12, 1fr)', autoFlow: 'row', children: jsxRuntime.jsx(SchemaViewer, { column: `${index}`,
7365
7471
  prefix: `${colLabel}.`,
7366
7472
  // @ts-expect-error find suitable types
7367
- schema: { showLabel: false, ...(items ?? {}) } }) }) }, `form-${prefix}${column}.${index}`))) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }));
7473
+ schema: { showLabel: false, ...(items ?? {}) } }) }) }, `form-${prefix}${column}.${index}`))) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: 'red.400', children: formI18n.required() }))] }));
7368
7474
  };
7369
7475
 
7370
7476
  const BooleanViewer = ({ schema, column, prefix, }) => {
7371
7477
  const { watch, formState: { errors }, } = reactHookForm.useFormContext();
7372
- const { translate } = useSchemaContext();
7373
- const { required, gridColumn = "span 12", gridRow = "span 1" } = schema;
7478
+ const { required, gridColumn = 'span 12', gridRow = 'span 1' } = schema;
7374
7479
  const isRequired = required?.some((columnId) => columnId === column);
7375
7480
  const colLabel = `${prefix}${column}`;
7376
7481
  const value = watch(colLabel);
7377
- return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.field_label`))}`, required: isRequired, alignItems: "stretch", gridColumn,
7378
- gridRow, children: [jsxRuntime.jsx(react.Text, { children: value
7379
- ? translate.t(removeIndex(`${colLabel}.true`))
7380
- : translate.t(removeIndex(`${colLabel}.false`)) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }));
7482
+ const formI18n = useFormI18n$1(column, prefix, schema);
7483
+ return (jsxRuntime.jsxs(Field, { label: formI18n.label(), required: isRequired, alignItems: 'stretch', gridColumn,
7484
+ gridRow, children: [jsxRuntime.jsx(react.Text, { children: value ? formI18n.t('true') : formI18n.t('false') }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: 'red.400', children: formI18n.required() }))] }));
7381
7485
  };
7382
7486
 
7383
7487
  const CustomViewer = ({ column, schema, prefix }) => {
@@ -7394,19 +7498,22 @@ const CustomViewer = ({ column, schema, prefix }) => {
7394
7498
 
7395
7499
  const DateViewer = ({ column, schema, prefix }) => {
7396
7500
  const { watch, formState: { errors }, } = reactHookForm.useFormContext();
7397
- const { translate, timezone } = useSchemaContext();
7398
- const { required, gridColumn = "span 4", gridRow = "span 1", displayDateFormat = "YYYY-MM-DD", } = schema;
7501
+ const { timezone } = useSchemaContext();
7502
+ const { required, gridColumn = 'span 4', gridRow = 'span 1', displayDateFormat = 'YYYY-MM-DD', } = schema;
7399
7503
  const isRequired = required?.some((columnId) => columnId === column);
7400
7504
  const colLabel = `${prefix}${column}`;
7401
7505
  const selectedDate = watch(colLabel);
7402
- const displayDate = dayjs(selectedDate).tz(timezone).format(displayDateFormat);
7403
- return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${column}.field_label`))}`, required: isRequired, alignItems: "stretch", gridColumn,
7404
- gridRow, children: [jsxRuntime.jsxs(react.Text, { children: [" ", selectedDate !== undefined ? displayDate : ""] }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${column}.field_required`) }))] }));
7506
+ const formI18n = useFormI18n$1(column, prefix, schema);
7507
+ const displayDate = dayjs(selectedDate)
7508
+ .tz(timezone)
7509
+ .format(displayDateFormat);
7510
+ return (jsxRuntime.jsxs(Field, { label: formI18n.label(), required: isRequired, alignItems: 'stretch', gridColumn,
7511
+ gridRow, children: [jsxRuntime.jsxs(react.Text, { children: [" ", selectedDate !== undefined ? displayDate : ''] }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: 'red.400', children: formI18n.required() }))] }));
7405
7512
  };
7406
7513
 
7407
7514
  const EnumViewer = ({ column, isMultiple = false, schema, prefix, }) => {
7408
7515
  const { watch, formState: { errors }, } = reactHookForm.useFormContext();
7409
- const formI18n = useFormI18n(column, prefix);
7516
+ const formI18n = useFormI18n$1(column, prefix);
7410
7517
  const { required } = schema;
7411
7518
  const isRequired = required?.some((columnId) => columnId === column);
7412
7519
  const { gridColumn = "span 12", gridRow = "span 1", renderDisplay } = schema;
@@ -7427,54 +7534,56 @@ const EnumViewer = ({ column, isMultiple = false, schema, prefix, }) => {
7427
7534
 
7428
7535
  const FileViewer = ({ column, schema, prefix }) => {
7429
7536
  const { watch } = reactHookForm.useFormContext();
7430
- const { translate } = useSchemaContext();
7431
- const { required, gridColumn = "span 12", gridRow = "span 1", } = schema;
7537
+ const { required, gridColumn = 'span 12', gridRow = 'span 1', } = schema;
7432
7538
  const isRequired = required?.some((columnId) => columnId === column);
7433
7539
  const currentFiles = (watch(column) ?? []);
7434
- const colLabel = `${prefix}${column}`;
7435
- return (jsxRuntime.jsx(Field, { label: `${translate.t(`${colLabel}.field_label`)}`, required: isRequired, gridColumn: gridColumn, gridRow: gridRow, display: "grid", gridTemplateRows: "auto 1fr auto", alignItems: "stretch", children: jsxRuntime.jsx(react.Flex, { flexFlow: "column", gap: 1, children: currentFiles.map((file) => {
7436
- return (jsxRuntime.jsx(react.Card.Root, { variant: "subtle", children: jsxRuntime.jsxs(react.Card.Body, { gap: "2", display: "flex", flexFlow: "row", alignItems: "center", padding: "2", children: [file.type.startsWith("image/") && (jsxRuntime.jsx(react.Image, { src: URL.createObjectURL(file), alt: file.name, boxSize: "50px", objectFit: "cover", borderRadius: "md", marginRight: "2" })), jsxRuntime.jsx(react.Box, { children: file.name })] }) }, file.name));
7540
+ const formI18n = useFormI18n$1(column, prefix, schema);
7541
+ return (jsxRuntime.jsx(Field, { label: formI18n.label(), required: isRequired, gridColumn: gridColumn, gridRow: gridRow, display: 'grid', gridTemplateRows: 'auto 1fr auto', alignItems: 'stretch', children: jsxRuntime.jsx(react.Flex, { flexFlow: 'column', gap: 1, children: currentFiles.map((file) => {
7542
+ return (jsxRuntime.jsx(react.Card.Root, { variant: 'subtle', children: jsxRuntime.jsxs(react.Card.Body, { gap: "2", display: 'flex', flexFlow: 'row', alignItems: 'center', padding: '2', children: [file.type.startsWith('image/') && (jsxRuntime.jsx(react.Image, { src: URL.createObjectURL(file), alt: file.name, boxSize: "50px", objectFit: "cover", borderRadius: "md", marginRight: "2" })), jsxRuntime.jsx(react.Box, { children: file.name })] }) }, file.name));
7437
7543
  }) }) }));
7438
7544
  };
7439
7545
 
7440
7546
  const IdViewer = ({ column, schema, prefix, isMultiple = false, }) => {
7441
7547
  const { watch, formState: { errors }, } = reactHookForm.useFormContext();
7442
7548
  const { idMap, translate } = useSchemaContext();
7443
- const { required, gridColumn = "span 12", gridRow = "span 1", renderDisplay, foreign_key, } = schema;
7549
+ const { required, gridColumn = 'span 12', gridRow = 'span 1', renderDisplay, foreign_key, } = schema;
7444
7550
  const isRequired = required?.some((columnId) => columnId === column);
7445
- const { display_column } = foreign_key;
7551
+ const formI18n = useFormI18n(column, prefix, schema);
7446
7552
  const colLabel = `${prefix}${column}`;
7447
7553
  const watchId = watch(colLabel);
7448
7554
  const watchIds = (watch(colLabel) ?? []);
7449
7555
  const getPickedValue = () => {
7450
7556
  if (Object.keys(idMap).length <= 0) {
7451
- return "";
7557
+ return '';
7452
7558
  }
7453
7559
  const record = idMap[watchId];
7454
7560
  if (record === undefined) {
7455
- return "";
7561
+ return '';
7456
7562
  }
7457
- return record[display_column];
7563
+ const rendered = renderDisplay
7564
+ ? renderDisplay(record)
7565
+ : defaultRenderDisplay(record);
7566
+ return typeof rendered === 'string' ? rendered : JSON.stringify(record);
7458
7567
  };
7459
- return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${column}.field_label`))}`, required: isRequired, alignItems: "stretch", gridColumn,
7460
- gridRow, children: [isMultiple && (jsxRuntime.jsx(react.Flex, { flexFlow: "wrap", gap: 1, children: watchIds.map((id) => {
7568
+ return (jsxRuntime.jsxs(Field, { label: formI18n.label(), required: isRequired, alignItems: 'stretch', gridColumn,
7569
+ gridRow, children: [isMultiple && (jsxRuntime.jsx(react.Flex, { flexFlow: 'wrap', gap: 1, children: watchIds.map((id) => {
7461
7570
  const item = idMap[id];
7462
7571
  if (item === undefined) {
7463
7572
  return (jsxRuntime.jsx(react.Text, { children: translate.t(removeIndex(`${colLabel}.undefined`)) }, id));
7464
7573
  }
7465
- return (jsxRuntime.jsx(Tag, { closable: true, children: !!renderDisplay === true
7574
+ return (jsxRuntime.jsx(Tag, { closable: true, children: renderDisplay
7466
7575
  ? renderDisplay(item)
7467
- : item[display_column] }, id));
7468
- }) })), !isMultiple && jsxRuntime.jsx(react.Text, { children: getPickedValue() }), errors[`${colLabel}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }));
7576
+ : defaultRenderDisplay(item) }, id));
7577
+ }) })), !isMultiple && jsxRuntime.jsx(react.Text, { children: getPickedValue() }), errors[`${colLabel}`] && (jsxRuntime.jsx(react.Text, { color: 'red.400', children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }));
7469
7578
  };
7470
7579
 
7471
7580
  const NumberViewer = ({ schema, column, prefix, }) => {
7472
7581
  const { watch, formState: { errors }, } = reactHookForm.useFormContext();
7473
- const { translate } = useSchemaContext();
7474
7582
  const { required, gridColumn = 'span 12', gridRow = 'span 1' } = schema;
7475
7583
  const isRequired = required?.some((columnId) => columnId === column);
7476
7584
  const colLabel = `${prefix}${column}`;
7477
7585
  const value = watch(colLabel);
7586
+ const formI18n = useFormI18n$1(column, prefix, schema);
7478
7587
  // Format the value for display if formatOptions are provided
7479
7588
  const formatValue = (val) => {
7480
7589
  if (val === undefined || val === null || val === '')
@@ -7493,90 +7602,49 @@ const NumberViewer = ({ schema, column, prefix, }) => {
7493
7602
  }
7494
7603
  return String(val);
7495
7604
  };
7496
- return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.field_label`))}`, required: isRequired, gridColumn, gridRow, children: [jsxRuntime.jsx(react.Text, { children: formatValue(value) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: 'red.400', children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }));
7605
+ return (jsxRuntime.jsxs(Field, { label: formI18n.label(), required: isRequired, gridColumn, gridRow, children: [jsxRuntime.jsx(react.Text, { children: formatValue(value) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: 'red.400', children: formI18n.required() }))] }));
7497
7606
  };
7498
7607
 
7499
7608
  const ObjectViewer = ({ schema, column, prefix }) => {
7500
- const { properties, gridColumn = "span 12", gridRow = "span 1", required, showLabel = true, } = schema;
7501
- const { translate } = useSchemaContext();
7609
+ const { properties, gridColumn = 'span 12', gridRow = 'span 1', required, showLabel = true, } = schema;
7502
7610
  const colLabel = `${prefix}${column}`;
7503
7611
  const isRequired = required?.some((columnId) => columnId === column);
7612
+ const formI18n = useFormI18n$1(column, prefix, schema);
7504
7613
  const { formState: { errors }, } = reactHookForm.useFormContext();
7505
7614
  if (properties === undefined) {
7506
7615
  throw new Error(`properties is undefined when using ObjectInput`);
7507
7616
  }
7508
- return (jsxRuntime.jsxs(react.Box, { gridRow, gridColumn, children: [showLabel && (jsxRuntime.jsxs(react.Box, { as: "label", children: [`${translate.t(removeIndex(`${colLabel}.field_label`))}`, isRequired && jsxRuntime.jsx("span", { children: "*" })] })), jsxRuntime.jsx(react.Grid, { gap: "4", padding: "4", gridTemplateColumns: "repeat(12, 1fr)", autoFlow: "row", bgColor: { base: "colorPalette.100", _dark: "colorPalette.900" }, p: "1", borderRadius: "md", borderWidth: "thin", borderColor: {
7509
- base: "colorPalette.200",
7510
- _dark: "colorPalette.800",
7617
+ return (jsxRuntime.jsxs(react.Box, { gridRow, gridColumn, children: [showLabel && (jsxRuntime.jsxs(react.Box, { as: "label", children: [formI18n.label(), isRequired && jsxRuntime.jsx("span", { children: "*" })] })), jsxRuntime.jsx(react.Grid, { gap: "4", padding: '4', gridTemplateColumns: 'repeat(12, 1fr)', autoFlow: 'row', bgColor: { base: 'colorPalette.100', _dark: 'colorPalette.900' }, p: '1', borderRadius: 'md', borderWidth: 'thin', borderColor: {
7618
+ base: 'colorPalette.200',
7619
+ _dark: 'colorPalette.800',
7511
7620
  }, children: Object.keys(properties ?? {}).map((key) => {
7512
7621
  return (
7513
7622
  // @ts-expect-error find suitable types
7514
7623
  jsxRuntime.jsx(ColumnViewer, { column: `${key}`,
7515
7624
  prefix: `${prefix}${column}.`,
7516
7625
  properties }, `form-objectviewer-${colLabel}-${key}`));
7517
- }) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }));
7626
+ }) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: 'red.400', children: formI18n.required() }))] }));
7518
7627
  };
7519
7628
 
7520
- const RecordInput = ({ column, schema, prefix }) => {
7521
- const { formState: { errors }, setValue, getValues, } = reactHookForm.useFormContext();
7522
- const { translate } = useSchemaContext();
7523
- const { required, gridColumn = "span 12", gridRow = "span 1" } = schema;
7629
+ const RecordViewer = ({ column, schema, prefix }) => {
7630
+ const { formState: { errors }, getValues, } = reactHookForm.useFormContext();
7631
+ const { required, gridColumn = 'span 12', gridRow = 'span 1' } = schema;
7524
7632
  const isRequired = required?.some((columnId) => columnId === column);
7525
7633
  const entries = Object.entries(getValues(column) ?? {});
7526
- const [showNewEntries, setShowNewEntries] = React.useState(false);
7527
- const [newKey, setNewKey] = React.useState();
7528
- const [newValue, setNewValue] = React.useState();
7529
- return (jsxRuntime.jsxs(Field, { label: `${translate.t(`${column}.field_label`)}`, required: isRequired, alignItems: "stretch", gridColumn, gridRow, children: [entries.map(([key, value]) => {
7530
- return (jsxRuntime.jsxs(react.Grid, { templateColumns: "1fr 1fr auto", gap: 1, children: [jsxRuntime.jsx(react.Input, { value: key, onChange: (e) => {
7531
- const filtered = entries.filter(([target]) => {
7532
- return target !== key;
7533
- });
7534
- setValue(column, Object.fromEntries([...filtered, [e.target.value, value]]));
7535
- }, autoComplete: "off" }), jsxRuntime.jsx(react.Input, { value: value, onChange: (e) => {
7536
- setValue(column, {
7537
- ...getValues(column),
7538
- [key]: e.target.value,
7539
- });
7540
- }, autoComplete: "off" }), jsxRuntime.jsx(react.IconButton, { variant: "ghost", onClick: () => {
7541
- const filtered = entries.filter(([target]) => {
7542
- return target !== key;
7543
- });
7544
- setValue(column, Object.fromEntries([...filtered]));
7545
- }, children: jsxRuntime.jsx(cg.CgClose, {}) })] }));
7546
- }), 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) => {
7547
- setNewKey(e.target.value);
7548
- }, autoComplete: "off" }), jsxRuntime.jsx(react.Input, { value: newValue, onChange: (e) => {
7549
- setNewValue(e.target.value);
7550
- }, autoComplete: "off" })] }) }), jsxRuntime.jsxs(react.Card.Footer, { justifyContent: "flex-end", children: [jsxRuntime.jsx(react.IconButton, { variant: "subtle", onClick: () => {
7551
- setShowNewEntries(false);
7552
- setNewKey(undefined);
7553
- setNewValue(undefined);
7554
- }, children: jsxRuntime.jsx(cg.CgClose, {}) }), jsxRuntime.jsx(Button, { onClick: () => {
7555
- if (!!newKey === false) {
7556
- setShowNewEntries(false);
7557
- setNewKey(undefined);
7558
- setNewValue(undefined);
7559
- return;
7560
- }
7561
- setValue(column, Object.fromEntries([...entries, [newKey, newValue]]));
7562
- setShowNewEntries(false);
7563
- setNewKey(undefined);
7564
- setNewValue(undefined);
7565
- }, children: translate.t(`${column}.save`) })] })] }) }), jsxRuntime.jsx(Button, { onClick: () => {
7566
- setShowNewEntries(true);
7567
- setNewKey(undefined);
7568
- setNewValue(undefined);
7569
- }, children: translate.t(`${column}.addNew`) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${column}.field_required`) }))] }));
7634
+ const formI18n = useFormI18n$1(column, prefix, schema);
7635
+ return (jsxRuntime.jsxs(Field, { label: formI18n.label(), required: isRequired, alignItems: 'stretch', gridColumn, gridRow, children: [entries.length === 0 ? (jsxRuntime.jsx(react.Text, { color: "gray.500", children: "No entries" })) : (jsxRuntime.jsx(react.Grid, { templateColumns: '1fr 1fr', gap: 2, children: entries.map(([key, value]) => {
7636
+ return (jsxRuntime.jsxs(react.Grid, { templateColumns: '1fr 1fr', gap: 2, children: [jsxRuntime.jsxs(react.Text, { fontWeight: "medium", children: [key, ":"] }), jsxRuntime.jsx(react.Text, { children: String(value ?? '') })] }, key));
7637
+ }) })), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: 'red.400', children: formI18n.required() }))] }));
7570
7638
  };
7571
7639
 
7572
7640
  const StringViewer = ({ column, schema, prefix, }) => {
7573
7641
  const { watch, formState: { errors }, } = reactHookForm.useFormContext();
7574
- const { translate } = useSchemaContext();
7575
- const { required, gridColumn = "span 12", gridRow = "span 1" } = schema;
7642
+ const { required, gridColumn = 'span 12', gridRow = 'span 1' } = schema;
7576
7643
  const isRequired = required?.some((columnId) => columnId === column);
7577
7644
  const colLabel = `${prefix}${column}`;
7578
7645
  const value = watch(colLabel);
7579
- return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.field_label`))}`, 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}.field_required`)) }))] }) }));
7646
+ const formI18n = useFormI18n$1(column, prefix, schema);
7647
+ return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs(Field, { label: formI18n.label(), 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: formI18n.required() }))] }) }));
7580
7648
  };
7581
7649
 
7582
7650
  const TagViewer = ({ column, schema, prefix }) => {
@@ -7666,40 +7734,44 @@ const TagViewer = ({ column, schema, prefix }) => {
7666
7734
 
7667
7735
  const TextAreaViewer = ({ column, schema, prefix, }) => {
7668
7736
  const { watch, formState: { errors }, } = reactHookForm.useFormContext();
7669
- const { translate } = useSchemaContext();
7670
- const { required, gridColumn = "span 12", gridRow = "span 1" } = schema;
7737
+ const { required, gridColumn = 'span 12', gridRow = 'span 1' } = schema;
7671
7738
  const isRequired = required?.some((columnId) => columnId === column);
7672
7739
  const colLabel = `${prefix}${column}`;
7673
7740
  const value = watch(colLabel);
7674
- return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.field_label`))}`, required: isRequired, gridColumn: gridColumn, gridRow: gridRow, children: [jsxRuntime.jsx(react.Text, { whiteSpace: "pre-wrap", children: value }), " ", errors[colLabel] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }) }));
7741
+ const formI18n = useFormI18n$1(column, prefix, schema);
7742
+ return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs(Field, { label: formI18n.label(), required: isRequired, gridColumn: gridColumn, gridRow: gridRow, children: [jsxRuntime.jsx(react.Text, { whiteSpace: "pre-wrap", children: value }), ' ', errors[colLabel] && (jsxRuntime.jsx(react.Text, { color: 'red.400', children: formI18n.required() }))] }) }));
7675
7743
  };
7676
7744
 
7677
7745
  const TimeViewer = ({ column, schema, prefix }) => {
7678
7746
  const { watch, formState: { errors }, } = reactHookForm.useFormContext();
7679
- const { translate, timezone } = useSchemaContext();
7680
- const { required, gridColumn = "span 12", gridRow = "span 1", displayTimeFormat = "hh:mm A", } = schema;
7747
+ const { timezone } = useSchemaContext();
7748
+ const { required, gridColumn = 'span 12', gridRow = 'span 1', displayTimeFormat = 'hh:mm A', } = schema;
7681
7749
  const isRequired = required?.some((columnId) => columnId === column);
7682
7750
  const colLabel = `${prefix}${column}`;
7683
7751
  const selectedDate = watch(colLabel);
7752
+ const formI18n = useFormI18n$1(column, prefix, schema);
7684
7753
  const displayedTime = dayjs(`1970-01-01T${selectedDate}`)
7685
7754
  .tz(timezone)
7686
7755
  .isValid()
7687
7756
  ? dayjs(`1970-01-01T${selectedDate}`).tz(timezone).format(displayTimeFormat)
7688
- : "";
7689
- return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${column}.field_label`))}`, required: isRequired, alignItems: "stretch", gridColumn,
7690
- gridRow, children: [jsxRuntime.jsx(react.Text, { children: displayedTime }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${column}.field_required`) }))] }));
7757
+ : '';
7758
+ return (jsxRuntime.jsxs(Field, { label: formI18n.label(), required: isRequired, alignItems: 'stretch', gridColumn,
7759
+ gridRow, children: [jsxRuntime.jsx(react.Text, { children: displayedTime }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: 'red.400', children: formI18n.required() }))] }));
7691
7760
  };
7692
7761
 
7693
7762
  const DateTimeViewer = ({ column, schema, prefix }) => {
7694
7763
  const { watch, formState: { errors }, } = reactHookForm.useFormContext();
7695
- const { translate, timezone } = useSchemaContext();
7696
- const { required, gridColumn = "span 4", gridRow = "span 1", displayDateFormat = "YYYY-MM-DD HH:mm:ss", } = schema;
7764
+ const { timezone } = useSchemaContext();
7765
+ const { required, gridColumn = 'span 4', gridRow = 'span 1', displayDateFormat = 'YYYY-MM-DD HH:mm:ss', } = schema;
7697
7766
  const isRequired = required?.some((columnId) => columnId === column);
7698
7767
  const colLabel = `${prefix}${column}`;
7699
7768
  const selectedDate = watch(colLabel);
7700
- const displayDate = dayjs(selectedDate).tz(timezone).format(displayDateFormat);
7701
- return (jsxRuntime.jsxs(Field, { label: `${translate.t(removeIndex(`${column}.field_label`))}`, required: isRequired, alignItems: "stretch", gridColumn,
7702
- gridRow, children: [jsxRuntime.jsxs(react.Text, { children: [" ", selectedDate !== undefined ? displayDate : ""] }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${column}.field_required`) }))] }));
7769
+ const formI18n = useFormI18n$1(column, prefix, schema);
7770
+ const displayDate = dayjs(selectedDate)
7771
+ .tz(timezone)
7772
+ .format(displayDateFormat);
7773
+ return (jsxRuntime.jsxs(Field, { label: formI18n.label(), required: isRequired, alignItems: 'stretch', gridColumn,
7774
+ gridRow, children: [jsxRuntime.jsxs(react.Text, { children: [" ", selectedDate !== undefined ? displayDate : ''] }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: 'red.400', children: formI18n.required() }))] }));
7703
7775
  };
7704
7776
 
7705
7777
  const SchemaViewer = ({ schema, prefix, column, }) => {
@@ -7740,7 +7812,7 @@ const SchemaViewer = ({ schema, prefix, column, }) => {
7740
7812
  if (innerProperties) {
7741
7813
  return jsxRuntime.jsx(ObjectViewer, { schema: colSchema, prefix, column });
7742
7814
  }
7743
- return jsxRuntime.jsx(RecordInput, { schema: colSchema, prefix, column });
7815
+ return jsxRuntime.jsx(RecordViewer, { schema: colSchema, prefix, column });
7744
7816
  }
7745
7817
  if (type === 'array') {
7746
7818
  if (variant === 'id-picker') {
@@ -7788,7 +7860,7 @@ const ColumnViewer = ({ column, properties, prefix, }) => {
7788
7860
  };
7789
7861
 
7790
7862
  const SubmitButton = () => {
7791
- const { translate, setValidatedData, setIsError, setIsConfirming, setError, schema, requireConfirmation, onFormSubmit, } = useSchemaContext();
7863
+ const { translate, setValidatedData, setIsError, setIsConfirming, requireConfirmation, onFormSubmit, formButtonLabels, } = useSchemaContext();
7792
7864
  const methods = reactHookForm.useFormContext();
7793
7865
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
7794
7866
  const onValid = (data) => {
@@ -7817,11 +7889,11 @@ const SubmitButton = () => {
7817
7889
  };
7818
7890
  return (jsxRuntime.jsx(react.Button, { onClick: () => {
7819
7891
  methods.handleSubmit(onValid)();
7820
- }, formNoValidate: true, children: translate.t('submit') }));
7892
+ }, formNoValidate: true, children: formButtonLabels?.submit ?? translate.t('submit') }));
7821
7893
  };
7822
7894
 
7823
7895
  const FormBody = () => {
7824
- const { schema, order, ignore, include, translate, isSuccess, setIsSuccess, isError, setIsError, isSubmiting, setIsSubmiting, isConfirming, setIsConfirming, validatedData, setValidatedData, error, getUpdatedData, customErrorRenderer, customSuccessRenderer, displayConfig, onFormSubmit, } = useSchemaContext();
7896
+ const { schema, order, ignore, include, translate, isSuccess, setIsSuccess, isError, setIsError, isSubmiting, setIsSubmiting, isConfirming, setIsConfirming, validatedData, setValidatedData, error, getUpdatedData, customErrorRenderer, customSuccessRenderer, displayConfig, onFormSubmit, formButtonLabels, } = useSchemaContext();
7825
7897
  const { showSubmitButton, showResetButton } = displayConfig;
7826
7898
  const methods = reactHookForm.useFormContext();
7827
7899
  const { properties } = schema;
@@ -7851,7 +7923,7 @@ const FormBody = () => {
7851
7923
  if (customSuccessRenderer) {
7852
7924
  return customSuccessRenderer(resetHandler);
7853
7925
  }
7854
- return (jsxRuntime.jsxs(react.Flex, { flexFlow: 'column', gap: "2", children: [jsxRuntime.jsxs(react.Alert.Root, { status: "success", children: [jsxRuntime.jsx(react.Alert.Indicator, {}), jsxRuntime.jsx(react.Alert.Content, { children: jsxRuntime.jsx(react.Alert.Title, { children: translate.t('submit_success') }) })] }), jsxRuntime.jsx(react.Flex, { justifyContent: 'end', children: jsxRuntime.jsx(react.Button, { onClick: resetHandler, formNoValidate: true, children: translate.t('submit_again') }) })] }));
7926
+ return (jsxRuntime.jsxs(react.Flex, { flexFlow: 'column', gap: "2", children: [jsxRuntime.jsxs(react.Alert.Root, { status: "success", children: [jsxRuntime.jsx(react.Alert.Indicator, {}), jsxRuntime.jsx(react.Alert.Content, { children: jsxRuntime.jsx(react.Alert.Title, { children: translate.t('submit_success') }) })] }), jsxRuntime.jsx(react.Flex, { justifyContent: 'end', children: jsxRuntime.jsx(react.Button, { onClick: resetHandler, formNoValidate: true, children: formButtonLabels?.submitAgain ?? translate.t('submit_again') }) })] }));
7855
7927
  }
7856
7928
  if (isConfirming) {
7857
7929
  return (jsxRuntime.jsxs(react.Flex, { flexFlow: 'column', gap: "2", children: [jsxRuntime.jsx(react.Grid, { gap: 4, gridTemplateColumns: 'repeat(12, 1fr)', gridTemplateRows: 'repeat(12, max-content)', autoFlow: 'row', children: ordered.map((column) => {
@@ -7862,9 +7934,9 @@ const FormBody = () => {
7862
7934
  properties: properties, prefix: ``, column }, `form-viewer-${column}`));
7863
7935
  }) }), jsxRuntime.jsxs(react.Flex, { justifyContent: 'end', gap: '2', children: [jsxRuntime.jsx(react.Button, { onClick: () => {
7864
7936
  setIsConfirming(false);
7865
- }, variant: 'subtle', children: translate.t('cancel') }), jsxRuntime.jsx(react.Button, { onClick: () => {
7937
+ }, variant: 'subtle', children: formButtonLabels?.cancel ?? translate.t('cancel') }), jsxRuntime.jsx(react.Button, { onClick: () => {
7866
7938
  onFormSubmit(validatedData);
7867
- }, 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 && customErrorRenderer && customErrorRenderer(error)] }));
7939
+ }, children: formButtonLabels?.confirm ?? 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 && customErrorRenderer && customErrorRenderer(error)] }));
7868
7940
  }
7869
7941
  return (jsxRuntime.jsxs(react.Flex, { flexFlow: 'column', gap: "2", children: [jsxRuntime.jsx(react.Grid, { gap: "4", gridTemplateColumns: 'repeat(12, 1fr)', autoFlow: 'row', children: ordered.map((column) => {
7870
7942
  return (jsxRuntime.jsx(ColumnRenderer
@@ -7874,7 +7946,7 @@ const FormBody = () => {
7874
7946
  properties: properties, prefix: ``, parentRequired: schema.required, column }, `form-input-${column}`));
7875
7947
  }) }), jsxRuntime.jsxs(react.Flex, { justifyContent: 'end', gap: "2", children: [showResetButton && (jsxRuntime.jsx(react.Button, { onClick: () => {
7876
7948
  methods.reset();
7877
- }, variant: 'subtle', children: translate.t('reset') })), showSubmitButton && jsxRuntime.jsx(SubmitButton, {})] }), isError && customErrorRenderer && customErrorRenderer(error)] }));
7949
+ }, variant: 'subtle', children: formButtonLabels?.reset ?? translate.t('reset') })), showSubmitButton && jsxRuntime.jsx(SubmitButton, {})] }), isError && customErrorRenderer && customErrorRenderer(error)] }));
7878
7950
  };
7879
7951
 
7880
7952
  const FormTitle = () => {
@@ -8193,7 +8265,6 @@ const TableDataDisplay = ({ colorPalette, emptyComponent, }) => {
8193
8265
  return `minmax(${size}px, ${(size / totalWidths) * 100}%)`;
8194
8266
  })
8195
8267
  .join(' ');
8196
- console.log({ columnWidths }, 'hadfg');
8197
8268
  const cellProps = {
8198
8269
  flex: '1 0 0%',
8199
8270
  overflow: 'auto',
@@ -8210,22 +8281,22 @@ const TableDataDisplay = ({ colorPalette, emptyComponent, }) => {
8210
8281
  }
8211
8282
  return (jsxRuntime.jsxs(react.Grid, { templateColumns: `${columnWidths}`, overflow: 'auto', borderWidth: '1px', color: { base: 'colorPalette.900', _dark: 'colorPalette.100' }, borderColor: { base: 'colorPalette.200', _dark: 'colorPalette.800' }, colorPalette, children: [jsxRuntime.jsx(react.Grid, { templateColumns: `${columnWidths}`, column: `1/span ${columns.length}`, bg: { base: 'colorPalette.200', _dark: 'colorPalette.800' }, colorPalette, children: columnHeaders.map((header) => {
8212
8283
  const columnDef = columnsMap[header];
8213
- return (jsxRuntime.jsx(react.Box, { flex: '1 0 0%', paddingX: '2', py: '1', overflow: 'auto', textOverflow: 'ellipsis', children: columnDef?.meta?.displayName ?? header }));
8214
- }) }), data.map((record) => {
8215
- return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: columnHeaders.map((header) => {
8284
+ return (jsxRuntime.jsx(react.Box, { flex: '1 0 0%', paddingX: '2', py: '1', overflow: 'auto', textOverflow: 'ellipsis', children: columnDef?.meta?.displayName ?? header }, `chakra-table-header-${header}`));
8285
+ }) }), data.map((record, recordIndex) => {
8286
+ return (jsxRuntime.jsx(react.Box, { display: "contents", children: columnHeaders.map((header) => {
8216
8287
  const { cell } = columnsMap[header];
8217
8288
  const value = record[header];
8218
8289
  if (!!record === false) {
8219
- return (jsxRuntime.jsx(react.Box, { ...cellProps }));
8290
+ return (jsxRuntime.jsx(react.Box, { ...cellProps }, `chakra-table-cell-${recordIndex}-${header}`));
8220
8291
  }
8221
8292
  if (cell) {
8222
- return (jsxRuntime.jsx(react.Box, { ...cellProps, children: cell({ row: { original: record } }) }));
8293
+ return (jsxRuntime.jsx(react.Box, { ...cellProps, children: cell({ row: { original: record } }) }, `chakra-table-cell-${recordIndex}-${header}`));
8223
8294
  }
8224
8295
  if (typeof value === 'object') {
8225
- return (jsxRuntime.jsx(react.Box, { ...cellProps, children: jsxRuntime.jsx(RecordDisplay, { object: value }) }));
8296
+ return (jsxRuntime.jsx(react.Box, { ...cellProps, children: jsxRuntime.jsx(RecordDisplay, { object: value }) }, `chakra-table-cell-${recordIndex}-${header}`));
8226
8297
  }
8227
- return jsxRuntime.jsx(react.Box, { ...cellProps, children: value });
8228
- }) }));
8298
+ return (jsxRuntime.jsx(react.Box, { ...cellProps, children: value }, `chakra-table-cell-${recordIndex}-${header}`));
8299
+ }) }, `chakra-table-record-${recordIndex}`));
8229
8300
  })] }));
8230
8301
  };
8231
8302
 
@@ -8378,19 +8449,19 @@ const DataDisplay = ({ variant = '' }) => {
8378
8449
  return cell.id === `${rowId}_${column.id}`;
8379
8450
  });
8380
8451
  if (column.columns.length > 0) {
8381
- return (jsxRuntime.jsxs(react.Card.Root, { margin: '1', gridColumn: 'span 12', children: [jsxRuntime.jsx(react.Card.Header, { color: 'gray.400', children: column.columnDef.meta?.displayName ?? column.id }), jsxRuntime.jsx(react.Card.Body, { display: 'grid', gap: '4', gridTemplateColumns: 'repeat(12, 1fr)', children: column.columns.map((column) => {
8382
- if (!column.getIsVisible()) {
8383
- return jsxRuntime.jsx(jsxRuntime.Fragment, {});
8452
+ return (jsxRuntime.jsxs(react.Card.Root, { margin: '1', gridColumn: 'span 12', children: [jsxRuntime.jsx(react.Card.Header, { color: 'gray.400', children: column.columnDef.meta?.displayName ?? column.id }), jsxRuntime.jsx(react.Card.Body, { display: 'grid', gap: '4', gridTemplateColumns: 'repeat(12, 1fr)', children: column.columns.map((subColumn) => {
8453
+ if (!subColumn.getIsVisible()) {
8454
+ return null;
8384
8455
  }
8385
8456
  const foundCell = row
8386
8457
  .getVisibleCells()
8387
8458
  .find((cell) => {
8388
- return cell.id === `${rowId}_${column.id}`;
8459
+ return cell.id === `${rowId}_${subColumn.id}`;
8389
8460
  });
8390
- return jsxRuntime.jsx(CellRenderer, { cell: foundCell });
8391
- }) })] }, `chakra-table-card-${childCell?.id}`));
8461
+ return (jsxRuntime.jsx(CellRenderer, { cell: foundCell }, `chakra-table-cell-${rowId}-${subColumn.id}`));
8462
+ }) })] }, `chakra-table-card-${rowId}-${column.id}`));
8392
8463
  }
8393
- return jsxRuntime.jsx(CellRenderer, { cell: childCell });
8464
+ return (jsxRuntime.jsx(CellRenderer, { cell: childCell }, `chakra-table-cell-${rowId}-${column.id}`));
8394
8465
  }) }) }, `chakra-table-card-${rowId}`));
8395
8466
  }) }));
8396
8467
  };
@@ -8735,6 +8806,7 @@ exports.buildFieldErrors = buildFieldErrors;
8735
8806
  exports.buildRequiredErrors = buildRequiredErrors;
8736
8807
  exports.convertToAjvErrorsFormat = convertToAjvErrorsFormat;
8737
8808
  exports.createErrorMessage = createErrorMessage;
8809
+ exports.defaultRenderDisplay = defaultRenderDisplay;
8738
8810
  exports.getColumns = getColumns;
8739
8811
  exports.getMultiDates = getMultiDates;
8740
8812
  exports.getRangeDates = getRangeDates;