dynamic-modal 1.1.8 → 1.1.10
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/README.md +0 -1
- package/dist/components/input-upload/input-upload.js +3 -3
- package/dist/components/make-button/make-button.js +19 -10
- package/dist/components/make-description/make-description.js +2 -2
- package/dist/components/make-input/make-input.js +57 -29
- package/dist/components/make-select/make-select.js +66 -29
- package/dist/components/make-textarea/make-textarea.js +57 -29
- package/dist/components/make-toggle/make-toggle.js +57 -29
- package/dist/components/make-upload/make-upload.js +72 -18
- package/dist/components/portal/portal.js +20 -10
- package/dist/context/component/component-state.d.ts +3 -3
- package/dist/context/component/component-state.js +20 -11
- package/dist/hooks/use-enable-if.d.ts +9 -0
- package/dist/hooks/use-enable-if.js +45 -0
- package/dist/hooks/use-live-data.d.ts +14 -0
- package/dist/hooks/use-live-data.js +42 -0
- package/dist/hooks/use-render-if.d.ts +12 -0
- package/dist/hooks/use-render-if.js +51 -0
- package/dist/interfaces/component-state.d.ts +8 -8
- package/dist/interfaces/modal.d.ts +4 -2
- package/dist/modal.js +70 -58
- package/dist/util/general/general.util.d.ts +3 -0
- package/dist/util/general/general.util.js +28 -0
- package/eslint.config.mjs +72 -14
- package/examples/live-data.ts +0 -1
- package/package.json +11 -9
- package/src/components/input-upload/input-upload.tsx +40 -28
- package/src/components/make-button/make-button.tsx +11 -13
- package/src/components/make-description/make-description.tsx +14 -8
- package/src/components/make-input/make-input.tsx +94 -47
- package/src/components/make-select/make-select.tsx +118 -48
- package/src/components/make-textarea/make-textarea.tsx +94 -47
- package/src/components/make-toggle/make-toggle.tsx +94 -47
- package/src/components/make-upload/make-upload.tsx +88 -36
- package/src/components/portal/portal.tsx +27 -25
- package/src/context/component/component-state.tsx +16 -9
- package/src/hooks/modal-handler.ts +17 -14
- package/src/hooks/use-enable-if.ts +64 -0
- package/src/hooks/use-live-data.ts +45 -0
- package/src/hooks/use-render-if.ts +59 -0
- package/src/interfaces/component-state.ts +38 -23
- package/src/interfaces/field.ts +33 -27
- package/src/interfaces/input-upload.ts +17 -15
- package/src/interfaces/make-button.ts +14 -13
- package/src/interfaces/make-description.ts +9 -8
- package/src/interfaces/make-field-group.ts +9 -8
- package/src/interfaces/make-input.ts +9 -8
- package/src/interfaces/make-select.ts +9 -9
- package/src/interfaces/make-textarea.ts +5 -5
- package/src/interfaces/make-toggle.ts +3 -3
- package/src/interfaces/make-upload.ts +8 -8
- package/src/interfaces/modal.ts +57 -39
- package/src/interfaces/option.ts +3 -3
- package/src/interfaces/portal.ts +5 -5
- package/src/modal.tsx +243 -147
- package/src/util/general/general.util.ts +27 -0
- package/tsconfig.json +1 -1
- package/dist/hooks/field-render.d.ts +0 -20
- package/dist/hooks/field-render.js +0 -94
- package/dist/tools/general.d.ts +0 -1
- package/dist/tools/general.js +0 -11
- package/src/hooks/field-render.ts +0 -120
- package/src/tools/general.ts +0 -8
package/src/modal.tsx
CHANGED
|
@@ -1,30 +1,36 @@
|
|
|
1
|
-
'use client'
|
|
2
|
-
|
|
3
|
-
import React, { useContext, useEffect, useState } from 'react'
|
|
4
|
-
import { useForm } from 'react-hook-form'
|
|
5
|
-
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
import
|
|
18
|
-
import {
|
|
19
|
-
import
|
|
20
|
-
import
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import React, { useContext, useEffect, useState } from 'react';
|
|
4
|
+
import { useForm } from 'react-hook-form';
|
|
5
|
+
|
|
6
|
+
import { Portal } from './components/portal/portal';
|
|
7
|
+
import MakeToggle from './components/make-toggle/make-toggle';
|
|
8
|
+
import MakeInput from './components/make-input/make-input';
|
|
9
|
+
import MakeSelect from './components/make-select/make-select';
|
|
10
|
+
import MakeTextarea from './components/make-textarea/make-textarea';
|
|
11
|
+
import {
|
|
12
|
+
IModal,
|
|
13
|
+
IModalField,
|
|
14
|
+
IModalConfigProps,
|
|
15
|
+
IFormField,
|
|
16
|
+
} from './interfaces/modal';
|
|
17
|
+
import MakeDescription from './components/make-description/make-description';
|
|
18
|
+
import { IFieldProps } from './interfaces/field';
|
|
19
|
+
import MakeUpload from './components/make-upload/make-upload';
|
|
20
|
+
import MakeButton from './components/make-button/make-button';
|
|
21
|
+
import { IMakeInput } from './interfaces/make-input';
|
|
22
|
+
import { IMakeSelect } from './interfaces/make-select';
|
|
23
|
+
import { IMakeTextarea } from './interfaces/make-textarea';
|
|
24
|
+
import { IMakeToggle } from './interfaces/make-toggle';
|
|
25
|
+
import { IMakeDescription } from './interfaces/make-description';
|
|
26
|
+
import { IMakeUpload } from './interfaces/make-upload';
|
|
27
|
+
import { IMakeButton } from './interfaces/make-button';
|
|
28
|
+
import { ComponentStateContext } from './context/component/component-state';
|
|
23
29
|
|
|
24
30
|
export const Modal = ({ open, close, config }: IModal) => {
|
|
25
|
-
const { ModalButtonAction, ModalButtonCancel } = useContext(ComponentStateContext)
|
|
26
|
-
const [modalReady, setModalReady] = useState<IModalConfigProps | undefined>(undefined)
|
|
27
|
-
const [defaultLoaded, setDefaultLoaded] = useState<boolean>(false)
|
|
31
|
+
const { ModalButtonAction, ModalButtonCancel } = useContext(ComponentStateContext);
|
|
32
|
+
const [modalReady, setModalReady] = useState<IModalConfigProps | undefined>(undefined);
|
|
33
|
+
const [defaultLoaded, setDefaultLoaded] = useState<boolean>(false);
|
|
28
34
|
|
|
29
35
|
const {
|
|
30
36
|
control,
|
|
@@ -34,163 +40,253 @@ export const Modal = ({ open, close, config }: IModal) => {
|
|
|
34
40
|
setValue,
|
|
35
41
|
watch,
|
|
36
42
|
trigger,
|
|
37
|
-
|
|
38
|
-
|
|
43
|
+
reset,
|
|
44
|
+
getFieldState,
|
|
45
|
+
} = useForm();
|
|
39
46
|
|
|
40
47
|
const formValueHandler = (element: IFormField) => {
|
|
41
|
-
if (['group', 'upload', 'text'].includes(element.elementType)) return
|
|
42
|
-
if(!element.defaultValue && element.renderIf) {
|
|
43
|
-
unregister(element.name)
|
|
44
|
-
return
|
|
48
|
+
if (['group', 'upload', 'text'].includes(element.elementType)) return;
|
|
49
|
+
if (!element.defaultValue && element.renderIf) {
|
|
50
|
+
unregister(element.name);
|
|
51
|
+
return;
|
|
45
52
|
}
|
|
46
|
-
|
|
47
|
-
const defaultValue = element.defaultValue ?? ''
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
53
|
+
|
|
54
|
+
const defaultValue = element.defaultValue ?? '';
|
|
55
|
+
|
|
56
|
+
const parsedValue: boolean | string | Array<string> | undefined =
|
|
57
|
+
defaultValue === 'true'
|
|
58
|
+
? true
|
|
59
|
+
: defaultValue === 'false'
|
|
60
|
+
? false
|
|
61
|
+
: defaultValue;
|
|
62
|
+
|
|
63
|
+
setValue(element.name, parsedValue ?? '');
|
|
64
|
+
};
|
|
51
65
|
|
|
52
66
|
const autoLoadGroup = (groupFields: Array<IModalField>) => {
|
|
53
|
-
groupFields.forEach(element => {
|
|
54
|
-
formValueHandler(element as IFormField)
|
|
55
|
-
})
|
|
56
|
-
}
|
|
67
|
+
groupFields.forEach((element) => {
|
|
68
|
+
formValueHandler(element as IFormField);
|
|
69
|
+
});
|
|
70
|
+
};
|
|
57
71
|
|
|
58
72
|
const autoLoadField = (modalFields: Array<IModalField>) => {
|
|
59
|
-
if (defaultLoaded) return
|
|
73
|
+
if (defaultLoaded) return;
|
|
60
74
|
|
|
61
|
-
modalFields.forEach(element => {
|
|
75
|
+
modalFields.forEach((element) => {
|
|
62
76
|
if (element.elementType === 'group') {
|
|
63
|
-
autoLoadGroup(element.groups)
|
|
64
|
-
return
|
|
77
|
+
autoLoadGroup(element.groups);
|
|
78
|
+
return;
|
|
65
79
|
}
|
|
66
|
-
formValueHandler(element as IFormField)
|
|
67
|
-
})
|
|
80
|
+
formValueHandler(element as IFormField);
|
|
81
|
+
});
|
|
68
82
|
|
|
69
|
-
setDefaultLoaded(true)
|
|
70
|
-
}
|
|
83
|
+
setDefaultLoaded(true);
|
|
84
|
+
};
|
|
71
85
|
|
|
72
|
-
|
|
73
86
|
const getUseSubmit = (modalConfig: IModalConfigProps): boolean => {
|
|
74
|
-
const useSubmit =
|
|
87
|
+
const useSubmit =
|
|
88
|
+
modalConfig.useSubmit === undefined
|
|
89
|
+
? true
|
|
90
|
+
: modalConfig.useSubmit === false
|
|
91
|
+
? false
|
|
92
|
+
: true;
|
|
75
93
|
|
|
76
|
-
return useSubmit
|
|
77
|
-
}
|
|
94
|
+
return useSubmit;
|
|
95
|
+
};
|
|
78
96
|
|
|
79
|
-
const getRender = (
|
|
80
|
-
|
|
97
|
+
const getRender = (
|
|
98
|
+
{ elementType, ...element }: IModalField,
|
|
99
|
+
index: number,
|
|
100
|
+
isEndOfRender: boolean = false,
|
|
101
|
+
) => {
|
|
102
|
+
if (isEndOfRender && modalReady)
|
|
103
|
+
setTimeout(() => autoLoadField(modalReady.fields), 200);
|
|
81
104
|
|
|
82
105
|
const props: IFieldProps = {
|
|
83
106
|
control,
|
|
84
107
|
watch,
|
|
85
108
|
setValue,
|
|
86
|
-
unregister
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
return elementType === 'input'
|
|
90
|
-
? <MakeInput {...props} key={`modal-input-${index}`} element={element as IMakeInput} />
|
|
91
|
-
: elementType === 'select'
|
|
92
|
-
? <MakeSelect {...props} key={`modal-select-${index}`} element={element as IMakeSelect} />
|
|
93
|
-
: elementType === 'textarea'
|
|
94
|
-
? <MakeTextarea {...props} key={`modal-textarea-${index}`} element={element as IMakeTextarea} />
|
|
95
|
-
: elementType === 'toggle'
|
|
96
|
-
? <MakeToggle {...props} key={`modal-toggle-${index}`} element={element as IMakeToggle} />
|
|
97
|
-
: elementType === 'text'
|
|
98
|
-
? <MakeDescription {...props} key={`modal-text-${index}`} element={element as IMakeDescription} />
|
|
99
|
-
: elementType === 'upload'
|
|
100
|
-
? <MakeUpload {...props} key={`modal-upload-${index}`} element={element as IMakeUpload} />
|
|
101
|
-
: elementType === 'button'
|
|
102
|
-
? <MakeButton {...props} key={`modal-button-${index}`} element={element as IMakeButton} />
|
|
103
|
-
: null
|
|
104
|
-
}
|
|
109
|
+
unregister,
|
|
110
|
+
};
|
|
105
111
|
|
|
112
|
+
return elementType === 'input' ? (
|
|
113
|
+
<MakeInput
|
|
114
|
+
{...props}
|
|
115
|
+
key={`modal-input-${index}`}
|
|
116
|
+
element={element as IMakeInput}
|
|
117
|
+
/>
|
|
118
|
+
) : elementType === 'select' ? (
|
|
119
|
+
<MakeSelect
|
|
120
|
+
{...props}
|
|
121
|
+
key={`modal-select-${index}`}
|
|
122
|
+
element={element as IMakeSelect}
|
|
123
|
+
/>
|
|
124
|
+
) : elementType === 'textarea' ? (
|
|
125
|
+
<MakeTextarea
|
|
126
|
+
{...props}
|
|
127
|
+
key={`modal-textarea-${index}`}
|
|
128
|
+
element={element as IMakeTextarea}
|
|
129
|
+
/>
|
|
130
|
+
) : elementType === 'toggle' ? (
|
|
131
|
+
<MakeToggle
|
|
132
|
+
{...props}
|
|
133
|
+
key={`modal-toggle-${index}`}
|
|
134
|
+
element={element as IMakeToggle}
|
|
135
|
+
/>
|
|
136
|
+
) : elementType === 'text' ? (
|
|
137
|
+
<MakeDescription
|
|
138
|
+
{...props}
|
|
139
|
+
key={`modal-text-${index}`}
|
|
140
|
+
element={element as IMakeDescription}
|
|
141
|
+
/>
|
|
142
|
+
) : elementType === 'upload' ? (
|
|
143
|
+
<MakeUpload
|
|
144
|
+
{...props}
|
|
145
|
+
key={`modal-upload-${index}`}
|
|
146
|
+
element={element as IMakeUpload}
|
|
147
|
+
/>
|
|
148
|
+
) : elementType === 'button' ? (
|
|
149
|
+
<MakeButton
|
|
150
|
+
{...props}
|
|
151
|
+
key={`modal-button-${index}`}
|
|
152
|
+
element={element as IMakeButton}
|
|
153
|
+
/>
|
|
154
|
+
) : null;
|
|
155
|
+
};
|
|
106
156
|
|
|
107
157
|
const closeHandler = (): void => {
|
|
108
|
-
if (modalReady?.onClose) modalReady.onClose()
|
|
109
|
-
|
|
158
|
+
if (modalReady?.onClose) modalReady.onClose();
|
|
159
|
+
|
|
110
160
|
setTimeout(() => {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
}
|
|
161
|
+
setModalReady(undefined);
|
|
162
|
+
setDefaultLoaded(false);
|
|
163
|
+
reset()
|
|
164
|
+
close();
|
|
165
|
+
}, 200);
|
|
166
|
+
};
|
|
118
167
|
|
|
119
168
|
const manualSubmit = async (): Promise<void> => {
|
|
120
|
-
const form = getValues()
|
|
121
|
-
const fields = Object.keys(form)
|
|
122
|
-
await trigger(fields)
|
|
169
|
+
const form = getValues();
|
|
170
|
+
const fields = Object.keys(form);
|
|
171
|
+
await trigger(fields);
|
|
172
|
+
|
|
173
|
+
const validations: Array<boolean> = fields.map((field) => {
|
|
174
|
+
const { invalid } = getFieldState(field);
|
|
123
175
|
|
|
124
|
-
|
|
125
|
-
|
|
176
|
+
return invalid;
|
|
177
|
+
});
|
|
126
178
|
|
|
127
|
-
|
|
128
|
-
|
|
179
|
+
const result = validations.some((isInvalid) => isInvalid)
|
|
180
|
+
? undefined
|
|
181
|
+
: form;
|
|
129
182
|
|
|
130
|
-
|
|
183
|
+
if (!result) return;
|
|
131
184
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
actionHandler({ ...(modalReady?.reservedData ?? {}), ...form })
|
|
135
|
-
}
|
|
185
|
+
actionHandler({ ...(modalReady?.reservedData ?? {}), ...form });
|
|
186
|
+
};
|
|
136
187
|
|
|
137
|
-
const actionHandler = (
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
188
|
+
const actionHandler = (
|
|
189
|
+
data: Record<string, string | number | object>,
|
|
190
|
+
): void => {
|
|
191
|
+
modalReady?.out({ ...(modalReady?.reservedData ?? {}), ...data });
|
|
192
|
+
closeHandler();
|
|
193
|
+
};
|
|
141
194
|
|
|
142
195
|
useEffect(() => {
|
|
143
|
-
if (open && !modalReady) setModalReady(config)
|
|
144
|
-
}, [config, modalReady, open])
|
|
196
|
+
if (open && !modalReady) setModalReady(config);
|
|
197
|
+
}, [config, modalReady, open]);
|
|
198
|
+
|
|
199
|
+
if(!modalReady) return null
|
|
145
200
|
|
|
146
201
|
return (
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
202
|
+
<Portal closeTime={200} portalOpen={open} portalTag={'#modal-portal'}>
|
|
203
|
+
<div
|
|
204
|
+
className="rounded bg-white relative w-auto h-auto min-h-[200px] min-w-[500px]"
|
|
205
|
+
style={modalReady.style}
|
|
206
|
+
>
|
|
207
|
+
<form
|
|
208
|
+
className="flex flex-col p-4 gap-4"
|
|
209
|
+
autoComplete="off"
|
|
210
|
+
onSubmit={handleSubmit(actionHandler)}
|
|
211
|
+
>
|
|
212
|
+
<h2 className="text-bold text-center border-b pb-4 font-semibold">
|
|
213
|
+
{modalReady.title}
|
|
214
|
+
</h2>
|
|
215
|
+
<div
|
|
216
|
+
className="flex flex-col gap-4 py-4"
|
|
217
|
+
style={{
|
|
218
|
+
overflowY: modalReady.overFlowBody ? 'auto' : undefined,
|
|
219
|
+
height: modalReady.overFlowBody,
|
|
220
|
+
minHeight: modalReady.minHeightBody,
|
|
221
|
+
}}
|
|
222
|
+
>
|
|
223
|
+
{modalReady.fields.map((element, index) => {
|
|
224
|
+
const isEndOfRender: boolean =
|
|
225
|
+
index + 1 === modalReady.fields.length;
|
|
226
|
+
|
|
227
|
+
if (element.elementType === 'group') {
|
|
228
|
+
return (
|
|
229
|
+
<div
|
|
230
|
+
key={`modal-group-${index}`}
|
|
231
|
+
className="flex flex-col w-full gap-2"
|
|
232
|
+
>
|
|
233
|
+
{element.title && (
|
|
234
|
+
<h3 className="font-bold border-b-2 pb-2 mb-2">
|
|
235
|
+
{element.title}
|
|
236
|
+
</h3>
|
|
237
|
+
)}
|
|
238
|
+
<div
|
|
239
|
+
key={`modal-group-${index}`}
|
|
240
|
+
className="flex gap-4 w-full"
|
|
241
|
+
style={element.style}
|
|
242
|
+
>
|
|
243
|
+
{element.groups
|
|
244
|
+
.filter((sub) =>
|
|
245
|
+
[
|
|
246
|
+
'input',
|
|
247
|
+
'select',
|
|
248
|
+
'toggle',
|
|
249
|
+
'multiselect',
|
|
250
|
+
'upload',
|
|
251
|
+
'button',
|
|
252
|
+
'autocomplete',
|
|
253
|
+
].includes(sub.elementType),
|
|
254
|
+
)
|
|
255
|
+
.map((sub, subIndex) =>
|
|
256
|
+
getRender(sub, index + subIndex, isEndOfRender),
|
|
257
|
+
)}
|
|
258
|
+
</div>
|
|
259
|
+
</div>
|
|
260
|
+
);
|
|
261
|
+
} else {
|
|
262
|
+
return getRender(element, index, isEndOfRender);
|
|
187
263
|
}
|
|
188
|
-
|
|
189
|
-
</
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
264
|
+
})}
|
|
265
|
+
</div>
|
|
266
|
+
<div
|
|
267
|
+
className="flex gap-4 items-center justify-center border-t p-2"
|
|
268
|
+
style={modalReady?.actions.containerStyle}
|
|
269
|
+
>
|
|
270
|
+
{modalReady.actions.cancel && (
|
|
271
|
+
<ModalButtonCancel
|
|
272
|
+
{...modalReady.actions.cancel}
|
|
273
|
+
onClick={closeHandler}
|
|
274
|
+
/>
|
|
275
|
+
)}
|
|
276
|
+
{getUseSubmit(modalReady) ? (
|
|
277
|
+
<ModalButtonAction {...modalReady.actions.action} type="submit" />
|
|
278
|
+
) : (
|
|
279
|
+
<ModalButtonAction
|
|
280
|
+
{...modalReady.actions.action}
|
|
281
|
+
onClick={manualSubmit}
|
|
282
|
+
type="button"
|
|
283
|
+
/>
|
|
284
|
+
)}
|
|
285
|
+
</div>
|
|
286
|
+
</form>
|
|
287
|
+
</div>
|
|
288
|
+
</Portal>
|
|
193
289
|
)
|
|
194
|
-
}
|
|
290
|
+
};
|
|
195
291
|
|
|
196
|
-
export default Modal
|
|
292
|
+
export default Modal;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { IOption } from '../../interfaces/option';
|
|
2
|
+
|
|
3
|
+
export const liveDataAction = async (
|
|
4
|
+
fieldData: string | number | Array<unknown>,
|
|
5
|
+
formData: Record<string, unknown>,
|
|
6
|
+
action: (data: string, ...args: any[]) => Promise<IOption[]>,
|
|
7
|
+
) => {
|
|
8
|
+
if (typeof fieldData === 'string') {
|
|
9
|
+
const options = await action(fieldData, formData);
|
|
10
|
+
return options ?? [];
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
return [] as Array<IOption>;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export const liveDataHandler = async (
|
|
17
|
+
fieldData: string | number | Array<unknown>,
|
|
18
|
+
formData: Record<string, unknown>,
|
|
19
|
+
action: (data: string, ...args: any[]) => Promise<boolean>,
|
|
20
|
+
) => {
|
|
21
|
+
if (typeof fieldData === 'string') {
|
|
22
|
+
const result = await action(fieldData, formData);
|
|
23
|
+
return result ?? false;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return false;
|
|
27
|
+
};
|
package/tsconfig.json
CHANGED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { IField, IFieldProps } from '../interfaces/field';
|
|
2
|
-
import { IOption } from '../interfaces/option';
|
|
3
|
-
import { IModalLiveDataCondition } from '../interfaces/modal';
|
|
4
|
-
export type IFormData = Record<string, unknown>;
|
|
5
|
-
export interface IWatchEvent {
|
|
6
|
-
name: string | undefined;
|
|
7
|
-
type: string | undefined;
|
|
8
|
-
}
|
|
9
|
-
export interface IFieldRender {
|
|
10
|
-
render: boolean | null;
|
|
11
|
-
enable: boolean | null;
|
|
12
|
-
checkField: (formData: IFormData, { name, type }: IWatchEvent) => void;
|
|
13
|
-
liveData?: Array<IOption>;
|
|
14
|
-
liveSearching?: boolean;
|
|
15
|
-
}
|
|
16
|
-
export interface IFieldRenderProps extends Pick<IFieldProps, 'setValue' | 'unregister'> {
|
|
17
|
-
element: Partial<Pick<IField, 'enableIf' | 'renderIf' | 'name'>> & Partial<Record<'liveData', IModalLiveDataCondition>>;
|
|
18
|
-
}
|
|
19
|
-
export type ILiveHandlerProps = Pick<IField, 'enableIf' | 'renderIf'>;
|
|
20
|
-
export declare const useFieldRender: ({ element, setValue, unregister }: IFieldRenderProps) => IFieldRender;
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
'use client';
|
|
3
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
4
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
5
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
6
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
7
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
8
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
9
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
10
|
-
});
|
|
11
|
-
};
|
|
12
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
-
exports.useFieldRender = void 0;
|
|
14
|
-
const react_1 = require("react");
|
|
15
|
-
const useFieldRender = ({ element, setValue, unregister }) => {
|
|
16
|
-
const [render, setRender] = (0, react_1.useState)(null);
|
|
17
|
-
const [enable, setEnable] = (0, react_1.useState)(null);
|
|
18
|
-
const [liveSearching, setLiveSearching] = (0, react_1.useState)(false);
|
|
19
|
-
const [liveData, setLiveData] = (0, react_1.useState)(undefined);
|
|
20
|
-
const renderCondition = (0, react_1.useMemo)(() => {
|
|
21
|
-
const isRender = element.renderIf !== undefined;
|
|
22
|
-
if (render === null)
|
|
23
|
-
setRender(!isRender);
|
|
24
|
-
return isRender;
|
|
25
|
-
}, [element.renderIf, render]);
|
|
26
|
-
const enableCondition = (0, react_1.useMemo)(() => {
|
|
27
|
-
const isEnable = element.enableIf !== undefined;
|
|
28
|
-
if (enable === null)
|
|
29
|
-
setEnable(!isEnable);
|
|
30
|
-
return isEnable;
|
|
31
|
-
}, [element.enableIf, enable]);
|
|
32
|
-
const liveDataCondition = (0, react_1.useMemo)(() => {
|
|
33
|
-
return element.liveData !== undefined;
|
|
34
|
-
}, [element.liveData]);
|
|
35
|
-
const renderConditionList = (0, react_1.useMemo)(() => {
|
|
36
|
-
return renderCondition ? Object.keys(element.renderIf) : [];
|
|
37
|
-
}, [element.renderIf, renderCondition]);
|
|
38
|
-
const enableConditionList = (0, react_1.useMemo)(() => {
|
|
39
|
-
return enableCondition ? Object.keys(element.enableIf) : [];
|
|
40
|
-
}, [enableCondition, element.enableIf]);
|
|
41
|
-
const liveDataAction = (0, react_1.useCallback)((field, formData) => __awaiter(void 0, void 0, void 0, function* () {
|
|
42
|
-
var _a;
|
|
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
|
-
return options !== null && options !== void 0 ? options : [];
|
|
46
|
-
}
|
|
47
|
-
return [];
|
|
48
|
-
}), [element.liveData]);
|
|
49
|
-
const liveDataHandler = (0, react_1.useCallback)((targetHandler, field, formData) => __awaiter(void 0, void 0, void 0, function* () {
|
|
50
|
-
var _a;
|
|
51
|
-
if (typeof field === 'string' && ((_a = element[targetHandler]) === null || _a === void 0 ? void 0 : _a.action)) {
|
|
52
|
-
const result = element[targetHandler].action(field, formData);
|
|
53
|
-
return result !== null && result !== void 0 ? result : false;
|
|
54
|
-
}
|
|
55
|
-
return false;
|
|
56
|
-
}), [element.liveData]);
|
|
57
|
-
const checkField = (0, react_1.useCallback)((formData_1, _a) => __awaiter(void 0, [formData_1, _a], void 0, function* (formData, { name }) {
|
|
58
|
-
var _b, _c, _d;
|
|
59
|
-
const key = name !== null && name !== void 0 ? name : '';
|
|
60
|
-
const targetField = formData[key];
|
|
61
|
-
if (!targetField)
|
|
62
|
-
return;
|
|
63
|
-
if (renderCondition && ((_b = element.renderIf) === null || _b === void 0 ? void 0 : _b.condition.includes(key))) {
|
|
64
|
-
const renderStatus = yield liveDataHandler('renderIf', targetField, formData);
|
|
65
|
-
if (render !== renderStatus) {
|
|
66
|
-
setRender(renderStatus);
|
|
67
|
-
if (!renderStatus)
|
|
68
|
-
unregister(element.name);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
else if (enableCondition && ((_c = element.enableIf) === null || _c === void 0 ? void 0 : _c.condition.includes(key))) {
|
|
72
|
-
const enableStatus = yield liveDataHandler('enableIf', targetField, formData);
|
|
73
|
-
if (enable !== enableStatus)
|
|
74
|
-
setEnable(enableStatus);
|
|
75
|
-
}
|
|
76
|
-
if (liveDataCondition && ((_d = element.liveData) === null || _d === void 0 ? void 0 : _d.condition.includes(key))) {
|
|
77
|
-
setLiveSearching(true);
|
|
78
|
-
const options = yield liveDataAction(targetField, formData);
|
|
79
|
-
if (liveData && JSON.stringify(liveData) !== JSON.stringify(options)) {
|
|
80
|
-
setValue(element.name, options);
|
|
81
|
-
}
|
|
82
|
-
setLiveData(options);
|
|
83
|
-
setLiveSearching(false);
|
|
84
|
-
}
|
|
85
|
-
}), [enable, enableCondition, enableConditionList, liveData, liveDataAction, liveDataCondition, render, renderCondition, renderConditionList]);
|
|
86
|
-
return {
|
|
87
|
-
render,
|
|
88
|
-
enable,
|
|
89
|
-
checkField,
|
|
90
|
-
liveData,
|
|
91
|
-
liveSearching
|
|
92
|
-
};
|
|
93
|
-
};
|
|
94
|
-
exports.useFieldRender = useFieldRender;
|
package/dist/tools/general.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const generateId: () => string;
|
package/dist/tools/general.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
'use client';
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.generateId = void 0;
|
|
5
|
-
const generateId = () => {
|
|
6
|
-
return Math.random()
|
|
7
|
-
.toString(36)
|
|
8
|
-
.split('.')[1]
|
|
9
|
-
.substring(0, 6);
|
|
10
|
-
};
|
|
11
|
-
exports.generateId = generateId;
|