UNPKG

@ux-aspects/ux-aspects

Version:

Open source user interface framework for building modern, responsive, mobile big data applications

93 lines 15.5 kB
import { isPlatformBrowser } from '@angular/common'; import { ContentChildren, Directive, inject, PLATFORM_ID } from '@angular/core'; import { fromEvent, merge } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { BaseResizableTableDirective } from '../resizable-table-base.directive'; import { ResizableTableColumnComponent } from '../resizable-table-column.component'; import { RESIZABLE_TABLE_SERVICE_TOKEN } from '../resizable-table-service.token'; import { ResizableExpandingTableService } from './resizable-expanding-table.service'; import * as i0 from "@angular/core"; export class ResizableExpandingTableDirective extends BaseResizableTableDirective { constructor() { super(); this._platformId = inject(PLATFORM_ID); /** Has horizontal overflow */ this._overflowX = false; } ngAfterViewInit() { if (isPlatformBrowser(this._platformId)) { const tableHeaders = this._elementRef.nativeElement.querySelectorAll('thead > tr'); for (const body of Array.from(this._elementRef.nativeElement.tBodies)) { fromEvent(body, 'scroll').pipe(takeUntil(this._onDestroy)).subscribe(() => { Array.from(tableHeaders).forEach(thead => this._renderer.setStyle(thead, 'margin-left', `-${body.scrollLeft}px`)); }); } /** checks if the table is resizing and allows for a class to be added for when moving from overflow to no overflow */ merge(this._table.onResize$, this.columns.changes).pipe(takeUntil(this._onDestroy)).subscribe(() => { this._overflowX = this._elementRef.nativeElement.tBodies[0].scrollWidth > this._elementRef.nativeElement.tBodies[0].offsetWidth; }); } } /** * If this is being used within a modal the table width may initially be zero. This can cause some issues when it does actually appear * visibily on screen. We should only setup the table once we actually have a width/ */ onTableReady() { // if we have already initialised or the table width is currently 0 then do nothing if (this._initialised || this.getScrollWidth() === 0) { // if the table has been initialized but the width is now 0 // for example, due to the element being hidden (eg. in a collapsed accordion) // we would need to re-run this logic whenever the width is back over 0 // to do this we can mark the table as not having been initialized if (this._initialised && this.getScrollWidth() === 0) { this._initialised = false; } return; } // ensure we initially set the table width this._table.tableWidth = this.getScrollWidth(); // set the columns - prevent expression changed error Promise.resolve().then(() => { // initially set the columns this._table.setColumns(this.columns); // force relayout to occur to ensure the UI is consistent with the internal state this.updateLayout(); }); // watch for any future changes to the columns this.columns.changes.pipe(takeUntil(this._onDestroy)).subscribe(() => Promise.resolve().then(() => this._table.setColumns(this.columns))); this._initialised = true; } /** Force the layout to recalculate */ updateLayout() { Promise.resolve().then(() => this.columns.forEach((_column, index) => this._table.resizeColumn(index, 0))); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ResizableExpandingTableDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.12", type: ResizableExpandingTableDirective, selector: "[uxResizableExpandingTable]", host: { properties: { "class.ux-resizable-expanding-table-overflow": "_overflowX" }, classAttribute: "ux-resizable-expanding-table" }, providers: [ { provide: RESIZABLE_TABLE_SERVICE_TOKEN, useClass: ResizableExpandingTableService } ], queries: [{ propertyName: "columns", predicate: ResizableTableColumnComponent, descendants: true }], exportAs: ["ux-resizable-expanding-table"], usesInheritance: true, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ResizableExpandingTableDirective, decorators: [{ type: Directive, args: [{ selector: '[uxResizableExpandingTable]', exportAs: 'ux-resizable-expanding-table', providers: [ { provide: RESIZABLE_TABLE_SERVICE_TOKEN, useClass: ResizableExpandingTableService } ], host: { 'class': 'ux-resizable-expanding-table', '[class.ux-resizable-expanding-table-overflow]': '_overflowX' } }] }], ctorParameters: () => [], propDecorators: { columns: [{ type: ContentChildren, args: [ResizableTableColumnComponent, { descendants: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXphYmxlLWV4cGFuZGluZy10YWJsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy90YWJsZS90YWJsZS1jb2x1bW4tcmVzaXplL3RhYmxlLWNvbHVtbi1yZXNpemUtZXhwYW5kaW5nL3Jlc2l6YWJsZS1leHBhbmRpbmctdGFibGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBaUIsZUFBZSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQzFHLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNoRixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNwRixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7QUFnQnJGLE1BQU0sT0FBTyxnQ0FBaUMsU0FBUSwyQkFBMkI7SUFTN0U7UUFDSSxLQUFLLEVBQUUsQ0FBQztRQVRLLGdCQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBS25ELDhCQUE4QjtRQUM5QixlQUFVLEdBQVksS0FBSyxDQUFDO0lBSTVCLENBQUM7SUFFRCxlQUFlO1FBRVgsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUV0QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FB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QUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9HLENBQUM7K0dBNUVRLGdDQUFnQzttR0FBaEMsZ0NBQWdDLDZMQVg5QjtZQUNQO2dCQUNJLE9BQU8sRUFBRSw2QkFBNkI7Z0JBQ3RDLFFBQVEsRUFBRSw4QkFBOEI7YUFDM0M7U0FDSixrREFVZ0IsNkJBQTZCOzs0RkFKckMsZ0NBQWdDO2tCQWQ1QyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSw2QkFBNkI7b0JBQ3ZDLFFBQVEsRUFBRSw4QkFBOEI7b0JBQ3hDLFNBQVMsRUFBRTt3QkFDUDs0QkFDSSxPQUFPLEVBQUUsNkJBQTZCOzRCQUN0QyxRQUFRLEVBQUUsOEJBQThCO3lCQUMzQztxQkFDSjtvQkFDRCxJQUFJLEVBQUU7d0JBQ0YsT0FBTyxFQUFFLDhCQUE4Qjt3QkFDdkMsK0NBQStDLEVBQUUsWUFBWTtxQkFDaEU7aUJBQ0o7d0RBSzBFLE9BQU87c0JBQTdFLGVBQWU7dUJBQUMsNkJBQTZCLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29udGVudENoaWxkcmVuLCBEaXJlY3RpdmUsIGluamVjdCwgUExBVEZPUk1fSUQsIFF1ZXJ5TGlzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBtZXJnZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQmFzZVJlc2l6YWJsZVRhYmxlRGlyZWN0aXZlIH0gZnJvbSAnLi4vcmVzaXphYmxlLXRhYmxlLWJhc2UuZGlyZWN0aXZlJztcbmltcG9ydCB7IFJlc2l6YWJsZVRhYmxlQ29sdW1uQ29tcG9uZW50IH0gZnJvbSAnLi4vcmVzaXphYmxlLXRhYmxlLWNvbHVtbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgUkVTSVpBQkxFX1RBQkxFX1NFUlZJQ0VfVE9LRU4gfSBmcm9tICcuLi9yZXNpemFibGUtdGFibGUtc2VydmljZS50b2tlbic7XG5pbXBvcnQgeyBSZXNpemFibGVFeHBhbmRpbmdUYWJsZVNlcnZpY2UgfSBmcm9tICcuL3Jlc2l6YWJsZS1leHBhbmRpbmctdGFibGUuc2VydmljZSc7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW3V4UmVzaXphYmxlRXhwYW5kaW5nVGFibGVdJyxcbiAgICBleHBvcnRBczogJ3V4LXJlc2l6YWJsZS1leHBhbmRpbmctdGFibGUnLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBSRVNJWkFCTEVfVEFCTEVfU0VSVklDRV9UT0tFTixcbiAgICAgICAgICAgIHVzZUNsYXNzOiBSZXNpemFibGVFeHBhbmRpbmdUYWJsZVNlcnZpY2VcbiAgICAgICAgfVxuICAgIF0sXG4gICAgaG9zdDoge1xuICAgICAgICAnY2xhc3MnOiAndXgtcmVzaXphYmxlLWV4cGFuZGluZy10YWJsZScsXG4gICAgICAgICdbY2xhc3MudXgtcmVzaXphYmxlLWV4cGFuZGluZy10YWJsZS1vdmVyZmxvd10nOiAnX292ZXJmbG93WCdcbiAgICB9XG59KVxuZXhwb3J0IGNsYXNzIFJlc2l6YWJsZUV4cGFuZGluZ1RhYmxlRGlyZWN0aXZlIGV4dGVuZHMgQmFzZVJlc2l6YWJsZVRhYmxlRGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfcGxhdGZvcm1JZCA9IGluamVjdChQTEFURk9STV9JRCk7XG5cbiAgICAvKiogR2V0IGFsbCB0aGUgY29sdW1uIGhlYWRlcnMgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKFJlc2l6YWJsZVRhYmxlQ29sdW1uQ29tcG9uZW50LCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pIGNvbHVtbnM6IFF1ZXJ5TGlzdDxSZXNpemFibGVUYWJsZUNvbHVtbkNvbXBvbmVudD47XG5cbiAgICAvKiogSGFzIGhvcml6b250YWwgb3ZlcmZsb3cgKi9cbiAgICBfb3ZlcmZsb3dYOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG5cbiAgICAgICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMuX3BsYXRmb3JtSWQpKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IHRhYmxlSGVhZGVycyA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCd0aGVhZCA+IHRyJyk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgYm9keSBvZiBBcnJheS5mcm9tKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC50Qm9kaWVzKSkge1xuICAgICAgICAgICAgICAgIGZyb21FdmVudChib2R5LCAnc2Nyb2xsJykucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95KSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgQXJyYXkuZnJvbSh0YWJsZUhlYWRlcnMpLmZvckVhY2godGhlYWQgPT4gdGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUodGhlYWQsICdtYXJnaW4tbGVmdCcsIGAtJHtib2R5LnNjcm9sbExlZnR9cHhgKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKiBjaGVja3MgaWYgdGhlIHRhYmxlIGlzIHJlc2l6aW5nIGFuZCBhbGxvd3MgZm9yIGEgY2xhc3MgdG8gYmUgYWRkZWQgZm9yIHdoZW4gbW92aW5nIGZyb21cbiAgICAgICAgICAgICBvdmVyZmxvdyB0byBubyBvdmVyZmxvdyAqL1xuICAgICAgICAgICAgbWVyZ2UodGhpcy5fdGFibGUub25SZXNpemUkLCB0aGlzLmNvbHVtbnMuY2hhbmdlcykucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95KSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vdmVyZmxvd1ggPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQudEJvZGllc1swXS5zY3JvbGxXaWR0aCA+IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC50Qm9kaWVzWzBdLm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGlzIGlzIGJlaW5nIHVzZWQgd2l0aGluIGEgbW9kYWwgdGhlIHRhYmxlIHdpZHRoIG1heSBpbml0aWFsbHkgYmUgemVyby4gVGhpcyBjYW4gY2F1c2Ugc29tZSBpc3N1ZXMgd2hlbiBpdCBkb2VzIGFjdHVhbGx5IGFwcGVhclxuICAgICAqIHZpc2liaWx5IG9uIHNjcmVlbi4gV2Ugc2hvdWxkIG9ubHkgc2V0dXAgdGhlIHRhYmxlIG9uY2Ugd2UgYWN0dWFsbHkgaGF2ZSBhIHdpZHRoL1xuICAgICAqL1xuICAgIG9uVGFibGVSZWFkeSgpOiB2b2lkIHtcblxuICAgICAgICAvLyBpZiB3ZSBoYXZlIGFscmVhZHkgaW5pdGlhbGlzZWQgb3IgdGhlIHRhYmxlIHdpZHRoIGlzIGN1cnJlbnRseSAwIHRoZW4gZG8gbm90aGluZ1xuICAgICAgICBpZiAodGhpcy5faW5pdGlhbGlzZWQgfHwgdGhpcy5nZXRTY3JvbGxXaWR0aCgpID09PSAwKSB7XG5cbiAgICAgICAgICAgIC8vIGlmIHRoZSB0YWJsZSBoYXMgYmVlbiBpbml0aWFsaXplZCBidXQgdGhlIHdpZHRoIGlzIG5vdyAwXG4gICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSwgZHVlIHRvIHRoZSBlbGVtZW50IGJlaW5nIGhpZGRlbiAoZWcuIGluIGEgY29sbGFwc2VkIGFjY29yZGlvbilcbiAgICAgICAgICAgIC8vIHdlIHdvdWxkIG5lZWQgdG8gcmUtcnVuIHRoaXMgbG9naWMgd2hlbmV2ZXIgdGhlIHdpZHRoIGlzIGJhY2sgb3ZlciAwXG4gICAgICAgICAgICAvLyB0byBkbyB0aGlzIHdlIGNhbiBtYXJrIHRoZSB0YWJsZSBhcyBub3QgaGF2aW5nIGJlZW4gaW5pdGlhbGl6ZWRcbiAgICAgICAgICAgIGlmICh0aGlzLl9pbml0aWFsaXNlZCAmJiB0aGlzLmdldFNjcm9sbFdpZHRoKCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pbml0aWFsaXNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbnN1cmUgd2UgaW5pdGlhbGx5IHNldCB0aGUgdGFibGUgd2lkdGhcbiAgICAgICAgdGhpcy5fdGFibGUudGFibGVXaWR0aCA9IHRoaXMuZ2V0U2Nyb2xsV2lkdGgoKTtcblxuICAgICAgICAvLyBzZXQgdGhlIGNvbHVtbnMgLSBwcmV2ZW50IGV4cHJlc3Npb24gY2hhbmdlZCBlcnJvclxuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIGluaXRpYWxseSBzZXQgdGhlIGNvbHVtbnNcbiAgICAgICAgICAgIHRoaXMuX3RhYmxlLnNldENvbHVtbnModGhpcy5jb2x1bW5zKTtcblxuICAgICAgICAgICAgLy8gZm9yY2UgcmVsYXlvdXQgdG8gb2NjdXIgdG8gZW5zdXJlIHRoZSBVSSBpcyBjb25zaXN0ZW50IHdpdGggdGhlIGludGVybmFsIHN0YXRlXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUxheW91dCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyB3YXRjaCBmb3IgYW55IGZ1dHVyZSBjaGFuZ2VzIHRvIHRoZSBjb2x1bW5zXG4gICAgICAgIHRoaXMuY29sdW1ucy5jaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSkpLnN1YnNjcmliZSgoKSA9PlxuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB0aGlzLl90YWJsZS5zZXRDb2x1bW5zKHRoaXMuY29sdW1ucykpXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5faW5pdGlhbGlzZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKiBGb3JjZSB0aGUgbGF5b3V0IHRvIHJlY2FsY3VsYXRlICovXG4gICAgdXBkYXRlTGF5b3V0KCk6IHZvaWQge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHRoaXMuY29sdW1ucy5mb3JFYWNoKChfY29sdW1uLCBpbmRleCkgPT4gdGhpcy5fdGFibGUucmVzaXplQ29sdW1uKGluZGV4LCAwKSkpO1xuICAgIH1cblxufVxuIl19