Skip to content

Commit 5b7bcba

Browse files
authored
Merge pull request #6380 from IgniteUI/mkirova/fix-4970-8.2.x
fix(igxGrid): In case row with focused cell is detached from DOM make…
2 parents b759d98 + 1ef30fe commit 5b7bcba

File tree

5 files changed

+26
-3
lines changed

5 files changed

+26
-3
lines changed

projects/igniteui-angular/src/lib/directives/template-outlet/template_outlet.directive.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ export class IgxTemplateOutletDirective implements OnChanges {
3232
@Output()
3333
public onCachedViewLoaded = new EventEmitter<ICachedViewLoadedEventArgs>();
3434

35+
@Output()
36+
public onBeforeViewDetach = new EventEmitter<IViewChangeEventArgs>();
37+
3538
constructor(public _viewContainerRef: ViewContainerRef, private _zone: NgZone, public cdr: ChangeDetectorRef) {
3639
}
3740

@@ -65,6 +68,7 @@ export class IgxTemplateOutletDirective implements OnChanges {
6568
private _recreateView() {
6669
// detach old and create new
6770
if (this._viewRef) {
71+
this.onBeforeViewDetach.emit({ owner: this, view: this._viewRef, context: this.igxTemplateOutletContext });
6872
this._viewContainerRef.detach(this._viewContainerRef.indexOf(this._viewRef));
6973
}
7074
if (this.igxTemplateOutlet) {
@@ -91,9 +95,11 @@ export class IgxTemplateOutletDirective implements OnChanges {
9195
if (view !== this._viewRef) {
9296
if (owner._viewContainerRef.indexOf(view) !== -1) {
9397
// detach in case view it is attached somewhere else at the moment.
98+
this.onBeforeViewDetach.emit({ owner: this, view: this._viewRef, context: this.igxTemplateOutletContext });
9499
owner._viewContainerRef.detach(owner._viewContainerRef.indexOf(view));
95100
}
96101
if (this._viewRef && this._viewContainerRef.indexOf(this._viewRef) !== -1) {
102+
this.onBeforeViewDetach.emit({ owner: this, view: this._viewRef, context: this.igxTemplateOutletContext });
97103
this._viewContainerRef.detach(this._viewContainerRef.indexOf(this._viewRef));
98104
}
99105
this._viewRef = view;
@@ -111,6 +117,7 @@ export class IgxTemplateOutletDirective implements OnChanges {
111117
// if view exists, but template has been changed and there is a view in the cache with the related template
112118
// then detach old view and insert the stored one with the matching template
113119
// after that update its context.
120+
this.onBeforeViewDetach.emit({ owner: this, view: this._viewRef, context: this.igxTemplateOutletContext });
114121
this._viewContainerRef.detach(this._viewContainerRef.indexOf(this._viewRef));
115122
this._viewRef = cachedView;
116123
const oldContext = this._cloneContext(cachedView.context);

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6040,6 +6040,20 @@ export abstract class IgxGridBaseComponent extends DisplayDensityBase implements
60406040
return this.cellSelection !== GridSelectionMode.none;
60416041
}
60426042

6043+
/** @hidden */
6044+
public viewDetachHandler(args: ICachedViewLoadedEventArgs) {
6045+
const context = args.view.context;
6046+
if (context['templateID'] === 'dataRow') {
6047+
// some browsers (like FireFox and Edge) do not trigger onBlur when the focused element is detached from DOM
6048+
// hence we need to trigger it manually when cell is detached.
6049+
const row = this.getRowByIndex(context.index);
6050+
const focusedCell = row.cells.find(x => x.focused);
6051+
if (focusedCell) {
6052+
focusedCell.onBlur();
6053+
}
6054+
}
6055+
}
6056+
60436057
/**
60446058
* @hidden
60456059
*/

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,8 @@
131131
<ng-template
132132
[igxTemplateOutlet]='isGroupByRecord(rowData) ? group_template : isSummaryRow(rowData) ? summary_template : record_template'
133133
[igxTemplateOutletContext]='getContext(rowData, rowIndex)'
134-
(onCachedViewLoaded)='cachedViewLoaded($event)'>
134+
(onCachedViewLoaded)='cachedViewLoaded($event)'
135+
(onBeforeViewDetach)='viewDetachHandler($event)' >
135136
</ng-template>
136137
</ng-template>
137138
<ng-container *ngTemplateOutlet="template"></ng-container>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@
9393
<ng-template
9494
[igxTemplateOutlet]='(isHierarchicalRecord(rowData) ? hierarchical_record_template : (isChildGridRecord(rowData) && isExpanded(rowData) ? child_record_template : hierarchical_record_template))'
9595
[igxTemplateOutletContext]='getContext(rowData)' (onViewCreated)='viewCreatedHandler($event)'
96-
(onViewMoved)='viewMovedHandler($event)' (onCachedViewLoaded)='cachedViewLoaded($event)'></ng-template>
96+
(onViewMoved)='viewMovedHandler($event)' (onCachedViewLoaded)='cachedViewLoaded($event)' (onBeforeViewDetach)='viewDetachHandler($event)'></ng-template>
9797
<!-- <ng-container *igxTemplateOutlet="(isHierarchicalRecord(rowData) ? hierarchical_record_template : (isChildGridRecord(rowData) && isExpanded(rowData) ? child_record_template : hierarchical_record_template)); context: getContext(rowData)"></ng-container> -->
9898
</ng-template>
9999
<ng-template #hierarchical_record_template let-rowIndex="index" let-rowData>

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,8 @@
9595

9696
<ng-template [igxTemplateOutlet]='isSummaryRow(rowData) ? summary_template : record_template'
9797
[igxTemplateOutletContext]='getContext(rowData, rowIndex)'
98-
(onCachedViewLoaded)='cachedViewLoaded($event)'>
98+
(onCachedViewLoaded)='cachedViewLoaded($event)'
99+
(onBeforeViewDetach)='viewDetachHandler($event)'>
99100
</ng-template>
100101
</ng-template>
101102
<ng-container *ngTemplateOutlet="template"></ng-container>

0 commit comments

Comments
 (0)