@bsol-oss/react-datatable5 8.1.2 → 9.0.0

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
@@ -1,5 +1,5 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
- import { Button as Button$1, AbsoluteCenter, Spinner, Span, IconButton, Portal, Dialog, RadioGroup as RadioGroup$1, Grid, Box, Slider as Slider$1, HStack, For, Flex, Text, Tag as Tag$1, Input, useDisclosure, DialogBackdrop, CheckboxCard as CheckboxCard$1, Menu, createRecipeContext, createContext as createContext$1, Pagination, usePaginationContext, Image, Card, DataList, Checkbox as Checkbox$1, Table as Table$1, Tooltip as Tooltip$1, Group, InputElement, Icon, MenuRoot as MenuRoot$1, MenuTrigger as MenuTrigger$1, EmptyState as EmptyState$2, VStack, List, Alert, Popover, Field as Field$1, NumberInput, Accordion, Show, RadioCard, CheckboxGroup, Heading, Center } from '@chakra-ui/react';
2
+ import { Button as Button$1, AbsoluteCenter, Spinner, Span, IconButton, Portal, Dialog, RadioGroup as RadioGroup$1, Grid, Box, Slider as Slider$1, HStack, For, Flex, Text, Tag as Tag$1, Input, useDisclosure, DialogBackdrop, CheckboxCard as CheckboxCard$1, Menu, createRecipeContext, createContext as createContext$1, Pagination, usePaginationContext, Image, Card, DataList, Checkbox as Checkbox$1, Table as Table$1, Tooltip as Tooltip$1, Group, InputElement, Icon, MenuRoot as MenuRoot$1, MenuTrigger as MenuTrigger$1, EmptyState as EmptyState$2, VStack, List, Alert, Popover, Field as Field$1, HoverCard, NumberInput, Accordion, Show, RadioCard, CheckboxGroup, Heading, Center } from '@chakra-ui/react';
3
3
  import { AiOutlineColumnWidth } from 'react-icons/ai';
4
4
  import * as React from 'react';
5
5
  import React__default, { createContext, useContext, useState, useEffect, useRef } from 'react';
@@ -21,12 +21,12 @@ import { flexRender, makeStateUpdater, functionalUpdate, useReactTable, getCoreR
21
21
  import { rankItem } from '@tanstack/match-sorter-utils';
22
22
  import { BsExclamationCircleFill } from 'react-icons/bs';
23
23
  import { useDebounce } from '@uidotdev/usehooks';
24
- import { useQueryClient, useQuery, QueryClient, QueryClientProvider } from '@tanstack/react-query';
24
+ import { useQueryClient, useQuery } from '@tanstack/react-query';
25
25
  import { IoReload } from 'react-icons/io5';
26
26
  import { GrAscend, GrDescend } from 'react-icons/gr';
27
27
  import { HiColorSwatch, HiOutlineInformationCircle } from 'react-icons/hi';
28
28
  import axios from 'axios';
29
- import { useFormContext, useForm, FormProvider } from 'react-hook-form';
29
+ import { useFormContext, FormProvider } from 'react-hook-form';
30
30
  import dayjs from 'dayjs';
31
31
 
32
32
  const DataTableContext = createContext({
@@ -3539,7 +3539,7 @@ const Field = React.forwardRef(function Field(props, ref) {
3539
3539
  });
3540
3540
 
3541
3541
  const useSchemaContext = () => {
3542
- const { schema, serverUrl, order, ignore, onSubmit, rowNumber, displayText, idMap, setIdMap, } = useContext(SchemaFormContext);
3542
+ const { schema, serverUrl, order, ignore, onSubmit, rowNumber, idMap, setIdMap, translate, } = useContext(SchemaFormContext);
3543
3543
  return {
3544
3544
  schema,
3545
3545
  serverUrl,
@@ -3547,9 +3547,9 @@ const useSchemaContext = () => {
3547
3547
  ignore,
3548
3548
  onSubmit,
3549
3549
  rowNumber,
3550
- displayText,
3551
3550
  idMap,
3552
3551
  setIdMap,
3552
+ translate,
3553
3553
  };
3554
3554
  };
3555
3555
 
@@ -3587,16 +3587,13 @@ const getTableData = async ({ serverUrl, in_table, searching = "", where = [], l
3587
3587
 
3588
3588
  const IdPicker = ({ column, isMultiple = false }) => {
3589
3589
  const { watch, formState: { errors }, setValue, } = useFormContext();
3590
- const { schema, serverUrl, displayText, idMap, setIdMap } = useSchemaContext();
3591
- const { fieldRequired } = displayText;
3590
+ const { schema, serverUrl, idMap, setIdMap, translate } = useSchemaContext();
3592
3591
  const { required } = schema;
3593
3592
  const isRequired = required?.some((columnId) => columnId === column);
3594
3593
  if (schema.properties == undefined) {
3595
- throw new Error("schema properties when using DatePicker");
3594
+ throw new Error("schema properties is undefined when using DatePicker");
3596
3595
  }
3597
- const { total, showing, typeToSearch } = displayText;
3598
- const { gridColumn, gridRow, title, renderDisplay, foreign_key } = schema
3599
- .properties[column];
3596
+ const { gridColumn, gridRow, renderDisplay, foreign_key } = schema.properties[column];
3600
3597
  const { table, column: column_ref, display_column, } = foreign_key;
3601
3598
  const [searchText, setSearchText] = useState();
3602
3599
  const [limit, setLimit] = useState(10);
@@ -3651,7 +3648,7 @@ const IdPicker = ({ column, isMultiple = false }) => {
3651
3648
  }
3652
3649
  return record[display_column];
3653
3650
  };
3654
- return (jsxs(Field, { label: `${title ?? snakeToLabel(column)}`, required: isRequired, alignItems: "stretch", gridColumn,
3651
+ return (jsxs(Field, { label: `${translate.t(`${column}.fieldLabel`)}`, required: isRequired, alignItems: "stretch", gridColumn,
3655
3652
  gridRow, children: [isMultiple && (jsxs(Flex, { flexFlow: "wrap", gap: 1, children: [selectedIds.map((id) => {
3656
3653
  const item = idMap[id];
3657
3654
  if (item === undefined) {
@@ -3666,10 +3663,10 @@ const IdPicker = ({ column, isMultiple = false }) => {
3666
3663
  setOpenSearchResult(true);
3667
3664
  }, children: "Add" })] })), !isMultiple && (jsx(Button, { variant: "outline", onClick: () => {
3668
3665
  setOpenSearchResult(true);
3669
- }, children: 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, { children: jsxs(PopoverBody, { display: "grid", gap: 1, children: [jsx(Input, { placeholder: typeToSearch ?? "Type To Search", onChange: (event) => {
3666
+ }, children: 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, { children: jsxs(PopoverBody, { display: "grid", gap: 1, children: [jsx(Input, { placeholder: translate.t(`${column}.typeToSearch`), onChange: (event) => {
3670
3667
  onSearchChange(event);
3671
3668
  setOpenSearchResult(true);
3672
- }, autoComplete: "off", ref: ref }), jsx(PopoverTitle, {}), (searchText?.length ?? 0) > 0 && (jsxs(Fragment, { children: [isFetching && jsx(Fragment, { children: "isFetching" }), isLoading && jsx(Fragment, { children: "isLoading" }), isPending && jsx(Fragment, { children: "isPending" }), isError && jsx(Fragment, { children: "isError" }), jsx(Text, { justifySelf: "center", children: `${total ?? "Total"} ${count}, ${showing ?? "Showing"} ${limit}` }), jsxs(Grid, { gridTemplateColumns: "repeat(auto-fit, minmax(15rem, 1fr))", overflow: "auto", maxHeight: "50vh", children: [jsx(Flex, { flexFlow: "column wrap", children:
3669
+ }, autoComplete: "off", ref: ref }), jsx(PopoverTitle, {}), (searchText?.length ?? 0) > 0 && (jsxs(Fragment, { children: [isFetching && jsx(Fragment, { children: "isFetching" }), isLoading && jsx(Fragment, { children: "isLoading" }), isPending && jsx(Fragment, { children: "isPending" }), isError && jsx(Fragment, { children: "isError" }), jsx(Text, { justifySelf: "center", children: `${translate.t(`${column}.total`)} ${count}, ${translate.t(`${column}.showing`)} ${limit}` }), jsxs(Grid, { gridTemplateColumns: "repeat(auto-fit, minmax(15rem, 1fr))", overflow: "auto", maxHeight: "50vh", children: [jsx(Flex, { flexFlow: "column wrap", children:
3673
3670
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
3674
3671
  dataList.map((item) => {
3675
3672
  const selected = isMultiple
@@ -3689,49 +3686,33 @@ const IdPicker = ({ column, isMultiple = false }) => {
3689
3686
  }, opacity: 0.7, _hover: { opacity: 1 }, ...(selected ? { color: "gray.400/50" } : {}), children: !!renderDisplay === true
3690
3687
  ? renderDisplay(item)
3691
3688
  : item[display_column] }, item[column_ref]));
3692
- }) }), isDirty && (jsxs(Fragment, { children: [dataList.length <= 0 && jsx(Text, { children: "Empty Search Result" }), " "] }))] }), jsx(PaginationRoot, { justifySelf: "center", count: query?.data?.count ?? 0, pageSize: 10, defaultPage: 1, page: page + 1, onPageChange: (e) => setPage(e.page - 1), children: jsxs(HStack, { gap: "4", children: [jsx(PaginationPrevTrigger, {}), jsx(PaginationPageText, {}), jsx(PaginationNextTrigger, {})] }) })] }))] }) })] }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: fieldRequired ?? "The field is requried" }))] }));
3689
+ }) }), isDirty && (jsx(Fragment, { children: dataList.length <= 0 && (jsx(Text, { children: translate.t(`${column}.emptySearchResult`) })) }))] }), jsx(PaginationRoot, { justifySelf: "center", count: query?.data?.count ?? 0, pageSize: 10, defaultPage: 1, page: page + 1, onPageChange: (e) => setPage(e.page - 1), children: jsxs(HStack, { gap: "4", children: [jsx(PaginationPrevTrigger, {}), jsx(PaginationPageText, {}), jsx(PaginationNextTrigger, {})] }) })] }))] }) })] }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: translate.t(`${column}.fieldRequired`) }))] }));
3693
3690
  };
