@bsol-oss/react-datatable5 8.1.2 → 9.0.1

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,13 +21,14 @@ 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, useForm as useForm$1 } from 'react-hook-form';
30
30
  import dayjs from 'dayjs';
31
+ import { useTranslation } from 'react-i18next';
31
32
 
32
33
  const DataTableContext = createContext({
33
34
  table: {},
@@ -3539,7 +3540,7 @@ const Field = React.forwardRef(function Field(props, ref) {
3539
3540
  });
3540
3541
 
3541
3542
  const useSchemaContext = () => {
3542
- const { schema, serverUrl, order, ignore, onSubmit, rowNumber, displayText, idMap, setIdMap, } = useContext(SchemaFormContext);
3543
+ const { schema, serverUrl, order, ignore, onSubmit, rowNumber, idMap, setIdMap, translate, } = useContext(SchemaFormContext);
3543
3544
  return {
3544
3545
  schema,
3545
3546
  serverUrl,
@@ -3547,9 +3548,9 @@ const useSchemaContext = () => {
3547
3548
  ignore,
3548
3549
  onSubmit,
3549
3550
  rowNumber,
3550
- displayText,
3551
3551
  idMap,
3552
3552
  setIdMap,
3553
+ translate,
3553
3554
  };
3554
3555
  };
3555
3556
 
@@ -3587,16 +3588,13 @@ const getTableData = async ({ serverUrl, in_table, searching = "", where = [], l
3587
3588
 
3588
3589
  const IdPicker = ({ column, isMultiple = false }) => {
3589
3590
  const { watch, formState: { errors }, setValue, } = useFormContext();
3590
- const { schema, serverUrl, displayText, idMap, setIdMap } = useSchemaContext();
3591
- const { fieldRequired } = displayText;
3591
+ const { schema, serverUrl, idMap, setIdMap, translate } = useSchemaContext();
3592
3592
  const { required } = schema;
3593
3593
  const isRequired = required?.some((columnId) => columnId === column);
3594
3594
  if (schema.properties == undefined) {
3595
- throw new Error("schema properties when using DatePicker");
3595
+ throw new Error("schema properties is undefined when using DatePicker");
3596
3596
  }
3597
- const { total, showing, typeToSearch } = displayText;
3598
- const { gridColumn, gridRow, title, renderDisplay, foreign_key } = schema
3599
- .properties[column];
3597
+ const { gridColumn, gridRow, renderDisplay, foreign_key } = schema.properties[column];
3600
3598
  const { table, column: column_ref, display_column, } = foreign_key;
3601
3599
  const [searchText, setSearchText] = useState();
3602
3600
  const [limit, setLimit] = useState(10);
@@ -3651,7 +3649,7 @@ const IdPicker = ({ column, isMultiple = false }) => {
3651
3649
  }
3652
3650
  return record[display_column];
3653
3651
  };
3654
- return (jsxs(Field, { label: `${title ?? snakeToLabel(column)}`, required: isRequired, alignItems: "stretch", gridColumn,
3652
+ return (jsxs(Field, { label: `${translate.t(`${column}.fieldLabel`)}`, required: isRequired, alignItems: "stretch", gridColumn,
3655
3653
  gridRow, children: [isMultiple && (jsxs(Flex, { flexFlow: "wrap", gap: 1, children: [selectedIds.map((id) => {
3656
3654
  const item = idMap[id];
3657
3655
  if (item === undefined) {
@@ -3666,10 +3664,10 @@ const IdPicker = ({ column, isMultiple = false }) => {
3666
3664
  setOpenSearchResult(true);
3667
3665
  }, children: "Add" })] })), !isMultiple && (jsx(Button, { variant: "outline", onClick: () => {
3668
3666
  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) => {
3667
+ }, 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
3668
  onSearchChange(event);
3671
3669
  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:
3670
+ }, 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
3671
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
3674
3672
  dataList.map((item) => {
3675
3673
  const selected = isMultiple
@@ -3689,49 +3687,33 @@ const IdPicker = ({ column, isMultiple = false }) => {
3689
3687
  }, opacity: 0.7, _hover: { opacity: 1 }, ...(selected ? { color: "gray.400/50" } : {}), children: !!renderDisplay === true
3690
3688
  ? renderDisplay(item)
3691
3689
  : 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" }))] }));
3690
+ }) }), 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
3691
  };
3694
3692
 
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] }) }) })] }));
3698
- });
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, {}) }) }));
3693
+ const HoverCardContent = React.forwardRef(function HoverCardContent(props, ref) {
3694
+ const { portalled = true, portalRef, ...rest } = props;
3695
+ return (jsx(Portal, { disabled: !portalled, container: portalRef, children: jsx(HoverCard.Positioner, { children: jsx(HoverCard.Content, { ref: ref, ...rest }) }) }));
3702
3696
  });
