dynamic-modal 1.0.9 → 1.0.11
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/hooks/field-render.d.ts +2 -2
- package/dist/hooks/field-render.js +23 -20
- package/dist/interfaces/field.d.ts +2 -1
- package/dist/interfaces/modal.d.ts +1 -1
- package/dist/modal.js +2 -1
- package/package.json +1 -1
- package/src/hooks/field-render.ts +24 -21
- package/src/interfaces/field.ts +3 -2
- package/src/interfaces/modal.ts +1 -1
- package/src/modal.tsx +2 -1
|
@@ -13,7 +13,7 @@ export interface IFieldRender {
|
|
|
13
13
|
liveData?: Array<IOption>;
|
|
14
14
|
liveSearching?: boolean;
|
|
15
15
|
}
|
|
16
|
-
export interface IFieldRenderProps extends Pick<IFieldProps, 'setValue'> {
|
|
16
|
+
export interface IFieldRenderProps extends Pick<IFieldProps, 'setValue' | 'unregister'> {
|
|
17
17
|
element: Partial<Pick<IField, 'enableIf' | 'renderIf' | 'name'>> & Partial<Record<'liveData', IModalLiveDataCondition>>;
|
|
18
18
|
}
|
|
19
|
-
export declare const useFieldRender: (
|
|
19
|
+
export declare const useFieldRender: ({ element, setValue, unregister }: IFieldRenderProps) => IFieldRender;
|
|
@@ -12,67 +12,70 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
13
|
exports.useFieldRender = void 0;
|
|
14
14
|
const react_1 = require("react");
|
|
15
|
-
const useFieldRender = (
|
|
15
|
+
const useFieldRender = ({ element, setValue, unregister }) => {
|
|
16
16
|
const [render, setRender] = (0, react_1.useState)(null);
|
|
17
17
|
const [enable, setEnable] = (0, react_1.useState)(null);
|
|
18
18
|
const [liveSearching, setLiveSearching] = (0, react_1.useState)(false);
|
|
19
19
|
const [liveData, setLiveData] = (0, react_1.useState)(undefined);
|
|
20
20
|
const renderCondition = (0, react_1.useMemo)(() => {
|
|
21
|
-
const isRender =
|
|
21
|
+
const isRender = element.renderIf !== undefined;
|
|
22
22
|
if (render === null)
|
|
23
23
|
setRender(!isRender);
|
|
24
24
|
return isRender;
|
|
25
|
-
}, [
|
|
25
|
+
}, [element.renderIf, render]);
|
|
26
26
|
const enableCondition = (0, react_1.useMemo)(() => {
|
|
27
|
-
const isEnable =
|
|
27
|
+
const isEnable = element.enableIf !== undefined;
|
|
28
28
|
if (enable === null)
|
|
29
29
|
setEnable(!isEnable);
|
|
30
30
|
return isEnable;
|
|
31
|
-
}, [
|
|
31
|
+
}, [element.enableIf, enable]);
|
|
32
32
|
const liveDataCondition = (0, react_1.useMemo)(() => {
|
|
33
|
-
return
|
|
34
|
-
}, [
|
|
33
|
+
return element.liveData !== undefined;
|
|
34
|
+
}, [element.liveData]);
|
|
35
35
|
const renderConditionList = (0, react_1.useMemo)(() => {
|
|
36
|
-
return renderCondition ? Object.keys(
|
|
37
|
-
}, [
|
|
36
|
+
return renderCondition ? Object.keys(element.renderIf) : [];
|
|
37
|
+
}, [element.renderIf, renderCondition]);
|
|
38
38
|
const enableConditionList = (0, react_1.useMemo)(() => {
|
|
39
|
-
return enableCondition ? Object.keys(
|
|
40
|
-
}, [enableCondition,
|
|
39
|
+
return enableCondition ? Object.keys(element.enableIf) : [];
|
|
40
|
+
}, [enableCondition, element.enableIf]);
|
|
41
41
|
const liveDataAction = (0, react_1.useCallback)((field, formData) => __awaiter(void 0, void 0, void 0, function* () {
|
|
42
42
|
var _a;
|
|
43
|
-
if (typeof field === 'string' && ((_a =
|
|
44
|
-
const options =
|
|
43
|
+
if (typeof field === 'string' && ((_a = element.liveData) === null || _a === void 0 ? void 0 : _a.action)) {
|
|
44
|
+
const options = element.liveData.action(field, formData);
|
|
45
45
|
return options !== null && options !== void 0 ? options : [];
|
|
46
46
|
}
|
|
47
47
|
return [];
|
|
48
|
-
}), [
|
|
48
|
+
}), [element.liveData]);
|
|
49
49
|
const checkField = (0, react_1.useCallback)((formData_1, _a) => __awaiter(void 0, [formData_1, _a], void 0, function* (formData, { name }) {
|
|
50
50
|
var _b;
|
|
51
51
|
const key = name !== null && name !== void 0 ? name : '';
|
|
52
52
|
const targetField = formData[key];
|
|
53
53
|
const fieldValidValue = targetField !== undefined && targetField !== null && targetField !== '';
|
|
54
54
|
if (renderCondition && renderConditionList.includes(key) && fieldValidValue) {
|
|
55
|
-
const renderStatus =
|
|
56
|
-
if (render !== renderStatus)
|
|
55
|
+
const renderStatus = element.renderIf[key].includes(targetField) || element.renderIf[key].includes('*');
|
|
56
|
+
if (render !== renderStatus) {
|
|
57
57
|
setRender(renderStatus);
|
|
58
|
+
if (!renderStatus)
|
|
59
|
+
unregister(element.name);
|
|
60
|
+
}
|
|
58
61
|
}
|
|
59
62
|
else if (enableCondition && enableConditionList.includes(key) && fieldValidValue) {
|
|
60
|
-
const enableStatus =
|
|
63
|
+
const enableStatus = element.enableIf[key].includes(targetField) || element.enableIf[key].includes('');
|
|
61
64
|
if (enable !== enableStatus)
|
|
62
65
|
setEnable(enableStatus);
|
|
63
66
|
}
|
|
64
|
-
if (liveDataCondition && ((_b =
|
|
67
|
+
if (liveDataCondition && ((_b = element.liveData) === null || _b === void 0 ? void 0 : _b.condition.includes(key))) {
|
|
65
68
|
if (targetField) {
|
|
66
69
|
setLiveSearching(true);
|
|
67
70
|
const options = yield liveDataAction(targetField, formData);
|
|
68
71
|
if (liveData && JSON.stringify(liveData) !== JSON.stringify(options)) {
|
|
69
|
-
|
|
72
|
+
setValue(element.name, options);
|
|
70
73
|
}
|
|
71
74
|
setLiveData(options);
|
|
72
75
|
setLiveSearching(false);
|
|
73
76
|
}
|
|
74
77
|
}
|
|
75
|
-
}), [enable, enableCondition, enableConditionList, liveData, liveDataAction, liveDataCondition,
|
|
78
|
+
}), [enable, enableCondition, enableConditionList, liveData, liveDataAction, liveDataCondition, render, renderCondition, renderConditionList]);
|
|
76
79
|
return {
|
|
77
80
|
render,
|
|
78
81
|
enable,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CSSProperties } from 'react';
|
|
2
|
-
import { Control, FieldValues, UseFormSetValue, UseFormWatch } from 'react-hook-form';
|
|
2
|
+
import { Control, FieldValues, UseFormSetValue, UseFormUnregister, UseFormWatch } from 'react-hook-form';
|
|
3
3
|
import { IOption } from './option';
|
|
4
4
|
export interface IFieldLiveData {
|
|
5
5
|
action: (data: string, ...args: unknown[]) => Promise<Array<IOption>>;
|
|
@@ -24,4 +24,5 @@ export interface IFieldProps {
|
|
|
24
24
|
control: Control<FieldValues, unknown>;
|
|
25
25
|
watch: UseFormWatch<FieldValues>;
|
|
26
26
|
setValue: UseFormSetValue<FieldValues>;
|
|
27
|
+
unregister: UseFormUnregister<FieldValues>;
|
|
27
28
|
}
|
|
@@ -12,7 +12,7 @@ import { IMakeButton } from './make-button';
|
|
|
12
12
|
import { IMakeAutoComplete } from './make-autocomplete';
|
|
13
13
|
export type IModalField = IMakeSelect | IMakeInput | IMakeFieldGroup | IMakeTextarea | IMakeToggle | IMakeMultiSelect | IMakeText | IMakeUpload | IMakeButton | IMakeAutoComplete;
|
|
14
14
|
export type IFormField = IMakeSelect | IMakeInput | IMakeTextarea | IMakeToggle | IMakeMultiSelect;
|
|
15
|
-
export type IModalRenderCondition = Record<string, Array<string | number
|
|
15
|
+
export type IModalRenderCondition = Record<string, Array<string | number>>;
|
|
16
16
|
export type IModalLiveDataCondition = {
|
|
17
17
|
action: (data: string, ...args: any[]) => Promise<Array<IOption>>;
|
|
18
18
|
condition: Array<string>;
|
package/dist/modal.js
CHANGED
|
@@ -81,7 +81,8 @@ const Modal = ({ open, close, config }) => {
|
|
|
81
81
|
const props = {
|
|
82
82
|
control,
|
|
83
83
|
watch,
|
|
84
|
-
setValue
|
|
84
|
+
setValue,
|
|
85
|
+
unregister
|
|
85
86
|
};
|
|
86
87
|
return element.elementType === 'input'
|
|
87
88
|
? react_1.default.createElement(make_input_1.default, Object.assign({}, props, { key: `modal-input-${index}`, element: element }))
|
package/package.json
CHANGED
|
@@ -19,11 +19,11 @@ export interface IFieldRender {
|
|
|
19
19
|
liveSearching?: boolean;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
export interface IFieldRenderProps extends Pick<IFieldProps, 'setValue'> {
|
|
22
|
+
export interface IFieldRenderProps extends Pick<IFieldProps, 'setValue'|'unregister'> {
|
|
23
23
|
element: Partial<Pick<IField, 'enableIf'|'renderIf'|'name' >> & Partial<Record<'liveData', IModalLiveDataCondition>>
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
export const useFieldRender = (
|
|
26
|
+
export const useFieldRender = ({element, setValue, unregister}: IFieldRenderProps): IFieldRender => {
|
|
27
27
|
const [render, setRender] = useState<boolean|null>(null)
|
|
28
28
|
const [enable, setEnable] = useState<boolean|null>(null)
|
|
29
29
|
const [liveSearching, setLiveSearching] = useState<boolean>(false)
|
|
@@ -31,42 +31,42 @@ export const useFieldRender = (props: IFieldRenderProps): IFieldRender => {
|
|
|
31
31
|
|
|
32
32
|
const renderCondition = useMemo<boolean>(
|
|
33
33
|
() => {
|
|
34
|
-
const isRender: boolean =
|
|
34
|
+
const isRender: boolean = element.renderIf !== undefined
|
|
35
35
|
if (render === null) setRender(!isRender)
|
|
36
36
|
return isRender
|
|
37
|
-
}, [
|
|
37
|
+
}, [element.renderIf, render]
|
|
38
38
|
)
|
|
39
39
|
|
|
40
40
|
const enableCondition = useMemo<boolean>(
|
|
41
41
|
() => {
|
|
42
|
-
const isEnable: boolean =
|
|
42
|
+
const isEnable: boolean = element.enableIf !== undefined
|
|
43
43
|
if (enable === null) setEnable(!isEnable)
|
|
44
44
|
return isEnable
|
|
45
|
-
}, [
|
|
45
|
+
}, [element.enableIf, enable]
|
|
46
46
|
)
|
|
47
47
|
|
|
48
48
|
const liveDataCondition = useMemo<boolean>(
|
|
49
49
|
() => {
|
|
50
|
-
return
|
|
51
|
-
}, [
|
|
50
|
+
return element.liveData !== undefined
|
|
51
|
+
}, [element.liveData]
|
|
52
52
|
)
|
|
53
53
|
|
|
54
54
|
const renderConditionList: Array<string> = useMemo(() => {
|
|
55
|
-
return renderCondition ? Object.keys(
|
|
56
|
-
}, [
|
|
55
|
+
return renderCondition ? Object.keys(element.renderIf as IModalRenderCondition) : []
|
|
56
|
+
}, [element.renderIf, renderCondition])
|
|
57
57
|
|
|
58
58
|
const enableConditionList: Array<string> = useMemo(() => {
|
|
59
|
-
return enableCondition ? Object.keys(
|
|
60
|
-
}, [enableCondition,
|
|
59
|
+
return enableCondition ? Object.keys(element.enableIf as IModalRenderCondition) : []
|
|
60
|
+
}, [enableCondition, element.enableIf])
|
|
61
61
|
|
|
62
62
|
const liveDataAction = useCallback(
|
|
63
63
|
async (field: string |number | Array<unknown>, formData: IFormData) => {
|
|
64
|
-
if (typeof field === 'string' &&
|
|
65
|
-
const options =
|
|
64
|
+
if (typeof field === 'string' && element.liveData?.action) {
|
|
65
|
+
const options = element.liveData.action(field, formData)
|
|
66
66
|
return options ?? []
|
|
67
67
|
}
|
|
68
68
|
return [] as Array<IOption>
|
|
69
|
-
}, [
|
|
69
|
+
}, [element.liveData]
|
|
70
70
|
)
|
|
71
71
|
|
|
72
72
|
const checkField = useCallback(
|
|
@@ -76,23 +76,26 @@ export const useFieldRender = (props: IFieldRenderProps): IFieldRender => {
|
|
|
76
76
|
const fieldValidValue: boolean = targetField !== undefined && targetField !== null && targetField !== ''
|
|
77
77
|
|
|
78
78
|
if (renderCondition && renderConditionList.includes(key) && fieldValidValue) {
|
|
79
|
-
const renderStatus: boolean = (
|
|
80
|
-
if (render !== renderStatus)
|
|
79
|
+
const renderStatus: boolean = (element.renderIf as IModalRenderCondition)[key].includes(targetField) || (element.renderIf as IModalRenderCondition)[key].includes('*')
|
|
80
|
+
if (render !== renderStatus) {
|
|
81
|
+
setRender(renderStatus)
|
|
82
|
+
if(!renderStatus) unregister(element.name as string)
|
|
83
|
+
}
|
|
81
84
|
} else if (enableCondition && enableConditionList.includes(key) && fieldValidValue) {
|
|
82
|
-
const enableStatus: boolean = (
|
|
85
|
+
const enableStatus: boolean = (element.enableIf as IModalRenderCondition)[key].includes(targetField) || (element.enableIf as IModalRenderCondition)[key].includes('')
|
|
83
86
|
if (enable !== enableStatus) setEnable(enableStatus)
|
|
84
87
|
}
|
|
85
88
|
|
|
86
|
-
if (liveDataCondition &&
|
|
89
|
+
if (liveDataCondition && element.liveData?.condition.includes(key)) {
|
|
87
90
|
if (targetField) {
|
|
88
91
|
setLiveSearching(true)
|
|
89
92
|
const options: Array<IOption> = await liveDataAction(targetField, formData)
|
|
90
|
-
if (liveData && JSON.stringify(liveData) !== JSON.stringify(options)) {
|
|
93
|
+
if (liveData && JSON.stringify(liveData) !== JSON.stringify(options)) { setValue(element.name as string, options) }
|
|
91
94
|
setLiveData(options)
|
|
92
95
|
setLiveSearching(false)
|
|
93
96
|
}
|
|
94
97
|
}
|
|
95
|
-
}, [enable, enableCondition, enableConditionList, liveData, liveDataAction, liveDataCondition,
|
|
98
|
+
}, [enable, enableCondition, enableConditionList, liveData, liveDataAction, liveDataCondition, render, renderCondition, renderConditionList]
|
|
96
99
|
)
|
|
97
100
|
|
|
98
101
|
return {
|
package/src/interfaces/field.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CSSProperties } from 'react'
|
|
2
|
-
import { Control, FieldValues, UseFormSetValue, UseFormWatch } from 'react-hook-form'
|
|
2
|
+
import { Control, FieldValues, UseFormSetValue, UseFormUnregister, UseFormWatch } from 'react-hook-form'
|
|
3
3
|
import { IOption } from './option'
|
|
4
4
|
|
|
5
5
|
export interface IFieldLiveData {
|
|
@@ -26,5 +26,6 @@ export interface IField {
|
|
|
26
26
|
export interface IFieldProps {
|
|
27
27
|
control: Control<FieldValues, unknown>;
|
|
28
28
|
watch: UseFormWatch<FieldValues>;
|
|
29
|
-
setValue: UseFormSetValue<FieldValues
|
|
29
|
+
setValue: UseFormSetValue<FieldValues>;
|
|
30
|
+
unregister: UseFormUnregister<FieldValues>;
|
|
30
31
|
}
|
package/src/interfaces/modal.ts
CHANGED
|
@@ -16,7 +16,7 @@ export type IModalField = IMakeSelect | IMakeInput | IMakeFieldGroup | IMakeText
|
|
|
16
16
|
|
|
17
17
|
export type IFormField = IMakeSelect | IMakeInput | IMakeTextarea | IMakeToggle | IMakeMultiSelect
|
|
18
18
|
|
|
19
|
-
export type IModalRenderCondition = Record<string, Array<string | number
|
|
19
|
+
export type IModalRenderCondition = Record<string, Array<string | number>>
|
|
20
20
|
|
|
21
21
|
export type IModalLiveDataCondition = {
|
|
22
22
|
action: (data: string, ...args: any[]) => Promise<Array<IOption>>;
|