@progress/kendo-angular-pivotgrid 1.0.3-dev.202210121054 → 1.1.0-dev.202210240946

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.
@@ -7,7 +7,7 @@ import { EventEmitter, Injectable, Output, Component, HostBinding, Input, Direct
7
7
  import { validatePackage } from '@progress/kendo-licensing';
8
8
  import * as i3 from '@progress/kendo-angular-common';
9
9
  import { isDocumentAvailable, PreventableEvent, Keys, isChanged, hasObservers, anyChanged, EventsModule, DraggableModule } from '@progress/kendo-angular-common';
10
- import { toTree, toRows, toColumns, toData, configuratorReducer, PIVOT_CONFIGURATOR_ACTION, PivotGridNavigation, HEADERS_ACTION, headersReducer, createFlatSchemaDimensions, createDataTree, createLocalDataState, rootFields, fetchData, createDataState, fetchDiscover, addKPI, buildKPIMeasures } from '@progress/kendo-pivotgrid-common';
10
+ import { toTree, toRows, toColumns, toData, configuratorReducer, PIVOT_CONFIGURATOR_ACTION, PivotGridNavigation, ConfiguratorNavigation, HEADERS_ACTION, headersReducer, createFlatSchemaDimensions, createDataTree, createLocalDataState, rootFields, fetchData, createDataState, fetchDiscover, addKPI, buildKPIMeasures } from '@progress/kendo-pivotgrid-common';
11
11
  export { averageAggregate, maxAggregate, minAggregate, sumAggregate } from '@progress/kendo-pivotgrid-common';
12
12
  import { BehaviorSubject, Subscription, Subject, from, of, fromEvent } from 'rxjs';
13
13
  import { take, mergeMap, merge } from 'rxjs/operators';
@@ -17,9 +17,9 @@ import * as i7 from '@angular/common';
17
17
  import { CommonModule } from '@angular/common';
18
18
  import * as i5$1 from '@progress/kendo-angular-indicators';
19
19
  import { IndicatorsModule } from '@progress/kendo-angular-indicators';
20
- import * as i1$1 from '@progress/kendo-angular-popup';
21
20
  import * as i4 from '@progress/kendo-angular-treeview';
22
- import { TreeViewModule } from '@progress/kendo-angular-treeview';
21
+ import { TreeViewComponent, TreeViewModule } from '@progress/kendo-angular-treeview';
22
+ import * as i1$1 from '@progress/kendo-angular-popup';
23
23
  import * as i5 from '@progress/kendo-angular-buttons';
24
24
  import { ButtonsModule } from '@progress/kendo-angular-buttons';
25
25
  import { trigger, state, style, transition, animate } from '@angular/animations';
@@ -38,7 +38,7 @@ const packageMetadata = {
38
38
  name: '@progress/kendo-angular-pivotgrid',
39
39
  productName: 'Kendo UI for Angular',
40
40
  productCodes: ['KENDOUIANGULAR', 'KENDOUICOMPLETE'],
41
- publishDate: 1665572006,
41
+ publishDate: 1666604767,
42
42
  version: '',
43
43
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/?utm_medium=product&utm_source=kendoangular&utm_campaign=kendo-ui-angular-purchase-license-keys-warning'
44
44
  };
@@ -221,6 +221,14 @@ function cloneValue(value, nextValue) {
221
221
  function cloneArray(array) {
222
222
  return array.map(value => cloneValue(value, undefined));
223
223
  }
224
+ /**
225
+ * @hidden
226
+ */
227
+ const swapItems = (arr, i1, i2) => {
228
+ let temp = arr[i1];
229
+ arr[i1] = arr[i2];
230
+ arr[i2] = temp;
231
+ };
224
232
 
225
233
  /**
226
234
  * @hidden
@@ -1593,7 +1601,7 @@ class ChipMenuComponent {
1593
1601
  close() {
1594
1602
  this.popupService.destroy();
1595
1603
  this.popupRef = null;
1596
- this.anchor.nativeElement.focus();
1604
+ this.anchor.nativeElement.closest('.k-chip').focus();
1597
1605
  }
1598
1606
  get chipMenuTitle() {
1599
1607
  const localizationMsg = this.localization.get('chipMenuIconTitle') || '';
@@ -1946,19 +1954,73 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
1946
1954
  type: Input
1947
1955
  }] } });
1948
1956
 
1957
+ /**
1958
+ * @hidden
1959
+ */
1960
+ class ChipKeyboardNavigationDirective {
1961
+ constructor(host, renderer, ngZone) {
1962
+ this.host = host;
1963
+ this.renderer = renderer;
1964
+ this.ngZone = ngZone;
1965
+ this.keydownSub = new Subscription();
1966
+ this.reorder = new EventEmitter();
1967
+ }
1968
+ ngOnInit() {
1969
+ const chipElement = this.host.element.nativeElement;
1970
+ this.ngZone.runOutsideAngular(() => {
1971
+ this.keydownSub.add(this.renderer.listen(chipElement, 'keydown', (ev) => {
1972
+ const isAltDown = ev.keyCode === Keys.ArrowDown && ev.altKey;
1973
+ const menuIcon = this.host.element.nativeElement.querySelector('.k-i-more-vertical');
1974
+ const shiftAndMeta = ev.shiftKey && ev.metaKey;
1975
+ const isArrow = [Keys.ArrowLeft, Keys.ArrowRight, Keys.ArrowDown, Keys.ArrowUp].includes(ev.keyCode);
1976
+ const isReorderAction = shiftAndMeta && isArrow;
1977
+ if (isAltDown && menuIcon) {
1978
+ menuIcon.click();
1979
+ }
1980
+ else if (isReorderAction) {
1981
+ const direction = {
1982
+ [Keys.ArrowDown]: 'down',
1983
+ [Keys.ArrowUp]: 'up',
1984
+ [Keys.ArrowRight]: 'right',
1985
+ [Keys.ArrowLeft]: 'left'
1986
+ }[ev.keyCode];
1987
+ this.reorder.emit({
1988
+ direction,
1989
+ sender: this.host
1990
+ });
1991
+ }
1992
+ }));
1993
+ });
1994
+ }
1995
+ ngOnDestroy() {
1996
+ this.keydownSub.unsubscribe();
1997
+ }
1998
+ }
1999
+ ChipKeyboardNavigationDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: ChipKeyboardNavigationDirective, deps: [{ token: i5.ChipComponent }, { token: i0.Renderer2 }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive });
2000
+ ChipKeyboardNavigationDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.16", type: ChipKeyboardNavigationDirective, selector: "[kendoChipKeyboardNavigation]", outputs: { reorder: "reorder" }, ngImport: i0 });
2001
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: ChipKeyboardNavigationDirective, decorators: [{
2002
+ type: Directive,
2003
+ args: [{ selector: '[kendoChipKeyboardNavigation]' }]
2004
+ }], ctorParameters: function () { return [{ type: i5.ChipComponent }, { type: i0.Renderer2 }, { type: i0.NgZone }]; }, propDecorators: { reorder: [{
2005
+ type: Output
2006
+ }] } });
2007
+
1949
2008
  /**
1950
2009
  * @hidden
1951
2010
  * Represents the Kendo UI PivotGrid Configurator component for Angular.
1952
2011
  */
