dynamic-modal 1.1.1 → 1.1.4
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 +1 -0
- package/dist/components/make-input/make-input.js +2 -2
- package/dist/components/make-select/make-select.js +2 -2
- package/dist/components/make-textarea/make-textarea.js +2 -2
- package/dist/components/make-toggle/make-toggle.js +2 -2
- package/dist/components/make-upload/make-upload.js +2 -2
- package/dist/hooks/field-render.js +1 -1
- package/dist/interfaces/field.d.ts +3 -2
- package/dist/interfaces/make-select.d.ts +2 -1
- package/dist/interfaces/modal.d.ts +1 -1
- package/package.json +1 -1
- package/src/components/make-input/make-input.tsx +2 -2
- package/src/components/make-select/make-select.tsx +2 -2
- package/src/components/make-textarea/make-textarea.tsx +2 -2
- package/src/components/make-toggle/make-toggle.tsx +2 -2
- package/src/components/make-upload/make-upload.tsx +2 -2
- package/src/hooks/field-render.ts +5 -5
- package/src/interfaces/field.ts +3 -2
- package/src/interfaces/make-select.ts +2 -1
- package/src/interfaces/modal.ts +2 -1
package/README.md
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# dynamic-modal
|
|
2
2
|
|
|
3
|
+
<<<<<<< README.md
|
|
3
4
|
`dynamic-modal` is a TypeScript library for creating reusable modals in React and Next.js applications. It uses JSON objects to configure the modal structure, eliminating the need to write HTML. This approach simplifies modal creation and customization, allowing you to open and close modals using a custom hook.
|
|
4
5
|
|
|
5
6
|
## Requirements
|
|
@@ -52,9 +52,9 @@ const component_state_1 = require("../../context/component/component-state");
|
|
|
52
52
|
const general_1 = require("../../tools/general");
|
|
53
53
|
const MakeInput = (_a) => {
|
|
54
54
|
var _b, _c;
|
|
55
|
-
var _d = _a.element, _e = _d.validation, { required } = _e, validation = __rest(_e, ["required"]), element = __rest(_d, ["validation"]), props = __rest(_a, ["element"]);
|
|
55
|
+
var _d = _a.element, _e = _d.validation, { required } = _e, validation = __rest(_e, ["required"]), { enableIf, renderIf } = _d, element = __rest(_d, ["validation", "enableIf", "renderIf"]), props = __rest(_a, ["element"]);
|
|
56
56
|
const { Input } = (0, react_1.useContext)(component_state_1.ComponentStateContext);
|
|
57
|
-
const { render, enable, checkField } = (0, field_render_1.useFieldRender)(Object.assign(Object.assign({}, props), { element }));
|
|
57
|
+
const { render, enable, checkField } = (0, field_render_1.useFieldRender)(Object.assign(Object.assign({}, props), { element: Object.assign({ enableIf, renderIf }, element) }));
|
|
58
58
|
const elementId = (0, react_1.useMemo)(() => { var _a; return (_a = element.id) !== null && _a !== void 0 ? _a : (0, general_1.generateId)(); }, []);
|
|
59
59
|
(0, react_1.useEffect)(() => {
|
|
60
60
|
const subscription = props.watch((value, { name, type }) => checkField(value, { name, type }));
|
|
@@ -52,9 +52,9 @@ const general_1 = require("../../tools/general");
|
|
|
52
52
|
const component_state_1 = require("../../context/component/component-state");
|
|
53
53
|
const MakeSelect = (_a) => {
|
|
54
54
|
var _b, _c;
|
|
55
|
-
var _d = _a.element, _e = _d.validation, { required } = _e, validation = __rest(_e, ["required"]), element = __rest(_d, ["validation"]), props = __rest(_a, ["element"]);
|
|
55
|
+
var _d = _a.element, _e = _d.validation, { required } = _e, validation = __rest(_e, ["required"]), { enableIf, renderIf } = _d, element = __rest(_d, ["validation", "enableIf", "renderIf"]), props = __rest(_a, ["element"]);
|
|
56
56
|
const { Select } = (0, react_1.useContext)(component_state_1.ComponentStateContext);
|
|
57
|
-
const { render, enable, checkField, liveData, liveSearching } = (0, field_render_1.useFieldRender)(Object.assign(Object.assign({}, props), { element }));
|
|
57
|
+
const { render, enable, checkField, liveData, liveSearching } = (0, field_render_1.useFieldRender)(Object.assign(Object.assign({}, props), { element: Object.assign({ renderIf, enableIf }, element) }));
|
|
58
58
|
const elementId = (0, react_1.useMemo)(() => { var _a; return (_a = element.id) !== null && _a !== void 0 ? _a : (0, general_1.generateId)(); }, []);
|
|
59
59
|
(0, react_1.useEffect)(() => {
|
|
60
60
|
const subscription = props.watch((value, { name, type }) => checkField(value, { name, type }));
|
|
@@ -52,9 +52,9 @@ const general_1 = require("../../tools/general");
|
|
|
52
52
|
const component_state_1 = require("../../context/component/component-state");
|
|
53
53
|
const MakeTextarea = (_a) => {
|
|
54
54
|
var _b, _c;
|
|
55
|
-
var _d = _a.element, _e = _d.validation, { required } = _e, validation = __rest(_e, ["required"]), element = __rest(_d, ["validation"]), props = __rest(_a, ["element"]);
|
|
55
|
+
var _d = _a.element, _e = _d.validation, { required } = _e, validation = __rest(_e, ["required"]), { enableIf, renderIf } = _d, element = __rest(_d, ["validation", "enableIf", "renderIf"]), props = __rest(_a, ["element"]);
|
|
56
56
|
const { Textarea } = (0, react_1.useContext)(component_state_1.ComponentStateContext);
|
|
57
|
-
const { render, enable, checkField } = (0, field_render_1.useFieldRender)(Object.assign(Object.assign({}, props), { element }));
|
|
57
|
+
const { render, enable, checkField } = (0, field_render_1.useFieldRender)(Object.assign(Object.assign({}, props), { element: Object.assign({ enableIf, renderIf }, element) }));
|
|
58
58
|
const elementId = (0, react_1.useMemo)(() => { var _a; return (_a = element.id) !== null && _a !== void 0 ? _a : (0, general_1.generateId)(); }, []);
|
|
59
59
|
(0, react_1.useEffect)(() => {
|
|
60
60
|
const subscription = props.watch((value, { name, type }) => checkField(value, { name, type }));
|
|
@@ -52,9 +52,9 @@ const general_1 = require("../../tools/general");
|
|
|
52
52
|
const component_state_1 = require("../../context/component/component-state");
|
|
53
53
|
const MakeToggle = (_a) => {
|
|
54
54
|
var _b, _c;
|
|
55
|
-
var _d = _a.element, _e = _d.validation, { required } = _e, validation = __rest(_e, ["required"]), element = __rest(_d, ["validation"]), props = __rest(_a, ["element"]);
|
|
55
|
+
var _d = _a.element, _e = _d.validation, { required } = _e, validation = __rest(_e, ["required"]), { enableIf, renderIf } = _d, element = __rest(_d, ["validation", "enableIf", "renderIf"]), props = __rest(_a, ["element"]);
|
|
56
56
|
const { Toggle } = (0, react_1.useContext)(component_state_1.ComponentStateContext);
|
|
57
|
-
const { render, enable, checkField } = (0, field_render_1.useFieldRender)(Object.assign(Object.assign({}, props), { element }));
|
|
57
|
+
const { render, enable, checkField } = (0, field_render_1.useFieldRender)(Object.assign(Object.assign({}, props), { element: Object.assign({ enableIf, renderIf }, element) }));
|
|
58
58
|
const elementId = (0, react_1.useMemo)(() => { var _a; return (_a = element.id) !== null && _a !== void 0 ? _a : (0, general_1.generateId)(); }, []);
|
|
59
59
|
(0, react_1.useEffect)(() => {
|
|
60
60
|
const subscription = props.watch((value, { name, type }) => checkField(value, { name, type }));
|
|
@@ -21,8 +21,8 @@ const input_upload_1 = __importDefault(require("../input-upload/input-upload"));
|
|
|
21
21
|
const field_render_1 = require("../../hooks/field-render");
|
|
22
22
|
const MakeUpload = (_a) => {
|
|
23
23
|
var _b, _c;
|
|
24
|
-
var _d = _a.element, _e = _d.validation, { required } = _e, validation = __rest(_e, ["required"]), element = __rest(_d, ["validation"]), props = __rest(_a, ["element"]);
|
|
25
|
-
const { render, enable } = (0, field_render_1.useFieldRender)(Object.assign(Object.assign({}, props), { element }));
|
|
24
|
+
var _d = _a.element, _e = _d.validation, { required } = _e, validation = __rest(_e, ["required"]), { enableIf, renderIf } = _d, element = __rest(_d, ["validation", "enableIf", "renderIf"]), props = __rest(_a, ["element"]);
|
|
25
|
+
const { render, enable } = (0, field_render_1.useFieldRender)(Object.assign(Object.assign({}, props), { element: Object.assign({ enableIf, renderIf }, element) }));
|
|
26
26
|
return (render
|
|
27
27
|
? react_1.default.createElement(react_hook_form_1.Controller, { control: props.control, name: element.name, rules: Object.assign({ required: {
|
|
28
28
|
value: required,
|
|
@@ -60,7 +60,7 @@ const useFieldRender = ({ element, setValue, unregister }) => {
|
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
else if (enableCondition && enableConditionList.includes(key) && fieldValidValue) {
|
|
63
|
-
const enableStatus = element.enableIf[key].includes(targetField) || element.enableIf[key].includes('');
|
|
63
|
+
const enableStatus = element.enableIf[key].includes(targetField) || element.enableIf[key].includes('*');
|
|
64
64
|
if (enable !== enableStatus)
|
|
65
65
|
setEnable(enableStatus);
|
|
66
66
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { CSSProperties } from 'react';
|
|
2
2
|
import { Control, FieldValues, UseFormSetValue, UseFormUnregister, UseFormWatch } from 'react-hook-form';
|
|
3
|
+
import { IModalRenderCondition } from './modal';
|
|
3
4
|
export interface IValidationBase<T> {
|
|
4
5
|
value: T;
|
|
5
6
|
message: string;
|
|
@@ -11,8 +12,8 @@ export interface IField {
|
|
|
11
12
|
style?: CSSProperties;
|
|
12
13
|
placeholder?: string;
|
|
13
14
|
defaultValue?: any;
|
|
14
|
-
renderIf?:
|
|
15
|
-
enableIf?:
|
|
15
|
+
renderIf?: IModalRenderCondition;
|
|
16
|
+
enableIf?: IModalRenderCondition;
|
|
16
17
|
validation: {
|
|
17
18
|
required: boolean;
|
|
18
19
|
regex?: RegExp;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { IField, IFieldProps } from './field';
|
|
2
2
|
import { IModalLiveDataCondition } from './modal';
|
|
3
|
+
import { IOption } from './option';
|
|
3
4
|
export interface IMakeSelect extends IField {
|
|
4
5
|
elementType: 'select';
|
|
5
|
-
options: Array<
|
|
6
|
+
options: Array<IOption>;
|
|
6
7
|
liveData?: IModalLiveDataCondition;
|
|
7
8
|
isSearch?: boolean;
|
|
8
9
|
isMulti?: boolean;
|
|
@@ -10,7 +10,7 @@ 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
|
|
13
|
+
export type IModalRenderCondition = Record<string, Array<string | number | boolean> | undefined>;
|
|
14
14
|
export type IModalLiveDataCondition = {
|
|
15
15
|
action: (data: string, ...args: any[]) => Promise<Array<IOption>>;
|
|
16
16
|
condition: Array<string>;
|
package/package.json
CHANGED
|
@@ -7,9 +7,9 @@ import { IMakeInputProps } from '../../interfaces/make-input'
|
|
|
7
7
|
import { ComponentStateContext } from '../../context/component/component-state'
|
|
8
8
|
import { generateId } from '../../tools/general'
|
|
9
9
|
|
|
10
|
-
const MakeInput: FC<IMakeInputProps> = ({ element: { validation: { required, ...validation }, ...element }, ...props }) => {
|
|
10
|
+
const MakeInput: FC<IMakeInputProps> = ({ element: { validation: { required, ...validation }, enableIf, renderIf, ...element }, ...props }) => {
|
|
11
11
|
const { Input } = useContext(ComponentStateContext)
|
|
12
|
-
const { render, enable, checkField } = useFieldRender({ ...props, element })
|
|
12
|
+
const { render, enable, checkField } = useFieldRender({ ...props, element: { enableIf, renderIf, ...element} })
|
|
13
13
|
|
|
14
14
|
const elementId = useMemo(() => element.id ?? generateId(), [])
|
|
15
15
|
|
|
@@ -7,9 +7,9 @@ import { generateId } from '../../tools/general'
|
|
|
7
7
|
import { IMakeSelectProps } from '../../interfaces/make-select'
|
|
8
8
|
import { ComponentStateContext } from '../../context/component/component-state'
|
|
9
9
|
|
|
10
|
-
const MakeSelect: FC<IMakeSelectProps> = ({ element: { validation: { required, ...validation }, ...element }, ...props }) => {
|
|
10
|
+
const MakeSelect: FC<IMakeSelectProps> = ({ element: { validation: { required, ...validation }, enableIf, renderIf, ...element }, ...props }) => {
|
|
11
11
|
const { Select } = useContext(ComponentStateContext)
|
|
12
|
-
const { render, enable, checkField, liveData, liveSearching } = useFieldRender({ ...props, element })
|
|
12
|
+
const { render, enable, checkField, liveData, liveSearching } = useFieldRender({ ...props, element: { renderIf, enableIf, ...element} })
|
|
13
13
|
|
|
14
14
|
const elementId = useMemo(() => element.id ?? generateId(), [])
|
|
15
15
|
|
|
@@ -7,9 +7,9 @@ import { generateId } from '../../tools/general'
|
|
|
7
7
|
import { IMakeTextareaProps } from '../../interfaces/make-textarea'
|
|
8
8
|
import { ComponentStateContext } from '../../context/component/component-state'
|
|
9
9
|
|
|
10
|
-
const MakeTextarea: FC<IMakeTextareaProps> = ({ element: { validation: { required, ...validation }, ...element }, ...props }) => {
|
|
10
|
+
const MakeTextarea: FC<IMakeTextareaProps> = ({ element: { validation: { required, ...validation }, enableIf, renderIf, ...element }, ...props }) => {
|
|
11
11
|
const { Textarea } = useContext(ComponentStateContext)
|
|
12
|
-
const { render, enable, checkField } = useFieldRender({ ...props, element })
|
|
12
|
+
const { render, enable, checkField } = useFieldRender({ ...props, element: { enableIf, renderIf, ...element } })
|
|
13
13
|
|
|
14
14
|
const elementId = useMemo(() => element.id ?? generateId(), [])
|
|
15
15
|
|
|
@@ -7,9 +7,9 @@ import { IMakeToggleProps } from '../../interfaces/make-toggle'
|
|
|
7
7
|
import { generateId } from '../../tools/general'
|
|
8
8
|
import { ComponentStateContext } from '../../context/component/component-state'
|
|
9
9
|
|
|
10
|
-
const MakeToggle: FC<IMakeToggleProps> = ({ element: { validation: { required, ...validation }, ...element }, ...props }) => {
|
|
10
|
+
const MakeToggle: FC<IMakeToggleProps> = ({ element: { validation: { required, ...validation }, enableIf, renderIf, ...element }, ...props }) => {
|
|
11
11
|
const { Toggle } = useContext(ComponentStateContext)
|
|
12
|
-
const { render, enable, checkField } = useFieldRender({ ...props, element })
|
|
12
|
+
const { render, enable, checkField } = useFieldRender({ ...props, element: { enableIf, renderIf, ...element } })
|
|
13
13
|
|
|
14
14
|
const elementId = useMemo(() => element.id ?? generateId(), [])
|
|
15
15
|
|
|
@@ -6,8 +6,8 @@ import InputUpload from '../input-upload/input-upload'
|
|
|
6
6
|
import { useFieldRender } from '../../hooks/field-render'
|
|
7
7
|
import { IMakeUploadProps } from '../../interfaces/make-upload'
|
|
8
8
|
|
|
9
|
-
const MakeUpload : FC<IMakeUploadProps> = ({ element: { validation: { required, ...validation }, ...element }, ...props }) => {
|
|
10
|
-
const { render, enable } = useFieldRender({ ...props, element })
|
|
9
|
+
const MakeUpload : FC<IMakeUploadProps> = ({ element: { validation: { required, ...validation }, enableIf, renderIf, ...element }, ...props }) => {
|
|
10
|
+
const { render, enable } = useFieldRender({ ...props, element: { enableIf, renderIf, ...element} })
|
|
11
11
|
|
|
12
12
|
return (
|
|
13
13
|
render
|
|
@@ -20,11 +20,11 @@ export interface IFieldRender {
|
|
|
20
20
|
liveSearching?: boolean;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
export interface IFieldRenderProps extends Pick<IFieldProps, 'setValue'|'unregister'> {
|
|
24
|
-
element: Partial<Pick<IField, 'enableIf'|'renderIf'|'name' >> & Partial<Record<'liveData', IModalLiveDataCondition>>
|
|
23
|
+
export interface IFieldRenderProps extends Pick<IFieldProps, 'setValue' | 'unregister'> {
|
|
24
|
+
element: Partial<Pick<IField, 'enableIf' | 'renderIf' | 'name' >> & Partial<Record<'liveData', IModalLiveDataCondition>>
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
export const useFieldRender = ({element, setValue, unregister}: IFieldRenderProps): IFieldRender => {
|
|
27
|
+
export const useFieldRender = ({ element, setValue, unregister }: IFieldRenderProps): IFieldRender => {
|
|
28
28
|
const [render, setRender] = useState<boolean|null>(null)
|
|
29
29
|
const [enable, setEnable] = useState<boolean|null>(null)
|
|
30
30
|
const [liveSearching, setLiveSearching] = useState<boolean>(false)
|
|
@@ -77,13 +77,13 @@ export const useFieldRender = ({element, setValue, unregister}: IFieldRenderProp
|
|
|
77
77
|
const fieldValidValue: boolean = targetField !== undefined && targetField !== null && targetField !== ''
|
|
78
78
|
|
|
79
79
|
if (renderCondition && renderConditionList.includes(key) && fieldValidValue) {
|
|
80
|
-
const renderStatus: boolean = (element.renderIf as IModalRenderCondition)[key]
|
|
80
|
+
const renderStatus: boolean = (element.renderIf as IModalRenderCondition)[key]!.includes(targetField) || (element.renderIf as IModalRenderCondition)[key]!.includes('*')
|
|
81
81
|
if (render !== renderStatus) {
|
|
82
82
|
setRender(renderStatus)
|
|
83
83
|
if(!renderStatus) unregister(element.name as string)
|
|
84
84
|
}
|
|
85
85
|
} else if (enableCondition && enableConditionList.includes(key) && fieldValidValue) {
|
|
86
|
-
const enableStatus: boolean = (element.enableIf as IModalRenderCondition)[key]
|
|
86
|
+
const enableStatus: boolean = (element.enableIf as IModalRenderCondition)[key]!.includes(targetField) || (element.enableIf as IModalRenderCondition)[key]!.includes('*')
|
|
87
87
|
if (enable !== enableStatus) setEnable(enableStatus)
|
|
88
88
|
}
|
|
89
89
|
|
package/src/interfaces/field.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
2
|
import { CSSProperties } from 'react'
|
|
3
3
|
import { Control, FieldValues, UseFormSetValue, UseFormUnregister, UseFormWatch } from 'react-hook-form'
|
|
4
|
+
import { IModalRenderCondition } from './modal'
|
|
4
5
|
|
|
5
6
|
export interface IValidationBase<T> {
|
|
6
7
|
value: T
|
|
@@ -14,8 +15,8 @@ export interface IField {
|
|
|
14
15
|
style?: CSSProperties
|
|
15
16
|
placeholder?: string
|
|
16
17
|
defaultValue?: any
|
|
17
|
-
renderIf?:
|
|
18
|
-
enableIf?:
|
|
18
|
+
renderIf?: IModalRenderCondition
|
|
19
|
+
enableIf?: IModalRenderCondition
|
|
19
20
|
validation: {
|
|
20
21
|
required: boolean
|
|
21
22
|
regex?: RegExp
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { IField, IFieldProps } from './field'
|
|
2
2
|
import { IModalLiveDataCondition } from './modal'
|
|
3
|
+
import { IOption } from './option'
|
|
3
4
|
|
|
4
5
|
export interface IMakeSelect extends IField {
|
|
5
6
|
elementType: 'select'
|
|
6
|
-
options: Array<
|
|
7
|
+
options: Array<IOption>
|
|
7
8
|
liveData?: IModalLiveDataCondition
|
|
8
9
|
isSearch?: boolean
|
|
9
10
|
isMulti?: boolean
|
package/src/interfaces/modal.ts
CHANGED
|
@@ -14,12 +14,13 @@ export type IModalField = IMakeSelect | IMakeInput | IMakeFieldGroup | IMakeText
|
|
|
14
14
|
|
|
15
15
|
export type IFormField = IMakeSelect | IMakeInput | IMakeTextarea | IMakeToggle
|
|
16
16
|
|
|
17
|
-
export type IModalRenderCondition =
|
|
17
|
+
export type IModalRenderCondition = Record<string, Array<string | number | boolean> | undefined>
|
|
18
18
|
|
|
19
19
|
export type IModalLiveDataCondition = {
|
|
20
20
|
action: (data: string, ...args: any[]) => Promise<Array<IOption>>
|
|
21
21
|
condition: Array<string>
|
|
22
22
|
}
|
|
23
|
+
|
|
23
24
|
export interface IModalConfigProps {
|
|
24
25
|
reservedData?: Record<string, any>
|
|
25
26
|
title: string
|