///
import React from 'react';
import { RendererProps } from '../factory';
import { IFormStore } from '../store/form';
import { SchemaNode, ActionObject, ClassName, BaseApiObject, SchemaExpression, SchemaClassName, DataChangeReason } from '../types';
import { IScopedContext } from '../Scoped';
import type { LabelAlign } from './Item';
export interface FormHorizontal {
left?: number;
right?: number;
leftFixed?: boolean | number | 'xs' | 'sm' | 'md' | 'lg';
justify?: boolean;
labelAlign?: 'left' | 'right';
/** label自定义宽度,默认单位为px */
labelWidth?: number | string;
labelOverflow?: 'default' | 'ellipsis';
}
export interface FormSchemaBase {
/**
* 表单标题
*/
title?: string;
/**
* 按钮集合,会固定在底部显示。
*/
actions?: Array;
/**
* 表单项集合
*/
body?: any;
/**
* @deprecated 请用类型 tabs
*/
tabs?: any;
/**
* @deprecated 请用类型 fieldSet
*/
fieldSet?: any;
data?: any;
/**
* 是否开启调试,开启后会在顶部实时显示表单项数据。
*/
debug?: boolean;
/**
* Debug面板配置
*/
debugConfig?: {
/**
* 默认展开的级别
*/
levelExpand?: number;
/**
* 是否可复制
*/
enableClipboard?: boolean;
/**
* 图标风格
*/
iconStyle?: 'square' | 'circle' | 'triangle';
/**
* 是否显示键的引号
*/
quotesOnKeys?: boolean;
/**
* 是否为键排序
*/
sortKeys?: boolean;
/**
* 设置字符串的最大展示长度,超出长度阈值的字符串将被截断,点击value可切换字符串展示方式,默认为120
*/
ellipsisThreshold?: number | false;
labelOverflow?: 'default' | 'ellipsis';
};
/**
* 用来初始化表单数据
*/
initApi?: string | BaseApiObject;
/**
* Form 用来获取初始数据的 api,与initApi不同的是,会一直轮询请求该接口,直到返回 finished 属性为 true 才 结束。
*/
initAsyncApi?: string | BaseApiObject;
/**
* 设置了initAsyncApi后,默认会从返回数据的data.finished来判断是否完成,也可以设置成其他的xxx,就会从data.xxx中获取
*/
initFinishedField?: string;
/**
* 设置了initAsyncApi以后,默认拉取的时间间隔
*/
initCheckInterval?: number;
/**
* 是否初始加载
*/
initFetch?: boolean;
/**
* 建议改成 api 的 sendOn 属性。
*/
initFetchOn?: string;
/**
* 设置后将轮询调用 initApi
*/
interval?: number;
/**
* 是否静默拉取
*/
silentPolling?: boolean;
/**
* 配置停止轮询的条件
*/
stopAutoRefreshWhen?: string;
/**
* 是否开启本地缓存
*/
persistData?: string;
/**
* 开启本地缓存后限制保存哪些 key
*/
persistDataKeys?: string[];
/**
* 提交成功后清空本地缓存
*/
clearPersistDataAfterSubmit?: boolean;
/**
* Form 用来保存数据的 api。
*
* 详情:https://aisuda.bce.baidu.com/amis/zh-CN/components/form/index#%E8%A1%A8%E5%8D%95%E6%8F%90%E4%BA%A4
*/
api?: string | BaseApiObject;
/**
* Form 也可以配置 feedback。
*/
feedback?: any;
/**
* 设置此属性后,表单提交发送保存接口后,还会继续轮询请求该接口,直到返回 finished 属性为 true 才 结束。
*/
asyncApi?: string | BaseApiObject;
/**
* 轮询请求的时间间隔,默认为 3秒。设置 asyncApi 才有效
*/
checkInterval?: number;
/**
* 如果决定结束的字段名不是 `finished` 请设置此属性,比如 `is_success`
*/
finishedField?: string;
/**
* 提交完后重置表单
*/
resetAfterSubmit?: boolean;
/**
* 提交后清空表单
*/
clearAfterSubmit?: boolean;
/**
* 配置表单项默认的展示方式。
*/
mode?: 'normal' | 'inline' | 'horizontal' | 'flex';
/**
* 表单项显示为几列
*/
columnCount?: number;
/**
* 如果是水平排版,这个属性可以细化水平排版的左右宽度占比。
*/
horizontal?: FormHorizontal;
/**
* 是否自动将第一个表单元素聚焦。
*/
autoFocus?: boolean;
/**
* 消息文案配置,记住这个优先级是最低的,如果你的接口返回了 msg,接口返回的优先。
*/
messages?: {
/**
* 表单验证失败时的提示
*/
validateFailed?: string;
};
name?: string;
/**
* 配置容器 panel className
*/
panelClassName?: ClassName;
/**
* 设置主键 id, 当设置后,检测表单是否完成时(asyncApi),只会携带此数据。
* @default id
*/
primaryField?: string;
redirect?: string;
reload?: string;
/**
* 修改的时候是否直接提交表单。
*/
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;
name?: string | Array;
}>;
/**
* 禁用回车提交
*/
preventEnterSubmit?: boolean;
/**
* 表单label的对齐方式
*/
labelAlign?: LabelAlign;
/**
* label自定义宽度,默认单位为px
*/
labelWidth?: number | string;
/**
* 展示态时的className
*/
static?: boolean;
staticOn?: SchemaExpression;
staticClassName?: SchemaClassName;
}
export type FormGroup = FormSchemaBase & {
title?: string;
className?: string;
};
export type FormGroupNode = FormGroup | FormGroupArray;
export interface FormGroupArray extends Array {
}
export interface FormProps extends RendererProps, Omit {
data: any;
store: IFormStore;
wrapperComponent: React.ElementType;
canAccessSuperData: boolean;
trimValues?: boolean;
lazyLoad?: boolean;
simpleMode?: boolean;
onInit?: (values: object, props: any) => any;
onReset?: (values: object, action?: any) => 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: ActionObject, store: IFormStore) => any;
onValidate: (values: object, form: any) => any;
onValidChange?: (valid: boolean, props: any) => void;
messages: {
fetchSuccess?: string;
fetchFailed?: string;
saveSuccess?: string;
saveFailed?: string;
validateFailed?: string;
};
rules: Array<{
rule: string;
message: string;
name?: string | Array;
}>;
lazyChange?: boolean;
formLazyChange?: boolean;
loadingConfig?: {
root?: string;
show?: boolean;
};
}
export default class Form extends React.Component {
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;
labelAlign: string;
};
static propsList: Array;
hooks: {
[propName: string]: Array<(...args: any) => Promise>;
};
asyncCancel: () => void;
toDispose: Array<() => void>;
shouldLoadInitApi: boolean;
timer: ReturnType;
mounted: boolean;
lazyEmitChange: import("lodash").DebouncedFunc;
lazyJumpToErrorComponent: import("lodash").DebouncedFuncLeading;
unBlockRouting?: () => void;
formRef: React.RefObject;
constructor(props: FormProps);
componentDidMount(): void;
componentDidUpdate(prevProps: FormProps): void;
componentWillUnmount(): void;
/** 获取表单联合校验的规则 */
getNormalizedRules(): {
message: any;
rule: string;
name?: string | string[] | undefined;
}[];
dispatchInited(value: any): Promise;
blockRouting(): any;
beforePageUnload(e: any): any;
onInit(): Promise;
reload(subPath?: string, query?: any, ctx?: any, silent?: boolean): Promise;
receive(values: object, name?: string, replace?: boolean): Promise;
silentReload(target?: string, query?: any): Promise;
initInterval(value: any): any;
isValidated(): boolean;
validate(forceValidate?: boolean, throwErrors?: boolean, toastErrors?: boolean, skipFlush?: boolean): Promise;
setErrors(errors: {
[propName: string]: string;
}, tag?: string): void;
clearErrors(): void;
getValues(): any;
setValues(value: any, replace?: boolean): void;
submit(fn?: (values: object) => Promise, throwErrors?: boolean, skipFlush?: boolean): Promise;
flushing: boolean;
flush(): Promise;
reset(): void;
addHook(fn: () => any, type?: 'validate' | 'init' | 'flush', enforce?: 'prev' | 'post'): () => void;
removeHook(fn: () => any, type?: string): void;
handleChange(value: any, name: string, submit: boolean, changePristine?: boolean, changeReason?: DataChangeReason): void;
jumpToErrorComponent(renderer: any): void;
dispatchEvent(e: React.MouseEvent | string, data: any, renderer?: React.Component, // for didmount
scoped?: IScopedContext): Promise>;
emittedData: any;
emitting: boolean;
emitChange(submit: boolean, emitedFromWatch?: boolean): Promise;
handleBulkChange(values: Object, submit: boolean, changeReason?: DataChangeReason): void;
handleFormSubmit(e: React.UIEvent): any;
handleReset(action: any): (data: any) => void;
handleAction(e: React.UIEvent | void, action: ActionObject, data: object, throwErrors?: boolean, delegate?: IScopedContext): Promise;
handleQuery(query: any): any;
handleDialogConfirm(values: object[], action: ActionObject, ctx: any, targets: Array): void;
handleDialogClose(confirmed?: boolean): void;
handleDrawerConfirm(values: object[], action: ActionObject, ctx: any, targets: Array): 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;
buildActions(): any[] | undefined;
renderFormItems(schema: Partial & {
controls?: Array;
}, region?: string, otherProps?: Partial): React.ReactNode;
renderChildren(children: Array, region: string, otherProps?: Partial): React.ReactNode;
renderChild(control: SchemaNode, key?: any, otherProps?: Partial, region?: string): React.ReactNode;
renderBody(): React.JSX.Element;
render(): JSX.Element;
}
export declare class FormRendererBase extends Form {
static contextType: React.Context;
constructor(props: FormProps, context: IScopedContext);
componentDidMount(): void;
componentWillUnmount(): void;
focus(): void;
doAction(action: ActionObject, data?: object, throwErrors?: boolean): Promise;
handleAction(e: React.UIEvent | undefined, action: ActionObject, ctx: object, throwErrors?: boolean, delegate?: IScopedContext): Promise;
handleDialogConfirm(values: object[], action: ActionObject, ctx: any, targets: Array): 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, replace?: boolean): Promise;
receive(values: object, name?: string, replace?: boolean): Promise;
setData(values: object, replace?: boolean): void;
getData(): any;
}
export declare class FormRenderer extends FormRendererBase {
}