/// import EventEmitter from 'events'; import { DataLoadServiceI, JaqlPanel, JaqlRequest } from '../data-load/types.js'; import { TreeService } from '../tree-structure/index.js'; import { HeaderTreeNode, TreeNode, TreeServiceI } from '../tree-structure/types.js'; import { DivergenceComparator } from './DivergenceComparator.js'; import { AllDataInfo, DataServiceI, InitPageData, PivotTreeNode } from './types.js'; import { PluginService } from './utils/index.js'; import { GlobalStyles, PluginConfig } from './utils/plugins/types.js'; export declare type NodesChunk = { list: Array; size: number; ready: boolean; handled: boolean; }; export declare const DEFAULT_PAGE_SIZE = 100; export declare const EVENT_DATA_LOAD = "dataLoad"; export declare const EVENT_DATA_CHUNK_LOADED = "dataChunkLoaded"; export declare const EVENT_DATABAR_CHUNK_LOADED = "dataBarChunkLoaded"; export declare const EVENT_RANGEMINMAX_CHUNK_LOADED = "rangeMinMaxChunkLoaded"; export declare const EVENT_GRAND_CHUNK_LOADED = "grandChunkLoaded"; export declare const EVENT_DATA_FINISH_CHUNK_LOADED = "dataFinishChunkLoaded"; export declare const EVENT_FINISH_CHUNK_LOADED = "finishChunkLoaded"; export declare const EVENT_PROGRESS_ERROR = "progressError"; export declare const EVENT_HEADER_CELL_FORMAT = "headerCellFormat"; export declare const EVENT_DATA_CELL_FORMAT = "dataCellFormat"; export declare const EVENT_TOTAL_ROWS_COUNT = "totalRowsCountLoaded"; export declare const EVENT_TOTAL_COLUMNS_COUNT = "totalColumnsCountLoaded"; export declare const NODES_CHUNK_SIZE_MAX = 1000; export declare const THROTTLE_TIME_MS = 0; declare type Options = { throttle: Function; throttleTime: number; PluginService: typeof PluginService; skipInternalColorFormatting: boolean; subtotalsForSingleRow: boolean; }; export declare type DataServiceOptions = Partial; export declare class DataService implements DataServiceI { /** * * * @private * EventEmitter instance */ events: EventEmitter; /** * * * @private * * DataLoadServiceI instance */ loadService: DataLoadServiceI; /** * * * @private * * configuration options object */ options: Options; /** * * * @private * * loaded data chunks group */ tempDataChunks: Array; /** * * @private * * last not handled data chunks group index */ lastNotHandledChunkIndex: number; /** * * @private * * last ready but not handled data chunks group index */ lastReadyNotHandledChunkIndex: number; /** * * @private * * Current rows nodes */ rowsGrand?: PivotTreeNode; /** * @private */ rowsTreeService?: TreeServiceI; /** * @private */ columnsTreeService?: TreeServiceI; /** * @private */ cornerTreeService?: TreeServiceI; /** @private */ pageSize: number; /** * @private */ isPaginated: boolean; /** * * @private * * number of loaded pages */ loadedPagesCount: number; /** * * @private * * state for "loadData" method */ isLoadInProgress: boolean; /** * @private */ loadPromiseResolve?: Function; /** * @private */ loadPromiseReject?: Function; /** * @private */ loadPromiseCache?: InitPageData; /** * @private */ loadAllPromise?: Promise; /** * @private */ loadAllPromiseResolve?: Function; /** * @private */ loadAllPromiseReject?: Function; /** * * @private * * defines if all data is loaded */ isWholeDataLoaded: boolean; /** * * @private * * defines that data finish event is happened */ hasDataFinishEvent: boolean; /** * * @private * * defines that data handler in progress */ isDataHandlerThrottled: boolean; /** * * @private * * throttled data handler */ onDataHandlerThrottle: (data?: any) => void; /** * * @private * * jaql request pure metadata */ metadata: Array; dataBars: Array<[string, string]> | undefined; rangeMinMax: Array<[string, string]> | undefined; /** * * @private * * service for items indexation divergence */ divergenceComparator: DivergenceComparator; /** * * @private * * service to apply customers plugins */ pluginService?: PluginService; /** * @private */ rawJaql?: JaqlRequest; /** * * @private * * triggered events data storage */ triggeredEventsData: { [key: string]: any; }; /** * * @private * * plugins handlers */ callPlugins: Array; /** * * @private * * plugins global styles */ globalStyles?: GlobalStyles; /** * * @private * * actual data columns count */ columnsCount?: number; /** * * @private * * total data columns count */ totalColumnsCount?: number; /** * * @private * * actual data rows count */ rowsCount?: number; /** * * @private * * total data rows count */ totalRowsCount?: number; /** * * @private * * total CVS records count */ totalRecordsCount?: number; /** * * @private * * is rows limit reached */ limitReached?: boolean; constructor(loadService: DataLoadServiceI, events?: EventEmitter, options?: Partial); destroy(): void; /** * Subscribe to event notification * * @param {string} eventName - event name to subscribe * @param {Function} callback - event handler * @returns {void} */ on(eventName: string, callback: (...args: any[]) => void): void; /** * Emits event with payload * * @param {string} eventName - event name to emit * @param {Array} payload - event payload * @returns {void} */ emit(eventName: string, ...payload: Array): void; /** * Unsubscribe from event notification * * @param {string} eventName - event name to unsubscribe from * @param {Function} callback - event handler * @returns {void} */ off(eventName: string, callback: (...args: any[]) => void): void; /** * Initialize start data loading * * @param {JaqlRequest} [jaql] - JAQL request object * @param {object} [options] - additional options * @param {number} [options.pageSize=100] - page size to wait * @param {boolean} [options.isPaginated=false] - defines which type of treeService to return, * partial or paginated * @param {Array} [options.metadata] - jaql's metadata * @param {boolean} [options.cacheResult=false] - cache result for next call or not * @returns {Promise} - promise with initial data to render */ loadData(jaql?: JaqlRequest, options?: { pageSize?: number; isPaginated?: boolean; metadata?: Array; cacheResult?: boolean; }): Promise; /** * Sets Promise that resolves after all data loaded * * @returns {Promise<{ loadedRowsCount: number, totalItemsCount: number }>} - promise with * loaded items count */ loadAllData(): Promise; /** * public method for selecting page and setting new page size * * @param {number} selected - page number * @param {number} pageSize - set page size (optional) * @returns {Promise<{rowsTreeService, columnsTreeService, cornerTreeService, isLastPage}>} * - returns private method's call with panel's treeServices */ getSelectedPageData(selected: number, pageSize?: number): Promise; /** * public method for selecting page by indexes * * @param {number} from - first row's index * @param {number} to - last row's index * @param {boolean} lastPage - append grandTotals * @returns {Promise<{rowsTreeService, columnsTreeService, cornerTreeService, isLastPage}>} * - returns private method's call with panel's treeServices */ getIndexedPageData(from: number, to: number, lastPage?: boolean): Promise; /** * Returns current jaql request object * * @returns {JaqlRequest} - jaql request object */ getJaql(): JaqlRequest; /** * Defines data structure * * @returns {boolean} - true - single branch tree */ isSingleRowTree(): boolean; /** * Set cell process handlers * * @param {Array} handlers - object with target and handler * @returns {void} */ setPluginHandlers(handlers: Array): void; /** * Set global styles for all cells * * @param {GlobalStyles} [styles] - object with target and handler * @returns {void} */ setGlobalStyles(styles?: GlobalStyles): void; /** * Returns current raw jaql request object * * @returns {JaqlRequest} - composition of required jaql fields * @private */ getRawJaql(): JaqlRequest; /** * Returns current jaql request metadata array * * @returns {Array} - jaql request metadata * @private */ getMetadata(): Array; /** * Pre-process initial tree structure * * @param {Array} items - items to normalize * @param {string} type - items types to normalize * @param {object} options - additional options * @param {number} [options.level=0] - tree level, for internal use only * @param {object} [options.measurePath={}] - items types to normalize * @returns {Array} - normalized list of items */ preProcessTree(items: TreeNode | Array, type: string, options?: { level?: number; measurePath?: { [key: string]: string; }; }): Array; /** * Post-process final tree structure with formatting event * * @param {PivotTreeNode} items - list of PivotTreeNode items * @param {object} [options] - additional options * @param {boolean} [options.skipFormatEvent] - process tree but skip format event trigger * @param {boolean} [options.onlyFormatEvents] - process tree with format event trigger only * @param {Function} [options.iterateFn] - iterate function to call for each tree node * @returns {void} */ postProcessTree(items: Array, options?: { skipFormatEvent?: boolean; onlyFormatEvents?: boolean; iterateFn?: Function; }): void; /** * Post-process data list with formatting event * * @param {PivotTreeNode} items - list of PivotTreeNode rows items * @param {object} [options] - additional options * @param {boolean} [options.skipFormatEvent] - process data list but skip format event trigger * @param {boolean} [options.onlyFormatEvents] - process data list with format event * trigger only * @returns {void} */ postProcessData(items: Array, options?: { skipFormatEvent?: boolean; onlyFormatEvents?: boolean; }): void; /** * Modify tree structure for subtotals and grand totals and some customization * * @param {Array} items - base items to modify * @param {string} type - items types to normalize * @param {TreeNode} originalData - initial data object * @returns {PivotTreeNode | Array} - normalized list of items */ modifyTree(items: Array, type: string, originalData?: TreeNode): Array; /** * method calculates divergence by prev indexes * * @param {Array} items - data to modify divergence and apply * @returns {void} * @private */ applyIndexDivergence(items: Array): void; /** * method creates plugin service instance for pivot * * @param {JaqlRequest} jaql - data to modify divergence and apply * @returns {void} * @private */ initPluginService(jaql: JaqlRequest): void; /** * Cancel current loading process * * @returns {void} */ cancelLoading(): void; /** * Returns final page size, excluding grand totals rows for example * * @returns {number} - page size * @private */ getPageSize(): number; /** * * Send result for "loadData" function after promise resolve * * @param {number} loadedCount - count of already loaded rows * @returns {{ * rowsTreeService: TreeServiceI, * columnsTreeService: TreeServiceI, * corner: TreeNode, * values: TreeNode, * cellsMetadata: Map * }} - object with initial data * @private */ sendInitPage(loadedCount: number): InitPageData; /** * Sets Page Size and returns Tree Services * * @param {number} selected - page number -- STARTING FROM 0 * @param {number} [newPageSize] - set new pageSize * @returns {{ * rowsTreeService: null, * columnsTreeService: TreeServiceI, * cornerTreeService: TreeServiceI, * isLastPage: boolean * }} - returns panel's treeServices * @private */ sendPaginatedPage(selected: number, newPageSize?: number): InitPageData; /** * Returns partial tree by indexes * * @param {number} paramFrom - start index * @param {number} paramTo - stop index * @param {boolean} lastPage - append grandTotals * @returns {{ * rowsTreeService: TreeServiceI, * columnsTreeService: TreeServiceI, * cornerTreeService: TreeServiceI, * isLastPage: boolean * }} - returns panel's treeServices * @private */ sendPartialPage(paramFrom: number, paramTo: number, lastPage: boolean): InitPageData; /** * * Get current state of tree (not recommended to use before 'loadData') * * @returns {number} loadedCount - current loaded count of children * @private */ getLoadedElementsCount(): number; /** * Returns total amount items count handled on back-end side * * @deprecated * @returns {number} - items count * @private */ getTotalItemsCount(): number; /** * Getter for pivot table loaded columns number * * @deprecated * @returns {number} loadedCount - current loaded pivot table columns count * @private */ getLoadedColumnsCount(): number; /** * Attach events to load service * This is a key function implementing the Observer pattern * DataService acts as Observer and subscribes its handlers to various * data loading events emitted by the load service. * * * @returns {void} * @private */ attachEvent(): void; /** * Dettach events from load service * * @returns {void} * @private */ detachEvent(): void; /** * Handler for pivot metadata received event * * @returns {void} */ onMetadataHandler: () => void; onHeadersHandler: (data: HeaderTreeNode) => void; onDataHandler: (data: TreeNode | Array) => void; onGrandHandler: (data: TreeNode) => void; onFinishHandler: () => void; onTotalRowsHandler: (data: any) => void; onDataBarsHandler: (chunk: any) => void; onRangeMinMaxHandler: (chunk: any) => void; onDataFinishHandler: ({ rowsCount }?: { rowsCount?: number | undefined; }) => void; onErrorHandler: (data: any) => void; /** * Check for enough data loaded and resolve promise of "loadData" function * * @returns {void} * @private */ checkLoadPromise(): void; /** * @returns {void} * @private */ clearLoadAllPromise(): void; /** * @returns {void} * @private */ clearLoadPromise(): void; /** * Mark finish request * * @returns {void} * @private */ finishRequest(): void; /** * Clear internal cache in case new JAQL request send * * @returns {void} * @private */ clearCache(): void; static getEmptyPage(): InitPageData; static fillDataChunks(list: Array, node: TreeNode, firstMaxSize?: number, maxSize?: number): void; static cloneTreeNode(obj: T, skipChildren?: boolean): T; /** * @typedef {Function} buildColumnsTreeService * @param {HeaderTreeNode} originalColumnsTree * @returns {BuildColumnsTreeServiceResult} */ /** * @typedef {object} BuildColumnsTreeServiceResult * @property {TreeNode|undefined} columnsTree * @property {TreeService|undefined} columnsTreeService * @property {number} columnsCount * @property {number} totalColumnsCount */ /** * Creates builder function for building columns tree service * * @param {object} handlers - build handlers * @param {Function} handlers.getJaql - jaql getter * @param {Function} [handlers.getRawJaql] - raw jaql getter * @param {PluginService} [handlers.pluginService] - plugin service * @param {Function} [handlers.applyIndexDivergence] - helper for calculation indexes divergence * @param {object} [events] - build event emitters * @param {Function} events.emitHeaderCellFormatEvent - emits EVENT_HEADER_CELL_FORMAT event * @returns {buildColumnsTreeService} - build function */ static createColumnsTreeServiceBuilder(handlers: { getJaql: () => JaqlRequest; getRawJaql?: () => JaqlRequest; pluginService?: PluginService; applyIndexDivergence?: (items: Array) => void; }, events?: { emitHeaderCellFormatEvent: (item: PivotTreeNode, panel: JaqlPanel | undefined, jaql: JaqlRequest) => void; }): (originalColumnsTree: HeaderTreeNode) => { columnsTree: TreeNode | undefined; columnsTreeService: TreeService | undefined; columnsCount: number; totalColumnsCount: number; }; /** * @typedef {Function} buildCornerTreeService * @param {HeaderTreeNode} originalColumnsTree * @returns {BuildCornerTreeServiceResult} */ /** * @typedef {object} BuildCornerTreeServiceResult * @property {TreeNode|undefined} columnsTree * @property {TreeService|undefined} columnsTreeService * @property {number} columnsCount * @property {number} totalColumnsCount */ /** * Creates builder function for building corners tree service * * @param {object} handlers - build handlers * @param {Function} handlers.getJaql - jaql getter * @param {Function} [handlers.getRawJaql] - raw jaql getter * @param {PluginService} [handlers.pluginService] - plugin service * @param {TreeServiceI} [handlers.columnsTreeService] - column tree service * @param {object} [events] - build event emitters * @param {Function} events.emitHeaderCellFormatEvent - emits EVENT_HEADER_CELL_FORMAT event * @returns {buildCornerTreeService} - build function */ static createCornerTreeServiceBuilder(handlers: { getJaql: () => JaqlRequest; getRawJaql?: () => JaqlRequest; pluginService?: PluginService; columnsTreeService?: TreeServiceI; }, events?: { emitHeaderCellFormatEvent: (item: PivotTreeNode, panel: JaqlPanel | undefined, jaql: JaqlRequest) => void; }): () => { cornerTree: TreeNode | undefined; cornerTreeService: TreeService | undefined; }; } export default DataService;