@datorama/core 22.15.0 → 22.15.2

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.
Files changed (32) hide show
  1. package/bundle.scss +122 -50
  2. package/bundles/datorama-core.umd.js +140 -47
  3. package/bundles/datorama-core.umd.js.map +1 -1
  4. package/bundles/datorama-core.umd.min.js +27 -27
  5. package/bundles/datorama-core.umd.min.js.map +1 -1
  6. package/datorama-core.metadata.json +1 -1
  7. package/esm2015/lib/grid/grid/grid.component.js +4 -4
  8. package/esm2015/lib/grid/grid-sort.utils.js +7 -2
  9. package/esm2015/lib/grid-v2/grid/grid-v2.component.js +10 -3
  10. package/esm2015/lib/grid-v2/grid/grid-v2.config.js +30 -4
  11. package/esm2015/lib/grid-v2/grid-controller/grid-controller.component.js +58 -24
  12. package/esm2015/lib/grid-v2/grid-header/grid-header.component.js +3 -2
  13. package/esm2015/lib/grid-v2/grid-store/grid.query.js +9 -5
  14. package/esm2015/lib/grid-v2/grid-toolbar/grid-toolbar.component.js +22 -16
  15. package/esm2015/lib/version.js +2 -2
  16. package/esm5/lib/grid/grid/grid.component.js +4 -4
  17. package/esm5/lib/grid/grid-sort.utils.js +7 -2
  18. package/esm5/lib/grid-v2/grid/grid-v2.component.js +14 -3
  19. package/esm5/lib/grid-v2/grid/grid-v2.config.js +30 -4
  20. package/esm5/lib/grid-v2/grid-controller/grid-controller.component.js +62 -24
  21. package/esm5/lib/grid-v2/grid-header/grid-header.component.js +3 -2
  22. package/esm5/lib/grid-v2/grid-store/grid.query.js +9 -5
  23. package/esm5/lib/grid-v2/grid-toolbar/grid-toolbar.component.js +22 -16
  24. package/esm5/lib/version.js +2 -2
  25. package/fesm2015/datorama-core.js +133 -48
  26. package/fesm2015/datorama-core.js.map +1 -1
  27. package/fesm5/datorama-core.js +141 -48
  28. package/fesm5/datorama-core.js.map +1 -1
  29. package/lib/grid-v2/grid/grid-v2.component.d.ts +4 -0
  30. package/lib/grid-v2/grid-controller/grid-controller.component.d.ts +15 -0
  31. package/lib/grid-v2/grid-toolbar/grid-toolbar.component.d.ts +1 -0
  32. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  import { __decorate, __metadata, __param, __rest } from 'tslib';
2
2
  import { forwardRef, NgZone, Renderer2, Input, ViewChild, ElementRef, Component, ChangeDetectionStrategy, NgModule, Attribute, HostBinding, ɵɵdefineInjectable, Injectable, isDevMode, InjectionToken, Inject, ChangeDetectorRef, HostListener, Directive, EventEmitter, Output, ɵɵinject, ApplicationRef, Injector, INJECTOR, TemplateRef, ViewContainerRef, Pipe, ViewEncapsulation, ComponentFactoryResolver, ContentChildren, QueryList, ViewChildren, Optional, ContentChild, SkipSelf, Self, SecurityContext } from '@angular/core';
3
- import { fromEvent, merge as merge$1, Subject, combineLatest, Observable, forkJoin, of, Subscription, BehaviorSubject, EMPTY, defer, interval, ReplaySubject, throwError, isObservable, timer, pipe } from 'rxjs';
3
+ import { fromEvent, merge as merge$1, Subject, combineLatest, Observable, forkJoin, of, Subscription, BehaviorSubject, ReplaySubject, EMPTY, defer, interval, throwError, isObservable, timer, pipe } from 'rxjs';
4
4
  import { NG_VALUE_ACCESSOR, NgControl, FormControl, ReactiveFormsModule, Validators, FormBuilder, ControlContainer, FormGroup, FormControlDirective, FormControlName } from '@angular/forms';
5
5
  import { untilDestroyed } from 'ngx-take-until-destroy';
6
6
  import { debounceTime, filter as filter$1, map as map$1, pluck, tap, switchMap, takeUntil, take, auditTime, distinctUntilChanged, throttleTime, first, mapTo, startWith, pairwise, skip, shareReplay, delay as delay$1, switchMapTo, repeat, concatMap, concatMapTo } from 'rxjs/operators';
@@ -5098,10 +5098,10 @@ let DatoGridComponent = class DatoGridComponent extends BaseCustomControl {
5098
5098
  this.onChange(selectedRows);
5099
5099
  },
5100
5100
  rowSelection: 'multiple',
5101
- rowDeselection: true,
5101
+ // rowDeselection removed: true by default in AG Grid 27 (suppress with suppressRowDeselection).
5102
5102
  unSortIcon: true,
5103
- animateRows: true,
5104
- rememberGroupStateWhenNewData: true
5103
+ animateRows: true
5104
+ // rememberGroupStateWhenNewData removed: no-op since AG Grid 24 (transaction updates keep group state).
5105
5105
  };
5106
5106
  this.infinitePagination = false;
5107
5107
  this.isRowsCollapsed = true;
