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
- const fieldValidValue = targetField !== undefined && targetField !== null && targetField !== '';
54
- if (renderCondition && renderConditionList.includes(key) && fieldValidValue) {
55
- const renderStatus = element.renderIf[key].includes(targetField) || element.renderIf[key].includes('*');
56
- if (render !== renderStatus) {
57
- setRender(renderStatus);
58
- if (!renderStatus)
59
- unregister(element.name);
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 && enableConditionList.includes(key) && fieldValidValue) {
63
- const enableStatus = element.enableIf[key].includes(targetField) || element.enableIf[key].includes('*');
64
- if (enable !== enableStatus)
65
- setEnable(enableStatus);
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
- if (targetField) {
69
- setLiveSearching(true);
70
- const options = yield liveDataAction(targetField, formData);
71
- if (liveData && JSON.stringify(liveData) !== JSON.stringify(options)) {
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 type IModalRenderCondition = Record<string, Array<string | number | boolean> | undefined>;
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dynamic-modal",
3
- "version": "1.1.7",
3
+ "version": "1.1.9",
4
4
  "description": "The dynamic-modal is a solution of creation different modals into project using a json configuration file",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -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
- const fieldValidValue: boolean = targetField !== undefined && targetField !== null && targetField !== ''
78
-
79
- if (renderCondition && renderConditionList.includes(key) && fieldValidValue) {
80
- const renderStatus: boolean = (element.renderIf as IModalRenderCondition)[key]!.includes(targetField) || (element.renderIf as IModalRenderCondition)[key]!.includes('*')
81
- if (render !== renderStatus) {
82
- setRender(renderStatus)
83
- if(!renderStatus) unregister(element.name as string)
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
- if (targetField) {
92
- setLiveSearching(true)
93
- const options: Array<IOption> = await liveDataAction(targetField, formData)
94
- if (liveData && JSON.stringify(liveData) !== JSON.stringify(options)) { setValue(element.name as string, options) }
95
- setLiveData(options)
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
  )
@@ -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 type IModalRenderCondition = Record<string, Array<string | number | boolean> | undefined>
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>>