oak-frontend-base/lib/features/runningTree.d.ts

384 lines
17 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { EntityDict, StorageSchema, OpRecord } from "oak-domain/lib/types";
import { EntityDict as BaseEntityDict } from 'oak-domain/lib/base-app-domain';
import { AspectDict as CommonAspectDict } from 'oak-common-aspect';
import { NamedFilterItem, NamedSorterItem } from "../types/NamedCondition";
import { Cache } from './cache';
import { Pagination } from '../types/Pagination';
import { Feature } from '../types/Feature';
export declare const MODI_NEXT_PATH_SUFFIX = ":next";
type LegalOperation<ED extends EntityDict & BaseEntityDict, T extends keyof ED> = ED[T]['CreateSingle'] | ED[T]['Update'] | ED[T]['Remove'];
/**
* 树结点上的更新日志管理
*/
declare class UpdateLogManager<ED extends EntityDict & BaseEntityDict, T extends keyof ED> {
private logs;
private schema;
private entity;
maxLsn: number;
constructor(schema: StorageSchema<ED>, entity: T, maxLsn?: number);
/**
* 合并两个filter完全一致的更新
* @param oper1
* @param oper2
*/
private mergeOperation;
/**
* 增加一条更新日志记录
* @param lsn
* @param action
* @param data
* @param filter
*/
push(lsn: number, oper2: Omit<LegalOperation<ED, T>, "id">): void;
undo(filter: ED[T]['Update']['filter']): void;
/**
* 将lsn大于传入lsn的日志全部回滚
* @param lsn
*/
rollback(lsn: number): void;
makeOperations(): LegalOperation<ED, T>[];
isEmpty(): boolean;
}
declare abstract class Node<ED extends EntityDict & BaseEntityDict> extends Feature {
private zombie;
/**
* 当前有几个组件正在使用这个结点
*/
private count;
protected executing: boolean;
protected dirty?: boolean;
protected loading: number;
protected loadingMore: boolean;
private extraData;
increaseCount(): number;
decreaseCount(): number;
getCount(): number;
setZombie(zombie: boolean): void;
isZombie(): boolean;
abstract getModiOperations(): Array<{
entity: keyof ED;
operation: ED[keyof ED]['Operation'];
}> | undefined;
abstract setDirty(): void;
isDirty(): boolean;
isExecuting(): boolean;
setExecuting(executing: boolean): void;
isLoading(): boolean;
protected setLoading(loading: number): void;
isLoadingMore(): boolean;
saveExtraData(key: string, data: any): void;
loadExtraData(key: string): any;
abstract getParent(): Node<ED> | undefined;
}
declare abstract class EntityNode<ED extends EntityDict & BaseEntityDict, T extends keyof ED> extends Node<ED> {
protected entity: T;
protected schema: StorageSchema<ED>;
protected projection?: ED[T]['Selection']['data'] | (() => ED[T]['Selection']['data']);
protected parent?: SingleNode<ED, keyof ED> | ListNode<ED, keyof ED> | VirtualNode<ED>;
protected cache: Cache<ED>;
protected ulManager: UpdateLogManager<ED, T>;
constructor(entity: T, schema: StorageSchema<ED>, cache: Cache<ED>, projection?: ED[T]['Selection']['data'] | (() => Promise<ED[T]['Selection']['data']>), parent?: SingleNode<ED, keyof ED> | ListNode<ED, keyof ED> | VirtualNode<ED>);
getEntity(): T;
getSchema(): StorageSchema<ED>;
abstract checkIfClean(): void;
setDirty(): void;
getParent(): SingleNode<ED, keyof ED> | ListNode<ED, keyof ED> | VirtualNode<ED> | undefined;
protected getProjection(): ED[T]['Selection']['data'] | undefined;
setProjection(projection: ED[T]['Selection']['data']): void;
protected judgeRelation(attr: string): string | 0 | 1 | string[] | 2 | -1;
}
declare class ListNode<ED extends EntityDict & BaseEntityDict, T extends keyof ED> extends EntityNode<ED, T> {
protected children: Record<string, SingleNode<ED, T>>;
private filters;
private sorters;
private getTotal?;
private pagination;
private sr;
private syncHandler;
setFiltersAndSortedApplied(): void;
setLoading(loading: number): void;
setUnloading(loading: number): void;
startLoading(): void;
endLoading(): void;
checkIfClean(): void;
getModiOperations(): Array<{
entity: keyof ED;
operation: ED[keyof ED]['Operation'];
}> | undefined;
onCacheSync(records: OpRecord<ED>[]): void;
destroy(): void;
constructor(entity: T, schema: StorageSchema<ED>, cache: Cache<ED>, projection?: ED[T]['Selection']['data'] | (() => Promise<ED[T]['Selection']['data']>), parent?: SingleNode<ED, keyof ED> | VirtualNode<ED>, path?: string, filters?: NamedFilterItem<ED, T>[], sorters?: NamedSorterItem<ED, T>[], getTotal?: number, pagination?: Pick<Pagination, 'currentPage' | 'pageSize' | 'randomRange'>);
getPagination(): Pagination;
setPagination(pagination: Pick<Pagination, 'currentPage' | 'pageSize' | 'randomRange'>, dontRefresh?: true): void;
addChild(path: string, node: SingleNode<ED, T>): void;
removeChild(path: string): void;
getChild(path: string): SingleNode<ED, T>;
getNamedFilters(): (NamedFilterItem<ED, T> & {
applied?: boolean | undefined;
})[];
getNamedFilterByName(name: string): (NamedFilterItem<ED, T> & {
applied?: boolean | undefined;
}) | undefined;
setNamedFilters(filters: NamedFilterItem<ED, T>[], refresh?: boolean): void;
addNamedFilter(filter: NamedFilterItem<ED, T>, refresh?: boolean): void;
removeNamedFilter(filter: NamedFilterItem<ED, T>, refresh?: boolean): void;
removeNamedFilterByName(name: string, refresh?: boolean): void;
getNamedSorters(): (NamedSorterItem<ED, T> & {
applied?: boolean | undefined;
})[];
getNamedSorterByName(name: string): (NamedSorterItem<ED, T> & {
applied?: boolean | undefined;
}) | undefined;
setNamedSorters(sorters: NamedSorterItem<ED, T>[], refresh?: boolean): void;
addNamedSorter(sorter: NamedSorterItem<ED, T>, refresh?: boolean): void;
removeNamedSorter(sorter: NamedSorterItem<ED, T>, refresh?: boolean): void;
removeNamedSorterByName(name: string, refresh: boolean): void;
getFreshValue(inModiNextBranch?: boolean): Array<Partial<ED[T]['Schema']>>;
private addItemInner;
addItem(lsn: number, item: Omit<ED[T]['CreateSingle']['data'], 'id'> & {
id?: string;
}): string;
addItems(lsn: number, items: Array<Omit<ED[T]['CreateSingle']['data'], 'id'> & {
id?: string;
}>): string[];
private removeItemInner;
removeItem(lsn: number, id: string): void;
removeItems(lsn: number, ids: string[]): void;
private recoverItemInner;
recoverItem(id: string): void;
recoverItems(ids: string[]): void;
resetItem(id: string): void;
private preProcessUpdateData;
private updateItemInner;
/**
* 目前只支持根据itemId进行更新
* @param data
* @param id
* @param beforeExecute
* @param afterExecute
*/
updateItem(lsn: number, data: ED[T]['Update']['data'], id: string, action?: ED[T]['Action']): void;
updateItems(lsn: number, data: Record<string, ED[T]['Update']['data']>, ids: string[], action?: ED[T]['Action']): void;
composeOperations(paths?: string[]): Array<{
entity: keyof ED;
operation: ED[keyof ED]['Operation'];
}> | undefined;
getProjection(): ED[T]["Selection"]["data"] | undefined;
private constructFilters;
constructSelection(withParent?: true, ignoreNewParent?: boolean, ignoreUnapplied?: true): {
data: ED[T]["Selection"]["data"] | undefined;
filter: ED[T]["Selection"]["filter"] | undefined;
sorter: ED[T]["Selection"]["sorter"];
total: number | undefined;
indexFrom: number;
count: number;
};
/**
* 存留查询结果
*/
saveRefreshResult(sr: Awaited<ReturnType<CommonAspectDict<ED>['select']>>, append?: boolean, currentPage?: number): void;
refresh(pageNumber?: number, append?: boolean): Promise<void>;
loadMore(): Promise<void>;
setCurrentPage(currentPage: number): void;
clean(lsn?: number, dontPublish?: true): void;
getIntrinsticFilters(): ED[T]["Selection"]["filter"] | undefined;
}
declare class SingleNode<ED extends EntityDict & BaseEntityDict, T extends keyof ED> extends EntityNode<ED, T> {
private id?;
private sr;
protected children: {
[K: string]: SingleNode<ED, keyof ED> | ListNode<ED, keyof ED>;
};
private filters?;
constructor(entity: T, schema: StorageSchema<ED>, cache: Cache<ED>, path: string, projection?: ED[T]['Selection']['data'] | (() => Promise<ED[T]['Selection']['data']>), parent?: SingleNode<ED, keyof ED> | VirtualNode<ED> | ListNode<ED, T>, id?: string, filters?: NamedFilterItem<ED, T>[]);
getModiOperations(): Array<{
entity: keyof ED;
operation: ED[keyof ED]['Operation'];
}> | undefined;
setFiltersAndSortedApplied(): void;
setLoading(loading: number): void;
setUnloading(loading: number): void;
startLoading(): void;
endLoading(): void;
checkIfClean(): void;
destroy(): void;
getChild(path: string): SingleNode<ED, keyof ED> | ListNode<ED, keyof ED>;
setId(id: string): void;
unsetId(): void;
getId(): string | undefined;
getChildren(): {
[K: string]: SingleNode<ED, keyof ED> | ListNode<ED, keyof ED>;
};
addChild(path: string, node: SingleNode<ED, keyof ED> | ListNode<ED, keyof ED>): void;
removeChild(path: string): void;
getFreshValue(inModi?: boolean): Partial<ED[T]['Schema']> | undefined;
private refreshListChildren;
create(lsn: number, data: Partial<Omit<ED[T]['CreateSingle']['data'], 'id'>>): void;
update(lsn: number, data: ED[T]['Update']['data'], action?: ED[T]['Action']): void;
remove(lsn: number): void;
setDirty(): void;
/**
*
* @param path 如果指定了某条路径则只处理这条路径上的operation区分modi的前后项
* @returns
*/
composeOperations(paths?: string[]): Array<{
entity: keyof ED;
operation: ED[keyof ED]['Operation'];
}> | undefined;
getProjection(withDecendants?: boolean): ED[T]["Selection"]["data"] | undefined;
private passRsToChild;
saveRefreshResult(data: Record<string, any>): void;
refresh(): Promise<void>;
clean(lsn?: number, dontPublish?: true): void;
private getFilter;
getIntrinsticFilters(): ED[T]["Selection"]["filter"] | undefined;
/**
* getParentFilter不能假设一定已经有数据只能根据当前filter的条件去构造
* @param childNode
* @param disableOperation
* @returns
*/
getParentFilter<T2 extends keyof ED>(childNode: ListNode<ED, keyof ED>, ignoreNewParent?: boolean): ED[T2]['Selection']['filter'] | undefined;
}
declare class VirtualNode<ED extends EntityDict & BaseEntityDict> extends Node<ED> {
protected children: Record<string, SingleNode<ED, keyof ED> | ListNode<ED, keyof ED> | VirtualNode<ED>>;
constructor(path?: string, parent?: VirtualNode<ED>);
getModiOperations(): Array<{
entity: keyof ED;
operation: ED[keyof ED]['Operation'];
}> | undefined;
setDirty(): void;
setFiltersAndSortedApplied(): void;
addChild(path: string, child: SingleNode<ED, keyof ED> | ListNode<ED, keyof ED> | VirtualNode<ED>): void;
removeChild(path: string): void;
getChild(path: string): VirtualNode<ED> | SingleNode<ED, keyof ED> | ListNode<ED, keyof ED>;
getParent(): undefined;
destroy(): void;
getFreshValue(): undefined;
refresh(): Promise<void>;
composeOperations(paths?: string[]): Array<{
entity: keyof ED;
operation: ED[keyof ED]['Operation'];
}> | undefined;
setExecuting(executing: boolean): void;
clean(lsn?: number, dontPublish?: true): void;
checkIfClean(): void;
}
export type CreateNodeOptions<ED extends EntityDict & BaseEntityDict, T extends keyof ED> = {
path: string;
entity?: T;
isList?: boolean;
getTotal?: number;
projection?: ED[T]['Selection']['data'] | (() => ED[T]['Selection']['data']);
pagination?: Pick<Pagination, 'currentPage' | 'pageSize' | 'randomRange'>;
filters?: NamedFilterItem<ED, T>[];
sorters?: NamedSorterItem<ED, T>[];
beforeExecute?: (operations: ED[T]['Operation'][]) => Promise<void>;
afterExecute?: (operations: ED[T]['Operation'][]) => Promise<void>;
id?: string;
zombie: boolean;
};
export declare class RunningTree<ED extends EntityDict & BaseEntityDict> extends Feature {
private logSerailNumber;
private cache;
private schema;
private root;
constructor(cache: Cache<ED>, schema: StorageSchema<ED>);
createNode<T extends keyof ED>(options: CreateNodeOptions<ED, T>, isPage: boolean): ListNode<ED, T> | SingleNode<ED, T> | VirtualNode<ED>;
checkIsInModiNextBranch(path: string): boolean;
private findNode;
destroyNode(path: string, isPage: boolean): void;
begin(): () => void;
getFreshValue(path: string): Partial<ED[keyof ED]["Schema"]> | Partial<ED[keyof ED]["Schema"]>[] | undefined;
isDirty(path: string): boolean;
addItem<T extends keyof ED>(path: string, data: Omit<ED[T]['CreateSingle']['data'], 'id'> & {
id?: string;
}): string;
addItems<T extends keyof ED>(path: string, data: Array<Omit<ED[T]['CreateSingle']['data'], 'id'> & {
id?: string;
}>): string[];
removeItem(path: string, id: string): void;
removeItems(path: string, ids: string[]): void;
updateItem<T extends keyof ED>(path: string, data: ED[T]['Update']['data'], id: string, action?: ED[T]['Action']): void;
updateItems<T extends keyof ED>(path: string, data: ED[T]['Update']['data'], ids: string[], action?: ED[T]['Action']): void;
recoverItem(path: string, id: string): void;
recoverItems(path: string, ids: string[]): void;
resetItem(path: string, id: string): void;
create<T extends keyof ED>(path: string, data: Omit<ED[T]['CreateSingle']['data'], 'id'>): void;
update<T extends keyof ED>(path: string, data: ED[T]['Update']['data'], action?: ED[T]['Action']): void;
remove(path: string): void;
isLoading(path: string): boolean | undefined;
isLoadingMore(path: string): boolean | undefined;
isExecuting(path: string): boolean;
isListDescandent(path: string): boolean;
refresh(path: string, pageNumber?: number): Promise<void>;
loadMore(path: string): Promise<void>;
getPagination(path: string): Pagination;
setId(path: string, id: string): void;
unsetId(path: string): void;
getId(path: string): string | undefined;
getEntity(path: string): keyof ED;
setPageSize<T extends keyof ED>(path: string, pageSize: number): void;
setCurrentPage<T extends keyof ED>(path: string, currentPage: number): void;
getNamedFilters<T extends keyof ED>(path: string): (NamedFilterItem<ED, keyof ED> & {
applied?: boolean | undefined;
})[];
getNamedFilterByName<T extends keyof ED>(path: string, name: string): (NamedFilterItem<ED, keyof ED> & {
applied?: boolean | undefined;
}) | undefined;
setNamedFilters<T extends keyof ED>(path: string, filters: NamedFilterItem<ED, T>[], refresh?: boolean): void;
addNamedFilter<T extends keyof ED>(path: string, filter: NamedFilterItem<ED, T>, refresh?: boolean): void;
removeNamedFilter<T extends keyof ED>(path: string, filter: NamedFilterItem<ED, T>, refresh?: boolean): void;
removeNamedFilterByName<T extends keyof ED>(path: string, name: string, refresh?: boolean): void;
getNamedSorters<T extends keyof ED>(path: string): (NamedSorterItem<ED, keyof ED> & {
applied?: boolean | undefined;
})[];
getNamedSorterByName<T extends keyof ED>(path: string, name: string): (NamedSorterItem<ED, keyof ED> & {
applied?: boolean | undefined;
}) | undefined;
setNamedSorters<T extends keyof ED>(path: string, sorters: NamedSorterItem<ED, T>[], refresh?: boolean): void;
addNamedSorter<T extends keyof ED>(path: string, sorter: NamedSorterItem<ED, T>, refresh?: boolean): void;
removeNamedSorter<T extends keyof ED>(path: string, sorter: NamedSorterItem<ED, T>, refresh?: boolean): void;
removeNamedSorterByName(path: string, name: string, refresh?: boolean): void;
getIntrinsticFilters(path: string): ED[keyof ED]["Selection"]["filter"] | undefined;
getOperations(path: string): {
entity: keyof ED;
operation: ED[keyof ED]["Operation"];
}[] | undefined;
private cachedOperations;
private cachedModis;
/**
* 这个函数在reRender时可能会反复调用composeOperations很消耗性能在这里要做个缓存
* @param path
*/
redoBranchOperations(path: string): void;
/**
* 这个函数在reRender时可能会反复调用getModiOperations很消耗性能在这里要做个缓存
* @param path
*/
redoBranchModis(path: string): void;
tryExecute(path: string, action?: string): void;
execute<T extends keyof ED>(path: string, action?: ED[T]['Action'], opers?: Array<{
entity: keyof ED;
operation: ED[keyof ED]['Operation'];
}>): Promise<{
result: import("oak-domain/lib/types").OperationResult<ED>[] | Awaited<import("oak-domain/lib/types").OperationResult<ED>>;
message: string | null | undefined;
} | {
message: string;
}>;
savePoint(): number;
/**
* 将path上的更新清除
* @param path
* @param lsn 要清除到某个指定的savepoint不设则完全清空
* @param dontPublish
*/
clean(path: string, lsn?: number, dontPublish?: true): void;
getRoot(): Record<string, SingleNode<ED, keyof ED> | ListNode<ED, keyof ED> | VirtualNode<ED>>;
saveExtraData(path: string, key: string, data: any): void;
loadExtraData(path: string, key: string): any;
}
export {};