fastlion-amis
Version:
一种MIS页面生成工具
442 lines (441 loc) • 14.7 kB
TypeScript
/// <reference types="lodash" />
import React from 'react';
import { RendererProps } from '../../factory';
import { IFormStore } from '../../store/form';
import { SchemaNode, Action } from '../../types';
import { IScopedContext } from '../../Scoped';
import { BaseSchema, SchemaApi, SchemaClassName, SchemaCollection, SchemaDefaultData, SchemaExpression, SchemaMessage, SchemaName, SchemaRedirect, SchemaReload } from '../../Schema';
import { ActionSchema } from '../Action';
import { DialogSchemaBase } from '../Dialog';
declare type FiltersArr = {
field: string;
condition: number;
not: boolean;
op: number;
values?: string | number;
}[];
declare type FiltersHeader = {
label: string;
value: string;
type: string;
name: string;
body?: [];
};
export interface FormSchemaHorizontal {
left?: number;
right?: number;
leftFixed?: boolean | number | 'xs' | 'sm' | 'md' | 'lg';
}
/**
* Form 表单渲染器。
*
* 说明:https://baidu.gitee.io/amis/docs/components/form/index
*/
export interface FormSchema extends BaseSchema {
/**
* 指定为表单渲染器。
*/
type: 'form';
/**
* 表单标题
*/
title?: string;
/**
* 按钮集合,会固定在底部显示。
*/
actions?: Array<ActionSchema>;
/**
* 表单项集合
*/
body?: SchemaCollection;
/**
* @deprecated 请用类型 tabs
*/
tabs?: any;
/**
* @deprecated 请用类型 fieldSet
*/
fieldSet?: any;
data?: SchemaDefaultData;
/**
* 是否开启调试,开启后会在顶部实时显示表单项数据。
*/
debug?: boolean;
/**
* 用来初始化表单数据
*/
initApi?: SchemaApi;
/**
* Form 用来获取初始数据的 api,与initApi不同的是,会一直轮询请求该接口,直到返回 finished 属性为 true 才 结束。
*/
initAsyncApi?: SchemaApi;
/**
* Jay
* 自定义的一个字段
* Form 用来获取初始数据的 api,与initApi不同的是,只执行一次,且不受target属性影响。
*/
initOneApi?: SchemaApi;
/**
* 设置了initAsyncApi后,默认会从返回数据的data.finished来判断是否完成,也可以设置成其他的xxx,就会从data.xxx中获取
*/
initFinishedField?: string;
/**
* 设置了initAsyncApi以后,默认拉取的时间间隔
*/
initCheckInterval?: number;
/**
* 是否初始加载
*/
initFetch?: boolean;
/**
* 建议改成 api 的 sendOn 属性。
*/
initFetchOn?: SchemaExpression;
/**
* 设置后将轮询调用 initApi
*/
interval?: number;
/**
* 是否静默拉取
*/
silentPolling?: boolean;
/**
* 配置停止轮询的条件
*/
stopAutoRefreshWhen?: string;
/**
* 是否开启本地缓存
*/
persistData?: string;
/**
* 提交成功后清空本地缓存
*/
clearPersistDataAfterSubmit?: boolean;
/**
* Form 用来保存数据的 api。
*
* 详情:https://baidu.gitee.io/amis/docs/components/form/index#%E8%A1%A8%E5%8D%95%E6%8F%90%E4%BA%A4
*/
api?: SchemaApi;
/**
* Form 也可以配置 feedback。
*/
feedback?: DialogSchemaBase;
/**
* 设置此属性后,表单提交发送保存接口后,还会继续轮询请求该接口,直到返回 finished 属性为 true 才 结束。
*/
asyncApi?: SchemaApi;
/**
* 轮询请求的时间间隔,默认为 3秒。设置 asyncApi 才有效
*/
checkInterval?: number;
/**
* 如果决定结束的字段名不是 `finished` 请设置此属性,比如 `is_success`
*/
finishedField?: string;
/**
* 提交完后重置表单
*/
resetAfterSubmit?: boolean;
/**
* 提交后清空表单
*/
clearAfterSubmit?: boolean;
/**
* 配置表单项默认的展示方式。
*/
mode?: 'normal' | 'inline' | 'horizontal';
/**
* 表单项显示为几列
*/
columnCount?: number;
/**
* 如果是水平排版,这个属性可以细化水平排版的左右宽度占比。
*/
horizontal?: FormSchemaHorizontal;
/**
* 是否自动将第一个表单元素聚焦。
*/
autoFocus?: boolean;
/**
* 消息文案配置,记住这个优先级是最低的,如果你的接口返回了 msg,接口返回的优先。
*/
messages?: {
/**
* 表单验证失败时的提示
*/
validateFailed?: string;
} & SchemaMessage;
name?: SchemaName;
/**
* 配置容器 panel className
*/
panelClassName?: SchemaClassName;
/**
* 设置主键 id, 当设置后,检测表单是否完成时(asyncApi),只会携带此数据。
* @default id
*/
primaryField?: string;
redirect?: SchemaRedirect;
reload?: SchemaReload;
/**
* 修改的时候是否直接提交表单。
*/
submitOnChange?: boolean;
/**
* 表单初始先提交一次,联动的时候有用
*/
submitOnInit?: boolean;
/**
* 默认的提交按钮名称,如果设置成空,则可以把默认按钮去掉。
*/
submitText?: string;
/**
* 默认表单提交自己会通过发送 api 保存数据,但是也可以设定另外一个 form 的 name 值,或者另外一个 `CRUD` 模型的 name 值。 如果 target 目标是一个 `Form` ,则目标 `Form` 会重新触发 `initApi` 和 `schemaApi`,api 可以拿到当前 form 数据。如果目标是一个 `CRUD` 模型,则目标模型会重新触发搜索,参数为当前 Form 数据。
*/
target?: string;
/**
* 是否用 panel 包裹起来
*/
wrapWithPanel?: boolean;
/**
* 是否固定底下的按钮在底部。
*/
affixFooter?: boolean;
/**
* 页面离开提示,为了防止页面不小心跳转而导致表单没有保存。
*/
promptPageLeave?: boolean;
/**
* 具体的提示信息,选填。
*/
promptPageLeaveMessage?: string;
/**
* 组合校验规则,选填
*/
rules?: Array<{
rule: string;
message: string;
}>;
/**
* 禁用回车提交
*/
preventEnterSubmit?: boolean;
_bindRef?: any;
_formName?: string;
/**
* Aug 是否自动布局排版
*/
autoLayout?: boolean;
/**
* Aug 组件大小
*/
formatSize?: 'xs' | 'sm' | 'md' | 'lg';
/**
* 超过n个收起
*/
maxFilterCount?: number;
toggleFormExtends?: () => void;
columns?: any[];
}
export declare type FormGroup = FormSchema & {
title?: string;
className?: string;
};
export declare type FormGroupNode = FormGroup | FormGroupArray;
export interface FormGroupArray extends Array<FormGroupNode> {
}
export declare type FormHorizontal = FormSchemaHorizontal;
export interface FormProps extends RendererProps, Omit<FormSchema, 'mode' | 'className'> {
data: any;
store: IFormStore;
wrapperComponent: React.ElementType;
canAccessSuperData: boolean;
trimValues?: boolean;
lazyLoad?: boolean;
simpleMode?: boolean;
onInit?: (values: object, props: any, isChild?: boolean) => any;
onReset?: (values: object) => void;
onSubmit?: (values: object, action: any) => any;
onChange?: (values: object, diff: object, props: any) => any;
onFailed?: (reason: string, errors: any) => any;
onFinished: (values: object, action: any) => any;
onValidate: (values: object, form: any) => any;
messages: {
fetchSuccess?: string;
fetchFailed?: string;
saveSuccess?: string;
saveFailed?: string;
validateFailed?: string;
};
rules: Array<{
rule: string;
message: string;
}>;
lazyChange?: boolean;
formLazyChange?: boolean;
preventModifySubmit?: boolean;
getFilterColumns?: () => any[];
advancedFilterVisible?: boolean;
formMobileHorizontal?: boolean;
}
interface FormState {
autoColumnCount: number;
filtersArr: FiltersArr;
collpased: boolean;
filtersHeader: FiltersHeader[];
userChange: boolean;
}
export default class Form extends React.Component<FormProps, FormState> {
static defaultProps: {
title: string;
submitText: string;
initFetch: boolean;
wrapWithPanel: boolean;
mode: string;
collapsable: boolean;
controlWidth: string;
horizontal: {
left: number;
right: number;
offset: number;
};
columnCount: number;
panelClassName: string;
messages: {
fetchFailed: string;
saveSuccess: string;
saveFailed: string;
};
wrapperComponent: string;
finishedField: string;
initFinishedField: string;
};
static propsList: Array<string>;
hooks: {
[propName: string]: Array<() => Promise<any>>;
};
asyncCancel: () => void;
disposeOnValidate: () => void;
disposeRulesValidate: () => void;
shouldLoadInitApi: boolean;
timer: ReturnType<typeof setTimeout>;
mounted: boolean;
lazyEmitChange: import("lodash").DebouncedFunc<any>;
unBlockRouting?: () => void;
is_init?: any;
is_edit?: any;
_formName?: any;
contentRef: any;
changeFields: string[];
handleUserChange: () => void;
changeTimes: number;
filterOptions: {
label: string;
value: string;
type: string | undefined;
}[];
filterObj: {
[key: string]: any;
};
filterNorma: FiltersHeader[];
filterOptionData: object;
filterOptionRef: React.RefObject<{
handleReset: () => void;
}>;
constructor(props: FormProps);
valueChanged: boolean;
componentDidMount(): void;
componentDidUpdate(prevProps: FormProps): void;
componentWillUnmount(): void;
computeAutoLayout(): void;
blockRouting(): any;
beforePageUnload(e: any): any;
onInit(): Promise<void>;
reload(subPath?: string, query?: any, ctx?: any, silent?: boolean): void;
received: boolean;
receive(values: object): void;
silentReload(target?: string, query?: any): void;
initInterval(value: any): any;
isValidated(): boolean;
validate(forceValidate?: boolean): Promise<boolean>;
clearErrors(): void;
getValues(): any;
setValues(value: any): void;
submit(fn?: (values: object) => Promise<any>): Promise<any>;
flush(): void;
reset(): void;
addHook(fn: () => any, type?: 'validate' | 'init' | 'flush'): () => void;
removeHook(fn: () => any, type?: string): void;
handleInputTableChange(value: any, name: string): void;
abandonFormItem(value: any, name: string): void;
setEdited(): void;
setFormLoading(loading: boolean): void;
handleChange(value: any, name: string, submit: boolean, changePristine: boolean | undefined, type: any): void;
emitChange(submit: boolean): void;
handleBulkChange(values: Object, submit: boolean, is_mount?: boolean): void;
handleFormSubmit(e: React.UIEvent<any>): any;
shouldCommit(action: Action): void;
handleAction(e: React.UIEvent<any> | void, action: Action, data: object, throwErrors?: boolean, delegate?: IScopedContext): any;
handleQuery(query: any): void;
handleDialogConfirm(values: object[], action: Action, ctx: any, targets: Array<any>): void;
handleDialogClose(confirmed?: boolean): void;
handleDrawerConfirm(values: object[], action: Action, ctx: any, targets: Array<any>): void;
handleDrawerClose(): void;
submitToTarget(target: string, values: object): void;
reloadTarget(target: string, data?: any): void;
closeTarget(target: string): void;
openFeedback(dialog: any, ctx: any): Promise<unknown>;
buildActions(): ActionSchema[] | {
type: string;
label: any;
primary: boolean;
}[] | undefined;
handleChangeFields(autoFillObj?: {
[key: string]: any;
}): void;
buildExtendAction(): JSX.Element;
renderFormItems(schema: Partial<FormSchema> & {
controls?: Array<any>;
}, region?: string, otherProps?: Partial<FormProps>): React.ReactNode;
renderChildren(children: Array<any>, region: string, otherProps?: Partial<FormProps>): React.ReactNode;
renderChild(control: SchemaNode, key?: any, otherProps?: Partial<FormProps>, region?: string): React.ReactNode;
changeCondition(val: number, index: number): void;
changeField(value: string, index: number): void;
changeNot(value: boolean, index: number): void;
changeRange(value: number, index: number): void;
addFilter(): void;
deleteFilter(index: number): void;
confirmAdvancedFilter(): {
[x: string]: any;
advancedHeader: any;
filterParam: any;
advancedFilterSub: FiltersArr;
filterOptionData: object;
} | undefined;
circulation(Current: FiltersHeader, data: any): void;
multiplexing(Current: FiltersHeader, data: any): void;
resetAdvancedFilter(): void;
handlerenew(arr: boolean, val?: any): void;
getFiltersOptions(): void;
getSameEle: (marr1: Array<any>, marr2: Array<string>) => any[];
filtersVisible(): any;
renderAdvancedFilter(): JSX.Element;
renderBody(): JSX.Element;
render(): JSX.Element;
}
export declare class FormRenderer extends Form {
static contextType: React.Context<IScopedContext>;
constructor(props: FormProps, context: IScopedContext);
componentDidMount(): void;
componentWillUnmount(): void;
doAction(action: Action, data?: object, throwErrors?: boolean): any;
handleAction(e: React.UIEvent<any> | undefined, action: Action, ctx: object, throwErrors?: boolean, delegate?: IScopedContext): any;
handleDialogConfirm(values: object[], action: Action, ctx: any, targets: Array<any>): void;
submitToTarget(target: string, values: object): void;
reloadTarget(target: string, data: any): void;
closeTarget(target: string): void;
reload(target?: string, query?: any, ctx?: any, silent?: boolean): void;
receive(values: object, name?: string): void;
}
export {};