@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.
- package/dist/index.d.ts +11 -5
- package/dist/index.js +345 -273
- package/dist/index.mjs +345 -274
- package/dist/types/components/DataTable/display/RecordDisplay.d.ts +2 -2
- package/dist/types/components/Form/SchemaFormContext.d.ts +2 -1
- package/dist/types/components/Form/components/core/FormRoot.d.ts +3 -4
- package/dist/types/components/Form/components/fields/ArrayRenderer.d.ts +1 -1
- package/dist/types/components/Form/components/fields/StringInputField.d.ts +0 -1
- package/dist/types/components/Form/components/fields/TextAreaInput.d.ts +0 -5
- package/dist/types/components/Form/components/types/CustomJSONSchema7.d.ts +8 -0
- package/dist/types/components/Form/components/viewers/ArrayViewer.d.ts +1 -1
- package/dist/types/components/Form/components/viewers/BooleanViewer.d.ts +1 -1
- package/dist/types/components/Form/components/viewers/DateTimeViewer.d.ts +1 -1
- package/dist/types/components/Form/components/viewers/DateViewer.d.ts +1 -1
- package/dist/types/components/Form/components/viewers/IdViewer.d.ts +1 -1
- package/dist/types/components/Form/components/viewers/ObjectViewer.d.ts +1 -1
- package/dist/types/components/Form/components/viewers/RecordViewer.d.ts +2 -2
- package/dist/types/components/Form/components/viewers/StringViewer.d.ts +1 -6
- package/dist/types/components/Form/components/viewers/TextAreaViewer.d.ts +1 -6
- package/dist/types/components/Form/components/viewers/TimeViewer.d.ts +1 -1
- package/dist/types/components/Form/utils/useFormI18n.d.ts +5 -3
- package/dist/types/components/ui/pagination.d.ts +10 -7
- 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:
|
|
565
|
+
name: 'RootPropsProvider',
|
|
566
566
|
});
|
|
567
567
|
const variantMap = {
|
|
568
|
-
outline: { default:
|
|
569
|
-
solid: { default:
|
|
570
|
-
subtle: { default:
|
|
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 =
|
|
574
|
-
|
|
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 ===
|
|
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 =
|
|
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 ===
|
|
710
|
+
if (format === 'short')
|
|
616
711
|
return `${page} / ${totalPages}`;
|
|
617
|
-
if (format ===
|
|
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, {
|
|
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(
|
|
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()) }))] }
|
|
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.
|
|
3144
|
-
|
|
3145
|
-
|
|
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:
|
|
3642
|
-
|
|
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
|
|
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 =
|
|
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:
|
|
4057
|
-
base:
|
|
4058
|
-
_dark:
|
|
4059
|
-
}, children: [jsxRuntime.jsx(react.Grid, { gridTemplateColumns:
|
|
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:
|
|
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 ===
|
|
4232
|
+
if (type === 'number') {
|
|
4068
4233
|
setValue(colLabel, [...fields, 0]);
|
|
4069
4234
|
return;
|
|
4070
4235
|
}
|
|
4071
|
-
if (type ===
|
|
4072
|
-
setValue(colLabel, [...fields,
|
|
4236
|
+
if (type === 'string') {
|
|
4237
|
+
setValue(colLabel, [...fields, '']);
|
|
4073
4238
|
return;
|
|
4074
4239
|
}
|
|
4075
|
-
if (type ===
|
|
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:
|
|
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
|
-
|
|
4096
|
-
|
|
4097
|
-
|
|
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,
|
|
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
|
-
|
|
5448
|
-
|
|
5449
|
-
|
|
5450
|
-
|
|
5451
|
-
|
|
5452
|
-
|
|
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:
|
|
5606
|
+
}, children: renderDisplay
|
|
5499
5607
|
? renderDisplay(item)
|
|
5500
|
-
: item
|
|
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
|
-
|
|
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
|
-
?
|
|
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: [
|
|
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:
|
|
5735
|
+
}) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: 'red.400', children: formI18n.required() }))] }));
|
|
5628
5736
|
};
|
|
5629
5737
|
|
|
5630
|
-
const RecordInput
|
|
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
|
-
|
|
5640
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
?
|
|
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 {
|
|
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:
|
|
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
|
|
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 =
|
|
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:
|
|
7362
|
-
base:
|
|
7363
|
-
_dark:
|
|
7364
|
-
}, children: jsxRuntime.jsx(react.Grid, { gap: "4", gridTemplateColumns:
|
|
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:
|
|
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 {
|
|
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
|
-
|
|
7378
|
-
|
|
7379
|
-
|
|
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 {
|
|
7398
|
-
const { required, gridColumn =
|
|
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
|
|
7403
|
-
|
|
7404
|
-
|
|
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 {
|
|
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
|
|
7435
|
-
return (jsxRuntime.jsx(Field, { label:
|
|
7436
|
-
return (jsxRuntime.jsx(react.Card.Root, { variant:
|
|
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 =
|
|
7549
|
+
const { required, gridColumn = 'span 12', gridRow = 'span 1', renderDisplay, foreign_key, } = schema;
|
|
7444
7550
|
const isRequired = required?.some((columnId) => columnId === column);
|
|
7445
|
-
const
|
|
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
|
-
|
|
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:
|
|
7460
|
-
gridRow, children: [isMultiple && (jsxRuntime.jsx(react.Flex, { flexFlow:
|
|
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:
|
|
7574
|
+
return (jsxRuntime.jsx(Tag, { closable: true, children: renderDisplay
|
|
7466
7575
|
? renderDisplay(item)
|
|
7467
|
-
: item
|
|
7468
|
-
}) })), !isMultiple && jsxRuntime.jsx(react.Text, { children: getPickedValue() }), errors[`${colLabel}`] && (jsxRuntime.jsx(react.Text, { color:
|
|
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:
|
|
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 =
|
|
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: [
|
|
7509
|
-
base:
|
|
7510
|
-
_dark:
|
|
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:
|
|
7626
|
+
}) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: 'red.400', children: formI18n.required() }))] }));
|
|
7518
7627
|
};
|
|
7519
7628
|
|
|
7520
|
-
const
|
|
7521
|
-
const { formState: { errors },
|
|
7522
|
-
const {
|
|
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
|
|
7527
|
-
|
|
7528
|
-
|
|
7529
|
-
|
|
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 {
|
|
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
|
-
|
|
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 {
|
|
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
|
-
|
|
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 {
|
|
7680
|
-
const { required, gridColumn =
|
|
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:
|
|
7690
|
-
gridRow, children: [jsxRuntime.jsx(react.Text, { children: displayedTime }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color:
|
|
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 {
|
|
7696
|
-
const { required, gridColumn =
|
|
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
|
|
7701
|
-
|
|
7702
|
-
|
|
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(
|
|
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,
|
|
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(
|
|
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((
|
|
8382
|
-
if (!
|
|
8383
|
-
return
|
|
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}_${
|
|
8459
|
+
return cell.id === `${rowId}_${subColumn.id}`;
|
|
8389
8460
|
});
|
|
8390
|
-
return jsxRuntime.jsx(CellRenderer, { cell: foundCell });
|
|
8391
|
-
}) })] }, `chakra-table-card-${
|
|
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;
|