UNPKG

fastlion-amis

Version:

一种MIS页面生成工具

246 lines (245 loc) 7.36 kB
/// <reference types="lodash" /> import React from 'react'; import { FormControlProps, FormBaseControl } from './Item'; import { Action } from '../../types'; import { IComboStore } from '../../store/combo'; import Sortable from 'sortablejs'; import { SchemaApi, SchemaClassName, SchemaObject, SchemaTpl } from '../../Schema'; export declare type ComboCondition = { test: string; items: Array<ComboSubControl>; label: string; scaffold?: any; mode?: string; }; export declare type ComboSubControl = SchemaObject & { /** * 是否唯一, 只有在 combo 里面才有用 */ unique?: boolean; /** * 列类名,可以用来修改这类宽度。 */ columnClassName?: SchemaClassName; }; /** * Combo 组合输入框类型 * 文档:https://baidu.gitee.io/amis/docs/components/form/combo */ export interface ComboControlSchema extends FormBaseControl { /** * 指定为组合输入框类型 */ type: 'combo'; /** * 单组表单项初始值。默认为 `{}` * * @default {} */ scaffold?: any; /** * 是否含有边框 */ noBorder?: boolean; /** * 确认删除时的提示 */ deleteConfirmText?: string; /** * 删除时调用的api */ deleteApi?: SchemaApi; /** * 是否可切换条件,配合`conditions`使用 */ typeSwitchable?: boolean; /** * 符合某类条件后才渲染的schema */ conditions?: Array<ComboCondition>; /** * 内部单组表单项的类名 */ formClassName?: SchemaClassName; /** * 新增按钮CSS类名 */ addButtonClassName?: SchemaClassName; /** * 新增按钮文字 * @default 新增 */ addButtonText?: string; /** * 是否可新增 */ addable?: boolean; /** * 数组输入框的子项 */ items?: Array<ComboSubControl>; /** * 是否可拖拽排序 */ draggable?: boolean; /** * 可拖拽排序的提示信息。 * * @default 可拖拽排序 */ draggableTip?: string; /** * 是否将结果扁平化(去掉name),只有当controls的length为1且multiple为true的时候才有效 */ flat?: boolean; /** * 当扁平化开启并且joinValues为true时,用什么分隔符 * * @deprecated */ delimiter?: string; /** * 当扁平化开启的时候,是否用分隔符的形式发送给后端,否则采用array的方式 * @deprecated */ joinValues?: boolean; /** * 限制最大个数 */ maxLength?: number; /** * 限制最小个数 */ minLength?: number; /** * 是否多行模式,默认一行展示完 */ multiLine?: boolean; /** * 是否可多选 */ multiple?: boolean; /** * 是否可删除 */ removable?: boolean; /** * 子表单的模式。 */ subFormMode?: 'normal' | 'horizontal' | 'inline'; /** * 没有成员时显示。 * @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; }; } export interface ComboProps extends FormControlProps, Omit<ComboControlSchema, 'type' | 'className' | 'descriptionClassName' | 'inputClassName'> { store: IComboStore; changeImmediately?: boolean; } export default class ComboControl extends React.Component<ComboProps> { static defaultProps: Pick<ComboProps, 'minLength' | 'maxLength' | 'multiple' | 'multiLine' | 'addButtonClassName' | 'formClassName' | 'subFormMode' | 'draggableTip' | 'addButtonText' | 'canAccessSuperData' | 'addIcon' | 'dragIcon' | 'deleteIcon' | 'tabsMode' | 'tabsStyle' | 'placeholder'>; static propsList: Array<string>; subForms: Array<any>; subFormDefaultValues: Array<{ index: number; values: any; setted: boolean; }>; keys: Array<string>; dragTip?: HTMLElement; sortable?: Sortable; defaultValue?: any; toDispose: Array<Function>; id: string; constructor(props: ComboProps); componentDidUpdate(prevProps: ComboProps): void; componentWillUnmount(): void; getValueAsArray(props?: Readonly<ComboProps> & Readonly<{ children?: React.ReactNode; }>): any; addItemWith(condition: ComboCondition): void; addItem(): void; removeItem(key: number): Promise<void>; handleChange(values: any, diff: any, { index }: any): void; handleSingleFormChange(values: object): void; handleFormInit(values: any, { index }: any): void; handleSingleFormInit(values: any): void; handleAction(action: Action): any; validate(): any; flush(): void; dragTipRef(ref: any): void; initDragging(): void; destroyDragging(): void; refsMap: { [propName: number]: any; }; makeFormRef: ((index: number) => (ref: any) => void) & import("lodash").MemoizedFunction; formRef(ref: any, index?: number): void; memoizedFormatValue: ((strictMode: boolean, syncFields: Array<string> | 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): void; setNull(e: React.MouseEvent): void; renderPlaceholder(): JSX.Element; renderTabsMode(): JSX.Element; renderMultipe(): JSX.Element; renderSingle(): JSX.Element; render(): JSX.Element | null; } export declare class ComboControlRenderer extends ComboControl { } export declare class KVControlRenderer extends ComboControl { }