3694
3691
 
3695
- const ToggleTip = React.forwardRef(function ToggleTip(props, ref) {
3696
- const { showArrow, children, portalled = true, content, portalRef, ...rest } = props;
3697
- return (jsxs(Popover.Root, { ...rest, positioning: { ...rest.positioning, gutter: 4 }, children: [jsx(Popover.Trigger, { asChild: true, children: children }), jsx(Portal, { disabled: !portalled, container: portalRef, children: jsx(Popover.Positioner, { children: jsxs(Popover.Content, { width: "auto", px: "2", py: "1", textStyle: "xs", rounded: "sm", ref: ref, children: [showArrow && (jsx(Popover.Arrow, { children: jsx(Popover.ArrowTip, {}) })), content] }) }) })] }));
3692
+ const HoverCardContent = React.forwardRef(function HoverCardContent(props, ref) {
3693
+ const { portalled = true, portalRef, ...rest } = props;
3694
+ return (jsx(Portal, { disabled: !portalled, container: portalRef, children: jsx(HoverCard.Positioner, { children: jsx(HoverCard.Content, { ref: ref, ...rest }) }) }));
3698
3695
  });
3699
- const InfoTip = React.forwardRef(function InfoTip(props, ref) {
3700
- const { children, ...rest } = props;
3701
- return (jsx(ToggleTip, { content: children, ...rest, ref: ref, children: jsx(IconButton, { variant: "ghost", "aria-label": "info", size: "2xs", colorPalette: "gray", children: jsx(HiOutlineInformationCircle, {}) }) }));
3696
+ const HoverCardArrow = React.forwardRef(function HoverCardArrow(props, ref) {
3697
+ return (jsx(HoverCard.Arrow, { ref: ref, ...props, children: jsx(HoverCard.ArrowTip, {}) }));
3702
3698
  });
3699
+ const HoverCardRoot = HoverCard.Root;
3700
+ const HoverCardTrigger = HoverCard.Trigger;
3703
3701
 
3704
- const DataListRoot = DataList.Root;
3705
- const DataListItem = React.forwardRef(function DataListItem(props, ref) {
3706
- const { label, info, value, children, grow, ...rest } = props;
3707
- return (jsxs(DataList.Item, { ref: ref, ...rest, children: [jsxs(DataList.ItemLabel, { flex: grow ? "1" : undefined, children: [label, info && jsx(InfoTip, { children: info })] }), jsx(DataList.ItemValue, { flex: grow ? "1" : undefined, children: value }), children] }));
3708
- });
3709
-
3710
- const IdViewer = ({ value, column, dataListItemProps, }) => {
3711
- const { schema, idMap } = useSchemaContext();
3702
+ const IdViewer = ({ value, column }) => {
3703
+ const { schema, idMap, translate } = useSchemaContext();
3712
3704
  if (schema.properties == undefined) {
3713
3705
  throw new Error("schema properties when using DatePicker");
3714
3706
  }
3715
- const { title, foreign_key } = schema.properties[column];
3707
+ const { foreign_key } = schema.properties[column];
3716
3708
  if (foreign_key === undefined) {
3717
3709
  throw new Error("foreign_key when variant is id-picker");
3718
3710
  }
3719
3711
  const { display_column } = foreign_key;
3720
- const getDataListProps = (value) => {
3721
- if (value == undefined || value.length <= 0) {
3722
- return {
3723
- value: "<empty>",
3724
- color: "gray.400",
3725
- };
3726
- }
3727
- return {
3728
- value: value,
3729
- };
3730
- };
3731
3712
  if (value === undefined) {
3732
- return jsx(Fragment, { children: "undefined" });
3713
+ return (jsxs(Flex, { flexFlow: "column", children: [jsx(Text, { children: translate.t(`${column}.fieldLabel`) }), jsx(Text, { children: translate.t(`empty`) })] }));
3733
3714
  }
3734
- return (jsx(DataListItem, { label: `${title ?? snakeToLabel(column)}`, ...getDataListProps(idMap[value][display_column]), ...dataListItemProps }));
3715
+ return (jsxs(Flex, { flexFlow: "column", children: [jsx(Text, { children: translate.t(`${column}.fieldLabel`) }), jsxs(HoverCardRoot, { children: [jsx(HoverCardTrigger, { asChild: true, children: jsx(Text, { cursor: 'pointer', children: idMap[value][display_column] }) }), jsxs(HoverCardContent, { children: [jsx(HoverCardArrow, {}), jsx(RecordDisplay, { object: idMap[value] })] })] })] }));
3735
3716
  };
3736
3717
 
3737
3718
  const NumberInputRoot = React.forwardRef(function NumberInput$1(props, ref) {
@@ -3744,28 +3725,26 @@ NumberInput.Label;
3744
3725
 
3745
3726
  const NumberInputField = ({ column }) => {
3746
3727
  const { register, formState: { errors }, } = useFormContext();
3747
- const { schema, displayText } = useSchemaContext();
3748
- const { fieldRequired } = displayText;
3728
+ const { schema, translate } = useSchemaContext();
3749
3729
  const { required } = schema;
3750
3730
  const isRequired = required?.some((columnId) => columnId === column);
3751
3731
  if (schema.properties == undefined) {
3752
3732
  throw new Error("schema properties when using String Input Field");
3753
3733
  }
3754
- const { gridColumn, gridRow, title } = schema.properties[column];
3755
- return (jsxs(Field, { label: `${title ?? snakeToLabel(column)}`, required: isRequired, gridColumn, gridRow, children: [jsx(NumberInputRoot, { children: jsx(NumberInputField$1, { ...register(column, { required: isRequired }) }) }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: fieldRequired ?? "The field is requried" }))] }));
3734
+ const { gridColumn, gridRow } = schema.properties[column];
3735
+ return (jsxs(Field, { label: `${translate.t(`${column}.fieldLabel`)}`, required: isRequired, gridColumn, gridRow, children: [jsx(NumberInputRoot, { children: jsx(NumberInputField$1, { ...register(column, { required: isRequired }) }) }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: translate.t(`${column}.fieldRequired`) }))] }));
3756
3736
  };
3757
3737
 
3758
3738
  const StringInputField = ({ column }) => {
3759
3739
  const { register, formState: { errors }, } = useFormContext();
3760
- const { schema, displayText } = useSchemaContext();
3761
- const { fieldRequired } = displayText;
3740
+ const { schema, translate } = useSchemaContext();
3762
3741
  const { required } = schema;
3763
3742
  const isRequired = required?.some((columnId) => columnId === column);
3764
3743
  if (schema.properties == undefined) {
3765
3744
  throw new Error("schema properties when using String Input Field");
3766
3745
  }
3767
- const { gridColumn, gridRow, title } = schema.properties[column];
3768
- return (jsx(Fragment, { children: jsxs(Field, { label: `${title ?? snakeToLabel(column)}`, required: isRequired, gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", children: [jsx(Input, { ...register(column, { required: isRequired }), autoComplete: "off" }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: fieldRequired ?? "The field is requried" }))] }) }));
3746
+ const { gridColumn, gridRow } = schema.properties[column];
3747
+ return (jsx(Fragment, { children: jsxs(Field, { label: `${translate.t(`${column}.fieldLabel`)}`, required: isRequired, gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", children: [jsx(Input, { ...register(column, { required: isRequired }), autoComplete: "off" }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: translate.t(`${column}.fieldRequired`) }))] }) }));
3769
3748
  };
3770
3749
 
3771
3750
  const clearEmptyString = (object) => {
@@ -3782,21 +3761,35 @@ const AccordionItemContent = React.forwardRef(function AccordionItemContent(prop
3782
3761
  const AccordionRoot = Accordion.Root;
3783
3762
  const AccordionItem = Accordion.Item;
3784
3763
 
3764
+ const ToggleTip = React.forwardRef(function ToggleTip(props, ref) {
3765
+ const { showArrow, children, portalled = true, content, portalRef, ...rest } = props;
3766
+ return (jsxs(Popover.Root, { ...rest, positioning: { ...rest.positioning, gutter: 4 }, children: [jsx(Popover.Trigger, { asChild: true, children: children }), jsx(Portal, { disabled: !portalled, container: portalRef, children: jsx(Popover.Positioner, { children: jsxs(Popover.Content, { width: "auto", px: "2", py: "1", textStyle: "xs", rounded: "sm", ref: ref, children: [showArrow && (jsx(Popover.Arrow, { children: jsx(Popover.ArrowTip, {}) })), content] }) }) })] }));
3767
+ });
3768
+ const InfoTip = React.forwardRef(function InfoTip(props, ref) {
3769
+ const { children, ...rest } = props;
3770
+ return (jsx(ToggleTip, { content: children, ...rest, ref: ref, children: jsx(IconButton, { variant: "ghost", "aria-label": "info", size: "2xs", colorPalette: "gray", children: jsx(HiOutlineInformationCircle, {}) }) }));
3771
+ });
3772
+
3773
+ const DataListRoot = DataList.Root;
3774
+ const DataListItem = React.forwardRef(function DataListItem(props, ref) {
3775
+ const { label, info, value, children, grow, ...rest } = props;
3776
+ return (jsxs(DataList.Item, { ref: ref, ...rest, children: [jsxs(DataList.ItemLabel, { flex: grow ? "1" : undefined, children: [label, info && jsx(InfoTip, { children: info })] }), jsx(DataList.ItemValue, { flex: grow ? "1" : undefined, children: value }), children] }));
3777
+ });
3778
+
3785
3779
  const BooleanPicker = ({ column }) => {
3786
- const { watch, formState: { errors }, setValue, getValues, } = useFormContext();
3787
- const { schema, displayText } = useSchemaContext();
3788
- const { fieldRequired } = displayText;
3780
+ const { watch, formState: { errors }, setValue, } = useFormContext();
3781
+ const { schema, translate } = useSchemaContext();
3789
3782
  const { required } = schema;
3790
3783
  const isRequired = required?.some((columnId) => columnId === column);
3791
3784
  const value = watch(column);
3792
3785
  if (schema.properties == undefined) {
3793
3786
  throw new Error("schema properties when using BooleanPicker");
3794
3787
  }
3795
- const { gridColumn, gridRow, title } = schema.properties[column];
3796
- return (jsxs(Field, { label: `${title ?? snakeToLabel(column)}`, required: isRequired, alignItems: "stretch", gridColumn,
3788
+ const { gridColumn, gridRow } = schema.properties[column];
3789
+ return (jsxs(Field, { label: `${translate.t(`${column}.fieldLabel`)}`, required: isRequired, alignItems: "stretch", gridColumn,
3797
3790
  gridRow, children: [jsx(CheckboxCard, { checked: value, variant: "surface", onSelect: () => {
3798
3791
  setValue(column, !value);
3799
- } }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: fieldRequired ?? "The field is requried" }))] }));
3792
+ } }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: translate.t(`${column}.fieldRequired`) }))] }));
3800
3793
  };
3801
3794
 
3802
3795
  const monthNamesShort = [
@@ -3870,8 +3863,7 @@ let DatePicker$1 = class DatePicker extends React__default.Component {
3870
3863
 
3871
3864
  const DatePicker = ({ column }) => {
3872
3865
  const { watch, formState: { errors }, setValue, } = useFormContext();
3873
- const { schema, displayText } = useSchemaContext();
3874
- const { fieldRequired } = displayText;
3866
+ const { schema, translate } = useSchemaContext();
3875
3867
  const { required } = schema;
3876
3868
  const isRequired = required?.some((columnId) => columnId === column);
3877
3869
  const [open, setOpen] = useState(false);
@@ -3879,14 +3871,20 @@ const DatePicker = ({ column }) => {
3879
3871
  if (schema.properties == undefined) {
3880
3872
  throw new Error("schema properties when using DatePicker");
3881
3873
  }
3882
- const { gridColumn, gridRow, title } = schema.properties[column];
3883
- return (jsxs(Field, { label: `${title ?? snakeToLabel(column)}`, required: isRequired, alignItems: "stretch", gridColumn,
3874
+ const { gridColumn, gridRow } = schema.properties[column];
3875
+ return (jsxs(Field, { label: `${translate.t(`${column}.fieldLabel`)}`, required: isRequired, alignItems: "stretch", gridColumn,
3884
3876
  gridRow, children: [jsxs(PopoverRoot, { open: open, onOpenChange: (e) => setOpen(e.open), closeOnInteractOutside: true, children: [jsx(PopoverTrigger, { asChild: true, children: jsx(Button, { size: "sm", variant: "outline", onClick: () => {
3885
3877
  setOpen(true);
3886
- }, children: selectedDate !== undefined ? selectedDate : "" }) }), jsx(PopoverContent, { children: jsxs(PopoverBody, { children: [jsx(PopoverTitle, {}), jsx(DatePicker$1, { selected: new Date(selectedDate), onDateSelected: ({ selected, selectable, date }) => {
3878
+ }, children: selectedDate !== undefined ? selectedDate : "" }) }), jsx(PopoverContent, { children: jsxs(PopoverBody, { children: [jsx(PopoverTitle, {}), jsx(DatePicker$1
3879
+ // @ts-expect-error TODO: find appropriate types
3880
+ , {
3881
+ // @ts-expect-error TODO: find appropriate types
3882
+ selected: new Date(selectedDate),
3883
+ // @ts-expect-error TODO: find appropriate types
3884
+ onDateSelected: ({ selected, selectable, date }) => {
3887
3885
  setValue(column, dayjs(date).format("YYYY-MM-DD"));
3888
3886
  setOpen(false);
3889
- } })] }) })] }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: fieldRequired ?? "The field is requried" }))] }));
3887
+ } })] }) })] }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: translate.t(`${column}.fieldRequired`) }))] }));
3890
3888
  };
