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

IgniteUI / igniteui-angular / 13545721611

26 Feb 2025 02:05PM UTC coverage: 91.591% (-0.03%) from 91.622%
13545721611

Pull #15209

github

web-flow
Merge 25ba2c0ab into a038a03b1
Pull Request #15209: fix(pivot-grid): added createRow method for grid based events

13329 of 15614 branches covered (85.37%)

0 of 18 new or added lines in 2 files covered. (0.0%)

611 existing lines in 53 files now uncovered.

26883 of 29351 relevant lines covered (91.59%)

33690.24 hits per line

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

78.91
/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-data-selector.component.ts
1
import { useAnimation } from "@angular/animations";
2
import {
3
    ChangeDetectorRef,
4
    Component,
5
    EventEmitter,
6
    HostBinding,
7
    Input,
8
    Output,
9
    Renderer2,
10
    booleanAttribute
11
} from "@angular/core";
12
import { first } from "rxjs/operators";
13
import { SortingDirection } from "../../data-operations/sorting-strategy";
14
import { IDragBaseEventArgs, IDragGhostBaseEventArgs, IDragMoveEventArgs, IDropBaseEventArgs, IDropDroppedEventArgs, IgxDropDirective, IgxDragDirective, IgxDragHandleDirective } from "../../directives/drag-drop/drag-drop.directive";
15
import { ISelectionEventArgs } from "../../drop-down/drop-down.common";
16
import { IgxDropDownComponent } from "../../drop-down/drop-down.component";
17
import {
18
    AbsoluteScrollStrategy,
19
    AutoPositionStrategy,
20
    OverlaySettings,
21
    PositionSettings,
22
    VerticalAlignment
23
} from "../../services/public_api";
24
import { ColumnType, PivotGridType } from "../common/grid.interface";
25
import {
26
    IPivotAggregator,
27
    IPivotDimension,
28
    IPivotValue,
29
    PivotDimensionType
30
} from "./pivot-grid.interface";
31
import { PivotUtil } from './pivot-util';
32
import { IgxFilterPivotItemsPipe } from "./pivot-grid.pipes";
33
import { IgxDropDownItemComponent } from "../../drop-down/drop-down-item.component";
34
import { IgxDropDownItemNavigationDirective } from "../../drop-down/drop-down-navigation.directive";
35
import { IgxExpansionPanelBodyComponent } from "../../expansion-panel/expansion-panel-body.component";
36
import { IgxChipComponent } from "../../chips/chip.component";
37
import { IgxExpansionPanelTitleDirective } from "../../expansion-panel/expansion-panel.directives";
38
import { IgxExpansionPanelHeaderComponent } from "../../expansion-panel/expansion-panel-header.component";
39
import { IgxExpansionPanelComponent } from "../../expansion-panel/expansion-panel.component";
40
import { IgxAccordionComponent } from "../../accordion/accordion.component";
41
import { IgxCheckboxComponent } from "../../checkbox/checkbox.component";
42
import { IgxListItemComponent } from "../../list/list-item.component";
43
import { IgxListComponent } from "../../list/list.component";
44
import { IgxInputDirective } from "../../directives/input/input.directive";
45
import { IgxPrefixDirective } from "../../directives/prefix/prefix.directive";
46
import { IgxIconComponent } from "../../icon/icon.component";
47
import { IgxInputGroupComponent } from "../../input-group/input-group.component";
48
import { fadeIn, fadeOut } from 'igniteui-angular/animations';
49
import { Size } from '../common/enums';
50

51
interface IDataSelectorPanel {
52
    name: string;
53
    i18n: string;
54
    type?: PivotDimensionType;
55
    dataKey: string;
56
    icon: string;
57
    itemKey: string;
58
    displayKey?: string;
59
    sortable: boolean;
60
    dragChannels: string[];
61
}
62

63
/* blazorIndirectRender
64
   blazorComponent */
