@skyux/ag-grid 15.0.0-alpha.2 → 15.0.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,17 @@
1
1
  /**
2
2
  * Additional styles based on https://github.com/ag-grid/ag-grid/blob/b32.0.2/community-modules/styles/src/internal/themes/quartz/_index.scss
3
3
  */
4
+ .ag-theme-sky-data-grid-default,
5
+ .ag-theme-sky-data-entry-grid-default,
6
+ .ag-theme-sky-data-grid-modern-light,
7
+ .ag-theme-sky-data-entry-grid-modern-light,
8
+ .ag-theme-sky-data-grid-modern-light-compact,
9
+ .ag-theme-sky-data-entry-grid-modern-light-compact {
10
+ --sky-ag-grid-header-row-border-width: var(
11
+ --sky-override-ag-grid-row-border-width,
12
+ var(--sky-border-width-separator-row)
13
+ );
14
+ }
4
15
  .ag-theme-sky-data-grid-default .ag-root-wrapper .ag-root input[class^=ag-]:not([type]),
5
16
  .ag-theme-sky-data-grid-default .ag-root-wrapper .ag-root input[class^=ag-][type=text],
6
17
  .ag-theme-sky-data-grid-default .ag-root-wrapper .ag-root input[class^=ag-][type=number],
@@ -43,17 +54,8 @@
43
54
  .ag-theme-sky-data-entry-grid-modern-light-compact .ag-root-wrapper .ag-root input[class^=ag-][type=date],
44
55
  .ag-theme-sky-data-entry-grid-modern-light-compact .ag-root-wrapper .ag-root input[class^=ag-][type=datetime-local],
45
56
  .ag-theme-sky-data-entry-grid-modern-light-compact .ag-root-wrapper .ag-root textarea[class^=ag-] {
46
- min-height: calc(var(--ag-grid-size) * 4);
47
57
  border-radius: var(--ag-border-radius);
48
58
  }
49
- .ag-theme-sky-data-grid-default .ag-root-wrapper .ag-root .ag-picker-field-wrapper,
50
- .ag-theme-sky-data-entry-grid-default .ag-root-wrapper .ag-root .ag-picker-field-wrapper,
51
- .ag-theme-sky-data-grid-modern-light .ag-root-wrapper .ag-root .ag-picker-field-wrapper,
52
- .ag-theme-sky-data-entry-grid-modern-light .ag-root-wrapper .ag-root .ag-picker-field-wrapper,
53
- .ag-theme-sky-data-grid-modern-light-compact .ag-root-wrapper .ag-root .ag-picker-field-wrapper,
54
- .ag-theme-sky-data-entry-grid-modern-light-compact .ag-root-wrapper .ag-root .ag-picker-field-wrapper {
55
- min-height: calc(var(--ag-grid-size) * 4);
56
- }
57
59
  .ag-theme-sky-data-grid-default .ag-root-wrapper .ag-root .ag-floating-filter-body .ag-wrapper.ag-input-wrapper input,
58
60
  .ag-theme-sky-data-entry-grid-default .ag-root-wrapper .ag-root .ag-floating-filter-body .ag-wrapper.ag-input-wrapper input,
59
61
  .ag-theme-sky-data-grid-modern-light .ag-root-wrapper .ag-root .ag-floating-filter-body .ag-wrapper.ag-input-wrapper input,
@@ -145,14 +147,6 @@
145
147
  .ag-theme-sky-data-entry-grid-modern-light-compact .ag-root-wrapper .ag-root .ag-text-field-input[disabled] {
146
148
  cursor: not-allowed;
147
149
  }
148
- .ag-theme-sky-data-grid-default .ag-root-wrapper .ag-root .ag-checkbox-input-wrapper.ag-checked.ag-disabled,
149
- .ag-theme-sky-data-entry-grid-default .ag-root-wrapper .ag-root .ag-checkbox-input-wrapper.ag-checked.ag-disabled,
150
- .ag-theme-sky-data-grid-modern-light .ag-root-wrapper .ag-root .ag-checkbox-input-wrapper.ag-checked.ag-disabled,
151
- .ag-theme-sky-data-entry-grid-modern-light .ag-root-wrapper .ag-root .ag-checkbox-input-wrapper.ag-checked.ag-disabled,
152
- .ag-theme-sky-data-grid-modern-light-compact .ag-root-wrapper .ag-root .ag-checkbox-input-wrapper.ag-checked.ag-disabled,
153
- .ag-theme-sky-data-entry-grid-modern-light-compact .ag-root-wrapper .ag-root .ag-checkbox-input-wrapper.ag-checked.ag-disabled {
154
- --ag-checkbox-checked-color: var(--ag-checkbox-unchecked-color);
155
- }
156
150
  .ag-theme-sky-data-grid-default .ag-root-wrapper .ag-root .ag-checkbox-input,
157
151
  .ag-theme-sky-data-grid-default .ag-root-wrapper .ag-root .ag-toggle-button-input,
158
152
  .ag-theme-sky-data-grid-default .ag-root-wrapper .ag-root .ag-radio-button-input,
@@ -210,59 +204,67 @@
210
204
  .ag-theme-sky-data-entry-grid-modern-light-compact .ag-header-cell-sortable .ag-header-cell-label {
211
205
  cursor: initial;
212
206
  }