3703
-
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] }));
3697
+ const HoverCardArrow = React.forwardRef(function HoverCardArrow(props, ref) {
3698
+ return (jsx(HoverCard.Arrow, { ref: ref, ...props, children: jsx(HoverCard.ArrowTip, {}) }));
3708
3699
  });
3700
+ const HoverCardRoot = HoverCard.Root;
3701
+ const HoverCardTrigger = HoverCard.Trigger;
3709
3702
 
3710
- const IdViewer = ({ value, column, dataListItemProps, }) => {
3711
- const { schema, idMap } = useSchemaContext();
3703
+ const IdViewer = ({ value, column }) => {
3704
+ const { schema, idMap, translate } = useSchemaContext();
3712
3705
  if (schema.properties == undefined) {
3713
3706
  throw new Error("schema properties when using DatePicker");
3714
3707
  }
3715
- const { title, foreign_key } = schema.properties[column];
3708
+ const { foreign_key } = schema.properties[column];
3716
3709
  if (foreign_key === undefined) {
3717
3710
  throw new Error("foreign_key when variant is id-picker");
3718
3711
  }
3719
3712
  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
3713
  if (value === undefined) {
3732
- return jsx(Fragment, { children: "undefined" });
3714
+ return (jsxs(Flex, { flexFlow: "column", children: [jsx(Text, { children: translate.t(`${column}.fieldLabel`) }), jsx(Text, { children: translate.t(`empty`) })] }));
3733
3715
  }
3734
- return (jsx(DataListItem, { label: `${title ?? snakeToLabel(column)}`, ...getDataListProps(idMap[value][display_column]), ...dataListItemProps }));
3716
+ 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
3717
  };
3736
3718
 
3737
3719
  const NumberInputRoot = React.forwardRef(function NumberInput$1(props, ref) {
@@ -3744,28 +3726,26 @@ NumberInput.Label;
3744
3726
 
3745
3727
  const NumberInputField = ({ column }) => {
3746
3728
  const { register, formState: { errors }, } = useFormContext();
3747
- const { schema, displayText } = useSchemaContext();
3748
- const { fieldRequired } = displayText;
3729
+ const { schema, translate } = useSchemaContext();
3749
3730
  const { required } = schema;
3750
3731
  const isRequired = required?.some((columnId) => columnId === column);
3751
3732
  if (schema.properties == undefined) {
3752
3733
  throw new Error("schema properties when using String Input Field");
3753
3734
  }
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" }))] }));
3735
+ const { gridColumn, gridRow } = schema.properties[column];
3736
+ 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
3737
  };
3757
3738
 
3758
3739
  const StringInputField = ({ column }) => {
3759
3740
  const { register, formState: { errors }, } = useFormContext();
3760
- const { schema, displayText } = useSchemaContext();
3761
- const { fieldRequired } = displayText;
3741
+ const { schema, translate } = useSchemaContext();
3762
3742
  const { required } = schema;
3763
3743
  const isRequired = required?.some((columnId) => columnId === column);
3764
3744
  if (schema.properties == undefined) {
3765
3745
  throw new Error("schema properties when using String Input Field");
3766
3746
  }
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" }))] }) }));
3747
+ const { gridColumn, gridRow } = schema.properties[column];
3748
+ 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
3749
  };
3770
3750
 
3771
3751
  const clearEmptyString = (object) => {
@@ -3782,21 +3762,35 @@ const AccordionItemContent = React.forwardRef(function AccordionItemContent(prop
3782
3762
  const AccordionRoot = Accordion.Root;
3783
3763
  const AccordionItem = Accordion.Item;
3784
3764
 
3765
+ const ToggleTip = React.forwardRef(function ToggleTip(props, ref) {
3766
+ const { showArrow, children, portalled = true, content, portalRef, ...rest } = props;
3767
+ 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] }) }) })] }));
3768
+ });
3769
+ const InfoTip = React.forwardRef(function InfoTip(props, ref) {
3770
+ const { children, ...rest } = props;
3771
+ return (jsx(ToggleTip, { content: children, ...rest, ref: ref, children: jsx(IconButton, { variant: "ghost", "aria-label": "info", size: "2xs", colorPalette: "gray", children: jsx(HiOutlineInformationCircle, {}) }) }));
3772
+ });
3773
+
3774
+ const DataListRoot = DataList.Root;
3775
+ const DataListItem = React.forwardRef(function DataListItem(props, ref) {
3776
+ const { label, info, value, children, grow, ...rest } = props;
3777
+ 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] }));
3778
+ });
3779
+
3785
3780
  const BooleanPicker = ({ column }) => {
3786
- const { watch, formState: { errors }, setValue, getValues, } = useFormContext();
3787
- const { schema, displayText } = useSchemaContext();
3788
- const { fieldRequired } = displayText;
3781
+ const { watch, formState: { errors }, setValue, } = useFormContext();
3782
+ const { schema, translate } = useSchemaContext();
3789
3783
  const { required } = schema;
3790
3784
  const isRequired = required?.some((columnId) => columnId === column);
3791
3785
  const value = watch(column);
3792
3786
  if (schema.properties == undefined) {
3793
3787
  throw new Error("schema properties when using BooleanPicker");
3794
3788
  }
3795
- const { gridColumn, gridRow, title } = schema.properties[column];
3796
- return (jsxs(Field, { label: `${title ?? snakeToLabel(column)}`, required: isRequired, alignItems: "stretch", gridColumn,
3789
+ const { gridColumn, gridRow } = schema.properties[column];
3790
+ return (jsxs(Field, { label: `${translate.t(`${column}.fieldLabel`)}`, required: isRequired, alignItems: "stretch", gridColumn,
3797
3791
  gridRow, children: [jsx(CheckboxCard, { checked: value, variant: "surface", onSelect: () => {
3798
3792
  setValue(column, !value);
3799
- } }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: fieldRequired ?? "The field is requried" }))] }));
3793
+ } }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: translate.t(`${column}.fieldRequired`) }))] }));
3800
3794
  };