3891
3889
 
3892
3890
  function filterArray(array, searchTerm) {
@@ -3901,14 +3899,13 @@ function filterArray(array, searchTerm) {
3901
3899
 
3902
3900
  const EnumPicker = ({ column, isMultiple = false }) => {
3903
3901
  const { watch, formState: { errors }, setValue, } = useFormContext();
3904
- const { schema, displayText } = useSchemaContext();
3905
- const { fieldRequired, total, showing, typeToSearch } = displayText;
3902
+ const { schema, translate } = useSchemaContext();
3906
3903
  const { required } = schema;
3907
3904
  const isRequired = required?.some((columnId) => columnId === column);
3908
3905
  if (schema.properties == undefined) {
3909
3906
  throw new Error("schema properties when using DatePicker");
3910
3907
  }
3911
- const { gridColumn, gridRow, title, renderDisplay } = schema.properties[column];
3908
+ const { gridColumn, gridRow, renderDisplay } = schema.properties[column];
3912
3909
  const [searchText, setSearchText] = useState();
3913
3910
  const [limit, setLimit] = useState(10);
3914
3911
  const [openSearchResult, setOpenSearchResult] = useState();
@@ -3923,24 +3920,24 @@ const EnumPicker = ({ column, isMultiple = false }) => {
3923
3920
  setSearchText(event.target.value);
3924
3921
  setLimit(10);
3925
3922
  };
3926
- return (jsxs(Field, { label: `${title ?? snakeToLabel(column)}`, required: isRequired, alignItems: "stretch", gridColumn,
3923
+ return (jsxs(Field, { label: `${translate.t(`${column}.fieldLabel`)}`, required: isRequired, alignItems: "stretch", gridColumn,
3927
3924
  gridRow, children: [isMultiple && (jsxs(Flex, { flexFlow: "wrap", gap: 1, children: [watchEnums.map((enumValue) => {
3928
3925
  const item = enumValue;
3929
3926
  if (item === undefined) {
3930
3927
  return jsx(Fragment, { children: "undefined" });
3931
3928
  }
3932
3929
  return (jsx(Tag, { closable: true, onClick: () => {
3933
- setSelectedEnums((state) => state.filter((id) => id != item));
3930
+ // setSelectedEnums((state) => state.filter((id) => id != item));
3934
3931
  setValue(column, watchEnums.filter((id) => id != item));
3935
3932
  }, children: !!renderDisplay === true ? renderDisplay(item) : item }));
3936
3933
  }), jsx(Tag, { cursor: "pointer", onClick: () => {
3937
3934
  setOpenSearchResult(true);
3938
3935
  }, children: "Add" })] })), !isMultiple && (jsx(Button, { variant: "outline", onClick: () => {
3939
3936
  setOpenSearchResult(true);
3940
- }, children: watchEnum })), jsxs(PopoverRoot, { open: openSearchResult, onOpenChange: (e) => setOpenSearchResult(e.open), closeOnInteractOutside: true, initialFocusEl: () => ref.current, positioning: { placement: "bottom-start" }, children: [jsx(PopoverTrigger, {}), jsx(PopoverContent, { children: jsxs(PopoverBody, { display: "grid", gap: 1, children: [jsx(Input, { placeholder: typeToSearch ?? "Type to search", onChange: (event) => {
3937
+ }, children: watchEnum })), jsxs(PopoverRoot, { open: openSearchResult, onOpenChange: (e) => setOpenSearchResult(e.open), closeOnInteractOutside: true, initialFocusEl: () => ref.current, positioning: { placement: "bottom-start" }, children: [jsx(PopoverTrigger, {}), jsx(PopoverContent, { children: jsxs(PopoverBody, { display: "grid", gap: 1, children: [jsx(Input, { placeholder: translate.t(`${column}.typeToSearch`), onChange: (event) => {
3941
3938
  onSearchChange(event);
3942
3939
  setOpenSearchResult(true);
3943
- }, autoComplete: "off", ref: ref }), jsx(PopoverTitle, {}), jsx(Text, { children: `${total ?? "Total"}: ${count}, ${showing ?? "Showing"} ${limit}` }), jsxs(Grid, { gridTemplateColumns: "repeat(auto-fit, minmax(15rem, 1fr))", overflow: "auto", maxHeight: "50vh", children: [jsx(Flex, { flexFlow: "column wrap", children: filterArray(dataList, searchText ?? "").map((item) => {
3940
+ }, autoComplete: "off", ref: ref }), jsx(PopoverTitle, {}), jsx(Text, { children: `${translate.t(`${column}.total`)}: ${count}, ${translate.t(`${column}.showing`)} ${limit}` }), jsxs(Grid, { gridTemplateColumns: "repeat(auto-fit, minmax(15rem, 1fr))", overflow: "auto", maxHeight: "50vh", children: [jsx(Flex, { flexFlow: "column wrap", children: filterArray(dataList, searchText ?? "").map((item) => {
3944
3941
  const selected = isMultiple
3945
3942
  ? watchEnums.some((enumValue) => item === enumValue)
3946
3943
  : watchEnum == item;
@@ -3953,7 +3950,7 @@ const EnumPicker = ({ column, isMultiple = false }) => {
3953
3950
  const newSet = new Set([...(watchEnums ?? []), item]);
3954
3951
  setValue(column, [...newSet]);
3955
3952
  }, ...(selected ? { color: "gray.400/50" } : {}), children: !!renderDisplay === true ? renderDisplay(item) : item }, `${column}-${item}`));
3956
- }) }), isDirty && (jsxs(Fragment, { children: [dataList.length <= 0 && jsx(Fragment, { children: "Empty Search Result" }), " "] }))] })] }) })] }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: fieldRequired ?? "The field is requried" }))] }));
3953
+ }) }), isDirty && (jsxs(Fragment, { children: [dataList.length <= 0 && jsx(Fragment, { children: "Empty Search Result" }), " "] }))] })] }) })] }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: translate.t(`${column}.fieldRequired`) }))] }));
3957
3954
  };
