UNPKG

choerodon-ui

Version:

An enterprise-class UI design language and React-based implementation

903 lines (902 loc) 27.5 kB
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]; }