UNPKG

fundamental-ngx

Version:

SAP Fiori Fundamentals, implemented in Angular

231 lines 17.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ContentChildren, EventEmitter, Input, Output, QueryList, ViewChildren, ViewEncapsulation } from '@angular/core'; import { TabPanelComponent } from './tab/tab-panel.component'; /** * Represents a list of tab-panels. */ export class TabListComponent { constructor() { /** * Index of the selected tab panel. */ this.selectedIndex = 0; /** * Event emitted when the selected panel changes. */ this.selectedIndexChange = new EventEmitter(); } /** * @hidden * @return {?} */ ngAfterContentInit() { setTimeout((/** * @return {?} */ () => { this.selectTab(this.selectedIndex); })); this._tabsSubscription = this.tabs.changes.subscribe((/** * @return {?} */ () => { if (!this.isIndexInRange() || this.isTabContentEmpty()) { this.resetTabHook(); } })); } /** * @hidden * @return {?} */ ngOnDestroy() { this._tabsSubscription.unsubscribe(); } /** * @hidden * @param {?} changes * @return {?} */ ngOnChanges(changes) { if (changes.selectedIndex) { setTimeout((/** * @return {?} */ () => { this.selectTab(changes.selectedIndex.currentValue); })); } } /** * Function to select a new tab from an index. * @param {?} tabIndex Index of the tab to select. * @return {?} */ selectTab(tabIndex) { if (this.isIndexInRange() && this.isTargetTabEnabled(tabIndex)) { this.tabs.forEach((/** * @param {?} tab * @param {?} index * @return {?} */ (tab, index) => { tab.expanded = index === tabIndex; })); this.selectedIndex = tabIndex; this.selectedIndexChange.emit(tabIndex); } } /** * @hidden * @param {?} tabIndex * @return {?} */ tabHeaderClickHandler(tabIndex) { if (this.selectedIndex !== tabIndex) { this.selectTab(tabIndex); } } /** * @hidden * @param {?} index * @param {?} event * @return {?} */ tabHeaderKeyHandler(index, event) { switch (event.code) { case ('ArrowLeft'): { if (index - 1 >= 0) { this.getTabLinkFromIndex(index - 1).focus(); } else { this.getTabLinkFromIndex(this.tabLinks.length - 1).focus(); } break; } case ('ArrowRight'): { if (index + 1 < this.tabLinks.length) { this.getTabLinkFromIndex(index + 1).focus(); } else { this.getTabLinkFromIndex(0).focus(); } break; } case ('Space'): { event.preventDefault(); if (index !== this.selectedIndex) { this.selectTab(index); } break; } case ('Enter'): { if (index !== this.selectedIndex) { this.selectTab(index); } } } } /** * @private * @return {?} */ isIndexInRange() { return this.tabs && this.tabs.length > 0 && this.selectedIndex < this.tabs.length; } /** * @private * @param {?} index * @return {?} */ isTargetTabEnabled(index) { return !this.tabs.toArray()[index].disabled; } /** * @private * @return {?} */ isTabContentEmpty() { /** @type {?} */ let result = true; this.tabs.forEach((/** * @param {?} tab * @return {?} */ tab => { if (tab.expanded) { result = false; } })); return result; } /** * @private * @return {?} */ resetTabHook() { this.selectedIndex = 0; setTimeout((/** * @return {?} */ () => { this.selectTab(this.selectedIndex); })); } /** * @private * @param {?} index * @return {?} */ getTabLinkFromIndex(index) { return (/** @type {?} */ (this.tabLinks.toArray()[index].nativeElement)); } } TabListComponent.decorators = [ { type: Component, args: [{ selector: 'fd-tab-list', template: "<ul class=\"fd-tabs\"\n role=\"tablist\">\n <li class=\"fd-tabs__item\"\n *ngFor=\"let tab of tabs.toArray(); let i = index;\">\n <a #tabLink\n role=\"tab\"\n class=\"fd-tabs__link\"\n [attr.tabindex]=\"tab.disabled ? -1 : 0\"\n [attr.aria-controls]=\"tab.id\"\n [attr.aria-disabled]=\"tab.disabled\"\n [attr.aria-selected]=\"tab.expanded ? true : null\"\n [attr.aria-label]=\"tab.ariaLabel || null\"\n [attr.aria-labelledby]=\"(!tab.ariaLabel && tab.ariaLabelledBy) ? tab.ariaLabelledBy : null\"\n [class.is-selected]=\"tab.expanded\"\n (keydown)=\"tabHeaderKeyHandler(i, $event)\"\n (click)=\"tabHeaderClickHandler(i)\">\n\n <ng-container *ngIf=\"tab.titleTemplate\">\n <ng-container [fd-tab-load-title]=\"tab.titleTemplate\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!tab.titleTemplate\">{{ tab.title }}</ng-container>\n </a>\n </li>\n</ul>\n<ng-content select=\"fd-tab\"></ng-content>\n<ng-content></ng-content>\n", host: { class: 'fd-tabs-custom' }, encapsulation: ViewEncapsulation.None, styles: [".fd-tabs-custom{display:block}"] }] } ]; TabListComponent.propDecorators = { tabs: [{ type: ContentChildren, args: [TabPanelComponent,] }], tabLinks: [{ type: ViewChildren, args: ['tabLink',] }], selectedIndex: [{ type: Input }], selectedIndexChange: [{ type: Output }] }; if (false) { /** * @hidden * @type {?} */ TabListComponent.prototype.tabs; /** * @hidden * @type {?} */ TabListComponent.prototype.tabLinks; /** * Index of the selected tab panel. * @type {?} */ TabListComponent.prototype.selectedIndex; /** * Event emitted when the selected panel changes. * @type {?} */ TabListComponent.prototype.selectedIndexChange; /** * @type {?} * @private */ TabListComponent.prototype._tabsSubscription; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZnVuZGFtZW50YWwtbmd4LyIsInNvdXJjZXMiOlsibGliL3RhYnMvdGFiLWxpc3QuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBRUgsU0FBUyxFQUNULGVBQWUsRUFFZixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBRVQsWUFBWSxFQUNaLGlCQUFpQixFQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7OztBQWU5RCxNQUFNLE9BQU8sZ0JBQWdCO0lBVDdCOzs7O1FBcUJJLGtCQUFhLEdBQVcsQ0FBQyxDQUFDOzs7O1FBSTFCLHdCQUFtQixHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7SUFrSHJELENBQUM7Ozs7O0lBN0dHLGtCQUFrQjtRQUNkLFVBQVU7OztRQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsRUFBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVM7OztRQUFDLEdBQUcsRUFBRTtZQUN0RCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFO2dCQUNwRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7YUFDdkI7UUFDTCxDQUFDLEVBQUMsQ0FBQztJQUNQLENBQUM7Ozs7O0lBR0QsV0FBVztRQUNQLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN6QyxDQUFDOzs7Ozs7SUFHRCxXQUFXLENBQUMsT0FBc0I7UUFDOUIsSUFBSSxPQUFPLENBQUMsYUFBYSxFQUFFO1lBQ3ZCLFVBQVU7OztZQUFDLEdB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QUFDLElBQUksQ0FBQyxPQUFPOzs7O1FBQUMsR0FBRyxDQUFDLEVBQUU7WUFDcEIsSUFBSSxHQUFHLENBQUMsUUFBUSxFQUFFO2dCQUNkLE1BQU0sR0FBRyxLQUFLLENBQUM7YUFDbEI7UUFDTCxDQUFDLEVBQUMsQ0FBQztRQUNILE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7Ozs7O0lBRU8sWUFBWTtRQUNoQixJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQztRQUN2QixVQUFVOzs7UUFBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN2QyxDQUFDLEVBQUMsQ0FBQztJQUNQLENBQUM7Ozs7OztJQUVPLG1CQUFtQixDQUFDLEtBQWE7UUFDckMsT0FBTyxtQkFBQSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLGFBQWEsRUFBZSxDQUFDO0lBQ3ZFLENBQUM7OztZQTFJSixTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLGFBQWE7Z0JBQ3ZCLDZtQ0FBd0M7Z0JBRXhDLElBQUksRUFBRTtvQkFDRixLQUFLLEVBQUUsZ0JBQWdCO2lCQUMxQjtnQkFDRCxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTs7YUFDeEM7OzttQkFJSSxlQUFlLFNBQUMsaUJBQWlCO3VCQUlqQyxZQUFZLFNBQUMsU0FBUzs0QkFJdEIsS0FBSztrQ0FJTCxNQUFNOzs7Ozs7O0lBWlAsZ0NBQ21DOzs7OztJQUduQyxvQ0FDZ0M7Ozs7O0lBR2hDLHlDQUMwQjs7Ozs7SUFHMUIsK0NBQ2lEOzs7OztJQUVqRCw2Q0FBd0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIE91dHB1dCxcbiAgICBRdWVyeUxpc3QsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBWaWV3Q2hpbGRyZW4sXG4gICAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUYWJQYW5lbENvbXBvbmVudCB9IGZyb20gJy4vdGFiL3RhYi1wYW5lbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGxpc3Qgb2YgdGFiLXBhbmVscy5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdmZC10YWItbGlzdCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RhYi1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi90YWItbGlzdC5jb21wb25lbnQuc2NzcyddLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgY2xhc3M6ICdmZC10YWJzLWN1c3RvbSdcbiAgICB9LFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgVGFiTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihUYWJQYW5lbENvbXBvbmVudClcbiAgICB0YWJzOiBRdWVyeUxpc3Q8VGFiUGFuZWxDb21wb25lbnQ+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkcmVuKCd0YWJMaW5rJylcbiAgICB0YWJMaW5rczogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuXG4gICAgLyoqIEluZGV4IG9mIHRoZSBzZWxlY3RlZCB0YWIgcGFuZWwuICovXG4gICAgQElucHV0KClcbiAgICBzZWxlY3RlZEluZGV4OiBudW1iZXIgPSAwO1xuXG4gICAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgc2VsZWN0ZWQgcGFuZWwgY2hhbmdlcy4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBzZWxlY3RlZEluZGV4Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgICBwcml2YXRlIF90YWJzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdFRhYih0aGlzLnNlbGVjdGVkSW5kZXgpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl90YWJzU3Vic2NyaXB0aW9uID0gdGhpcy50YWJzLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0luZGV4SW5SYW5nZSgpIHx8IHRoaXMuaXNUYWJDb250ZW50RW1wdHkoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRUYWJIb29rKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3RhYnNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXMuc2VsZWN0ZWRJbmRleCkge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RUYWIoY2hhbmdlcy5zZWxlY3RlZEluZGV4LmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZ1bmN0aW9uIHRvIHNlbGVjdCBhIG5ldyB0YWIgZnJvbSBhbiBpbmRleC5cbiAgICAgKiBAcGFyYW0gdGFiSW5kZXggSW5kZXggb2YgdGhlIHRhYiB0byBzZWxlY3QuXG4gICAgICovXG4gICAgc2VsZWN0VGFiKHRhYkluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNJbmRleEluUmFuZ2UoKSAmJiB0aGlzLmlzVGFyZ2V0VGFiRW5hYmxlZCh0YWJJbmRleCkpIHtcbiAgICAgICAgICAgIHRoaXMudGFicy5mb3JFYWNoKCh0YWIsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgdGFiLmV4cGFuZGVkID0gaW5kZXggPT09IHRhYkluZGV4O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSW5kZXggPSB0YWJJbmRleDtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleENoYW5nZS5lbWl0KHRhYkluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgdGFiSGVhZGVyQ2xpY2tIYW5kbGVyKHRhYkluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJbmRleCAhPT0gdGFiSW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0VGFiKHRhYkluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgdGFiSGVhZGVyS2V5SGFuZGxlcihpbmRleDogbnVtYmVyLCBldmVudDogYW55KTogdm9pZCB7XG4gICAgICAgIHN3aXRjaCAoZXZlbnQuY29kZSkge1xuICAgICAgICAgICAgY2FzZSAoJ0Fycm93TGVmdCcpOiB7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4IC0gMSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0VGFiTGlua0Zyb21JbmRleChpbmRleCAtIDEpLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRUYWJMaW5rRnJvbUluZGV4KHRoaXMudGFiTGlua3MubGVuZ3RoIC0gMSkuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICgnQXJyb3dSaWdodCcpOiB7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICsgMSA8IHRoaXMudGFiTGlua3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0VGFiTGlua0Zyb21JbmRleChpbmRleCArIDEpLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRUYWJMaW5rRnJvbUluZGV4KDApLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAoJ1NwYWNlJyk6IHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gdGhpcy5zZWxlY3RlZEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0VGFiKGluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICgnRW50ZXInKToge1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gdGhpcy5zZWxlY3RlZEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0VGFiKGluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGlzSW5kZXhJblJhbmdlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJzICYmIHRoaXMudGFicy5sZW5ndGggPiAwICYmIHRoaXMuc2VsZWN0ZWRJbmRleCA8IHRoaXMudGFicy5sZW5ndGg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1RhcmdldFRhYkVuYWJsZWQoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMudGFicy50b0FycmF5KClbaW5kZXhdLmRpc2FibGVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNUYWJDb250ZW50RW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCByZXN1bHQgPSB0cnVlO1xuICAgICAgICB0aGlzLnRhYnMuZm9yRWFjaCh0YWIgPT4ge1xuICAgICAgICAgICAgaWYgKHRhYi5leHBhbmRlZCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc2V0VGFiSG9vaygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gMDtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdFRhYih0aGlzLnNlbGVjdGVkSW5kZXgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFRhYkxpbmtGcm9tSW5kZXgoaW5kZXg6IG51bWJlcik6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFiTGlua3MudG9BcnJheSgpW2luZGV4XS5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgIH1cbn1cbiJdfQ==