dynamic-modal 1.1.19 → 1.1.21

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.
Files changed (137) hide show
  1. package/dist/components/input-upload/input-upload.js +3 -9
  2. package/dist/components/make-button/make-button.js +4 -36
  3. package/dist/components/make-custom-upload/make-custom-upload.js +5 -37
  4. package/dist/components/make-description/make-description.js +4 -9
  5. package/dist/components/make-input/make-input.js +5 -37
  6. package/dist/components/make-select/make-select.js +5 -37
  7. package/dist/components/make-table/make-table.js +12 -53
  8. package/dist/components/make-textarea/make-textarea.js +5 -37
  9. package/dist/components/make-toggle/make-toggle.js +5 -37
  10. package/dist/components/make-upload/make-upload.js +5 -37
  11. package/dist/components/make-watcher/make-watcher.js +4 -36
  12. package/dist/components/portal/portal.js +4 -36
  13. package/dist/context/component/component-state.d.ts +1 -1
  14. package/dist/context/component/component-state.js +4 -36
  15. package/dist/hooks/modal-handler.js +1 -1
  16. package/dist/hooks/use-enable-if.js +1 -1
  17. package/dist/hooks/use-live-data.js +1 -1
  18. package/dist/hooks/use-render-if.js +1 -1
  19. package/dist/index.d.ts +5 -0
  20. package/dist/index.js +4 -0
  21. package/dist/interfaces/make-description.d.ts +2 -1
  22. package/dist/modal.d.ts +1 -2
  23. package/dist/modal.js +35 -75
  24. package/dist/src/components/input-upload/input-upload.d.ts +4 -0
  25. package/dist/src/components/input-upload/input-upload.js +41 -0
  26. package/dist/src/components/make-button/make-button.d.ts +4 -0
  27. package/dist/src/components/make-button/make-button.js +14 -0
  28. package/dist/src/components/make-custom-upload/make-custom-upload.d.ts +4 -0
  29. package/dist/src/components/make-custom-upload/make-custom-upload.js +60 -0
  30. package/dist/src/components/make-description/make-description.d.ts +4 -0
  31. package/dist/src/components/make-description/make-description.js +6 -0
  32. package/dist/src/components/make-input/make-input.d.ts +4 -0
  33. package/dist/src/components/make-input/make-input.js +60 -0
  34. package/dist/src/components/make-select/make-select.d.ts +4 -0
  35. package/dist/src/components/make-select/make-select.js +78 -0
  36. package/dist/src/components/make-table/make-table.d.ts +4 -0
  37. package/dist/src/components/make-table/make-table.js +100 -0
  38. package/dist/src/components/make-textarea/make-textarea.d.ts +4 -0
  39. package/dist/src/components/make-textarea/make-textarea.js +60 -0
  40. package/dist/src/components/make-toggle/make-toggle.d.ts +4 -0
  41. package/dist/src/components/make-toggle/make-toggle.js +60 -0
  42. package/dist/src/components/make-upload/make-upload.d.ts +4 -0
  43. package/dist/src/components/make-upload/make-upload.js +59 -0
  44. package/dist/src/components/make-watcher/make-watcher.d.ts +4 -0
  45. package/dist/src/components/make-watcher/make-watcher.js +28 -0
  46. package/dist/src/components/portal/portal.d.ts +3 -0
  47. package/dist/src/components/portal/portal.js +28 -0
  48. package/dist/src/context/component/component-state.d.ts +4 -0
  49. package/dist/src/context/component/component-state.js +8 -0
  50. package/dist/src/hooks/modal-handler.d.ts +7 -0
  51. package/dist/src/hooks/modal-handler.js +25 -0
  52. package/dist/src/hooks/use-enable-if.d.ts +10 -0
  53. package/dist/src/hooks/use-enable-if.js +36 -0
  54. package/dist/src/hooks/use-live-data.d.ts +11 -0
  55. package/dist/src/hooks/use-live-data.js +23 -0
  56. package/dist/src/hooks/use-render-if.d.ts +10 -0
  57. package/dist/src/hooks/use-render-if.js +36 -0
  58. package/dist/src/interfaces/component-state.d.ts +29 -0
  59. package/dist/src/interfaces/component-state.js +1 -0
  60. package/dist/src/interfaces/custom-upload.d.ts +12 -0
  61. package/dist/src/interfaces/custom-upload.js +1 -0
  62. package/dist/src/interfaces/field.d.ts +33 -0
  63. package/dist/src/interfaces/field.js +1 -0
  64. package/dist/src/interfaces/input-upload.d.ts +19 -0
  65. package/dist/src/interfaces/input-upload.js +1 -0
  66. package/dist/src/interfaces/make-button.d.ts +20 -0
  67. package/dist/src/interfaces/make-button.js +1 -0
  68. package/{src/interfaces/make-custom-upload.ts → dist/src/interfaces/make-custom-upload.d.ts} +2 -4
  69. package/dist/src/interfaces/make-custom-upload.js +1 -0
  70. package/dist/src/interfaces/make-description.d.ts +13 -0
  71. package/dist/src/interfaces/make-description.js +1 -0
  72. package/{src/interfaces/make-field-group.ts → dist/src/interfaces/make-field-group.d.ts} +5 -8
  73. package/dist/src/interfaces/make-field-group.js +1 -0
  74. package/{src/interfaces/make-input.ts → dist/src/interfaces/make-input.d.ts} +6 -9
  75. package/dist/src/interfaces/make-input.js +1 -0
  76. package/{src/interfaces/make-select.ts → dist/src/interfaces/make-select.d.ts} +6 -8
  77. package/dist/src/interfaces/make-select.js +1 -0
  78. package/dist/src/interfaces/make-table.d.ts +26 -0
  79. package/dist/src/interfaces/make-table.js +1 -0
  80. package/{src/interfaces/make-textarea.ts → dist/src/interfaces/make-textarea.d.ts} +4 -6
  81. package/dist/src/interfaces/make-textarea.js +1 -0
  82. package/{src/interfaces/make-toggle.ts → dist/src/interfaces/make-toggle.d.ts} +2 -4
  83. package/dist/src/interfaces/make-toggle.js +1 -0
  84. package/dist/src/interfaces/make-upload.d.ts +12 -0
  85. package/dist/src/interfaces/make-upload.js +1 -0
  86. package/{src/interfaces/make-watcher.ts → dist/src/interfaces/make-watcher.d.ts} +3 -5
  87. package/dist/src/interfaces/make-watcher.js +1 -0
  88. package/dist/src/interfaces/modal.d.ts +48 -0
  89. package/dist/src/interfaces/modal.js +1 -0
  90. package/dist/src/interfaces/option.d.ts +4 -0
  91. package/dist/src/interfaces/option.js +1 -0
  92. package/dist/src/interfaces/portal.d.ts +8 -0
  93. package/dist/src/interfaces/portal.js +1 -0
  94. package/dist/src/modal.d.ts +3 -0
  95. package/dist/src/modal.js +135 -0
  96. package/dist/src/util/general/general.util.d.ts +3 -0
  97. package/dist/src/util/general/general.util.js +15 -0
  98. package/dist/util/general/general.util.js +1 -1
  99. package/package.json +20 -2
  100. package/README-ES.md +0 -217
  101. package/eslint.config.mjs +0 -72
  102. package/examples/enable-if.ts +0 -128
  103. package/examples/live-data.ts +0 -61
  104. package/examples/render-if.ts +0 -129
  105. package/examples/simple.ts +0 -75
  106. package/index.ts +0 -5
  107. package/src/components/input-upload/input-upload.tsx +0 -82
  108. package/src/components/make-button/make-button.tsx +0 -25
  109. package/src/components/make-custom-upload/make-custom-upload.tsx +0 -100
  110. package/src/components/make-description/make-description.tsx +0 -21
  111. package/src/components/make-input/make-input.tsx +0 -100
  112. package/src/components/make-select/make-select.tsx +0 -125
  113. package/src/components/make-table/make-table.tsx +0 -201
  114. package/src/components/make-textarea/make-textarea.tsx +0 -100
  115. package/src/components/make-toggle/make-toggle.tsx +0 -100
  116. package/src/components/make-upload/make-upload.tsx +0 -92
  117. package/src/components/make-watcher/make-watcher.tsx +0 -49
  118. package/src/components/portal/portal.tsx +0 -41
  119. package/src/context/component/component-state.tsx +0 -25
  120. package/src/hooks/modal-handler.ts +0 -41
  121. package/src/hooks/use-enable-if.ts +0 -68
  122. package/src/hooks/use-live-data.ts +0 -47
  123. package/src/hooks/use-render-if.ts +0 -69
  124. package/src/interfaces/component-state.ts +0 -55
  125. package/src/interfaces/custom-upload.ts +0 -13
  126. package/src/interfaces/field.ts +0 -43
  127. package/src/interfaces/input-upload.ts +0 -23
  128. package/src/interfaces/make-button.ts +0 -23
  129. package/src/interfaces/make-description.ts +0 -15
  130. package/src/interfaces/make-table.ts +0 -29
  131. package/src/interfaces/make-upload.ts +0 -14
  132. package/src/interfaces/modal.ts +0 -75
  133. package/src/interfaces/option.ts +0 -4
  134. package/src/interfaces/portal.ts +0 -9
  135. package/src/modal.tsx +0 -331
  136. package/src/util/general/general.util.ts +0 -29
  137. package/tsconfig.json +0 -13