3801
3795
 
3802
3796
  const monthNamesShort = [
@@ -3870,8 +3864,7 @@ let DatePicker$1 = class DatePicker extends React__default.Component {
3870
3864
 
3871
3865
  const DatePicker = ({ column }) => {
3872
3866
  const { watch, formState: { errors }, setValue, } = useFormContext();
3873
- const { schema, displayText } = useSchemaContext();
3874
- const { fieldRequired } = displayText;
3867
+ const { schema, translate } = useSchemaContext();
3875
3868
  const { required } = schema;
3876
3869
  const isRequired = required?.some((columnId) => columnId === column);
3877
3870
  const [open, setOpen] = useState(false);
@@ -3879,14 +3872,20 @@ const DatePicker = ({ column }) => {
3879
3872
  if (schema.properties == undefined) {
3880
3873
  throw new Error("schema properties when using DatePicker");
3881
3874
  }
3882
- const { gridColumn, gridRow, title } = schema.properties[column];
3883
- return (jsxs(Field, { label: `${title ?? snakeToLabel(column)}`, required: isRequired, alignItems: "stretch", gridColumn,
3875
+ const { gridColumn, gridRow } = schema.properties[column];
3876
+ return (jsxs(Field, { label: `${translate.t(`${column}.fieldLabel`)}`, required: isRequired, alignItems: "stretch", gridColumn,
3884
3877
  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
3878
  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 }) => {
3879
+ }, children: selectedDate !== undefined ? selectedDate : "" }) }), jsx(PopoverContent, { children: jsxs(PopoverBody, { children: [jsx(PopoverTitle, {}), jsx(DatePicker$1
3880
+ // @ts-expect-error TODO: find appropriate types
3881
+ , {
3882
+ // @ts-expect-error TODO: find appropriate types
3883
+ selected: new Date(selectedDate),
3884
+ // @ts-expect-error TODO: find appropriate types
3885
+ onDateSelected: ({ selected, selectable, date }) => {
3887
3886
  setValue(column, dayjs(date).format("YYYY-MM-DD"));
3888
3887
  setOpen(false);
3889
- } })] }) })] }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: fieldRequired ?? "The field is requried" }))] }));
3888
+ } })] }) })] }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: translate.t(`${column}.fieldRequired`) }))] }));
3890
3889
  };
3891
3890
 