3958
3955
 
3959
3956
  function isEnteringWindow(_ref) {
@@ -4310,8 +4307,8 @@ const FileDropzone = ({ children = undefined, gridProps = {}, onDrop = () => { }
4310
4307
 
4311
4308
  const FilePicker = ({ column }) => {
4312
4309
  const { setValue, formState: { errors }, watch, } = useFormContext();
4313
- const { schema, displayText } = useSchemaContext();
4314
- const { fieldRequired } = displayText;
4310
+ const { schema, translate } = useSchemaContext();
4311
+ displayText;
4315
4312
  const { required } = schema;
4316
4313
  const isRequired = required?.some((columnId) => columnId === column);
4317
4314
  if (schema.properties == undefined) {
@@ -4319,22 +4316,21 @@ const FilePicker = ({ column }) => {
4319
4316
  }
4320
4317
  const { gridColumn, gridRow, title } = schema.properties[column];
4321
4318
  const currentFiles = (watch(column) ?? []);
4322
- return (jsxs(Field, { label: `${title ?? snakeToLabel(column)}`, required: isRequired, gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", display: "grid", gridTemplateRows: 'auto 1fr auto', alignItems: 'stretch', children: [jsx(FileDropzone, { onDrop: ({ files }) => {
4319
+ return (jsxs(Field, { label: `${translate.t(`${column}.fieldLabel`)}`, required: isRequired, gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", display: "grid", gridTemplateRows: "auto 1fr auto", alignItems: "stretch", children: [jsx(FileDropzone, { onDrop: ({ files }) => {
4323
4320
  const newFiles = files.filter(({ name }) => !currentFiles.some((cur) => cur.name === name));
4324
4321
  setValue(column, [...currentFiles, ...newFiles]);
4325
- } }), jsx(Flex, { flexFlow: "wrap", alignItems: "start", gap: 1, children: currentFiles.map((file) => {
4322
+ }, placeholder: translate.t(`${column}.fileDropzone`) }), jsx(Flex, { flexFlow: "wrap", alignItems: "start", gap: 1, children: currentFiles.map((file) => {
4326
4323
  return (jsx(Tag, { cursor: "pointer", onClick: () => {
4327
4324
  setValue(column, currentFiles.filter(({ name }) => {
4328
4325
  return name !== file.name;
4329
4326
  }));
4330
4327
  }, children: file.name }));
4331
- }) }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: fieldRequired ?? "The field is requried" }))] }));
4328
+ }) }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: translate.t(`${column}.fieldRequired`) }))] }));
4332
4329
  };
