UNPKG

@covalent/core

Version:

Core Teradata UI Platform for layouts, icons, custom components and themes. This should be added as a dependency for any project that wants to use layouts, icons and themes for Angular Material.

131 lines 18 kB
import { Component, ContentChildren, QueryList, ChangeDetectionStrategy, ChangeDetectorRef, ElementRef, Input, HostBinding, } from '@angular/core'; import { fromEvent, Subject } from 'rxjs'; import { debounceTime, startWith, takeUntil } from 'rxjs/operators'; import { TdBreadcrumbComponent } from './breadcrumb/breadcrumb.component'; import * as i0 from "@angular/core"; export class TdBreadcrumbsComponent { constructor(_elementRef, _changeDetectorRef) { this._elementRef = _elementRef; this._changeDetectorRef = _changeDetectorRef; this._resizing = false; this._separatorIcon = 'chevron_right'; this._destroy$ = new Subject(); this.tdBreadCrumbsClass = true; // the list of hidden breadcrumbs not shown right now (responsive) this.hiddenBreadcrumbs = []; } /** * Sets the icon url shown between breadcrumbs. Defaults to 'chevron_right'. */ set separatorIcon(separatorIcon) { this._separatorIcon = separatorIcon; this.setCrumbIcons(); } get separatorIcon() { return this._separatorIcon; } ngOnInit() { fromEvent(window, 'resize') .pipe(debounceTime(10), takeUntil(this._destroy$)) .subscribe(() => { if (!this._resizing) { this._resizing = true; setTimeout(() => { this._calculateVisibility(); this._resizing = false; this._changeDetectorRef.markForCheck(); }, 100); } }); } ngAfterContentInit() { // Note: doesn't need to unsubscribe since `QueryList.changes` // gets completed by Angular when the view is destroyed. this._breadcrumbs.changes .pipe(startWith(this._breadcrumbs)) .subscribe(() => { this.setCrumbIcons(); this._changeDetectorRef.markForCheck(); }); } ngOnDestroy() { this._destroy$.next(); } /* * Current width of the element container */ get nativeElementWidth() { const element = this._elementRef.nativeElement; // Need to take into account border, margin and padding that might be around all the crumbs const style = window.getComputedStyle(element); const borderLeft = parseInt(style.borderLeft, 10); const borderRight = parseInt(style.borderRight, 10); const marginLeft = parseInt(style.marginLeft, 10); const marginRight = parseInt(style.marginRight, 10); const paddingLeft = parseInt(style.paddingLeft, 10); const paddingRight = parseInt(style.paddingRight, 10); return (element.getBoundingClientRect().width - borderLeft - borderRight - marginLeft - marginRight - paddingLeft - paddingRight); } /** * The total count of individual breadcrumbs */ get count() { return this._breadcrumbs ? this._breadcrumbs.length : 0; } /** * Set the crumb icon separators */ setCrumbIcons() { if (this._breadcrumbs) { const breadcrumbArray = this._breadcrumbs.toArray(); breadcrumbArray.forEach((breadcrumb, index) => { breadcrumb.separatorIcon = this.separatorIcon; // don't show the icon on the last breadcrumb breadcrumb.displayIcon = index < breadcrumbArray.length - 1; }); } } _calculateVisibility() { const crumbsArray = this._breadcrumbs.toArray(); let crumbWidthSum = 0; const hiddenCrumbs = []; // loop through crumbs in reverse order to calculate which ones should be removed for (let i = crumbsArray.length - 1; i >= 0; i--) { const breadcrumb = crumbsArray[i]; // if crumb exceeds width, then we skip it from the sum and add it into the hiddencrumbs array // and hide it if (crumbWidthSum + breadcrumb.width > this.nativeElementWidth) { breadcrumb.displayCrumb = false; hiddenCrumbs.push(breadcrumb); } else { // else we show it breadcrumb.displayCrumb = true; } crumbWidthSum += breadcrumb.width; } this.hiddenBreadcrumbs = hiddenCrumbs; this._changeDetectorRef.markForCheck(); } } TdBreadcrumbsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: TdBreadcrumbsComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); TdBreadcrumbsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: TdBreadcrumbsComponent, selector: "td-breadcrumbs", inputs: { separatorIcon: "separatorIcon" }, host: { properties: { "class.td-breadcrumbs": "this.tdBreadCrumbsClass" } }, queries: [{ propertyName: "_breadcrumbs", predicate: TdBreadcrumbComponent, descendants: true }], ngImport: i0, template: "<ng-content></ng-content>\n", styles: [":host{display:flex;align-items:center}:host.td-breadcrumbs{white-space:nowrap}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: TdBreadcrumbsComponent, decorators: [{ type: Component, args: [{ selector: 'td-breadcrumbs', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-content></ng-content>\n", styles: [":host{display:flex;align-items:center}:host.td-breadcrumbs{white-space:nowrap}\n"] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { tdBreadCrumbsClass: [{ type: HostBinding, args: ['class.td-breadcrumbs'] }], _breadcrumbs: [{ type: ContentChildren, args: [TdBreadcrumbComponent, { descendants: true }] }], separatorIcon: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWRjcnVtYnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL2JyZWFkY3J1bWJzL3NyYy9icmVhZGNydW1icy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvYnJlYWRjcnVtYnMvc3JjL2JyZWFkY3J1bWJzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsZUFBZSxFQUNmLFNBQVMsRUFHVCx1QkFBdUIsRUFFdkIsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixLQUFLLEVBQ0wsV0FBVyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXBFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDOztBQVExRSxNQUFNLE9BQU8sc0JBQXNCO0lBMEJqQyxZQUNVLFdBQXVCLEVBQ3ZCLGtCQUFxQztRQURyQyxnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUN2Qix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW1CO1FBekJ2QyxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLG1CQUFjLEdBQUcsZUFBZSxDQUFDO1FBQ2pDLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRUgsdUJBQWtCLEdBQUcsSUFBSSxDQUFDO1FBSy9ELGtFQUFrRTtRQUNsRSxzQkFBaUIsR0FBNEIsRUFBRSxDQUFDO0lBZ0I3QyxDQUFDO0lBZEo7O09BRUc7SUFDSCxJQUFvQixhQUFhLENBQUMsYUFBcUI7UUFDckQsSUFBSSxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUM7UUFDcEMsSUFBSSxDQUFDLGFBQWEsRUFB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QUF1QixDQUFDLE1BQU07aUlBU1Ysa0JBQWtCO3NCQUF0RCxXQUFXO3VCQUFDLHNCQUFzQjtnQkFJbkMsWUFBWTtzQkFEWCxlQUFlO3VCQUFDLHFCQUFxQixFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTtnQkFRekMsYUFBYTtzQkFBaEMsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBRdWVyeUxpc3QsXG4gIE9uSW5pdCxcbiAgT25EZXN0cm95LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBIb3N0QmluZGluZyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IGZyb21FdmVudCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBzdGFydFdpdGgsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgVGRCcmVhZGNydW1iQ29tcG9uZW50IH0gZnJvbSAnLi9icmVhZGNydW1iL2JyZWFkY3J1bWIuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGQtYnJlYWRjcnVtYnMnLFxuICBzdHlsZVVybHM6IFsnLi9icmVhZGNydW1icy5jb21wb25lbnQuc2NzcyddLFxuICB0ZW1wbGF0ZVVybDogJy4vYnJlYWRjcnVtYnMuY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVGRCcmVhZGNydW1ic0NvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95XG57XG4gIHByaXZhdGUgX3Jlc2l6aW5nID0gZmFsc2U7XG4gIHByaXZhdGUgX3NlcGFyYXRvckljb24gPSAnY2hldnJvbl9yaWdodCc7XG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnRkLWJyZWFkY3J1bWJzJykgdGRCcmVhZENydW1ic0NsYXNzID0gdHJ1ZTtcblxuICAvLyBhbGwgdGhlIHN1YiBjb21wb25lbnRzLCB3aGljaCBhcmUgdGhlIGluZGl2aWR1YWwgYnJlYWRjcnVtYnNcbiAgQENvbnRlbnRDaGlsZHJlbihUZEJyZWFkY3J1bWJDb21wb25lbnQsIHsgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgX2JyZWFkY3J1bWJzITogUXVlcnlMaXN0PFRkQnJlYWRjcnVtYkNvbXBvbmVudD47XG4gIC8vIHRoZSBsaXN0IG9mIGhpZGRlbiBicmVhZGNydW1icyBub3Qgc2hvd24gcmlnaHQgbm93IChyZXNwb25zaXZlKVxuICBoaWRkZW5CcmVhZGNydW1iczogVGRCcmVhZGNydW1iQ29tcG9uZW50W10gPSBbXTtcblxuICAvKipcbiAgICogU2V0cyB0aGUgaWNvbiB1cmwgc2hvd24gYmV0d2VlbiBicmVhZGNydW1icy4gRGVmYXVsdHMgdG8gJ2NoZXZyb25fcmlnaHQnLlxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIHNldCBzZXBhcmF0b3JJY29uKHNlcGFyYXRvckljb246IHN0cmluZykge1xuICAgIHRoaXMuX3NlcGFyYXRvckljb24gPSBzZXBhcmF0b3JJY29uO1xuICAgIHRoaXMuc2V0Q3J1bWJJY29ucygpO1xuICB9XG4gIHB1YmxpYyBnZXQgc2VwYXJhdG9ySWNvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zZXBhcmF0b3JJY29uO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKVxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDEwKSwgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuX3Jlc2l6aW5nKSB7XG4gICAgICAgICAgdGhpcy5fcmVzaXppbmcgPSB0cnVlO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fY2FsY3VsYXRlVmlzaWJpbGl0eSgpO1xuICAgICAgICAgICAgdGhpcy5fcmVzaXppbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIC8vIE5vdGU6IGRvZXNuJ3QgbmVlZCB0byB1bnN1YnNjcmliZSBzaW5jZSBgUXVlcnlMaXN0LmNoYW5nZXNgXG4gICAgLy8gZ2V0cyBjb21wbGV0ZWQgYnkgQW5ndWxhciB3aGVuIHRoZSB2aWV3IGlzIGRlc3Ryb3llZC5cbiAgICB0aGlzLl9icmVhZGNydW1icy5jaGFuZ2VzXG4gICAgICAucGlwZShzdGFydFdpdGgodGhpcy5fYnJlYWRjcnVtYnMpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0Q3J1bWJJY29ucygpO1xuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xuICB9XG5cbiAgLypcbiAgICogQ3VycmVudCB3aWR0aCBvZiB0aGUgZWxlbWVudCBjb250YWluZXJcbiAgICovXG4gIGdldCBuYXRpdmVFbGVtZW50V2lkdGgoKTogbnVtYmVyIHtcbiAgICBjb25zdCBlbGVtZW50OiBIVE1MRWxlbWVudCA9IDxIVE1MRWxlbWVudD50aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgLy8gTmVlZCB0byB0YWtlIGludG8gYWNjb3VudCBib3JkZXIsIG1hcmdpbiBhbmQgcGFkZGluZyB0aGF0IG1pZ2h0IGJlIGFyb3VuZCBhbGwgdGhlIGNydW1ic1xuICAgIGNvbnN0IHN0eWxlOiBDU1NTdHlsZURlY2xhcmF0aW9uID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gICAgY29uc3QgYm9yZGVyTGVmdDogbnVtYmVyID0gcGFyc2VJbnQoc3R5bGUuYm9yZGVyTGVmdCwgMTApO1xuICAgIGNvbnN0IGJvcmRlclJpZ2h0OiBudW1iZXIgPSBwYXJzZUludChzdHlsZS5ib3JkZXJSaWdodCwgMTApO1xuICAgIGNvbnN0IG1hcmdpbkxlZnQ6IG51bWJlciA9IHBhcnNlSW50KHN0eWxlLm1hcmdpbkxlZnQsIDEwKTtcbiAgICBjb25zdCBtYXJnaW5SaWdodDogbnVtYmVyID0gcGFyc2VJbnQoc3R5bGUubWFyZ2luUmlnaHQsIDEwKTtcbiAgICBjb25zdCBwYWRkaW5nTGVmdDogbnVtYmVyID0gcGFyc2VJbnQoc3R5bGUucGFkZGluZ0xlZnQsIDEwKTtcbiAgICBjb25zdCBwYWRkaW5nUmlnaHQ6IG51bWJlciA9IHBhcnNlSW50KHN0eWxlLnBhZGRpbmdSaWdodCwgMTApO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLVxuICAgICAgYm9yZGVyTGVmdCAtXG4gICAgICBib3JkZXJSaWdodCAtXG4gICAgICBtYXJnaW5MZWZ0IC1cbiAgICAgIG1hcmdpblJpZ2h0IC1cbiAgICAgIHBhZGRpbmdMZWZ0IC1cbiAgICAgIHBhZGRpbmdSaWdodFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRvdGFsIGNvdW50IG9mIGluZGl2aWR1YWwgYnJlYWRjcnVtYnNcbiAgICovXG4gIGdldCBjb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9icmVhZGNydW1icyA/IHRoaXMuX2JyZWFkY3J1bWJzLmxlbmd0aCA6IDA7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBjcnVtYiBpY29uIHNlcGFyYXRvcnNcbiAgICovXG4gIHByaXZhdGUgc2V0Q3J1bWJJY29ucygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fYnJlYWRjcnVtYnMpIHtcbiAgICAgIGNvbnN0IGJyZWFkY3J1bWJBcnJheTogVGRCcmVhZGNydW1iQ29tcG9uZW50W10gPVxuICAgICAgICB0aGlzLl9icmVhZGNydW1icy50b0FycmF5KCk7XG4gICAgICBicmVhZGNydW1iQXJyYXkuZm9yRWFjaChcbiAgICAgICAgKGJyZWFkY3J1bWI6IFRkQnJlYWRjcnVtYkNvbXBvbmVudCwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGJyZWFkY3J1bWIuc2VwYXJhdG9ySWNvbiA9IHRoaXMuc2VwYXJhdG9ySWNvbjtcbiAgICAgICAgICAvLyBkb24ndCBzaG93IHRoZSBpY29uIG9uIHRoZSBsYXN0IGJyZWFkY3J1bWJcbiAgICAgICAgICBicmVhZGNydW1iLmRpc3BsYXlJY29uID0gaW5kZXggPCBicmVhZGNydW1iQXJyYXkubGVuZ3RoIC0gMTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jYWxjdWxhdGVWaXNpYmlsaXR5KCk6IHZvaWQge1xuICAgIGNvbnN0IGNydW1ic0FycmF5OiBUZEJyZWFkY3J1bWJDb21wb25lbnRbXSA9IHRoaXMuX2JyZWFkY3J1bWJzLnRvQXJyYXkoKTtcbiAgICBsZXQgY3J1bWJXaWR0aFN1bSA9IDA7XG4gICAgY29uc3QgaGlkZGVuQ3J1bWJzOiBUZEJyZWFkY3J1bWJDb21wb25lbnRbXSA9IFtdO1xuICAgIC8vIGxvb3AgdGhyb3VnaCBjcnVtYnMgaW4gcmV2ZXJzZSBvcmRlciB0byBjYWxjdWxhdGUgd2hpY2ggb25lcyBzaG91bGQgYmUgcmVtb3ZlZFxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IGNydW1ic0FycmF5Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBicmVhZGNydW1iOiBUZEJyZWFkY3J1bWJDb21wb25lbnQgPSBjcnVtYnNBcnJheVtpXTtcblxuICAgICAgLy8gaWYgY3J1bWIgZXhjZWVkcyB3aWR0aCwgdGhlbiB3ZSBza2lwIGl0IGZyb20gdGhlIHN1bSBhbmQgYWRkIGl0IGludG8gdGhlIGhpZGRlbmNydW1icyBhcnJheVxuICAgICAgLy8gYW5kIGhpZGUgaXRcbiAgICAgIGlmIChjcnVtYldpZHRoU3VtICsgYnJlYWRjcnVtYi53aWR0aCA+IHRoaXMubmF0aXZlRWxlbWVudFdpZHRoKSB7XG4gICAgICAgIGJyZWFkY3J1bWIuZGlzcGxheUNydW1iID0gZmFsc2U7XG4gICAgICAgIGhpZGRlbkNydW1icy5wdXNoKGJyZWFkY3J1bWIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZWxzZSB3ZSBzaG93IGl0XG4gICAgICAgIGJyZWFkY3J1bWIuZGlzcGxheUNydW1iID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNydW1iV2lkdGhTdW0gKz0gYnJlYWRjcnVtYi53aWR0aDtcbiAgICB9XG5cbiAgICB0aGlzLmhpZGRlbkJyZWFkY3J1bWJzID0gaGlkZGVuQ3J1bWJzO1xuICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iLCI8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4iXX0=