Skip to content

Commit 901a858

Browse files
committed
fix(rowPinning): Fix issues with styling and reverse navigation changes. Simplify grid template.
1 parent 4f1f30d commit 901a858

File tree

8 files changed

+79
-44
lines changed

8 files changed

+79
-44
lines changed

projects/igniteui-angular/src/lib/core/styles/components/grid/_grid-component.scss

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -681,6 +681,11 @@
681681
@extend %igx-grid__hierarchical-expander--cosy !optional;
682682
}
683683

684+
@include e(hierarchical-expander, $m: empty) {
685+
@extend %igx-grid__hierarchical-expander--cosy !optional;
686+
@extend %igx-grid__hierarchical-expander--empty !optional;
687+
}
688+
684689
@include e(hierarchical-expander, $m: push) {
685690
@extend %igx-grid__hierarchical-expander--push--cosy !optional;
686691
}
@@ -780,6 +785,11 @@
780785
@include e(hierarchical-expander) {
781786
@extend %igx-grid__hierarchical-expander--compact !optional;
782787
}
788+
789+
@include e(hierarchical-expander, $m: empty) {
790+
@extend %igx-grid__hierarchical-expander--compact !optional;
791+
@extend %igx-grid__hierarchical-expander--empty !optional;
792+
}
783793

784794
@include e(hierarchical-expander, $m: push) {
785795
@extend %igx-grid__hierarchical-expander--push--compact !optional;

projects/igniteui-angular/src/lib/grids/grid-mrl-navigation.service.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ export class IgxGridMRLNavigationService extends IgxGridNavigationService {
219219
} else if (prevRow) {
220220
prevRow.nativeElement.focus({ preventScroll: true });
221221
} else {
222-
const prevElem = this.getRowByIndex(rowIndex) as any;
222+
const prevElem = this.getRowByIndex(rowIndex, '') as any;
223223
prevElem.focus({ preventScroll: true });
224224
}
225225
};
@@ -264,7 +264,7 @@ export class IgxGridMRLNavigationService extends IgxGridNavigationService {
264264
} else if (nextRow) {
265265
nextRow.nativeElement.focus({ preventScroll: true });
266266
} else {
267-
const nextElem = this.getRowByIndex(rowIndex) as any;
267+
const nextElem = this.getRowByIndex(rowIndex, '') as any;
268268
nextElem.focus({ preventScroll: true });
269269
}
270270
};