4333
4330
 
4334
4331
  const ObjectInput = ({ column }) => {
4335
4332
  const { formState: { errors }, setValue, getValues, } = useFormContext();
4336
- const { schema, displayText } = useSchemaContext();
4337
- const { addNew, fieldRequired, save } = displayText;
4333
+ const { schema, translate } = useSchemaContext();
4338
4334
  const { required } = schema;
4339
4335
  const isRequired = required?.some((columnId) => columnId === column);
4340
4336
  const entries = Object.entries(getValues(column) ?? {});
@@ -4344,8 +4340,8 @@ const ObjectInput = ({ column }) => {
4344
4340
  if (schema.properties == undefined) {
4345
4341
  throw new Error("schema properties when using DatePicker");
4346
4342
  }
4347
- const { gridColumn, gridRow, title } = schema.properties[column];
4348
- return (jsxs(Field, { label: `${title ?? snakeToLabel(column)}`, required: isRequired, alignItems: "stretch", gridColumn, gridRow, children: [entries.map(([key, value]) => {
4343
+ const { gridColumn, gridRow } = schema.properties[column];
4344
+ return (jsxs(Field, { label: `${translate.t(`${column}.fieldLabel`)}`, required: isRequired, alignItems: "stretch", gridColumn, gridRow, children: [entries.map(([key, value]) => {
4349
4345
  return (jsxs(Grid, { templateColumns: "1fr 1fr auto", gap: 1, children: [jsx(Input, { value: key, onChange: (e) => {
4350
4346
  const filtered = entries.filter(([target]) => {
4351
4347
  return target !== key;
@@ -4381,11 +4377,11 @@ const ObjectInput = ({ column }) => {
4381
4377
  setShowNewEntries(false);
4382
4378
  setNewKey(undefined);
4383
4379
  setNewValue(undefined);
4384
- }, children: save ?? "Save" })] })] }) }), jsx(Button, { onClick: () => {
4380
+ }, children: translate.t(`${column}.save`) })] })] }) }), jsx(Button, { onClick: () => {
4385
4381
  setShowNewEntries(true);
4386
4382
  setNewKey(undefined);
4387
4383
  setNewValue(undefined);
4388
- }, children: addNew ?? "Add New" }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: fieldRequired ?? "The field is requried" }))] }));
4384
+ }, children: translate.t(`${column}.addNew`) }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: translate.t(`${column}.fieldRequired`) }))] }));
4389
4385
  };
