/// import React from 'react'; import { FormControlProps, FormHorizontal } from 'fabos-amis-core'; import { ActionObject } from 'fabos-amis-core'; import { IComboStore } from 'fabos-amis-core'; import Sortable from 'sortablejs'; import { FormBaseControlSchema, SchemaApi, SchemaClassName, SchemaObject, SchemaTpl } from '../../Schema'; import { ListenerAction } from 'fabos-amis-core'; import type { SchemaTokenizeableString } from '../../Schema'; import type { TestIdBuilder } from 'fabos-amis-core'; export type ComboCondition = { test: string; items: Array; label: string; scaffold?: any; mode?: string; }; export type ComboSubControl = SchemaObject & { /** * 是否唯一, 只有在 combo 里面才有用 */ unique?: boolean; /** * 列类名,可以用来修改这类宽度。 */ columnClassName?: SchemaClassName; testid?: string; }; /** * Combo 组合输入框类型 * 文档:https://aisuda.bce.baidu.com/amis/zh-CN/components/form/combo */ export interface ComboControlSchema extends FormBaseControlSchema { /** * 指定为组合输入框类型 */ type: 'combo'; /** * 单组表单项初始值。默认为 `{}` * * @default {} */ scaffold?: any; /** * 是否含有边框 */ noBorder?: boolean; /** * 确认删除时的提示 */ deleteConfirmText?: string; /** * 删除时调用的api */ deleteApi?: SchemaApi; /** * 是否可切换条件,配合`conditions`使用 */ typeSwitchable?: boolean; /** * 符合某类条件后才渲染的schema */ conditions?: Array; /** * 内部单组表单项的类名 */ formClassName?: SchemaClassName; /** * 新增按钮CSS类名 */ addButtonClassName?: SchemaClassName; /** * 新增按钮文字 * @default 新增 */ addButtonText?: string; /** * 是否可新增 */ addable?: boolean; /** * Add at top */ addattop?: boolean; /** * 数组输入框的子项 */ items?: Array; /** * 是否可拖拽排序 */ draggable?: boolean; /** * 可拖拽排序的提示信息。 * * @default 可拖拽排序 */ draggableTip?: string; /** * 是否将结果扁平化(去掉name),只有当controls的length为1且multiple为true的时候才有效 */ flat?: boolean; /** * 当扁平化开启并且joinValues为true时,用什么分隔符 * * @deprecated */ delimiter?: string; /** * 当扁平化开启的时候,是否用分隔符的形式发送给后端,否则采用array的方式 * @deprecated */ joinValues?: boolean; /** * 限制最大个数 */ maxLength?: number | SchemaTokenizeableString; /** * 限制最小个数 */ minLength?: number | SchemaTokenizeableString; /** * 是否多行模式,默认一行展示完 */ multiLine?: boolean; /** * 是否可多选 */ multiple?: boolean; /** * 是否可删除 */ removable?: boolean; /** * 子表单的模式。 */ subFormMode?: 'normal' | 'horizontal' | 'inline'; /** * 如果是水平排版,这个属性可以细化水平排版的左右宽度占比。 */ subFormHorizontal?: FormHorizontal; /** * 没有成员时显示。 * @default empty */ placeholder?: string; /** * 是否可以访问父级数据,正常 combo 已经关联到数组成员,是不能访问父级数据的。 */ canAccessSuperData?: boolean; /** * 采用 Tabs 展示方式? */ tabsMode?: boolean; /** * Tabs 的展示模式。 */ tabsStyle?: '' | 'line' | 'card' | 'radio'; /** * 选项卡标题的生成模板。 */ tabsLabelTpl?: SchemaTpl; /** * 数据比较多,比较卡时,可以试试开启。 */ lazyLoad?: boolean; /** * 严格模式,为了性能默认不开的。 */ strictMode?: boolean; /** * 配置同步字段。只有 `strictMode` 为 `false` 时有效。 * 如果 Combo 层级比较深,底层的获取外层的数据可能不同步。 * 但是给 combo 配置这个属性就能同步下来。输入格式:`["os"]` */ syncFields?: string[]; /** * 允许为空,如果子表单项里面配置验证器,且又是单条模式。可以允许用户选择清空(不填)。 */ nullable?: boolean; /** * 提示信息 */ messages?: { /** * 验证错误提示 */ validateFailed?: string; /** * 最小值验证错误提示 */ minLengthValidateFailed?: string; /** * 最大值验证错误提示 */ maxLengthValidateFailed?: string; }; updatePristineAfterStoreDataReInit?: boolean; testIdBuilder?: TestIdBuilder; } export type ComboRendererEvent = 'add' | 'delete' | 'tabsChange' | 'dragEnd'; export interface ComboProps extends FormControlProps, Omit { store: IComboStore; changeImmediately?: boolean; } export default class ComboControl extends React.Component { static defaultProps: Pick; static propsList: Array; subFormDefaultValues: Array<{ index: number; values: any; setted: boolean; }>; keys: Array; dragTip?: HTMLElement; sortable?: Sortable; defaultValue?: any; toDispose: Array; id: string; constructor(props: ComboProps); componentDidUpdate(prevProps: ComboProps): void; componentWillUnmount(): void; /** 解析props中的变量,目前支持'minLength' | 'maxLength' */ resolveVariableProps(props: ComboProps, key: 'minLength' | 'maxLength'): number; doAction(action: ListenerAction, data: any, throwErrors?: boolean, args?: any): void; addItemValue(itemValue: any): void; getValueAsArray(props?: Readonly): any; addItemWith(condition: ComboCondition): void; addItem(): Promise; deleteItem(key: number): Promise; handleChange(values: any, diff: any, { index }: any): void; handleRadioChange(ctx: any, { index, name, trueValue, falseValue }: any): false | undefined; handleSingleFormChange(values: object): void; handleSubFormValid(valid: boolean, { index }: any): void; handleFormInit(values: any, { index }: any): void; handleSingleFormInit(values: any): void; handleAction(e: React.UIEvent | undefined, action: ActionObject): any; validate(): any; flush(): Promise; dragTipRef(ref: any): void; initDragging(): void; destroyDragging(): void; refsMap: { [propName: string]: any; }; makeFormRef: ((index: number) => (ref: any) => void) & import("lodash").MemoizedFunction; get subForms(): any[]; formRef(ref: any, index?: number): void; memoizedFormatValue: ((strictMode: boolean, syncFields: Array | void, value: any, index: number, data: any) => object) & import("lodash").MemoizedFunction; formatValue(value: any, index?: number): object; pickCondition(value: any): ComboCondition | null; handleComboTypeChange(index: number, selection: any): void; handleTabSelect(key: number): Promise; setNull(e: React.MouseEvent): void; renderPlaceholder(): React.JSX.Element; renderTabsMode(): React.JSX.Element; renderDelBtn(value: any, index: number): React.JSX.Element | null; renderAddBtn(): React.JSX.Element | null; renderMultipe(): React.JSX.Element; renderSingle(): React.JSX.Element; renderItems(finnalControls: ComboSubControl[], data: object, index?: number): React.JSX.Element; renderStatic(displayValue?: string): JSX.Element; render(): React.JSX.Element | null; } export declare class ComboControlRenderer extends ComboControl { setData(value: any, replace?: boolean, index?: number | string, condition?: any): Promise; } export declare class KVControlRenderer extends ComboControl { } export declare class KVSControlRenderer extends ComboControl { }