projects/igniteui-angular/src/lib/grids/grid-navigation.service.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,8 @@ export class IgxGridNavigationService {
323323
this.grid.verticalScrollContainer.onChunkLoad
324324
.pipe(first())
325325
.subscribe(() => {
326-
rowElement = this.getRowByIndex(currentRowIndex);
326+
const tag = rowElement.tagName.toLowerCase();
327+
rowElement = this.getRowByIndex(currentRowIndex, tag);
327328
this.focusPreviousElement(rowElement, visibleColumnIndex);
328329
});
329330
} else {
@@ -593,7 +594,7 @@ export class IgxGridNavigationService {
593594
if (visibleColumnIndex === 0 && prevIsDetailRow) {
594595
let target = currentRowEl.previousElementSibling;
595596
const applyFocusFunc = () => {
596-
target = this.getRowByIndex(rowIndex - 1);
597+
target = this.getRowByIndex(rowIndex - 1, '');
597598
target.focus({ preventScroll: true });
598599
};
599600
if (target) {
@@ -627,7 +628,7 @@ export class IgxGridNavigationService {
627628

628629
public shouldPerformVerticalScroll(targetRowIndex: number, visibleColumnIndex: number): boolean {
629630
const containerTopOffset = parseInt(this.verticalDisplayContainerElement.style.top, 10);
630-
const targetRow = this.getRowByIndex(targetRowIndex) as any;
631+
const targetRow = this.getRowByIndex(targetRowIndex, '') as any;
631632
const rowHeight = this.grid.verticalScrollContainer.getSizeAt(targetRowIndex);
632633
const containerHeight = this.grid.calcHeight ? Math.ceil(this.grid.calcHeight) : 0;
633634
const targetEndTopOffset = targetRow ? targetRow.offsetTop + rowHeight + containerTopOffset :
@@ -671,10 +672,10 @@ export class IgxGridNavigationService {
671672
return this.grid;
672673
}
673674

674-
protected getRowByIndex(index) {
675+
protected getRowByIndex(index, selector = this.getRowSelector()) {
675676
const gridTag = this.grid.nativeElement.tagName.toLocaleLowerCase();
676677
const row = Array.from(this.grid.tbody.nativeElement.querySelectorAll(
677-
`[data-rowindex="${index}"]`))
678+
`${selector}[data-rowindex="${index}"]`))
678679
.find(x => this.getClosestElemByTag(x, gridTag).getAttribute('id') === this.grid.id);
679680
return row;
680681
}

projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-cell.component.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@ export class IgxHierarchicalGridCellComponent extends IgxGridCellComponent imple
2121
* @hidden
2222
*/
2323
public get displayPinnedChip() {
24-
return this.hierarchicalRow.ghostRow &&
25-
(!this.grid.visibleColumns[this.visibleColumnIndex - 1] || this.grid.visibleColumns[this.visibleColumnIndex - 1].cellTemplate);
24+
return this.hierarchicalRow.pinned && this.hierarchicalRow.ghostRow && this.visibleColumnIndex === 0 && !(this.column as any).cellTemplate;
2625
}
2726

2827
/**

projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.component.html

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -97,13 +97,10 @@
9797
| gridHierarchicalRowPinning:true:pipeTrigger
9898
| gridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:id:pipeTrigger:filteringPipeTrigger
9999
| gridSort:sortingExpressions:sortStrategy:id:pipeTrigger as pinnedData">
100-
<div #pinContainer *ngIf='pinnedData.length > 0' [ngClass]="{ 'igx-grid__tr--pinned-bottom': !isRowPinningToTop, 'igx-grid__tr--pinned-top': isRowPinningToTop }">
101-
<ng-container *ngFor="let rowData of pinnedData; let rowIndex = index">
102-
<ng-template #hierarchical_record_template>
103-
<igx-hierarchical-grid-row [gridID]="id" [index]="getRowIndex(rowIndex, true)" [rowData]="rowData">
104-
</igx-hierarchical-grid-row>
105-
</ng-template>
106-
100+
<div #pinContainer *ngIf='pinnedData.length > 0' class='igx-grid__tr--pinned'
101+
[ngClass]="{ 'igx-grid__tr--pinned-bottom': !isRowPinningToTop, 'igx-grid__tr--pinned-top': isRowPinningToTop }"
102+
[style.bottom.px]=' !isRowPinningToTop ? pinnedBottom : null'>
103+
<ng-container *ngFor="let rowData of pinnedData; let rowIndex = index">
107104
<ng-container *ngTemplateOutlet="hierarchical_record_template; context: getContext(rowData, rowIndex, true)">
108105
</ng-container>
109106
</ng-container>
@@ -112,39 +109,40 @@
112109
</ng-template>
113110
<ng-container *ngTemplateOutlet="hasPinnedRecords && isRowPinningToTop ? pinnedRecordsTemplate : null">
114111
</ng-container>
115-
<ng-template igxGridFor let-rowData [igxGridForOf]="data
112+
<ng-template igxGridFor let-rowData let-rowIndex="index" [igxGridForOf]="data
116113
| gridTransaction:id:pipeTrigger
117114
| visibleColumns:hasVisibleColumns
118115
| gridHierarchicalRowPinning:false:pipeTrigger
119116
| gridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:id:pipeTrigger:filteringPipeTrigger
120117
| gridSort:sortingExpressions:sortStrategy:id:pipeTrigger
121118
| gridHierarchicalPaging:page:perPage:id:pipeTrigger
122-
| gridHierarchical:expansionStates:id:primaryKey:childLayoutKeys:pipeTrigger" let-rowIndex="index"
119+
| gridHierarchical:expansionStates:id:primaryKey:childLayoutKeys:pipeTrigger"
123120
[igxForScrollOrientation]="'vertical'" [igxForScrollContainer]='verticalScroll'
124121
[igxForContainerSize]='calcHeight' [igxForItemSize]="renderedRowHeight" [igxForTrackBy]='trackChanges'
125122
#verticalScrollContainer (onChunkPreload)="dataLoading($event)">
126-
<ng-template #hierarchical_record_template>
127-
<igx-hierarchical-grid-row [gridID]="id" [index]="getRowIndex(rowIndex, false)" [ghostRow]="isGhostRecord(rowData)" [rowData]="!isGhostRecord(rowData) ? rowData : rowData.recordData" #row>
128-
</igx-hierarchical-grid-row>
129-
</ng-template>
130-
<ng-template #child_record_template let-rowIndex="index" let-rowData>
131-
<div style="overflow:auto;width: 100%;" [attr.data-rowindex]='rowIndex' (scroll)='onContainerScroll()'
132-
[ngClass]="{
133-
'igx-grid__tr-container': true,
134-
'igx-grid__tr--highlighted':isRowHighlighted(rowData)
135-
}">
136-
<igx-child-grid-row *ngFor="let layout of childLayoutList" [parentGridID]="id" [index]="getRowIndex(rowIndex, false)"
137-
[rowData]="rowData" [layout]='layout' #row>
138-
</igx-child-grid-row>
139-
</div>
140-
</ng-template>
141123
<ng-template
142-
[igxTemplateOutlet]='(isHierarchicalRecord(rowData) ? hierarchical_record_template : (isChildGridRecord(rowData) && isExpanded(rowData) ? child_record_template : hierarchical_record_template))'
143-
[igxTemplateOutletContext]='getContext(rowData, rowIndex, false)' (onViewCreated)='viewCreatedHandler($event)'
144-
(onViewMoved)='viewMovedHandler($event)' (onCachedViewLoaded)='cachedViewLoaded($event)'
145-
(onBeforeViewDetach)='viewDetachHandler($event)'></ng-template>
124+
[igxTemplateOutlet]='(isHierarchicalRecord(rowData) ? hierarchical_record_template : (isChildGridRecord(rowData) && isExpanded(rowData) ? child_record_template : hierarchical_record_template))'
125+
[igxTemplateOutletContext]='getContext(rowData, rowIndex, false)' (onViewCreated)='viewCreatedHandler($event)'
126+
(onViewMoved)='viewMovedHandler($event)' (onCachedViewLoaded)='cachedViewLoaded($event)'
127+
(onBeforeViewDetach)='viewDetachHandler($event)'>
128+
</ng-template>
146129
<!-- <ng-container *igxTemplateOutlet="(isHierarchicalRecord(rowData) ? hierarchical_record_template : (isChildGridRecord(rowData) && isExpanded(rowData) ? child_record_template : hierarchical_record_template)); context: getContext(rowData)"></ng-container> -->
147130
</ng-template>
131+
<ng-template #hierarchical_record_template let-rowIndex="index" let-ghost="ghostRow" let-rowData>
132+
<igx-hierarchical-grid-row [gridID]="id" [index]="rowIndex" [ghostRow]="ghost" [rowData]="rowData" #row>
133+
</igx-hierarchical-grid-row>
134+
</ng-template>
135+
<ng-template #child_record_template let-rowIndex="index" let-rowData>
136+
<div style="overflow:auto;width: 100%;" [attr.data-rowindex]='rowIndex' (scroll)='onContainerScroll()'
137+
[ngClass]="{
138+
'igx-grid__tr-container': true,
139+
'igx-grid__tr--highlighted':isRowHighlighted(rowData)
140+
}">
141+
<igx-child-grid-row *ngFor="let layout of childLayoutList" [parentGridID]="id" [index]="getRowIndex(rowIndex, false)"
142+
[rowData]="rowData" [layout]='layout' #row>
143+
</igx-child-grid-row>
144+
</div>
145+
</ng-template>
148146
<ng-container *ngTemplateOutlet="hasPinnedRecords && !isRowPinningToTop ? pinnedRecordsTemplate : null">
149147
</ng-container>
150148
<ng-container *ngTemplateOutlet="template"></ng-container>

projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.component.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,8 @@ export class IgxHierarchicalGridComponent extends IgxHierarchicalGridBaseDirecti
551551
return {
552552
$implicit: this.isGhostRecord(rowData) ? rowData.recordData : rowData,
553553
templateID: 'dataRow',
554-
index: this.getRowIndex(rowIndex, pinned)
554+
index: this.getRowIndex(rowIndex, pinned),
555+
ghostRow: this.isGhostRecord(rowData)
555556
};
556557
}
557558
}

src/app/grid-row-pinning/grid-row-pinning.sample.html

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@
55
<button (click)="grid1.addRow({'ID': 'TEST', 'CompanyName': 'Test'})">Add Row</button>
66
<div class="sample-content">
77
<div class="sample-column">
8+
<div>
9+
<input igxButton="raised" type="button" name="Density" (click)="toggleDensity()" value="Density"/>
10+
<span> Current: {{displayDensityOptions.displayDensity}}</span>
11+
</div>
812
<div class="sample-switches">
913
<igx-switch (change)='onRowChange()' style="padding-left: 10px"> Bottom Row Pinning toggle</igx-switch>
1014
<igx-switch (change)='onChange()' style="padding-left: 10px"> Right Column Pinning toggle</igx-switch>
11-
<input igxButton type="button" name="Unpin" (click)="clickUnpin()"/>
1215
</div>
1316
<igx-grid [allowFiltering]='true' [primaryKey]='"ID"' [pinning]="pinningConfig" [showToolbar]='true' [columnPinning]='true' #grid1 [data]="data" [width]="'800px'" [height]="'500px'" [rowSelectable]="false">
1417
<igx-column width='70px' [filterable]='false'>
@@ -29,7 +32,7 @@
2932
</igx-grid>
3033
</div>
3134
<div class="sample-column">
32-
<igx-hierarchical-grid [showExpandAll]='true' [data]="hierarchicalData" [pinning]="pinningConfig" [showToolbar]='true' [columnPinning]='true' [width]="'800px'" [height]="'500px'" [rowSelectable]="true" #hGrid>
35+
<igx-hierarchical-grid [showExpandAll]='true' [data]="hierarchicalData" [pinning]="pinningConfig" [showToolbar]='true' [columnPinning]='true' [columnHiding]='true' [width]="'800px'" [height]="'500px'" [rowSelectable]="true" #hGrid>
3336
<igx-column width='70px' [filterable]='false'>
3437
<ng-template igxCell let-cell="cell" let-val>
3538
<igx-icon class="pin-icon" (mousedown)="togglePining(cell.row, $event)">

src/app/grid-row-pinning/grid-row-pinning.sample.ts

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,25 @@
1-
import { Component, OnInit, ViewChild } from '@angular/core';
2-
import { IgxGridComponent, ColumnPinningPosition, RowPinningPosition, IgxGridRowComponent, IgxTransactionService, IgxGridTransaction, IgxHierarchicalRowComponent, IgxHierarchicalGridComponent } from 'igniteui-angular';
1+
import { Component, OnInit, ViewChild, Input, Inject } from '@angular/core';
2+
import {
3+
IgxGridComponent,
4+
ColumnPinningPosition,
5+
RowPinningPosition,
6+
IgxGridRowComponent,
7+
IgxTransactionService,
8+
IgxGridTransaction,
9+
IgxHierarchicalGridComponent,
10+
DisplayDensityToken,
11+
DisplayDensity,
12+
IDisplayDensityOptions } from 'igniteui-angular';
313
import { IPinningConfig } from 'projects/igniteui-angular/src/lib/grids/common/grid.interface';
414

515
@Component({
6-
providers: [{ provide: IgxGridTransaction, useClass: IgxTransactionService }],
716
selector: 'app-grid-row-pinning-sample',
817
styleUrls: ['grid-row-pinning.sample.css'],
9-
templateUrl: 'grid-row-pinning.sample.html'
18+
templateUrl: 'grid-row-pinning.sample.html',
19+
providers: [
20+
{ provide: IgxGridTransaction, useClass: IgxTransactionService },
21+
{ provide: DisplayDensityToken, useValue: { displayDensity: DisplayDensity.comfortable} }
22+
],
1023
})
1124

1225
export class GridRowPinningSampleComponent implements OnInit {
@@ -18,6 +31,8 @@ export class GridRowPinningSampleComponent implements OnInit {
1831
@ViewChild('hGrid', { static: true })
1932
hGrid: IgxHierarchicalGridComponent;
2033

34+
constructor(@Inject(DisplayDensityToken) public displayDensityOptions: IDisplayDensityOptions) {}
35+
2136
onRowChange() {
2237
if (this.pinningConfig.rows === RowPinningPosition.Bottom) {
2338
this.pinningConfig = { columns: this.pinningConfig.columns, rows: RowPinningPosition.Top };
@@ -149,4 +164,12 @@ export class GridRowPinningSampleComponent implements OnInit {
149164
console.log(cell);
150165
return true;
151166
}
167+
168+
toggleDensity() {
169+
switch (this.displayDensityOptions.displayDensity ) {
170+
case DisplayDensity.comfortable: this.displayDensityOptions.displayDensity = DisplayDensity.compact; break;
171+
case DisplayDensity.compact: this.displayDensityOptions.displayDensity = DisplayDensity.cosy; break;
172+
case DisplayDensity.cosy: this.displayDensityOptions.displayDensity = DisplayDensity.comfortable; break;
173+
}
174+
}
152175
}

0 commit comments

Comments
 (0)