4390
4386
 
4391
4387
  const RadioCardItem = React.forwardRef(function RadioCardItem(props, ref) {
@@ -4499,8 +4495,7 @@ const idPickerSanityCheck = (column, foreign_key) => {
4499
4495
  }
4500
4496
  };
4501
4497
  const FormInternal = () => {
4502
- const { schema, serverUrl, displayText, order, ignore, onSubmit, rowNumber, idMap, } = useSchemaContext();
4503
- const { title, submit, empty, cancel, submitSuccess, submitAgain, confirm } = displayText;
4498
+ const { schema, serverUrl, order, ignore, onSubmit, rowNumber, idMap, translate, } = useSchemaContext();
4504
4499
  const methods = useFormContext();
4505
4500
  const [isSuccess, setIsSuccess] = useState(false);
4506
4501
  const [isError, setIsError] = useState(false);
@@ -4570,7 +4565,7 @@ const FormInternal = () => {
4570
4565
  const getDataListProps = (value) => {
4571
4566
  if (value == undefined || value.length <= 0) {
4572
4567
  return {
4573
- value: `<${empty ?? "Empty"}>`,
4568
+ value: `<${translate.t("empty") ?? "Empty"}>`,
4574
4569
  color: "gray.400",
4575
4570
  };
4576
4571
  }
@@ -4579,17 +4574,17 @@ const FormInternal = () => {
4579
4574
  };
4580
4575
  };
4581
4576
  if (isSuccess) {
4582
- return (jsxs(Grid, { gap: 2, children: [jsx(Heading, { children: title ?? snakeToLabel(schema.title ?? "") }), jsxs(Alert.Root, { status: "success", children: [jsx(Alert.Indicator, {}), jsx(Alert.Title, { children: submitSuccess ?? "Data uploaded to the server. Fire on!" })] }), jsx(Button, { onClick: () => {
4577
+ return (jsxs(Grid, { gap: 2, children: [jsx(Heading, { children: translate.t("title") }), jsxs(Alert.Root, { status: "success", children: [jsx(Alert.Indicator, {}), jsx(Alert.Title, { children: translate.t("submitSuccess") })] }), jsx(Button, { onClick: () => {
4583
4578
  setIsError(false);
4584
4579
  setIsSubmiting(false);
4585
4580
  setIsSuccess(false);
4586
4581
  setIsConfirming(false);
4587
4582
  setValidatedData(undefined);
4588
4583
  methods.reset();
4589
- }, formNoValidate: true, children: submitAgain ?? "Submit Again" })] }));
4584
+ }, formNoValidate: true, children: translate.t("submitAgain") })] }));
4590
4585
  }
4591
4586
  if (isConfirming) {
4592
- return (jsxs(Grid, { gap: 2, children: [jsx(Heading, { children: title ?? snakeToLabel(schema.title ?? "") }), jsx(DataListRoot, { orientation: "horizontal", gap: 4, display: "grid", gridTemplateColumns: "repeat(12, 1fr)", gridTemplateRows: `repeat(${rowNumber ?? "auto-fit"}, auto)`, children: ordered.map((column) => {
4587
+ return (jsxs(Grid, { gap: 2, children: [jsxs(Heading, { children: [" ", translate.t("title")] }), jsx(DataListRoot, { orientation: "horizontal", gap: 4, display: "grid", gridTemplateColumns: "repeat(12, 1fr)", gridTemplateRows: `repeat(${rowNumber ?? "auto-fit"}, auto)`, children: ordered.map((column) => {
4593
4588
  if (properties === undefined) {
4594
4589
  return jsx(Fragment, {});
4595
4590
  }
@@ -4611,38 +4606,38 @@ const FormInternal = () => {
4611
4606
  if (variant === "date-picker") {
4612
4607
  const value = (validatedData ?? {})[column];
4613
4608
  if (!!value === false) {
4614
- return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${snakeToLabel(column)}`, ...getDataListProps(undefined) }, `form-${key}`));
4609
+ return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(undefined) }, `form-${key}`));
4615
4610
  }
4616
4611
  const date = dayjs(value).format("YYYY-MM-DD");
4617
- return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${snakeToLabel(column)}`, ...getDataListProps(date) }, `form-${key}`));
4612
+ return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(date) }, `form-${key}`));
4618
4613
  }
4619
- return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${snakeToLabel(column)}`, ...getDataListProps((validatedData ?? {})[column]) }, `form-${key}`));
4614
+ return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps((validatedData ?? {})[column]) }, `form-${key}`));
4620
4615
  }
4621
4616
  if (type === "object") {
4622
4617
  const value = (validatedData ?? {})[column];
4623
4618
  if (!!value === false) {
4624
- return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${snakeToLabel(column)}`, ...getDataListProps(undefined) }, `form-${key}`));
4619
+ return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(undefined) }, `form-${key}`));
4625
4620
  }
4626
- return (jsxs(Flex, { flexFlow: "column", gap: 2, gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", children: [jsx(Text, { children: snakeToLabel(column) }), jsx(DataListRoot, { orientation: "horizontal", padding: 4, borderColor: "gray.200", borderWidth: 1, borderRadius: 4, children: Object.entries(value).map(([key, value]) => {
4621
+ return (jsxs(Flex, { flexFlow: "column", gap: 2, gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", children: [jsx(Text, { children: translate.t(`input.${column}`) }), jsx(DataListRoot, { orientation: "horizontal", padding: 4, borderColor: "gray.200", borderWidth: 1, borderRadius: 4, children: Object.entries(value).map(([key, value]) => {
4627
4622
  return (jsx(DataListItem, { label: `${key}`, ...getDataListProps(value) }, `form-${column}-${key}`));
4628
4623
  }) })] }, `form-${key}`));
4629
4624
  }
4630
4625
  if (type === "boolean") {
4631
- return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${snakeToLabel(column)}`, ...getDataListProps((validatedData ?? {})[column]) }, `form-${key}`));
4626
+ return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps((validatedData ?? {})[column]) }, `form-${key}`));
4632
4627
  }
4633
4628
  if (type === "number" || type === "integer") {
4634
- return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${snakeToLabel(column)}`, ...getDataListProps((validatedData ?? {})[column]) }, `form-${key}`));
4629
+ return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps((validatedData ?? {})[column]) }, `form-${key}`));
4635
4630
  }