3892
3891
  function filterArray(array, searchTerm) {
@@ -3901,14 +3900,13 @@ function filterArray(array, searchTerm) {
3901
3900
 
3902
3901
  const EnumPicker = ({ column, isMultiple = false }) => {
3903
3902
  const { watch, formState: { errors }, setValue, } = useFormContext();
3904
- const { schema, displayText } = useSchemaContext();
3905
- const { fieldRequired, total, showing, typeToSearch } = displayText;
3903
+ const { schema, translate } = useSchemaContext();
3906
3904
  const { required } = schema;
3907
3905
  const isRequired = required?.some((columnId) => columnId === column);
3908
3906
  if (schema.properties == undefined) {
3909
3907
  throw new Error("schema properties when using DatePicker");
3910
3908
  }
3911
- const { gridColumn, gridRow, title, renderDisplay } = schema.properties[column];
3909
+ const { gridColumn, gridRow, renderDisplay } = schema.properties[column];
3912
3910
  const [searchText, setSearchText] = useState();
3913
3911
  const [limit, setLimit] = useState(10);
3914
3912
  const [openSearchResult, setOpenSearchResult] = useState();
@@ -3923,24 +3921,24 @@ const EnumPicker = ({ column, isMultiple = false }) => {
3923
3921
  setSearchText(event.target.value);
3924
3922
  setLimit(10);
3925
3923
  };
3926
- return (jsxs(Field, { label: `${title ?? snakeToLabel(column)}`, required: isRequired, alignItems: "stretch", gridColumn,
3924
+ return (jsxs(Field, { label: `${translate.t(`${column}.fieldLabel`)}`, required: isRequired, alignItems: "stretch", gridColumn,
3927
3925
  gridRow, children: [isMultiple && (jsxs(Flex, { flexFlow: "wrap", gap: 1, children: [watchEnums.map((enumValue) => {
3928
3926
  const item = enumValue;
3929
3927
  if (item === undefined) {
3930
3928
  return jsx(Fragment, { children: "undefined" });
3931
3929
  }
3932
3930
  return (jsx(Tag, { closable: true, onClick: () => {
3933
- setSelectedEnums((state) => state.filter((id) => id != item));
3931
+ // setSelectedEnums((state) => state.filter((id) => id != item));
3934
3932
  setValue(column, watchEnums.filter((id) => id != item));
3935
3933
  }, children: !!renderDisplay === true ? renderDisplay(item) : item }));
3936
3934
  }), jsx(Tag, { cursor: "pointer", onClick: () => {
3937
3935
  setOpenSearchResult(true);
3938
3936
  }, children: "Add" })] })), !isMultiple && (jsx(Button, { variant: "outline", onClick: () => {
3939
3937
  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) => {
3938
+ }, 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
3939
  onSearchChange(event);
3942
3940
  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) => {
3941
+ }, 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
3942
  const selected = isMultiple
3945
3943
  ? watchEnums.some((enumValue) => item === enumValue)
3946
3944
  : watchEnum == item;
@@ -3953,7 +3951,7 @@ const EnumPicker = ({ column, isMultiple = false }) => {
3953
3951
  const newSet = new Set([...(watchEnums ?? []), item]);
3954
3952
  setValue(column, [...newSet]);
3955
3953
  }, ...(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" }))] }));
3954
+ }) }), 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
3955
  };
3958
3956
 
3959
3957
  function isEnteringWindow(_ref) {
@@ -4310,8 +4308,8 @@ const FileDropzone = ({ children = undefined, gridProps = {}, onDrop = () => { }
4310
4308
 
4311
4309
  const FilePicker = ({ column }) => {
4312
4310
  const { setValue, formState: { errors }, watch, } = useFormContext();
4313
- const { schema, displayText } = useSchemaContext();
4314
- const { fieldRequired } = displayText;
4311
+ const { schema, translate } = useSchemaContext();
4312
+ displayText;
4315
4313
  const { required } = schema;
4316
4314
  const isRequired = required?.some((columnId) => columnId === column);
4317
4315
  if (schema.properties == undefined) {
@@ -4319,22 +4317,21 @@ const FilePicker = ({ column }) => {
4319
4317
  }
4320
4318
  const { gridColumn, gridRow, title } = schema.properties[column];
4321
4319
  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 }) => {
4320
+ 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
4321
  const newFiles = files.filter(({ name }) => !currentFiles.some((cur) => cur.name === name));
4324
4322
  setValue(column, [...currentFiles, ...newFiles]);
4325
- } }), jsx(Flex, { flexFlow: "wrap", alignItems: "start", gap: 1, children: currentFiles.map((file) => {
4323
+ }, placeholder: translate.t(`${column}.fileDropzone`) }), jsx(Flex, { flexFlow: "wrap", alignItems: "start", gap: 1, children: currentFiles.map((file) => {
4326
4324
  return (jsx(Tag, { cursor: "pointer", onClick: () => {
4327
4325
  setValue(column, currentFiles.filter(({ name }) => {
4328
4326
  return name !== file.name;
4329
4327
  }));
4330
4328
  }, children: file.name }));
4331
- }) }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: fieldRequired ?? "The field is requried" }))] }));
4329
+ }) }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: translate.t(`${column}.fieldRequired`) }))] }));
4332
4330
  };
