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.
@@ -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: (props: IFieldRenderProps) => IFieldRender;
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 = (props) => {
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 = props.element.renderIf !== undefined;
21
+ const isRender = element.renderIf !== undefined;
22
22
  if (render === null)
23
23
  setRender(!isRender);
24
24
  return isRender;
25
- }, [props.element.renderIf, render]);
25
+ }, [element.renderIf, render]);
26
26
  const enableCondition = (0, react_1.useMemo)(() => {
27
- const isEnable = props.element.enableIf !== undefined;
27
+ const isEnable = element.enableIf !== undefined;
28
28
  if (enable === null)
29
29
  setEnable(!isEnable);
30
30
  return isEnable;
31
- }, [props.element.enableIf, enable]);
31
+ }, [element.enableIf, enable]);
32
32
  const liveDataCondition = (0, react_1.useMemo)(() => {
33
- return props.element.liveData !== undefined;
34
- }, [props.element.liveData]);
33
+ return element.liveData !== undefined;
34
+ }, [element.liveData]);
35
35
  const renderConditionList = (0, react_1.useMemo)(() => {
36
- return renderCondition ? Object.keys(props.element.renderIf) : [];
37
- }, [props.element.renderIf, renderCondition]);
36
+ return renderCondition ? Object.keys(element.renderIf) : [];
37
+ }, [element.renderIf, renderCondition]);
38
38
  const enableConditionList = (0, react_1.useMemo)(() => {
39
- return enableCondition ? Object.keys(props.element.enableIf) : [];
40
- }, [enableCondition, props.element.enableIf]);
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 = props.element.liveData) === null || _a === void 0 ? void 0 : _a.action)) {
44
- const options = props.element.liveData.action(field, formData);
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
- }), [props.element.liveData]);
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 = props.element.renderIf[key].includes(targetField) || props.element.renderIf[key].includes('*');
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 = props.element.enableIf[key].includes(targetField) || props.element.enableIf[key].includes('');
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 = props.element.liveData) === null || _b === void 0 ? void 0 : _b.condition.includes(key))) {
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
- props.setValue(props.element.name, options);
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, props, render, renderCondition, renderConditionList]);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dynamic-modal",
3
- "version": "1.0.9",
3
+ "version": "1.0.11",
4
4
  "description": "The dynamic-modal is a solution of creation differents modals into project using a json configuration file",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -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 = (props: IFieldRenderProps): IFieldRender => {
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 = props.element.renderIf !== undefined
34
+ const isRender: boolean = element.renderIf !== undefined
35
35
  if (render === null) setRender(!isRender)
36
36
  return isRender
37
- }, [props.element.renderIf, render]
37
+ }, [element.renderIf, render]
38
38
  )
39
39
 
40
40
  const enableCondition = useMemo<boolean>(
41
41
  () => {
42
- const isEnable: boolean = props.element.enableIf !== undefined
42
+ const isEnable: boolean = element.enableIf !== undefined
43
43
  if (enable === null) setEnable(!isEnable)
44
44
  return isEnable
45
- }, [props.element.enableIf, enable]
45
+ }, [element.enableIf, enable]
46
46
  )
47
47
 
48
48
  const liveDataCondition = useMemo<boolean>(
49
49
  () => {
50
- return props.element.liveData !== undefined
51
- }, [props.element.liveData]
50
+ return element.liveData !== undefined
51
+ }, [element.liveData]
52
52
  )
53
53
 
54
54
  const renderConditionList: Array<string> = useMemo(() => {
55
- return renderCondition ? Object.keys(props.element.renderIf as IModalRenderCondition) : []
56
- }, [props.element.renderIf, renderCondition])
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(props.element.enableIf as IModalRenderCondition) : []
60
- }, [enableCondition, props.element.enableIf])
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' && props.element.liveData?.action) {
65
- const options = props.element.liveData.action(field, formData)
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
- }, [props.element.liveData]
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 = (props.element.renderIf as IModalRenderCondition)[key].includes(targetField) || (props.element.renderIf as IModalRenderCondition)[key].includes('*')
80
- if (render !== renderStatus) setRender(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 = (props.element.enableIf as IModalRenderCondition)[key].includes(targetField) || (props.element.enableIf as IModalRenderCondition)[key].includes('')
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 && props.element.liveData?.condition.includes(key)) {
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)) { props.setValue(props.element.name as string, 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, props, render, renderCondition, renderConditionList]
98
+ }, [enable, enableCondition, enableConditionList, liveData, liveDataAction, liveDataCondition, render, renderCondition, renderConditionList]
96
99
  )
97
100
 
98
101
  return {
@@ -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
  }
@@ -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>>;
package/src/modal.tsx CHANGED
@@ -66,7 +66,8 @@ export const Modal = ({ open, close, config }: IModal) => {
66
66
  const props: IFieldProps = {
67
67
  control,
68
68
  watch,
69
- setValue
69
+ setValue,
70
+ unregister
70
71
  }
71
72
 
72
73
  return element.elementType === 'input'