4636
4631
  if (type === "array") {
4637
4632
  if (variant === "tag-picker") {
4638
4633
  const value = (validatedData ?? {})[column];
4639
- return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${snakeToLabel(column)}`, ...getDataListProps(JSON.stringify(value)) }, `form-${key}`));
4634
+ return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(JSON.stringify(value)) }, `form-${key}`));
4640
4635
  }
4641
4636
  if (variant === "file-picker") {
4642
4637
  const fileNames = ((validatedData ?? {})[column] ?? []).map((file) => {
4643
4638
  return file.name;
4644
4639
  });
4645
- return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${snakeToLabel(column)}`, ...getDataListProps(JSON.stringify(fileNames)) }, `form-${key}`));
4640
+ return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(JSON.stringify(fileNames)) }, `form-${key}`));
4646
4641
  }
4647
4642
  if (variant === "id-picker") {
4648
4643
  const value = (validatedData ?? {})[column];
@@ -4658,10 +4653,10 @@ const FormInternal = () => {
4658
4653
  return idMap[item][display_column];
4659
4654
  });
4660
4655
  return (jsxs(Grid, { flexFlow: "column", gridColumn,
4661
- gridRow, children: [jsx(Text, { children: snakeToLabel(column) }), jsx(RecordDisplay, { object: mapped })] }, `form-${key}`));
4656
+ gridRow, children: [jsx(Text, { children: translate.t(`input.${column}`) }), jsx(RecordDisplay, { object: mapped })] }, `form-${key}`));
4662
4657
  }
4663
4658
  const objectString = JSON.stringify((validatedData ?? {})[column]);
4664
- return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${snakeToLabel(column)}`, ...getDataListProps(objectString) }, `form-${key}`));
4659
+ return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(objectString) }, `form-${key}`));
4665
4660
  }
4666
4661
  if (type === "null") {
4667
4662
  return jsx(Fragment, { children: `null ${column}` });
@@ -4669,11 +4664,11 @@ const FormInternal = () => {
4669
4664
  return jsx(Fragment, { children: `unknown type ${column}` });
4670
4665
  }) }), jsx(Button, { onClick: () => {
4671
4666
  onFormSubmit(validatedData);
4672
- }, children: confirm ?? "Confirm" }), jsx(Button, { onClick: () => {
4667
+ }, children: translate.t("confirm") }), jsx(Button, { onClick: () => {
4673
4668
  setIsConfirming(false);
4674
- }, variant: "subtle", children: cancel ?? "Cancel" }), isSubmiting && (jsx(Box, { pos: "absolute", inset: "0", bg: "bg/80", children: jsx(Center, { h: "full", children: jsx(Spinner, { color: "teal.500" }) }) })), isError && (jsx(Fragment, { children: jsx(Alert.Root, { status: "error", children: jsx(Alert.Title, { children: jsx(AccordionRoot, { collapsible: true, defaultValue: ["b"], children: jsxs(AccordionItem, { value: "b", children: [jsxs(AccordionItemTrigger, { children: [jsx(Alert.Indicator, {}), `${error}`] }), jsx(AccordionItemContent, { children: `${JSON.stringify(error)}` })] }) }) }) }) }))] }));
4669
+ }, variant: "subtle", children: translate.t("cancel") }), isSubmiting && (jsx(Box, { pos: "absolute", inset: "0", bg: "bg/80", children: jsx(Center, { h: "full", children: jsx(Spinner, { color: "teal.500" }) }) })), isError && (jsx(Fragment, { children: jsx(Alert.Root, { status: "error", children: jsx(Alert.Title, { children: jsx(AccordionRoot, { collapsible: true, defaultValue: ["b"], children: jsxs(AccordionItem, { value: "b", children: [jsxs(AccordionItemTrigger, { children: [jsx(Alert.Indicator, {}), `${error}`] }), jsx(AccordionItemContent, { children: `${JSON.stringify(error)}` })] }) }) }) }) }))] }));
4675
4670
  }
4676
- return (jsxs(Fragment, { children: [jsxs(Grid, { gap: 2, children: [jsx(Heading, { children: title ?? snakeToLabel(schema.title ?? "") }), jsx(Grid, { gap: 4, gridTemplateColumns: "repeat(12, 1fr)", gridTemplateRows: `repeat(${rowNumber ?? "auto-fit"}, auto)`, children: ordered.map((column) => {
4671
+ return (jsxs(Fragment, { children: [jsxs(Grid, { gap: 2, children: [jsxs(Heading, { children: [" ", translate.t("title")] }), jsx(Grid, { gap: 4, gridTemplateColumns: "repeat(12, 1fr)", gridTemplateRows: `repeat(${rowNumber ?? "auto-fit"}, auto)`, children: ordered.map((column) => {
4677
4672
  if (properties === undefined) {
4678
4673
  return jsx(Fragment, {});
4679
4674
  }
@@ -4729,28 +4724,25 @@ const FormInternal = () => {
4729
4724
  return jsx(Text, { children: "missing type" }, `form-${key}`);
4730
4725
  }) }), jsx(Button, { onClick: () => {
4731
4726
  methods.handleSubmit(onValid)();
4732
- }, formNoValidate: true, children: submit ?? "Submit" })] }), isError && (jsxs(Fragment, { children: ["isError", jsxs(Fragment, { children: [" ", `${error}`] })] }))] }));
4727
+ }, formNoValidate: true, children: translate.t("submit") })] }), isError && (jsxs(Fragment, { children: ["isError", jsxs(Fragment, { children: [" ", `${error}`] })] }))] }));
4733
4728
  };
4734
- const Form = ({ schema, serverUrl, order = [], ignore = [], onSubmit = undefined, preLoadedValues = {}, rowNumber = undefined, displayText = {}, }) => {
4735
- const queryClient = new QueryClient();
4736
- const methods = useForm({ values: preLoadedValues });
4737
- const [idMap, setIdMap] = useState({});
4729
+ const Form = ({ schema, idMap, setIdMap, form, serverUrl, translate, order = [], ignore = [], onSubmit = undefined, preLoadedValues = {}, rowNumber = undefined, }) => {
4738
4730
  const { properties } = schema;
4739
4731
  idListSanityCheck("order", order, properties);
4740
4732
  idListSanityCheck("ignore", ignore, properties);
4741
4733
  idListSanityCheck("preLoadedValues", Object.keys(preLoadedValues), properties);
4742
- return (jsx(QueryClientProvider, { client: queryClient, children: jsx(SchemaFormContext.Provider, { value: {
4743
- schema,
4744
- serverUrl,
4745
- displayText,
4746
- order,
4747
- ignore,
4748
- // @ts-expect-error TODO: find appropriate types
4749
- onSubmit,
4750
- rowNumber,
4751
- idMap,
4752
- setIdMap,
4753
- }, children: jsx(FormProvider, { ...methods, children: jsx(FormInternal, {}) }) }) }));
4734
+ return (jsx(SchemaFormContext.Provider, { value: {
4735
+ schema,
4736
+ serverUrl,
4737
+ order,
4738
+ ignore,
4739
+ // @ts-expect-error TODO: find appropriate types
4740
+ onSubmit,
4741
+ rowNumber,
4742
+ idMap,
4743
+ setIdMap,
4744
+ translate,
4745
+ }, children: jsx(FormProvider, { ...form, children: jsx(FormInternal, {}) }) }));
4754
4746
  };
4755
4747
 
4756
4748
  const getMultiDates = ({ selected, selectedDate, selectedDates, selectable, }) => {
@@ -1,32 +1,20 @@
1
1
  import { ForeignKeyProps } from "@/components/Form/components/StringInputField";
2
2
  import { JSONSchema7 } from "json-schema";
3
- import { FieldValues, SubmitHandler } from "react-hook-form";
4
- export interface DisplayTextProps {
5
- title?: string;
6
- addNew?: string;
7
- submit?: string;
8
- confirm?: string;
9
- save?: string;
10
- empty?: string;
11
- cancel?: string;
12
- submitSuccess?: string;
13
- submitAgain?: string;
14
- fieldRequired?: string;
15
- total: string;
16
- showing: string;
17
- close: string;
18
- typeToSearch: string;
19
- showMore: string;
20
- }
3
+ import { Dispatch, SetStateAction } from "react";
4
+ import { FieldValues, SubmitHandler, UseFormReturn } from "react-hook-form";
5
+ import { UseTranslationResponse } from "react-i18next";
21
6
  export interface FormProps<TData extends FieldValues> {
22
7
  schema: JSONSchema7;
23
8
  serverUrl: string;
9
+ idMap: Record<string, object>;
10
+ setIdMap: Dispatch<SetStateAction<Record<string, object>>>;
11
+ form: UseFormReturn;
12
+ translate: UseTranslationResponse<any, any>;
24
13
  order?: string[];
25
14
  ignore?: string[];
26
15
  onSubmit?: SubmitHandler<TData>;
27
16
  preLoadedValues?: object;
28
17
  rowNumber?: number | string;
29
- displayText?: Partial<DisplayTextProps>;
30
18
  }
31
19
  export interface CustomJSONSchema7Definition extends JSONSchema7 {
32
20
  variant: string;
@@ -37,4 +25,4 @@ export interface CustomJSONSchema7Definition extends JSONSchema7 {
37
25
  gridRow: string;
38
26
  foreign_key: ForeignKeyProps;
39
27
  }
40
- export declare const Form: <TData extends FieldValues>({ schema, serverUrl, order, ignore, onSubmit, preLoadedValues, rowNumber, displayText, }: FormProps<TData>) => import("react/jsx-runtime").JSX.Element;
28
+ export declare const Form: <TData extends FieldValues>({ schema, idMap, setIdMap, form, serverUrl, translate, order, ignore, onSubmit, preLoadedValues, rowNumber, }: FormProps<TData>) => import("react/jsx-runtime").JSX.Element;
@@ -1,16 +1,16 @@
1
1
  import { JSONSchema7 } from "json-schema";
2
2
  import { Dispatch, SetStateAction } from "react";
3
3
  import { FieldValues } from "react-hook-form";
4
- import { DisplayTextProps } from "./Form";
4
+ import { UseTranslationResponse } from "react-i18next";
5
5
  export interface SchemaFormContext<TData extends FieldValues> {
6
6
  schema: JSONSchema7;
7
7
  serverUrl: string;
8
8
  order: string[];
9
9
  ignore: string[];
10
- displayText: Partial<DisplayTextProps>;
11
10
  onSubmit?: (data: TData) => Promise<void>;
12
11
  rowNumber?: number | string;
13
12
  idMap: Record<string, object>;
14
13
  setIdMap: Dispatch<SetStateAction<Record<string, object>>>;
14
+ translate: UseTranslationResponse<any, any>;
15
15
  }
16
16
  export declare const SchemaFormContext: import("react").Context<SchemaFormContext<unknown>>;