• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

IgniteUI / igniteui-angular / 6797384210

08 Nov 2023 11:09AM UTC coverage: 91.853% (-0.3%) from 92.123%
6797384210

push

github

web-flow
Merge pull request #13613 from IgniteUI/mkirova/fix-empty-pivot

fix(igxPivotGrid): Add check in case data is empty due to removing al…

12459 of 14514 branches covered (0.0%)

1 of 1 new or added line in 1 file covered. (100.0%)

2127 existing lines in 217 files now uncovered.

25413 of 27667 relevant lines covered (91.85%)

31122.38 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

96.49
/projects/igniteui-angular/src/lib/tabs/tabs/tab-header.component.ts
1
import { AfterViewInit, Component, ElementRef, HostBinding, HostListener, NgZone, OnDestroy } from '@angular/core';
2
import { IgxTabItemDirective } from '../tab-item.directive';
3
import { IgxTabHeaderDirective } from '../tab-header.directive';
4
import { IgxTabHeaderBase } from '../tabs.base';
5
import { IgxTabsComponent } from './tabs.component';
6
import { getResizeObserver } from '../../core/utils';
7
import { PlatformUtil } from '../../core/utils';
8
import { IgxDirectionality } from '../../services/direction/directionality';
9

10
@Component({
11
    selector: 'igx-tab-header',
12
    templateUrl: 'tab-header.component.html',
13
    providers: [{ provide: IgxTabHeaderBase, useExisting: IgxTabHeaderComponent }],
14
    standalone: true
15
})
16
export class IgxTabHeaderComponent extends IgxTabHeaderDirective implements AfterViewInit, OnDestroy {
2✔
17

18
    /** @hidden @internal */
19
    @HostBinding('class.igx-tabs__header-item--selected')
20
    public get provideCssClassSelected(): boolean {
21
        return this.tab.selected;
1,390✔
22
    }
23

24
    /** @hidden @internal */
25
    @HostBinding('class.igx-tabs__header-item--disabled')
26
    public get provideCssClassDisabled(): boolean {
27
        return this.tab.disabled;
1,390✔
28
    }
29

30
    /** @hidden @internal */
31
    @HostBinding('class.igx-tabs__header-item')
32
    public cssClass = true;
205✔
33

34
    private _resizeObserver: ResizeObserver;
35

36
    /** @hidden @internal */
37
    constructor(
38
        protected override tabs: IgxTabsComponent,
205✔
39
        tab: IgxTabItemDirective,
40
        elementRef: ElementRef<HTMLElement>,
41
        platform: PlatformUtil,
42
        private ngZone: NgZone,
205✔
43
        private dir: IgxDirectionality
205✔
44
    ) {
45
        super(tabs, tab, elementRef, platform);
205✔
46
    }
47

48
    /** @hidden @internal */
49
    @HostListener('keydown', ['$event'])
50
    public keyDown(event: KeyboardEvent) {
51
        let unsupportedKey = false;
45✔
52
        const itemsArray = this.tabs.items.toArray();
45✔
53
        const previousIndex = itemsArray.indexOf(this.tab);
45✔
54
        let newIndex = previousIndex;
45✔
55
        const hasDisabledItems = itemsArray.some((item) => item.disabled);
147✔
56
        switch (event.key) {
45!
57
            case this.platform.KEYMAP.ARROW_RIGHT:
58
                newIndex = this.getNewSelectionIndex(newIndex, itemsArray, event.key, hasDisabledItems);
13✔
59
                break;
13✔
60
            case this.platform.KEYMAP.ARROW_LEFT:
61
                newIndex = this.getNewSelectionIndex(newIndex, itemsArray, event.key, hasDisabledItems);
13✔
62
                break;
13✔
63
            case this.platform.KEYMAP.HOME:
64
                event.preventDefault();
7✔
65
                newIndex = 0;
7✔
66
                while (itemsArray[newIndex].disabled && newIndex < itemsArray.length) {
7✔
67
                    newIndex = newIndex === itemsArray.length - 1 ? 0 : newIndex + 1;
2!
68
                }
69
                break;
7✔
70
            case this.platform.KEYMAP.END:
71
                event.preventDefault();
5✔
72
                newIndex = itemsArray.length - 1;
5✔
73
                while (hasDisabledItems && itemsArray[newIndex].disabled && newIndex > 0) {
5✔
74
                    newIndex = newIndex === 0 ? itemsArray.length - 1 : newIndex - 1;
1!
75
                }
76
                break;
5✔
77
            case this.platform.KEYMAP.ENTER:
78
                if (!this.tab.panelComponent) {
4✔
79
                    this.nativeElement.click();
4✔
80
                }
81
                unsupportedKey = true;
4✔
82
                break;
4✔
83
            case this.platform.KEYMAP.SPACE:
84
                event.preventDefault();
3✔
85
                if (!this.tab.panelComponent) {
3✔
86
                    this.nativeElement.click();
3✔
87
                }
88
                unsupportedKey = true;
3✔
89
                break;
3✔
90
            default:
UNCOV
91
                unsupportedKey = true;
×
UNCOV
92
                break;
×
93
        }
94

95
        if (!unsupportedKey) {
45✔
96
            itemsArray[newIndex].headerComponent.nativeElement.focus({preventScroll:true});
38✔
97
            if (this.tab.panelComponent) {
38✔
98
                this.tabs.selectedIndex = newIndex;
22✔
99
            }
100
        }
101
    }
102

103
    /** @hidden @internal */
104
    public ngAfterViewInit(): void {
105
        this.ngZone.runOutsideAngular(() => {
205✔
106
            this._resizeObserver = new (getResizeObserver())(() => {
205✔
107
                this.tabs.realignSelectedIndicator();
108✔
108
            });
109
            this._resizeObserver.observe(this.nativeElement);
205✔
110
        });
111
    }
112

113
    /** @hidden @internal */
114
    public ngOnDestroy(): void {
115
        this.ngZone.runOutsideAngular(() => {
205✔
116
            this._resizeObserver?.disconnect();
205✔
117
        });
118
    }
119

120
    private getNewSelectionIndex(newIndex: number, itemsArray: any[], key: string, hasDisabledItems: boolean): number {
121
        if ((key === this.platform.KEYMAP.ARROW_RIGHT && !this.dir.rtl) || (key === this.platform.KEYMAP.ARROW_LEFT && this.dir.rtl)) {
26✔
122
            newIndex = newIndex === itemsArray.length - 1 ? 0 : newIndex + 1;
14✔
123
            while (hasDisabledItems && itemsArray[newIndex].disabled && newIndex < itemsArray.length) {
14✔
124
                newIndex = newIndex === itemsArray.length - 1 ? 0 : newIndex + 1;
4✔
125
            }
126
        } else {
127
            newIndex = newIndex === 0 ? itemsArray.length - 1 : newIndex - 1;
12✔
128
            while (hasDisabledItems && itemsArray[newIndex].disabled && newIndex >= 0) {
12✔
129
                newIndex = newIndex === 0 ? itemsArray.length - 1 : newIndex - 1;
5✔
130
            }
131
        }
132
        return newIndex;
26✔
133
    }
134
}
135

STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc