@@ -12,6 +12,8 @@ import {
1212 IgcPaginatorComponent ,
1313 IgcGridStateComponent ,
1414 IgcColumnLayoutComponent ,
15+ IgcActionStripComponent ,
16+ IgcGridEditingActionsComponent ,
1517} from './components' ;
1618import { defineComponents } from '../utils/register' ;
1719
@@ -27,6 +29,8 @@ describe('Elements: ', () => {
2729 IgcColumnLayoutComponent ,
2830 IgcPaginatorComponent ,
2931 IgcGridStateComponent ,
32+ IgcActionStripComponent ,
33+ IgcGridEditingActionsComponent
3034 ) ;
3135 } ) ;
3236
@@ -230,5 +234,66 @@ describe('Elements: ', () => {
230234 expect ( grid . columns . length ) . toEqual ( 6 ) ;
231235 expect ( grid . getColumnByVisibleIndex ( 1 ) . field ) . toEqual ( 'ProductName' ) ;
232236 } ) ;
237+
238+ it ( 'should not destroy action strip when row it is shown in is destroyed or cached.' , async ( ) => {
239+ const innerHtml = `
240+ <igc-grid id="testGrid" auto-generate>
241+ <igc-action-strip id="testStrip">
242+ <igc-grid-editing-actions add-row="true"></igc-grid-editing-actions>
243+ </igc-action-strip>
244+ </igc-grid>` ;
245+ testContainer . innerHTML = innerHtml ;
246+
247+ // TODO: Better way to wait - potentially expose the queue or observable for update on the strategy
248+ await firstValueFrom ( timer ( 10 /* SCHEDULE_DELAY */ * 3 ) ) ;
249+
250+ const grid = document . querySelector < IgcNgElement & InstanceType < typeof IgcGridComponent > > ( '#testGrid' ) ;
251+ const actionStrip = document . querySelector < IgcNgElement & InstanceType < typeof IgcActionStripComponent > > ( '#testStrip' ) ;
252+ grid . data = SampleTestData . foodProductData ( ) ;
253+
254+ // TODO: Better way to wait - potentially expose the queue or observable for update on the strategy
255+ await firstValueFrom ( timer ( 10 /* SCHEDULE_DELAY */ * 3 ) ) ;
256+
257+ let row = grid . dataRowList . toArray ( ) [ 0 ] ;
258+ actionStrip . show ( row ) ;
259+ await firstValueFrom ( timer ( 10 /* SCHEDULE_DELAY */ * 3 ) ) ;
260+
261+ expect ( actionStrip . hidden ) . toBeFalse ( ) ;
262+
263+ grid . data = [ ] ;
264+ await firstValueFrom ( timer ( 10 /* SCHEDULE_DELAY */ * 3 ) ) ;
265+
266+ // row destroyed
267+ expect ( ( row . cdr as any ) . destroyed ) . toBeTrue ( ) ;
268+ // action strip still in DOM, only hidden.
269+ expect ( actionStrip . hidden ) . toBeTrue ( ) ;
270+ expect ( actionStrip . isConnected ) . toBeTrue ( ) ;
271+
272+ grid . data = SampleTestData . foodProductData ( ) ;
273+ grid . groupBy ( { fieldName : 'InStock' , dir : 1 , ignoreCase : false } ) ;
274+
275+ // TODO: Better way to wait - potentially expose the queue or observable for update on the strategy
276+ await firstValueFrom ( timer ( 10 /* SCHEDULE_DELAY */ * 3 ) ) ;
277+
278+ row = grid . dataRowList . toArray ( ) [ 0 ] ;
279+ actionStrip . show ( row ) ;
280+ await firstValueFrom ( timer ( 10 /* SCHEDULE_DELAY */ * 3 ) ) ;
281+
282+ expect ( actionStrip . hidden ) . toBeFalse ( ) ;
283+
284+ // collapse all data rows, leave only groups
285+ grid . toggleAllGroupRows ( ) ;
286+
287+ // TODO: Better way to wait - potentially expose the queue or observable for update on the strategy
288+ await firstValueFrom ( timer ( 10 /* SCHEDULE_DELAY */ * 3 ) ) ;
289+
290+ // row not destroyed, but also not in dom anymore
291+ expect ( ( row . cdr as any ) . destroyed ) . toBeFalse ( ) ;
292+ expect ( row . element . nativeElement . isConnected ) . toBe ( false ) ;
293+
294+ // action strip still in DOM, only hidden.
295+ expect ( actionStrip . hidden ) . toBeTrue ( ) ;
296+ expect ( actionStrip . isConnected ) . toBeTrue ( ) ;
297+ } ) ;
233298 } ) ;
234299} ) ;
0 commit comments