1953
2012
  class PivotGridConfiguratorComponent {
1954
- constructor(dataService, localization, configuratorService, cdr) {
2013
+ constructor(dataService, localization, configuratorService, cdr, zone) {
1955
2014
  this.dataService = dataService;
1956
2015
  this.localization = localization;
1957
2016
  this.configuratorService = configuratorService;
1958
2017
  this.cdr = cdr;
2018
+ this.zone = zone;
1959
2019
  this.hostClass = true;
2020
+ this.hostAriaRole = 'dialog';
1960
2021
  this.orientation = 'vertical';
1961
2022
  this.sort = new Array();
2023
+ this.close = new EventEmitter();
1962
2024
  this.checked = [];
1963
2025
  this.subs = new Subscription();
1964
2026
  /**
@@ -1976,6 +2038,9 @@ class PivotGridConfiguratorComponent {
1976
2038
  return of(node.children);
1977
2039
  };
1978
2040
  }
2041
+ get headerTextId() {
2042
+ return `k-pivotgrid-${this.dataService.pivotGridId}-configurator-header`;
2043
+ }
1979
2044
  get isHorizontal() {
1980
2045
  return this.orientation === 'horizontal';
1981
2046
  }
@@ -2004,6 +2069,9 @@ class PivotGridConfiguratorComponent {
2004
2069
  this.cdr.detectChanges();
2005
2070
  }));
2006
2071
  }
2072
+ ngAfterViewInit() {
2073
+ this.treeView.focus();
2074
+ }
2007
2075
  ngOnDestroy() {
2008
2076
  this.subs.unsubscribe();
2009
2077
  }
@@ -2015,6 +2083,9 @@ class PivotGridConfiguratorComponent {
2015
2083
  getName(name) {
2016
2084
  return name.toString();
2017
2085
  }
2086
+ contentLabelId(section) {
2087
+ return `k-pivotgrid-${this.dataService.pivotGridId}-configurator-${section}`;
2088
+ }
2018
2089
  setState(state) {
2019
2090
  this.dataService.state = {
2020
2091
  columnAxes: state.columnAxes,
@@ -2025,6 +2096,35 @@ class PivotGridConfiguratorComponent {
2025
2096
  };
2026
2097
  this.state = this.configuratorService.state = state;
2027
2098
  }
2099
+ onReorder(ev, name, item) {
2100
+ const currentCollection = this.state[`${name}Axes`];
2101
+ const itemIndex = currentCollection.indexOf(item);
2102
+ switch (ev.direction) {
2103
+ case 'right':
2104
+ if (itemIndex !== currentCollection.length - 1) {
2105
+ this.swapChips(currentCollection, itemIndex, ev.direction, name);
2106
+ }
2107
+ break;
2108
+ case 'left':
2109
+ if (itemIndex !== 0) {
2110
+ this.swapChips(currentCollection, itemIndex, ev.direction, name);
2111
+ ev.sender.focus();
2112
+ }
2113
+ break;
2114
+ case 'up':
2115
+ if (name === 'row') {
2116
+ this.moveChip(currentCollection, item, itemIndex, name);
2117
+ }
2118
+ break;
2119
+ case 'down':
2120
+ if (name === 'column') {
2121
+ this.moveChip(currentCollection, item, itemIndex, name);
2122
+ }
2123
+ break;
2124
+ default:
2125
+ break;
2126
+ }
2127
+ }
2028
2128
  /**
2029
2129
  * Returns the localized message for a given token
2030
2130
  */
@@ -2056,12 +2156,18 @@ class PivotGridConfiguratorComponent {
2056
2156
  * Updates the respective axis configuration of the current state
2057
2157
  * when a chip is deleted from the UI
2058
2158
  */
2059
- onChipRemove(item, section) {
2159
+ onChipRemove(ev, item, section) {
2060
2160
  const filteredItems = this.dataService.state[`${section}Axes`].filter(descriptor => descriptor !== item);
2061
2161
  this.dataService.state[`${section}Axes`] = filteredItems;
2062
2162
  const newState = Object.assign(Object.assign({}, this.state), this.dataService.state);
2063
2163
  this.checked = this.checked.filter(checkedItem => checkedItem.uniqueName !== item.name[0]);
2064
2164
  this.setState(newState);
2165
+ if (!this.navigation) {
2166
+ return;
2167
+ }
2168
+ ;
2169
+ const targetIndex = this.navigation.elements.indexOf(ev.sender.element.nativeElement);
2170
+ this.zone.runOutsideAngular(() => setTimeout(() => this.navigation.focusElement(this.navigation.elements[targetIndex - 1], this.navigation.elements[targetIndex])));
2065
2171
  }
2066
2172
  /**
2067
2173
  * Constructs an array with all selected fields.
@@ -2121,6 +2227,19 @@ class PivotGridConfiguratorComponent {
2121
2227
  payload: item
2122
2228
  };
2123
2229
  this.configuratorService.parseConfiguratorState(action);
2230
+ const closestItem = event.target.closest('.k-treeview-item');
2231
+ this.zone.runOutsideAngular(() => setTimeout(() => closestItem.focus()));
2232
+ }
2233
+ onTreeViewSelect(ev) {
2234
+ var _a;
2235
+ const closestItem = ev.target.closest('.k-treeview-item');
2236
+ if (closestItem) {
2237
+ (_a = closestItem.querySelector('.k-checkbox')) === null || _a === void 0 ? void 0 : _a.click();
2238
+ }
2239
+ }
2240
+ onTreeViewEscape(ev) {
2241
+ ev.stopImmediatePropagation();
2242
+ this.close.emit();
2124
2243
  }
2125
2244
  handleSubmit() {
2126
2245
  this.dataService.configuratorFieldChange.emit(this.dataService.state);
@@ -2153,13 +2272,40 @@ class PivotGridConfiguratorComponent {
2153
2272
  return Array.from(result);
2154
2273
  }
2155
2274
  ;
2275
+ /**
2276
+ * Swaps chips within the same ChipList
2277
+ */
2278
+ swapChips(collection, itemIndex, direction, name) {
2279
+ const targetIndex = itemIndex + (direction === 'right' ? 1 : -1);
2280
+ swapItems(collection, itemIndex, targetIndex);
2281
+ this.dataService.state[`${name}Axes`] = collection;
2282
+ const newState = Object.assign(Object.assign({}, this.state), this.dataService.state);
2283
+ this.setState(newState);
2284
+ this.cdr.detectChanges();
2285
+ }
2286
+ /**
2287
+ * Moves a chip from one ChipList to another
2288
+ */
2289
+ moveChip(collection, item, itemIndex, name) {
2290
+ var _a;
2291
+ collection.splice(itemIndex, 1);
2292
+ const targetCollectionName = name === 'row' ? 'column' : 'row';
2293
+ const axes = this.state[`${targetCollectionName}Axes`];
2294
+ axes.push(item);
2295
+ this.dataService.state[`${name}Axes`] = collection;
2296
+ this.dataService.state[targetCollectionName] = axes;
2297
+ const newState = Object.assign(Object.assign({}, this.state), this.dataService.state);
2298
+ this.setState(newState);
2299
+ this.cdr.detectChanges();
2300
+ (_a = this[`${targetCollectionName}sList`]) === null || _a === void 0 ? void 0 : _a.chips.last.focus();
2301
+ }
2156
2302
  }
2157
- PivotGridConfiguratorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: PivotGridConfiguratorComponent, deps: [{ token: PivotGridDataService }, { token: i1.LocalizationService }, { token: ConfiguratorService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
2158
- PivotGridConfiguratorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: PivotGridConfiguratorComponent, selector: "kendo-pivotgrid-configurator", inputs: { orientation: "orientation", sort: "sort", filter: "filter" }, host: { properties: { "class.k-pivotgrid-configurator": "this.hostClass" } }, providers: [
2303
+ PivotGridConfiguratorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: PivotGridConfiguratorComponent, deps: [{ token: PivotGridDataService }, { token: i1.LocalizationService }, { token: ConfiguratorService }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
2304
+ PivotGridConfiguratorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: PivotGridConfiguratorComponent, selector: "kendo-pivotgrid-configurator", inputs: { orientation: "orientation", sort: "sort", filter: "filter", navigation: "navigation" }, outputs: { close: "close" }, host: { properties: { "class.k-pivotgrid-configurator": "this.hostClass", "attr.role": "this.hostAriaRole", "attr.aria-labelledby": "this.headerTextId" } }, providers: [
2159
2305
  ConfiguratorService,
2160
2306
  DropCueService,
2161
2307
  SinglePopupService
2162
- ], usesOnChanges: true, ngImport: i0, template: `
2308
+ ], viewQueries: [{ propertyName: "treeView", first: true, predicate: TreeViewComponent, descendants: true }, { propertyName: "columnsList", first: true, predicate: ["columnsChiplist"], descendants: true }, { propertyName: "rowsList", first: true, predicate: ["rowsChiplist"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
2163
2309
  <div
2164
2310
  class="k-pivotgrid-configurator-panel k-pivotgrid-configurator-push"
2165
2311
  [ngClass]="{
@@ -2168,31 +2314,36 @@ PivotGridConfiguratorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
2168
2314
  }"
2169
2315
  >
2170
2316
  <div class="k-pivotgrid-configurator-header">
2171
- <div class="k-pivotgrid-configurator-header-text">{{messageFor('configuratorHeaderText')}}</div>
2317
+ <div
2318
+ [id]="headerTextId"
2319
+ class="k-pivotgrid-configurator-header-text">{{messageFor('configuratorHeaderText')}}</div>
2172
2320
  </div>
2173
2321
 
2174
2322
  <div class="k-pivotgrid-configurator-content">
2175
2323
  <div class="k-form" [class.k-form-horizontal]="isHorizontal">
2176
2324
  <div class="k-form-field-wrapper">
2177
2325
  <div class="k-form-field">
2178
- <span class="k-label">{{messageFor('configuratorFieldsText')}}</span>
2326
+ <span [id]="contentLabelId('fields')" class="k-label">{{messageFor('configuratorFieldsText')}}</span>
2179
2327
  </div>
2180
-
2181
2328
  <div class="k-form-field">
2182
2329
  <div class="k-fields-list-wrapper">
2183
2330
  <kendo-treeview
2331
+ #treeview
2332
+ [attr.aria-labelledby]="headerTextId + ' ' + contentLabelId('fields')"
2333
+ (focus)="treeview.focus()"
2184
2334
  [nodes]="fields"
2185
2335
  textField="caption"
2186
2336
  [children]="children"
2187
2337
  [hasChildren]="hasChildren"
2188
2338
  kendoTreeViewExpandable
2189
2339
  (childrenLoaded)="handleChildrenLoaded($event)"
2190
- >
2340
+ (keydown.space)="onTreeViewSelect($event)">
2191
2341
  <ng-template kendoTreeViewNodeTemplate let-dataItem>
2192
2342
  <input kendoCheckBox
2193
2343
  *ngIf="isSelectable(dataItem)"
2194
2344
  type="checkbox"
2195
2345
  kendoCheckBox
2346
+ tabindex="-1"
2196
2347
  [checked]="isItemChecked(dataItem)"
2197
2348
  (change)="handleCheckedChange($event, dataItem)"/>
2198
2349
  {{ dataItem.caption }}
@@ -2209,24 +2360,28 @@ PivotGridConfiguratorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
2209
2360
 
2210
2361
  <ng-template #verticalTemplate>
2211
2362
  <div class="k-form-field" kendoDropTarget axes="columnAxes">
2212
- <span class="k-label">{{messageFor('configuratorColumnsText')}}</span>
2363
+ <span [id]="contentLabelId('columns')" class="k-label">{{messageFor('configuratorColumnsText')}}</span>
2213
2364
  </div>
2214
2365
 
2215
2366
  <kendo-chiplist
2216
2367
  *ngIf="state.columnAxes && state.columnAxes.length; else noColumnAxes"
2368
+ #columnsChiplist
2217
2369
  kendoDropTarget
2218
2370
  axes="columnAxes"
2371
+ [attr.aria-labelledby]="headerTextId + ' ' + contentLabelId('columns')"
2219
2372
  >
2220
2373
  <ng-container *ngFor="let item of state.columnAxes">
2221
2374
  <kendo-chip *ngIf="item.name.length === 1"
2222
2375
  kendoChipDraggable
2223
2376
  kendoDraggable
2224
2377
  kendoDropTarget
2378
+ kendoChipKeyboardNavigation
2225
2379
  [item]="item"
2226
2380
  axes="columnAxes"
2227
2381
  rounded="full"
2228
2382
  [removable]="true"
2229
- (remove)="onChipRemove(item, 'column')"
2383
+ (remove)="onChipRemove($event, item, 'column')"
2384
+ (reorder)="onReorder($event, 'column', item)"
2230
2385
  >{{ getName(item.name) }}
2231
2386
  <kendo-pivot-chip-menu
2232
2387
  [chip]="item">
@@ -2240,24 +2395,28 @@ PivotGridConfiguratorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
2240
2395
  </ng-template>
2241
2396
 
2242
2397
  <div class="k-form-field" kendoDropTarget axes="rowAxes">
2243
- <span class="k-label">{{messageFor('configuratorRowsText')}}</span>
2398
+ <span [id]="contentLabelId('rows')" class="k-label">{{messageFor('configuratorRowsText')}}</span>
2244
2399
  </div>
2245
2400
 
2246
2401
  <kendo-chiplist
2247
2402
  *ngIf="state.rowAxes && state.rowAxes.length; else noRowAxes"
2403
+ #rowsChiplist
2248
2404
  kendoDropTarget
2249
2405
  axes="rowAxes"
2406
+ [attr.aria-labelledby]="headerTextId + ' ' + contentLabelId('rows')"
2250
2407
  >
2251
2408
  <ng-container *ngFor="let item of state.rowAxes">
2252
2409
  <kendo-chip *ngIf="item.name.length === 1"
2253
2410
  kendoChipDraggable
2254
2411
  kendoDraggable
2255
2412
  kendoDropTarget
2413
+ kendoChipKeyboardNavigation
2256
2414
  [item]="item"
2257
2415
  axes="rowAxes"
2258
2416
  rounded="full"
2259
2417
  [removable]="true"
2260
- (remove)="onChipRemove(item, 'row')"
2418
+ (remove)="onChipRemove($event, item, 'row')"
2419
+ (reorder)="onReorder($event, 'row', item)"
2261
2420
  >
2262
2421
  {{ getName(item.name) }}
2263
2422
 
@@ -2279,23 +2438,26 @@ PivotGridConfiguratorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
2279
2438
 
2280
2439
  <ng-template #verticalMeasuresTemplate>
2281
2440
  <div class="k-form-field" kendoDropTarget axes="measureAxes">
2282
- <span class="k-label">{{messageFor('configuratorValuesText')}}</span>
2441
+ <span [id]="contentLabelId('values')" class="k-label">{{messageFor('configuratorValuesText')}}</span>
2283
2442
  </div>
2284
2443
 
2285
2444
  <kendo-chiplist
2286
2445
  *ngIf="state.measureAxes && state.measureAxes.length; else noMeasureAxes"
2287
2446
  kendoDropTarget
2288
2447
  axes="measureAxes"
2448
+ [attr.aria-labelledby]="headerTextId + ' ' + contentLabelId('values')"
2289
2449
  >
2290
2450
  <kendo-chip *ngFor="let item of state.measureAxes"
2291
2451
  kendoChipDraggable
2292
2452
  kendoDraggable
2293
2453
  kendoDropTarget
2454
+ kendoChipKeyboardNavigation
2294
2455
  [item]="item"
2295
2456
  axes="measureAxes"
2296
2457
  rounded="full"
2297
2458
  [removable]="true"
2298
- (remove)="onChipRemove(item, 'measure')"
2459
+ (remove)="onChipRemove($event, item, 'measure')"
2460
+ (reorder)="onReorder($event, 'measure', item)"
2299
2461
  >
2300
2462
  {{ getName(item.name) }}
2301
2463
  </kendo-chip>
@@ -2313,7 +2475,7 @@ PivotGridConfiguratorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
2313
2475
  <button kendoButton themeColor="primary" type="button" (click)="handleSubmit()">{{messageFor('configuratorApplyButtonText')}}</button>
2314
2476
  </div>
2315
2477
  </div>
2316
- `, isInline: true, styles: ["\n .k-form .k-chip-list {\n width: 100%;\n }\n\n .k-form .k-form-field,\n .k-form .k-settings-description {\n padding-top: 1em;\n margin-top: 0;\n }\n\n .k-form.k-form-horizontal .k-form-field,\n .k-form.k-form-horizontal .k-chip-list {\n padding-top: 0;\n padding-left: 16px;\n }\n\n .k-form.k-form-horizontal .k-form-field-wrapper {\n padding-left: 0;\n }\n "], components: [{ type: i4.TreeViewComponent, selector: "kendo-treeview", inputs: ["filterInputPlaceholder", "expandDisabledNodes", "animate", "nodeTemplate", "loadMoreButtonTemplate", "trackBy", "nodes", "textField", "hasChildren", "isChecked", "isDisabled", "isExpanded", "isSelected", "isVisible", "navigable", "children", "loadOnDemand", "filterable", "filter", "size", "disableParentNodesOnly"], outputs: ["childrenLoaded", "blur", "focus", "expand", "collapse", "nodeDragStart", "nodeDrag", "filterStateChange", "nodeDrop", "nodeDragEnd", "addItem", "removeItem", "checkedChange", "selectionChange", "filterChange", "nodeClick", "nodeDblClick"], exportAs: ["kendoTreeView"] }, { type: i5.ChipListComponent, selector: "kendo-chiplist, kendo-chip-list", inputs: ["selection", "size"], outputs: ["selectedChange", "remove"] }, { type: i5.ChipComponent, selector: "kendo-chip", inputs: ["label", "icon", "iconClass", "avatarClass", "selected", "removable", "removeIcon", "disabled", "size", "rounded", "fillMode", "themeColor"], outputs: ["remove", "contentClick"] }, { type: ChipMenuComponent, selector: "kendo-pivot-chip-menu", inputs: ["chip", "tabIndex"] }], directives: [{ type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i4.ExpandDirective, selector: "[kendoTreeViewExpandable]", inputs: ["isExpanded", "expandBy", "expandOnFilter", "expandedKeys"], outputs: ["expandedKeysChange"] }, { type: i4.NodeTemplateDirective, selector: "[kendoTreeViewNodeTemplate]" }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.CheckBoxDirective, selector: "input[kendoCheckBox]", inputs: ["size", "rounded"] }, { type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: DropTargetDirective, selector: "[kendoDropTarget]", inputs: ["item", "axes"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: DraggableChipDirective, selector: "[kendoChipDraggable]", inputs: ["item"] }, { type: i3.DraggableDirective, selector: "[kendoDraggable]", inputs: ["enableDrag"], outputs: ["kendoPress", "kendoDrag", "kendoRelease"] }, { type: i5.ButtonDirective, selector: "button[kendoButton], span[kendoButton]", inputs: ["toggleable", "togglable", "selected", "tabIndex", "icon", "iconClass", "imageUrl", "disabled", "size", "rounded", "fillMode", "themeColor", "role", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }] });
2478
+ `, isInline: true, styles: ["\n .k-form .k-chip-list {\n width: 100%;\n }\n\n .k-form .k-form-field,\n .k-form .k-settings-description {\n padding-top: 1em;\n margin-top: 0;\n }\n\n .k-form.k-form-horizontal .k-form-field,\n .k-form.k-form-horizontal .k-chip-list {\n padding-top: 0;\n padding-left: 16px;\n }\n\n .k-form.k-form-horizontal .k-form-field-wrapper {\n padding-left: 0;\n }\n "], components: [{ type: i4.TreeViewComponent, selector: "kendo-treeview", inputs: ["filterInputPlaceholder", "expandDisabledNodes", "animate", "nodeTemplate", "loadMoreButtonTemplate", "trackBy", "nodes", "textField", "hasChildren", "isChecked", "isDisabled", "isExpanded", "isSelected", "isVisible", "navigable", "children", "loadOnDemand", "filterable", "filter", "size", "disableParentNodesOnly"], outputs: ["childrenLoaded", "blur", "focus", "expand", "collapse", "nodeDragStart", "nodeDrag", "filterStateChange", "nodeDrop", "nodeDragEnd", "addItem", "removeItem", "checkedChange", "selectionChange", "filterChange", "nodeClick", "nodeDblClick"], exportAs: ["kendoTreeView"] }, { type: i5.ChipListComponent, selector: "kendo-chiplist, kendo-chip-list", inputs: ["selection", "size"], outputs: ["selectedChange", "remove"] }, { type: i5.ChipComponent, selector: "kendo-chip", inputs: ["label", "icon", "iconClass", "avatarClass", "selected", "removable", "removeIcon", "disabled", "size", "rounded", "fillMode", "themeColor"], outputs: ["remove", "contentClick"] }, { type: ChipMenuComponent, selector: "kendo-pivot-chip-menu", inputs: ["chip", "tabIndex"] }], directives: [{ type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i4.ExpandDirective, selector: "[kendoTreeViewExpandable]", inputs: ["isExpanded", "expandBy", "expandOnFilter", "expandedKeys"], outputs: ["expandedKeysChange"] }, { type: i4.NodeTemplateDirective, selector: "[kendoTreeViewNodeTemplate]" }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.CheckBoxDirective, selector: "input[kendoCheckBox]", inputs: ["size", "rounded"] }, { type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: DropTargetDirective, selector: "[kendoDropTarget]", inputs: ["item", "axes"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: DraggableChipDirective, selector: "[kendoChipDraggable]", inputs: ["item"] }, { type: i3.DraggableDirective, selector: "[kendoDraggable]", inputs: ["enableDrag"], outputs: ["kendoPress", "kendoDrag", "kendoRelease"] }, { type: ChipKeyboardNavigationDirective, selector: "[kendoChipKeyboardNavigation]", outputs: ["reorder"] }, { type: i5.ButtonDirective, selector: "button[kendoButton], span[kendoButton]", inputs: ["toggleable", "togglable", "selected", "tabIndex", "icon", "iconClass", "imageUrl", "disabled", "size", "rounded", "fillMode", "themeColor", "role", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }] });
2317
2479
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: PivotGridConfiguratorComponent, decorators: [{
2318
2480
  type: Component,
2319
2481
  args: [{
@@ -2332,31 +2494,36 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
2332
2494
  }"
2333
2495
  >
2334
2496
  <div class="k-pivotgrid-configurator-header">
2335
- <div class="k-pivotgrid-configurator-header-text">{{messageFor('configuratorHeaderText')}}</div>
2497
+ <div
2498
+ [id]="headerTextId"
2499
+ class="k-pivotgrid-configurator-header-text">{{messageFor('configuratorHeaderText')}}</div>
2336
2500
  </div>
2337
2501
 
2338
2502
  <div class="k-pivotgrid-configurator-content">
2339
2503
  <div class="k-form" [class.k-form-horizontal]="isHorizontal">
2340
2504
  <div class="k-form-field-wrapper">
2341
2505
  <div class="k-form-field">
2342
- <span class="k-label">{{messageFor('configuratorFieldsText')}}</span>
2506
+ <span [id]="contentLabelId('fields')" class="k-label">{{messageFor('configuratorFieldsText')}}</span>
2343
2507
  </div>
2344
-
2345
2508
  <div class="k-form-field">
2346
2509
  <div class="k-fields-list-wrapper">
2347
2510
  <kendo-treeview
2511
+ #treeview
2512
+ [attr.aria-labelledby]="headerTextId + ' ' + contentLabelId('fields')"
2513
+ (focus)="treeview.focus()"
2348
2514
  [nodes]="fields"
2349
2515
  textField="caption"
2350
2516
  [children]="children"
2351
2517
  [hasChildren]="hasChildren"
2352
2518
  kendoTreeViewExpandable
2353
2519
  (childrenLoaded)="handleChildrenLoaded($event)"
2354
- >
2520
+ (keydown.space)="onTreeViewSelect($event)">
2355
2521
  <ng-template kendoTreeViewNodeTemplate let-dataItem>
2356
2522
  <input kendoCheckBox
2357
2523
  *ngIf="isSelectable(dataItem)"
2358
2524
  type="checkbox"
2359
2525
  kendoCheckBox
2526
+ tabindex="-1"
2360
2527
  [checked]="isItemChecked(dataItem)"
2361
2528
  (change)="handleCheckedChange($event, dataItem)"/>
2362
2529
  {{ dataItem.caption }}
@@ -2373,24 +2540,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
2373
2540
 
2374
2541
  <ng-template #verticalTemplate>
2375
2542
  <div class="k-form-field" kendoDropTarget axes="columnAxes">
2376
- <span class="k-label">{{messageFor('configuratorColumnsText')}}</span>
2543
+ <span [id]="contentLabelId('columns')" class="k-label">{{messageFor('configuratorColumnsText')}}</span>
2377
2544
  </div>
2378
2545
 
2379
2546
  <kendo-chiplist
2380
2547
  *ngIf="state.columnAxes && state.columnAxes.length; else noColumnAxes"
2548
+ #columnsChiplist
2381
2549
  kendoDropTarget
2382
2550
  axes="columnAxes"
2551
+ [attr.aria-labelledby]="headerTextId + ' ' + contentLabelId('columns')"
2383
2552
  >
2384
2553
  <ng-container *ngFor="let item of state.columnAxes">
2385
2554
  <kendo-chip *ngIf="item.name.length === 1"
2386
2555
  kendoChipDraggable
2387
2556
  kendoDraggable
2388
2557
  kendoDropTarget
2558
+ kendoChipKeyboardNavigation
2389
2559
  [item]="item"
2390
2560
  axes="columnAxes"
2391
2561
  rounded="full"
2392
2562
  [removable]="true"
2393
- (remove)="onChipRemove(item, 'column')"
2563
+ (remove)="onChipRemove($event, item, 'column')"
2564
+ (reorder)="onReorder($event, 'column', item)"
2394
2565
  >{{ getName(item.name) }}
2395
2566
  <kendo-pivot-chip-menu
2396
2567
  [chip]="item">
@@ -2404,24 +2575,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
2404
2575
  </ng-template>
2405
2576
 
2406
2577
  <div class="k-form-field" kendoDropTarget axes="rowAxes">
2407
- <span class="k-label">{{messageFor('configuratorRowsText')}}</span>
2578
+ <span [id]="contentLabelId('rows')" class="k-label">{{messageFor('configuratorRowsText')}}</span>
2408
2579
  </div>
2409
2580
 
2410
2581
  <kendo-chiplist
2411
2582
  *ngIf="state.rowAxes && state.rowAxes.length; else noRowAxes"
2583
+ #rowsChiplist
2412
2584
  kendoDropTarget
2413
2585
  axes="rowAxes"
2586
+ [attr.aria-labelledby]="headerTextId + ' ' + contentLabelId('rows')"
2414
2587
  >
2415
2588
  <ng-container *ngFor="let item of state.rowAxes">
2416
2589
  <kendo-chip *ngIf="item.name.length === 1"
2417
2590
  kendoChipDraggable
2418
2591
  kendoDraggable
2419
2592
  kendoDropTarget
2593
+ kendoChipKeyboardNavigation
2420
2594
  [item]="item"
2421
2595
  axes="rowAxes"
2422
2596
  rounded="full"
2423
2597
  [removable]="true"
2424
- (remove)="onChipRemove(item, 'row')"
2598
+ (remove)="onChipRemove($event, item, 'row')"
2599
+ (reorder)="onReorder($event, 'row', item)"
2425
2600
  >
2426
2601
  {{ getName(item.name) }}
2427
2602
 
@@ -2443,23 +2618,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
2443
2618
 
2444
2619
  <ng-template #verticalMeasuresTemplate>
2445
2620
  <div class="k-form-field" kendoDropTarget axes="measureAxes">
2446
- <span class="k-label">{{messageFor('configuratorValuesText')}}</span>
2621
+ <span [id]="contentLabelId('values')" class="k-label">{{messageFor('configuratorValuesText')}}</span>
2447
2622
  </div>
2448
2623
 
2449
2624
  <kendo-chiplist
2450
2625
  *ngIf="state.measureAxes && state.measureAxes.length; else noMeasureAxes"
2451
2626
  kendoDropTarget
2452
2627
  axes="measureAxes"
2628
+ [attr.aria-labelledby]="headerTextId + ' ' + contentLabelId('values')"
2453
2629
  >
2454
2630
  <kendo-chip *ngFor="let item of state.measureAxes"
2455
2631
  kendoChipDraggable
2456
2632
  kendoDraggable
2457
2633
  kendoDropTarget
2634
+ kendoChipKeyboardNavigation
2458
2635
  [item]="item"
2459
2636
  axes="measureAxes"
2460
2637
  rounded="full"
2461
2638
  [removable]="true"
2462
- (remove)="onChipRemove(item, 'measure')"
2639
+ (remove)="onChipRemove($event, item, 'measure')"
2640
+ (reorder)="onReorder($event, 'measure', item)"
2463
2641
  >
2464
2642
  {{ getName(item.name) }}
2465
2643
  </kendo-chip>
@@ -2500,15 +2678,34 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
2500
2678
  }
2501
2679
  `]
2502
2680
  }]
2503
- }], ctorParameters: function () { return [{ type: PivotGridDataService }, { type: i1.LocalizationService }, { type: ConfiguratorService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { hostClass: [{
2681
+ }], ctorParameters: function () { return [{ type: PivotGridDataService }, { type: i1.LocalizationService }, { type: ConfiguratorService }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }]; }, propDecorators: { hostClass: [{
2504
2682
  type: HostBinding,
2505
2683
  args: ['class.k-pivotgrid-configurator']
2684
+ }], hostAriaRole: [{
2685
+ type: HostBinding,
2686
+ args: ['attr.role']
2687
+ }], headerTextId: [{
2688
+ type: HostBinding,
2689
+ args: ['attr.aria-labelledby']
2506
2690
  }], orientation: [{
2507
2691
  type: Input
2508
2692
  }], sort: [{
2509
2693
  type: Input
2510
2694
  }], filter: [{
2511
2695
  type: Input
2696
+ }], navigation: [{
2697
+ type: Input
2698
+ }], close: [{
2699
+ type: Output
2700
+ }], treeView: [{
2701
+ type: ViewChild,
2702
+ args: [TreeViewComponent]
2703
+ }], columnsList: [{
2704
+ type: ViewChild,
2705
+ args: ['columnsChiplist']
2706
+ }], rowsList: [{
2707
+ type: ViewChild,
2708
+ args: ['rowsChiplist']
2512
2709
  }] } });
2513
2710
 
2514
2711
  /**
@@ -2676,7 +2873,7 @@ class PivotGridComponent {
2676
2873
  this.rtl = rtl;
2677
2874
  this.direction = this.rtl ? 'rtl' : 'ltr';
2678
2875
  }));
2679
- dataService.wrapper = hostEl.nativeElement;
2876
+ dataService.wrapper = this.hostEl.nativeElement;
2680
2877
  }
2681
2878
  get rightPositionClass() {
2682
2879
  var _a;
@@ -2769,10 +2966,32 @@ class PivotGridComponent {
2769
2966
  messageFor(localizationToken) {
2770
2967
  return this.localization.get(localizationToken);
2771
2968
  }
2969
+ /**
2970
+ * @hidden
2971
+ */
2972
+ toggleConfigurator() {
2973
+ this.showConfigurator = !this.showConfigurator;
2974
+ if (!this.navigable) {
2975
+ return;
2976
+ }
2977
+ if (this.showConfigurator) {
2978
+ this.zone.runOutsideAngular(() => setTimeout(() => this.initConfiguratorNavigation()));
2979
+ }
2980
+ else {
2981
+ this.stopConfiguratorNavigation();
2982
+ const el = this.navigation.current;
2983
+ if (el) {
2984
+ this.zone.runOutsideAngular(() => {
2985
+ setTimeout(() => this.navigation.focusElement(el, null));
2986
+ });
2987
+ }
2988
+ ;
2989
+ }
2990
+ }
2772
2991
  initNavigation() {
2773
2992
  this.stopNavigation();
2774
2993
  this.navigation = new PivotGridNavigation({ tabIndex: 0 });
2775
- this.navigation.start(this.hostEl.nativeElement);
2994
+ this.navigation.start(this.table.nativeElement);
2776
2995
  const firstCell = this.navigation.first;
2777
2996
  if (firstCell) {
2778
2997
  firstCell.setAttribute('tabindex', '0');
@@ -2793,6 +3012,21 @@ class PivotGridComponent {
2793
3012
  this.navigation.stop();
2794
3013
  }
2795
3014
  }
3015
+ initConfiguratorNavigation() {
3016
+ this.stopConfiguratorNavigation();
3017
+ this.configuratorNavigation = new ConfiguratorNavigation({ tabIndex: 0 });
3018
+ this.configuratorNavigation.start(this.configuratorWrapper.nativeElement);
3019
+ this.configuratorNavigation.first.setAttribute('tabindex', '0');
3020
+ }
3021
+ stopConfiguratorNavigation() {
3022
+ if (this.configuratorNavigation) {
3023
+ const lastFocusedEl = this.configuratorNavigation.elements.find(el => el.hasAttribute('tabindex'));
3024
+ if (lastFocusedEl) {
3025
+ this.renderer.removeAttribute(lastFocusedEl, 'tabindex');
3026
+ }
3027
+ this.configuratorNavigation.stop();
3028
+ }
3029
+ }
2796
3030
  }
2797
3031
  PivotGridComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: PivotGridComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: PivotGridDataService }, { token: i1.LocalizationService }, { token: i0.Renderer2 }, { token: i3.ScrollbarWidthService }], target: i0.ɵɵFactoryTarget.Component });
