dynamic-modal 1.1.7 → 1.1.9
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.
|
@@ -16,4 +16,5 @@ export interface IFieldRender {
|
|
|
16
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 type ILiveHandlerProps = Pick<IField, 'enableIf' | 'renderIf'>;
|
|
19
20
|
export declare const useFieldRender: ({ element, setValue, unregister }: IFieldRenderProps) => IFieldRender;
|
|
@@ -46,34 +46,62 @@ const useFieldRender = ({ element, setValue, unregister }) => {
|
|
|
46
46
|
}
|
|
47
47
|
return [];
|
|
48
48
|
}), [element.liveData]);
|
|
49
|
+
const liveDataHandler = (0, react_1.useCallback)((targetHandler, field, formData) => __awaiter(void 0, void 0, void 0, function* () {
|
|
50
|
+
const liveHandlerProperty = element[targetHandler];
|
|
51
|
+
if (typeof field === 'string' && liveHandlerProperty) {
|
|
52
|
+
const result = liveHandlerProperty.action(field, formData);
|
|
53
|
+
return result !== null && result !== void 0 ? result : false;
|
|
54
|
+
}
|
|
55
|
+
return false;
|
|
56
|
+
}), [element.liveData]);
|
|
49
57
|
const checkField = (0, react_1.useCallback)((formData_1, _a) => __awaiter(void 0, [formData_1, _a], void 0, function* (formData, { name }) {
|
|
50
58
|
var _b;
|
|
51
59
|
const key = name !== null && name !== void 0 ? name : '';
|
|
52
60
|
const targetField = formData[key];
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
61
|
+
if (!targetField)
|
|
62
|
+
return;
|
|
63
|
+
if (renderCondition) {
|
|
64
|
+
const renderIfConfig = element.renderIf;
|
|
65
|
+
const isLiveRender = !!(renderIfConfig === null || renderIfConfig === void 0 ? void 0 : renderIfConfig.action) && !!(renderIfConfig === null || renderIfConfig === void 0 ? void 0 : renderIfConfig.condition);
|
|
66
|
+
if (isLiveRender && renderIfConfig.condition.includes(key)) {
|
|
67
|
+
const renderStatus = yield liveDataHandler('renderIf', targetField, formData);
|
|
68
|
+
if (render !== renderStatus) {
|
|
69
|
+
setRender(renderStatus);
|
|
70
|
+
if (!renderStatus)
|
|
71
|
+
unregister(element.name);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else if (renderConditionList.includes(key)) {
|
|
75
|
+
const renderStatus = renderIfConfig[key].includes(targetField) || renderIfConfig[key].includes('*');
|
|
76
|
+
if (render !== renderStatus) {
|
|
77
|
+
setRender(renderStatus);
|
|
78
|
+
if (!renderStatus)
|
|
79
|
+
unregister(element.name);
|
|
80
|
+
}
|
|
60
81
|
}
|
|
61
82
|
}
|
|
62
|
-
else if (enableCondition
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
83
|
+
else if (enableCondition) {
|
|
84
|
+
const enableIfConfig = element.enableIf;
|
|
85
|
+
const isLiveEnable = !!(enableIfConfig === null || enableIfConfig === void 0 ? void 0 : enableIfConfig.action) && !!enableIfConfig.condition;
|
|
86
|
+
if (isLiveEnable && enableIfConfig.condition.includes(key)) {
|
|
87
|
+
const enableStatus = yield liveDataHandler('enableIf', targetField, formData);
|
|
88
|
+
if (enable !== enableStatus)
|
|
89
|
+
setEnable(enableStatus);
|
|
90
|
+
}
|
|
91
|
+
else if (enableConditionList.includes(key)) {
|
|
92
|
+
const enableStatus = enableIfConfig[key].includes(targetField) || enableIfConfig[key].includes('*');
|
|
93
|
+
if (enable !== enableStatus)
|
|
94
|
+
setEnable(enableStatus);
|
|
95
|
+
}
|
|
66
96
|
}
|
|
67
97
|
if (liveDataCondition && ((_b = element.liveData) === null || _b === void 0 ? void 0 : _b.condition.includes(key))) {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
setValue(element.name, options);
|
|
73
|
-
}
|
|
74
|
-
setLiveData(options);
|
|
75
|
-
setLiveSearching(false);
|
|
98
|
+
setLiveSearching(true);
|
|
99
|
+
const options = yield liveDataAction(targetField, formData);
|
|
100
|
+
if (liveData && JSON.stringify(liveData) !== JSON.stringify(options)) {
|
|
101
|
+
setValue(element.name, options);
|
|
76
102
|
}
|
|
103
|
+
setLiveData(options);
|
|
104
|
+
setLiveSearching(false);
|
|
77
105
|
}
|
|
78
106
|
}), [enable, enableCondition, enableConditionList, liveData, liveDataAction, liveDataCondition, render, renderCondition, renderConditionList]);
|
|
79
107
|
return {
|
|
@@ -10,7 +10,12 @@ import { IOption } from './option';
|
|
|
10
10
|
import { IMakeButton } from './make-button';
|
|
11
11
|
export type IModalField = IMakeSelect | IMakeInput | IMakeFieldGroup | IMakeTextarea | IMakeToggle | IMakeDescription | IMakeUpload | IMakeButton;
|
|
12
12
|
export type IFormField = IMakeSelect | IMakeInput | IMakeTextarea | IMakeToggle;
|
|
13
|
-
export
|
|
13
|
+
export interface IModalRenderAction {
|
|
14
|
+
action: (data: string, ...args: any[]) => Promise<boolean>;
|
|
15
|
+
condition: Array<string>;
|
|
16
|
+
}
|
|
17
|
+
export type IModalRenderCriteria = Record<string, Array<string | number | boolean> | undefined>;
|
|
18
|
+
export type IModalRenderCondition = IModalRenderAction | IModalRenderCriteria;
|
|
14
19
|
export type IModalLiveDataCondition = {
|
|
15
20
|
action: (data: string, ...args: any[]) => Promise<Array<IOption>>;
|
|
16
21
|
condition: Array<string>;
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { useCallback, useMemo, useState } from 'react'
|
|
4
4
|
import { IField, IFieldProps } from '../interfaces/field'
|
|
5
5
|
import { IOption } from '../interfaces/option'
|
|
6
|
-
import { IModalLiveDataCondition, IModalRenderCondition } from '../interfaces/modal'
|
|
6
|
+
import { IModalLiveDataCondition, IModalRenderAction, IModalRenderCondition, IModalRenderCriteria } from '../interfaces/modal'
|
|
7
7
|
|
|
8
8
|
export type IFormData = Record<string, unknown>
|
|
9
9
|
|
|
@@ -24,6 +24,8 @@ export interface IFieldRenderProps extends Pick<IFieldProps, 'setValue' | 'unreg
|
|
|
24
24
|
element: Partial<Pick<IField, 'enableIf' | 'renderIf' | 'name' >> & Partial<Record<'liveData', IModalLiveDataCondition>>
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
+
export type ILiveHandlerProps = Pick<IField, 'enableIf' | 'renderIf'>
|
|
28
|
+
|
|
27
29
|
export const useFieldRender = ({ element, setValue, unregister }: IFieldRenderProps): IFieldRender => {
|
|
28
30
|
const [render, setRender] = useState<boolean|null>(null)
|
|
29
31
|
const [enable, setEnable] = useState<boolean|null>(null)
|
|
@@ -61,7 +63,7 @@ export const useFieldRender = ({ element, setValue, unregister }: IFieldRenderPr
|
|
|
61
63
|
}, [enableCondition, element.enableIf])
|
|
62
64
|
|
|
63
65
|
const liveDataAction = useCallback(
|
|
64
|
-
async (field: string |number | Array<unknown>, formData: IFormData) => {
|
|
66
|
+
async (field: string | number | Array<unknown>, formData: IFormData) => {
|
|
65
67
|
if (typeof field === 'string' && element.liveData?.action) {
|
|
66
68
|
const options = element.liveData.action(field, formData)
|
|
67
69
|
return options ?? []
|
|
@@ -70,31 +72,63 @@ export const useFieldRender = ({ element, setValue, unregister }: IFieldRenderPr
|
|
|
70
72
|
}, [element.liveData]
|
|
71
73
|
)
|
|
72
74
|
|
|
75
|
+
const liveDataHandler = useCallback(
|
|
76
|
+
async (targetHandler: keyof ILiveHandlerProps, field: string | number | Array<unknown>, formData: IFormData) => {
|
|
77
|
+
const liveHandlerProperty = element[targetHandler] as IModalRenderAction
|
|
78
|
+
|
|
79
|
+
if (typeof field === 'string' && liveHandlerProperty) {
|
|
80
|
+
const result = liveHandlerProperty.action(field, formData)
|
|
81
|
+
return result ?? false
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return false
|
|
85
|
+
}, [element.liveData]
|
|
86
|
+
)
|
|
87
|
+
|
|
73
88
|
const checkField = useCallback(
|
|
74
89
|
async (formData: IFormData, { name }: IWatchEvent) => {
|
|
75
90
|
const key: string = name ?? ''
|
|
76
91
|
const targetField = formData[key] as string | number
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
if
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
92
|
+
if(!targetField) return
|
|
93
|
+
|
|
94
|
+
if(renderCondition){
|
|
95
|
+
const renderIfConfig = element.renderIf
|
|
96
|
+
const isLiveRender: boolean = !!renderIfConfig?.action && !!renderIfConfig?.condition
|
|
97
|
+
|
|
98
|
+
if(isLiveRender && renderIfConfig!.condition!.includes(key)){
|
|
99
|
+
const renderStatus: boolean = await liveDataHandler('renderIf', targetField, formData)
|
|
100
|
+
|
|
101
|
+
if (render !== renderStatus) {
|
|
102
|
+
setRender(renderStatus)
|
|
103
|
+
if(!renderStatus) unregister(element.name as string)
|
|
104
|
+
}
|
|
105
|
+
}else if(renderConditionList.includes(key)){
|
|
106
|
+
const renderStatus: boolean = (renderIfConfig as IModalRenderCriteria)[key]!.includes(targetField) || (renderIfConfig as IModalRenderCriteria)[key]!.includes('*')
|
|
107
|
+
|
|
108
|
+
if (render !== renderStatus) {
|
|
109
|
+
setRender(renderStatus)
|
|
110
|
+
if(!renderStatus) unregister(element.name as string)
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}else if (enableCondition){
|
|
114
|
+
const enableIfConfig = element.enableIf
|
|
115
|
+
const isLiveEnable: boolean = !!enableIfConfig?.action && !!enableIfConfig.condition
|
|
116
|
+
|
|
117
|
+
if(isLiveEnable && enableIfConfig!.condition!.includes(key)){
|
|
118
|
+
const enableStatus: boolean = await liveDataHandler('enableIf', targetField, formData)
|
|
119
|
+
if (enable !== enableStatus) setEnable(enableStatus)
|
|
120
|
+
}else if(enableConditionList.includes(key)){
|
|
121
|
+
const enableStatus: boolean = (enableIfConfig as IModalRenderCriteria)[key]!.includes(targetField) || (enableIfConfig as IModalRenderCriteria)[key]!.includes('*')
|
|
122
|
+
if (enable !== enableStatus) setEnable(enableStatus)
|
|
84
123
|
}
|
|
85
|
-
} else if (enableCondition && enableConditionList.includes(key) && fieldValidValue) {
|
|
86
|
-
const enableStatus: boolean = (element.enableIf as IModalRenderCondition)[key]!.includes(targetField) || (element.enableIf as IModalRenderCondition)[key]!.includes('*')
|
|
87
|
-
if (enable !== enableStatus) setEnable(enableStatus)
|
|
88
124
|
}
|
|
89
125
|
|
|
90
126
|
if (liveDataCondition && element.liveData?.condition.includes(key)) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
setLiveSearching(false)
|
|
97
|
-
}
|
|
127
|
+
setLiveSearching(true)
|
|
128
|
+
const options: Array<IOption> = await liveDataAction(targetField, formData)
|
|
129
|
+
if (liveData && JSON.stringify(liveData) !== JSON.stringify(options)) { setValue(element.name as string, options) }
|
|
130
|
+
setLiveData(options)
|
|
131
|
+
setLiveSearching(false)
|
|
98
132
|
}
|
|
99
133
|
}, [enable, enableCondition, enableConditionList, liveData, liveDataAction, liveDataCondition, render, renderCondition, renderConditionList]
|
|
100
134
|
)
|
package/src/interfaces/modal.ts
CHANGED
|
@@ -14,7 +14,14 @@ export type IModalField = IMakeSelect | IMakeInput | IMakeFieldGroup | IMakeText
|
|
|
14
14
|
|
|
15
15
|
export type IFormField = IMakeSelect | IMakeInput | IMakeTextarea | IMakeToggle
|
|
16
16
|
|
|
17
|
-
export
|
|
17
|
+
export interface IModalRenderAction {
|
|
18
|
+
action: (data: string, ...args: any[]) => Promise<boolean>
|
|
19
|
+
condition: Array<string>
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export type IModalRenderCriteria = Record<string, Array<string | number | boolean> | undefined>
|
|
23
|
+
|
|
24
|
+
export type IModalRenderCondition = IModalRenderAction | IModalRenderCriteria
|
|
18
25
|
|
|
19
26
|
export type IModalLiveDataCondition = {
|
|
20
27
|
action: (data: string, ...args: any[]) => Promise<Array<IOption>>
|