4333
4331
 
4334
4332
  const ObjectInput = ({ column }) => {
4335
4333
  const { formState: { errors }, setValue, getValues, } = useFormContext();
4336
- const { schema, displayText } = useSchemaContext();
4337
- const { addNew, fieldRequired, save } = displayText;
4334
+ const { schema, translate } = useSchemaContext();
4338
4335
  const { required } = schema;
4339
4336
  const isRequired = required?.some((columnId) => columnId === column);
4340
4337
  const entries = Object.entries(getValues(column) ?? {});
@@ -4344,8 +4341,8 @@ const ObjectInput = ({ column }) => {
4344
4341
  if (schema.properties == undefined) {
4345
4342
  throw new Error("schema properties when using DatePicker");
4346
4343
  }
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]) => {
4344
+ const { gridColumn, gridRow } = schema.properties[column];
4345
+ return (jsxs(Field, { label: `${translate.t(`${column}.fieldLabel`)}`, required: isRequired, alignItems: "stretch", gridColumn, gridRow, children: [entries.map(([key, value]) => {
4349
4346
  return (jsxs(Grid, { templateColumns: "1fr 1fr auto", gap: 1, children: [jsx(Input, { value: key, onChange: (e) => {
4350
4347
  const filtered = entries.filter(([target]) => {
4351
4348
  return target !== key;
@@ -4381,11 +4378,11 @@ const ObjectInput = ({ column }) => {
4381
4378
  setShowNewEntries(false);
4382
4379
  setNewKey(undefined);
4383
4380
  setNewValue(undefined);
4384
- }, children: save ?? "Save" })] })] }) }), jsx(Button, { onClick: () => {
4381
+ }, children: translate.t(`${column}.save`) })] })] }) }), jsx(Button, { onClick: () => {
4385
4382
  setShowNewEntries(true);
4386
4383
  setNewKey(undefined);
4387
4384
  setNewValue(undefined);
4388
- }, children: addNew ?? "Add New" }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: fieldRequired ?? "The field is requried" }))] }));
4385
+ }, children: translate.t(`${column}.addNew`) }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: translate.t(`${column}.fieldRequired`) }))] }));
4389
4386
  };
4390
4387
 
4391
4388
  const RadioCardItem = React.forwardRef(function RadioCardItem(props, ref) {
@@ -4499,8 +4496,7 @@ const idPickerSanityCheck = (column, foreign_key) => {
4499
4496
  }
4500
4497
  };
4501
4498
  const FormInternal = () => {
4502
- const { schema, serverUrl, displayText, order, ignore, onSubmit, rowNumber, idMap, } = useSchemaContext();
4503
- const { title, submit, empty, cancel, submitSuccess, submitAgain, confirm } = displayText;
4499
+ const { schema, serverUrl, order, ignore, onSubmit, rowNumber, idMap, translate, } = useSchemaContext();
4504
4500
  const methods = useFormContext();
4505
4501
  const [isSuccess, setIsSuccess] = useState(false);
4506
4502
  const [isError, setIsError] = useState(false);
@@ -4570,7 +4566,7 @@ const FormInternal = () => {
4570
4566
  const getDataListProps = (value) => {
4571
4567
  if (value == undefined || value.length <= 0) {
4572
4568
  return {
4573
- value: `<${empty ?? "Empty"}>`,
4569
+ value: `<${translate.t("empty") ?? "Empty"}>`,
4574
4570
  color: "gray.400",
4575
4571
  };
4576
4572
  }
@@ -4579,17 +4575,17 @@ const FormInternal = () => {
4579
4575
  };
4580
4576
  };
4581
4577
  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: () => {
4578
+ 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
4579
  setIsError(false);
4584
4580
  setIsSubmiting(false);
4585
4581
  setIsSuccess(false);
4586
4582
  setIsConfirming(false);
4587
4583
  setValidatedData(undefined);
4588
4584
  methods.reset();
4589
- }, formNoValidate: true, children: submitAgain ?? "Submit Again" })] }));
4585
+ }, formNoValidate: true, children: translate.t("submitAgain") })] }));
4590
4586
  }
4591
4587
  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) => {
4588
+ 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
4589
  if (properties === undefined) {
4594
4590
  return jsx(Fragment, {});
4595
4591
  }
@@ -4611,38 +4607,38 @@ const FormInternal = () => {
4611
4607
  if (variant === "date-picker") {
4612
4608
  const value = (validatedData ?? {})[column];
4613
4609
  if (!!value === false) {
4614
- return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${snakeToLabel(column)}`, ...getDataListProps(undefined) }, `form-${key}`));
4610
+ return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(undefined) }, `form-${key}`));
4615
4611
  }
4616
4612
  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}`));
4613
+ return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(date) }, `form-${key}`));
4618
4614
  }
4619
- return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${snakeToLabel(column)}`, ...getDataListProps((validatedData ?? {})[column]) }, `form-${key}`));
4615
+ return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps((validatedData ?? {})[column]) }, `form-${key}`));
4620
4616
  }
4621
4617
  if (type === "object") {
4622
4618
  const value = (validatedData ?? {})[column];
4623
4619
  if (!!value === false) {
4624
- return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${snakeToLabel(column)}`, ...getDataListProps(undefined) }, `form-${key}`));
4620
+ return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(undefined) }, `form-${key}`));
4625
4621
  }
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]) => {
4622
+ 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
4623
  return (jsx(DataListItem, { label: `${key}`, ...getDataListProps(value) }, `form-${column}-${key}`));
4628
4624
  }) })] }, `form-${key}`));
4629
4625
  }
4630
4626
  if (type === "boolean") {
4631
- return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${snakeToLabel(column)}`, ...getDataListProps((validatedData ?? {})[column]) }, `form-${key}`));
4627
+ return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps((validatedData ?? {})[column]) }, `form-${key}`));
4632
4628
  }
4633
4629
  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}`));
4630
+ return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps((validatedData ?? {})[column]) }, `form-${key}`));
4635
4631
  }
4636
4632
  if (type === "array") {
4637
4633
  if (variant === "tag-picker") {
4638
4634
  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}`));
4635
+ return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(JSON.stringify(value)) }, `form-${key}`));
4640
4636
  }
4641
4637
  if (variant === "file-picker") {
4642
4638
  const fileNames = ((validatedData ?? {})[column] ?? []).map((file) => {
4643
4639
  return file.name;
4644
4640
  });
4645
- return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${snakeToLabel(column)}`, ...getDataListProps(JSON.stringify(fileNames)) }, `form-${key}`));
4641
+ return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(JSON.stringify(fileNames)) }, `form-${key}`));
4646
4642
  }
4647
4643
  if (variant === "id-picker") {
4648
4644
  const value = (validatedData ?? {})[column];
@@ -4658,10 +4654,10 @@ const FormInternal = () => {
4658
4654
  return idMap[item][display_column];
4659
4655
  });
4660
4656
  return (jsxs(Grid, { flexFlow: "column", gridColumn,
4661
- gridRow, children: [jsx(Text, { children: snakeToLabel(column) }), jsx(RecordDisplay, { object: mapped })] }, `form-${key}`));
4657
+ gridRow, children: [jsx(Text, { children: translate.t(`input.${column}`) }), jsx(RecordDisplay, { object: mapped })] }, `form-${key}`));
4662
4658
  }
4663
4659
  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}`));
4660
+ return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(objectString) }, `form-${key}`));
4665
4661
  }
4666
4662
  if (type === "null") {
4667
4663
  return jsx(Fragment, { children: `null ${column}` });
@@ -4669,11 +4665,11 @@ const FormInternal = () => {
4669
4665
  return jsx(Fragment, { children: `unknown type ${column}` });
4670
4666
  }) }), jsx(Button, { onClick: () => {
4671
4667
  onFormSubmit(validatedData);
4672
- }, children: confirm ?? "Confirm" }), jsx(Button, { onClick: () => {
4668
+ }, children: translate.t("confirm") }), jsx(Button, { onClick: () => {
4673
4669
  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)}` })] }) }) }) }) }))] }));
