@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.d.ts +22 -22
- package/dist/index.js +122 -116
- package/dist/index.mjs +125 -120
- 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/dist/types/index.d.ts +1 -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,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
|
|
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, 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,
|
|
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,
|
|
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 {
|
|
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: `${
|
|
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
|
|
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
|
|
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 && (
|
|
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
|
|
3696
|
-
const {
|
|
3697
|
-
return (
|
|
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
|
-
|
|
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
|
|
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 {
|
|
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
|
|
3714
|
+
return (jsxs(Flex, { flexFlow: "column", children: [jsx(Text, { children: translate.t(`${column}.fieldLabel`) }), jsx(Text, { children: translate.t(`empty`) })] }));
|
|
3733
3715
|
}
|
|
3734
|
-
return (
|
|
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,
|
|
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
|
|
3755
|
-
return (jsxs(Field, { label: `${
|
|
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,
|
|
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
|
|
3768
|
-
return (jsx(Fragment, { children: jsxs(Field, { label: `${
|
|
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,
|
|
3787
|
-
const { schema,
|
|
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
|
|
3796
|
-
return (jsxs(Field, { label: `${
|
|
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
|
|
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,
|
|
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
|
|
3883
|
-
return (jsxs(Field, { label: `${
|
|
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
|
|
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
|
|
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,
|
|
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,
|
|
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: `${
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
4314
|
-
|
|
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: `${
|
|
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
|
|
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,
|
|
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
|
|
4348
|
-
return (jsxs(Field, { label: `${
|
|
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
|
|
4381
|
+
}, children: translate.t(`${column}.save`) })] })] }) }), jsx(Button, { onClick: () => {
|
|
4385
4382
|
setShowNewEntries(true);
|
|
4386
4383
|
setNewKey(undefined);
|
|
4387
4384
|
setNewValue(undefined);
|
|
4388
|
-
}, children: addNew
|
|
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,
|
|
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:
|
|
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
|
|
4585
|
+
}, formNoValidate: true, children: translate.t("submitAgain") })] }));
|
|
4590
4586
|
}
|
|
4591
4587
|
if (isConfirming) {
|
|
4592
|
-
return (jsxs(Grid, { gap: 2, children: [
|
|
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: `${
|
|
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: `${
|
|
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: `${
|
|
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: `${
|
|
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:
|
|
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: `${
|
|
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: `${
|
|
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: `${
|
|
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: `${
|
|
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:
|
|
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: `${
|
|
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
|
|
4668
|
+
}, children: translate.t("confirm") }), jsx(Button, { onClick: () => {
|
|
4673
4669
|
setIsConfirming(false);
|
|
4674
|
-
}, variant: "subtle", children: cancel
|
|
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: [
|
|
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
|
|
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,
|
|
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(
|
|
4743
|
-
|
|
4744
|
-
|
|
4745
|
-
|
|
4746
|
-
|
|
4747
|
-
|
|
4748
|
-
|
|
4749
|
-
|
|
4750
|
-
|
|
4751
|
-
|
|
4752
|
-
|
|
4753
|
-
|
|
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 {
|
|
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;
|