@@ -0,0 +1,19 @@
1
+ import { ChangeEvent, CSSProperties } from 'react';
2
+ export interface IFileResult {
3
+ name: string;
4
+ size: number;
5
+ data: string;
6
+ }
7
+ export interface IInputUpload {
8
+ id?: string;
9
+ value?: string;
10
+ onChange: (event: ChangeEvent<HTMLInputElement> | IFileResult | FileList | null) => void;
11
+ accept?: string;
12
+ label?: string;
13
+ helpText?: string;
14
+ style?: CSSProperties;
15
+ readAsArrayBuffer?: boolean;
16
+ name: string;
17
+ disabled?: boolean;
18
+ read?: boolean;
19
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,20 @@
1
+ import { CSSProperties, ReactNode } from 'react';
2
+ import { IFieldProps } from './field';
3
+ import { FieldValues, UseFormGetValues } from 'react-hook-form';
4
+ export interface IMakeButton {
5
+ id?: string;
6
+ elementType: 'button';
7
+ disabled?: boolean;
8
+ className?: string;
9
+ style?: CSSProperties;
10
+ variant?: string;
11
+ text?: string;
12
+ type?: 'button' | 'submit' | 'reset';
13
+ onClick?: (formData: FieldValues) => void;
14
+ color?: string;
15
+ children?: ReactNode;
16
+ }
17
+ export interface IMakeButtonProps extends IFieldProps {
18
+ element: Omit<IMakeButton, 'elementType'>;
19
+ getValues: UseFormGetValues<FieldValues>;
20
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,9 +1,7 @@
1
1
  import { IField, IFieldProps } from './field';
2
-
3
2
  export interface IMakeCustomUpload extends IField {
4
- elementType: 'custom-upload';
3
+ elementType: 'custom-upload';
5
4
  }
6
-
7
5
  export interface IMakeCustomUploadProps extends IFieldProps {
8
- element: Omit<IMakeCustomUpload, 'elementType'>;
6
+ element: Omit<IMakeCustomUpload, 'elementType'>;
9
7
  }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,13 @@
1
+ import { CSSProperties, FC } from 'react';
2
+ import { IFieldProps } from './field';
3
+ export interface IMakeDescription {
4
+ elementType: 'text';
5
+ text?: string;
6
+ containerStyle?: CSSProperties;
7
+ textStyle?: CSSProperties;
8
+ Icon?: FC;
9
+ elements?: Array<Record<'text', string> & Record<'style', CSSProperties>>;
10
+ }
11
+ export interface IMakeDescriptionProps extends IFieldProps {
12
+ element: Omit<IMakeDescription, 'elementType'>;
13
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,15 +1,12 @@
1
1
  import { CSSProperties } from 'react';
2
-
3
2
  import { IFieldProps } from './field';
4
3
  import { IModalField } from './modal';
5
-
6
4
  export interface IMakeFieldGroup {
7
- elementType: 'group';
8
- groups: Array<IModalField>;
9
- style?: CSSProperties;
10
- title?: string;
5
+ elementType: 'group';
6
+ groups: Array<IModalField>;
7
+ style?: CSSProperties;
8
+ title?: string;
11
9
  }
12
-
13
10
  export interface IMakeFieldGroupProps extends IFieldProps {
14
- element: IMakeFieldGroup;
11
+ element: IMakeFieldGroup;
15
12
  }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,15 +1,12 @@
1
1
  import { HTMLInputTypeAttribute } from 'react';
2
-
3
2
  import { IField, IFieldProps } from './field';
4
-
5
3
  export interface IMakeInput extends IField {
6
- elementType: 'input';
7
- placeholder?: string;
8
- min?: string;
9
- max?: string;
10
- type?: HTMLInputTypeAttribute;
4
+ elementType: 'input';
5
+ placeholder?: string;
6
+ min?: string;
7
+ max?: string;
8
+ type?: HTMLInputTypeAttribute;
11
9
  }
12
-
13
10
  export interface IMakeInputProps extends IFieldProps {
14
- element: Omit<IMakeInput, 'elementType'>;
11
+ element: Omit<IMakeInput, 'elementType'>;
15
12
  }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,15 +1,13 @@
1
1
  import { IField, IFieldProps } from './field';
2
2
  import { IModalLiveDataCondition } from './modal';
3
3
  import { IOption } from './option';
4
-
5
4
  export interface IMakeSelect extends IField {
6
- elementType: 'select';
7
- options: Array<IOption>;
8
- liveData?: IModalLiveDataCondition;
9
- isSearch?: boolean;
10
- isMulti?: boolean;
5
+ elementType: 'select';
6
+ options: Array<IOption>;
7
+ liveData?: IModalLiveDataCondition;
8
+ isSearch?: boolean;
9
+ isMulti?: boolean;
11
10
  }
12
-
13
11
  export interface IMakeSelectProps extends IFieldProps {
14
- element: Omit<IMakeSelect, 'elementType'>;
12
+ element: Omit<IMakeSelect, 'elementType'>;
15
13
  }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,26 @@
1
+ import { CSSProperties, JSX } from 'react';
2
+ import { IField, IFieldProps } from './field';
3
+ import { IModalLiveDataCondition } from './modal';
4
+ export interface ITableColumn extends Pick<IField, 'style'> {
5
+ title: string;
6
+ key?: string;
7
+ isButton?: boolean;
8
+ isDeleteAction?: boolean;
9
+ Icon?: (props: any) => JSX.Element;
10
+ action?: (row: any) => void;
11
+ }
12
+ export interface IMakeTable extends Omit<IField, 'label' | 'defaultValue' | 'validation' | 'disabled' | 'enableIf' | 'id'> {
13
+ elementType: 'table';
14
+ selectValueName: string;
15
+ selectTitleName: string;
16
+ selectPlaceholder?: string;
17
+ selectActionName: string;
18
+ buttonStyle?: CSSProperties;
19
+ columns: Array<ITableColumn>;
20
+ defaultSelected?: Array<string>;
21
+ data: Array<any>;
22
+ liveData?: IModalLiveDataCondition;
23
+ }
24
+ export interface IMakeTableProps extends Omit<IFieldProps, 'unregister'> {
25
+ element: Omit<IMakeTable, 'elementType'>;
26
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,11 +1,9 @@
1
1
  import { IField, IFieldProps } from './field';
2
-
3
2
  export interface IMakeTextarea extends IField {
4
- elementType: 'textarea';
5
- cols?: number;
6
- rows?: number;
3
+ elementType: 'textarea';
4
+ cols?: number;
5
+ rows?: number;
7
6
  }
8
-
9
7
  export interface IMakeTextareaProps extends IFieldProps {
10
- element: Omit<IMakeTextarea, 'elementType'>;
8
+ element: Omit<IMakeTextarea, 'elementType'>;
11
9
  }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,9 +1,7 @@
1
1
  import { IField, IFieldProps } from './field';
2
-
3
2
  export interface IMakeToggle extends IField {
4
- elementType: 'toggle';
3
+ elementType: 'toggle';
5
4
  }
6
-
7
5
  export interface IMakeToggleProps extends IFieldProps {
8
- element: Omit<IMakeToggle, 'elementType'>;
6
+ element: Omit<IMakeToggle, 'elementType'>;
9
7
  }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,12 @@
1
+ import { IField, IFieldProps } from './field';
2
+ export interface IMakeUpload extends Omit<IField, 'defaultValue'> {
3
+ elementType: 'upload';
4
+ helpText?: string;
5
+ read: boolean;
6
+ image?: boolean;
7
+ accept?: string;
8
+ readAsArrayBuffer?: boolean;
9
+ }
10
+ export interface IMakeUploadProps extends IFieldProps {
11
+ element: Omit<IMakeUpload, 'elementType'>;
12
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,10 +1,8 @@
1
1
  import { IField, IFieldProps } from './field';
2
-
3
2
  export interface IMakeWatcher extends Pick<IField, 'style' | 'label'> {
4
- elementType: 'watcher';
5
- watchList: Array<string>;
3
+ elementType: 'watcher';
4
+ watchList: Array<string>;
6
5
  }
7
-
8
6
  export interface IMakeWatcherProps extends IFieldProps {
9
- element: Omit<IMakeWatcher, 'elementType'>;
7
+ element: Omit<IMakeWatcher, 'elementType'>;
10
8
  }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,48 @@
1
+ import { CSSProperties } from 'react';
2
+ import { IMakeSelect } from './make-select';
3
+ import { IMakeInput } from './make-input';
4
+ import { IMakeTextarea } from './make-textarea';
5
+ import { IMakeToggle } from './make-toggle';
6
+ import { IMakeDescription } from './make-description';
7
+ import { IMakeFieldGroup } from './make-field-group';
8
+ import { IMakeUpload } from './make-upload';
9
+ import { IOption } from './option';
10
+ import { IMakeButton } from './make-button';
11
+ import { IMakeCustomUpload } from './make-custom-upload';
12
+ import { IMakeWatcher } from './make-watcher';
13
+ import { IMakeTable } from './make-table';
14
+ export type IModalField = IMakeSelect | IMakeInput | IMakeFieldGroup | IMakeTextarea | IMakeToggle | IMakeDescription | IMakeUpload | IMakeCustomUpload | IMakeWatcher | IMakeButton | IMakeTable;
15
+ export type IFormField = IMakeSelect | IMakeInput | IMakeTextarea | IMakeToggle;
16
+ export interface IModalRenderAction {
17
+ action: (data: string, ...args: any[]) => Promise<boolean>;
18
+ condition: Array<string>;
19
+ }
20
+ export type IModalRenderCriteria = Record<string, Array<string | number | boolean> | undefined>;
21
+ export type IModalRenderCondition = IModalRenderAction | IModalRenderCriteria;
22
+ export type IModalLiveDataCondition = {
23
+ action: (data: string, ...args: any[]) => Promise<Array<IOption>>;
24
+ condition: Array<string>;
25
+ };
26
+ export interface IModalConfigProps {
27
+ reservedData?: Record<string, any>;
28
+ title: string;
29
+ fields: Array<IModalField>;
30
+ out: (data: any) => void;
31
+ onClose?: () => void;
32
+ style?: CSSProperties;
33
+ overFlowBody?: string | number;
34
+ minHeightBody?: string | number;
35
+ useSubmit?: boolean;
36
+ useBlur?: boolean;
37
+ actions: {
38
+ containerStyle?: CSSProperties;
39
+ cancel?: Omit<IMakeButton, 'elementType'>;
40
+ action: Omit<IMakeButton, 'elementType'>;
41
+ };
42
+ }
43
+ export type IModalConfigLoader<T = any, D = any> = (props: T, action: (modalResult: D) => void) => IModalConfigProps;
44
+ export interface IModal {
45
+ open: boolean;
46
+ close: () => void;
47
+ config: IModalConfigProps;
48
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,4 @@
1
+ export interface IOption {
2
+ id: string;
3
+ name: string;
4
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,8 @@
1
+ import { ReactNode } from 'react';
2
+ export interface IPortal {
3
+ children: ReactNode;
4
+ closeTime: number;
5
+ portalOpen: boolean;
6
+ portalTag?: string;
7
+ useBlur?: boolean;
8
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ import { IModal } from './interfaces/modal';
2
+ export declare const Modal: ({ open, close, config }: IModal) => import("react/jsx-runtime").JSX.Element | null;
3
+ export default Modal;
@@ -0,0 +1,135 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { createElement as _createElement } from "react";
4
+ import { useContext, useEffect, useState } from 'react';
5
+ import { useForm } from 'react-hook-form';
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 MakeDescription from './components/make-description/make-description';
12
+ import MakeUpload from './components/make-upload/make-upload';
13
+ import MakeButton from './components/make-button/make-button';
14
+ import { ComponentStateContext } from './context/component/component-state';
15
+ import MakeCustomUpload from './components/make-custom-upload/make-custom-upload';
16
+ import MakeWatcher from './components/make-watcher/make-watcher';
17
+ import MakeTable from './components/make-table/make-table';
18
+ export const Modal = ({ open, close, config }) => {
19
+ const { ModalButtonAction, ModalButtonCancel } = useContext(ComponentStateContext);
20
+ const [modalReady, setModalReady] = useState(undefined);
21
+ const [defaultLoaded, setDefaultLoaded] = useState(false);
22
+ const { control, handleSubmit, getValues, unregister, setValue, watch, trigger, reset, getFieldState, } = useForm();
23
+ const formValueHandler = (element) => {
24
+ if ([
25
+ 'group',
26
+ 'upload',
27
+ 'custom-upload',
28
+ 'text',
29
+ 'description',
30
+ 'watcher',
31
+ 'table',
32
+ ].includes(element.elementType))
33
+ return;
34
+ if (!element.defaultValue && element.renderIf) {
35
+ unregister(element.name);
36
+ return;
37
+ }
38
+ const defaultValue = element.defaultValue ?? '';
39
+ const parsedValue = defaultValue === 'true'
40
+ ? true
41
+ : defaultValue === 'false'
42
+ ? false
43
+ : defaultValue;
44
+ setValue(element.name, parsedValue ?? '');
45
+ };
46
+ const autoLoadGroup = (groupFields) => {
47
+ groupFields.forEach((element) => {
48
+ formValueHandler(element);
49
+ });
50
+ };
51
+ const autoLoadField = (modalFields) => {
52
+ if (defaultLoaded)
53
+ return;
54
+ modalFields.forEach((element) => {
55
+ if (element.elementType === 'group') {
56
+ autoLoadGroup(element.groups);
57
+ return;
58
+ }
59
+ formValueHandler(element);
60
+ });
61
+ setDefaultLoaded(true);
62
+ };
63
+ const getUseSubmit = (modalConfig) => {
64
+ const useSubmit = modalConfig.useSubmit === undefined
65
+ ? true
66
+ : modalConfig.useSubmit === false
67
+ ? false
68
+ : true;
69
+ return useSubmit;
70
+ };
71
+ const getRender = ({ elementType, ...element }, index, isEndOfRender = false) => {
72
+ if (isEndOfRender && modalReady)
73
+ setTimeout(() => autoLoadField(modalReady.fields), 200);
74
+ const props = {
75
+ control,
76
+ watch,
77
+ setValue,
78
+ unregister,
79
+ };
80
+ return elementType === 'input' ? (_createElement(MakeInput, { ...props, key: `modal-input-${index}`, element: element })) : elementType === 'select' ? (_createElement(MakeSelect, { ...props, key: `modal-select-${index}`, element: element })) : elementType === 'textarea' ? (_createElement(MakeTextarea, { ...props, key: `modal-textarea-${index}`, element: element })) : elementType === 'toggle' ? (_createElement(MakeToggle, { ...props, key: `modal-toggle-${index}`, element: element })) : elementType === 'text' ? (_createElement(MakeDescription, { ...props, key: `modal-text-${index}`, element: element })) : elementType === 'upload' ? (_createElement(MakeUpload, { ...props, key: `modal-upload-${index}`, element: element })) : elementType === 'custom-upload' ? (_createElement(MakeCustomUpload, { ...props, key: `modal-custom-upload-${index}`, element: element })) : elementType === 'watcher' ? (_createElement(MakeWatcher, { ...props, key: `modal-watcher-${index}`, element: element })) : elementType === 'button' ? (_createElement(MakeButton, { ...props, key: `modal-button-${index}`, element: element, getValues: getValues })) : elementType === 'table' ? (_createElement(MakeTable, { ...props, key: `modal-table-${index}`, element: element })) : null;
81
+ };
82
+ const closeHandler = () => {
83
+ if (modalReady?.onClose)
84
+ modalReady.onClose();
85
+ setTimeout(() => {
86
+ setModalReady(undefined);
87
+ setDefaultLoaded(false);
88
+ reset();
89
+ close();
90
+ }, 200);
91
+ };
92
+ const manualSubmit = async () => {
93
+ const form = getValues();
94
+ const fields = Object.keys(form);
95
+ await trigger(fields);
96
+ const validations = fields.map((field) => {
97
+ const { invalid } = getFieldState(field);
98
+ return invalid;
99
+ });
100
+ const result = validations.some((isInvalid) => isInvalid)
101
+ ? undefined
102
+ : form;
103
+ if (!result)
104
+ return;
105
+ actionHandler({ ...(modalReady?.reservedData ?? {}), ...form });
106
+ };
107
+ const actionHandler = (data) => {
108
+ modalReady?.out({ ...(modalReady?.reservedData ?? {}), ...data });
109
+ closeHandler();
110
+ };
111
+ useEffect(() => {
112
+ if (open && !modalReady)
113
+ setModalReady(config);
114
+ }, [config, modalReady, open]);
115
+ if (!modalReady)
116
+ return null;
117
+ return (_jsx(Portal, { closeTime: 200, portalOpen: open, portalTag: '#modal-portal', useBlur: modalReady.useBlur, children: _jsx("div", { className: `rounded bg-white relative w-auto h-auto min-h-[200px] min-w-[500px] ${modalReady.useBlur && 'shadow-md border border-gray-200'}`, style: modalReady.style, children: _jsxs("form", { className: "flex flex-col p-4 gap-4", autoComplete: "off", onSubmit: handleSubmit(actionHandler), children: [_jsx("h2", { className: "text-bold text-center border-b pb-4 font-semibold", children: modalReady.title }), _jsx("div", { className: "flex flex-col gap-4 py-4", style: {
118
+ overflowY: modalReady.overFlowBody ? 'auto' : undefined,
119
+ height: modalReady.overFlowBody,
120
+ minHeight: modalReady.minHeightBody,
121
+ }, children: modalReady.fields.map((element, index) => {
122
+ const isEndOfRender = index + 1 === modalReady.fields.length;
123
+ if (element.elementType === 'group') {
124
+ const groupElements = element.groups
125
+ .filter((sub) => !['group', 'watcher', 'table'].includes(sub.elementType))
126
+ .map((sub, subIndex) => getRender(sub, index + subIndex, isEndOfRender));
127
+ const hideDiv = groupElements.filter((render) => render).length === 0;
128
+ return (_jsxs("div", { className: `flex flex-col w-full gap-2 ${hideDiv && 'hidden'}`, children: [element.title && (_jsx("h3", { className: "font-bold border-b-2 pb-2 mb-2", children: element.title })), _jsx("div", { className: "flex gap-4 w-full", style: element.style, children: groupElements.map((component) => component) })] }, `modal-group-${index}`));
129
+ }
130
+ else {
131
+ return getRender(element, index, isEndOfRender);
132
+ }
133
+ }) }), _jsxs("div", { className: "flex gap-4 items-center justify-center border-t p-2", style: modalReady?.actions.containerStyle, children: [modalReady.actions.cancel && (_jsx(ModalButtonCancel, { ...modalReady.actions.cancel, onClick: closeHandler })), getUseSubmit(modalReady) ? (_jsx(ModalButtonAction, { ...modalReady.actions.action, type: "submit" })) : (_jsx(ModalButtonAction, { ...modalReady.actions.action, onClick: manualSubmit, type: "button" }))] })] }) }) }));
134
+ };
135
+ export default Modal;
@@ -0,0 +1,3 @@
1
+ import { IOption } from '../../interfaces/option';
2
+ export declare const liveDataAction: (fieldData: string | number | Array<unknown>, formData: Record<string, unknown>, action: (data: string, ...args: any[]) => Promise<IOption[]>) => Promise<IOption[]>;
3
+ export declare const liveDataHandler: (fieldData: string | number | Array<unknown>, formData: Record<string, unknown>, action: (data: string, ...args: any[]) => Promise<boolean>) => Promise<boolean>;
@@ -0,0 +1,15 @@
1
+ 'use client';
2
+ export const liveDataAction = async (fieldData, formData, action) => {
3
+ if (typeof fieldData === 'string') {
4
+ const options = await action(fieldData, formData);
5
+ return options ?? [];
6
+ }
7
+ return [];
8
+ };
9
+ export const liveDataHandler = async (fieldData, formData, action) => {
10
+ if (typeof fieldData === 'string') {
11
+ const result = await action(fieldData, formData);
12
+ return result ?? false;
13
+ }
14
+ return false;
15
+ };
@@ -1,5 +1,5 @@
1
- "use strict";
2
1
  'use client';
2
+ "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.liveDataHandler = exports.liveDataAction = void 0;
5
5
  const liveDataAction = async (fieldData, formData, action) => {
package/package.json CHANGED
@@ -1,8 +1,21 @@
1
1
  {
2
2
  "name": "dynamic-modal",
3
- "version": "1.1.19",
3
+ "version": "1.1.21",
4
4
  "description": "The dynamic-modal is a solution of creation different modals into project using a json configuration file",
5
- "main": "index.js",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/index.js",
12
+ "require": "./dist/index.js",
13
+ "types": "./dist/index.d.ts"
14
+ },
15
+ "./package.json": "./package.json"
16
+ },
17
+ "sideEffects": false,
18
+ "files": ["dist"],
6
19
  "scripts": {
7
20
  "build": "tsc",
8
21
  "lint": "eslint .",
@@ -44,5 +57,10 @@
44
57
  "react": "^19.0.0",
45
58
  "react-dom": "^19.0.0",
46
59
  "react-hook-form": "^7.54.2"
60
+ },
61
+ "peerDependencies": {
62
+ "react": "^18.0.0 || ^19.0.0",
63
+ "react-dom": "^18.0.0 || ^19.0.0",
64
+ "react-hook-form": "^7.54.2"
47
65
  }
48
66
  }