2798
3032
  PivotGridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: PivotGridComponent, selector: "kendo-pivotgrid", inputs: { loaderSettings: "loaderSettings", configurator: "configurator", columnHeadersWidth: "columnHeadersWidth", navigable: "navigable" }, host: { properties: { "class.k-d-flex": "this.hostClass", "class.k-pos-relative": "this.hostClass", "class.k-flex-row": "this.rightPositionClass", "class.k-flex-row-reverse": "this.leftPositionClass", "class.k-flex-column": "this.bottomPositionClass", "class.k-flex-column-reverse": "this.topPositionClass", "attr.dir": "this.dir", "attr.role": "this.ariaRole" } }, providers: [
@@ -2803,7 +3037,7 @@ PivotGridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", ver
2803
3037
  provide: L10N_PREFIX,
2804
3038
  useValue: 'kendo.pivotgrid'
2805
3039
  }
2806
- ], viewQueries: [{ propertyName: "colHeadersTable", first: true, predicate: ["colHeadersTable"], descendants: true, read: ElementRef }, { propertyName: "rowHeadersTable", first: true, predicate: ["rowHeadersTable"], descendants: true, read: ElementRef }, { propertyName: "valuesTable", first: true, predicate: ["valuesTable"], descendants: true, read: ElementRef }, { propertyName: "table", first: true, predicate: ["table"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: `
3040
+ ], viewQueries: [{ propertyName: "colHeadersTable", first: true, predicate: ["colHeadersTable"], descendants: true, read: ElementRef }, { propertyName: "rowHeadersTable", first: true, predicate: ["rowHeadersTable"], descendants: true, read: ElementRef }, { propertyName: "valuesTable", first: true, predicate: ["valuesTable"], descendants: true, read: ElementRef }, { propertyName: "table", first: true, predicate: ["table"], descendants: true, read: ElementRef }, { propertyName: "configuratorWrapper", first: true, predicate: ["configurator"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: `
2807
3041
  <ng-container kendoPivotGridLocalizedMessages
2808
3042
  i18n-loading="kendo.pivotgrid.loading|The loading text"
2809
3043
  loading="Loading"
@@ -2927,19 +3161,22 @@ PivotGridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", ver
2927
3161
  <span class="k-loading-text">{{ loadingText }}</span>
2928
3162
  </div>
2929
3163
  </div>
2930
-
2931
3164
  <kendo-pivotgrid-configurator
3165
+ #configurator
2932
3166
  *ngIf="showConfigurator"
2933
- [orientation]="configuratorSettings.orientation">
3167
+ [navigation]="configuratorNavigation"
3168
+ [orientation]="configuratorSettings.orientation"
3169
+ (close)="toggleConfigurator()">
2934
3170
  </kendo-pivotgrid-configurator>
2935
-
2936
3171
  <div *ngIf="configurator"
3172
+ #configuratorButton
2937
3173
  class="k-pivotgrid-configurator-button"
2938
- (click)="showConfigurator = !showConfigurator">
3174
+ aria-hidden="true"
3175
+ (click)="toggleConfigurator()">
2939
3176
  <span>{{messageFor('configuratorButtonText')}}<span class="k-icon k-i-gear k-color-inherit"></span>
2940
3177
  </span>
2941
3178
  </div>
2942
- `, isInline: true, styles: ["\n /** TODO: Remove if added to themes */\n div.k-loader {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n "], components: [{ type: PivotGridTableComponent, selector: "kendo-pivotgrid-table", inputs: ["tableType", "colWidth"] }, { type: i5$1.LoaderComponent, selector: "kendo-loader", inputs: ["type", "themeColor", "size"] }, { type: PivotGridConfiguratorComponent, selector: "kendo-pivotgrid-configurator", inputs: ["orientation", "sort", "filter"] }], directives: [{ type: LocalizedMessagesDirective, selector: "[kendoPivotGridLocalizedMessages]" }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
3179
+ `, isInline: true, styles: ["\n /** TODO: Remove if added to themes */\n div.k-loader {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n "], components: [{ type: PivotGridTableComponent, selector: "kendo-pivotgrid-table", inputs: ["tableType", "colWidth"] }, { type: i5$1.LoaderComponent, selector: "kendo-loader", inputs: ["type", "themeColor", "size"] }, { type: PivotGridConfiguratorComponent, selector: "kendo-pivotgrid-configurator", inputs: ["orientation", "sort", "filter", "navigation"], outputs: ["close"] }], directives: [{ type: LocalizedMessagesDirective, selector: "[kendoPivotGridLocalizedMessages]" }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
2943
3180
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: PivotGridComponent, decorators: [{
2944
3181
  type: Component,
2945
3182
  args: [{
@@ -3077,15 +3314,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
3077
3314
  <span class="k-loading-text">{{ loadingText }}</span>
3078
3315
  </div>
3079
3316
  </div>
3080
-
3081
3317
  <kendo-pivotgrid-configurator
3318
+ #configurator
3082
3319
  *ngIf="showConfigurator"
3083
- [orientation]="configuratorSettings.orientation">
3320
+ [navigation]="configuratorNavigation"
3321
+ [orientation]="configuratorSettings.orientation"
3322
+ (close)="toggleConfigurator()">
3084
3323
  </kendo-pivotgrid-configurator>
3085
-
3086
3324
  <div *ngIf="configurator"
3325
+ #configuratorButton
3087
3326
  class="k-pivotgrid-configurator-button"
3088
- (click)="showConfigurator = !showConfigurator">
3327
+ aria-hidden="true"
3328
+ (click)="toggleConfigurator()">
3089
3329
  <span>{{messageFor('configuratorButtonText')}}<span class="k-icon k-i-gear k-color-inherit"></span>
3090
3330
  </span>
3091
3331
  </div>
@@ -3136,6 +3376,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
3136
3376
  }], table: [{
3137
3377
  type: ViewChild,
3138
3378
  args: ['table', { read: ElementRef }]
3379
+ }], configuratorWrapper: [{
3380
+ type: ViewChild,
3381
+ args: ['configurator', { read: ElementRef }]
3139
3382
  }], loaderSettings: [{
3140
3383
  type: Input
3141
3384
  }], configurator: [{
@@ -3245,6 +3488,7 @@ class PivotBaseBindingDirective {
3245
3488
  this.subs.add(this.dataService.valuesRows.subscribe((data) => {
3246
3489
  this.zone.run(() => {
3247
3490
  this.dataService.aggregateData = data;
3491
+ this.dataLoaded.emit(data);
3248
3492
  });
3249
3493
  }));
3250
3494
  this.dataService.directive = this;
@@ -3557,7 +3801,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
3557
3801
 
3558
3802
  /**
3559
3803
  * Custom component messages override default component messages
3560
- * ([see example]({% slug globalization_pivotgrid %}#toc-localization)).
3804
+ * ([see example]({% slug globalization_pivotgrid %}#toc-custom-messages)).
3561
3805
  */
3562
3806
  class CustomMessagesComponent extends PivotGridMessages {
3563
3807
  constructor(service) {
@@ -3704,7 +3948,8 @@ const DECLARATIONS = [
3704
3948
  DraggableChipDirective,
3705
3949
  DropTargetDirective,
3706
3950
  LocalizedMessagesDirective,
3707
- CustomMessagesComponent
3951
+ CustomMessagesComponent,
3952
+ ChipKeyboardNavigationDirective
3708
3953
  ];
3709
3954
  const EXPORTS = [
3710
3955
  PivotGridComponent,
@@ -3729,7 +3974,8 @@ PivotGridModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version
3729
3974
  DraggableChipDirective,
3730
3975
  DropTargetDirective,
3731
3976
  LocalizedMessagesDirective,
3732
- CustomMessagesComponent], imports: [EventsModule,
3977
+ CustomMessagesComponent,
3978
+ ChipKeyboardNavigationDirective], imports: [EventsModule,
3733
3979
  IndicatorsModule,
3734
3980
  TreeViewModule,
3735
3981
  DraggableModule,