@@ -9904,7 +9904,12 @@ function getGridModel(gridName) {
9904
9904
  */
9905
9905
  function getSortModel(columnApi) {
9906
9906
  const sortIndexes = {};
9907
- const sortedColumns = columnApi.getColumnState().filter(columnState => columnState.sort != null);
9907
+ // AG Grid 27: getColumnState() returns undefined before the grid's columns are initialized.
9908
+ // getSortModel() is reached via getCurrentGridSettings()/onFilterSortChanged() on resize/data
9909
+ // events that can fire before that point, so guard against undefined to avoid
9910
+ // "Cannot read properties of undefined (reading 'filter')".
9911
+ const columnState = columnApi.getColumnState() || [];
9912
+ const sortedColumns = columnState.filter(state => state.sort != null);
9908
9913
  sortedColumns.forEach(columnState => {
9909
9914
  sortIndexes[columnState.colId] = columnState.sortIndex;
9910
9915
  });
@@ -10150,9 +10155,13 @@ let GridQuery = class GridQuery extends Query {
10150
10155
  getCurrentGridSettings() {
10151
10156
  const toColId = column => column.getColId();
10152
10157
  const { columns } = this.api;
10153
- const groupedColumns = columns.getRowGroupColumns();
10154
- const columnsOrder = columns.getAllColumns();
10155
- const allGridColumns = columns.getAllGridColumns();
10158
+ // AG Grid 27: getAllColumns() returns Column[] | null (and the grouped/grid column getters can
10159
+ // likewise be empty) before the grid's columns are initialized. getCurrentGridSettings() is
10160
+ // reached via fitGrid -> updateSettings on window resize, which can fire before that point, so
10161
+ // guard against null to avoid "Cannot read properties of undefined (reading 'filter')".
10162
+ const groupedColumns = columns.getRowGroupColumns() || [];
10163
+ const columnsOrder = columns.getAllColumns() || [];
10164
+ const allGridColumns = columns.getAllGridColumns() || [];
10156
10165
  const hiddenColumns = columnsOrder
10157
10166
  .filter(column => !column.isVisible() && !groupedColumns.includes(column))
10158
10167
  .map(toColId);
@@ -10163,7 +10172,7 @@ let GridQuery = class GridQuery extends Query {
10163
10172
  hiddenColumns,
10164
10173
  groupedColumns: groupedColumns.map(toColId),
10165
10174
  filter: this.getFilter(),
10166
- pinnedColumns: columns.getDisplayedLeftColumns().map(toColId),
10175
+ pinnedColumns: (columns.getDisplayedLeftColumns() || []).map(toColId),
10167
10176
  columnsOrder: allGridColumns.map(toColId),
10168
10177
  columnsSizes: null,
10169
10178
  searchTerm: null
@@ -12109,7 +12118,27 @@ const defaultGridOptions = Object.assign({
12109
12118
  comparator: (a, b) => getTime$1(a) - getTime$1(b)
12110
12119
  },
12111
12120
  [DatoGridColumnTypes.Number]: {
12112
- filter: DatoGridFilterTypes.Number
12121
+ filter: DatoGridFilterTypes.Number,
12122
+ // AG Grid resolves a column's sort comparator only from its merged colDef.comparator.
12123
+ // Number columns had none, so they fell back to AG Grid's default comparator, which sorts
12124
+ // string-typed values lexicographically ("10" before "2"). Provide an explicit numeric
12125
+ // comparator. Map null/empty/non-numeric to -Infinity so we never return NaN (AG Grid's
12126
+ // sorter skips a NaN result). Ascending-sense only — AG Grid flips the sign for descending.
12127
+ comparator: (a, b) => {
12128
+ const toNum = (v) => {
12129
+ const n = v == null || v === '' ? NaN : Number(v);
12130
+ return isNaN(n) ? -Infinity : n;
12131
+ };
12132
+ const na = toNum(a);
12133
+ const nb = toNum(b);
12134
+ // Compare relationally (not by subtraction): two missing/non-numeric values both map to
12135
+ // -Infinity, and -Infinity - (-Infinity) === NaN, which AG Grid's sorter skips. Returning
12136
+ // 0 / -1 / 1 avoids NaN entirely. Ascending sense — AG Grid flips the sign for descending.
12137
+ if (na === nb) {
12138
+ return 0;
12139
+ }
12140
+ return na < nb ? -1 : 1;
12141
+ }
12113
12142
  },
12114
12143
  [DatoGridColumnTypes.String]: stringColDef,
12115
12144
  [DatoGridColumnTypes.Status]: Object.assign(Object.assign({}, stringColDef), { cellRenderer: 'DatoGridStatusCellComponent' }),
@@ -12117,14 +12146,20 @@ const defaultGridOptions = Object.assign({
12117
12146
  [DatoGridColumnTypes.ItemsCount]: Object.assign(Object.assign({}, stringColDef), { cellRenderer: 'DatoGridItemsCountCellComponent' }),
12118
12147
  [DatoGridColumnTypes.Initials]: Object.assign(Object.assign({}, stringColDef), { cellRenderer: 'DatoGridInitialsCellComponent' }),
12119
12148
  [DatoGridColumnTypes.Avatar]: Object.assign(Object.assign({}, stringColDef), { cellRenderer: 'DatoGridAvatarCellComponent' })
12120
- }, multiSortKey: 'ctrl', suppressPaginationPanel: true, pagination: true, paginateChildRows: true, deltaColumnMode: true, loadingOverlayComponentFramework: DatoGridV2LoaderComponent, noRowsOverlayComponentFramework: DatoGridV2NoDataOverlayComponent, defaultColDef: {
12149
+ }, multiSortKey: 'ctrl', suppressPaginationPanel: true, pagination: true, paginateChildRows: true,
12150
+ // deltaColumnMode removed: deprecated in AG Grid 27, delta column updates are the default now.
12151
+ loadingOverlayComponentFramework: DatoGridV2LoaderComponent, noRowsOverlayComponentFramework: DatoGridV2NoDataOverlayComponent, defaultColDef: {
12121
12152
  minWidth: GridMinWidths.Default,
12122
12153
  sortable: true,
12123
12154
  resizable: true,
12124
12155
  type: DatoGridColumnTypes.String,
12125
12156
  menuTabs: ['filterMenuTab'],
12126
12157
  headerComponentFramework: DatoGridColumnHeaderComponent
12127
- }, suppressCellSelection: true, suppressPropertyNamesCheck: true, rowHeight: 35, headerHeight: 30, rowSelection: GridRowSelectionType.MULTIPLE, rowDeselection: true, unSortIcon: true, animateRows: true, rememberGroupStateWhenNewData: true, groupDisplayType: 'multipleColumns', groupDefaultExpanded: -1, usePivotGridStyle: false, disabledHTMLRenderingFields: [] }, (isTestEnv() ? { suppressColumnVirtualisation: true, rowBuffer: 99999 } : {}));
12158
+ }, suppressCellFocus: true, suppressPropertyNamesCheck: true, rowHeight: 35, headerHeight: 30, rowSelection: GridRowSelectionType.MULTIPLE,
12159
+ // rowDeselection removed: true by default in AG Grid 27 (suppress with suppressRowDeselection).
12160
+ unSortIcon: true, animateRows: true,
12161
+ // rememberGroupStateWhenNewData removed: no-op since AG Grid 24 (transaction updates keep group state).
12162
+ groupDisplayType: 'multipleColumns', groupDefaultExpanded: -1, usePivotGridStyle: false, disabledHTMLRenderingFields: [] }, (isTestEnv() ? { suppressColumnVirtualisation: true, rowBuffer: 99999 } : {}));
12128
12163
  const DEFAULT_GRID_SEARCH_DEBOUNCE_TIME = {
12129
12164
  CLIENT: 200,
12130
12165
  SERVER: 250
@@ -13925,14 +13960,26 @@ let DatoGridControllerComponent = class DatoGridControllerComponent {
13925
13960
  this.gridActions = [];
13926
13961
  this.gridReady$ = this.gridQuery.gridReady$;
13927
13962
  this.contentInit = new Subject();
13963
+ // ngx-take-until-destroy patches ngOnDestroy on the instance, which Ivy never calls (it uses the
13964
+ // prototype hook), so listeners outlived the grid and hit the destroyed AG Grid API.
13965
+ this.destroy$ = new Subject();
13966
+ this.hasGridOptions = new BehaviorSubject(false);
13967
+ this.agGridReady = new ReplaySubject(1);
13928
13968
  this.gridElements = {
13929
13969
  centerViewport: null,
13930
13970
  centerContainer: null,
13931
13971
  bodyViewport: null
13932
13972
  };
13933
13973
  this.treeGridClass = 'tree';
13974
+ this.hasGridOptions$ = this.hasGridOptions.asObservable();
13934
13975
  }
13935
13976
  set gridOptions(gridOptions) {
13977
+ // The [gridOptions] binding can resolve to undefined during the host's initial change-detection
13978
+ // pass (before the consumer computes its options). Ignore it instead of throwing
13979
+ // "Cannot read properties of undefined" from initGridOptions() and aborting the view render.
13980
+ if (!gridOptions) {
13981
+ return;
13982
+ }
13936
13983
  this._gridOptions = this.gridService.initGridOptions(gridOptions);
13937
13984
  this.gridService.treeData = gridOptions.treeData;
13938
13985
  this.gridService.isPivotMode = gridOptions.pivotMode;
@@ -13944,16 +13991,33 @@ let DatoGridControllerComponent = class DatoGridControllerComponent {
13944
13991
  this.agGridEl.classList.add(this.treeGridClass);
13945
13992
  }
13946
13993
  }
13994
+ !this.hasGridOptions.value && this.hasGridOptions.next(true);
13947
13995
  }
13948
13996
  get gridOptions() {
13949
13997
  return this._gridOptions;
13950
13998
  }
13999
+ /* @internal */
14000
+ get agGridOptions() {
14001
+ if (!this._agGridOptions && this._gridOptions) {
14002
+ this.gridOptions = this.normalizeOptions();
14003
+ this._agGridOptions = this.gridOptions;
14004
+ }
14005
+ return this._agGridOptions;
14006
+ }
13951
14007
  ngOnDestroy() {
14008
+ this.destroy$.next();
14009
+ this.destroy$.complete();
13952
14010
  this.contentInit.complete();
14011
+ this.hasGridOptions.complete();
14012
+ this.agGridReady.complete();
13953
14013
  this.clearTooltip();
13954
14014
  this.rowHoverComponent && this.rowHoverComponent.destroy();
13955
14015
  this.rowHoverComponent = null;
13956
14016
  }
14017
+ /* @internal */
14018
+ onAgGridReady(event) {
14019
+ this.agGridReady.next(event);
14020
+ }
13957
14021
  initializeGrid(agGrid, agGridEl) {
13958
14022
  if (!this.contentInit.isStopped) {
13959
14023
  this._initializeGrid(agGrid, agGridEl);
@@ -13967,11 +14031,13 @@ let DatoGridControllerComponent = class DatoGridControllerComponent {
13967
14031
  this.contentInit
13968
14032
  .asObservable()
13969
14033
  .pipe(switchMap(() => {
13970
- this.gridOptions = this.normalizeOptions();
13971
- agGrid.gridOptions = this.gridOptions;
14034
+ // Already normalized when dato-grid-v2 bound them to <ag-grid-angular [gridOptions]>.
14035
+ if (!this.agGridOptions) {
14036
+ return EMPTY;
14037
+ }
13972
14038
  const settingsLoader = this.gridOptions.saveSettings === false ? of(null) : this.storageAPI.get(this.gridOptions.gridName);
13973
- return combineLatest([agGrid.gridReady, settingsLoader]);
13974
- }), untilDestroyed(this))
14039
+ return combineLatest([this.agGridReady, settingsLoader]);
14040
+ }), takeUntil(this.destroy$))
13975
14041
  .subscribe(([{ api, columnApi }, savedSettings = {}]) => {
13976
14042
  if (!this.gridOptions.rowData) {
13977
14043
  api.showLoadingOverlay();
@@ -14041,7 +14107,7 @@ let DatoGridControllerComponent = class DatoGridControllerComponent {
14041
14107
  observable = observable.pipe(filter$1(({ source }) => source === 'uiColumnDragged'), tap(() => this.updateOnHoverPos()));
14042
14108
  }
14043
14109
  observable
14044
- .pipe(auditTime(100), filter$1(({ finished, source }) => finished && source === 'uiColumnDragged'), untilDestroyed(this))
14110
+ .pipe(auditTime(100), filter$1(({ finished, source }) => finished && source === 'uiColumnDragged'), takeUntil(this.destroy$))
14045
14111
  .subscribe(e => {
14046
14112
  const [column] = e.columns;
14047
14113
  let columnsSizes = Object.assign({}, this.gridQuery.getColumnSizes());
@@ -14059,7 +14125,7 @@ let DatoGridControllerComponent = class DatoGridControllerComponent {
14059
14125
  merge$1(columnVisible, sortChanged, columnRowGroupChanged, columnPinned, dragStopped, filterChanged)
14060
14126
  .pipe(
14061
14127
  /* Skip the initial sorting event fired by the grid when adding rows */
14062
- skip(1), untilDestroyed(this))
14128
+ skip(1), takeUntil(this.destroy$))
14063
14129
  .subscribe(({ type }) => {
14064
14130
  const settingsDiff = this.gridService.getSettingsDiff();
14065
14131
  this.gridService.updateSettings(settingsDiff);
@@ -14075,7 +14141,7 @@ let DatoGridControllerComponent = class DatoGridControllerComponent {
14075
14141
  listenToStoreSettingsChanges() {
14076
14142
  this.gridQuery
14077
14143
  .select(state => state.settings)
14078
- .pipe(skip(1), debounceTime(1000), untilDestroyed(this))
14144
+ .pipe(skip(1), debounceTime(1000), takeUntil(this.destroy$))
14079
14145
  .subscribe(() => {
14080
14146
  const settingsDiff = this.gridService.getSettingsDiff();
14081
14147
  this.gridService.saveSettingsToServer(settingsDiff);
@@ -14100,14 +14166,14 @@ let DatoGridControllerComponent = class DatoGridControllerComponent {
14100
14166
  return columns.length === 0
14101
14167
  ? EMPTY
14102
14168
  : agGrid.cellClicked.pipe(filter$1(({ value, node }) => value !== undefined && node.group === true));
14103
- }), untilDestroyed(this))
14169
+ }), takeUntil(this.destroy$))
14104
14170
  .subscribe(({ node }) => {
14105
14171
  node.setExpanded(!node.expanded);
14106
14172
  });
14107
14173
  /* When closing a grouped row we want to hide the on hover actions */
14108
14174
  if (this.onHoverEnabled()) {
14109
14175
  agGrid.rowGroupOpened
14110
- .pipe(filter$1(({ node }) => node.expanded === false), untilDestroyed(this))
14176
+ .pipe(filter$1(({ node }) => node.expanded === false), takeUntil(this.destroy$))
14111
14177
  .subscribe(() => {
14112
14178
  this.lastHoveredRow = null;
14113
14179
  this.setOnHoverState(false);
@@ -14122,7 +14188,7 @@ let DatoGridControllerComponent = class DatoGridControllerComponent {
14122
14188
  fromEvent(bodyViewport, 'click')
14123
14189
  .pipe(filter$1((event) => {
14124
14190
  return (event.target === bodyViewport || event.target === centerViewport) && api.getSelectedRows().length > 0;
14125
- }), untilDestroyed(this))
14191
+ }), takeUntil(this.destroy$))
14126
14192
  .subscribe(() => api.deselectAll());
14127
14193
  }
14128
14194
  onHoverEnabled() {
@@ -14134,7 +14200,7 @@ let DatoGridControllerComponent = class DatoGridControllerComponent {
14134
14200
  const onHoverEnabled = this.onHoverEnabled();
14135
14201
  if (onHoverEnabled) {
14136
14202
  fromEvent(centerContainer, 'mouseleave')
14137
- .pipe(untilDestroyed(this))
14203
+ .pipe(takeUntil(this.destroy$))
14138
14204
  .subscribe(() => {
14139
14205
  this.toggleRowHoverClass(this.lastHoveredRow);
14140
14206
  this.lastHoveredRow = null;
@@ -14142,13 +14208,13 @@ let DatoGridControllerComponent = class DatoGridControllerComponent {
14142
14208
  lastHoveredCell = null;
14143
14209
  });
14144
14210
  merge$1(agGrid.bodyScroll.pipe(filter$1(({ direction }) => direction === 'horizontal')), agGrid.rowDataChanged)
14145
- .pipe(untilDestroyed(this))
14211
+ .pipe(takeUntil(this.destroy$))
14146
14212
  .subscribe(() => {
14147
14213
  this.updateOnHoverPos();
14148
14214
  });
14149
14215
  this.addOnHoverElement();
14150
14216
  }
14151
- agGrid.cellMouseOver.pipe(untilDestroyed(this)).subscribe((event) => {
14217
+ agGrid.cellMouseOver.pipe(takeUntil(this.destroy$)).subscribe((event) => {
14152
14218
  const { node, column } = event;
14153
14219
  if (lastHoveredCell === `${node.id}-${column.getColId()}`) {
14154
14220
  clearTimeout(this.cellMouseOutTimer);
@@ -14165,12 +14231,12 @@ let DatoGridControllerComponent = class DatoGridControllerComponent {
14165
14231
  }
14166
14232
  });
14167
14233
  const onTooltipOut = merge$1(fromEvent(bodyViewport, 'scroll'), fromEvent(this.agGridEl, 'mouseleave'));
14168
- onTooltipOut.pipe(untilDestroyed(this)).subscribe(() => {
14234
+ onTooltipOut.pipe(takeUntil(this.destroy$)).subscribe(() => {
14169
14235
  lastHoveredCell = null;
14170
14236
  this.clearTooltip();
14171
14237
  });
14172
14238
  agGrid.cellMouseOut
14173
- .pipe(filter$1(() => !isNil(this.tooltip)), untilDestroyed(this))
14239
+ .pipe(filter$1(() => !isNil(this.tooltip)), takeUntil(this.destroy$))
14174
14240
  .subscribe(() => {
14175
14241
  this.cellMouseOutTimer = window.setTimeout(() => this.clearTooltip());
14176
14242
  });
@@ -14187,9 +14253,13 @@ let DatoGridControllerComponent = class DatoGridControllerComponent {
14187
14253
  if (cell.tagName === 'SPAN' && cell.scrollWidth === 0) {
14188
14254
  cell = cell.parentElement;
14189
14255
  }
14190
- if (event.colDef.editable) {
14256
+ if (event.colDef.editable && cell) {
14191
14257
  cell = cell.querySelector('.value-wrapper') || cell;
14192
14258
  }
14259
+ // AG Grid 27 can fire cellMouseOver for an element that was already detached by a re-render.
14260
+ if (!cell) {
14261
+ return;
14262
+ }
14193
14263
  const textOverflow = cell.offsetWidth < cell.scrollWidth;
14194
14264
  if (textOverflow) {
14195
14265
  clearTimeout(this.cellMouseOutTimer);
@@ -14265,14 +14335,14 @@ let DatoGridControllerComponent = class DatoGridControllerComponent {
14265
14335
  keys: 'meta.a',
14266
14336
  ignoreInEditable: true
14267
14337
  })
14268
- .pipe(untilDestroyed(this))
14338
+ .pipe(takeUntil(this.destroy$))
14269
14339
  .subscribe(() => {
14270
14340
  this.gridService.selectAllCurrentPageRows();
14271
14341
  });
14272
14342
  }
14273
14343
  registerWindowResizeListener() {
14274
14344
  fromEvent(window, 'resize')
14275
- .pipe(debounceTime(100), filter$1(() => this.gridQuery.gridAlignment !== 2 /* CUSTOM */), untilDestroyed(this))
14345
+ .pipe(debounceTime(100), filter$1(() => this.gridQuery.gridAlignment !== 2 /* CUSTOM */), takeUntil(this.destroy$))
14276
14346
  .subscribe(() => {
14277
14347
  const fitTo = this.gridQuery.gridAlignment === 0 /* FIT_TO_CONTAINER */ ? 'container' : 'content';
14278
14348
  this.gridService.fitGrid(fitTo);
@@ -14292,7 +14362,7 @@ let DatoGridControllerComponent = class DatoGridControllerComponent {
14292
14362
  const events$ = this.gridQuery.isServerSide
14293
14363
  ? merge$1(agGrid.sortChanged, agGrid.filterChanged)
14294
14364
  : agGrid.filterChanged;
14295
- events$.pipe(untilDestroyed(this)).subscribe(() => {
14365
+ events$.pipe(takeUntil(this.destroy$)).subscribe(() => {
14296
14366
  this.gridService.deselectAllRows();
14297
14367
  });
14298
14368
  }
@@ -14300,7 +14370,7 @@ let DatoGridControllerComponent = class DatoGridControllerComponent {
14300
14370
  if (!this.gridQuery.isServerSide) {
14301
14371
  return;
14302
14372
  }
14303
- agGrid.paginationChanged.pipe(untilDestroyed(this)).subscribe(() => {
14373
+ agGrid.paginationChanged.pipe(takeUntil(this.destroy$)).subscribe(() => {
14304
14374
  if (this.gridQuery.isServerSelectAllRowsEnabled) {
14305
14375
  this.gridService.selectAllCurrentPageRows(true, true);
14306
14376
  }
@@ -14373,6 +14443,7 @@ let DatoGridV2Component = class DatoGridV2Component {
14373
14443
  constructor(controller, host) {
14374
14444
  this.controller = controller;
14375
14445
  this.host = host;
14446
+ this.hasGridOptions$ = this.controller.hasGridOptions$;
14376
14447
  }
14377
14448
  set grid(agGrid) {
14378
14449
  if (agGrid) {
@@ -14380,6 +14451,9 @@ let DatoGridV2Component = class DatoGridV2Component {
14380
14451
  this.controller.initializeGrid(agGrid, agGridEl);
14381
14452
  }
14382
14453
  }
14454
+ get agGridOptions() {
14455
+ return this.controller.agGridOptions;
14456
+ }
14383
14457
  get gridOptions() {
14384
14458
  return this.controller ? this.controller.gridOptions : null;
14385
14459
  }
@@ -14392,6 +14466,9 @@ let DatoGridV2Component = class DatoGridV2Component {
14392
14466
  get isPivotStyle() {
14393
14467
  return this.gridOptions && this.gridOptions.usePivotGridStyle;
14394
14468
  }
14469
+ onGridReady(event) {
14470
+ this.controller.onAgGridReady(event);
14471
+ }
14395
14472
  };
14396
14473
  DatoGridV2Component.ctorParameters = () => [
14397
14474
  { type: DatoGridControllerComponent },
@@ -14405,10 +14482,10 @@ __decorate([
14405
14482
  DatoGridV2Component = __decorate([
14406
14483
  Component({
14407
14484
  selector: 'dato-grid-v2',
14408
- template: "<ag-grid-angular data-auto-id=\"grid\" class=\"dato-grid ag-theme-material\" [class.has-background]=\"enableBackground\" [class.enable-v2_1]=\"enableV2_1\"\n [class.with-multi-selection-col]=\"gridOptions?.showMultiSelectionCheckboxes\" [class.pivot-style]=\"isPivotStyle\">\n</ag-grid-angular>\n<dato-grid-pagination-v2 [class.has-background]=\"enableBackground\"></dato-grid-pagination-v2>\n",
14485
+ template: "<ag-grid-angular *ngIf=\"hasGridOptions$ | async\" [gridOptions]=\"agGridOptions\" (gridReady)=\"onGridReady($event)\"\n data-auto-id=\"grid\" class=\"dato-grid ag-theme-material\" [class.has-background]=\"enableBackground\" [class.enable-v2_1]=\"enableV2_1\"\n [class.with-multi-selection-col]=\"gridOptions?.showMultiSelectionCheckboxes\" [class.pivot-style]=\"isPivotStyle\">\n</ag-grid-angular>\n<dato-grid-pagination-v2 [class.has-background]=\"enableBackground\"></dato-grid-pagination-v2>\n",
14409
14486
  changeDetection: ChangeDetectionStrategy.OnPush,
14410
14487
  encapsulation: ViewEncapsulation.None,
14411
- styles: ["dato-grid-v2{flex-grow:1;display:flex;flex-direction:column;position:relative}dato-grid-v2 .dato-grid,dato-grid-v2 dato-grid-pagination-v2{position:absolute;left:0;right:0;bottom:0}dato-grid-v2 .dato-grid{top:0;bottom:50px}dato-grid-v2 .grid-hover-actions{position:absolute;z-index:2;transition:opacity .2s ease-in-out}dato-grid-v2 .ag-row-drag{width:initial!important;min-width:auto!important}dato-grid-v2 .da-grid-icon{display:inline-block;line-height:31px;vertical-align:middle;width:initial;height:initial}dato-grid-v2 .da-grid-icon.drag{width:14px;height:14px;margin-right:6px;opacity:0;transition:opacity .3s;transform:translateY(-50%)}dato-grid-v2 .da-grid-icon.folder{width:18px;height:35px;margin:0 8px}dato-grid-v2 .ag-row.ag-row-hover .da-grid-icon.drag{opacity:1}dato-grid-v2 ag-grid-angular.tree .ag-group-contracted,dato-grid-v2 ag-grid-angular.tree .ag-group-expanded{display:inline-block;width:18px;text-align:center}dato-grid-v2 ag-grid-angular.tree .ag-group-checkbox{display:none}dato-grid-v2 ag-grid-angular.tree .ag-row.ag-empty-folder .folder{margin-left:26px}dato-grid-v2 ag-grid-angular.tree .ag-row.ag-row-level-1 .ag-cell-wrapper .ag-row-drag{padding-right:calc(55px * 1)}dato-grid-v2 ag-grid-angular.tree .ag-row .ag-row-group-indent-1{margin-left:0!important;padding-left:0!important}dato-grid-v2 ag-grid-angular.tree .ag-row.ag-row-level-2 .ag-cell-wrapper .ag-row-drag{padding-right:calc(55px * 2)}dato-grid-v2 ag-grid-angular.tree .ag-row .ag-row-group-indent-2{margin-left:0!important;padding-left:0!important}dato-grid-v2 ag-grid-angular.tree .ag-row.ag-row-level-3 .ag-cell-wrapper .ag-row-drag{padding-right:calc(55px * 3)}dato-grid-v2 ag-grid-angular.tree .ag-row .ag-row-group-indent-3{margin-left:0!important;padding-left:0!important}dato-grid-v2 ag-grid-angular.tree .ag-row.ag-row-level-4 .ag-cell-wrapper .ag-row-drag{padding-right:calc(55px * 4)}dato-grid-v2 ag-grid-angular.tree .ag-row .ag-row-group-indent-4{margin-left:0!important;padding-left:0!important}dato-grid-v2 ag-grid-angular.tree .ag-row div[col-id=ag-Grid-AutoColumn]{padding-left:0}dato-grid-v2 ag-grid-angular.tree .ag-row .ag-cell{display:flex;align-items:center}dato-grid-v2 ag-grid-angular.tree .ag-row .ag-cell .ag-group-value>span{display:inline-block;vertical-align:middle}dato-grid-v2 ag-grid-angular.tree .ag-row .ag-cell .initials{border-radius:50%;padding:4px;margin-right:8px;margin-left:20px;width:28px;height:28px;display:inline-block;text-align:center}dato-grid-v2 ag-grid-angular.tree .ag-row-group-leaf-indent{margin-left:0!important}dato-grid-v2 ag-grid-angular.tree .ag-selection-checkbox .ag-icon-checkbox-indeterminate:before{text-align:center;content:\"-\";display:inline-block;position:absolute;top:0;left:0;right:0;bottom:0;line-height:.5;color:#fff}dato-grid-v2 ag-grid-angular.row-height-35 .ag-cell{line-height:33px}dato-grid-v2 ag-grid-angular.row-height-35 .ag-cell.dato-editable-cell{line-height:29px}dato-grid-v2 ag-grid-angular.row-height-35 .ag-cell.ag-cell-inline-editing{height:35px}dato-grid-v2 ag-grid-angular.row-height-44 .ag-cell{line-height:42px}dato-grid-v2 ag-grid-angular.row-height-44 .ag-cell.dato-editable-cell{line-height:38px}dato-grid-v2 ag-grid-angular.row-height-44 .ag-cell.ag-cell-inline-editing{height:44px}dato-grid-v2 ag-grid-angular.row-height-50 .ag-cell{line-height:48px}dato-grid-v2 ag-grid-angular.row-height-50 .ag-cell.dato-editable-cell{line-height:44px}dato-grid-v2 ag-grid-angular.row-height-50 .ag-cell.ag-cell-inline-editing{height:50px}dato-grid-v2 ag-grid-angular.row-height-59 .ag-cell{line-height:57px}dato-grid-v2 ag-grid-angular.row-height-59 .ag-cell.dato-editable-cell{line-height:53px}dato-grid-v2 ag-grid-angular.row-height-59 .ag-cell.ag-cell-inline-editing{height:59px}dato-grid-v2 ag-grid-angular .ag-cell.checkbox-selection-cell{display:flex;padding-right:0}dato-grid-v2 .ag-menu .da-grid-icon svg{vertical-align:middle}dato-grid-v2 .ag-header-cell-sortable .ag-sort-none-icon{opacity:0;transition:opacity .2s}dato-grid-v2 .ag-header-cell-sortable:hover .ag-sort-none-icon{opacity:1}dato-grid-v2 .group-contracted-icon,dato-grid-v2 .group-expanded-icon{width:7px}dato-grid-v2 .group-expanded-icon{transform:rotate(90deg)}dato-grid-v2 .dato-grid .ag-cell{border-top:0;border-bottom:0}dato-grid-v2 .ag-overlay-wrapper ng-component{display:flex}.ag-dnd-ghost{min-width:100px;border:none;display:flex;justify-content:flex-start;align-content:center;align-items:center;cursor:-webkit-grabbing;cursor:grabbing;z-index:10000000}.ag-dnd-ghost .da-grid-icon.column-move-hide svg{height:18px;width:18px}.ag-dnd-ghost .da-grid-icon.column-move svg,.ag-dnd-ghost .da-grid-icon.column-move-pin svg{height:16px;width:16px}"]
14488
+ styles: ["dato-grid-v2{flex-grow:1;display:flex;flex-direction:column;position:relative}dato-grid-v2 .dato-grid,dato-grid-v2 dato-grid-pagination-v2{position:absolute;left:0;right:0;bottom:0}dato-grid-v2 .dato-grid{top:0;bottom:50px}dato-grid-v2 .grid-hover-actions{position:absolute;z-index:2;transition:opacity .2s ease-in-out}dato-grid-v2 .ag-row-drag{width:initial!important;min-width:auto!important}dato-grid-v2 .da-grid-icon{display:inline-block;line-height:31px;vertical-align:middle;width:initial;height:initial}dato-grid-v2 .da-grid-icon.drag{width:14px;height:14px;margin-right:6px;opacity:0;transition:opacity .3s;transform:translateY(-50%)}dato-grid-v2 .da-grid-icon.folder{width:18px;height:35px;margin:0 8px}dato-grid-v2 .ag-row.ag-row-hover .da-grid-icon.drag{opacity:1}dato-grid-v2 ag-grid-angular.tree .ag-group-contracted,dato-grid-v2 ag-grid-angular.tree .ag-group-expanded{display:inline-block;width:18px;text-align:center}dato-grid-v2 ag-grid-angular.tree .ag-group-checkbox{display:none}dato-grid-v2 ag-grid-angular.tree .ag-row.ag-empty-folder .folder{margin-left:26px}dato-grid-v2 ag-grid-angular.tree .ag-row.ag-row-level-1 .ag-cell-wrapper .ag-row-drag{padding-right:calc(55px * 1)}dato-grid-v2 ag-grid-angular.tree .ag-row .ag-row-group-indent-1{margin-left:0!important;padding-left:0!important}dato-grid-v2 ag-grid-angular.tree .ag-row.ag-row-level-2 .ag-cell-wrapper .ag-row-drag{padding-right:calc(55px * 2)}dato-grid-v2 ag-grid-angular.tree .ag-row .ag-row-group-indent-2{margin-left:0!important;padding-left:0!important}dato-grid-v2 ag-grid-angular.tree .ag-row.ag-row-level-3 .ag-cell-wrapper .ag-row-drag{padding-right:calc(55px * 3)}dato-grid-v2 ag-grid-angular.tree .ag-row .ag-row-group-indent-3{margin-left:0!important;padding-left:0!important}dato-grid-v2 ag-grid-angular.tree .ag-row.ag-row-level-4 .ag-cell-wrapper .ag-row-drag{padding-right:calc(55px * 4)}dato-grid-v2 ag-grid-angular.tree .ag-row .ag-row-group-indent-4{margin-left:0!important;padding-left:0!important}dato-grid-v2 ag-grid-angular.tree .ag-row div[col-id=ag-Grid-AutoColumn]{padding-left:0}dato-grid-v2 ag-grid-angular.tree .ag-row .ag-cell{display:flex;align-items:center}dato-grid-v2 ag-grid-angular.tree .ag-row .ag-cell .ag-group-value>span{display:inline-block;vertical-align:middle}dato-grid-v2 ag-grid-angular.tree .ag-row .ag-cell .initials{border-radius:50%;padding:4px;margin-right:8px;margin-left:20px;width:28px;height:28px;display:inline-block;text-align:center}dato-grid-v2 ag-grid-angular.tree .ag-row-group-leaf-indent{margin-left:0!important}dato-grid-v2 ag-grid-angular.tree .ag-selection-checkbox .ag-checkbox-input-wrapper.ag-indeterminate:before{text-align:center;content:\"-\";display:inline-block;position:absolute;top:0;left:0;right:0;bottom:0;line-height:.5;color:#fff}dato-grid-v2 ag-grid-angular.row-height-35 .ag-cell{line-height:33px}dato-grid-v2 ag-grid-angular.row-height-35 .ag-cell.dato-editable-cell{line-height:29px}dato-grid-v2 ag-grid-angular.row-height-35 .ag-cell.ag-cell-inline-editing{height:35px}dato-grid-v2 ag-grid-angular.row-height-44 .ag-cell{line-height:42px}dato-grid-v2 ag-grid-angular.row-height-44 .ag-cell.dato-editable-cell{line-height:38px}dato-grid-v2 ag-grid-angular.row-height-44 .ag-cell.ag-cell-inline-editing{height:44px}dato-grid-v2 ag-grid-angular.row-height-50 .ag-cell{line-height:48px}dato-grid-v2 ag-grid-angular.row-height-50 .ag-cell.dato-editable-cell{line-height:44px}dato-grid-v2 ag-grid-angular.row-height-50 .ag-cell.ag-cell-inline-editing{height:50px}dato-grid-v2 ag-grid-angular.row-height-59 .ag-cell{line-height:57px}dato-grid-v2 ag-grid-angular.row-height-59 .ag-cell.dato-editable-cell{line-height:53px}dato-grid-v2 ag-grid-angular.row-height-59 .ag-cell.ag-cell-inline-editing{height:59px}dato-grid-v2 ag-grid-angular .ag-cell.checkbox-selection-cell{display:flex;padding-right:0}dato-grid-v2 .ag-menu .da-grid-icon svg{vertical-align:middle}dato-grid-v2 .ag-header-cell-sortable .ag-sort-none-icon{opacity:0;transition:opacity .2s}dato-grid-v2 .ag-header-cell-sortable:hover .ag-sort-none-icon{opacity:1}dato-grid-v2 .group-contracted-icon,dato-grid-v2 .group-expanded-icon{width:7px}dato-grid-v2 .group-expanded-icon{transform:rotate(90deg)}dato-grid-v2 .dato-grid .ag-cell{border-top:0;border-bottom:0}dato-grid-v2 .ag-overlay-wrapper ng-component{display:flex}.ag-dnd-ghost{min-width:100px;border:none;display:flex;justify-content:flex-start;align-content:center;align-items:center;cursor:-webkit-grabbing;cursor:grabbing;z-index:10000000}.ag-dnd-ghost .da-grid-icon.column-move-hide svg{height:18px;width:18px}.ag-dnd-ghost .da-grid-icon.column-move svg,.ag-dnd-ghost .da-grid-icon.column-move-pin svg{height:16px;width:16px}"]
14412
14489
  }),
14413
14490
  __metadata("design:paramtypes", [DatoGridControllerComponent, ElementRef])
14414
14491
  ], DatoGridV2Component);
@@ -14590,7 +14667,8 @@ let DatoGridHeaderV2Component = class DatoGridHeaderV2Component {
14590
14667
  this.displayRowCount = true;
14591
14668
  }
14592
14669
  get enableBackground() {
14593
- return this.controller.gridOptions.enableBackground;
14670
+ const { gridOptions } = this.controller;
14671
+ return gridOptions ? gridOptions.enableBackground : false;
14594
14672
  }
14595
14673
  ngOnInit() {
14596
14674
  this.rowCount$ = this.gridQuery.gridReady$.pipe(switchMap(() => this.rowsCount()));
@@ -15032,6 +15110,7 @@ let DatoGridV2ToolbarComponent = class DatoGridV2ToolbarComponent {
15032
15110
  this.gridService = gridService;
15033
15111
  this.MAX_VISIBLE_ROW_ACTIONS = 5;
15034
15112
  this.MAX_VISIBLE_GRID_ACTIONS = 2;
15113
+ this.destroy$ = new Subject();
15035
15114
  this._maxRowActions = this.MAX_VISIBLE_ROW_ACTIONS;
15036
15115
  this.displayExport = true;
15037
15116
  this.rowActions = { mainList: [], moreMenu: [] };
@@ -15064,13 +15143,16 @@ let DatoGridV2ToolbarComponent = class DatoGridV2ToolbarComponent {
15064
15143
  }
15065
15144
  }
15066
15145
  get enableV2_1() {
15067
- return this.gridController.gridOptions.enableV2_1;
15146
+ const { gridOptions } = this.gridController;
15147
+ return gridOptions ? gridOptions.enableV2_1 : false;
15068
15148
  }
15069
15149
  get enableSearch() {
15070
- return this.gridController.gridOptions.enableSearch;
15150
+ const { gridOptions } = this.gridController;
15151
+ return gridOptions ? gridOptions.enableSearch : false;
15071
15152
  }
15072
15153
  get enableBackground() {
15073
- return this.gridController.gridOptions.enableBackground;
15154
+ const { gridOptions } = this.gridController;
15155
+ return gridOptions ? gridOptions.enableBackground : false;
15074
15156
  }
15075
15157
  get isRowActionsVisible() {
15076
15158
  return !this.enableV2_1 || (this.enableV2_1 && this.isSelectedRow);
@@ -15088,16 +15170,16 @@ let DatoGridV2ToolbarComponent = class DatoGridV2ToolbarComponent {
15088
15170
  return this.gridController.gridQuery.api;
15089
15171
  }
15090
15172
  ngOnInit() {
15091
- const dataChanges = this.gridController.gridQuery.waitForGrid(() => merge$1(this.gridQuery.gridRef.cellValueChanged, this.gridQuery.gridRef.rowDataUpdated, this.gridQuery.rowActionVisibilityChanged$).pipe(debounceTime(100), untilDestroyed(this)));
15173
+ const dataChanges = this.gridController.gridQuery.waitForGrid(() => merge$1(this.gridQuery.gridRef.cellValueChanged, this.gridQuery.gridRef.rowDataUpdated, this.gridQuery.rowActionVisibilityChanged$).pipe(debounceTime(100), takeUntil(this.destroy$)));
15092
15174
  const gridInit = this.gridQuery.gridReady$.pipe(take(1));
15093
- gridInit.pipe(untilDestroyed(this)).subscribe(() => {
15175
+ gridInit.pipe(takeUntil(this.destroy$)).subscribe(() => {
15094
15176
  this.groupsAllowed = !this.hideGrouping && !this.gridQuery.getValue().serverSidePagination.enabled;
15095
15177
  });
15096
15178
  this.initGridActions();
15097
15179
  const selectedRowsChanged$ = this.gridQuery.selectedRowsChange$;
15098
15180
  const isSelectAllRowsChanged$ = this.gridQuery.selectIsSelectAllRowsEnabled();
15099
15181
  merge$1(dataChanges, gridInit, selectedRowsChanged$, isSelectAllRowsChanged$)
15100
- .pipe(filter$1(() => !!this.api), untilDestroyed(this))
15182
+ .pipe(filter$1(() => !!this.api), takeUntil(this.destroy$))
15101
15183
  .subscribe(() => {
15102
15184
  this.resolveVisibleActions();
15103
15185
  this.cdr.detectChanges();
@@ -15259,7 +15341,7 @@ let DatoGridV2ToolbarComponent = class DatoGridV2ToolbarComponent {
15259
15341
  const waitForAnimation = this.hasGroups ? 0 : 200;
15260
15342
  /** When changing the tables grouping all the rows are automatically expanded, we need to update the icon state */
15261
15343
  const expandSubscription = this.gridQuery.gridRef.columnRowGroupChanged
15262
- .pipe(take(1), untilDestroyed(this))
15344
+ .pipe(take(1), takeUntil(this.destroy$))
15263
15345
  .subscribe(() => {
15264
15346
  this.rowGroupsCollapsed = false;
15265
15347
  this.cdr.detectChanges();
@@ -15276,7 +15358,7 @@ let DatoGridV2ToolbarComponent = class DatoGridV2ToolbarComponent {
15276
15358
  gridService: this.gridService
15277
15359
  }
15278
15360
  })
15279
- .pipe(untilDestroyed(this))
15361
+ .pipe(takeUntil(this.destroy$))
15280
15362
  .subscribe(() => {
15281
15363
  expandSubscription.unsubscribe();
15282
15364
  this.openMenus.group = false;
@@ -15293,7 +15375,10 @@ let DatoGridV2ToolbarComponent = class DatoGridV2ToolbarComponent {
15293
15375
  clearSelectedRows() {
15294
15376
  this.gridService.deselectAllRows();
15295
15377
  }
15296
- ngOnDestroy() { }
15378
+ ngOnDestroy() {
15379
+ this.destroy$.next();
15380
+ this.destroy$.complete();
15381
+ }
15297
15382
  getCollapseState({ node, api }) {
15298
15383
  let collapsed = true;
15299
15384
  if (node.rowGroupIndex === 0) {
@@ -15309,7 +15394,7 @@ let DatoGridV2ToolbarComponent = class DatoGridV2ToolbarComponent {
15309
15394
  /** Listen to adding or removing row groups from the columns and not the groups menu */
15310
15395
  this.gridQuery
15311
15396
  .waitForGrid(() => this.gridQuery.gridRef.columnRowGroupChanged)
15312
- .pipe(filter$1(() => !this.openMenus.group), untilDestroyed(this))
15397
+ .pipe(filter$1(() => !this.openMenus.group), takeUntil(this.destroy$))
15313
15398
  .subscribe(() => {
15314
15399
  this.rowGroupsCollapsed = false;
15315
15400
  this.cdr.detectChanges();
@@ -15317,7 +15402,7 @@ let DatoGridV2ToolbarComponent = class DatoGridV2ToolbarComponent {
15317
15402
  /** Listen to row collapse state to update the icon */
15318
15403
  this.gridQuery
15319
15404
  .waitForGrid(() => this.gridQuery.gridRef.rowGroupOpened)
15320
- .pipe(untilDestroyed(this))
15405
+ .pipe(takeUntil(this.destroy$))
15321
15406
  .subscribe((event) => {
15322
15407
  const collapsed = this.getCollapseState(event);
15323
15408
  if (collapsed !== this.rowGroupsCollapsed) {
@@ -15328,7 +15413,7 @@ let DatoGridV2ToolbarComponent = class DatoGridV2ToolbarComponent {
15328
15413
  }
15329
15414
  subscribeRowsSelectionData() {
15330
15415
  this.gridQuery.rowsSelectionData$
15331
- .pipe(untilDestroyed(this))
15416
+ .pipe(takeUntil(this.destroy$))
15332
15417
  .subscribe(({ totalRowsCount, selectedRowsCount, selectedPageRowsCount, isAllPageRowsSelected }) => {
15333
15418
  this.totalRowsCount = totalRowsCount;
15334
15419
  this.selectedRowsCount = selectedRowsCount;
@@ -22973,7 +23058,7 @@ function fixNgLeaks() {
22973
23058
  };
22974
23059
  }
22975
23060
 
22976
- window.coreVersion = '22.15.0';
23061
+ window.coreVersion = '22.15.2';
22977
23062
 
22978
23063
  /**
22979
23064
  * @license