213
- .ag-theme-sky-data-grid-default .ag-header-row.ag-header-row-filter > .ag-header-cell.ag-floating-filter,
214
- .ag-theme-sky-data-entry-grid-default .ag-header-row.ag-header-row-filter > .ag-header-cell.ag-floating-filter,
215
- .ag-theme-sky-data-grid-modern-light .ag-header-row.ag-header-row-filter > .ag-header-cell.ag-floating-filter,
216
- .ag-theme-sky-data-entry-grid-modern-light .ag-header-row.ag-header-row-filter > .ag-header-cell.ag-floating-filter,
217
- .ag-theme-sky-data-grid-modern-light-compact .ag-header-row.ag-header-row-filter > .ag-header-cell.ag-floating-filter,
218
- .ag-theme-sky-data-entry-grid-modern-light-compact .ag-header-row.ag-header-row-filter > .ag-header-cell.ag-floating-filter {
207
+ .ag-theme-sky-data-grid-default .ag-header-row.ag-header-row-filter .ag-header-cell.ag-floating-filter,
208
+ .ag-theme-sky-data-entry-grid-default .ag-header-row.ag-header-row-filter .ag-header-cell.ag-floating-filter,
209
+ .ag-theme-sky-data-grid-modern-light .ag-header-row.ag-header-row-filter .ag-header-cell.ag-floating-filter,
210
+ .ag-theme-sky-data-entry-grid-modern-light .ag-header-row.ag-header-row-filter .ag-header-cell.ag-floating-filter,
211
+ .ag-theme-sky-data-grid-modern-light-compact .ag-header-row.ag-header-row-filter .ag-header-cell.ag-floating-filter,
212
+ .ag-theme-sky-data-entry-grid-modern-light-compact .ag-header-row.ag-header-row-filter .ag-header-cell.ag-floating-filter {
219
213
  padding-block: 0;
220
214
  padding-inline-start: 0;
221
215
  }
222
- .ag-theme-sky-data-grid-default .ag-header-row.ag-header-row-filter > .ag-header-cell.ag-floating-filter .ag-floating-filter-input > *,
223
- .ag-theme-sky-data-grid-default .ag-header-row.ag-header-row-filter > .ag-header-cell.ag-floating-filter .ag-date-floating-filter-wrapper,
224
- .ag-theme-sky-data-entry-grid-default .ag-header-row.ag-header-row-filter > .ag-header-cell.ag-floating-filter .ag-floating-filter-input > *,
225
- .ag-theme-sky-data-entry-grid-default .ag-header-row.ag-header-row-filter > .ag-header-cell.ag-floating-filter .ag-date-floating-filter-wrapper,
226
- .ag-theme-sky-data-grid-modern-light .ag-header-row.ag-header-row-filter > .ag-header-cell.ag-floating-filter .ag-floating-filter-input > *,
227
- .ag-theme-sky-data-grid-modern-light .ag-header-row.ag-header-row-filter > .ag-header-cell.ag-floating-filter .ag-date-floating-filter-wrapper,
228
- .ag-theme-sky-data-entry-grid-modern-light .ag-header-row.ag-header-row-filter > .ag-header-cell.ag-floating-filter .ag-floating-filter-input > *,
229
- .ag-theme-sky-data-entry-grid-modern-light .ag-header-row.ag-header-row-filter > .ag-header-cell.ag-floating-filter .ag-date-floating-filter-wrapper,
230
- .ag-theme-sky-data-grid-modern-light-compact .ag-header-row.ag-header-row-filter > .ag-header-cell.ag-floating-filter .ag-floating-filter-input > *,
231
- .ag-theme-sky-data-grid-modern-light-compact .ag-header-row.ag-header-row-filter > .ag-header-cell.ag-floating-filter .ag-date-floating-filter-wrapper,
232
- .ag-theme-sky-data-entry-grid-modern-light-compact .ag-header-row.ag-header-row-filter > .ag-header-cell.ag-floating-filter .ag-floating-filter-input > *,
233
- .ag-theme-sky-data-entry-grid-modern-light-compact .ag-header-row.ag-header-row-filter > .ag-header-cell.ag-floating-filter .ag-date-floating-filter-wrapper {
216
+ .ag-theme-sky-data-grid-default .ag-header-row.ag-header-row-filter .ag-header-cell.ag-floating-filter .ag-floating-filter-input > *,
217
+ .ag-theme-sky-data-grid-default .ag-header-row.ag-header-row-filter .ag-header-cell.ag-floating-filter .ag-date-floating-filter-wrapper,
218
+ .ag-theme-sky-data-entry-grid-default .ag-header-row.ag-header-row-filter .ag-header-cell.ag-floating-filter .ag-floating-filter-input > *,
219
+ .ag-theme-sky-data-entry-grid-default .ag-header-row.ag-header-row-filter .ag-header-cell.ag-floating-filter .ag-date-floating-filter-wrapper,
220
+ .ag-theme-sky-data-grid-modern-light .ag-header-row.ag-header-row-filter .ag-header-cell.ag-floating-filter .ag-floating-filter-input > *,
221
+ .ag-theme-sky-data-grid-modern-light .ag-header-row.ag-header-row-filter .ag-header-cell.ag-floating-filter .ag-date-floating-filter-wrapper,
222
+ .ag-theme-sky-data-entry-grid-modern-light .ag-header-row.ag-header-row-filter .ag-header-cell.ag-floating-filter .ag-floating-filter-input > *,
223
+ .ag-theme-sky-data-entry-grid-modern-light .ag-header-row.ag-header-row-filter .ag-header-cell.ag-floating-filter .ag-date-floating-filter-wrapper,
224
+ .ag-theme-sky-data-grid-modern-light-compact .ag-header-row.ag-header-row-filter .ag-header-cell.ag-floating-filter .ag-floating-filter-input > *,
225
+ .ag-theme-sky-data-grid-modern-light-compact .ag-header-row.ag-header-row-filter .ag-header-cell.ag-floating-filter .ag-date-floating-filter-wrapper,
226
+ .ag-theme-sky-data-entry-grid-modern-light-compact .ag-header-row.ag-header-row-filter .ag-header-cell.ag-floating-filter .ag-floating-filter-input > *,
227
+ .ag-theme-sky-data-entry-grid-modern-light-compact .ag-header-row.ag-header-row-filter .ag-header-cell.ag-floating-filter .ag-date-floating-filter-wrapper {
234
228
  height: 100%;
235
229
  }
236
- .ag-theme-sky-data-grid-default .ag-header-row.ag-header-row-filter > .ag-header-cell.ag-floating-filter .ag-floating-filter-input > * .ag-input-field-input,
237
- .ag-theme-sky-data-grid-default .ag-header-row.ag-header-row-filter > .ag-header-cell.ag-floating-filter .ag-date-floating-filter-wrapper .ag-input-field-input,
238
- .ag-theme-sky-data-entry-grid-default .ag-header-row.ag-header-row-filter > .ag-header-cell.ag-floating-filter .ag-floating-filter-input > * .ag-input-field-input,
239
- .ag-theme-sky-data-entry-grid-default .ag-header-row.ag-header-row-filter > .ag-header-cell.ag-floating-filter .ag-date-floating-filter-wrapper .ag-input-field-input,
240
- .ag-theme-sky-data-grid-modern-light .ag-header-row.ag-header-row-filter > .ag-header-cell.ag-floating-filter .ag-floating-filter-input > * .ag-input-field-input,
241
- .ag-theme-sky-data-grid-modern-light .ag-header-row.ag-header-row-filter > .ag-header-cell.ag-floating-filter .ag-date-floating-filter-wrapper .ag-input-field-input,
242
- .ag-theme-sky-data-entry-grid-modern-light .ag-header-row.ag-header-row-filter > .ag-header-cell.ag-floating-filter .ag-floating-filter-input > * .ag-input-field-input,
243
- .ag-theme-sky-data-entry-grid-modern-light .ag-header-row.ag-header-row-filter > .ag-header-cell.ag-floating-filter .ag-date-floating-filter-wrapper .ag-input-field-input,
244
- .ag-theme-sky-data-grid-modern-light-compact .ag-header-row.ag-header-row-filter > .ag-header-cell.ag-floating-filter .ag-floating-filter-input > * .ag-input-field-input,
245
- .ag-theme-sky-data-grid-modern-light-compact .ag-header-row.ag-header-row-filter > .ag-header-cell.ag-floating-filter .ag-date-floating-filter-wrapper .ag-input-field-input,
246
- .ag-theme-sky-data-entry-grid-modern-light-compact .ag-header-row.ag-header-row-filter > .ag-header-cell.ag-floating-filter .ag-floating-filter-input > * .ag-input-field-input,
247
- .ag-theme-sky-data-entry-grid-modern-light-compact .ag-header-row.ag-header-row-filter > .ag-header-cell.ag-floating-filter .ag-date-floating-filter-wrapper .ag-input-field-input {
230
+ .ag-theme-sky-data-grid-default .ag-header-row.ag-header-row-filter .ag-header-cell.ag-floating-filter .ag-floating-filter-input > * .ag-input-field-input,
231
+ .ag-theme-sky-data-grid-default .ag-header-row.ag-header-row-filter .ag-header-cell.ag-floating-filter .ag-date-floating-filter-wrapper .ag-input-field-input,
232
+ .ag-theme-sky-data-entry-grid-default .ag-header-row.ag-header-row-filter .ag-header-cell.ag-floating-filter .ag-floating-filter-input > * .ag-input-field-input,
233
+ .ag-theme-sky-data-entry-grid-default .ag-header-row.ag-header-row-filter .ag-header-cell.ag-floating-filter .ag-date-floating-filter-wrapper .ag-input-field-input,
234
+ .ag-theme-sky-data-grid-modern-light .ag-header-row.ag-header-row-filter .ag-header-cell.ag-floating-filter .ag-floating-filter-input > * .ag-input-field-input,
235
+ .ag-theme-sky-data-grid-modern-light .ag-header-row.ag-header-row-filter .ag-header-cell.ag-floating-filter .ag-date-floating-filter-wrapper .ag-input-field-input,
236
+ .ag-theme-sky-data-entry-grid-modern-light .ag-header-row.ag-header-row-filter .ag-header-cell.ag-floating-filter .ag-floating-filter-input > * .ag-input-field-input,
237
+ .ag-theme-sky-data-entry-grid-modern-light .ag-header-row.ag-header-row-filter .ag-header-cell.ag-floating-filter .ag-date-floating-filter-wrapper .ag-input-field-input,
238
+ .ag-theme-sky-data-grid-modern-light-compact .ag-header-row.ag-header-row-filter .ag-header-cell.ag-floating-filter .ag-floating-filter-input > * .ag-input-field-input,
239
+ .ag-theme-sky-data-grid-modern-light-compact .ag-header-row.ag-header-row-filter .ag-header-cell.ag-floating-filter .ag-date-floating-filter-wrapper .ag-input-field-input,
240
+ .ag-theme-sky-data-entry-grid-modern-light-compact .ag-header-row.ag-header-row-filter .ag-header-cell.ag-floating-filter .ag-floating-filter-input > * .ag-input-field-input,
241
+ .ag-theme-sky-data-entry-grid-modern-light-compact .ag-header-row.ag-header-row-filter .ag-header-cell.ag-floating-filter .ag-date-floating-filter-wrapper .ag-input-field-input {
248
242
  appearance: none;
249
243
  border-radius: 0;
250
244
  height: calc(var(--ag-header-height) - 2px);
251
245
  }
252
- .ag-theme-sky-data-grid-default .ag-layout-auto-height .ag-body .ag-center-cols-container,
253
- .ag-theme-sky-data-grid-default .ag-layout-auto-height .ag-body .ag-center-cols-viewport,
254
- .ag-theme-sky-data-entry-grid-default .ag-layout-auto-height .ag-body .ag-center-cols-container,
255
- .ag-theme-sky-data-entry-grid-default .ag-layout-auto-height .ag-body .ag-center-cols-viewport,
256
- .ag-theme-sky-data-grid-modern-light .ag-layout-auto-height .ag-body .ag-center-cols-container,
257
- .ag-theme-sky-data-grid-modern-light .ag-layout-auto-height .ag-body .ag-center-cols-viewport,
258
- .ag-theme-sky-data-entry-grid-modern-light .ag-layout-auto-height .ag-body .ag-center-cols-container,
259
- .ag-theme-sky-data-entry-grid-modern-light .ag-layout-auto-height .ag-body .ag-center-cols-viewport,
260
- .ag-theme-sky-data-grid-modern-light-compact .ag-layout-auto-height .ag-body .ag-center-cols-container,
261
- .ag-theme-sky-data-grid-modern-light-compact .ag-layout-auto-height .ag-body .ag-center-cols-viewport,
262
- .ag-theme-sky-data-entry-grid-modern-light-compact .ag-layout-auto-height .ag-body .ag-center-cols-container,
263
- .ag-theme-sky-data-entry-grid-modern-light-compact .ag-layout-auto-height .ag-body .ag-center-cols-viewport {
246
+ .ag-theme-sky-data-grid-default .ag-layout-auto-height .ag-grid-scrolling-rows,
247
+ .ag-theme-sky-data-entry-grid-default .ag-layout-auto-height .ag-grid-scrolling-rows,
248
+ .ag-theme-sky-data-grid-modern-light .ag-layout-auto-height .ag-grid-scrolling-rows,
249
+ .ag-theme-sky-data-entry-grid-modern-light .ag-layout-auto-height .ag-grid-scrolling-rows,
250
+ .ag-theme-sky-data-grid-modern-light-compact .ag-layout-auto-height .ag-grid-scrolling-rows,
251
+ .ag-theme-sky-data-entry-grid-modern-light-compact .ag-layout-auto-height .ag-grid-scrolling-rows {
264
252
  min-height: var(--sky-ag-grid-min-height, 50px);
265
253
  }
254
+ .ag-theme-sky-data-grid-default .ag-layout-auto-height .ag-body-vertical-scroll,
255
+ .ag-theme-sky-data-grid-default .ag-layout-auto-height .ag-body-horizontal-scroll-end-spacer,
256
+ .ag-theme-sky-data-entry-grid-default .ag-layout-auto-height .ag-body-vertical-scroll,
257
+ .ag-theme-sky-data-entry-grid-default .ag-layout-auto-height .ag-body-horizontal-scroll-end-spacer,
258
+ .ag-theme-sky-data-grid-modern-light .ag-layout-auto-height .ag-body-vertical-scroll,
259
+ .ag-theme-sky-data-grid-modern-light .ag-layout-auto-height .ag-body-horizontal-scroll-end-spacer,
260
+ .ag-theme-sky-data-entry-grid-modern-light .ag-layout-auto-height .ag-body-vertical-scroll,
261
+ .ag-theme-sky-data-entry-grid-modern-light .ag-layout-auto-height .ag-body-horizontal-scroll-end-spacer,
262
+ .ag-theme-sky-data-grid-modern-light-compact .ag-layout-auto-height .ag-body-vertical-scroll,
263
+ .ag-theme-sky-data-grid-modern-light-compact .ag-layout-auto-height .ag-body-horizontal-scroll-end-spacer,
264
+ .ag-theme-sky-data-entry-grid-modern-light-compact .ag-layout-auto-height .ag-body-vertical-scroll,
265
+ .ag-theme-sky-data-entry-grid-modern-light-compact .ag-layout-auto-height .ag-body-horizontal-scroll-end-spacer {
266
+ display: none;
267
+ }
266
268
  .ag-theme-sky-data-grid-default .ag-scrollbar-invisible.sky-viewkeeper-fixed,
267
269
  .ag-theme-sky-data-entry-grid-default .ag-scrollbar-invisible.sky-viewkeeper-fixed,
268
270
  .ag-theme-sky-data-grid-modern-light .ag-scrollbar-invisible.sky-viewkeeper-fixed,
@@ -271,12 +273,12 @@
271
273
  .ag-theme-sky-data-entry-grid-modern-light-compact .ag-scrollbar-invisible.sky-viewkeeper-fixed {
272
274
  box-shadow: none;
273
275
  }
274
- .ag-theme-sky-data-grid-default .ag-sticky-bottom,
275
- .ag-theme-sky-data-entry-grid-default .ag-sticky-bottom,
276
- .ag-theme-sky-data-grid-modern-light .ag-sticky-bottom,
277
- .ag-theme-sky-data-entry-grid-modern-light .ag-sticky-bottom,
278
- .ag-theme-sky-data-grid-modern-light-compact .ag-sticky-bottom,
279
- .ag-theme-sky-data-entry-grid-modern-light-compact .ag-sticky-bottom {
276
+ .ag-theme-sky-data-grid-default .ag-grid-sticky-bottom-rows-container,
277
+ .ag-theme-sky-data-entry-grid-default .ag-grid-sticky-bottom-rows-container,
278
+ .ag-theme-sky-data-grid-modern-light .ag-grid-sticky-bottom-rows-container,
279
+ .ag-theme-sky-data-entry-grid-modern-light .ag-grid-sticky-bottom-rows-container,
280
+ .ag-theme-sky-data-grid-modern-light-compact .ag-grid-sticky-bottom-rows-container,
281
+ .ag-theme-sky-data-entry-grid-modern-light-compact .ag-grid-sticky-bottom-rows-container {
280
282
  background-color: transparent;
281
283
  border-color: transparent;
282
284
  }
@@ -427,7 +429,6 @@
427
429
  .ag-theme-sky-data-grid-default:not(:has(:focus-visible)),
428
430
  .ag-theme-sky-data-grid-modern-light:not(:has(:focus-visible)),
429
431
  .ag-theme-sky-data-grid-modern-light-compact:not(:has(:focus-visible)) {
430
- --ag-input-focus-border-color: transparent;
431
432
  --ag-range-selection-border-color: transparent;
432
433
  }
433
434
  .ag-theme-sky-data-grid-default .ag-overlay-no-rows-wrapper.ag-layout-auto-height,
@@ -442,12 +443,19 @@
442
443
  --sky-comp-override-list-header-background-color,
443
444
  var(--sky-background-color-page-default)
444
445
  );
445
- --ag-header-column-separator-color: var(--sky-background-color-page-default);
446
446
  }
447
447
 
448
- .ag-theme-sky-data-entry-grid-default .ag-center-cols-viewport,
449
- .ag-theme-sky-data-entry-grid-modern-light .ag-center-cols-viewport,
450
- .ag-theme-sky-data-entry-grid-modern-light-compact .ag-center-cols-viewport {
448
+ .ag-theme-sky-data-entry-grid-default,
449
+ .ag-theme-sky-data-entry-grid-modern-light,
450
+ .ag-theme-sky-data-entry-grid-modern-light-compact {
451
+ --sky-ag-grid-header-row-border-width: var(
452
+ --sky-override-ag-grid-row-border-width,
453
+ var(--sky-border-width-emphasized)
454
+ );
455
+ }
456
+ .ag-theme-sky-data-entry-grid-default .ag-grid-scrolling-rows,
457
+ .ag-theme-sky-data-entry-grid-modern-light .ag-grid-scrolling-rows,
458
+ .ag-theme-sky-data-entry-grid-modern-light-compact .ag-grid-scrolling-rows {
451
459
  border-bottom: var(--ag-row-border);
452
460
  }
453
461
  .ag-theme-sky-data-entry-grid-default .ag-row .ag-cell.ag-cell-focus,
@@ -528,13 +536,31 @@
528
536
  padding-bottom: 0;
529
537
  }
530
538
 
531
- .sky-ag-grid.sky-ag-grid-top-scrollbar .ag-root .ag-body-horizontal-scroll.ag-scrollbar-invisible {
532
- /* Value is overridden in SkyAgGridWrapperComponent to match the calculated value AG Grid uses. */
533
- --sky-ag-body-horizontal-scroll-width: 15px;
534
- position: relative;
535
- z-index: 1;
536
- bottom: revert;
537
- margin-bottom: calc(var(--sky-ag-body-horizontal-scroll-width) * -1);
539
+ .sky-ag-grid.sky-ag-grid-top-scrollbar .ag-root:not(.ag-details-row *) .ag-body-horizontal-scroll {
540
+ position: absolute;
541
+ left: 0;
542
+ right: 0;
543
+ top: calc(var(--sky-ag-grid-header-rows-height, 0px) - var(--sky-ag-grid-top-scroll-height, 0px));
544
+ bottom: auto;
545
+ z-index: 2;
546
+ }
547
+ .sky-ag-grid.sky-ag-grid-top-scrollbar .ag-root:not(.ag-details-row *) .ag-body-horizontal-scroll:not(.ag-scrollbar-invisible) {
548
+ background-color: var(--ag-background-color);
549
+ box-shadow: 0 calc(-1 * var(--sky-ag-grid-header-row-border-width)) 0 0 var(--sky-override-ag-grid-border-color, var(--sky-color-border-separator-row));
550
+ }
551
+
552
+ .sky-ag-grid .ag-header-cell,
553
+ .sky-ag-grid .ag-header-group-cell {
554
+ border-top-width: var(--sky-ag-grid-header-row-border-width);
555
+ }
556
+ .sky-ag-grid .ag-header {
557
+ border-bottom-width: var(--sky-ag-grid-header-row-border-width);
558
+ }
559
+ .sky-ag-grid .ag-body-vertical-scroll-start-spacer {
560
+ border-bottom-width: var(--sky-ag-grid-header-row-border-width);
561
+ }
562
+ .sky-ag-grid .ag-details-row {
563
+ --sky-ag-grid-top-scroll-height: 0px;
538
564
  }
539
565
 
540
566
  ag-grid-angular .ag-root-wrapper {
@@ -1,9 +1,60 @@
1
1
  import { UnitTestElement } from '@angular/cdk/testing/testbed';
2
2
  import { SkyComponentHarness } from '@skyux/core/testing';
3
3
  import { getGridApi } from 'ag-grid-community';
4
+ import { SkyAgGridService } from '@skyux/ag-grid';
5
+ import * as i0 from '@angular/core';
6
+ import { inject, DestroyRef, Injectable } from '@angular/core';
7
+
8
+ const renderStates = new WeakMap();
9
+ /**
10
+ * @internal
11
+ * Records that AG Grid finished a row-model render pass for the given grid
12
+ * (initial load, sort, filter, or pagination all trigger `modelUpdated`).
13
+ */
14
+ function trackModelUpdate(api) {
15
+ const previous = renderStates.get(api);
16
+ renderStates.set(api, {
17
+ count: (previous?.count ?? 0) + 1,
18
+ lastRenderedAt: Date.now(),
19
+ });
20
+ }
21
+ /**
22
+ * @internal
23
+ * The number of `modelUpdated` render passes recorded for the given grid.
24
+ */
25
+ function getRenderCount(api) {
26
+ return renderStates.get(api)?.count ?? 0;
27
+ }
28
+ /**
29
+ * @internal
30
+ * Milliseconds since the last recorded render pass, or `Infinity` if none
31
+ * has been recorded yet. A grid that loads data asynchronously (e.g. an
32
+ * Angular `resource()`) can render an empty pass before its real data
33
+ * arrives, each firing its own `modelUpdated` - this lets callers wait for
34
+ * the render count to stop moving, not just for it to move once.
35
+ */
36
+ function getMsSinceLastRender(api) {
37
+ const state = renderStates.get(api);
38
+ return state ? Date.now() - state.lastRenderedAt : Infinity;
39
+ }
40
+ /**
41
+ * @internal
42
+ * Whether AG Grid is currently opted out of Angular's test zone (i.e.
43
+ * `provideSkyAgGridTesting()` is active), meaning render counts are actually
44
+ * being recorded and it's safe to wait on them. Consumers of
45
+ * `SkyAgGridWrapperHarness` that don't use `provideSkyAgGridTesting()` get no
46
+ * tracking at all, so waiting on a render count that will never move would
47
+ * just burn the full poll timeout on every read.
48
+ */
49
+ function isRenderTrackingActive() {
50
+ return window.AG_GRID_UNDER_TEST === false;
51
+ }
4
52
 
5
53
  /**
6
54
  * Harness for interacting with SKY UX AG Grid components in tests.
55
+ * Add `provideSkyAgGridTesting()` to the spec's providers so the harness
56
+ * can wait for the grid to finish rendering; without it, render-readiness
57
+ * waits are skipped.
7
58
  */
8
59
  class SkyAgGridWrapperHarness extends SkyComponentHarness {
9
60
  /**
@@ -48,8 +99,42 @@ class SkyAgGridWrapperHarness extends SkyComponentHarness {
48
99
  * @internal
49
100
  */
50
101
  async getGridApi() {
51
- await this.waitForTasksOutsideAngular();
52
- const locator = this.locatorFactory.locatorFor('ag-grid-angular');
102
+ const api = await this.#locateGridApi();
103
+ if (isRenderTrackingActive()) {
104
+ await this.#waitForRenderCount(api, (count) => count > 0);
105
+ }
106
+ return api;
107
+ }
108
+ /**
109
+ * @internal
110
+ * The number of `modelUpdated` render passes AG Grid has completed for
111
+ * this grid so far. Callers that need to observe the *next* render (e.g.
112
+ * after triggering a sort) should capture this before acting, then pass it
113
+ * to `waitUntilRendered()`.
114
+ */
115
+ async getRenderCount() {
116
+ return getRenderCount(await this.#locateGridApi());
117
+ }
118
+ /**
119
+ * @internal
120
+ * Waits, on a bounded wall-clock poll, until the grid has completed more
121
+ * than `afterCount` render passes. Defaults to `0`, i.e. "has rendered at
122
+ * least once" - use this instead of `whenStable()`/`waitForTasksOutsideAngular()`,
123
+ * since AG Grid 36 schedules its render work outside the Angular zone.
124
+ */
125
+ async waitUntilRendered(afterCount = 0) {
126
+ if (!isRenderTrackingActive()) {
127
+ return;
128
+ }
129
+ const api = await this.#locateGridApi();
130
+ await this.#waitForRenderCount(api, (count) => count > afterCount);
131
+ }
132
+ async #locateGridApi() {
133
+ // Query the `.ag-root` element rather than `ag-grid-angular` itself, since
134
+ // `skyViewkeeper`'s shadow element is inserted as `ag-grid-angular`'s
135
+ // first child and `getGridApi()` locates the grid by walking up from the
136
+ // queried element's first element child.
137
+ const locator = this.locatorFactory.locatorFor('ag-grid-angular .ag-root');
53
138
  return await locator().then((grid) => {
54
139
  if (grid instanceof UnitTestElement) {
55
140
  const api = getGridApi(grid.element);
@@ -62,11 +147,138 @@ class SkyAgGridWrapperHarness extends SkyComponentHarness {
62
147
  throw new Error('Unable to get GridApi from AgGridAngular component.');
63
148
  });
64
149
  }
150
+ // A grid that loads data asynchronously (e.g. an Angular `resource()`) can
151
+ // render an empty pass before its real data arrives, each firing its own
152
+ // `modelUpdated`. Waiting for the predicate to become true isn't enough -
153
+ // this also waits for the render count to stop moving for `settleMs`, so a
154
+ // read doesn't land on that intermediate empty pass.
155
+ async #waitForRenderCount(api, predicate, timeoutMs = 2000, settleMs = 100) {
156
+ const deadline = Date.now() + timeoutMs;
157
+ while (!predicate(getRenderCount(api)) ||
158
+ getMsSinceLastRender(api) < settleMs) {
159
+ if (Date.now() >= deadline) {
160
+ return;
161
+ }
162
+ await new Promise((resolve) => setTimeout(resolve, 25));
163
+ }
164
+ }
165
+ }
166
+
167
+ /**
168
+ * `GridOptions` applied to every grid built through `SkyAgGridService` while
169
+ * `provideSkyAgGridTesting()` is in effect. AG Grid recommends disabling
170
+ * row/column virtualization in tests so the whole grid is DOM-queryable
171
+ * regardless of a consumer's own layout/scroll settings.
172
+ */
173
+ const SKY_AG_GRID_TESTING_OPTIONS = {
174
+ suppressColumnVirtualisation: true,
175
+ suppressRowVirtualisation: true,
176
+ };
177
+ /**
178
+ * Records every `modelUpdated` render pass so `SkyAgGridWrapperHarness` can
179
+ * poll for a real, non-zone-dependent readiness signal instead of relying on
180
+ * `whenStable()`, which no longer waits for AG Grid once it runs outside the
181
+ * Angular zone (see `provideSkyAgGridTesting()`).
182
+ */
183
+ function withRenderTracking(options) {
184
+ const onModelUpdated = options.onModelUpdated;
185
+ return {
186
+ ...options,
187
+ onModelUpdated: (event) => {
188
+ trackModelUpdate(event.api);
189
+ onModelUpdated?.(event);
190
+ },
191
+ };
192
+ }
193
+ /**
194
+ * Tracks how many live `SkyAgGridTestingService` instances currently want
195
+ * `AG_GRID_UNDER_TEST` forced to `false`, and the value it held before the
196
+ * first of them activated it. `provideSkyAgGridTesting()` can be added to
197
+ * `TestBed.configureTestingModule()`'s providers *and/or* to one or more
198
+ * component `providers` arrays within the same spec, so multiple instances
199
+ * can be alive at once and destroyed in any order - the flag must stay forced
200
+ * while any instance is alive, and the pre-existing value must only be
201
+ * restored once the last one is destroyed.
202
+ */
203
+ let activeInstanceCount = 0;
204
+ let restoreValue;
205
+ /**
206
+ * @internal
207
+ * Configures every grid with disabled row/column virtualization and opts out
208
+ * of AG Grid's Angular test-zone detection. Specs that create and destroy many
209
+ * grids can otherwise see AG Grid's own internal timers and animation frames
210
+ * occasionally leave a `requestAnimationFrame` callback pending indefinitely,
211
+ * which surfaces as a `whenStable()` timeout unrelated to the code under test.
212
+ * Without zone opt-out, AG Grid schedules its internal scroll/viewport work
213
+ * inside the Angular zone under Karma, which can keep the zone from ever
214
+ * reaching stable. The flag is restored to its prior value once the last live
215
+ * instance is destroyed, so specs that don't opt in aren't affected by ones
216
+ * that do.
217
+ *
218
+ * Note: `provideSkyAgGridTesting()` can be added to `TestBed.configureTestingModule()`'s
219
+ * providers *or* to a component's own `providers` array, so this can't rely on
220
+ * an environment-injector-only mechanism (like `ENVIRONMENT_INITIALIZER`) to
221
+ * set/restore the flag — a service constructor works at either injector level,
222
+ * and `DestroyRef` fires correctly for either a TestBed module teardown or a
223
+ * component destroy.
224
+ */
225
+ class SkyAgGridTestingService extends SkyAgGridService {
226
+ constructor() {
227
+ super();
228
+ if (activeInstanceCount === 0) {
229
+ restoreValue = window.AG_GRID_UNDER_TEST;
230
+ }
231
+ activeInstanceCount++;
232
+ window.AG_GRID_UNDER_TEST = false;
233
+ inject(DestroyRef).onDestroy(() => {
234
+ activeInstanceCount--;
235
+ if (activeInstanceCount === 0) {
236
+ window.AG_GRID_UNDER_TEST = restoreValue;
237
+ }
238
+ });
239
+ }
240
+ getGridOptions(args) {
241
+ return withRenderTracking({
242
+ ...super.getGridOptions(args),
243
+ ...SKY_AG_GRID_TESTING_OPTIONS,
244
+ });
245
+ }
246
+ getEditableGridOptions(args) {
247
+ return withRenderTracking({
248
+ ...super.getEditableGridOptions(args),
249
+ ...SKY_AG_GRID_TESTING_OPTIONS,
250
+ });
251
+ }
252
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: SkyAgGridTestingService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
253
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: SkyAgGridTestingService }); }
254
+ }
255
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: SkyAgGridTestingService, decorators: [{
256
+ type: Injectable
257
+ }], ctorParameters: () => [] });
258
+
259
+ /**
260
+ * Configures every grid built through `SkyAgGridService` to disable AG Grid's
261
+ * row/column virtualization and to opt out of AG Grid's Angular test-zone
262
+ * detection while the test is running, so grid work completes without hanging
263
+ * `whenStable()`. The previous test-zone setting is restored when the test's
264
+ * injector is destroyed, so specs that don't opt in aren't affected by ones
265
+ * that do. Add to the spec's `TestBed.configureTestingModule` providers.
266
+ *
267
+ * @example
268
+ * ```typescript
269
+ * TestBed.configureTestingModule({
270
+ * providers: [provideSkyAgGridTesting()],
271
+ * });
272
+ * ```
273
+ * @preview
274
+ */
275
+ function provideSkyAgGridTesting() {
276
+ return [{ provide: SkyAgGridService, useClass: SkyAgGridTestingService }];
65
277
  }
66
278
 
67
279
  /**
68
280
  * Generated bundle index. Do not edit.
69
281
  */
70
282
 
71
- export { SkyAgGridWrapperHarness };
283
+ export { SkyAgGridWrapperHarness, provideSkyAgGridTesting };
72
284
  //# sourceMappingURL=skyux-ag-grid-testing.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"skyux-ag-grid-testing.mjs","sources":["../../../../../libs/components/ag-grid/testing/src/modules/ag-grid-wrapper/ag-grid-wrapper-harness.ts","../../../../../libs/components/ag-grid/testing/src/skyux-ag-grid-testing.ts"],"sourcesContent":["import { HarnessPredicate } from '@angular/cdk/testing';\nimport { UnitTestElement } from '@angular/cdk/testing/testbed';\nimport { SkyComponentHarness } from '@skyux/core/testing';\n\nimport { GridApi, getGridApi } from 'ag-grid-community';\n\nimport { SkyAgGridWrapperHarnessFilters } from './ag-grid-wrapper-harness.filters';\n\n/**\n * Harness for interacting with SKY UX AG Grid components in tests.\n */\nexport class SkyAgGridWrapperHarness extends SkyComponentHarness {\n /**\n * @internal\n */\n public static hostSelector = 'sky-ag-grid-wrapper';\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a\n * `SkyAgGridWrapperHarness` that meets certain criteria\n */\n public static with(\n filters: SkyAgGridWrapperHarnessFilters,\n ): HarnessPredicate<SkyAgGridWrapperHarness> {\n return SkyAgGridWrapperHarness.getDataSkyIdPredicate(filters);\n }\n\n /**\n * Checks whether the grid is ready.\n */\n public async isGridReady(): Promise<boolean> {\n const gridReady = this.locatorFactory.locatorFor(\n '.ag-root.ag-unselectable',\n );\n\n return await gridReady()\n .then((el) => !!el)\n .catch(() => false);\n }\n\n /**\n * Retrieves the IDs of the currently displayed columns.\n */\n public async getDisplayedColumnIds(): Promise<string[]> {\n return await this.getGridApi()\n .then((api) => api.getAllDisplayedColumns().map((col) => col.getColId()))\n .catch(() => Promise.reject('Unable to retrieve displayed column IDs.'));\n }\n\n /**\n * Retrieves the header names of the currently displayed columns.\n */\n public async getDisplayedColumnHeaderNames(): Promise<string[]> {\n return await this.getGridApi()\n .then((api) =>\n api\n .getAllDisplayedColumns()\n .map((col) => col.getColDef().headerName || ''),\n )\n .catch(() =>\n Promise.reject('Unable to retrieve displayed column header names.'),\n );\n }\n\n /**\n * @internal\n */\n public async getGridApi(): Promise<GridApi> {\n await this.waitForTasksOutsideAngular();\n const locator = this.locatorFactory.locatorFor('ag-grid-angular');\n return await locator().then((grid) => {\n if (grid instanceof UnitTestElement) {\n const api = getGridApi(grid.element);\n if (api) {\n return api;\n }\n }\n // If this harness were used in an environment that did not provide UnitTestElement.\n /* istanbul ignore next */\n throw new Error('Unable to get GridApi from AgGridAngular component.');\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;AAQA;;AAEG;AACG,MAAO,uBAAwB,SAAQ,mBAAmB,CAAA;AAC9D;;AAEG;aACW,IAAA,CAAA,YAAY,GAAG,qBAAqB,CAAC;AAEnD;;;AAGG;IACI,OAAO,IAAI,CAChB,OAAuC,EAAA;AAEvC,QAAA,OAAO,uBAAuB,CAAC,qBAAqB,CAAC,OAAO,CAAC;IAC/D;AAEA;;AAEG;AACI,IAAA,MAAM,WAAW,GAAA;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAC9C,0BAA0B,CAC3B;QAED,OAAO,MAAM,SAAS;aACnB,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE;AACjB,aAAA,KAAK,CAAC,MAAM,KAAK,CAAC;IACvB;AAEA;;AAEG;AACI,IAAA,MAAM,qBAAqB,GAAA;AAChC,QAAA,OAAO,MAAM,IAAI,CAAC,UAAU;aACzB,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,sBAAsB,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,QAAQ,EAAE,CAAC;aACvE,KAAK,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,0CAA0C,CAAC,CAAC;IAC5E;AAEA;;AAEG;AACI,IAAA,MAAM,6BAA6B,GAAA;AACxC,QAAA,OAAO,MAAM,IAAI,CAAC,UAAU;AACzB,aAAA,IAAI,CAAC,CAAC,GAAG,KACR;AACG,aAAA,sBAAsB;AACtB,aAAA,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,SAAS,EAAE,CAAC,UAAU,IAAI,EAAE,CAAC;aAElD,KAAK,CAAC,MACL,OAAO,CAAC,MAAM,CAAC,mDAAmD,CAAC,CACpE;IACL;AAEA;;AAEG;AACI,IAAA,MAAM,UAAU,GAAA;AACrB,QAAA,MAAM,IAAI,CAAC,0BAA0B,EAAE;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,iBAAiB,CAAC;QACjE,OAAO,MAAM,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,KAAI;AACnC,YAAA,IAAI,IAAI,YAAY,eAAe,EAAE;gBACnC,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;gBACpC,IAAI,GAAG,EAAE;AACP,oBAAA,OAAO,GAAG;gBACZ;YACF;;;AAGA,YAAA,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC;AACxE,QAAA,CAAC,CAAC;IACJ;;;ACjFF;;AAEG;;;;"}
1
+ {"version":3,"file":"skyux-ag-grid-testing.mjs","sources":["../../../../../libs/components/ag-grid/testing/src/modules/ag-grid/ag-grid-render-tracking.ts","../../../../../libs/components/ag-grid/testing/src/modules/ag-grid-wrapper/ag-grid-wrapper-harness.ts","../../../../../libs/components/ag-grid/testing/src/modules/ag-grid/ag-grid-testing.service.ts","../../../../../libs/components/ag-grid/testing/src/modules/ag-grid/provide-ag-grid-testing.ts","../../../../../libs/components/ag-grid/testing/src/skyux-ag-grid-testing.ts"],"sourcesContent":["import { GridApi } from 'ag-grid-community';\n\ninterface RenderState {\n count: number;\n lastRenderedAt: number;\n}\n\nconst renderStates = new WeakMap<GridApi, RenderState>();\n\n/**\n * @internal\n * Records that AG Grid finished a row-model render pass for the given grid\n * (initial load, sort, filter, or pagination all trigger `modelUpdated`).\n */\nexport function trackModelUpdate(api: GridApi): void {\n const previous = renderStates.get(api);\n renderStates.set(api, {\n count: (previous?.count ?? 0) + 1,\n lastRenderedAt: Date.now(),\n });\n}\n\n/**\n * @internal\n * The number of `modelUpdated` render passes recorded for the given grid.\n */\nexport function getRenderCount(api: GridApi): number {\n return renderStates.get(api)?.count ?? 0;\n}\n\n/**\n * @internal\n * Milliseconds since the last recorded render pass, or `Infinity` if none\n * has been recorded yet. A grid that loads data asynchronously (e.g. an\n * Angular `resource()`) can render an empty pass before its real data\n * arrives, each firing its own `modelUpdated` - this lets callers wait for\n * the render count to stop moving, not just for it to move once.\n */\nexport function getMsSinceLastRender(api: GridApi): number {\n const state = renderStates.get(api);\n return state ? Date.now() - state.lastRenderedAt : Infinity;\n}\n\n/**\n * @internal\n * Whether AG Grid is currently opted out of Angular's test zone (i.e.\n * `provideSkyAgGridTesting()` is active), meaning render counts are actually\n * being recorded and it's safe to wait on them. Consumers of\n * `SkyAgGridWrapperHarness` that don't use `provideSkyAgGridTesting()` get no\n * tracking at all, so waiting on a render count that will never move would\n * just burn the full poll timeout on every read.\n */\nexport function isRenderTrackingActive(): boolean {\n return (window as any).AG_GRID_UNDER_TEST === false;\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\nimport { UnitTestElement } from '@angular/cdk/testing/testbed';\nimport { SkyComponentHarness } from '@skyux/core/testing';\n\nimport { GridApi, getGridApi } from 'ag-grid-community';\n\nimport {\n getMsSinceLastRender,\n getRenderCount as getTrackedRenderCount,\n isRenderTrackingActive,\n} from '../ag-grid/ag-grid-render-tracking';\n\nimport { SkyAgGridWrapperHarnessFilters } from './ag-grid-wrapper-harness.filters';\n\n/**\n * Harness for interacting with SKY UX AG Grid components in tests.\n * Add `provideSkyAgGridTesting()` to the spec's providers so the harness\n * can wait for the grid to finish rendering; without it, render-readiness\n * waits are skipped.\n */\nexport class SkyAgGridWrapperHarness extends SkyComponentHarness {\n /**\n * @internal\n */\n public static hostSelector = 'sky-ag-grid-wrapper';\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a\n * `SkyAgGridWrapperHarness` that meets certain criteria\n */\n public static with(\n filters: SkyAgGridWrapperHarnessFilters,\n ): HarnessPredicate<SkyAgGridWrapperHarness> {\n return SkyAgGridWrapperHarness.getDataSkyIdPredicate(filters);\n }\n\n /**\n * Checks whether the grid is ready.\n */\n public async isGridReady(): Promise<boolean> {\n const gridReady = this.locatorFactory.locatorFor(\n '.ag-root.ag-unselectable',\n );\n\n return await gridReady()\n .then((el) => !!el)\n .catch(() => false);\n }\n\n /**\n * Retrieves the IDs of the currently displayed columns.\n */\n public async getDisplayedColumnIds(): Promise<string[]> {\n return await this.getGridApi()\n .then((api) => api.getAllDisplayedColumns().map((col) => col.getColId()))\n .catch(() => Promise.reject('Unable to retrieve displayed column IDs.'));\n }\n\n /**\n * Retrieves the header names of the currently displayed columns.\n */\n public async getDisplayedColumnHeaderNames(): Promise<string[]> {\n return await this.getGridApi()\n .then((api) =>\n api\n .getAllDisplayedColumns()\n .map((col) => col.getColDef().headerName || ''),\n )\n .catch(() =>\n Promise.reject('Unable to retrieve displayed column header names.'),\n );\n }\n\n /**\n * @internal\n */\n public async getGridApi(): Promise<GridApi> {\n const api = await this.#locateGridApi();\n if (isRenderTrackingActive()) {\n await this.#waitForRenderCount(api, (count) => count > 0);\n }\n return api;\n }\n\n /**\n * @internal\n * The number of `modelUpdated` render passes AG Grid has completed for\n * this grid so far. Callers that need to observe the *next* render (e.g.\n * after triggering a sort) should capture this before acting, then pass it\n * to `waitUntilRendered()`.\n */\n public async getRenderCount(): Promise<number> {\n return getTrackedRenderCount(await this.#locateGridApi());\n }\n\n /**\n * @internal\n * Waits, on a bounded wall-clock poll, until the grid has completed more\n * than `afterCount` render passes. Defaults to `0`, i.e. \"has rendered at\n * least once\" - use this instead of `whenStable()`/`waitForTasksOutsideAngular()`,\n * since AG Grid 36 schedules its render work outside the Angular zone.\n */\n public async waitUntilRendered(afterCount = 0): Promise<void> {\n if (!isRenderTrackingActive()) {\n return;\n }\n const api = await this.#locateGridApi();\n await this.#waitForRenderCount(api, (count) => count > afterCount);\n }\n\n async #locateGridApi(): Promise<GridApi> {\n // Query the `.ag-root` element rather than `ag-grid-angular` itself, since\n // `skyViewkeeper`'s shadow element is inserted as `ag-grid-angular`'s\n // first child and `getGridApi()` locates the grid by walking up from the\n // queried element's first element child.\n const locator = this.locatorFactory.locatorFor('ag-grid-angular .ag-root');\n return await locator().then((grid) => {\n if (grid instanceof UnitTestElement) {\n const api = getGridApi(grid.element);\n if (api) {\n return api;\n }\n }\n // If this harness were used in an environment that did not provide UnitTestElement.\n /* istanbul ignore next */\n throw new Error('Unable to get GridApi from AgGridAngular component.');\n });\n }\n\n // A grid that loads data asynchronously (e.g. an Angular `resource()`) can\n // render an empty pass before its real data arrives, each firing its own\n // `modelUpdated`. Waiting for the predicate to become true isn't enough -\n // this also waits for the render count to stop moving for `settleMs`, so a\n // read doesn't land on that intermediate empty pass.\n async #waitForRenderCount(\n api: GridApi,\n predicate: (count: number) => boolean,\n timeoutMs = 2000,\n settleMs = 100,\n ): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n while (\n !predicate(getTrackedRenderCount(api)) ||\n getMsSinceLastRender(api) < settleMs\n ) {\n if (Date.now() >= deadline) {\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, 25));\n }\n }\n}\n","import { DestroyRef, Injectable, inject } from '@angular/core';\nimport { SkyAgGridService, SkyGetGridOptionsArgs } from '@skyux/ag-grid';\n\nimport { GridOptions, ModelUpdatedEvent } from 'ag-grid-community';\n\nimport { trackModelUpdate } from './ag-grid-render-tracking';\n\n/**\n * `GridOptions` applied to every grid built through `SkyAgGridService` while\n * `provideSkyAgGridTesting()` is in effect. AG Grid recommends disabling\n * row/column virtualization in tests so the whole grid is DOM-queryable\n * regardless of a consumer's own layout/scroll settings.\n */\nconst SKY_AG_GRID_TESTING_OPTIONS: Partial<GridOptions> = {\n suppressColumnVirtualisation: true,\n suppressRowVirtualisation: true,\n};\n\n/**\n * Records every `modelUpdated` render pass so `SkyAgGridWrapperHarness` can\n * poll for a real, non-zone-dependent readiness signal instead of relying on\n * `whenStable()`, which no longer waits for AG Grid once it runs outside the\n * Angular zone (see `provideSkyAgGridTesting()`).\n */\nfunction withRenderTracking<T>(options: GridOptions<T>): GridOptions<T> {\n const onModelUpdated = options.onModelUpdated;\n return {\n ...options,\n onModelUpdated: (event: ModelUpdatedEvent<T>): void => {\n trackModelUpdate(event.api);\n onModelUpdated?.(event);\n },\n };\n}\n\n/**\n * Tracks how many live `SkyAgGridTestingService` instances currently want\n * `AG_GRID_UNDER_TEST` forced to `false`, and the value it held before the\n * first of them activated it. `provideSkyAgGridTesting()` can be added to\n * `TestBed.configureTestingModule()`'s providers *and/or* to one or more\n * component `providers` arrays within the same spec, so multiple instances\n * can be alive at once and destroyed in any order - the flag must stay forced\n * while any instance is alive, and the pre-existing value must only be\n * restored once the last one is destroyed.\n */\nlet activeInstanceCount = 0;\nlet restoreValue: unknown;\n\n/**\n * @internal\n * Configures every grid with disabled row/column virtualization and opts out\n * of AG Grid's Angular test-zone detection. Specs that create and destroy many\n * grids can otherwise see AG Grid's own internal timers and animation frames\n * occasionally leave a `requestAnimationFrame` callback pending indefinitely,\n * which surfaces as a `whenStable()` timeout unrelated to the code under test.\n * Without zone opt-out, AG Grid schedules its internal scroll/viewport work\n * inside the Angular zone under Karma, which can keep the zone from ever\n * reaching stable. The flag is restored to its prior value once the last live\n * instance is destroyed, so specs that don't opt in aren't affected by ones\n * that do.\n *\n * Note: `provideSkyAgGridTesting()` can be added to `TestBed.configureTestingModule()`'s\n * providers *or* to a component's own `providers` array, so this can't rely on\n * an environment-injector-only mechanism (like `ENVIRONMENT_INITIALIZER`) to\n * set/restore the flag — a service constructor works at either injector level,\n * and `DestroyRef` fires correctly for either a TestBed module teardown or a\n * component destroy.\n */\n@Injectable()\nexport class SkyAgGridTestingService extends SkyAgGridService {\n constructor() {\n super();\n if (activeInstanceCount === 0) {\n restoreValue = (window as any).AG_GRID_UNDER_TEST;\n }\n activeInstanceCount++;\n (window as any).AG_GRID_UNDER_TEST = false;\n inject(DestroyRef).onDestroy(() => {\n activeInstanceCount--;\n if (activeInstanceCount === 0) {\n (window as any).AG_GRID_UNDER_TEST = restoreValue;\n }\n });\n }\n\n public override getGridOptions<T = any>(\n args: SkyGetGridOptionsArgs<T>,\n ): GridOptions<T> {\n return withRenderTracking({\n ...super.getGridOptions(args),\n ...SKY_AG_GRID_TESTING_OPTIONS,\n });\n }\n\n public override getEditableGridOptions<T = any>(\n args: SkyGetGridOptionsArgs<T>,\n ): GridOptions<T> {\n return withRenderTracking({\n ...super.getEditableGridOptions(args),\n ...SKY_AG_GRID_TESTING_OPTIONS,\n });\n }\n}\n","import { Provider } from '@angular/core';\nimport { SkyAgGridService } from '@skyux/ag-grid';\n\nimport { SkyAgGridTestingService } from './ag-grid-testing.service';\n\n/**\n * Configures every grid built through `SkyAgGridService` to disable AG Grid's\n * row/column virtualization and to opt out of AG Grid's Angular test-zone\n * detection while the test is running, so grid work completes without hanging\n * `whenStable()`. The previous test-zone setting is restored when the test's\n * injector is destroyed, so specs that don't opt in aren't affected by ones\n * that do. Add to the spec's `TestBed.configureTestingModule` providers.\n *\n * @example\n * ```typescript\n * TestBed.configureTestingModule({\n * providers: [provideSkyAgGridTesting()],\n * });\n * ```\n * @preview\n */\nexport function provideSkyAgGridTesting(): Provider[] {\n return [{ provide: SkyAgGridService, useClass: SkyAgGridTestingService }];\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["getTrackedRenderCount"],"mappings":"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"}