65
/* wcElementTag: igc-pivot-data-selector */
66
/**
67
 * Pivot Data Selector provides means to configure the pivot state of the Pivot Grid via a vertical panel UI
68
 *
69
 * @igxModule IgxPivotGridModule
70
 * @igxGroup Grids & Lists
71
 * @igxKeywords data selector, pivot, grid
72
 * @igxTheme pivot-data-selector-theme
73
 * @remarks
74
 * The Ignite UI Data Selector has a searchable list with the grid data columns,
75
 * there are also four expandable areas underneath for filters, rows, columns, and values
76
 * is used for grouping and aggregating simple flat data into a pivot table.
77
 * @example
78
 * ```html
79
 * <igx-pivot-grid #grid1 [data]="data" [pivotConfiguration]="configuration">
80
 * </igx-pivot-grid>
81
 * <igx-pivot-data-selector [grid]="grid1"></igx-pivot-data-selector>
82
 * ```
83
 */
84
@Component({
85
    selector: "igx-pivot-data-selector",
86
    templateUrl: "./pivot-data-selector.component.html",
87
    imports: [IgxInputGroupComponent, IgxIconComponent, IgxPrefixDirective, IgxInputDirective, IgxListComponent, IgxListItemComponent, IgxCheckboxComponent, IgxAccordionComponent, IgxExpansionPanelComponent, IgxExpansionPanelHeaderComponent, IgxDropDirective, IgxExpansionPanelTitleDirective, IgxChipComponent, IgxExpansionPanelBodyComponent, IgxDragDirective, IgxDropDownItemNavigationDirective, IgxDragHandleDirective, IgxDropDownComponent, IgxDropDownItemComponent, IgxFilterPivotItemsPipe]
88
})
89
export class IgxPivotDataSelectorComponent {
2✔
90

91
    /**
92
     * Gets/sets whether the columns panel is expanded
93
     * Get
94
     * ```typescript
95
     *  const columnsPanelState: boolean = this.dataSelector.columnsExpanded;
96
     * ```
97
     * Set
98
     * ```html
99
     * <igx-pivot-data-selector [grid]="grid1" [columnsExpanded]="columnsPanelState"></igx-pivot-data-selector>
100
     * ```
101
     *
102
     * Two-way data binding:
103
     * ```html
104
     * <igx-pivot-data-selector [grid]="grid1" [(columnsExpanded)]="columnsPanelState"></igx-pivot-data-selector>
105
     * ```
106
     */
107
    @Input({ transform: booleanAttribute })
108
    public columnsExpanded = true;
70✔
109

110
    /**
111
     * @hidden
112
     */
113
    @Output()
114
    public columnsExpandedChange = new EventEmitter<boolean>();
70✔
115

116
    /**
117
     * Gets/sets whether the rows panel is expanded
118
     * Get
119
     * ```typescript
120
     *  const rowsPanelState: boolean = this.dataSelector.rowsExpanded;
121
     * ```
122
     * Set
123
     * ```html
124
     * <igx-pivot-data-selector [grid]="grid1" [rowsExpanded]="rowsPanelState"></igx-pivot-data-selector>
125
     * ```
126
     *
127
     * Two-way data binding:
128
     * ```html
129
     * <igx-pivot-data-selector [grid]="grid1" [(rowsExpanded)]="rowsPanelState"></igx-pivot-data-selector>
130
     * ```
131
     */
132
    @Input({ transform: booleanAttribute })
133
    public rowsExpanded = true;
70✔
134

135
    /**
136
     * @hidden
137
     */
138
    @Output()
139
    public rowsExpandedChange = new EventEmitter<boolean>();
70✔
140

141
    /**
142
     * Gets/sets whether the filters panel is expanded
143
     * Get
144
     * ```typescript
145
     *  const filtersPanelState: boolean = this.dataSelector.filtersExpanded;
146
     * ```
147
     * Set
148
     * ```html
149
     * <igx-pivot-data-selector [grid]="grid1" [filtersExpanded]="filtersPanelState"></igx-pivot-data-selector>
150
     * ```
151
     *
152
     * Two-way data binding:
153
     * ```html
154
     * <igx-pivot-data-selector [grid]="grid1" [(filtersExpanded)]="filtersPanelState"></igx-pivot-data-selector>
155
     * ```
156
     */
157
    @Input({ transform: booleanAttribute })
158
    public filtersExpanded = true;
70✔
159

160
    /**
161
     * @hidden
162
     */
163
    @Output()
164
    public filtersExpandedChange = new EventEmitter<boolean>();
70✔
165

166
    /**
167
     * Gets/sets whether the values panel is expanded
168
     * Get
169
     * ```typescript
170
     *  const valuesPanelState: boolean = this.dataSelector.valuesExpanded;
171
     * ```
172
     * Set
173
     * ```html
174
     * <igx-pivot-data-selector [grid]="grid1" [valuesExpanded]="valuesPanelState"></igx-pivot-data-selector>
175
     * ```
176
     *
177
     * Two-way data binding:
178
     * ```html
179
     * <igx-pivot-data-selector [grid]="grid1" [(valuesExpanded)]="valuesPanelState"></igx-pivot-data-selector>
180
     * ```
181
     */
182
    @Input({ transform: booleanAttribute })
183
    public valuesExpanded = true;
70✔
184

185
    /**
186
     * @hidden
187
     */
188
    @Output()
189
    public valuesExpandedChange = new EventEmitter<boolean>();
70✔
190

191
    private _grid: PivotGridType;
192
    private _dropDelta = 0;
70✔
193

194
    /** @hidden @internal **/
195
    @HostBinding("class.igx-pivot-data-selector")
196
    public cssClass = "igx-pivot-data-selector";
70✔
197

198
    @HostBinding("style.--ig-size")
199
    protected get size(): Size {
200
        return this.grid?.gridSize;
471✔
201
    }
202

203
    /** @hidden @internal **/
204
    public dimensions: IPivotDimension[];
205

206
    private _subMenuPositionSettings: PositionSettings = {
70✔
207
        verticalStartPoint: VerticalAlignment.Bottom,
208
        closeAnimation: undefined,
209
    };
210

211
    private _subMenuOverlaySettings: OverlaySettings = {
70✔
212
        closeOnOutsideClick: true,
213
        modal: false,
214
        positionStrategy: new AutoPositionStrategy(
215
            this._subMenuPositionSettings
216
        ),
217
        scrollStrategy: new AbsoluteScrollStrategy(),
218
    };
219

220
    /* blazorSuppress */
221
    public animationSettings = {
70✔
222
        closeAnimation: useAnimation(fadeOut, {
223
            params: {
224
                duration: "0ms",
225
            },
226
        }),
227
        openAnimation: useAnimation(fadeIn, {
228
            params: {
229
                duration: "0ms",
230
            },
231
        }),
232
    };
233

234
    /** @hidden @internal */
235
    public aggregateList: IPivotAggregator[] = [];
70✔
236
    /** @hidden @internal */
237
    public value: IPivotValue;
238
    /** @hidden @internal */
239
    public ghostText: string;
240
    /** @hidden @internal */
241
    public ghostWidth: number;
242
    /** @hidden @internal */
243
    public dropAllowed: boolean;
244
    /** @hidden @internal */
245
    public get dims(): IPivotDimension[] {
246
        return this._grid?.allDimensions || [];
540✔
247
    }
248
    /** @hidden @internal */
249
    public get values(): IPivotValue[] {
250
        return this._grid?.pivotConfiguration.values || [];
540✔
251
    }
252

253
    constructor(private renderer: Renderer2, private cdr: ChangeDetectorRef) { }
70✔
254

255
    /**
256
     * @hidden @internal
257
     */
258
    public _panels: IDataSelectorPanel[] = [
70✔
259
        {
260
            name: "Filters",
261
            i18n: 'igx_grid_pivot_selector_filters',
262
            type: PivotDimensionType.Filter,
263
            dataKey: "filterDimensions",
264
            icon: "filter_list",
265
            itemKey: "memberName",
266
            displayKey: 'displayName',
267
            sortable: false,
268
            dragChannels: ["Filters", "Columns", "Rows"]
269
        },
270
        {
271
            name: "Columns",
272
            i18n: 'igx_grid_pivot_selector_columns',
273
            type: PivotDimensionType.Column,
274
            dataKey: "columnDimensions",
275
            icon: "view_column",
276
            itemKey: "memberName",
277
            displayKey: 'displayName',
278
            sortable: true,
279
            dragChannels: ["Filters", "Columns", "Rows"]
280
        },
281
        {
282
            name: "Rows",
283
            i18n: 'igx_grid_pivot_selector_rows',
284
            type: PivotDimensionType.Row,
285
            dataKey: "rowDimensions",
286
            icon: "table_rows",
287
            itemKey: "memberName",
288
            displayKey: 'displayName',
289
            sortable: true,
290
            dragChannels: ["Filters", "Columns", "Rows"]
291
        },
292
        {
293
            name: "Values",
294
            i18n: 'igx_grid_pivot_selector_values',
295
            type: null,
296
            dataKey: "values",
297
            icon: "functions",
298
            itemKey: "member",
299
            displayKey: 'displayName',
300
            sortable: false,
301
            dragChannels: ["Values"]
302
        },
303
    ];
304

305

306
    /* treatAsRef */
307
    /**
308
     * Sets the grid.
309
     */
310
    @Input()
311
    public set grid(value: PivotGridType) {
312
        this._grid = value;
69✔
313
    }
314

315
    /* treatAsRef */
316
    /**
317
     * Returns the grid.
318
     */
319
    public get grid(): PivotGridType {
320
        return this._grid;
24,736✔
321
    }
322

323
    /**
324
     * @hidden
325
     * @internal
326
     */
327
    public onItemSort(
328
        _: Event,
329
        dimension: IPivotDimension,
330
        dimensionType: PivotDimensionType
331
    ) {
332
        if (
6!
333
            !this._panels.find(
334
                (panel: IDataSelectorPanel) => panel.type === dimensionType
15✔
335
            ).sortable
336
        )
UNCOV
337
            return;
×
338

339
        const startDirection = dimension.sortDirection || SortingDirection.None;
6✔
340
        const direction = startDirection + 1 > SortingDirection.Desc ?
6✔
341
            SortingDirection.None : startDirection + 1;
342
        this.grid.sortDimension(dimension, direction);
6✔
343
    }
344

345
    /**
346
     * @hidden
347
     * @internal
348
     */
349
    public onFilteringIconPointerDown(event: PointerEvent) {
UNCOV
350
        event.stopPropagation();
×
351
        event.preventDefault();
×
352
    }
353

354
    /**
355
     * @hidden
356
     * @internal
357
     */
358
    public onFilteringIconClick(event: MouseEvent, dimension: IPivotDimension) {
359
        event.stopPropagation();
2✔
360
        event.preventDefault();
2✔
361

362
        let dim = dimension;
2✔
363
        let col: ColumnType;
364

365
        while (dim) {
2✔
366
            col = this.grid.dimensionDataColumns.find(
2✔
367
                (x) => x.field === dim.memberName
3✔
368
            );
369
            if (col) {
2!
370
                break;
2✔
371
            } else {
UNCOV
372
                dim = dim.childLevel;
×
373
            }
374
        }
375

376
        this.grid.filteringService.toggleFilterDropdown(event.target, col);
2✔
377
    }
378

379
    /**
380
     * @hidden
381
     * @internal
382
     */
383
    protected getDimensionState(dimensionType: PivotDimensionType) {
384
        switch (dimensionType) {
1!
385
            case PivotDimensionType.Row:
UNCOV
386
                return this.grid.rowDimensions;
×
387
            case PivotDimensionType.Column:
UNCOV
388
                return this.grid.columnDimensions;
×
389
            case PivotDimensionType.Filter:
UNCOV
390
                return this.grid.filterDimensions;
×
391
            default:
392
                return null;
1✔
393
        }
394
    }
395

396
    /**
397
     * @hidden
398
     * @internal
399
     */
400
    protected moveValueItem(itemId: string) {
401
        const aggregation = this.grid.pivotConfiguration.values;
1✔
402
        const valueIndex =
403
            aggregation.findIndex((x) => x.member === itemId) !== -1
2!
404
                ? aggregation?.findIndex((x) => x.member === itemId)
2✔
405
                : aggregation.length;
406
        const newValueIndex =
407
            valueIndex + this._dropDelta < 0 ? 0 : valueIndex + this._dropDelta;
1!
408

409
        const aggregationItem = aggregation.find(
1✔
410
            (x) => x.member === itemId || x.displayName === itemId
2✔
411
        );
412

413
        if (aggregationItem) {
1✔
414
            this.grid.moveValue(aggregationItem, newValueIndex);
1✔
415
            this.grid.valuesChange.emit({
1✔
416
                values: this.grid.pivotConfiguration.values,
417
            });
418
        }
419
    }
420

421
    /**
422
     * @hidden
423
     * @internal
424
     */
425
    public onItemDropped(
426
        event: IDropDroppedEventArgs,
427
        dimensionType: PivotDimensionType
428
    ) {
429
        if (!this.dropAllowed) {
1!
UNCOV
430
            return;
×
431
        }
432

433
        const dimension = this.grid.getDimensionsByType(dimensionType);
1✔
434
        const dimensionState = this.getDimensionState(dimensionType);
1✔
435
        const itemId = event.drag.element.nativeElement.id;
1✔
436
        const targetId = event.owner.element.nativeElement.id;
1✔
437
        const dimensionItem = dimension?.find((x) => x.memberName === itemId);
1✔
438
        const itemIndex =
439
            dimension?.findIndex((x) => x?.memberName === itemId) !== -1
1!
UNCOV
440
                ? dimension?.findIndex((x) => x.memberName === itemId)
×
441
                : dimension?.length;
442
        const dimensions = this.grid.allDimensions.filter((x) => x && x.memberName === itemId);
2✔
443

444
        const reorder =
445
            dimensionState?.findIndex((item) => item.memberName === itemId) !==
1✔
446
            -1;
447

448
        let targetIndex =
449
            targetId !== ""
1!
UNCOV
450
                ? dimension?.findIndex((x) => x.memberName === targetId)
×
451
                : dimension?.length;
452

453
        if (!dimension) {
1✔
454
            this.moveValueItem(itemId);
1✔
455
        }
456

457
        if (reorder) {
1✔
458
            targetIndex =
1✔
459
                itemIndex + this._dropDelta < 0
1!
460
                    ? 0
461
                    : itemIndex + this._dropDelta;
462
        }
463

464
        if (dimensionItem) {
1!
UNCOV
465
            this.grid.moveDimension(dimensionItem, dimensionType, targetIndex);
×
466
        } else {
467
            const newDim = dimensions.find((x) => x.memberName === itemId);
1✔
468
            this.grid.moveDimension(newDim, dimensionType, targetIndex);
1✔
469
        }
470

471
        this.grid.dimensionsChange.emit({
1✔
472
            dimensions: dimension,
473
            dimensionCollectionType: dimensionType,
474
        });
475
    }
476

477
    /**
478
     * @hidden
479
     * @internal
480
     */
481
    protected updateDropDown(
482
        value: IPivotValue,
483
        dropdown: IgxDropDownComponent
484
    ) {
UNCOV
485
        this.value = value;
×
486
        dropdown.width = "200px";
×
487
        this.aggregateList = PivotUtil.getAggregateList(value, this.grid);
×
488
        this.cdr.detectChanges();
×
489
        dropdown.open(this._subMenuOverlaySettings);
×
490
    }
491

492
    /**
493
     * @hidden
494
     * @internal
495
     */
496
    public onSummaryClick(
497
        event: MouseEvent,
498
        value: IPivotValue,
499
        dropdown: IgxDropDownComponent
500
    ) {
UNCOV
501
        this._subMenuOverlaySettings.target =
×
502
            event.currentTarget as HTMLElement;
503

UNCOV
504
        if (dropdown.collapsed) {
×
505
            this.updateDropDown(value, dropdown);
×
506
        } else {
507
            // close for previous chip
UNCOV
508
            dropdown.close();
×
509
            dropdown.closed.pipe(first()).subscribe(() => {
×
510
                this.updateDropDown(value, dropdown);
×
511
            });
512
        }
513
    }
514

515
    /**
516
     * @hidden
517
     * @internal
518
     */
519
    public onAggregationChange(event: ISelectionEventArgs) {
UNCOV
520
        if (!this.isSelected(event.newSelection.value)) {
×
521
            this.value.aggregate = event.newSelection.value;
×
522
            this.grid.pipeTrigger++;
×
523
            this.grid.cdr.markForCheck();
×
524
        }
525
    }
526

527
    /**
528
     * @hidden
529
     * @internal
530
     */
531
    public isSelected(val: IPivotAggregator) {
UNCOV
532
        return this.value.aggregate.key === val.key;
×
533
    }
534

535
    /**
536
     * @hidden
537
     * @internal
538
     */
539
    public ghostCreated(event: IDragGhostBaseEventArgs, value: string) {
540
        const { width: itemWidth } =
541
            event.owner.element.nativeElement.getBoundingClientRect();
1✔
542
        this.ghostWidth = itemWidth;
1✔
543
        this.ghostText = value;
1✔
544
        this.renderer.setStyle(
1✔
545
            event.owner.element.nativeElement,
546
            "position",
547
            "absolute"
548
        );
549
        this.renderer.setStyle(
1✔
550
            event.owner.element.nativeElement,
551
            "visibility",
552
            "hidden"
553
        );
554
    }
555

556
    /**
557
     * @hidden
558
     * @internal
559
     */
560
    public toggleItem(item: IPivotDimension | IPivotValue) {
561
        if (item as IPivotValue) {
1✔
562
            this.grid.toggleValue(item as IPivotValue);
1✔
563
        }
564

565
        if (item as IPivotDimension) {
1✔
566
            this.grid.toggleDimension(item as IPivotDimension);
1✔
567
        }
568
    }
569

570
    /**
571
     * @hidden
572
     * @internal
573
     */
574
    public onPanelEntry(event: IDropBaseEventArgs, panel: string) {
575
        this.dropAllowed = event.dragData.gridID === this.grid.id && event.dragData.selectorChannels?.some(
2✔
576
            (channel: string) => channel === panel
2✔
577
        );
578
    }
579

580
    /**
581
     * @hidden
582
     * @internal
583
     */
584
    public onItemDragMove(event: IDragMoveEventArgs) {
585
        const clientRect =
586
            event.owner.element.nativeElement.getBoundingClientRect();
2✔
587
        this._dropDelta = Math.round(
2✔
588
            (event.nextPageY - event.startY) / clientRect.height
589
        );
590
    }
591

592
    /**
593
     * @hidden
594
     * @internal
595
     */
596
    public onItemDragEnd(event: IDragBaseEventArgs) {
597
        this.renderer.setStyle(
1✔
598
            event.owner.element.nativeElement,
599
            "position",
600
            "static"
601
        );
602
        this.renderer.setStyle(
1✔
603
            event.owner.element.nativeElement,
604
            "visibility",
605
            "visible"
606
        );
607
    }
608

609
    /**
610
     * @hidden
611
     * @internal
612
     */
613
    public onItemDragOver(event: IDropBaseEventArgs) {
614
        if (this.dropAllowed) {
2✔
615
            this.renderer.addClass(
2✔
616
                event.owner.element.nativeElement,
617
                "igx-drag--push"
618
            );
619
        }
620
    }
621

622
    /**
623
     * @hidden
624
     * @internal
625
     */
626
    public onItemDragLeave(event: IDropBaseEventArgs) {
627
        if (this.dropAllowed) {
2✔
628
            this.renderer.removeClass(
2✔
629
                event.owner.element.nativeElement,
630
                "igx-drag--push"
631
            );
632
        }
633
    }
634

635
    /**
636
     * @hidden
637
     * @internal
638
     */
639
    public getPanelCollapsed(panelType: PivotDimensionType): boolean {
640
        switch (panelType) {
2,160✔
641
            case PivotDimensionType.Column:
642
                return !this.columnsExpanded;
540✔
643
            case PivotDimensionType.Filter:
644
                return !this.filtersExpanded;
540✔
645
            case PivotDimensionType.Row:
646
                return !this.rowsExpanded;
540✔
647
            default:
648
                return !this.valuesExpanded;
540✔
649
        }
650
    }
651

652
    /**
653
     * @hidden
654
     * @internal
655
     */
656
    public onCollapseChange(value: boolean, panelType: PivotDimensionType): void {
657
        switch (panelType) {
4✔
658
            case PivotDimensionType.Column:
659
                this.columnsExpanded = !value;
1✔
660
                this.columnsExpandedChange.emit(this.columnsExpanded);
1✔
661
                break;
1✔
662
            case PivotDimensionType.Filter:
663
                this.filtersExpanded = !value;
1✔
664
                this.filtersExpandedChange.emit(this.filtersExpanded);
1✔
665
                break;
1✔
666
            case PivotDimensionType.Row:
667
                this.rowsExpanded = !value;
1✔
668
                this.rowsExpandedChange.emit(this.rowsExpanded);
1✔
669
                break;
1✔
670
            default:
671
                this.valuesExpanded = !value;
1✔
672
                this.valuesExpandedChange.emit(this.valuesExpanded)
1✔
673
        }
674
    }
675
}
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