4670
+ }, 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
4671
  }
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) => {
4672
+ 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
4673
  if (properties === undefined) {
4678
4674
  return jsx(Fragment, {});
4679
4675
  }
@@ -4729,28 +4725,37 @@ const FormInternal = () => {
4729
4725
  return jsx(Text, { children: "missing type" }, `form-${key}`);
4730
4726
  }) }), jsx(Button, { onClick: () => {
4731
4727
  methods.handleSubmit(onValid)();
4732
- }, formNoValidate: true, children: submit ?? "Submit" })] }), isError && (jsxs(Fragment, { children: ["isError", jsxs(Fragment, { children: [" ", `${error}`] })] }))] }));
4728
+ }, formNoValidate: true, children: translate.t("submit") })] }), isError && (jsxs(Fragment, { children: ["isError", jsxs(Fragment, { children: [" ", `${error}`] })] }))] }));
4733
4729
  };
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({});
4730
+ const Form = ({ schema, idMap, setIdMap, form, serverUrl, translate, order = [], ignore = [], onSubmit = undefined, preLoadedValues = {}, rowNumber = undefined, }) => {
4738
4731
  const { properties } = schema;
4739
4732
  idListSanityCheck("order", order, properties);
4740
4733
  idListSanityCheck("ignore", ignore, properties);
4741
4734
  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, {}) }) }) }));
4735
+ return (jsx(SchemaFormContext.Provider, { value: {
4736
+ schema,
4737
+ serverUrl,
4738
+ order,
4739
+ ignore,
4740
+ // @ts-expect-error TODO: find appropriate types
4741
+ onSubmit,
4742
+ rowNumber,
4743
+ idMap,
4744
+ setIdMap,
4745
+ translate,
4746
+ }, children: jsx(FormProvider, { ...form, children: jsx(FormInternal, {}) }) }));
4747
+ };
4748
+
4749
+ const useForm = ({ preLoadedValues, keyPrefix }) => {
4750
+ const form = useForm$1({ values: preLoadedValues });
4751
+ const [idMap, setIdMap] = useState({});
4752
+ const translate = useTranslation("", { keyPrefix });
4753
+ return {
4754
+ form,
4755
+ idMap,
4756
+ setIdMap,
4757
+ translate,
4758
+ };
4754
4759
  };
4755
4760
 
4756
4761
  const getMultiDates = ({ selected, selectedDate, selectedDates, selectable, }) => {
@@ -4769,4 +4774,4 @@ const getMultiDates = ({ selected, selectedDate, selectedDates, selectable, }) =
4769
4774
  }
4770
4775
  };
4771
4776
 
4772
- export { CardHeader, DataDisplay, DataTable, DataTableServer, DefaultCardTitle, DefaultTable, DensityToggleButton, EditFilterButton, EditOrderButton, EditSortingButton, EditViewButton, EmptyState, ErrorAlert, FilterOptions, Form, GlobalFilter, PageSizeControl, RecordDisplay, ReloadButton, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, RowCountText, Table, TableBody, TableCardContainer, TableCards, TableComponent, TableControls, TableFilter, TableFilterTags, TableFooter, TableHeader, TableLoadingComponent, TableOrderer, TablePagination, TableSelector, TableSorter, TableViewer, TextCell, getColumns, getMultiDates, getRangeDates, useDataTable, useDataTableContext, useDataTableServer, widthSanityCheck };
4777
+ export { CardHeader, DataDisplay, DataTable, DataTableServer, DefaultCardTitle, DefaultTable, DensityToggleButton, EditFilterButton, EditOrderButton, EditSortingButton, EditViewButton, EmptyState, ErrorAlert, FilterOptions, Form, GlobalFilter, PageSizeControl, RecordDisplay, ReloadButton, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, RowCountText, Table, TableBody, TableCardContainer, TableCards, TableComponent, TableControls, TableFilter, TableFilterTags, TableFooter, TableHeader, TableLoadingComponent, TableOrderer, TablePagination, TableSelector, TableSorter, TableViewer, TextCell, getColumns, getMultiDates, getRangeDates, useDataTable, useDataTableContext, useDataTableServer, useForm, widthSanityCheck };
@@ -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;