@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.d.ts +9 -22
- package/dist/index.js +108 -116
- package/dist/index.mjs +111 -119
- package/dist/types/components/Form/Form.d.ts +8 -20
- package/dist/types/components/Form/SchemaFormContext.d.ts +2 -2
- package/dist/types/components/Form/components/IdViewer.d.ts +1 -3
- package/dist/types/components/Form/useForm.d.ts +12 -0
- package/dist/types/components/Form/useSchemaContext.d.ts +1 -1
- package/dist/types/components/ui/hover-card.d.ts +11 -0
- package/package.json +3 -2
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
|
|
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,
|
|
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,
|
|
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,
|
|
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 {
|
|
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: `${
|
|
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
|
|
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
|
|
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 && (
|
|
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
|
|
3696
|
-
const {
|
|
3697
|
-
return (
|
|
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
|
|
3700
|
-
|
|
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
|
|
3705
|
-
const
|
|
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 {
|
|
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
|
|
3713
|
+
return (jsxs(Flex, { flexFlow: "column", children: [jsx(Text, { children: translate.t(`${column}.fieldLabel`) }), jsx(Text, { children: translate.t(`empty`) })] }));
|
|
3733
3714
|
}
|
|
3734
|
-
return (
|
|
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,
|
|
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
|
|
3755
|
-
return (jsxs(Field, { label: `${
|
|
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,
|
|
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
|
|
3768
|
-
return (jsx(Fragment, { children: jsxs(Field, { label: `${
|
|
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,
|
|
3787
|
-
const { schema,
|
|
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
|
|
3796
|
-
return (jsxs(Field, { label: `${
|
|
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
|
|
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,
|
|
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
|
|
3883
|
-
return (jsxs(Field, { label: `${
|
|
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
|
|
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
|
|
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,
|
|
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,
|
|
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: `${
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
4314
|
-
|
|
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: `${
|
|
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
|
|
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,
|
|
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
|
|
4348
|
-
return (jsxs(Field, { label: `${
|
|
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
|
|
4380
|
+
}, children: translate.t(`${column}.save`) })] })] }) }), jsx(Button, { onClick: () => {
|
|
4385
4381
|
setShowNewEntries(true);
|
|
4386
4382
|
setNewKey(undefined);
|
|
4387
4383
|
setNewValue(undefined);
|
|
4388
|
-
}, children: addNew
|
|
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,
|
|
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:
|
|
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
|
|
4584
|
+
}, formNoValidate: true, children: translate.t("submitAgain") })] }));
|
|
4590
4585
|
}
|
|
4591
4586
|
if (isConfirming) {
|
|
4592
|
-
return (jsxs(Grid, { gap: 2, children: [
|
|
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: `${
|
|
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: `${
|
|
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: `${
|
|
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: `${
|
|
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:
|
|
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: `${
|
|
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: `${
|
|
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: `${
|
|
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: `${
|
|
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:
|
|
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: `${
|
|
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
|
|
4667
|
+
}, children: translate.t("confirm") }), jsx(Button, { onClick: () => {
|
|
4673
4668
|
setIsConfirming(false);
|
|
4674
|
-
}, variant: "subtle", children: cancel
|
|
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: [
|
|
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
|
|
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,
|
|
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(
|
|
4743
|
-
|
|
4744
|
-
|
|
4745
|
-
|
|
4746
|
-
|
|
4747
|
-
|
|
4748
|
-
|
|
4749
|
-
|
|
4750
|
-
|
|
4751
|
-
|
|
4752
|
-
|
|
4753
|
-
|
|
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 {
|
|
4
|
-
|
|
5
|
-
|
|
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,
|
|
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 {
|
|
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>>;
|