UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

129 lines 15.7 kB
/** * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling'; import { CdkTree, CdkTreeNodeOutletContext } from '@angular/cdk/tree'; import { ChangeDetectionStrategy, Component, Input, ViewChild, ViewEncapsulation } from '@angular/core'; import { NzTreeNodeOutletDirective } from './outlet'; import { NzTreeView } from './tree'; import * as i0 from "@angular/core"; import * as i1 from "@angular/cdk/scrolling"; import * as i2 from "./outlet"; import * as i3 from "./node"; const DEFAULT_SIZE = 28; export class NzTreeVirtualScrollViewComponent extends NzTreeView { constructor() { super(...arguments); this.nzItemSize = DEFAULT_SIZE; this.nzMinBufferPx = DEFAULT_SIZE * 5; this.nzMaxBufferPx = DEFAULT_SIZE * 10; this.nodes = []; this.innerTrackBy = i => i; } ngOnChanges(changes) { if (changes.trackBy) { if (typeof changes.trackBy.currentValue === 'function') { this.innerTrackBy = (index, n) => this.trackBy(index, n.data); } else { this.innerTrackBy = i => i; } } } get compareBy() { const baseTreeControl = this.treeControl; if (baseTreeControl.trackBy) { return baseTreeControl.trackBy; } return null; } renderNodeChanges(data) { this.nodes = new Array(...data).map((n, i) => this.createNode(n, i)); this._dataSourceChanged.next(); this.changeDetectorRef.markForCheck(); } createNode(nodeData, index) { const node = this._getNodeDef(nodeData, index); const context = new CdkTreeNodeOutletContext(nodeData); if (this.treeControl.getLevel) { context.level = this.treeControl.getLevel(nodeData); } else { context.level = 0; } return { data: nodeData, context, nodeDef: node }; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: NzTreeVirtualScrollViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.3", type: NzTreeVirtualScrollViewComponent, selector: "nz-tree-virtual-scroll-view", inputs: { nzItemSize: "nzItemSize", nzMinBufferPx: "nzMinBufferPx", nzMaxBufferPx: "nzMaxBufferPx", trackBy: "trackBy" }, host: { properties: { "class.ant-tree-block-node": "nzDirectoryTree || nzBlockNode", "class.ant-tree-directory": "nzDirectoryTree", "class.ant-tree-rtl": "dir === 'rtl'" }, classAttribute: "ant-tree" }, providers: [ { provide: NzTreeView, useExisting: NzTreeVirtualScrollViewComponent }, { provide: CdkTree, useExisting: NzTreeVirtualScrollViewComponent } ], viewQueries: [{ propertyName: "nodeOutlet", first: true, predicate: NzTreeNodeOutletDirective, descendants: true, static: true }, { propertyName: "virtualScrollViewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true, static: true }], exportAs: ["nzTreeVirtualScrollView"], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: ` <div class="ant-tree-list"> <cdk-virtual-scroll-viewport class="ant-tree-list-holder" [itemSize]="nzItemSize" [minBufferPx]="nzMinBufferPx" [maxBufferPx]="nzMaxBufferPx" > <ng-container *cdkVirtualFor="let item of nodes; let i = index; trackBy: innerTrackBy"> <ng-template nzTreeVirtualScrollNodeOutlet [data]="item" [compareBy]="compareBy"></ng-template> </ng-container> </cdk-virtual-scroll-viewport> </div> <ng-container nzTreeNodeOutlet></ng-container> `, isInline: true, dependencies: [{ kind: "directive", type: i1.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i1.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i1.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: i2.NzTreeNodeOutletDirective, selector: "[nzTreeNodeOutlet]" }, { kind: "directive", type: i3.NzTreeVirtualScrollNodeOutletDirective, selector: "[nzTreeVirtualScrollNodeOutlet]", inputs: ["data", "compareBy"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: NzTreeVirtualScrollViewComponent, decorators: [{ type: Component, args: [{ selector: 'nz-tree-virtual-scroll-view', exportAs: 'nzTreeVirtualScrollView', template: ` <div class="ant-tree-list"> <cdk-virtual-scroll-viewport class="ant-tree-list-holder" [itemSize]="nzItemSize" [minBufferPx]="nzMinBufferPx" [maxBufferPx]="nzMaxBufferPx" > <ng-container *cdkVirtualFor="let item of nodes; let i = index; trackBy: innerTrackBy"> <ng-template nzTreeVirtualScrollNodeOutlet [data]="item" [compareBy]="compareBy"></ng-template> </ng-container> </cdk-virtual-scroll-viewport> </div> <ng-container nzTreeNodeOutlet></ng-container> `, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { provide: NzTreeView, useExisting: NzTreeVirtualScrollViewComponent }, { provide: CdkTree, useExisting: NzTreeVirtualScrollViewComponent } ], host: { class: 'ant-tree', '[class.ant-tree-block-node]': 'nzDirectoryTree || nzBlockNode', '[class.ant-tree-directory]': 'nzDirectoryTree', '[class.ant-tree-rtl]': `dir === 'rtl'` } }] }], propDecorators: { nodeOutlet: [{ type: ViewChild, args: [NzTreeNodeOutletDirective, { static: true }] }], virtualScrollViewport: [{ type: ViewChild, args: [CdkVirtualScrollViewport, { static: true }] }], nzItemSize: [{ type: Input }], nzMinBufferPx: [{ type: Input }], nzMaxBufferPx: [{ type: Input }], trackBy: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS12aXJ0dWFsLXNjcm9sbC12aWV3LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vY29tcG9uZW50cy90cmVlLXZpZXcvdHJlZS12aXJ0dWFsLXNjcm9sbC12aWV3LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxPQUFPLEVBQUUsd0JBQXdCLEVBQW1CLE1BQU0sbUJBQW1CLENBQUM7QUFDdkYsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsS0FBSyxFQUlMLFNBQVMsRUFDVCxpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFLdkIsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7Ozs7O0FBRXBDLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztBQWlDeEIsTUFBTSxPQUFPLGdDQUFvQyxTQUFRLFVBQWE7SUEvQnRFOztRQW1DVyxlQUFVLEdBQUcsWUFBWSxDQUFDO1FBQzFCLGtCQUFhLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQztRQUNqQyxrQkFBYSxHQUFHLFlBQVksR0FBRyxFQUFFLENBQUM7UUFFM0MsVUFBSyxHQUFvQyxFQUFFLENBQUM7UUFDNUMsaUJBQVksR0FBOEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0F5Q2xFO0lBdkNDLFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUU7WUFDbkIsSUFBSSxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxLQUFLLFVBQVUsRUFBRTtnQkFDdEQsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLEtBQWEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxF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b3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcbmltcG9ydCB7IENka1RyZWUsIENka1RyZWVOb2RlT3V0bGV0Q29udGV4dCwgQmFzZVRyZWVDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3RyZWUnO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVHJhY2tCeUZ1bmN0aW9uLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBOelNhZmVBbnkgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuXG5pbXBvcnQgeyBOelRyZWVWaXJ0dWFsTm9kZURhdGEgfSBmcm9tICcuL25vZGUnO1xuaW1wb3J0IHsgTnpUcmVlTm9kZU91dGxldERpcmVjdGl2ZSB9IGZyb20gJy4vb3V0bGV0JztcbmltcG9ydCB7IE56VHJlZVZpZXcgfSBmcm9tICcuL3RyZWUnO1xuXG5jb25zdCBERUZBVUxUX1NJWkUgPSAyODtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbnotdHJlZS12aXJ0dWFsLXNjcm9sbC12aWV3JyxcbiAgZXhwb3J0QXM6ICduelRyZWVWaXJ0dWFsU2Nyb2xsVmlldycsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cImFudC10cmVlLWxpc3RcIj5cbiAgICAgIDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnRcbiAgICAgICAgY2xhc3M9XCJhbnQtdHJlZS1saXN0LWhvbGRlclwiXG4gICAgICAgIFtpdGVtU2l6ZV09XCJuekl0ZW1TaXplXCJcbiAgICAgICAgW21pbkJ1ZmZlclB4XT1cIm56TWluQnVmZmVyUHhcIlxuICAgICAgICBbbWF4QnVmZmVyUHhdPVwibnpNYXhCdWZmZXJQeFwiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXIgKmNka1ZpcnR1YWxGb3I9XCJsZXQgaXRlbSBvZiBub2RlczsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogaW5uZXJUcmFja0J5XCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIG56VHJlZVZpcnR1YWxTY3JvbGxOb2RlT3V0bGV0IFtkYXRhXT1cIml0ZW1cIiBbY29tcGFyZUJ5XT1cImNvbXBhcmVCeVwiPjwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9jZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQ+XG4gICAgPC9kaXY+XG4gICAgPG5nLWNvbnRhaW5lciBuelRyZWVOb2RlT3V0bGV0PjwvbmctY29udGFpbmVyPlxuICBgLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgcHJvdmlkZXJzOiBbXG4gICAgeyBwcm92aWRlOiBOelRyZWVWaWV3LCB1c2VFeGlzdGluZzogTnpUcmVlVmlydHVhbFNjcm9sbFZpZXdDb21wb25lbnQgfSxcbiAgICB7IHByb3ZpZGU6IENka1RyZWUsIHVzZUV4aXN0aW5nOiBOelRyZWVWaXJ0dWFsU2Nyb2xsVmlld0NvbXBvbmVudCB9XG4gIF0sXG4gIGhvc3Q6IHtcbiAgICBjbGFzczogJ2FudC10cmVlJyxcbiAgICAnW2NsYXNzLmFudC10cmVlLWJsb2NrLW5vZGVdJzogJ256RGlyZWN0b3J5VHJlZSB8fCBuekJsb2NrTm9kZScsXG4gICAgJ1tjbGFzcy5hbnQtdHJlZS1kaXJlY3RvcnldJzogJ256RGlyZWN0b3J5VHJlZScsXG4gICAgJ1tjbGFzcy5hbnQtdHJlZS1ydGxdJzogYGRpciA9PT0gJ3J0bCdgXG4gIH1cbn0pXG5leHBvcnQgY2xhc3MgTnpUcmVlVmlydHVhbFNjcm9sbFZpZXdDb21wb25lbnQ8VD4gZXh0ZW5kcyBOelRyZWVWaWV3PFQ+IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQFZpZXdDaGlsZChOelRyZWVOb2RlT3V0bGV0RGlyZWN0aXZlLCB7IHN0YXRpYzogdHJ1ZSB9KSByZWFkb25seSBub2RlT3V0bGV0ITogTnpUcmVlTm9kZU91dGxldERpcmVjdGl2ZTtcbiAgQFZpZXdDaGlsZChDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQsIHsgc3RhdGljOiB0cnVlIH0pIHJlYWRvbmx5IHZpcnR1YWxTY3JvbGxWaWV3cG9ydCE6IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydDtcblxuICBASW5wdXQoKSBuekl0ZW1TaXplID0gREVGQVVMVF9TSVpFO1xuICBASW5wdXQoKSBuek1pbkJ1ZmZlclB4ID0gREVGQVVMVF9TSVpFICogNTtcbiAgQElucHV0KCkgbnpNYXhCdWZmZXJQeCA9IERFRkFVTFRfU0laRSAqIDEwO1xuICBASW5wdXQoKSBvdmVycmlkZSB0cmFja0J5ITogVHJhY2tCeUZ1bmN0aW9uPFQ+O1xuICBub2RlczogQXJyYXk8TnpUcmVlVmlydHVhbE5vZGVEYXRhPFQ+PiA9IFtdO1xuICBpbm5lclRyYWNrQnk6IFRyYWNrQnlGdW5jdGlvbjxOelRyZWVWaXJ0dWFsTm9kZURhdGE8VD4+ID0gaSA9PiBpO1xuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy50cmFja0J5KSB7XG4gICAgICBpZiAodHlwZW9mIGNoYW5nZXMudHJhY2tCeS5jdXJyZW50VmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5pbm5lclRyYWNrQnkgPSAoaW5kZXg6IG51bWJlciwgbikgPT4gdGhpcy50cmFja0J5KGluZGV4LCBuLmRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbm5lclRyYWNrQnkgPSBpID0+IGk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IGNvbXBhcmVCeSgpOiAoKHZhbHVlOiBUKSA9PiBOelNhZmVBbnkpIHwgbnVsbCB7XG4gICAgY29uc3QgYmFzZVRyZWVDb250cm9sID0gdGhpcy50cmVlQ29udHJvbCBhcyBCYXNlVHJlZUNvbnRyb2w8VCwgTnpTYWZlQW55PjtcbiAgICBpZiAoYmFzZVRyZWVDb250cm9sLnRyYWNrQnkpIHtcbiAgICAgIHJldHVybiBiYXNlVHJlZUNvbnRyb2wudHJhY2tCeTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlck5vZGVDaGFuZ2VzKGRhdGE6IFRbXSB8IHJlYWRvbmx5IFRbXSk6IHZvaWQge1xuICAgIHRoaXMubm9kZXMgPSBuZXcgQXJyYXkoLi4uZGF0YSkubWFwKChuLCBpKSA9PiB0aGlzLmNyZWF0ZU5vZGUobiwgaSkpO1xuICAgIHRoaXMuX2RhdGFTb3VyY2VDaGFuZ2VkLm5leHQoKTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVOb2RlKG5vZGVEYXRhOiBULCBpbmRleDogbnVtYmVyKTogTnpUcmVlVmlydHVhbE5vZGVEYXRhPFQ+IHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5fZ2V0Tm9kZURlZihub2RlRGF0YSwgaW5kZXgpO1xuICAgIGNvbnN0IGNvbnRleHQgPSBuZXcgQ2RrVHJlZU5vZGVPdXRsZXRDb250ZXh0PFQ+KG5vZGVEYXRhKTtcbiAgICBpZiAodGhpcy50cmVlQ29udHJvbC5nZXRMZXZlbCkge1xuICAgICAgY29udGV4dC5sZXZlbCA9IHRoaXMudHJlZUNvbnRyb2wuZ2V0TGV2ZWwobm9kZURhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0LmxldmVsID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGE6IG5vZGVEYXRhLFxuICAgICAgY29udGV4dCxcbiAgICAgIG5vZGVEZWY6IG5vZGVcbiAgICB9O1xuICB9XG59XG4iXX0=