@bsol-oss/react-datatable5 12.0.0-beta.71 → 12.0.0-beta.73
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/README.md +67 -40
- package/dist/index.d.ts +265 -14
- package/dist/index.js +356 -98
- package/dist/index.mjs +353 -99
- package/dist/types/components/Form/SchemaFormContext.d.ts +10 -5
- package/dist/types/components/Form/components/core/FormBody.d.ts +2 -1
- package/dist/types/components/Form/components/core/FormRoot.d.ts +12 -8
- package/dist/types/components/Form/components/fields/DatePicker.d.ts +1 -1
- package/dist/types/components/Form/components/fields/EnumPicker.d.ts +1 -1
- package/dist/types/components/Form/components/fields/IdPicker.d.ts +1 -1
- package/dist/types/components/Form/components/types/CustomJSONSchema7.d.ts +30 -4
- package/dist/types/components/Form/useForm.d.ts +3 -2
- package/dist/types/components/Form/utils/buildErrorMessages.d.ts +219 -0
- package/dist/types/index.d.ts +1 -0
- package/package.json +10 -2
package/dist/index.mjs
CHANGED
|
@@ -3657,8 +3657,8 @@ const AccordionItem = Accordion.Item;
|
|
|
3657
3657
|
//@ts-expect-error TODO: find appropriate type
|
|
3658
3658
|
const SchemaFormContext = createContext({
|
|
3659
3659
|
schema: {},
|
|
3660
|
-
serverUrl:
|
|
3661
|
-
requestUrl:
|
|
3660
|
+
serverUrl: '',
|
|
3661
|
+
requestUrl: '',
|
|
3662
3662
|
order: [],
|
|
3663
3663
|
ignore: [],
|
|
3664
3664
|
include: [],
|
|
@@ -3714,11 +3714,11 @@ const idPickerSanityCheck = (column, foreign_key) => {
|
|
|
3714
3714
|
throw new Error(`The key column does not exist in properties of column ${column} when using id-picker.`);
|
|
3715
3715
|
}
|
|
3716
3716
|
};
|
|
3717
|
-
const FormRoot = ({ schema, idMap, setIdMap, form, serverUrl, translate, children, order = [], ignore = [], include = [], onSubmit = undefined, rowNumber = undefined, requestOptions = {}, getUpdatedData = () => { }, customErrorRenderer, displayConfig = {
|
|
3717
|
+
const FormRoot = ({ schema, idMap, setIdMap, form, serverUrl, translate, children, order = [], ignore = [], include = [], onSubmit = undefined, rowNumber = undefined, requestOptions = {}, getUpdatedData = () => { }, customErrorRenderer, customSuccessRenderer, displayConfig = {
|
|
3718
3718
|
showSubmitButton: true,
|
|
3719
3719
|
showResetButton: true,
|
|
3720
3720
|
showTitle: true,
|
|
3721
|
-
}, }) => {
|
|
3721
|
+
}, dateTimePickerLabels, idPickerLabels, enumPickerLabels, }) => {
|
|
3722
3722
|
const [isSuccess, setIsSuccess] = useState(false);
|
|
3723
3723
|
const [isError, setIsError] = useState(false);
|
|
3724
3724
|
const [isSubmiting, setIsSubmiting] = useState(false);
|
|
@@ -3752,7 +3752,11 @@ const FormRoot = ({ schema, idMap, setIdMap, form, serverUrl, translate, childre
|
|
|
3752
3752
|
setError,
|
|
3753
3753
|
getUpdatedData,
|
|
3754
3754
|
customErrorRenderer,
|
|
3755
|
+
customSuccessRenderer,
|
|
3755
3756
|
displayConfig,
|
|
3757
|
+
dateTimePickerLabels,
|
|
3758
|
+
idPickerLabels,
|
|
3759
|
+
enumPickerLabels,
|
|
3756
3760
|
}, children: jsx(FormProvider, { ...form, children: children }) }));
|
|
3757
3761
|
};
|
|
3758
3762
|
|
|
@@ -4011,14 +4015,16 @@ dayjs.extend(utc);
|
|
|
4011
4015
|
dayjs.extend(timezone);
|
|
4012
4016
|
const DatePicker = ({ column, schema, prefix }) => {
|
|
4013
4017
|
const { watch, formState: { errors }, setValue, } = useFormContext();
|
|
4014
|
-
const { timezone } = useSchemaContext();
|
|
4018
|
+
const { timezone, dateTimePickerLabels } = useSchemaContext();
|
|
4015
4019
|
const formI18n = useFormI18n(column, prefix);
|
|
4016
|
-
const { required, gridColumn =
|
|
4020
|
+
const { required, gridColumn = 'span 12', gridRow = 'span 1', displayDateFormat = 'YYYY-MM-DD', dateFormat = 'YYYY-MM-DD', } = schema;
|
|
4017
4021
|
const isRequired = required?.some((columnId) => columnId === column);
|
|
4018
4022
|
const colLabel = formI18n.colLabel;
|
|
4019
4023
|
const [open, setOpen] = useState(false);
|
|
4020
4024
|
const selectedDate = watch(colLabel);
|
|
4021
|
-
const displayDate = dayjs(selectedDate)
|
|
4025
|
+
const displayDate = dayjs(selectedDate)
|
|
4026
|
+
.tz(timezone)
|
|
4027
|
+
.format(displayDateFormat);
|
|
4022
4028
|
useEffect(() => {
|
|
4023
4029
|
try {
|
|
4024
4030
|
if (selectedDate) {
|
|
@@ -4042,45 +4048,83 @@ const DatePicker = ({ column, schema, prefix }) => {
|
|
|
4042
4048
|
console.error(e);
|
|
4043
4049
|
}
|
|
4044
4050
|
}, [selectedDate, dateFormat, colLabel, setValue]);
|
|
4045
|
-
return (jsxs(Field, { label: formI18n.label(), required: isRequired, alignItems:
|
|
4051
|
+
return (jsxs(Field, { label: formI18n.label(), required: isRequired, alignItems: 'stretch', gridColumn,
|
|
4046
4052
|
gridRow, children: [jsxs(PopoverRoot, { open: open, onOpenChange: (e) => setOpen(e.open), closeOnInteractOutside: true, children: [jsx(PopoverTrigger, { asChild: true, children: jsxs(Button, { size: "sm", variant: "outline", onClick: () => {
|
|
4047
4053
|
setOpen(true);
|
|
4048
|
-
}, justifyContent:
|
|
4054
|
+
}, justifyContent: 'start', children: [jsx(MdDateRange, {}), selectedDate !== undefined ? `${displayDate}` : ''] }) }), jsx(PopoverContent, { children: jsxs(PopoverBody, { children: [jsx(PopoverTitle, {}), jsx(DatePicker$1, { selected: new Date(selectedDate), onDateSelected: ({ date }) => {
|
|
4049
4055
|
setValue(colLabel, dayjs(date).format(dateFormat));
|
|
4050
4056
|
setOpen(false);
|
|
4051
4057
|
}, labels: {
|
|
4052
|
-
monthNamesShort: [
|
|
4053
|
-
formI18n.translate.t(`common.month_1`, {
|
|
4054
|
-
|
|
4055
|
-
|
|
4056
|
-
formI18n.translate.t(`common.
|
|
4057
|
-
|
|
4058
|
-
|
|
4059
|
-
formI18n.translate.t(`common.
|
|
4060
|
-
|
|
4061
|
-
|
|
4062
|
-
formI18n.translate.t(`common.
|
|
4063
|
-
|
|
4064
|
-
|
|
4058
|
+
monthNamesShort: dateTimePickerLabels?.monthNamesShort ?? [
|
|
4059
|
+
formI18n.translate.t(`common.month_1`, {
|
|
4060
|
+
defaultValue: 'January',
|
|
4061
|
+
}),
|
|
4062
|
+
formI18n.translate.t(`common.month_2`, {
|
|
4063
|
+
defaultValue: 'February',
|
|
4064
|
+
}),
|
|
4065
|
+
formI18n.translate.t(`common.month_3`, {
|
|
4066
|
+
defaultValue: 'March',
|
|
4067
|
+
}),
|
|
4068
|
+
formI18n.translate.t(`common.month_4`, {
|
|
4069
|
+
defaultValue: 'April',
|
|
4070
|
+
}),
|
|
4071
|
+
formI18n.translate.t(`common.month_5`, {
|
|
4072
|
+
defaultValue: 'May',
|
|
4073
|
+
}),
|
|
4074
|
+
formI18n.translate.t(`common.month_6`, {
|
|
4075
|
+
defaultValue: 'June',
|
|
4076
|
+
}),
|
|
4077
|
+
formI18n.translate.t(`common.month_7`, {
|
|
4078
|
+
defaultValue: 'July',
|
|
4079
|
+
}),
|
|
4080
|
+
formI18n.translate.t(`common.month_8`, {
|
|
4081
|
+
defaultValue: 'August',
|
|
4082
|
+
}),
|
|
4083
|
+
formI18n.translate.t(`common.month_9`, {
|
|
4084
|
+
defaultValue: 'September',
|
|
4085
|
+
}),
|
|
4086
|
+
formI18n.translate.t(`common.month_10`, {
|
|
4087
|
+
defaultValue: 'October',
|
|
4088
|
+
}),
|
|
4089
|
+
formI18n.translate.t(`common.month_11`, {
|
|
4090
|
+
defaultValue: 'November',
|
|
4091
|
+
}),
|
|
4092
|
+
formI18n.translate.t(`common.month_12`, {
|
|
4093
|
+
defaultValue: 'December',
|
|
4094
|
+
}),
|
|
4065
4095
|
],
|
|
4066
|
-
weekdayNamesShort: [
|
|
4067
|
-
formI18n.translate.t(`common.weekday_1`, {
|
|
4068
|
-
|
|
4069
|
-
|
|
4096
|
+
weekdayNamesShort: dateTimePickerLabels?.weekdayNamesShort ?? [
|
|
4097
|
+
formI18n.translate.t(`common.weekday_1`, {
|
|
4098
|
+
defaultValue: 'Sun',
|
|
4099
|
+
}),
|
|
4100
|
+
formI18n.translate.t(`common.weekday_2`, {
|
|
4101
|
+
defaultValue: 'Mon',
|
|
4102
|
+
}),
|
|
4103
|
+
formI18n.translate.t(`common.weekday_3`, {
|
|
4104
|
+
defaultValue: 'Tue',
|
|
4105
|
+
}),
|
|
4070
4106
|
formI18n.translate.t(`common.weekday_4`, {
|
|
4071
|
-
defaultValue:
|
|
4107
|
+
defaultValue: 'Wed',
|
|
4108
|
+
}),
|
|
4109
|
+
formI18n.translate.t(`common.weekday_5`, {
|
|
4110
|
+
defaultValue: 'Thu',
|
|
4111
|
+
}),
|
|
4112
|
+
formI18n.translate.t(`common.weekday_6`, {
|
|
4113
|
+
defaultValue: 'Fri',
|
|
4114
|
+
}),
|
|
4115
|
+
formI18n.translate.t(`common.weekday_7`, {
|
|
4116
|
+
defaultValue: 'Sat',
|
|
4072
4117
|
}),
|
|
4073
|
-
formI18n.translate.t(`common.weekday_5`, { defaultValue: "Thu" }),
|
|
4074
|
-
formI18n.translate.t(`common.weekday_6`, { defaultValue: "Fri" }),
|
|
4075
|
-
formI18n.translate.t(`common.weekday_7`, { defaultValue: "Sat" }),
|
|
4076
4118
|
],
|
|
4077
|
-
backButtonLabel:
|
|
4078
|
-
|
|
4079
|
-
|
|
4080
|
-
|
|
4081
|
-
|
|
4082
|
-
|
|
4083
|
-
|
|
4119
|
+
backButtonLabel: dateTimePickerLabels?.backButtonLabel ??
|
|
4120
|
+
formI18n.translate.t(`common.back_button`, {
|
|
4121
|
+
defaultValue: 'Back',
|
|
4122
|
+
}),
|
|
4123
|
+
forwardButtonLabel: dateTimePickerLabels?.forwardButtonLabel ??
|
|
4124
|
+
formI18n.translate.t(`common.forward_button`, {
|
|
4125
|
+
defaultValue: 'Forward',
|
|
4126
|
+
}),
|
|
4127
|
+
} })] }) })] }), errors[`${column}`] && (jsx(Text, { color: 'red.400', children: formI18n.required() }))] }));
|
|
4084
4128
|
};
|
|
4085
4129
|
|
|
4086
4130
|
function filterArray(array, searchTerm) {
|
|
@@ -4095,10 +4139,10 @@ function filterArray(array, searchTerm) {
|
|
|
4095
4139
|
|
|
4096
4140
|
const EnumPicker = ({ column, isMultiple = false, schema, prefix, showTotalAndLimit = false, }) => {
|
|
4097
4141
|
const { watch, formState: { errors }, setValue, } = useFormContext();
|
|
4098
|
-
const { translate } = useSchemaContext();
|
|
4142
|
+
const { translate, enumPickerLabels } = useSchemaContext();
|
|
4099
4143
|
const { required, variant } = schema;
|
|
4100
4144
|
const isRequired = required?.some((columnId) => columnId === column);
|
|
4101
|
-
const { gridColumn =
|
|
4145
|
+
const { gridColumn = 'span 12', gridRow = 'span 1', renderDisplay } = schema;
|
|
4102
4146
|
const [searchText, setSearchText] = useState();
|
|
4103
4147
|
const [limit, setLimit] = useState(10);
|
|
4104
4148
|
const [openSearchResult, setOpenSearchResult] = useState();
|
|
@@ -4113,9 +4157,9 @@ const EnumPicker = ({ column, isMultiple = false, schema, prefix, showTotalAndLi
|
|
|
4113
4157
|
setSearchText(event.target.value);
|
|
4114
4158
|
setLimit(10);
|
|
4115
4159
|
};
|
|
4116
|
-
if (variant ===
|
|
4117
|
-
return (jsx(Field, { label: `${translate.t(removeIndex(`${colLabel}.field_label`))}`, required: isRequired, alignItems:
|
|
4118
|
-
gridRow, children: jsx(RadioGroup$1.Root, { defaultValue: "1", children: jsx(HStack, { gap: "6", children: filterArray(dataList, searchText ??
|
|
4160
|
+
if (variant === 'radio') {
|
|
4161
|
+
return (jsx(Field, { label: `${translate.t(removeIndex(`${colLabel}.field_label`))}`, required: isRequired, alignItems: 'stretch', gridColumn,
|
|
4162
|
+
gridRow, children: jsx(RadioGroup$1.Root, { defaultValue: "1", children: jsx(HStack, { gap: "6", children: filterArray(dataList, searchText ?? '').map((item) => {
|
|
4119
4163
|
return (jsxs(RadioGroup$1.Item, { onClick: () => {
|
|
4120
4164
|
if (!isMultiple) {
|
|
4121
4165
|
setOpenSearchResult(false);
|
|
@@ -4129,8 +4173,8 @@ const EnumPicker = ({ column, isMultiple = false, schema, prefix, showTotalAndLi
|
|
|
4129
4173
|
: translate.t(removeIndex(`${colLabel}.${item}`)) })] }, `${colLabel}-${item}`));
|
|
4130
4174
|
}) }) }) }));
|
|
4131
4175
|
}
|
|
4132
|
-
return (jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.field_label`))}`, required: isRequired, alignItems:
|
|
4133
|
-
gridRow, children: [isMultiple && (jsxs(Flex, { flexFlow:
|
|
4176
|
+
return (jsxs(Field, { label: `${translate.t(removeIndex(`${colLabel}.field_label`))}`, required: isRequired, alignItems: 'stretch', gridColumn,
|
|
4177
|
+
gridRow, children: [isMultiple && (jsxs(Flex, { flexFlow: 'wrap', gap: 1, children: [watchEnums.map((enumValue) => {
|
|
4134
4178
|
const item = enumValue;
|
|
4135
4179
|
if (!!item === false) {
|
|
4136
4180
|
return jsx(Fragment, {});
|
|
@@ -4140,18 +4184,20 @@ const EnumPicker = ({ column, isMultiple = false, schema, prefix, showTotalAndLi
|
|
|
4140
4184
|
}, children: !!renderDisplay === true
|
|
4141
4185
|
? renderDisplay(item)
|
|
4142
4186
|
: translate.t(removeIndex(`${colLabel}.${item}`)) }, item));
|
|
4143
|
-
}), jsx(Tag, { size: "lg", cursor:
|
|
4187
|
+
}), jsx(Tag, { size: "lg", cursor: 'pointer', onClick: () => {
|
|
4144
4188
|
setOpenSearchResult(true);
|
|
4145
|
-
}, children:
|
|
4189
|
+
}, children: enumPickerLabels?.addMore ??
|
|
4190
|
+
translate.t(removeIndex(`${colLabel}.add_more`)) }, `${colLabel}-add-more-tag`)] })), !isMultiple && (jsx(Button, { variant: 'outline', onClick: () => {
|
|
4146
4191
|
setOpenSearchResult(true);
|
|
4147
|
-
}, justifyContent:
|
|
4148
|
-
?
|
|
4149
|
-
: translate.t(removeIndex(`${colLabel}.${watchEnum ??
|
|
4192
|
+
}, justifyContent: 'start', children: !!watchEnum === false
|
|
4193
|
+
? ''
|
|
4194
|
+
: translate.t(removeIndex(`${colLabel}.${watchEnum ?? 'null'}`)) })), jsxs(PopoverRoot, { open: openSearchResult, onOpenChange: (e) => setOpenSearchResult(e.open), closeOnInteractOutside: true, initialFocusEl: () => ref.current, positioning: { placement: 'bottom-start' }, children: [jsx(PopoverTrigger, {}), jsx(PopoverContent, { portalled: false, children: jsxs(PopoverBody, { display: 'grid', gap: 1, children: [jsx(Input, { placeholder: enumPickerLabels?.typeToSearch ??
|
|
4195
|
+
translate.t(`${colLabel}.type_to_search`), onChange: (event) => {
|
|
4150
4196
|
onSearchChange(event);
|
|
4151
4197
|
setOpenSearchResult(true);
|
|
4152
|
-
}, autoComplete: "off", ref: ref }), jsx(PopoverTitle, {}), showTotalAndLimit && (jsx(Text, { children: `${translate.t(removeIndex(`${colLabel}.total`))}: ${count}, ${translate.t(removeIndex(`${colLabel}.showing`))} ${limit}` })), jsxs(Grid, { overflow:
|
|
4198
|
+
}, autoComplete: "off", ref: ref }), jsx(PopoverTitle, {}), showTotalAndLimit && (jsx(Text, { children: `${enumPickerLabels?.total ?? translate.t(removeIndex(`${colLabel}.total`))}: ${count}, ${enumPickerLabels?.showing ?? translate.t(removeIndex(`${colLabel}.showing`))} ${limit}` })), jsxs(Grid, { overflow: 'auto', maxHeight: '20rem', children: [jsx(Flex, { flexFlow: 'column wrap', children: dataList
|
|
4153
4199
|
.filter((item) => {
|
|
4154
|
-
const searchTerm = (searchText ||
|
|
4200
|
+
const searchTerm = (searchText || '').toLowerCase();
|
|
4155
4201
|
if (!searchTerm)
|
|
4156
4202
|
return true;
|
|
4157
4203
|
// Check if the original enum value contains the search text
|
|
@@ -4171,7 +4217,7 @@ const EnumPicker = ({ column, isMultiple = false, schema, prefix, showTotalAndLi
|
|
|
4171
4217
|
const selected = isMultiple
|
|
4172
4218
|
? watchEnums.some((enumValue) => item === enumValue)
|
|
4173
4219
|
: watchEnum == item;
|
|
4174
|
-
return (jsx(Box, { cursor:
|
|
4220
|
+
return (jsx(Box, { cursor: 'pointer', onClick: () => {
|
|
4175
4221
|
if (!isMultiple) {
|
|
4176
4222
|
setOpenSearchResult(false);
|
|
4177
4223
|
setValue(colLabel, item);
|
|
@@ -4179,10 +4225,11 @@ const EnumPicker = ({ column, isMultiple = false, schema, prefix, showTotalAndLi
|
|
|
4179
4225
|
}
|
|
4180
4226
|
const newSet = new Set([...(watchEnums ?? []), item]);
|
|
4181
4227
|
setValue(colLabel, [...newSet]);
|
|
4182
|
-
}, ...(selected ? { color:
|
|
4228
|
+
}, ...(selected ? { color: 'colorPalette.400/50' } : {}), children: !!renderDisplay === true
|
|
4183
4229
|
? renderDisplay(item)
|
|
4184
4230
|
: translate.t(removeIndex(`${colLabel}.${item}`)) }, `${colLabel}-${item}`));
|
|
4185
|
-
}) }), isDirty && (jsx(Fragment, { children: dataList.length <= 0 && (jsx(Fragment, { children:
|
|
4231
|
+
}) }), isDirty && (jsx(Fragment, { children: dataList.length <= 0 && (jsx(Fragment, { children: enumPickerLabels?.emptySearchResult ??
|
|
4232
|
+
translate.t(removeIndex(`${colLabel}.empty_search_result`)) })) }))] })] }) })] }), errors[`${colLabel}`] && (jsx(Text, { color: 'red.400', children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }));
|
|
4186
4233
|
};
|
|
4187
4234
|
|
|
4188
4235
|
function isEnteringWindow(_ref) {
|
|
@@ -4595,12 +4642,12 @@ const getTableData = async ({ serverUrl, in_table, searching = "", where = [], l
|
|
|
4595
4642
|
|
|
4596
4643
|
const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
4597
4644
|
const { watch, formState: { errors }, setValue, } = useFormContext();
|
|
4598
|
-
const { serverUrl, idMap, setIdMap, schema: parentSchema, } = useSchemaContext();
|
|
4645
|
+
const { serverUrl, idMap, setIdMap, schema: parentSchema, idPickerLabels, } = useSchemaContext();
|
|
4599
4646
|
const formI18n = useFormI18n(column, prefix);
|
|
4600
|
-
const { required, gridColumn =
|
|
4647
|
+
const { required, gridColumn = 'span 12', gridRow = 'span 1', renderDisplay, foreign_key, } = schema;
|
|
4601
4648
|
const isRequired = required?.some((columnId) => columnId === column);
|
|
4602
4649
|
const { table, column: column_ref, display_column, customQueryFn, } = foreign_key;
|
|
4603
|
-
const [searchText, setSearchText] = useState(
|
|
4650
|
+
const [searchText, setSearchText] = useState('');
|
|
4604
4651
|
const [limit, setLimit] = useState(10);
|
|
4605
4652
|
const [openSearchResult, setOpenSearchResult] = useState();
|
|
4606
4653
|
const [page, setPage] = useState(0);
|
|
@@ -4614,7 +4661,7 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4614
4661
|
queryFn: async () => {
|
|
4615
4662
|
if (customQueryFn) {
|
|
4616
4663
|
const { data, idMap } = await customQueryFn({
|
|
4617
|
-
searching: searchText ??
|
|
4664
|
+
searching: searchText ?? '',
|
|
4618
4665
|
limit: limit,
|
|
4619
4666
|
offset: page * limit,
|
|
4620
4667
|
});
|
|
@@ -4625,7 +4672,7 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4625
4672
|
}
|
|
4626
4673
|
const data = await getTableData({
|
|
4627
4674
|
serverUrl,
|
|
4628
|
-
searching: searchText ??
|
|
4675
|
+
searching: searchText ?? '',
|
|
4629
4676
|
in_table: table,
|
|
4630
4677
|
limit: limit,
|
|
4631
4678
|
offset: page * limit,
|
|
@@ -4655,7 +4702,7 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4655
4702
|
queryFn: async () => {
|
|
4656
4703
|
if (customQueryFn) {
|
|
4657
4704
|
const { data, idMap } = await customQueryFn({
|
|
4658
|
-
searching: watchIds.join(
|
|
4705
|
+
searching: watchIds.join(','),
|
|
4659
4706
|
limit: isMultiple ? watchIds.length : 1,
|
|
4660
4707
|
offset: 0,
|
|
4661
4708
|
});
|
|
@@ -4667,7 +4714,7 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4667
4714
|
if (!watchId && (!watchIds || watchIds.length === 0)) {
|
|
4668
4715
|
return { data: [] };
|
|
4669
4716
|
}
|
|
4670
|
-
const searchValue = isMultiple ? watchIds.join(
|
|
4717
|
+
const searchValue = isMultiple ? watchIds.join(',') : watchId;
|
|
4671
4718
|
const data = await getTableData({
|
|
4672
4719
|
serverUrl,
|
|
4673
4720
|
searching: searchValue,
|
|
@@ -4704,7 +4751,7 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4704
4751
|
useEffect(() => {
|
|
4705
4752
|
if (openSearchResult) {
|
|
4706
4753
|
// Reset search text when opening the popover
|
|
4707
|
-
setSearchText(
|
|
4754
|
+
setSearchText('');
|
|
4708
4755
|
// Reset page to first page
|
|
4709
4756
|
setPage(0);
|
|
4710
4757
|
// Fetch initial data
|
|
@@ -4730,44 +4777,44 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4730
4777
|
const count = data?.count ?? 0;
|
|
4731
4778
|
const getPickedValue = () => {
|
|
4732
4779
|
if (Object.keys(idMap).length <= 0) {
|
|
4733
|
-
return
|
|
4780
|
+
return '';
|
|
4734
4781
|
}
|
|
4735
4782
|
const record = idMap[watchId];
|
|
4736
4783
|
if (record === undefined) {
|
|
4737
|
-
return
|
|
4784
|
+
return '';
|
|
4738
4785
|
}
|
|
4739
4786
|
if (!!renderDisplay === true) {
|
|
4740
4787
|
return renderDisplay(record);
|
|
4741
4788
|
}
|
|
4742
4789
|
return record[display_column];
|
|
4743
4790
|
};
|
|
4744
|
-
return (jsxs(Field, { label: formI18n.label(), required: isRequired, alignItems:
|
|
4745
|
-
gridRow, children: [isMultiple && (jsxs(Flex, { flexFlow:
|
|
4791
|
+
return (jsxs(Field, { label: formI18n.label(), required: isRequired, alignItems: 'stretch', gridColumn,
|
|
4792
|
+
gridRow, children: [isMultiple && (jsxs(Flex, { flexFlow: 'wrap', gap: 1, children: [watchIds.map((id) => {
|
|
4746
4793
|
const item = idMap[id];
|
|
4747
4794
|
if (item === undefined) {
|
|
4748
|
-
return (jsx(Text, { children: formI18n.t('undefined') }, id));
|
|
4795
|
+
return (jsx(Text, { children: idPickerLabels?.undefined ?? formI18n.t('undefined') }, id));
|
|
4749
4796
|
}
|
|
4750
4797
|
return (jsx(Tag, { closable: true, onClick: () => {
|
|
4751
4798
|
setValue(colLabel, watchIds.filter((itemId) => itemId !== item[column_ref]));
|
|
4752
4799
|
}, children: !!renderDisplay === true
|
|
4753
4800
|
? renderDisplay(item)
|
|
4754
4801
|
: item[display_column] }, id));
|
|
4755
|
-
}), jsx(Tag, { cursor:
|
|
4802
|
+
}), jsx(Tag, { cursor: 'pointer', onClick: () => {
|
|
4756
4803
|
setOpenSearchResult(true);
|
|
4757
|
-
}, children: formI18n.t('add_more') })] })), !isMultiple && (jsx(Button, { variant:
|
|
4804
|
+
}, children: idPickerLabels?.addMore ?? formI18n.t('add_more') })] })), !isMultiple && (jsx(Button, { variant: 'outline', onClick: () => {
|
|
4758
4805
|
setOpenSearchResult(true);
|
|
4759
|
-
}, justifyContent:
|
|
4806
|
+
}, justifyContent: 'start', children: queryDefault.isLoading ? jsx(Spinner, { size: "sm" }) : getPickedValue() })), jsxs(PopoverRoot, { open: openSearchResult, onOpenChange: (e) => setOpenSearchResult(e.open), closeOnInteractOutside: true, initialFocusEl: () => ref.current, positioning: { placement: 'bottom-start', strategy: 'fixed' }, children: [jsx(PopoverTrigger, {}), jsx(PopoverContent, { portalled: false, children: jsxs(PopoverBody, { display: 'grid', gap: 1, children: [jsx(Input, { placeholder: idPickerLabels?.typeToSearch ?? formI18n.t('type_to_search'), onChange: onSearchChange, autoComplete: "off", ref: ref, value: searchText }), jsx(PopoverTitle, {}), openSearchResult && (jsxs(Fragment, { children: [(isFetching || isLoading || isPending) && jsx(Spinner, {}), isError && (jsx(Icon, { color: 'red.400', children: jsx(BiError, {}) })), jsxs(Flex, { justifyContent: "space-between", alignItems: "center", children: [jsxs(Flex, { alignItems: "center", gap: "2", children: [jsx(InfoTip, { children: `${idPickerLabels?.total ?? formI18n.t('total')} ${count}, ${idPickerLabels?.showing ?? formI18n.t('showing')} ${limit} ${idPickerLabels?.perPage ?? formI18n.t('per_page', { defaultValue: 'per page' })}` }), jsxs(Text, { fontSize: "sm", fontWeight: "bold", children: [count, jsxs(Text, { as: "span", fontSize: "xs", ml: "1", color: "gray.500", children: ["/", ' ', count > 0
|
|
4760
4807
|
? `${page * limit + 1}-${Math.min((page + 1) * limit, count)}`
|
|
4761
|
-
:
|
|
4762
|
-
padding:
|
|
4763
|
-
borderRadius:
|
|
4764
|
-
border:
|
|
4765
|
-
fontSize:
|
|
4766
|
-
}, children: [jsx("option", { value: "5", children: "5" }), jsx("option", { value: "10", children: "10" }), jsx("option", { value: "20", children: "20" }), jsx("option", { value: "30", children: "30" })] }) })] }), jsx(Grid, { overflowY:
|
|
4808
|
+
: '0'] })] })] }), jsx(Box, { children: jsxs("select", { value: limit, onChange: handleLimitChange, style: {
|
|
4809
|
+
padding: '4px 8px',
|
|
4810
|
+
borderRadius: '4px',
|
|
4811
|
+
border: '1px solid #ccc',
|
|
4812
|
+
fontSize: '14px',
|
|
4813
|
+
}, children: [jsx("option", { value: "5", children: "5" }), jsx("option", { value: "10", children: "10" }), jsx("option", { value: "20", children: "20" }), jsx("option", { value: "30", children: "30" })] }) })] }), jsx(Grid, { overflowY: 'auto', children: dataList.length > 0 ? (jsx(Flex, { flexFlow: 'column wrap', gap: 1, children: dataList.map((item) => {
|
|
4767
4814
|
const selected = isMultiple
|
|
4768
4815
|
? watchIds.some((id) => item[column_ref] === id)
|
|
4769
4816
|
: watchId === item[column_ref];
|
|
4770
|
-
return (jsx(Box, { cursor:
|
|
4817
|
+
return (jsx(Box, { cursor: 'pointer', onClick: () => {
|
|
4771
4818
|
if (!isMultiple) {
|
|
4772
4819
|
setOpenSearchResult(false);
|
|
4773
4820
|
setValue(colLabel, item[column_ref]);
|
|
@@ -4783,15 +4830,17 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4783
4830
|
setValue(colLabel, [...newSet]);
|
|
4784
4831
|
}, opacity: 0.7, _hover: { opacity: 1 }, ...(selected
|
|
4785
4832
|
? {
|
|
4786
|
-
color:
|
|
4787
|
-
fontWeight:
|
|
4833
|
+
color: 'colorPalette.400/50',
|
|
4834
|
+
fontWeight: 'bold',
|
|
4788
4835
|
}
|
|
4789
4836
|
: {}), children: !!renderDisplay === true
|
|
4790
4837
|
? renderDisplay(item)
|
|
4791
4838
|
: item[display_column] }, item[column_ref]));
|
|
4792
4839
|
}) })) : (jsx(Text, { children: searchText
|
|
4793
|
-
?
|
|
4794
|
-
|
|
4840
|
+
? idPickerLabels?.emptySearchResult ??
|
|
4841
|
+
formI18n.t('empty_search_result')
|
|
4842
|
+
: idPickerLabels?.initialResults ??
|
|
4843
|
+
formI18n.t('initial_results') })) }), jsx(PaginationRoot, { justifySelf: 'center', count: count, pageSize: limit, defaultPage: 1, page: page + 1, onPageChange: (e) => setPage(e.page - 1), children: jsxs(HStack, { gap: "4", children: [jsx(PaginationPrevTrigger, {}), count > 0 && jsx(PaginationPageText, {}), jsx(PaginationNextTrigger, {})] }) })] }))] }) })] }), errors[`${colLabel}`] && (jsx(Text, { color: 'red.400', children: formI18n.required() }))] }));
|
|
4795
4844
|
};
|
|
4796
4845
|
|
|
4797
4846
|
const NumberInputRoot = React.forwardRef(function NumberInput$1(props, ref) {
|
|
@@ -5478,7 +5527,7 @@ dayjs.extend(utc);
|
|
|
5478
5527
|
dayjs.extend(timezone);
|
|
5479
5528
|
const DateTimePicker = ({ column, schema, prefix, }) => {
|
|
5480
5529
|
const { watch, formState: { errors }, setValue, } = useFormContext();
|
|
5481
|
-
const { timezone } = useSchemaContext();
|
|
5530
|
+
const { timezone, dateTimePickerLabels } = useSchemaContext();
|
|
5482
5531
|
const formI18n = useFormI18n(column, prefix);
|
|
5483
5532
|
const { required, gridColumn = "span 12", gridRow = "span 1", displayDateFormat = "YYYY-MM-DD HH:mm:ss",
|
|
5484
5533
|
// with timezone
|
|
@@ -5519,7 +5568,7 @@ const DateTimePicker = ({ column, schema, prefix, }) => {
|
|
|
5519
5568
|
}, justifyContent: "start", children: [jsx(MdDateRange, {}), selectedDate !== undefined ? `${displayDate}` : ""] }) }), jsx(PopoverContent, { minW: "450px", children: jsxs(PopoverBody, { children: [jsx(PopoverTitle, {}), jsx(DateTimePicker$1, { value: selectedDate, onChange: (date) => {
|
|
5520
5569
|
setValue(colLabel, dayjs(date).tz(timezone).format(dateFormat));
|
|
5521
5570
|
}, timezone: timezone, labels: {
|
|
5522
|
-
monthNamesShort: [
|
|
5571
|
+
monthNamesShort: dateTimePickerLabels?.monthNamesShort ?? [
|
|
5523
5572
|
formI18n.translate.t(`common.month_1`, { defaultValue: "January" }),
|
|
5524
5573
|
formI18n.translate.t(`common.month_2`, { defaultValue: "February" }),
|
|
5525
5574
|
formI18n.translate.t(`common.month_3`, { defaultValue: "March" }),
|
|
@@ -5533,7 +5582,7 @@ const DateTimePicker = ({ column, schema, prefix, }) => {
|
|
|
5533
5582
|
formI18n.translate.t(`common.month_11`, { defaultValue: "November" }),
|
|
5534
5583
|
formI18n.translate.t(`common.month_12`, { defaultValue: "December" }),
|
|
5535
5584
|
],
|
|
5536
|
-
weekdayNamesShort: [
|
|
5585
|
+
weekdayNamesShort: dateTimePickerLabels?.weekdayNamesShort ?? [
|
|
5537
5586
|
formI18n.translate.t(`common.weekday_1`, { defaultValue: "Sun" }),
|
|
5538
5587
|
formI18n.translate.t(`common.weekday_2`, { defaultValue: "Mon" }),
|
|
5539
5588
|
formI18n.translate.t(`common.weekday_3`, { defaultValue: "Tue" }),
|
|
@@ -5544,10 +5593,10 @@ const DateTimePicker = ({ column, schema, prefix, }) => {
|
|
|
5544
5593
|
formI18n.translate.t(`common.weekday_6`, { defaultValue: "Fri" }),
|
|
5545
5594
|
formI18n.translate.t(`common.weekday_7`, { defaultValue: "Sat" }),
|
|
5546
5595
|
],
|
|
5547
|
-
backButtonLabel: formI18n.translate.t(`common.back_button`, {
|
|
5596
|
+
backButtonLabel: dateTimePickerLabels?.backButtonLabel ?? formI18n.translate.t(`common.back_button`, {
|
|
5548
5597
|
defaultValue: "Back",
|
|
5549
5598
|
}),
|
|
5550
|
-
forwardButtonLabel: formI18n.translate.t(`common.forward_button`, {
|
|
5599
|
+
forwardButtonLabel: dateTimePickerLabels?.forwardButtonLabel ?? formI18n.translate.t(`common.forward_button`, {
|
|
5551
5600
|
defaultValue: "Forward",
|
|
5552
5601
|
}),
|
|
5553
5602
|
} })] }) })] }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: formI18n.required() }))] }));
|
|
@@ -6073,7 +6122,7 @@ const SubmitButton = () => {
|
|
|
6073
6122
|
};
|
|
6074
6123
|
|
|
6075
6124
|
const FormBody = () => {
|
|
6076
|
-
const { schema, requestUrl, order, ignore, include, onSubmit, translate, requestOptions, isSuccess, setIsSuccess, isError, setIsError, isSubmiting, setIsSubmiting, isConfirming, setIsConfirming, validatedData, setValidatedData, error, setError, getUpdatedData, customErrorRenderer, displayConfig, } = useSchemaContext();
|
|
6125
|
+
const { schema, requestUrl, order, ignore, include, onSubmit, translate, requestOptions, isSuccess, setIsSuccess, isError, setIsError, isSubmiting, setIsSubmiting, isConfirming, setIsConfirming, validatedData, setValidatedData, error, setError, getUpdatedData, customErrorRenderer, customSuccessRenderer, displayConfig, } = useSchemaContext();
|
|
6077
6126
|
const { showSubmitButton, showResetButton } = displayConfig;
|
|
6078
6127
|
const methods = useFormContext();
|
|
6079
6128
|
const { properties } = schema;
|
|
@@ -6170,15 +6219,19 @@ const FormBody = () => {
|
|
|
6170
6219
|
include,
|
|
6171
6220
|
});
|
|
6172
6221
|
if (isSuccess) {
|
|
6173
|
-
|
|
6174
|
-
|
|
6175
|
-
|
|
6176
|
-
|
|
6177
|
-
|
|
6178
|
-
|
|
6179
|
-
|
|
6180
|
-
|
|
6181
|
-
|
|
6222
|
+
const resetHandler = async () => {
|
|
6223
|
+
setIsError(false);
|
|
6224
|
+
setIsSubmiting(false);
|
|
6225
|
+
setIsSuccess(false);
|
|
6226
|
+
setIsConfirming(false);
|
|
6227
|
+
setValidatedData(undefined);
|
|
6228
|
+
const data = await getUpdatedData();
|
|
6229
|
+
methods.reset(data);
|
|
6230
|
+
};
|
|
6231
|
+
if (customSuccessRenderer) {
|
|
6232
|
+
return customSuccessRenderer(resetHandler);
|
|
6233
|
+
}
|
|
6234
|
+
return (jsxs(Flex, { flexFlow: "column", gap: "2", children: [jsxs(Alert.Root, { status: "success", children: [jsx(Alert.Indicator, {}), jsx(Alert.Content, { children: jsx(Alert.Title, { children: translate.t("submit_success") }) })] }), jsx(Flex, { justifyContent: "end", children: jsx(Button$1, { onClick: resetHandler, formNoValidate: true, children: translate.t("submit_again") }) })] }));
|
|
6182
6235
|
}
|
|
6183
6236
|
if (isConfirming) {
|
|
6184
6237
|
return (jsxs(Flex, { flexFlow: "column", gap: "2", children: [jsx(Grid, { gap: 4, gridTemplateColumns: "repeat(12, 1fr)", gridTemplateRows: "repeat(12, max-content)", autoFlow: "row", children: ordered.map((column) => {
|
|
@@ -6216,12 +6269,12 @@ const DefaultForm = ({ formConfig, }) => {
|
|
|
6216
6269
|
return (jsx(FormRoot, { ...formConfig, children: jsxs(Grid, { gap: "2", children: [showTitle && jsx(FormTitle, {}), jsx(FormBody, {})] }) }));
|
|
6217
6270
|
};
|
|
6218
6271
|
|
|
6219
|
-
const useForm = ({ preLoadedValues, keyPrefix }) => {
|
|
6272
|
+
const useForm = ({ preLoadedValues, keyPrefix, namespace }) => {
|
|
6220
6273
|
const form = useForm$1({
|
|
6221
6274
|
values: preLoadedValues,
|
|
6222
6275
|
});
|
|
6223
6276
|
const [idMap, setIdMap] = useState({});
|
|
6224
|
-
const translate = useTranslation("", { keyPrefix });
|
|
6277
|
+
const translate = useTranslation(namespace || "", { keyPrefix });
|
|
6225
6278
|
return {
|
|
6226
6279
|
form,
|
|
6227
6280
|
idMap,
|
|
@@ -6230,6 +6283,207 @@ const useForm = ({ preLoadedValues, keyPrefix }) => {
|
|
|
6230
6283
|
};
|
|
6231
6284
|
};
|
|
6232
6285
|
|
|
6286
|
+
/**
|
|
6287
|
+
* Type definitions for error message configuration
|
|
6288
|
+
*/
|
|
6289
|
+
/**
|
|
6290
|
+
* Schema-level error message builder
|
|
6291
|
+
*
|
|
6292
|
+
* Builds a complete errorMessage object compatible with ajv-errors plugin.
|
|
6293
|
+
* Supports both i18n translation keys and plain string messages.
|
|
6294
|
+
*
|
|
6295
|
+
* @param config - Error message configuration
|
|
6296
|
+
* @returns Complete errorMessage object for JSON Schema
|
|
6297
|
+
*
|
|
6298
|
+
* @example
|
|
6299
|
+
* ```typescript
|
|
6300
|
+
* // Simple required field errors
|
|
6301
|
+
* const errorMessage = buildErrorMessages({
|
|
6302
|
+
* required: {
|
|
6303
|
+
* username: "Username is required",
|
|
6304
|
+
* email: "user.email.field_required" // i18n key
|
|
6305
|
+
* }
|
|
6306
|
+
* });
|
|
6307
|
+
*
|
|
6308
|
+
* // With validation rules
|
|
6309
|
+
* const errorMessage = buildErrorMessages({
|
|
6310
|
+
* required: {
|
|
6311
|
+
* password: "Password is required"
|
|
6312
|
+
* },
|
|
6313
|
+
* properties: {
|
|
6314
|
+
* password: {
|
|
6315
|
+
* minLength: "Password must be at least 8 characters",
|
|
6316
|
+
* pattern: "Password must contain letters and numbers"
|
|
6317
|
+
* },
|
|
6318
|
+
* age: {
|
|
6319
|
+
* minimum: "Must be 18 or older",
|
|
6320
|
+
* maximum: "Must be under 120"
|
|
6321
|
+
* }
|
|
6322
|
+
* }
|
|
6323
|
+
* });
|
|
6324
|
+
*
|
|
6325
|
+
* // With global fallbacks
|
|
6326
|
+
* const errorMessage = buildErrorMessages({
|
|
6327
|
+
* required: {
|
|
6328
|
+
* email: "Email is required"
|
|
6329
|
+
* },
|
|
6330
|
+
* minLength: "This field is too short", // applies to all fields
|
|
6331
|
+
* minimum: "Value is too small"
|
|
6332
|
+
* });
|
|
6333
|
+
* ```
|
|
6334
|
+
*/
|
|
6335
|
+
const buildErrorMessages = (config) => {
|
|
6336
|
+
const result = {};
|
|
6337
|
+
// Add required field errors
|
|
6338
|
+
if (config.required && Object.keys(config.required).length > 0) {
|
|
6339
|
+
result.required = config.required;
|
|
6340
|
+
}
|
|
6341
|
+
// Add field-specific validation errors
|
|
6342
|
+
if (config.properties && Object.keys(config.properties).length > 0) {
|
|
6343
|
+
result.properties = config.properties;
|
|
6344
|
+
}
|
|
6345
|
+
// Add global fallback error messages
|
|
6346
|
+
const globalKeys = [
|
|
6347
|
+
"minLength",
|
|
6348
|
+
"maxLength",
|
|
6349
|
+
"pattern",
|
|
6350
|
+
"minimum",
|
|
6351
|
+
"maximum",
|
|
6352
|
+
"multipleOf",
|
|
6353
|
+
"format",
|
|
6354
|
+
"type",
|
|
6355
|
+
"enum",
|
|
6356
|
+
];
|
|
6357
|
+
globalKeys.forEach((key) => {
|
|
6358
|
+
if (config[key]) {
|
|
6359
|
+
result[key] = config[key];
|
|
6360
|
+
}
|
|
6361
|
+
});
|
|
6362
|
+
return result;
|
|
6363
|
+
};
|
|
6364
|
+
/**
|
|
6365
|
+
* Helper function to build required field errors
|
|
6366
|
+
*
|
|
6367
|
+
* Simplifies creating required field error messages, especially useful
|
|
6368
|
+
* for generating i18n translation keys following a pattern.
|
|
6369
|
+
*
|
|
6370
|
+
* @param fields - Array of required field names
|
|
6371
|
+
* @param messageOrGenerator - Either a string template or function to generate messages
|
|
6372
|
+
* @returns Required field error configuration
|
|
6373
|
+
*
|
|
6374
|
+
* @example
|
|
6375
|
+
* ```typescript
|
|
6376
|
+
* // Plain string messages
|
|
6377
|
+
* const required = buildRequiredErrors(
|
|
6378
|
+
* ["username", "email", "password"],
|
|
6379
|
+
* (field) => `${field} is required`
|
|
6380
|
+
* );
|
|
6381
|
+
* // Result: { username: "username is required", email: "email is required", ... }
|
|
6382
|
+
*
|
|
6383
|
+
* // i18n translation keys
|
|
6384
|
+
* const required = buildRequiredErrors(
|
|
6385
|
+
* ["username", "email"],
|
|
6386
|
+
* (field) => `user.${field}.field_required`
|
|
6387
|
+
* );
|
|
6388
|
+
* // Result: { username: "user.username.field_required", email: "user.email.field_required" }
|
|
6389
|
+
*
|
|
6390
|
+
* // Same message for all fields
|
|
6391
|
+
* const required = buildRequiredErrors(
|
|
6392
|
+
* ["username", "email"],
|
|
6393
|
+
* "This field is required"
|
|
6394
|
+
* );
|
|
6395
|
+
* // Result: { username: "This field is required", email: "This field is required" }
|
|
6396
|
+
*
|
|
6397
|
+
* // With keyPrefix for i18n
|
|
6398
|
+
* const required = buildRequiredErrors(
|
|
6399
|
+
* ["username", "email"],
|
|
6400
|
+
* (field) => `${field}.field_required`,
|
|
6401
|
+
* "user"
|
|
6402
|
+
* );
|
|
6403
|
+
* // Result: { username: "user.username.field_required", email: "user.email.field_required" }
|
|
6404
|
+
* ```
|
|
6405
|
+
*/
|
|
6406
|
+
const buildRequiredErrors = (fields, messageOrGenerator, keyPrefix = "") => {
|
|
6407
|
+
const result = {};
|
|
6408
|
+
fields.forEach((field) => {
|
|
6409
|
+
if (typeof messageOrGenerator === "function") {
|
|
6410
|
+
const message = messageOrGenerator(field);
|
|
6411
|
+
result[field] = keyPrefix ? `${keyPrefix}.${message}` : message;
|
|
6412
|
+
}
|
|
6413
|
+
else {
|
|
6414
|
+
result[field] = messageOrGenerator;
|
|
6415
|
+
}
|
|
6416
|
+
});
|
|
6417
|
+
return result;
|
|
6418
|
+
};
|
|
6419
|
+
/**
|
|
6420
|
+
* Helper function to build field-specific validation errors
|
|
6421
|
+
*
|
|
6422
|
+
* Creates property-specific error messages for multiple fields at once.
|
|
6423
|
+
*
|
|
6424
|
+
* @param config - Maps field names to their validation error configurations
|
|
6425
|
+
* @returns Properties error configuration
|
|
6426
|
+
*
|
|
6427
|
+
* @example
|
|
6428
|
+
* ```typescript
|
|
6429
|
+
* const properties = buildFieldErrors({
|
|
6430
|
+
* username: {
|
|
6431
|
+
* minLength: "Username must be at least 3 characters",
|
|
6432
|
+
* pattern: "Username can only contain letters and numbers"
|
|
6433
|
+
* },
|
|
6434
|
+
* age: {
|
|
6435
|
+
* minimum: "Must be 18 or older",
|
|
6436
|
+
* maximum: "Must be under 120"
|
|
6437
|
+
* },
|
|
6438
|
+
* email: {
|
|
6439
|
+
* format: "Please enter a valid email address"
|
|
6440
|
+
* }
|
|
6441
|
+
* });
|
|
6442
|
+
* ```
|
|
6443
|
+
*/
|
|
6444
|
+
const buildFieldErrors = (config) => {
|
|
6445
|
+
return config;
|
|
6446
|
+
};
|
|
6447
|
+
/**
|
|
6448
|
+
* Helper function to create a complete error message configuration in one call
|
|
6449
|
+
*
|
|
6450
|
+
* Convenient wrapper that combines required and validation errors.
|
|
6451
|
+
*
|
|
6452
|
+
* @param required - Required field error messages
|
|
6453
|
+
* @param properties - Field-specific validation error messages
|
|
6454
|
+
* @param globalFallbacks - Global fallback error messages
|
|
6455
|
+
* @returns Complete error message configuration
|
|
6456
|
+
*
|
|
6457
|
+
* @example
|
|
6458
|
+
* ```typescript
|
|
6459
|
+
* const errorMessage = createErrorMessage(
|
|
6460
|
+
* {
|
|
6461
|
+
* username: "Username is required",
|
|
6462
|
+
* email: "Email is required"
|
|
6463
|
+
* },
|
|
6464
|
+
* {
|
|
6465
|
+
* username: {
|
|
6466
|
+
* minLength: "Username must be at least 3 characters"
|
|
6467
|
+
* },
|
|
6468
|
+
* email: {
|
|
6469
|
+
* format: "Please enter a valid email"
|
|
6470
|
+
* }
|
|
6471
|
+
* },
|
|
6472
|
+
* {
|
|
6473
|
+
* minLength: "This field is too short",
|
|
6474
|
+
* format: "Invalid format"
|
|
6475
|
+
* }
|
|
6476
|
+
* );
|
|
6477
|
+
* ```
|
|
6478
|
+
*/
|
|
6479
|
+
const createErrorMessage = (required, properties, globalFallbacks) => {
|
|
6480
|
+
return buildErrorMessages({
|
|
6481
|
+
required,
|
|
6482
|
+
properties,
|
|
6483
|
+
...globalFallbacks,
|
|
6484
|
+
});
|
|
6485
|
+
};
|
|
6486
|
+
|
|
6233
6487
|
const getMultiDates = ({ selected, selectedDate, selectedDates, selectable, }) => {
|
|
6234
6488
|
if (!selectable) {
|
|
6235
6489
|
return [...selectedDates];
|
|
@@ -6246,4 +6500,4 @@ const getMultiDates = ({ selected, selectedDate, selectedDates, selectable, }) =
|
|
|
6246
6500
|
}
|
|
6247
6501
|
};
|
|
6248
6502
|
|
|
6249
|
-
export { CardHeader, DataDisplay, DataTable, DataTableServer, DefaultCardTitle, DefaultForm, DefaultTable, DensityToggleButton, EditSortingButton, EmptyState$1 as EmptyState, ErrorAlert, FilterDialog, FormBody, FormRoot, FormTitle, GlobalFilter, PageSizeControl, Pagination, RecordDisplay, ReloadButton, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, RowCountText, Table, TableBody, TableCardContainer, TableCards, TableComponent, TableControls, TableDataDisplay, TableFilter, TableFilterTags, TableFooter, TableHeader, TableLoadingComponent, TableSelector, TableSorter, TableViewer, TextCell, ViewDialog, getColumns, getMultiDates, getRangeDates, idPickerSanityCheck, useDataTable, useDataTableContext, useDataTableServer, useForm, widthSanityCheck };
|
|
6503
|
+
export { CardHeader, DataDisplay, DataTable, DataTableServer, DefaultCardTitle, DefaultForm, DefaultTable, DensityToggleButton, EditSortingButton, EmptyState$1 as EmptyState, ErrorAlert, FilterDialog, FormBody, FormRoot, FormTitle, GlobalFilter, PageSizeControl, Pagination, RecordDisplay, ReloadButton, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, RowCountText, Table, TableBody, TableCardContainer, TableCards, TableComponent, TableControls, TableDataDisplay, TableFilter, TableFilterTags, TableFooter, TableHeader, TableLoadingComponent, TableSelector, TableSorter, TableViewer, TextCell, ViewDialog, buildErrorMessages, buildFieldErrors, buildRequiredErrors, createErrorMessage, getColumns, getMultiDates, getRangeDates, idPickerSanityCheck, useDataTable, useDataTableContext, useDataTableServer, useForm, widthSanityCheck };
|