@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/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 = "span 12", gridRow = "span 1", displayDateFormat = "YYYY-MM-DD", dateFormat = "YYYY-MM-DD", } = schema;
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).tz(timezone).format(displayDateFormat);
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: "stretch", gridColumn,
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: "start", children: [jsx(MdDateRange, {}), selectedDate !== undefined ? `${displayDate}` : ""] }) }), jsx(PopoverContent, { children: jsxs(PopoverBody, { children: [jsx(PopoverTitle, {}), jsx(DatePicker$1, { selected: new Date(selectedDate), onDateSelected: ({ date }) => {
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`, { defaultValue: "January" }),
4054
- formI18n.translate.t(`common.month_2`, { defaultValue: "February" }),
4055
- formI18n.translate.t(`common.month_3`, { defaultValue: "March" }),
4056
- formI18n.translate.t(`common.month_4`, { defaultValue: "April" }),
4057
- formI18n.translate.t(`common.month_5`, { defaultValue: "May" }),
4058
- formI18n.translate.t(`common.month_6`, { defaultValue: "June" }),
4059
- formI18n.translate.t(`common.month_7`, { defaultValue: "July" }),
4060
- formI18n.translate.t(`common.month_8`, { defaultValue: "August" }),
4061
- formI18n.translate.t(`common.month_9`, { defaultValue: "September" }),
4062
- formI18n.translate.t(`common.month_10`, { defaultValue: "October" }),
4063
- formI18n.translate.t(`common.month_11`, { defaultValue: "November" }),
4064
- formI18n.translate.t(`common.month_12`, { defaultValue: "December" }),
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`, { defaultValue: "Sun" }),
4068
- formI18n.translate.t(`common.weekday_2`, { defaultValue: "Mon" }),
4069
- formI18n.translate.t(`common.weekday_3`, { defaultValue: "Tue" }),
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: "Wed",
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: formI18n.translate.t(`common.back_button`, {
4078
- defaultValue: "Back",
4079
- }),
4080
- forwardButtonLabel: formI18n.translate.t(`common.forward_button`, {
4081
- defaultValue: "Forward",
4082
- }),
4083
- } })] }) })] }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: formI18n.required() }))] }));
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 = "span 12", gridRow = "span 1", renderDisplay } = schema;
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 === "radio") {
4117
- return (jsx(Field, { label: `${translate.t(removeIndex(`${colLabel}.field_label`))}`, required: isRequired, alignItems: "stretch", gridColumn,
4118
- gridRow, children: jsx(RadioGroup$1.Root, { defaultValue: "1", children: jsx(HStack, { gap: "6", children: filterArray(dataList, searchText ?? "").map((item) => {
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: "stretch", gridColumn,
4133
- gridRow, children: [isMultiple && (jsxs(Flex, { flexFlow: "wrap", gap: 1, children: [watchEnums.map((enumValue) => {
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: "pointer", onClick: () => {
4187
+ }), jsx(Tag, { size: "lg", cursor: 'pointer', onClick: () => {
4144
4188
  setOpenSearchResult(true);
4145
- }, children: translate.t(removeIndex(`${colLabel}.add_more`)) }, `${colLabel}-add-more-tag`)] })), !isMultiple && (jsx(Button, { variant: "outline", onClick: () => {
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: "start", children: !!watchEnum === false
4148
- ? ""
4149
- : 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: translate.t(`${colLabel}.type_to_search`), onChange: (event) => {
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: "auto", maxHeight: "20rem", children: [jsx(Flex, { flexFlow: "column wrap", children: dataList
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 || "").toLowerCase();
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: "pointer", onClick: () => {
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: "colorPalette.400/50" } : {}), children: !!renderDisplay === true
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: translate.t(removeIndex(`${colLabel}.empty_search_result`)) })) }))] })] }) })] }), errors[`${colLabel}`] && (jsx(Text, { color: "red.400", children: translate.t(removeIndex(`${colLabel}.field_required`)) }))] }));
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 = "span 12", gridRow = "span 1", renderDisplay, foreign_key, } = schema;
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(",") : watchId;
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: "stretch", gridColumn,
4745
- gridRow, children: [isMultiple && (jsxs(Flex, { flexFlow: "wrap", gap: 1, children: [watchIds.map((id) => {
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: "pointer", onClick: () => {
4802
+ }), jsx(Tag, { cursor: 'pointer', onClick: () => {
4756
4803
  setOpenSearchResult(true);
4757
- }, children: formI18n.t('add_more') })] })), !isMultiple && (jsx(Button, { variant: "outline", onClick: () => {
4804
+ }, children: idPickerLabels?.addMore ?? formI18n.t('add_more') })] })), !isMultiple && (jsx(Button, { variant: 'outline', onClick: () => {
4758
4805
  setOpenSearchResult(true);
4759
- }, 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: 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: `${formI18n.t('total')} ${count}, ${formI18n.t('showing')} ${limit} ${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
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
- : "0"] })] })] }), jsx(Box, { children: jsxs("select", { value: limit, onChange: handleLimitChange, style: {
4762
- padding: "4px 8px",
4763
- borderRadius: "4px",
4764
- border: "1px solid #ccc",
4765
- fontSize: "14px",
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: "auto", children: dataList.length > 0 ? (jsx(Flex, { flexFlow: "column wrap", gap: 1, children: dataList.map((item) => {
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: "pointer", onClick: () => {
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: "colorPalette.400/50",
4787
- fontWeight: "bold",
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
- ? formI18n.t('empty_search_result')
4794
- : 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() }))] }));
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
- 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: async () => {
6174
- setIsError(false);
6175
- setIsSubmiting(false);
6176
- setIsSuccess(false);
6177
- setIsConfirming(false);
6178
- setValidatedData(undefined);
6179
- const data = await getUpdatedData();
6180
- methods.reset(data);
6181
- }, formNoValidate: true, children: translate.t("submit_again") }) })] }));
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 };