mui-design-system 0.0.15 → 0.0.17
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/components/custom-mobile-date-picker/CustomMobileDatePicker.js +2 -5
- package/dist/components/index.d.ts +5 -0
- package/dist/components/index.js +3 -0
- package/dist/components/input-list/Form.d.ts +21 -0
- package/dist/components/input-list/Form.js +18 -0
- package/dist/components/input-list/UseFormInput.d.ts +2 -2
- package/dist/components/input-list/checkbox-list/CheckboxList.d.ts +19 -0
- package/dist/components/input-list/checkbox-list/CheckboxList.js +30 -0
- package/dist/components/input-list/components/UFAutoComplete.js +15 -26
- package/dist/components/input-list/components/UFCheckbox.d.ts +7 -7
- package/dist/components/input-list/components/UFCheckbox.js +14 -17
- package/dist/components/input-list/components/UFCurrency.d.ts +3 -3
- package/dist/components/input-list/components/UFCurrency.js +43 -46
- package/dist/components/input-list/components/UFDatePicker.js +7 -4
- package/dist/components/input-list/components/UFMultiCheckbox.d.ts +3 -3
- package/dist/components/input-list/components/UFMultiCheckbox.js +13 -9
- package/dist/components/input-list/components/UFMultiSelect.d.ts +3 -3
- package/dist/components/input-list/components/UFMultiSelect.js +41 -28
- package/dist/components/input-list/components/UFRadio.d.ts +5 -5
- package/dist/components/input-list/components/UFRadio.js +15 -12
- package/dist/components/input-list/components/UFSelect.d.ts +5 -5
- package/dist/components/input-list/components/UFSelect.js +17 -25
- package/dist/components/input-list/components/UFSwitch.js +2 -2
- package/dist/components/input-list/components/UFTextArea.js +5 -2
- package/dist/components/input-list/components/UFTextField.d.ts +5 -3
- package/dist/components/input-list/components/UFTextField.js +17 -40
- package/dist/components/input-list/components/UFUploader.d.ts +3 -3
- package/dist/components/input-list/components/UFUploader.js +18 -16
- package/dist/context/FormContext.d.ts +16 -0
- package/dist/context/FormContext.js +8 -0
- package/package.json +1 -1
|
@@ -35,7 +35,7 @@ const createDateObject = (date, lang) => {
|
|
|
35
35
|
}),
|
|
36
36
|
});
|
|
37
37
|
};
|
|
38
|
-
const MobileDatePicker = ({ form, name, defaultValue, label,
|
|
38
|
+
const MobileDatePicker = ({ form, name, defaultValue, label, rules, readonly, disabled, placeholder, error, itemProps, props, helperText, variant = 'outlined', withoutHelperText, inputLabelMode, }) => {
|
|
39
39
|
const lang = document.documentElement.lang;
|
|
40
40
|
const [open, setOpen] = useState(false);
|
|
41
41
|
const defaultValueDate = defaultValue
|
|
@@ -80,10 +80,7 @@ const MobileDatePicker = ({ form, name, defaultValue, label, sx, rules, readonly
|
|
|
80
80
|
form
|
|
81
81
|
.register(name, { ...rules })
|
|
82
82
|
.onBlur({ target: { current: selectedDate.toDate() } });
|
|
83
|
-
}, value: selectedDate?.format('YYYY/MM/DD'), defaultValue: selectedDate?.format('YYYY/MM/DD'), variant: variant, fullWidth: true, id: field?.name, error: !!error, onClick: !(disabled || readonly) && handleTextFieldClick, onTouchEnd: !(disabled || readonly) && handleTextFieldClick, placeholder: placeholder,
|
|
84
|
-
...(Array.isArray(sx) ? sx : [sx]),
|
|
85
|
-
{ userSelect: disabled || readonly ? 'none' : 'all' },
|
|
86
|
-
], helperText: getHelperText(), "aria-readonly": readonly, disabled: disabled, inputProps: { readOnly: readonly }, InputProps: {
|
|
83
|
+
}, value: selectedDate?.format('YYYY/MM/DD'), defaultValue: selectedDate?.format('YYYY/MM/DD'), variant: variant, fullWidth: true, id: field?.name, error: !!error, onClick: !(disabled || readonly) && handleTextFieldClick, onTouchEnd: !(disabled || readonly) && handleTextFieldClick, placeholder: placeholder, helperText: getHelperText(), "aria-readonly": readonly, disabled: disabled, inputProps: { readOnly: readonly }, InputProps: {
|
|
87
84
|
endAdornment: (_jsx(InputAdornment, { position: 'end', sx: {
|
|
88
85
|
'& .MuiInputAdornment-positionStart': {
|
|
89
86
|
marginTop: '0 important',
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
|
+
export { default as useTable } from './custom-table/components/useTable';
|
|
2
3
|
export declare const CustomTable: import("react").FC<import("./custom-table/CustomTable").ICustomTable & {
|
|
3
4
|
skeletonWidth?: string | number | undefined;
|
|
4
5
|
skeletonHeight?: string | number | undefined;
|
|
@@ -176,3 +177,7 @@ export declare const CustomStepper: import("react").FC<import("./custom-stepper/
|
|
|
176
177
|
skeletonWidth?: string | number | undefined;
|
|
177
178
|
skeletonHeight?: string | number | undefined;
|
|
178
179
|
}>;
|
|
180
|
+
export declare const Form: import("react").FC<import("./input-list/Form").FormProps & {
|
|
181
|
+
skeletonWidth?: string | number | undefined;
|
|
182
|
+
skeletonHeight?: string | number | undefined;
|
|
183
|
+
}>;
|
package/dist/components/index.js
CHANGED
|
@@ -32,6 +32,8 @@ import CustomPagination1Component from './custom-pagination/custom-pagination-1/
|
|
|
32
32
|
import CustomPagination2Component from './custom-pagination/custom-pagination-2/CustomPagination2';
|
|
33
33
|
import CustomStepperComponent from './custom-stepper/CustomStepper';
|
|
34
34
|
import withErrorBoundary from './error boundary/withErrorBoundary';
|
|
35
|
+
import FormComponent from './input-list/Form';
|
|
36
|
+
export { default as useTable } from './custom-table/components/useTable';
|
|
35
37
|
export const CustomTable = withErrorBoundary(CustomTableComponent);
|
|
36
38
|
export const UFUploader = withErrorBoundary(UFUploaderComponent);
|
|
37
39
|
export const CustomUploader = withErrorBoundary(CustomUploaderComponent);
|
|
@@ -65,3 +67,4 @@ export const OTPInput = withErrorBoundary(OTPInputComponent);
|
|
|
65
67
|
export const CustomPagination1 = withErrorBoundary(CustomPagination1Component);
|
|
66
68
|
export const CustomPagination2 = withErrorBoundary(CustomPagination2Component);
|
|
67
69
|
export const CustomStepper = withErrorBoundary(CustomStepperComponent);
|
|
70
|
+
export const Form = withErrorBoundary(FormComponent);
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { FC } from "react";
|
|
2
|
+
import { UseFormReturn } from "react-hook-form";
|
|
3
|
+
import { GridProps } from "@mui/material/Grid";
|
|
4
|
+
import { TypographyProps } from "@mui/material/Typography";
|
|
5
|
+
import { TFormSchema, TInputLabelMode } from "./type";
|
|
6
|
+
import { TextFieldProps } from "@mui/material/TextField";
|
|
7
|
+
export interface FormProps {
|
|
8
|
+
schema: TFormSchema;
|
|
9
|
+
form: UseFormReturn<any, any, any>;
|
|
10
|
+
gridContainerProps?: GridProps;
|
|
11
|
+
gridItemProps?: GridProps;
|
|
12
|
+
itemProps?: any;
|
|
13
|
+
labelsProps?: Partial<TypographyProps<"label", {}>> | undefined;
|
|
14
|
+
hideRequiredStar?: boolean;
|
|
15
|
+
inputLabelMode?: TInputLabelMode;
|
|
16
|
+
inputVariants?: TextFieldProps["variant"];
|
|
17
|
+
withoutHelperText?: boolean;
|
|
18
|
+
disabled?: boolean;
|
|
19
|
+
}
|
|
20
|
+
declare const Form: FC<FormProps>;
|
|
21
|
+
export default Form;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { isValidElement } from "react";
|
|
3
|
+
//------------------------------------------------------------------------
|
|
4
|
+
//@Mui
|
|
5
|
+
import Box from "@mui/material/Box";
|
|
6
|
+
import Grid from "@mui/material/Grid";
|
|
7
|
+
import Stack from "@mui/material/Stack";
|
|
8
|
+
import Typography from "@mui/material/Typography";
|
|
9
|
+
import UseFormInput from "./UseFormInput";
|
|
10
|
+
import { deepMerge, result } from "../../methods/general";
|
|
11
|
+
const Form = ({ schema, form, gridItemProps, gridContainerProps, labelsProps, itemProps, hideRequiredStar = false, inputLabelMode = "static", inputVariants = "outlined", withoutHelperText, disabled, }) => {
|
|
12
|
+
return (_jsx(Grid, { container: true, columnSpacing: 4, rowSpacing: 0, rowGap: 2, alignItems: "flex-start", ...gridContainerProps, children: schema?.map((inputProp) => (_jsxs(Grid, { item: true, xs: 4, width: "100%", height: "auto", position: "relative", ...deepMerge(gridItemProps, inputProp.gridItemProp), children: [inputLabelMode === "static" && inputProp.type !== "checkbox" && (_jsx(Box, { display: "flex", children: _jsx(Typography, { flexGrow: 1, width: 0, component: "label", display: "inline-block", mb: 2, htmlFor: inputProp.name, color: result(form?.formState?.errors, `${inputProp.name}`)
|
|
13
|
+
? "error"
|
|
14
|
+
: "text.16", noWrap: true, title: !isValidElement(inputProp?.label)
|
|
15
|
+
? inputProp?.label?.toString() || ""
|
|
16
|
+
: "", ...deepMerge(labelsProps, inputProp.labelProps), children: _jsxs(Stack, { direction: "row", children: [inputProp.label, inputProp.rules?.required && !hideRequiredStar && (_jsx(Typography, { component: "span", color: "error", fontSize: 12, children: "*" }))] }) }) })), _jsx(UseFormInput, { form: form, itemProps: itemProps, error: result(form?.formState?.errors, `${inputProp.name}`), inputLabelMode: inputLabelMode, inputVariants: inputVariants, withoutHelperText: withoutHelperText, disabled: disabled, ...inputProp })] }, inputProp.name))) }));
|
|
17
|
+
};
|
|
18
|
+
export default Form;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { FC } from 'react';
|
|
2
2
|
import { UseFormReturn } from 'react-hook-form';
|
|
3
|
-
import {
|
|
3
|
+
import { TSchema } from './type';
|
|
4
4
|
import { TextFieldProps } from '@mui/material/TextField';
|
|
5
|
-
type IUseFormInputProps =
|
|
5
|
+
type IUseFormInputProps = TSchema & {
|
|
6
6
|
form: UseFormReturn<any>;
|
|
7
7
|
error?: any;
|
|
8
8
|
inputVariants?: TextFieldProps['variant'];
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
import { CheckboxProps, StackProps } from '@mui/material';
|
|
3
|
+
import { FormControlLabelProps } from '@mui/material/FormControlLabel';
|
|
4
|
+
import { IFormOption } from '../type';
|
|
5
|
+
export interface ICheckboxValue {
|
|
6
|
+
label: string;
|
|
7
|
+
value: string | number;
|
|
8
|
+
}
|
|
9
|
+
export interface CheckboxListProps {
|
|
10
|
+
options: IFormOption[];
|
|
11
|
+
value?: ICheckboxValue[];
|
|
12
|
+
onChange: (values: ICheckboxValue[]) => void;
|
|
13
|
+
multiple?: boolean;
|
|
14
|
+
stackProps?: StackProps;
|
|
15
|
+
checkboxProps?: CheckboxProps;
|
|
16
|
+
formControlLabelProps?: Omit<FormControlLabelProps, 'label' | 'control'>;
|
|
17
|
+
}
|
|
18
|
+
declare const CheckboxList: FC<CheckboxListProps>;
|
|
19
|
+
export default CheckboxList;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { FormControlLabel, Stack, } from '@mui/material';
|
|
3
|
+
import Checkbox from '@mui/material/Checkbox';
|
|
4
|
+
const CheckboxList = ({ options = [], value = [], onChange, multiple, checkboxProps, stackProps, formControlLabelProps, }) => {
|
|
5
|
+
// console.log('values', values)
|
|
6
|
+
const handleChange = (event, changedValue) => {
|
|
7
|
+
const newValues = [...value];
|
|
8
|
+
if (multiple) {
|
|
9
|
+
if (event.target.checked) {
|
|
10
|
+
newValues.push(changedValue);
|
|
11
|
+
onChange(newValues);
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
const index = newValues.findIndex((v) => v.value === changedValue.value);
|
|
15
|
+
newValues.splice(index, 1);
|
|
16
|
+
onChange(newValues);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
if (event.target.checked) {
|
|
21
|
+
onChange([changedValue]);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
onChange([]);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
return (_jsx(Stack, { ...stackProps, children: options.map((option) => (_jsx(FormControlLabel, { control: _jsx(Checkbox, { ...checkboxProps, checked: value?.findIndex((v) => v.value === option.value) > -1, onChange: (e) => handleChange(e, option) }), label: option.label, slotProps: { typography: option?.labelProp }, ...formControlLabelProps }, option.value))) }));
|
|
29
|
+
};
|
|
30
|
+
export default CheckboxList;
|
|
@@ -1,20 +1,10 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { useRef, useMemo } from 'react';
|
|
3
2
|
import { Controller } from 'react-hook-form';
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
-
options?.forEach((option) => {
|
|
10
|
-
if (!cachedOptionsRef.current.find((opt) => opt.value === option?.value)
|
|
11
|
-
?.value) {
|
|
12
|
-
cachedOptionsRef.current.push(option);
|
|
13
|
-
}
|
|
14
|
-
});
|
|
15
|
-
return cachedOptionsRef.current;
|
|
16
|
-
}, [options?.length]);
|
|
17
|
-
//________________________________________________________________
|
|
3
|
+
import CustomAutoComplete from "../../custom-auto-complete/CustomAutoComplete";
|
|
4
|
+
import { deepMerge } from "../../../methods/general";
|
|
5
|
+
import { useFormContext } from "../../../context/FormContext";
|
|
6
|
+
const UFAutoComplete = ({ form, label, error, placeholder, rules, disabled, name, options, defaultValue, readonly, props, helperText, isLoading = false, inputLabelMode, variant, itemProps, onReachEnd }) => {
|
|
7
|
+
const { theme } = useFormContext();
|
|
18
8
|
// Convert defaultValue if it's an array of strings
|
|
19
9
|
const convertDefaultValue = (defaultValue, options) => {
|
|
20
10
|
// Check if options are undefined or null, return an empty array or default value
|
|
@@ -23,30 +13,29 @@ const UFAutoComplete = ({ form, label, error, placeholder, sx, rules, disabled,
|
|
|
23
13
|
}
|
|
24
14
|
// Convert value to corresponding object with label and value
|
|
25
15
|
if (Array.isArray(defaultValue)) {
|
|
26
|
-
return defaultValue
|
|
27
|
-
.
|
|
28
|
-
const matchedOption = options.find((option) => option.value === val);
|
|
16
|
+
return defaultValue.map(val => {
|
|
17
|
+
const matchedOption = options.find(option => option.value === val);
|
|
29
18
|
return matchedOption ? matchedOption : null;
|
|
30
|
-
})
|
|
31
|
-
.filter(Boolean);
|
|
19
|
+
}).filter(Boolean);
|
|
32
20
|
}
|
|
33
21
|
else {
|
|
34
|
-
const matchedOption = options.find(
|
|
22
|
+
const matchedOption = options.find(option => option.value === defaultValue);
|
|
35
23
|
return matchedOption ? matchedOption : null;
|
|
36
24
|
}
|
|
37
25
|
};
|
|
38
|
-
|
|
39
|
-
|
|
26
|
+
return (_jsx(Controller, { control: form?.control, name: name, rules: { ...rules }, defaultValue: convertDefaultValue(defaultValue, options), render: ({ field }) => (_jsx(CustomAutoComplete, { ...field, label: label, hideLabel: true, placeholder: typeof label === "string" ? label : placeholder, inputLabelMode: inputLabelMode, helperText: error?.message ?? helperText, options: options || [], selectedOptions: field.value, value: convertDefaultValue(field?.value, options), sx: { width: '100%' }, inputMaxHeight: '120px', limitTags: 2, validation: { isInvalid: !!error, message: error?.message }, disabled: disabled, id: name, readOnly: readonly, variant: variant, isLoading: isLoading, isOptionEqualToValue: (option, value) => {
|
|
27
|
+
return option?.value === value?.value;
|
|
28
|
+
}, onReachEnd: onReachEnd, onChange: (_, newValue) => {
|
|
40
29
|
const isMultiple = Array.isArray(newValue);
|
|
41
30
|
if (isMultiple) {
|
|
42
31
|
// Handle multiple selection
|
|
43
|
-
const valuesArray = newValue.map(
|
|
32
|
+
const valuesArray = newValue.map(item => item.value);
|
|
44
33
|
field.onChange(valuesArray);
|
|
45
34
|
}
|
|
46
35
|
else {
|
|
47
36
|
// Handle single selection
|
|
48
|
-
field.onChange(newValue ? newValue.value :
|
|
37
|
+
field.onChange(newValue ? newValue.value : "");
|
|
49
38
|
}
|
|
50
|
-
}, ...
|
|
39
|
+
}, ...deepMerge(theme?.autoComplete?.autoCompleteProps, itemProps, props) })) }));
|
|
51
40
|
};
|
|
52
41
|
export default UFAutoComplete;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { FC } from
|
|
2
|
-
import { ICheckboxForm } from
|
|
3
|
-
import { CheckboxProps } from
|
|
4
|
-
import { UseFormReturn } from
|
|
5
|
-
import { SwitchBaseProps } from
|
|
6
|
-
import { TypographyProps } from
|
|
1
|
+
import { FC } from "react";
|
|
2
|
+
import { ICheckboxForm } from "../type";
|
|
3
|
+
import { CheckboxProps } from "@mui/material";
|
|
4
|
+
import { UseFormReturn } from "react-hook-form";
|
|
5
|
+
import { SwitchBaseProps } from "@mui/material/internal/SwitchBase";
|
|
6
|
+
import { TypographyProps } from "@mui/material/Typography";
|
|
7
7
|
export interface ICustomCheckboxProps {
|
|
8
|
-
inputProps: SwitchBaseProps[
|
|
8
|
+
inputProps: SwitchBaseProps["inputProps"];
|
|
9
9
|
slotProps: {
|
|
10
10
|
typography?: TypographyProps;
|
|
11
11
|
};
|
|
@@ -1,24 +1,21 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import Checkbox from
|
|
3
|
-
import FormControl from
|
|
4
|
-
import { Controller } from
|
|
5
|
-
import FormControlLabel from
|
|
6
|
-
import Typography from
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
2
|
+
import Checkbox from "@mui/material/Checkbox";
|
|
3
|
+
import FormControl from "@mui/material/FormControl";
|
|
4
|
+
import { Controller } from "react-hook-form";
|
|
5
|
+
import FormControlLabel from "@mui/material/FormControlLabel";
|
|
6
|
+
import Typography from "@mui/material/Typography";
|
|
7
|
+
import { useFormContext } from "../../../context/FormContext";
|
|
8
|
+
import { deepMerge } from "../../../methods/general";
|
|
9
|
+
const UFCheckbox = ({ form, name, label, rules, error, helperText, withoutHelperText, props, disabled, itemProps, formControlLabelProps, }) => {
|
|
10
|
+
const { theme } = useFormContext();
|
|
11
|
+
return (_jsx(Controller, { control: form?.control, name: name, rules: { ...rules }, render: ({ field: { onChange, name, value = false } }) => (_jsxs(FormControl, { sx: { display: "flex", ...(disabled && { filter: "contrast(0.3)" }) }, children: [_jsx(FormControlLabel, { slotProps: {
|
|
12
12
|
typography: {
|
|
13
|
-
variant: 'caption3',
|
|
14
13
|
...props?.slotProps?.typography,
|
|
15
14
|
},
|
|
16
|
-
}, control: _jsx(Checkbox, { color:
|
|
17
|
-
onChange: onChange,
|
|
18
|
-
}), disabled: disabled, name: name, inputProps: props?.inputProps, ...props?.checkBoxProps }), label: label }), !withoutHelperText && (_jsx(Typography, { variant: 'caption3', sx: {
|
|
15
|
+
}, control: _jsx(Checkbox, { color: "primary", checked: value, onChange: onChange, disabled: disabled, name: name, ...deepMerge(theme?.checkbox?.checkboxProps, itemProps, props) }), label: label, ...deepMerge(theme?.checkbox?.formControlLabelProps, formControlLabelProps) }), !withoutHelperText && (_jsx(Typography, { sx: {
|
|
19
16
|
height: 23,
|
|
20
|
-
width:
|
|
21
|
-
color: error ?
|
|
22
|
-
}, children: error?.message ?? helperText ??
|
|
17
|
+
width: "max-content",
|
|
18
|
+
color: error ? "error.4" : "text.primary",
|
|
19
|
+
}, children: error?.message ?? helperText ?? " " }))] })) }));
|
|
23
20
|
};
|
|
24
21
|
export default UFCheckbox;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { FC } from
|
|
2
|
-
import { UseFormReturn } from
|
|
3
|
-
import { ICurrencyForm } from
|
|
1
|
+
import { FC } from "react";
|
|
2
|
+
import { UseFormReturn } from "react-hook-form";
|
|
3
|
+
import { ICurrencyForm } from "../type";
|
|
4
4
|
type Props = ICurrencyForm & {
|
|
5
5
|
form: UseFormReturn<any>;
|
|
6
6
|
error: any;
|
|
@@ -1,50 +1,47 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { Controller } from
|
|
3
|
-
import CustomNumericInput from
|
|
4
|
-
import { useTheme } from
|
|
5
|
-
import Typography from
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
currencyIcon = _jsx(Typography, { children: "\u062A\u0648\u0645\u0627\u0646" }), inputLabelMode, label, }) => {
|
|
2
|
+
import { Controller } from "react-hook-form";
|
|
3
|
+
import CustomNumericInput from "../../custom-input/CustomNumericInput";
|
|
4
|
+
import { useTheme } from "@mui/material";
|
|
5
|
+
import Typography from "@mui/material/Typography";
|
|
6
|
+
import { useFormContext } from "../../../context/FormContext";
|
|
7
|
+
import { deepMerge } from "../../../methods/general";
|
|
8
|
+
const UfCurrency = ({ form, name, defaultValue, rules, readonly, disabled, placeholder, error, itemProps, props, helperText, withoutHelperText, variant, currencyIcon = _jsx(Typography, { children: "\u062A\u0648\u0645\u0627\u0646" }), inputLabelMode, label, }) => {
|
|
9
|
+
const { theme } = useFormContext();
|
|
9
10
|
const { direction } = useTheme();
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
: {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
...itemProps?.InputProps,
|
|
46
|
-
...props?.InputProps,
|
|
47
|
-
} }));
|
|
48
|
-
} }));
|
|
11
|
+
const currencyMergedProps = deepMerge(theme?.currency?.currencyProps, itemProps, props);
|
|
12
|
+
return (_jsx(Controller, { control: form?.control, name: name, rules: { ...rules }, defaultValue: defaultValue, render: ({ field: { onChange, name, value, onBlur } }) => (_jsx(CustomNumericInput, { value: value, onChange: (value) => {
|
|
13
|
+
onChange({
|
|
14
|
+
target: { value: value },
|
|
15
|
+
});
|
|
16
|
+
}, onBlur: onBlur, fullWidth: true, id: name, error: !!error, placeholder: placeholder, disabled: disabled, variant: variant, ...(inputLabelMode === "static" && { hiddenLabel: true }), ...(inputLabelMode === "relative" && { label: label }), helperText: withoutHelperText ? undefined : error?.message ?? helperText ?? " ", "aria-readonly": readonly, inputProps: { readOnly: readonly }, ...currencyMergedProps, sx: {
|
|
17
|
+
".MuiInputBase-root": {
|
|
18
|
+
px: (theme) => theme.spacing(2),
|
|
19
|
+
},
|
|
20
|
+
...(direction === "rtl"
|
|
21
|
+
? {
|
|
22
|
+
".MuiFilledInput-input": {
|
|
23
|
+
py: "16px !important",
|
|
24
|
+
textAlign: "right !important",
|
|
25
|
+
pr: "3px !important",
|
|
26
|
+
},
|
|
27
|
+
}
|
|
28
|
+
: {
|
|
29
|
+
".MuiFilledInput-input": {
|
|
30
|
+
pl: "3px !important",
|
|
31
|
+
},
|
|
32
|
+
}),
|
|
33
|
+
backgroundColor: readonly ? "background.paper" : "unset",
|
|
34
|
+
borderRadius: "8px",
|
|
35
|
+
pointerEvents: readonly ? "none" : "unset",
|
|
36
|
+
"& .MuiOutlinedInput-input": {
|
|
37
|
+
backgroundColor: readonly ? "background.paper" : "unset",
|
|
38
|
+
color: readonly ? "text.secondary" : "unset",
|
|
39
|
+
},
|
|
40
|
+
...currencyMergedProps.sx
|
|
41
|
+
}, InputProps: {
|
|
42
|
+
sx: { gap: 2 },
|
|
43
|
+
endAdornment: props?.currencyIcon ?? currencyIcon,
|
|
44
|
+
...currencyMergedProps.InputProps
|
|
45
|
+
} })) }));
|
|
49
46
|
};
|
|
50
47
|
export default UfCurrency;
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { Controller } from 'react-hook-form';
|
|
3
|
-
import
|
|
4
|
-
|
|
3
|
+
import CustomDatePicker from "../../custom-date-picker/CustomDatePicker";
|
|
4
|
+
import { useFormContext } from "../../../context/FormContext";
|
|
5
|
+
import { deepMerge } from "../../../methods/general";
|
|
6
|
+
const UFDatePicker = ({ form, rules, disabled, defaultValue, name, label, error, withoutHelperText, variant, inputLabelMode = 'static', props, itemProps, readonly }) => {
|
|
7
|
+
const { theme } = useFormContext();
|
|
5
8
|
return (
|
|
6
9
|
//ToDo date picker issue on grid should be resolved
|
|
7
10
|
_jsx(Controller, { control: form?.control, name: name, rules: { ...rules }, defaultValue: defaultValue, render: ({ field: { onChange, name, value } }) => (_jsx(_Fragment, { children: _jsx(CustomDatePicker, { readOnly: readonly, textFieldProps: {
|
|
8
11
|
id: name,
|
|
9
12
|
variant: variant,
|
|
10
13
|
...itemProps,
|
|
11
|
-
sx: { width: '100%'
|
|
12
|
-
}, error: error, disabled: disabled, value: value, onChange: onChange, inputLabelMode: inputLabelMode, withoutHelperText: withoutHelperText, label: label, ...props }) })) }));
|
|
14
|
+
sx: { width: '100%' },
|
|
15
|
+
}, error: error, disabled: disabled, value: value, onChange: onChange, inputLabelMode: inputLabelMode, withoutHelperText: withoutHelperText, label: label, ...deepMerge(theme?.datePicker?.datePickerProps, props) }) })) }));
|
|
13
16
|
};
|
|
14
17
|
export default UFDatePicker;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { FC } from
|
|
2
|
-
import { UseFormReturn } from
|
|
3
|
-
import { IMultiCheckboxForm } from
|
|
1
|
+
import { FC } from "react";
|
|
2
|
+
import { UseFormReturn } from "react-hook-form";
|
|
3
|
+
import { IMultiCheckboxForm } from "../type";
|
|
4
4
|
type UFMultiCheckboxProps = IMultiCheckboxForm & {
|
|
5
5
|
form: UseFormReturn<any>;
|
|
6
6
|
error: any;
|
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import FormControl from
|
|
3
|
-
import Typography from
|
|
4
|
-
import { Controller } from
|
|
5
|
-
import CheckboxList from
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
import FormControl from "@mui/material/FormControl";
|
|
3
|
+
import Typography from "@mui/material/Typography";
|
|
4
|
+
import { Controller } from "react-hook-form";
|
|
5
|
+
import CheckboxList from "../checkbox-list/CheckboxList";
|
|
6
|
+
import { useFormContext } from "../../../context/FormContext";
|
|
7
|
+
import { deepMerge } from "../../../methods/general";
|
|
8
|
+
const UFMultiCheckbox = ({ form, error, rules, disabled, withoutHelperText, helperText, name, options, multiple, props, itemProps, }) => {
|
|
9
|
+
const { theme } = useFormContext();
|
|
10
|
+
const multiCheckboxMergedProps = deepMerge(theme?.multiCheckbox?.multiCheckboxProps, itemProps, props);
|
|
11
|
+
return (_jsx(Controller, { control: form?.control, name: name, rules: { ...rules }, render: ({ field }) => (_jsxs(FormControl, { sx: { display: "flex", ...(disabled && { filter: "contrast(0.3)" }) }, children: [_jsx(CheckboxList, { multiple: multiple, options: options, ...field, ...multiCheckboxMergedProps }), !withoutHelperText && (_jsx(Typography, { sx: {
|
|
8
12
|
height: 23,
|
|
9
|
-
width:
|
|
10
|
-
color: error ?
|
|
11
|
-
}, children: error?.message ?? helperText ??
|
|
13
|
+
width: "max-content",
|
|
14
|
+
color: error ? "error.4" : "text.primary",
|
|
15
|
+
}, children: error?.message ?? helperText ?? " " }))] })) }));
|
|
12
16
|
};
|
|
13
17
|
export default UFMultiCheckbox;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { FC } from
|
|
2
|
-
import { UseFormReturn } from
|
|
3
|
-
import { IMultiSelectForm } from
|
|
1
|
+
import { FC } from "react";
|
|
2
|
+
import { UseFormReturn } from "react-hook-form";
|
|
3
|
+
import { IMultiSelectForm } from "../type";
|
|
4
4
|
type Props = IMultiSelectForm & {
|
|
5
5
|
form: UseFormReturn<any>;
|
|
6
6
|
error: any;
|
|
@@ -1,43 +1,56 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
2
3
|
//@3rd Party
|
|
3
|
-
import { Controller } from
|
|
4
|
+
import { Controller } from "react-hook-form";
|
|
4
5
|
//----------------------------------------------------------------------------------
|
|
5
6
|
//@Mui
|
|
6
|
-
import Stack from
|
|
7
|
-
import MenuItem from
|
|
8
|
-
import InputLabel from
|
|
9
|
-
import ListItemText from
|
|
10
|
-
import FormControl from
|
|
11
|
-
import Typography from
|
|
12
|
-
import TextField from
|
|
13
|
-
|
|
7
|
+
import Stack from "@mui/material/Stack";
|
|
8
|
+
import MenuItem from "@mui/material/MenuItem";
|
|
9
|
+
import InputLabel from "@mui/material/InputLabel";
|
|
10
|
+
import ListItemText from "@mui/material/ListItemText";
|
|
11
|
+
import FormControl from "@mui/material/FormControl";
|
|
12
|
+
import Typography from "@mui/material/Typography";
|
|
13
|
+
import TextField from "@mui/material/TextField";
|
|
14
|
+
import { useFormContext } from "../../../context/FormContext";
|
|
15
|
+
import { deepMerge } from "../../../methods/general";
|
|
16
|
+
const UFMultiSelect = ({ form, error, placeholder, rules, disabled, name, options, defaultValue, readonly, props, itemProps, helperText, variant = "outlined", withoutHelperText, inputLabelMode, label, }) => {
|
|
17
|
+
const { theme } = useFormContext();
|
|
18
|
+
const [optionValues, setOptionValues] = useState([]);
|
|
14
19
|
const selectedItems = (value) => options?.find((option) => option?.value === value)?.label;
|
|
15
|
-
return (_jsx(Controller, { control: form?.control, name: name, rules: { ...rules }, render: ({ field }) => (_jsx(_Fragment, { children: _jsxs(FormControl, { fullWidth: true, children: [placeholder && (_jsx(InputLabel, { id:
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
opacity:
|
|
20
|
+
return (_jsx(Controller, { control: form?.control, name: name, rules: { ...rules }, defaultValue: defaultValue, render: ({ field }) => (_jsx(_Fragment, { children: _jsxs(FormControl, { fullWidth: true, children: [placeholder && (_jsx(InputLabel, { id: "simple-select-label", sx: {
|
|
21
|
+
"&.MuiInputLabel-root[data-shrink=true]": { opacity: "0%" },
|
|
22
|
+
"&.MuiInputLabel-root[data-shrink=false]": {
|
|
23
|
+
opacity: "100%",
|
|
19
24
|
},
|
|
20
|
-
}, children: placeholder })), _jsx(TextField, { select: true, ...(inputLabelMode ===
|
|
25
|
+
}, children: placeholder })), _jsx(TextField, { select: true, ...(inputLabelMode === "static" && { hiddenLabel: true }), ...(inputLabelMode === "relative" && { label: label }), ...field, fullWidth: true, value: optionValues, id: name, disabled: disabled, defaultValue: defaultValue, variant: variant, error: !!error, SelectProps: {
|
|
21
26
|
multiple: true,
|
|
22
|
-
|
|
23
|
-
renderValue: (selected) => (_jsx(Stack, { gap: 1, height:
|
|
27
|
+
value: optionValues,
|
|
28
|
+
renderValue: (selected) => (_jsx(Stack, { gap: 1, height: "100%", alignItems: "center", direction: "row", flexWrap: "wrap", sx: {
|
|
29
|
+
...(optionValues.includes(selected) && {
|
|
30
|
+
backgroundColor: "background.main",
|
|
31
|
+
}),
|
|
32
|
+
}, children: _jsx(Typography, { children: selected
|
|
24
33
|
.map((value) => selectedItems(value))
|
|
25
|
-
.join(
|
|
34
|
+
.join(",") }) })),
|
|
26
35
|
}, inputProps: { readOnly: readonly }, helperText: withoutHelperText
|
|
27
36
|
? undefined
|
|
28
|
-
: error?.message ?? helperText ??
|
|
29
|
-
|
|
37
|
+
: error?.message ?? helperText ?? " ", sx: {
|
|
38
|
+
".MuiInputBase-root": {
|
|
30
39
|
paddingRight: (theme) => theme.spacing(2),
|
|
31
40
|
},
|
|
32
|
-
...sx,
|
|
33
|
-
pointerEvents: readonly ?
|
|
34
|
-
backgroundColor: readonly ?
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
},
|
|
39
|
-
}, ...
|
|
40
|
-
return (_jsx(MenuItem, { value: value, id: label, sx: { transition:
|
|
41
|
+
// ...sx,
|
|
42
|
+
// pointerEvents: readonly ? "none" : "unset",
|
|
43
|
+
// backgroundColor: readonly ? "background.paper" : "unset",
|
|
44
|
+
// "& .MuiOutlinedInput-input.MuiSelect-select": {
|
|
45
|
+
// backgroundColor: readonly ? "background.paper" : "unset",
|
|
46
|
+
// color: readonly ? "text.5" : "unset",
|
|
47
|
+
// },
|
|
48
|
+
}, ...deepMerge(theme?.multiSelect?.multiSelectProps, itemProps, props), children: options?.map(({ label, value }) => {
|
|
49
|
+
return (_jsx(MenuItem, { value: value, id: label, sx: { transition: "all 0.2s" }, onClick: () => {
|
|
50
|
+
!optionValues.includes(value)
|
|
51
|
+
? setOptionValues([value, ...optionValues])
|
|
52
|
+
: setOptionValues(optionValues.filter((optionValue) => optionValue !== value));
|
|
53
|
+
}, children: _jsx(ListItemText, { primary: label, color: "red", sx: { flex: "none", mx: "4px" }, disableTypography: true }) }, value));
|
|
41
54
|
}) })] }) })) }));
|
|
42
55
|
};
|
|
43
56
|
export default UFMultiSelect;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { FC } from
|
|
2
|
-
import { IRadioForm } from
|
|
3
|
-
import { UseFormReturn } from
|
|
4
|
-
type
|
|
1
|
+
import { FC } from "react";
|
|
2
|
+
import { IRadioForm } from "../type";
|
|
3
|
+
import { UseFormReturn } from "react-hook-form";
|
|
4
|
+
type TRadioProps = IRadioForm & {
|
|
5
5
|
form: UseFormReturn<any>;
|
|
6
6
|
error: any;
|
|
7
7
|
};
|
|
8
|
-
declare const UFRadio: FC<
|
|
8
|
+
declare const UFRadio: FC<TRadioProps>;
|
|
9
9
|
export default UFRadio;
|
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Controller } from
|
|
3
|
-
import FormControlLabel from
|
|
4
|
-
import FormControl from
|
|
5
|
-
import Typography from
|
|
6
|
-
import RadioGroup from
|
|
7
|
-
import Radio from
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
2
|
+
import { Controller } from "react-hook-form";
|
|
3
|
+
import FormControlLabel from "@mui/material/FormControlLabel";
|
|
4
|
+
import FormControl from "@mui/material/FormControl";
|
|
5
|
+
import Typography from "@mui/material/Typography";
|
|
6
|
+
import RadioGroup from "@mui/material/RadioGroup";
|
|
7
|
+
import Radio from "@mui/material/Radio";
|
|
8
|
+
import { useFormContext } from "../../../context/FormContext";
|
|
9
|
+
import { deepMerge } from "../../../methods/general";
|
|
10
|
+
const UFRadio = ({ form, name, rules, disabled, defaultValue, options, error, helperText, withoutHelperText, label, labelProps, inputLabelMode, formControlLabelProps, radioProps, itemProps, radioGroupProps }) => {
|
|
11
|
+
const { theme } = useFormContext();
|
|
12
|
+
return (_jsx(Controller, { control: form?.control, name: name, rules: { ...rules }, defaultValue: defaultValue, render: ({ field: { onChange, value } }) => (_jsxs(FormControl, { sx: { display: "block" }, children: [inputLabelMode === "relative" && (_jsx(Typography, { ...labelProps, children: label })), _jsx(RadioGroup, { row: true, "aria-labelledby": "demo-row-radio-buttons-group-label", name: "row-radio-buttons-group", onChange: onChange, value: value, sx: { gap: 5 }, ...deepMerge(theme?.radio?.radioGroupProps, radioGroupProps), children: options?.map((option) => (_jsx(FormControlLabel, { disabled: disabled, value: option.value, control: _jsx(Radio, { ...deepMerge(theme?.radio?.radioProps, itemProps, radioProps), checked: value === option.value }), label: _jsx(Typography, { fontWeight: 400, fontSize: 12, ...option.labelProp, children: option.label }), ...deepMerge(theme?.radio?.formControlLabelProps, formControlLabelProps) }, option.value))) }), !withoutHelperText && (_jsx(Typography, { sx: {
|
|
13
|
+
display: "block",
|
|
11
14
|
height: 23,
|
|
12
|
-
width:
|
|
13
|
-
color: error ?
|
|
14
|
-
}, children: error?.message ?? helperText ??
|
|
15
|
+
width: "max-content",
|
|
16
|
+
color: error ? "error.4" : "text.primary",
|
|
17
|
+
}, children: error?.message ?? helperText ?? " " }))] })) }));
|
|
15
18
|
};
|
|
16
19
|
export default UFRadio;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { FC } from
|
|
2
|
-
import { UseFormReturn } from
|
|
3
|
-
import { ISelectForm } from
|
|
4
|
-
type
|
|
1
|
+
import { FC } from "react";
|
|
2
|
+
import { UseFormReturn } from "react-hook-form";
|
|
3
|
+
import { ISelectForm } from "../type";
|
|
4
|
+
type TSelectProps = ISelectForm & {
|
|
5
5
|
form: UseFormReturn<any>;
|
|
6
6
|
error: any;
|
|
7
7
|
};
|
|
8
|
-
declare const UFSelect: FC<
|
|
8
|
+
declare const UFSelect: FC<TSelectProps>;
|
|
9
9
|
export default UFSelect;
|
|
@@ -1,27 +1,19 @@
|
|
|
1
|
-
import { jsx as _jsx,
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
},
|
|
17
|
-
|
|
18
|
-
}, select: true, ...field, error: !!error, value: field.value, id: name, fullWidth: true, ...(inputLabelMode === 'static' && { hiddenLabel: true }), ...(inputLabelMode === 'relative' && { label: label }), disabled: disabled, defaultValue: defaultValue, variant: variant, placeholder: 'saasdlasd', helperText: withoutHelperText
|
|
19
|
-
? undefined
|
|
20
|
-
: error?.message ?? helperText ?? ' ', onClick: () => setOpen((prev) => !prev), InputProps: { readOnly: readonly }, sx: {
|
|
21
|
-
'.MuiInputBase-root': {
|
|
22
|
-
paddingRight: (theme) => theme.spacing(2),
|
|
23
|
-
},
|
|
24
|
-
...sx,
|
|
25
|
-
}, ...itemProps, ...props, children: options?.map((option) => (_jsx(MenuItem, { value: option.value, id: option.value, children: option.label }, option.value))) })] }) })) }));
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import FormControl from "@mui/material/FormControl";
|
|
3
|
+
import { TextField } from "@mui/material";
|
|
4
|
+
import MenuItem from "@mui/material/MenuItem";
|
|
5
|
+
import { Controller } from "react-hook-form";
|
|
6
|
+
import { useFormContext } from "../../../context/FormContext";
|
|
7
|
+
import { deepMerge } from "../../../methods/general";
|
|
8
|
+
const UFSelect = ({ form, error, rules, disabled, name, options, defaultValue = "", readonly, props, itemProps, helperText, variant = "outlined", withoutHelperText, inputLabelMode, label, }) => {
|
|
9
|
+
const { theme } = useFormContext() || {};
|
|
10
|
+
return (_jsx(Controller, { control: form?.control, name: name, rules: { ...rules }, defaultValue: defaultValue, render: ({ field }) => (_jsx(_Fragment, { children: _jsx(FormControl, { fullWidth: true, variant: variant, children: _jsx(TextField, { select: true, ...field, error: !!error, value: field.value, id: name, fullWidth: true, ...inputLabelMode === "static" && { hiddenLabel: true }, ...inputLabelMode === "relative" && { label: label }, disabled: disabled, defaultValue: defaultValue, variant: variant, helperText: withoutHelperText
|
|
11
|
+
? undefined
|
|
12
|
+
: error?.message ?? helperText ?? " ", InputProps: { readOnly: readonly
|
|
13
|
+
}, sx: {
|
|
14
|
+
".MuiInputBase-root": {
|
|
15
|
+
paddingRight: (theme) => theme.spacing(2),
|
|
16
|
+
},
|
|
17
|
+
}, ...deepMerge(theme?.select?.selectProps, itemProps, props), children: options?.map((option) => (_jsx(MenuItem, { value: option.value, id: option.value, children: option.label }, option.value))) }) }) })) }));
|
|
26
18
|
};
|
|
27
19
|
export default UFSelect;
|
|
@@ -4,11 +4,11 @@ import { Controller } from 'react-hook-form';
|
|
|
4
4
|
import FormControl from '@mui/material/FormControl';
|
|
5
5
|
import FormControlLabel from '@mui/material/FormControlLabel';
|
|
6
6
|
import Typography from '@mui/material/Typography';
|
|
7
|
-
const UFSwitch = ({ form, name, label, rules, disabled,
|
|
7
|
+
const UFSwitch = ({ form, name, label, rules, disabled, error, defaultValue, helperText, withoutHelperText, props, }) => {
|
|
8
8
|
return (_jsx(Controller, { control: form?.control, name: name, rules: { ...rules }, defaultValue: defaultValue, render: ({ field: { onChange, name, value = false } }) => (_jsxs(FormControl, { sx: {
|
|
9
9
|
display: 'flex',
|
|
10
10
|
...(disabled && { filter: 'contrast(0.3)' }),
|
|
11
|
-
}, children: [_jsx(FormControlLabel, {
|
|
11
|
+
}, children: [_jsx(FormControlLabel, { slotProps: {
|
|
12
12
|
typography: {
|
|
13
13
|
variant: 'caption3',
|
|
14
14
|
...props?.slotProps?.typography,
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { Controller } from 'react-hook-form';
|
|
3
3
|
import TextField from '@mui/material/TextField';
|
|
4
|
-
|
|
4
|
+
import { useFormContext } from "../../../context/FormContext";
|
|
5
|
+
import { deepMerge } from "../../../methods/general";
|
|
6
|
+
const UFTextArea = ({ form, name, type, defaultValue, rules, readonly, disabled, placeholder, error, props, helperText, variant = 'outlined', withoutHelperText, inputLabelMode, label, }) => {
|
|
7
|
+
const { theme } = useFormContext() || {};
|
|
5
8
|
return (_jsx(Controller, { control: form?.control, name: name, rules: { ...rules }, defaultValue: defaultValue || '', render: ({ field: { name, value } }) => (_jsx(TextField, { ...form?.register(name, {
|
|
6
9
|
...rules,
|
|
7
|
-
}), type: type, value: value, ...(inputLabelMode === 'static' && { hiddenLabel: true }), ...(inputLabelMode === 'relative' && { label: label }), fullWidth: true, multiline: true, rows: 3, id: name, error: !!error, placeholder: placeholder, helperText: withoutHelperText ? undefined : error?.message ?? helperText ?? ' ',
|
|
10
|
+
}), type: type, value: value, ...(inputLabelMode === 'static' && { hiddenLabel: true }), ...(inputLabelMode === 'relative' && { label: label }), fullWidth: true, multiline: true, rows: 3, id: name, error: !!error, placeholder: placeholder, helperText: withoutHelperText ? undefined : error?.message ?? helperText ?? ' ', "aria-readonly": readonly, disabled: disabled, variant: variant, inputProps: { readOnly: readonly }, ...deepMerge(theme?.textArea?.textAreaProps, props) })) }));
|
|
8
11
|
};
|
|
9
12
|
export default UFTextArea;
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { FC } from
|
|
2
|
-
import { UseFormReturn } from
|
|
3
|
-
import { ITextFieldForm } from
|
|
1
|
+
import { FC } from "react";
|
|
2
|
+
import { UseFormReturn } from "react-hook-form";
|
|
3
|
+
import { ITextFieldForm } from "../type";
|
|
4
4
|
type Props = ITextFieldForm & {
|
|
5
5
|
form: UseFormReturn<any>;
|
|
6
6
|
error: any;
|
|
7
7
|
};
|
|
8
|
+
export declare const p2e: (s: string) => boolean;
|
|
9
|
+
export declare const checkIfNumber: (value: string) => boolean;
|
|
8
10
|
declare const UFTextField: FC<Props>;
|
|
9
11
|
export default UFTextField;
|
|
@@ -1,52 +1,29 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const
|
|
2
|
+
import { Controller } from "react-hook-form";
|
|
3
|
+
import TextField from "@mui/material/TextField";
|
|
4
|
+
import { useFormContext } from '../../../context/FormContext';
|
|
5
|
+
import { deepMerge } from '../../../methods/general';
|
|
6
|
+
export const p2e = (s) => /^[0-9 | \u06F0-\u06F9\s][.\d | \u06F0-\u06F9\s]*(,\d+)?$/g.test(s);
|
|
7
|
+
export const checkIfNumber = (value) => {
|
|
8
|
+
const charLength = value.length;
|
|
9
|
+
return !charLength || p2e(value);
|
|
10
|
+
};
|
|
11
|
+
const UFTextField = ({ form, name, type = 'text', defaultValue, label, rules, readonly, disabled, placeholder, error, itemProps, props, helperText, variant = "outlined", withoutHelperText, inputLabelMode, }) => {
|
|
12
|
+
const { theme } = useFormContext();
|
|
13
|
+
const themeProp = theme?.[type];
|
|
14
|
+
const textFieldMergedProps = deepMerge(themeProp, itemProps, props);
|
|
9
15
|
const handleKeyDown = (e, onChange) => {
|
|
10
16
|
const value = e?.target?.value;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const emailTypeValidation = type === 'email' && !checkFirstLetter && !/^[a-zA-Z0-9.@-]*$/.test(value);
|
|
14
|
-
if (numberTypeValidation || emailTypeValidation) {
|
|
17
|
+
if (type === "number" &&
|
|
18
|
+
!checkIfNumber(value)) {
|
|
15
19
|
e.preventDefault();
|
|
16
20
|
}
|
|
17
21
|
else {
|
|
18
22
|
onChange(value);
|
|
19
23
|
}
|
|
20
24
|
};
|
|
21
|
-
|
|
22
|
-
const toggleInputMode = () => {
|
|
23
|
-
if (inputType === 'password') {
|
|
24
|
-
setInputType('text');
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
setInputType('password');
|
|
28
|
-
}
|
|
29
|
-
};
|
|
30
|
-
return (_jsx(Controller, { control: form?.control, name: name, rules: { ...rules }, defaultValue: defaultValue || '', render: ({ field }) => (_jsx(TextField, { ...form?.register(name, {
|
|
25
|
+
return (_jsx(Controller, { control: form?.control, name: name, rules: { ...rules }, defaultValue: defaultValue || "", render: ({ field }) => (_jsx(TextField, { ...form?.register(name, {
|
|
31
26
|
...rules,
|
|
32
|
-
}), ...(inputLabelMode ===
|
|
33
|
-
InputProps: {
|
|
34
|
-
sx: {
|
|
35
|
-
input: {
|
|
36
|
-
direction: (theme) => theme.direction === 'rtl'
|
|
37
|
-
? 'rtl !important'
|
|
38
|
-
: 'ltr !important',
|
|
39
|
-
// textAlign: (theme) =>
|
|
40
|
-
// theme.direction === 'rtl'
|
|
41
|
-
// ? 'right !important'
|
|
42
|
-
// : 'left !important',
|
|
43
|
-
},
|
|
44
|
-
},
|
|
45
|
-
},
|
|
46
|
-
}), ...(type === 'password' && {
|
|
47
|
-
InputProps: {
|
|
48
|
-
endAdornment: (_jsx(IconButton, { onClick: toggleInputMode, sx: { mr: -2 }, children: inputType === 'password' ? (_jsx(SvgEye, { primarycolor: 'inherit' })) : (_jsx(SvgEyeSlash, { primarycolor: 'inherit' })) })),
|
|
49
|
-
},
|
|
50
|
-
}), "aria-readonly": readonly, disabled: disabled, inputProps: { readOnly: readonly }, ...itemProps, ...props })) }));
|
|
27
|
+
}), ...(inputLabelMode === "static" && { hiddenLabel: true }), ...(inputLabelMode === "relative" && { label: label }), value: field.value, variant: variant, type: type === "number" ? "text" : type, fullWidth: true, id: name, error: !!error, placeholder: placeholder, onChange: (e) => handleKeyDown(e, field.onChange), helperText: withoutHelperText ? undefined : error?.message ?? helperText ?? " ", "aria-readonly": readonly, disabled: disabled, inputProps: { readOnly: readonly }, ...textFieldMergedProps })) }));
|
|
51
28
|
};
|
|
52
29
|
export default UFTextField;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { FC } from
|
|
2
|
-
import { IUploaderForm } from
|
|
3
|
-
import { UseFormReturn } from
|
|
1
|
+
import { FC } from "react";
|
|
2
|
+
import { IUploaderForm } from "../type";
|
|
3
|
+
import { UseFormReturn } from "react-hook-form";
|
|
4
4
|
type UFUploaderProps = IUploaderForm & {
|
|
5
5
|
form: UseFormReturn<any>;
|
|
6
6
|
error: any;
|
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Controller } from
|
|
3
|
-
import FormControl from
|
|
4
|
-
import Typography from
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
|
|
8
|
-
|
|
2
|
+
import { Controller } from "react-hook-form";
|
|
3
|
+
import FormControl from "@mui/material/FormControl";
|
|
4
|
+
import Typography from "@mui/material/Typography";
|
|
5
|
+
import CustomUploader from "../../custom-uploader/CustomUploader";
|
|
6
|
+
import Box from "@mui/material/Box";
|
|
7
|
+
import { useFormContext } from '../../../context/FormContext';
|
|
8
|
+
import { deepMerge } from '../../../methods/general';
|
|
9
|
+
const UFUploader = ({ form, error, itemProps, props, rules, disabled, multiple, name, withoutHelperText, helperText, onDelete, }) => {
|
|
10
|
+
const { theme } = useFormContext();
|
|
11
|
+
const uploaderMergedProps = deepMerge(theme?.uploader?.uploaderProps, itemProps, props);
|
|
12
|
+
const handleChange = (addedFiles) => {
|
|
9
13
|
const files = form.getValues(name)?.files || [];
|
|
10
14
|
const previews = form.getValues(name)?.preview || [];
|
|
11
15
|
for (let i = 0; i < addedFiles.length; i++) {
|
|
12
16
|
const file = addedFiles[i];
|
|
13
|
-
if (!files || files?.findIndex(
|
|
17
|
+
if (!files || files?.findIndex(f => f.name === file.name) < 0) {
|
|
14
18
|
files?.push(file);
|
|
15
19
|
previews.push(URL.createObjectURL(file));
|
|
16
20
|
}
|
|
@@ -21,19 +25,17 @@ const UFUploader = ({ form, error, itemProps, props, rules, disabled, multiple,
|
|
|
21
25
|
});
|
|
22
26
|
};
|
|
23
27
|
const handleDelete = (index) => {
|
|
28
|
+
console.log('index', index);
|
|
24
29
|
const files = form.getValues(name)?.files;
|
|
25
30
|
const preview = form.getValues(name)?.preview;
|
|
26
31
|
const newFiles = files?.filter((_, i) => i !== index);
|
|
27
32
|
const newPreview = preview?.filter((_, i) => i !== index);
|
|
28
|
-
form.setValue(name,
|
|
29
|
-
? { files: newFiles, preview: newPreview }
|
|
30
|
-
: null);
|
|
33
|
+
form.setValue(name, { files: newFiles, preview: newPreview });
|
|
31
34
|
};
|
|
32
|
-
return (_jsx(Controller, { control: form?.control, name: name, rules: { ...rules }, render: ({ field: { name, value, onBlur } }) => (_jsxs(FormControl, { sx: { display:
|
|
33
|
-
value?.preview?.map((preview, i) => (_jsx(CustomUploader, { multiple: multiple, ...props, ...itemProps, link: preview, inputProps: { name, disabled, onBlur }, onChange: handleChange, onDeleteDocument: onDelete ? () => onDelete(i) : () => handleDelete(i) })))] }), !withoutHelperText && (_jsx(Typography, { sx: {
|
|
35
|
+
return (_jsx(Controller, { control: form?.control, name: name, rules: { ...rules }, render: ({ field: { name, value, onBlur } }) => (_jsxs(FormControl, { sx: { display: "flex", ...(disabled && { filter: "contrast(0.3)" }) }, children: [_jsxs(Box, { display: "flex", gap: 2, children: [(multiple || !value?.files?.length) && (_jsx(CustomUploader, { multiple: multiple, ...uploaderMergedProps, inputProps: { name, disabled, onBlur }, onChange: handleChange })), value?.preview?.map((preview, i) => (_jsx(CustomUploader, { multiple: multiple, ...uploaderMergedProps, link: preview, inputProps: { name, disabled, onBlur }, onChange: handleChange, onDeleteDocument: onDelete ? () => onDelete(i) : () => handleDelete(i) })))] }), !withoutHelperText && (_jsx(Typography, { sx: {
|
|
34
36
|
height: 23,
|
|
35
|
-
width:
|
|
36
|
-
color: error ?
|
|
37
|
-
}, children: error?.message ?? helperText ??
|
|
37
|
+
width: "max-content",
|
|
38
|
+
color: error ? "error.4" : "text.primary",
|
|
39
|
+
}, children: error?.message ?? helperText ?? " " }))] })) }));
|
|
38
40
|
};
|
|
39
41
|
export default UFUploader;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { FC, ReactNode } from "react";
|
|
2
|
+
import { TFormTheme } from "../components/input-list/type";
|
|
3
|
+
export interface ICustomInputs {
|
|
4
|
+
}
|
|
5
|
+
interface InputContextType {
|
|
6
|
+
customInputs?: ICustomInputs[];
|
|
7
|
+
theme?: TFormTheme;
|
|
8
|
+
}
|
|
9
|
+
export interface IFormProvider {
|
|
10
|
+
children: ReactNode;
|
|
11
|
+
customInputs?: ICustomInputs[];
|
|
12
|
+
theme?: TFormTheme;
|
|
13
|
+
}
|
|
14
|
+
declare const FormProvider: FC<IFormProvider>;
|
|
15
|
+
export declare const useFormContext: () => InputContextType;
|
|
16
|
+
export default FormProvider;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext } from "react";
|
|
3
|
+
const FormContext = createContext(undefined);
|
|
4
|
+
const FormProvider = ({ children, customInputs, theme, }) => {
|
|
5
|
+
return (_jsx(FormContext.Provider, { value: { customInputs, theme }, children: children }));
|
|
6
|
+
};
|
|
7
|
+
export const useFormContext = () => useContext(FormContext) || {};
|
|
8
|
+
export default FormProvider;
|