choerodon-ui
Version:
An enterprise-class UI design language and React-based implementation
903 lines (902 loc) • 27.5 kB
TypeScript
import { ObservableMap } from 'mobx';
import { AxiosInstance } from 'axios';
import { Config, ConfigKeys, DefaultConfig, getConfig } from '../configure';
import Record, { RecordProps } from './Record';
import Group from './Group';
import Field, { FieldProps, Fields } from './Field';
import EventManager from '../event-manager';
import DataSetSnapshot from './DataSetSnapshot';
import { CheckedStrategy, DataSetExportStatus, DataSetSelection, DataSetStatus, DataToJSON, ExportMode, RecordStatus } from './enum';
import { Lang } from '../locale-context/enum';
import Transport, { TransportProps } from './Transport';
import { FeedBack } from './FeedBack';
import ValidationResult from '../validator/ValidationResult';
import LookupCache from './LookupCache';
export declare type DataSetChildren = {
[key: string]: DataSet;
};
export declare type Events = {
[key: string]: Function;
};
export declare function addDataSetField(dataSet: DataSet, name: string): Field;
export declare function initDataSetField(dataSet: DataSet, name: string, fieldProps?: FieldProps): [Field, Map<string, Field> | undefined];
export interface RecordValidationErrors {
field: Field;
errors: ValidationResult[];
valid: boolean;
}
export interface ValidationErrors {
record: Record;
errors: RecordValidationErrors[];
valid: boolean;
}
export interface AllValidationErrors {
dataSet: ValidationSelfErrors[];
records: ValidationErrors[];
}
export interface ValidationRule {
name: string;
value: number;
message?: string;
disabled?: boolean | ((props: {
dataSet: DataSet;
}) => boolean);
}
export interface ValidationSelfErrors extends ValidationRule {
dataSet: DataSet;
valid: boolean;
}
export interface DataSetProps {
/**
* 唯一标识
* @see children
*/
id?: string;
/**
* 对应后台ds的name,用于自动生成约定的submitUrl, queryUrl, tlsUrl,也可用于级联
* @see children
*/
name?: string;
/**
* 主键字段名,一般用作级联行表的查询字段
*/
primaryKey?: string;
/**
* 语言
*/
lang?: Lang;
/**
* 字段组
*/
fields?: FieldProps[];
/**
* 查询字段组
*/
queryFields?: FieldProps[];
/**
* 记录动态属性
*/
record?: RecordProps;
/**
* 事件
*/
events?: Events;
/**
* 初始化数据
*/
data?: object[];
/**
* 初始化后自动查询
* @default false
*/
autoQuery?: boolean;
/**
* 提交成功后响应的数据不符合回写条件时自动查询
* @default true
*/
autoQueryAfterSubmit?: boolean;
/**
* 初始化时,如果没有记录且autoQuery为false,则自动创建记录
* @default false;
*/
autoCreate?: boolean;
/**
* 自动定位到第一条
* @default true;
*/
autoLocateFirst?: boolean;
/**
* 自动定位到新建记录
* @default true;
*/
autoLocateAfterCreate?: boolean;
/**
* 当前记录被删除时自动定位其他记录
* @default true;
*/
autoLocateAfterRemove?: boolean;
/**
* 查询时是否校验查询字段或查询数据集
* @default false;
*/
validateBeforeQuery?: boolean;
/**
* 始终校验全部数据
* @default false;
*/
forceValidate?: boolean;
/**
* 选择的模式
* @default "multiple"
*/
selection?: DataSetSelection | false;
/**
* 查询前,当有记录更改过时,是否警告提示
* @default true
*/
modifiedCheck?: boolean;
/**
* 查询前,当有记录更改过时, 提示信息或弹窗的属性 modifiedCheckMessage
* @default
*/
modifiedCheckMessage?: any;
/**
* 分页大小
* @default 10
*/
pageSize?: number;
/**
* 严格分页大小
* @default true
*/
strictPageSize?: boolean;
/**
* 前端分页、后端分页还是不分页
*/
paging?: boolean | 'server';
/**
* 查询返回的json中对应的数据的key
* @default "rows"
*/
dataKey?: string;
/**
* 查询返回的json中对应的总数的key
* @default "total"
*/
totalKey?: string;
/**
* 查询条件数据源
*/
queryDataSet?: DataSet;
/**
* 查询参数
*/
queryParameter?: object;
/**
* 查询请求的url
*/
queryUrl?: string;
/**
* 记录提交请求的url
*/
submitUrl?: string;
/**
* 多语言查询请求的url
*/
tlsUrl?: string;
/**
* 远程校验查询请求的url。如唯一性校验。
*/
validateUrl?: string;
/**
* 导出请求的url
*/
exportUrl?: string;
/**
* 导出模式
*/
exportMode?: ExportMode;
/**
* 自定义CRUD的请求配置
*/
transport?: TransportProps;
/**
* 查询和提交数据的反馈配置
*/
feedback?: FeedBack;
/**
* 级联行数据集, 当为数组时,数组成员必须是有name属性的DataSet
* @example
* { name_1: 'ds-id-1', name_2: 'ds-id-2' }
* { name_1: ds1, name_2: ds2 }
* [ds1, ds2]
*/
children?: {
[key: string]: string | DataSet;
} | DataSet[];
/**
* 树形数据当前节点 id 字段名,与 parentField 组合使用。
* 适用于平铺数据;渲染性能相对 childrenField 比较差;变更节点层级可直接修改 idField 和 parentField 对应的值
*/
idField?: string;
/**
* 树形数据当前父节点 id 字段名,与 idField 组合使用。
* 适用于平铺数据;变更节点层级可直接修改 idField 和 parentField 对应的值
*/
parentField?: string;
/**
* 树形数据子数据集字段名, 如果要异步加载子节点需设置 idField 和 parentField 或者使用 appendData 方法。
* 适用于树形数据;变更节点层级需要操作 record.parent 和 record.children
*/
childrenField?: string;
/**
* 树形数据标记节点是否展开的字段名
*/
expandField?: string;
/**
* 树形数据标记节点是否为选中的字段名,在展开按钮后面会显示checkbox
*/
checkField?: string;
/**
* 树形数据节点选中状态是否独自控制(父子节点选中状态不再关联)
*/
treeCheckStrictly?: boolean;
/**
* 缓存选中记录,使切换分页时仍保留选中状态。
* 当设置了primaryKey或有字段设置了unique才起作用。
*/
cacheSelection?: boolean;
/**
* 缓存变更记录,使切换分页时仍保留变更数据。
* 当设置了primaryKey或有字段设置了unique才起作用。
*/
cacheModified?: boolean;
/**
* 覆盖默认axios
*/
axios?: AxiosInstance;
/**
* 数据转为json的方式
* dirty - 只转换变更的数据,包括本身无变更但级联有变更的数据
* dirty-field - 只转数据中变更了的字段(包括主键和unique以及ignore为never的字段),包括本身无变更但级联有变更的数据
* selected - 只转换选中的数据,无关数据的变更状态
* all - 转换所有数据
* normal - 转换所有数据,且不会带上__status, __id等附加字段
* dirty-self - 同dirty, 但不转换级联数据
* dirty-field-self - 同dirty-field, 但不转换级联数据
* selected-self - 同selected, 但不转换级联数据
* all-self - 同all, 但不转换级联数据
* normal-self - 同normal, 但不转换级联数据
* @default dirty
*/
dataToJSON?: DataToJSON;
/**
* 级联查询参数
*/
cascadeParams?: (parent: Record, primaryKey?: string) => object;
/**
* 组合列排序查询
*/
combineSort?: boolean;
/**
* 树形选择策略
*/
selectionStrategy?: CheckedStrategy;
status?: DataSetStatus;
/**
* dataSet校验规则
*/
validationRules?: ValidationRule[];
}
export declare type DataSetContext = {
getConfig: typeof getConfig;
};
export default class DataSet extends EventManager {
static defaultProps: DataSetProps;
id?: string;
children: DataSetChildren;
private prepareForReport?;
get queryParameter(): object;
set queryParameter(queryParameter: object);
private pending;
performance: {
url?: string | undefined;
timing: {
fetchStart: number;
fetchEnd: number;
loadStart: number;
loadEnd: number;
};
};
originalData: Record[];
resetInBatch: boolean;
validating: boolean;
context?: DataSetContext | undefined;
lookupCaches?: ObservableMap<string, LookupCache>;
selectionStrategy?: CheckedStrategy;
parent?: DataSet;
name?: string;
parentName?: string;
records: Record[];
fields: Fields;
props: DataSetProps;
pageSize: number;
totalCount: number;
status: DataSetStatus;
exportStatus: DataSetExportStatus | undefined;
exportProgress: number;
currentPage: number;
selection: DataSetSelection | false;
cachedSelected: Record[];
cachedModified: Record[];
dataToJSON: DataToJSON;
state: ObservableMap<string, any>;
validationSelfErrors: ValidationSelfErrors[] | undefined;
$needToSortFields?: boolean;
get isAllPageSelection(): boolean;
get cascadeRecords(): Record[];
get axios(): AxiosInstance;
get dataKey(): string;
get totalKey(): string;
get lang(): Lang;
set lang(lang: Lang);
get queryDataSet(): DataSet | undefined;
/**
* 设置查询的DataSet.
* @param {DataSet} ds DataSet.
*/
set queryDataSet(ds: DataSet | undefined);
get queryUrl(): string | undefined;
/**
* 设置提交的Url.
* @param {String} url 提交的Url.
*/
set queryUrl(url: string | undefined);
get submitUrl(): string | undefined;
/**
* 设置查询的Url.
* @param {String} url 查询的Url.
*/
set submitUrl(url: string | undefined);
get tlsUrl(): string | undefined;
/**
* 设置多语言的Url.
* @param {String} url 多语言的Url.
*/
set tlsUrl(url: string | undefined);
get validateUrl(): string | undefined;
/**
* 设置远程校验查询请求的url.
* @param {String} url 远程校验查询请求的url.
*/
set validateUrl(url: string | undefined);
get exportUrl(): string | undefined;
/**
* 设置导出请求的url.
* @param {String} url 远程校验查询请求的url.
*/
set exportUrl(url: string | undefined);
/**
* 服务端导出还是客户端导出
*/
get exportMode(): ExportMode;
set transport(transport: Transport);
get transport(): Transport;
get feedback(): FeedBack;
get data(): Record[];
set data(records: Record[]);
get dirtyRecords(): [Record[], Record[], Record[]];
/**
* 获取新建的记录集
* @return 记录集
*/
get created(): Record[];
/**
* 获取变更的记录集
* @return 记录集
*/
get updated(): Record[];
/**
* 获取删除的记录集
* @return 记录集
*/
get destroyed(): Record[];
/**
* 获取选中的记录集
* @return 记录集
*/
get selected(): Record[];
/**
* 获取未选中的记录集, 在 isAllPageSelection 为 true 时有效
* @return 记录集
*/
get unSelected(): Record[];
get currentSelected(): Record[];
get currentUnSelected(): Record[];
get treeSelected(): Record[];
get totalPage(): number;
get currentIndex(): number;
set currentIndex(index: number);
/**
* 记录数
*/
get length(): number;
get hasChildren(): boolean;
get treeRecords(): Record[];
get treeData(): Record[];
get paging(): boolean | 'server';
set paging(paging: boolean | 'server');
get groups(): string[];
get groupedRecords(): Group[];
get groupedTreeRecords(): Group[];
/**
* 获取当前索引的记录
* @return record 记录
*/
get current(): Record | undefined;
/**
* 将记录设定为当前索引
* @param record 记录
*/
set current(record: Record | undefined);
get uniqueKeys(): string[] | undefined;
get cacheSelectionKeys(): string[] | undefined;
get cacheModifiedKeys(): string[] | undefined;
get cachedRecords(): Record[];
/**
* 获取所有记录包括缓存的选择记录
* @param index 索引
* @returns {Record}
*/
get all(): Record[];
get dirty(): boolean;
private inBatchSelection;
private syncChildrenRemote;
constructor(props?: DataSetProps, context?: DataSetContext);
processListener(): void;
destroy(): void;
setState(item: string | object, value?: any): DataSet;
getState(key: string): any;
snapshot(): DataSetSnapshot;
restore(snapshot: DataSetSnapshot): DataSet;
setAllPageSelection(enable: boolean): void;
toData(): object[];
/**
* 对应参数后续会废弃
* @param isSelected
* @param noCascade
*/
toJSONData(isSelected?: boolean, noCascade?: boolean): object[];
/**
* 等待选中或者所有记录准备就绪
* @returns Promise
*/
ready(_isSelect?: boolean): Promise<any>;
/**
* 查询记录
* @param page 页码
* @param params 查询参数
* @param cache 是否保留 cachedRecords
* @return Promise
*/
query(page?: number, params?: object, cache?: boolean): Promise<any>;
/**
* 查询更多记录,查询到的结果会拼接到原有数据之后
* @param page 页码
* @param params 查询参数
* @return Promise
*/
queryMore(page?: number, params?: object): Promise<any>;
queryMoreChild(parent: Record, page?: number, params?: object): Promise<any>;
doQuery(page: any, params?: object, cache?: boolean): Promise<any>;
doQueryMore(page: any, params?: object): Promise<any>;
doQueryMoreChild(parent: Record, page: any, params?: object): Promise<any>;
/**
* TODO 参数废弃
* 将数据集中的增删改的记录进行远程提交
* @param isSelect 如果为true,则只提交选中记录
* @param noCascade 如果为true,则不提交级联数据
* @return Promise
*/
submit(isSelect?: boolean, noCascade?: boolean): Promise<any>;
/**
* 强制将数据集中的增删改的记录进行远程提交, 绕过校验
* @return Promise
*/
forceSubmit(): Promise<any>;
/**
* 导出数据
* @param object columns 导出的列
* @param number exportQuantity 导出数量
*/
export(columns?: any, exportQuantity?: number): Promise<void | any[]>;
/**
* 可以把json数组通过ds配置转化成可以直接浏览的数据信息
* @param result 需要转化内容
* @param columnsExport 表头信息
*/
displayDataTransform(result: any[], columnsExport: any): any[];
/**
* 客户端导出方法
* @param data 表头数据
* @param quantity 输入一次导出数量
* @param isFile 是否导出为文件
*/
private doClientExport;
/**
* 重置更改
*/
reset(): DataSet;
/**
* 定位到指定页码,如果paging为true或`server`,则做远程查询,约定当为Tree 状态的server时候 跳转到下一页也就是index为当前的index加上1
* @param page 页码
* @return Promise
*/
page(page: number): Promise<any>;
/**
* 变更检查,当有变更时会弹确认框
* @param message 提示信息或者是confirm的参数
* @return Promise
*/
modifiedCheck(message?: any): Promise<boolean>;
/**
* 定位记录
* @param index 索引
* @return Promise
*/
locate(index: number): Promise<Record | undefined>;
/**
* 定位到第一条记录
* @return Promise
*/
first(): Promise<Record | undefined>;
/**
* 定位到最后一条记录
* @return Promise
*/
last(): Promise<Record | undefined>;
/**
* 定位到当前记录的上一条记录
* 若当前页中当前记录为第一条记录且有上一页,则会查询上一页并定位到上一页的最后一条记录
* @return Promise
*/
pre(): Promise<Record | undefined>;
/**
* 定位到当前记录的下一条记录
* 若当前页中当前记录为最后一条记录且有下一页,则会查询下一页并定位到下一页的第一条记录
* @return Promise
*/
next(): Promise<Record | undefined>;
/**
* 定位到首页
* @return Promise
*/
firstPage(): Promise<any>;
/**
* 定位到上一页
* @return Promise
*/
prePage(): Promise<any>;
/**
* 定位到下一页
* @return Promise
*/
nextPage(): Promise<any>;
/**
* 定位到尾页
* @return Promise
*/
lastPage(): Promise<any>;
/**
* 创建一条记录
* @param data 数据对象
* @param dataIndex 记录所在的索引
* @return 新建的记录
*/
create(data?: object, dataIndex?: number): Record;
/**
* 立即删除记录
* @param records 记录或者记录数组,默认当前记录
* @param confirmMessage 提示信息或弹窗的属性
* @return Promise
*/
delete(records?: Record | Record[], confirmMessage?: any): Promise<any>;
/**
* 临时删除记录
* @param records 记录或者记录数组
* @param locate 是否需要进行定位操作
*/
remove(records?: Record | Record[], forceRemove?: boolean, locate?: boolean): void;
/**
* 临时删除所有记录
*/
removeAll(forceRemove?: boolean): void;
/**
* 删除所有记录
* @param confirmMessage 提示信息或弹窗的属性
*/
deleteAll(confirmMessage?: any): Promise<any>;
/**
* 将若干数据记录插入记录堆栈顶部
* @param records 数据集
* @return 堆栈数量
*/
push(...records: Record[]): number;
/**
* 将若干数据记录插入记录堆栈底部
* @param records 数据集
* @return 堆栈数量
*/
unshift(...records: Record[]): number;
/**
* 从记录堆栈顶部获取记录
* @return 记录
*/
pop(): Record | undefined;
/**
* 从记录堆栈底部获取记录
* @return 记录
*/
shift(): Record | undefined;
/**
* 删除指定索引的若干记录,并可插入若干新记录
* @param from 索引开始的位置
* @default 0
* @param deleteCount 删除的数量
* @default 0
* @param records 插入的若干新记录
* @return 被删除的记录集
*/
splice(from: number, deleteCount: number, ...items: Record[]): (Record | undefined)[];
/**
* 切换记录的顺序
*/
move(from: number, to: number): void;
/**
* 截取指定索引范围的记录集,不改变原记录堆栈
* @param start 开始索引
* @default 0
* @param end 结束索引
* @default 记录堆栈长度
* @return 被删除的记录集
*/
slice(start?: number, end?: number): Record[];
/**
* 获取记录所在的索引
* @param record 记录
* @param fromIndex 开始检索的索引
* @return 索引
*/
indexOf(record: Record, fromIndex?: number): number;
/**
* 根据函数查找记录
* @param fn 查询函数
* @returns 记录
*/
find(fn: (record: Record, index: number, array: Record[]) => boolean): Record | undefined;
/**
* 根据函数查找记录所在的索引
* @param fn 查询函数
* @returns 索引
*/
findIndex(fn: (record: Record, index: number, array: Record[]) => boolean): number;
/**
* 根据函数遍历
* @param fn 遍历函数
* @param thisArg this对象
*/
forEach(fn: (record: Record, index: number, array: Record[]) => void, thisArg?: any): void;
/**
* 根据函数遍历并输出新数组
* @param fn 遍历函数
* @param thisArg this对象
* @returns 输出新数组
*/
map<U>(fn: (record: Record, index: number, array: Record[]) => U, thisArg?: any): U[];
/**
* 根据函数遍历,当有返回值为true时,输出true
* @param fn 遍历函数
* @param thisArg this对象
* @returns boolean
*/
some(fn: (record: Record, index: number, array: Record[]) => boolean, thisArg?: any): boolean;
/**
* 根据函数遍历,当有返回值为false时,输出false
* @param fn 遍历函数
* @param thisArg this对象
* @returns boolean
*/
every(fn: (record: Record, index: number, array: Record[]) => boolean, thisArg?: any): boolean;
/**
* 根据函数过滤并返回记录集
* @param fn 过滤函数
* @param thisArg this对象
* @returns {Record[]}
*/
filter(fn: (record: Record, index: number, array: Record[]) => boolean, thisArg?: any): Record[];
/**
* 为数组中的所有元素调用指定的回调函数。 回调函数的返回值是累计结果,并在下次调用回调函数时作为参数提供。
* @param fn 累计函数
* @param initialValue 初始值
* @returns {U}
*/
reduce<U>(fn: (previousValue: U, record: Record, index: number, array: Record[]) => U, initialValue: U): U;
/**
* 按降序调用数组中所有元素的指定回调函数。 回调函数的返回值是累计结果,并在下次调用回调函数时作为参数提供。
* @param fn 累计函数
* @param initialValue 初始值
* @returns {U}
*/
reduceRight<U>(fn: (previousValue: U, record: Record, index: number, array: Record[]) => U, initialValue: U): U;
/**
* 反转记录的顺序。
*/
reverse(): Record[];
/**
* 服务端排序
*
* @param fieldName
*/
sort(fieldName: string): void;
/**
* 选中记录
* @param recordOrIndex 记录或记录索引
*/
select(recordOrIndex: Record | number): void;
/**
* 取消选中记录
* @param recordOrIndex 记录或记录索引
*/
unSelect(recordOrIndex: Record | number): void;
/**
* 全选
*/
selectAll(filter?: (record: Record) => boolean): void;
/**
* 取消全选
*/
unSelectAll(): void;
/**
* 批量勾选
*/
batchSelect(recordOrId: (Record | number)[]): void;
/**
* 批量取消勾选
*/
batchUnSelect(recordOrId: (Record | number)[]): void;
treeSelect(record: Record): void;
treeUnSelect(record: Record): void;
clearCachedRecords(): void;
clearCachedSelected(): void;
setCachedSelected(cachedSelected: Record[]): void;
clearCachedModified(): void;
setCachedModified(cachedModified: Record[]): void;
/**
* 获取指定索引的记录
* @param index 索引
* @returns {Record}
*/
get(index: number): Record | undefined;
/**
* 从树形数据中获取指定索引的根节点记录
* @param index 索引
* @returns {Record}
*/
getFromTree(index: number): Record | undefined;
/**
* 判断是否有新增、变更或者删除的记录
* @deprecated
* @return true | false
*/
isModified(): boolean;
/**
* 获取指定分页的记录集
* @param page 如果page为空或者paging为server,则获取当前分页的记录集
* @return 记录集
*/
/**
* 根据记录ID查找记录
* @param id 记录ID
* @return 记录
*/
findRecordById(id: number | string): Record | undefined;
/**
* 清除校验结果
*/
clearValidationError(): void;
/**
* 校验数据记录是否有效 对应参数后续会废弃
* @param isSelected 是否只校验选中记录
* @param noCascade 是否级联校验
* @return true | false
*/
validate(isSelected?: boolean, noCascade?: boolean): Promise<boolean>;
/**
* 校验dataSet是否有效
* @return true | false
*/
validateSelf(): boolean;
reportValidityImmediately(valid: boolean, errors?: ValidationErrors[], fromField?: boolean): void;
reportSelfValidityImmediately(valid: boolean, errors?: ValidationSelfErrors[]): void;
reportValidity(result: ValidationErrors, fromField?: boolean): void;
getValidationErrors(): ValidationErrors[];
getValidationSelfErrors(): ValidationSelfErrors[];
private getValidationSelfError;
getAllValidationErrors(): AllValidationErrors;
/**
* 根据字段名获取字段
* @param fieldName 字段名
* @returns 字段
*/
getField(fieldName?: string): Field | undefined;
/**
* 获取分组字段名
* @returns 字段名列表
*/
getGroups(): string[];
initFields(fieldProps: FieldProps[]): [string, Field][];
addField(name: string, fieldProps?: FieldProps): Field;
commitData(allData: any[], total?: number, onlyDelete?: boolean): DataSet;
/**
* 数据集头行级联绑定
* @param ds 头数据集
* @param name 头数据集字段名
*/
bind(ds: DataSet, name: string): void;
/**
* 设置查询的参数.
* @param {string} para 参数名.
* @param {any} value 参数值.
*/
setQueryParameter(para: string, value: any): void;
/**
* 获取查询的参数.
* @param {string} para 参数名.
* @return {any} 参数值.
*/
getQueryParameter(para: string): any;
appendData(allData?: (object | Record)[], parent?: Record): DataSet;
loadData(allData?: (object | Record)[], total?: number, cache?: boolean): DataSet;
processData(allData: (object | Record)[], status?: RecordStatus, parent?: Record): Record[];
private deleteRecord;
private findInAllPage;
private getIndexInCurrentPage;
private transferRecords;
private initChildren;
private initQueryDataSet;
private initEvents;
private loadDataFromResponse;
private appendDataFromResponse;
private write;
private read;
private storeModified;
releaseCachedModified(): void;
private storeSelected;
releaseCachedSelected(cache?: boolean): void;
private changeStatus;
private changeSubmitStatus;
private handleCascade;
private handleLoadSuccess;
private handleLoadFail;
private handleSubmitSuccess;
private handleSubmitFail;
private syncChildren;
private syncChild;
private checkReadable;
/**
* page相关请求设置
* @param page 在那个页面, 小于0时不分页
* @param pageSizeInner 页面大小
*/
private generatePageQueryString;
private generateOrderQueryString;
/**
* 返回configure 配置的值
* @param page 在那个页面, 小于0时不分页
* @param pageSizeInner 页面大小
*/
private generateQueryString;
private getParentParams;
private generateQueryParameter;
getConfig<T extends ConfigKeys>(key: T): T extends keyof DefaultConfig ? DefaultConfig[T] : Config[T];
}