dynamic-modal
Version:
The dynamic-modal is a solution of creation different modals into project using a json configuration file
65 lines (64 loc) • 2.5 kB
TypeScript
import { CSSProperties } from 'react';
import { IMakeSelect } from './make-select';
import { IMakeInput } from './make-input';
import { IMakeTextarea } from './make-textarea';
import { IMakeToggle } from './make-toggle';
import { IMakeDescription } from './make-description';
import { IMakeFieldGroup } from './make-field-group';
import { IMakeUpload } from './make-upload';
import { IOption } from './option';
import { IMakeButton } from './make-button';
import { IMakeCustomUpload } from './make-custom-upload';
import { IMakeWatcher } from './make-watcher';
import { IMakeTable } from './make-table';
export type IModalField = IMakeSelect | IMakeInput | IMakeFieldGroup | IMakeTextarea | IMakeToggle | IMakeDescription | IMakeUpload | IMakeCustomUpload | IMakeWatcher | IMakeButton | IMakeTable;
export type IFormField = IMakeSelect | IMakeInput | IMakeTextarea | IMakeToggle;
export interface IModalRenderAction {
action: (data: string, ...args: any[]) => Promise<boolean>;
condition: Array<string>;
}
export type IModalRenderCriteria = Record<string, Array<string | number | boolean> | undefined>;
export type IModalRenderCondition = IModalRenderAction | IModalRenderCriteria;
export type IModalLiveDataCondition = {
action: (data: string, ...args: any[]) => Promise<Array<IOption>>;
condition: Array<string>;
};
export interface IModalSectionStyleConfig {
className?: string;
style?: CSSProperties;
}
export interface IModalLayoutConfig {
container?: IModalSectionStyleConfig;
header?: IModalSectionStyleConfig & {
showDivider?: boolean;
};
title?: IModalSectionStyleConfig;
body?: IModalSectionStyleConfig;
footer?: IModalSectionStyleConfig & {
showDivider?: boolean;
};
}
export interface IModalConfigProps {
reservedData?: Record<string, any>;
title: string;
layout?: IModalLayoutConfig;
fields: Array<IModalField>;
out: (data: any) => void;
onClose?: () => void;
style?: CSSProperties;
overFlowBody?: string | number;
minHeightBody?: string | number;
useSubmit?: boolean;
useBlur?: boolean;
actions: {
containerStyle?: CSSProperties;
cancel?: Omit<IMakeButton, 'elementType'>;
action: Omit<IMakeButton, 'elementType'>;
};
}
export type IModalConfigLoader<T = any, D = any> = (props: T, action: (modalResult: D) => void) => IModalConfigProps;
export interface IModal {
open: boolean;
close: () => void;
config: IModalConfigProps;
}