@nova-ui/dashboards
Version:
Nova Dashboards is a framework designed to provide feature developers with a common solution for presenting data coming from various sources within a single view, as well as a set of predefined widget visualizations that are 100% configuration-driven and
84 lines • 14.4 kB
JavaScript
import { Injectable } from "@angular/core";
// eslint-disable-next-line import/no-deprecated
import { merge } from "rxjs";
import { filter, map, takeUntil, tap } from "rxjs/operators";
import { nameof } from "@nova-ui/bits";
import { SCROLL_NEXT_PAGE } from "../../../services/types";
import * as i0 from "@angular/core";
export class VirtualScrollFeatureAddonService {
constructor() {
this.visibleItems = [];
}
initWidget(widget) {
this.widget = widget;
}
initVirtualScroll(widget) {
if (!this.widget) {
this.initWidget(widget);
}
if (this.widget.hasVirtualScroll) {
this.registerVirtualScroll();
}
else {
this.deregisterVirtualScroll();
}
}
registerVirtualScroll() {
if (this.widget.dataSource) {
this.widget.dataSource.registerComponent({
[nameof("virtualScroll")]: {
componentInstance: this.widget.viewportManager,
},
});
}
}
deregisterVirtualScroll() {
if (this.widget.dataSource) {
this.widget.dataSource.deregisterComponent?.(nameof("virtualScroll"));
}
}
/**
* Subscribe to virtual scroll rendered items and fetches next items
*/
subscribeToVirtualScroll() {
if (!this.widget.vscrollViewport) {
return;
}
// Note: Using this additional stream to pass the visible range to
// the table and trigger change detection on range change and table data update.
// eslint-disable-next-line import/no-deprecated
merge(this.widget.vscrollViewport.renderedRangeStream, this.widget.tableUpdate$.pipe(map(() => this.widget.vscrollViewport?.getRenderedRange())))
.pipe(tap((range) => {
this.visibleItems = this.widget.tableData.slice(range?.start, range?.end);
// Since we're using onPush strategy we should trigger CD manually to ensure that visible items are updated properly
this.widget.changeDetector.detectChanges();
}), takeUntil(this.widget.onDestroy$))
.subscribe();
this.widget.viewportManager
.setViewport(this.widget.vscrollViewport)
.observeNextPage$({
pageSize: this.widget.range,
emitFirstPage: true,
})
.pipe(
// Note: A special check to keep our server-client-side sorting in place
filter((range) => range.end >=
(this.widget.vscrollViewport?.getDataLength() ?? 0)), tap((range) => this.widget.zone.run(() => {
// TODO: Remove "page" in V10. Compute page on datasource level. - NUI-5830
// @ts-ignore: Provide a proper interface to DS
this.widget.dataSource.page =
range.end / (range.end - range.start);
this.widget.eventBus
.getStream(SCROLL_NEXT_PAGE)
.next({});
this.widget.changeDetector.detectChanges();
})), takeUntil(this.widget.onDestroy$))
.subscribe();
}
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: VirtualScrollFeatureAddonService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: VirtualScrollFeatureAddonService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: VirtualScrollFeatureAddonService, decorators: [{
type: Injectable
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlydHVhbC1zY3JvbGwtZmVhdHVyZS1hZGRvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlLXdpZGdldC9hZGRvbnMvdmlydHVhbC1zY3JvbGwtZmVhdHVyZS1hZGRvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXFCQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLGdEQUFnRDtBQUNoRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3RCxPQUFPLEVBQWdCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVyRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFJM0QsTUFBTSxPQUFPLGdDQUFnQztJQUQ3QztRQUlXLGlCQUFZLEdBQWMsRUFBRSxDQUFDO0tBK0Z2QztJQTdGVSxVQUFVLENBQUMsTUFBNEI7UUFDMUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDekIsQ0FBQztJQUVNLGlCQUFpQixDQUFDLE1BQTRCO1FBQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMzQjtRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRTtZQUM5QixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztTQUNoQzthQUFNO1lBQ0gsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7U0FDbEM7SUFDTCxDQUFDO0lBRU8scUJBQXFCO1FBQ3pCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7WUFDeEIsSUFB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IMKpIDIwMjIgU29sYXJXaW5kcyBXb3JsZHdpZGUsIExMQy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vICBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyAgVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgeyBMaXN0UmFuZ2UgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zXCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZGVwcmVjYXRlZFxuaW1wb3J0IHsgbWVyZ2UgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5cbmltcG9ydCB7IElOb3ZhRmlsdGVycywgbmFtZW9mIH0gZnJvbSBcIkBub3ZhLXVpL2JpdHNcIjtcblxuaW1wb3J0IHsgU0NST0xMX05FWFRfUEFHRSB9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy90eXBlc1wiO1xuaW1wb3J0IHsgVGFibGVXaWRnZXRDb21wb25lbnQgfSBmcm9tIFwiLi4vcHVibGljLWFwaVwiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVmlydHVhbFNjcm9sbEZlYXR1cmVBZGRvblNlcnZpY2Uge1xuICAgIHByaXZhdGUgd2lkZ2V0OiBUYWJsZVdpZGdldENvbXBvbmVudDsgLy8gVE9ETzogZ2VuZXJpYyB3aWRnZXRcblxuICAgIHB1YmxpYyB2aXNpYmxlSXRlbXM6IHVua25vd25bXSA9IFtdO1xuXG4gICAgcHVibGljIGluaXRXaWRnZXQod2lkZ2V0OiBUYWJsZVdpZGdldENvbXBvbmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLndpZGdldCA9IHdpZGdldDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdFZpcnR1YWxTY3JvbGwod2lkZ2V0OiBUYWJsZVdpZGdldENvbXBvbmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMud2lkZ2V0KSB7XG4gICAgICAgICAgICB0aGlzLmluaXRXaWRnZXQod2lkZ2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLndpZGdldC5oYXNWaXJ0dWFsU2Nyb2xsKSB7XG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyVmlydHVhbFNjcm9sbCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kZXJlZ2lzdGVyVmlydHVhbFNjcm9sbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWdpc3RlclZpcnR1YWxTY3JvbGwoKSB7XG4gICAgICAgIGlmICh0aGlzLndpZGdldC5kYXRhU291cmNlKSB7XG4gICAgICAgICAgICB0aGlzLndpZGdldC5kYXRhU291cmNlLnJlZ2lzdGVyQ29tcG9uZW50KHtcbiAgICAgICAgICAgICAgICBbbmFtZW9mPElOb3ZhRmlsdGVycz4oXCJ2aXJ0dWFsU2Nyb2xsXCIpXToge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZTogdGhpcy53aWRnZXQudmlld3BvcnRNYW5hZ2VyLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZGVyZWdpc3RlclZpcnR1YWxTY3JvbGwoKSB7XG4gICAgICAgIGlmICh0aGlzLndpZGdldC5kYXRhU291cmNlKSB7XG4gICAgICAgICAgICB0aGlzLndpZGdldC5kYXRhU291cmNlLmRlcmVnaXN0ZXJDb21wb25lbnQ/LihcbiAgICAgICAgICAgICAgICBuYW1lb2Y8SU5vdmFGaWx0ZXJzPihcInZpcnR1YWxTY3JvbGxcIilcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdWJzY3JpYmUgdG8gdmlydHVhbCBzY3JvbGwgcmVuZGVyZWQgaXRlbXMgYW5kIGZldGNoZXMgbmV4dCBpdGVtc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdWJzY3JpYmVUb1ZpcnR1YWxTY3JvbGwoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy53aWRnZXQudnNjcm9sbFZpZXdwb3J0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3RlOiBVc2luZyB0aGlzIGFkZGl0aW9uYWwgc3RyZWFtIHRvIHBhc3MgdGhlIHZpc2libGUgcmFuZ2UgdG9cbiAgICAgICAgLy8gdGhlIHRhYmxlIGFuZCB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gb24gcmFuZ2UgY2hhbmdlIGFuZCB0YWJsZSBkYXRhIHVwZGF0ZS5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1kZXByZWNhdGVkXG4gICAgICAgIG1lcmdlKFxuICAgICAgICAgICAgdGhpcy53aWRnZXQudnNjcm9sbFZpZXdwb3J0LnJlbmRlcmVkUmFuZ2VTdHJlYW0sXG4gICAgICAgICAgICB0aGlzLndpZGdldC50YWJsZVVwZGF0ZSQucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKCkgPT4gdGhpcy53aWRnZXQudnNjcm9sbFZpZXdwb3J0Py5nZXRSZW5kZXJlZFJhbmdlKCkpXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHRhcCgocmFuZ2U6IExpc3RSYW5nZSB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpc2libGVJdGVtcyA9IHRoaXMud2lkZ2V0LnRhYmxlRGF0YS5zbGljZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlPy5zdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlPy5lbmRcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2Ugd2UncmUgdXNpbmcgb25QdXNoIHN0cmF0ZWd5IHdlIHNob3VsZCB0cmlnZ2VyIENEIG1hbnVhbGx5IHRvIGVuc3VyZSB0aGF0IHZpc2libGUgaXRlbXMgYXJlIHVwZGF0ZWQgcHJvcGVybHlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53aWRnZXQuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLndpZGdldC5vbkRlc3Ryb3kkKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgICAgIHRoaXMud2lkZ2V0LnZpZXdwb3J0TWFuYWdlclxuICAgICAgICAgICAgLnNldFZpZXdwb3J0KHRoaXMud2lkZ2V0LnZzY3JvbGxWaWV3cG9ydClcbiAgICAgICAgICAgIC5vYnNlcnZlTmV4dFBhZ2UkKHtcbiAgICAgICAgICAgICAgICBwYWdlU2l6ZTogdGhpcy53aWRnZXQucmFuZ2UsXG4gICAgICAgICAgICAgICAgZW1pdEZpcnN0UGFnZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAvLyBOb3RlOiBBIHNwZWNpYWwgY2hlY2sgdG8ga2VlcCBvdXIgc2VydmVyLWNsaWVudC1zaWRlIHNvcnRpbmcgaW4gcGxhY2VcbiAgICAgICAgICAgICAgICBmaWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgIChyYW5nZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmVuZCA+PVxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMud2lkZ2V0LnZzY3JvbGxWaWV3cG9ydD8uZ2V0RGF0YUxlbmd0aCgpID8/IDApXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB0YXAoKHJhbmdlKSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLndpZGdldC56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBSZW1vdmUgXCJwYWdlXCIgaW4gVjEwLiBDb21wdXRlIHBhZ2Ugb24gZGF0YXNvdXJjZSBsZXZlbC4gLSBOVUktNTgzMFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZTogUHJvdmlkZSBhIHByb3BlciBpbnRlcmZhY2UgdG8gRFNcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2lkZ2V0LmRhdGFTb3VyY2UucGFnZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuZW5kIC8gKHJhbmdlLmVuZCAtIHJhbmdlLnN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2lkZ2V0LmV2ZW50QnVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN0cmVhbShTQ1JPTExfTkVYVF9QQUdFKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXh0KHt9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2lkZ2V0LmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLndpZGdldC5vbkRlc3Ryb3kkKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgIH1cbn1cbiJdfQ==