@progress/kendo-angular-grid 14.4.0-develop.9 → 15.0.0-develop.1

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 (52) hide show
  1. package/NOTICE.txt +146 -593
  2. package/common/clipboard-types.d.ts +102 -0
  3. package/common/clipboard.directive.d.ts +49 -0
  4. package/common/clipboard.service.d.ts +28 -0
  5. package/common/dom-events.service.d.ts +1 -0
  6. package/common/error-messages.d.ts +12 -0
  7. package/databinding.directive.d.ts +1 -1
  8. package/esm2020/column-menu/column-menu-item-base.mjs +2 -1
  9. package/esm2020/column-menu/column-menu.component.mjs +8 -5
  10. package/esm2020/columns/column-base.mjs +3 -2
  11. package/esm2020/columns/column-group.component.mjs +2 -1
  12. package/esm2020/columns/span-column.component.mjs +2 -1
  13. package/esm2020/common/clipboard-types.mjs +5 -0
  14. package/esm2020/common/clipboard.directive.mjs +185 -0
  15. package/esm2020/common/clipboard.service.mjs +218 -0
  16. package/esm2020/common/dom-events.service.mjs +1 -0
  17. package/esm2020/common/error-messages.mjs +45 -1
  18. package/esm2020/databinding.directive.mjs +3 -2
  19. package/esm2020/editing-directives/local-edit.service.mjs +2 -2
  20. package/esm2020/excel/excel.service.mjs +2 -1
  21. package/esm2020/filtering/cell/autocomplete-filter-cell.component.mjs +1 -1
  22. package/esm2020/filtering/cell/numeric-filter-cell.component.mjs +1 -1
  23. package/esm2020/filtering/menu/filter-menu-container.component.mjs +2 -2
  24. package/esm2020/filtering/menu/numeric-filter-menu-input.component.mjs +1 -1
  25. package/esm2020/grid.component.mjs +40 -34
  26. package/esm2020/grid.module.mjs +8 -4
  27. package/esm2020/grouping/group-scroll-binding.directive.mjs +2 -3
  28. package/esm2020/index.mjs +2 -0
  29. package/esm2020/package-metadata.mjs +2 -2
  30. package/esm2020/pager/pager-input.component.mjs +1 -1
  31. package/esm2020/pager/pager.component.mjs +1 -5
  32. package/esm2020/pdf/pdf.component.mjs +3 -2
  33. package/esm2020/pdf/pdf.service.mjs +2 -1
  34. package/esm2020/rendering/cell.component.mjs +33 -25
  35. package/esm2020/rendering/details/detail-template.directive.mjs +2 -1
  36. package/esm2020/rendering/header/header.component.mjs +16 -12
  37. package/esm2020/rendering/table-body.component.mjs +4 -4
  38. package/esm2020/selection/marquee.directive.mjs +11 -17
  39. package/esm2020/selection/selection-default.mjs +11 -5
  40. package/esm2020/utils.mjs +10 -0
  41. package/fesm2015/progress-kendo-angular-grid.mjs +598 -145
  42. package/fesm2020/progress-kendo-angular-grid.mjs +594 -145
  43. package/grid.component.d.ts +7 -1
  44. package/grid.module.d.ts +99 -98
  45. package/index.d.ts +3 -1
  46. package/package.json +16 -16
  47. package/pager/pager.component.d.ts +0 -1
  48. package/schematics/ngAdd/index.js +3 -3
  49. package/selection/marquee.directive.d.ts +4 -3
  50. package/selection/selection-default.d.ts +10 -4
  51. package/selection/types.d.ts +6 -0
  52. package/utils.d.ts +8 -0
@@ -10,7 +10,7 @@ import { merge, of, Subject, from, Subscription, interval, fromEvent, zip as zip
10
10
  import { switchMap, take, map, filter, takeUntil, switchMapTo, delay, auditTime, distinctUntilChanged, tap, throttleTime, debounceTime, bufferCount } from 'rxjs/operators';
11
11
  import * as i1 from '@progress/kendo-angular-l10n';
12
12
  import { ComponentMessages, LocalizationService, L10N_PREFIX } from '@progress/kendo-angular-l10n';
13
- import { orderBy, isCompositeFilterDescriptor, process, filterBy } from '@progress/kendo-data-query';
13
+ import { orderBy, groupBy, isCompositeFilterDescriptor, process, filterBy } from '@progress/kendo-data-query';
14
14
  import * as i4 from '@angular/common';
15
15
  import { CommonModule } from '@angular/common';
16
16
  import * as i4$2 from '@angular/forms';
@@ -166,6 +166,16 @@ const nodesToArray = (nodes) => [].slice.call(nodes);
166
166
  * @hidden
167
167
  */
168
168
  const replaceMessagePlaceholder = (message, name, value) => message.replace(new RegExp(`\{\\s*${name}\\s*\}`, 'g'), value);
169
+ /**
170
+ * @hidden
171
+ */
172
+ const recursiveFlatMap = (item) => isGroupResult(item) ? item.items.flatMap(recursiveFlatMap) : [{ ...item }];
173
+ /**
174
+ * @hidden
175
+ */
176
+ const isGroupResult = (obj) => {
177
+ return 'aggregates' in obj && 'items' in obj && 'field' in obj && 'value' in obj;
178
+ };
169
179
 
170
180
  /**
171
181
  * Represents the Kendo UI GridSpacer component for Angular.
@@ -220,6 +230,7 @@ class DomEventsService {
220
230
  this.focusIn = new EventEmitter();
221
231
  this.focusOut = new EventEmitter();
222
232
  this.windowBlur = new EventEmitter();
233
+ this.paste = new EventEmitter();
223
234
  }
224
235
  }
225
236
  DomEventsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: DomEventsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
@@ -2239,6 +2250,58 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
2239
2250
  type: Optional
2240
2251
  }] }]; } });
2241
2252
 
2253
+ /**
2254
+ * @hidden
2255
+ */
2256
+ const ColumnMenuErrorMessages = {
2257
+ autoSizeColumn: 'The auto size column does not work with enabled virtual columns',
2258
+ autoSizeAllColumns: 'The auto size all columns does not work with enabled virtual columns',
2259
+ serviceInput: 'The service input of the predefined column menu components is mandatory.'
2260
+ };
2261
+ /**
2262
+ * @hidden
2263
+ */
2264
+ const ClipboardErrorMessages = {
2265
+ activeCellNavigable: 'Grid must be navigable to use "activeCell" as clipboard target type.',
2266
+ selectionSelectable: 'Grid must be selectable to use "selection" as clipboard target type.'
2267
+ };
2268
+ /**
2269
+ * @hidden
2270
+ */
2271
+ const ColumnConfigurationErrorMessages = {
2272
+ fieldName: (field) => `Grid column field name '${field}' does not look like a valid JavaScript identifier.
2273
+ Identifiers can contain only alphanumeric characters (including "$" or "_"), and may not start with a digit.
2274
+ Please use only valid identifier names to ensure error-free operation.`,
2275
+ width: (value, parsedValue) => `Expected numeric value for column width, but got a string "${value}". Treating as ${parsedValue}px.`,
2276
+ invalidColumn: (column) => `Invalid column ${column}.`,
2277
+ requiredWidth: (columnType) => `${columnType} columns feature requires all columns to have set width.`,
2278
+ requiredScroll: (columnType) => `${columnType} columns are only supported when scrolling is enabled.`,
2279
+ groupColumnContent: 'ColumnGroupComponent should contain ColumnComponent or CommandColumnComponent.',
2280
+ lockedParent: 'Locked child columns require their parent columns to be locked.',
2281
+ columnNested: 'Columns can be nested only inside ColumnGroupComponent',
2282
+ nestedInside: (nestedColumnNameType, parentColumnType) => `${nestedColumnNameType} cannot be nested inside ${parentColumnType}.`
2283
+ };
2284
+ /**
2285
+ * @hidden
2286
+ */
2287
+ const GridConfigurationErrorMessages = {
2288
+ functionType: (propName, fn) => `${propName} must be a function, but received ${JSON.stringify(fn)}.`,
2289
+ incompatibleFeatures: (feat1Name, feat2Name) => `'Having both ${feat1Name} and ${feat2Name} is not supported.'`,
2290
+ nonLockedColumnPresent: 'There should be at least one non-locked column',
2291
+ rowHeightVirtual: 'Row height and detail row height settings require virtual scrolling mode to be enabled.',
2292
+ focusNavigable: 'The Grid should be configured as navigable to control focus',
2293
+ expandCollapseMethods: (expandMethodName, collapseMethodName, directiveName, callbackName) => `The ${expandMethodName} and ${collapseMethodName} methods should not be called
2294
+ when using the ${directiveName} directive or the ${callbackName} callback.
2295
+ These methods are provided only for backwards compatibility with legacy versions.`,
2296
+ requiredEditService: `The default edit service of the editing directives works only when binding to plain array.
2297
+ Please provide an editService.`,
2298
+ requiredModule: (exportedType, moduleName, componentSelector) => `Creating ${exportedType} requires including the ${moduleName} and adding the ${componentSelector} component.`,
2299
+ groupBindingDirectives: `Using the "kendoGridGroupBinding" directive in combination with the "kendoGridExpandGroupBy" directive
2300
+ or the "isGroupExpanded" callback is not supported. To use grouping with the "kendoGridGroupBinding" directive,
2301
+ set the Grid "groupable" property to "true".`,
2302
+ unsupportedMethod: (methodName, suggestedMethodName) => `Using ${methodName} in this context is not supported. Use ${suggestedMethodName} instead.`
2303
+ };
2304
+
2242
2305
  /**
2243
2306
  * @hidden
2244
2307
  */
@@ -2332,7 +2395,7 @@ class ColumnBase {
2332
2395
  this.columnMenuTemplates = new QueryList();
2333
2396
  this.idService = idService;
2334
2397
  if (parent && idService && parent.idService.gridId() === idService.gridId() && !isColumnContainer(parent)) {
2335
- throw new Error('Columns can be nested only inside ColumnGroupComponent');
2398
+ throw new Error(ColumnConfigurationErrorMessages.columnNested);
2336
2399
  }
2337
2400
  }
2338
2401
  /**
@@ -2354,7 +2417,7 @@ class ColumnBase {
2354
2417
  if (typeof value === 'string') {
2355
2418
  const parsedValue = this._width = parseInt(value, 10);
2356
2419
  if (isDevMode()) {
2357
- console.warn(`Expected numeric value for column width, but got a string "${value}". Treating as ${parsedValue}px.`);
2420
+ console.warn(ColumnConfigurationErrorMessages.width(value, parsedValue));
2358
2421
  }
2359
2422
  }
2360
2423
  else {
@@ -2936,7 +2999,7 @@ class SpanColumnComponent extends ColumnBase {
2936
2999
  this.includeInChooser = false;
2937
3000
  this._editable = true;
2938
3001
  if (parent && parent.isSpanColumn) {
2939
- throw new Error('SpanColumn cannot be nested inside another SpanColumn');
3002
+ throw new Error(ColumnConfigurationErrorMessages.nestedInside('SpanColumnComponent', 'SpanColumnComponent'));
2940
3003
  }
2941
3004
  }
2942
3005
  /**
@@ -3149,7 +3212,7 @@ class ColumnGroupComponent extends ColumnBase {
3149
3212
  */
3150
3213
  this.minResizableWidth = 10;
3151
3214
  if (parent && parent.isSpanColumn) {
3152
- throw new Error('ColumnGroupComponent cannot be nested inside SpanColumnComponent');
3215
+ throw new Error(ColumnConfigurationErrorMessages.nestedInside('ColumnGroupComponent', 'SpanColumnComponent'));
3153
3216
  }
3154
3217
  }
3155
3218
  /**
@@ -4264,19 +4327,15 @@ const offsets = {
4264
4327
  * @hidden
4265
4328
  */
4266
4329
  class GridMarqueeDirective {
4267
- constructor(draggable, selection, cellSelection, domEvents) {
4330
+ constructor(draggable, selection, cellSelection, domEvents, host, renderer) {
4268
4331
  this.draggable = draggable;
4269
4332
  this.selection = selection;
4270
4333
  this.cellSelection = cellSelection;
4271
4334
  this.domEvents = domEvents;
4335
+ this.host = host;
4336
+ this.renderer = renderer;
4272
4337
  this.selectionStarted = false;
4273
4338
  }
4274
- get webkitUserSelection() {
4275
- return (this.cellSelection.enableMarquee || this.selection.enableMarquee) ? 'none' : null;
4276
- }
4277
- get userSelection() {
4278
- return (this.cellSelection.enableMarquee || this.selection.enableMarquee);
4279
- }
4280
4339
  ngOnInit() {
4281
4340
  this.subscriptions = (this.draggable.kendoPress.subscribe(this.start.bind(this)));
4282
4341
  this.subscriptions.add(this.draggable.kendoDrag.subscribe(this.moveMarquee.bind(this)));
@@ -4307,6 +4366,8 @@ class GridMarqueeDirective {
4307
4366
  const distance = Math.sqrt((args.pageX - press.pageX) ** 2 + (args.pageY - press.pageY) ** 2);
4308
4367
  if (distance > MINIMAL_DRAG_DISTANCE) {
4309
4368
  this.selectionStarted = true;
4369
+ this.renderer.addClass(this.host.nativeElement, 'user-select-none');
4370
+ this.renderer.setStyle(this.host.nativeElement, 'user-select', 'none');
4310
4371
  this.dragEndSubscription = merge(this.domEvents.cellMouseup.pipe(take(1)), this.draggable.kendoRelease.pipe(delay(1), take(1)))
4311
4372
  .subscribe(this.endSelection.bind(this));
4312
4373
  }
@@ -4351,6 +4412,8 @@ class GridMarqueeDirective {
4351
4412
  if (this.dragEndSubscription) {
4352
4413
  this.dragEndSubscription.unsubscribe();
4353
4414
  }
4415
+ this.renderer.removeClass(this.host.nativeElement, 'user-select-none');
4416
+ this.renderer.removeStyle(this.host.nativeElement, 'user-select');
4354
4417
  this.dragEndSubscription = null;
4355
4418
  this.pressTarget = null;
4356
4419
  this.pressArgs = null;
@@ -4387,20 +4450,14 @@ class GridMarqueeDirective {
4387
4450
  return null;
4388
4451
  }
4389
4452
  }
4390
- GridMarqueeDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: GridMarqueeDirective, deps: [{ token: i1$1.DraggableDirective }, { token: SelectionService }, { token: CellSelectionService }, { token: DomEventsService }], target: i0.ɵɵFactoryTarget.Directive });
4391
- GridMarqueeDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.12", type: GridMarqueeDirective, selector: "[kendoGridSelectionMarquee]", host: { properties: { "style.-webkit-user-select": "this.webkitUserSelection", "class.user-select-none": "this.userSelection" } }, ngImport: i0 });
4453
+ GridMarqueeDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: GridMarqueeDirective, deps: [{ token: i1$1.DraggableDirective }, { token: SelectionService }, { token: CellSelectionService }, { token: DomEventsService }, { token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
4454
+ GridMarqueeDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.12", type: GridMarqueeDirective, selector: "[kendoGridSelectionMarquee]", ngImport: i0 });
4392
4455
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: GridMarqueeDirective, decorators: [{
4393
4456
  type: Directive,
4394
4457
  args: [{
4395
4458
  selector: '[kendoGridSelectionMarquee]'
4396
4459
  }]
4397
- }], ctorParameters: function () { return [{ type: i1$1.DraggableDirective }, { type: SelectionService }, { type: CellSelectionService }, { type: DomEventsService }]; }, propDecorators: { webkitUserSelection: [{
4398
- type: HostBinding,
4399
- args: ['style.-webkit-user-select']
4400
- }], userSelection: [{
4401
- type: HostBinding,
4402
- args: ['class.user-select-none']
4403
- }] } });
4460
+ }], ctorParameters: function () { return [{ type: i1$1.DraggableDirective }, { type: SelectionService }, { type: CellSelectionService }, { type: DomEventsService }, { type: i0.ElementRef }, { type: i0.Renderer2 }]; } });
4404
4461
 
4405
4462
  /**
4406
4463
  * @hidden
@@ -4443,8 +4500,8 @@ const packageMetadata = {
4443
4500
  name: '@progress/kendo-angular-grid',
4444
4501
  productName: 'Kendo UI for Angular',
4445
4502
  productCodes: ['KENDOUIANGULAR', 'KENDOUICOMPLETE'],
4446
- publishDate: 1705406831,
4447
- version: '14.4.0-develop.9',
4503
+ publishDate: 1706544074,
4504
+ version: '15.0.0-develop.1',
4448
4505
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/'
4449
4506
  };
4450
4507
 
@@ -4476,7 +4533,7 @@ class DetailTemplateDirective {
4476
4533
  */
4477
4534
  set showIf(fn) {
4478
4535
  if (typeof fn !== 'function') {
4479
- throw new Error(`showIf must be a function, but received ${JSON.stringify(fn)}.`);
4536
+ throw new Error(GridConfigurationErrorMessages.functionType('showIf', fn));
4480
4537
  }
4481
4538
  this._condition = fn;
4482
4539
  }
@@ -4970,6 +5027,9 @@ class Selection {
4970
5027
  this.cellSelectionState = new PairSet();
4971
5028
  this.init();
4972
5029
  }
5030
+ /**
5031
+ * @hidden
5032
+ */
4973
5033
  get isCellSelectionMode() {
4974
5034
  return isPresent(this.ctx.grid.selectable) && this.ctx.grid.selectable['cell'];
4975
5035
  }
@@ -5023,6 +5083,14 @@ class Selection {
5023
5083
  }
5024
5084
  return row.index;
5025
5085
  }
5086
+ /**
5087
+ * @hidden
5088
+ */
5089
+ stateToArray() {
5090
+ return this.isCellSelectionMode ?
5091
+ this.cellSelectionState.toArray('itemKey', 'columnKey') :
5092
+ Array.from(this.rowSelectionState);
5093
+ }
5026
5094
  getSelectionItem(row, col, colIndex) {
5027
5095
  const itemIdentifiers = {};
5028
5096
  itemIdentifiers.itemKey = this.getItemKey(row);
@@ -5083,11 +5151,6 @@ class Selection {
5083
5151
  this.rowSelectionState = new Set(selectedKeys);
5084
5152
  }
5085
5153
  }
5086
- stateToArray() {
5087
- return this.isCellSelectionMode ?
5088
- this.cellSelectionState.toArray('itemKey', 'columnKey') :
5089
- Array.from(this.rowSelectionState);
5090
- }
5091
5154
  }
5092
5155
  Selection.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: Selection, deps: [{ token: ContextService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive });
5093
5156
  Selection.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.12", type: Selection, selector: "kendo-grid-selection-base", inputs: { selectedKeys: "selectedKeys", rangeSelectionStartRow: "rangeSelectionStartRow", rangeSelectionStartColumnIndex: "rangeSelectionStartColumnIndex", selectionKey: ["kendoGridSelectBy", "selectionKey"], columnKey: "columnKey" }, outputs: { selectedKeysChange: "selectedKeysChange" }, usesOnChanges: true, ngImport: i0 });
@@ -5449,7 +5512,7 @@ class PDFService {
5449
5512
  emitEvent(emitter, args) {
5450
5513
  if (emitter.observers.length === 0) {
5451
5514
  if (isDevMode()) {
5452
- throw new Error('Creating PDF requires including the PDFModule and adding the <kendo-grid-pdf> component.');
5515
+ throw new Error(GridConfigurationErrorMessages.requiredModule('PDF', 'PDFModule', '<kendo-grid-pdf>'));
5453
5516
  }
5454
5517
  }
5455
5518
  else {
@@ -5531,7 +5594,7 @@ class ExcelService {
5531
5594
  save(component) {
5532
5595
  if (this.saveToExcel.observers.length === 0) {
5533
5596
  if (isDevMode()) {
5534
- throw new Error('Saving excel requires including the ExcelModule and adding the <kendo-grid-excel> component.');
5597
+ throw new Error(GridConfigurationErrorMessages.requiredModule('excel', 'ExcelModule', '<kendo-grid-excel>'));
5535
5598
  }
5536
5599
  }
5537
5600
  else {
@@ -6748,6 +6811,214 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
6748
6811
  }]
6749
6812
  }], ctorParameters: function () { return [{ type: i0.TemplateRef }]; } });
6750
6813
 
6814
+ /**
6815
+ * @hidden
6816
+ */
6817
+ class ClipboardService {
6818
+ constructor(contextService) {
6819
+ this.contextService = contextService;
6820
+ this.itemToString = (item, cols) => {
6821
+ if (!cols.length) {
6822
+ return null;
6823
+ }
6824
+ return cols.map(col => item[col.field]).join(`\t`);
6825
+ };
6826
+ }
6827
+ createClipboardData(data, columns, options) {
6828
+ let result = {
6829
+ gridItems: [],
6830
+ dataString: ''
6831
+ };
6832
+ const fieldCols = columns.flatMap(c => c instanceof ColumnComponent && isPresent$1(c.field) ? [c] : []);
6833
+ const clipboardData = { items: [], dataStrings: [] };
6834
+ const colFields = fieldCols.map(c => c.field);
6835
+ if (options.wholeRow) {
6836
+ this.targetColField = fieldCols[0]?.field;
6837
+ this.targetRowIndex = data[0].dataRowIndex;
6838
+ data.forEach(item => {
6839
+ clipboardData.items.push({ dataItem: { ...item.dataItem }, fields: colFields });
6840
+ clipboardData.dataStrings.push(this.itemToString(item.dataItem, fieldCols));
6841
+ });
6842
+ result = {
6843
+ gridItems: options.operationType === 'cut' ? clipboardData.items.map(item => {
6844
+ item.fields.forEach(field => item.dataItem[field] = null);
6845
+ return item;
6846
+ }) : [...clipboardData.items],
6847
+ dataString: options.copyHeaders ? this.addHeaders(clipboardData.dataStrings.join(`\r\n`), fieldCols) : clipboardData.dataStrings.join(`\n`)
6848
+ };
6849
+ }
6850
+ else {
6851
+ if (options.target === 'selection') {
6852
+ const { tabular, groups } = this.groupSelection();
6853
+ const selectionDirective = this.contextService.grid.selectionDirective;
6854
+ const colIdentifier = selectionDirective.columnKey;
6855
+ if (tabular) {
6856
+ const selectionKeys = groups[0].items.map(item => item.columnKey);
6857
+ const selectedFieldCols = columns.flatMap((c, i) => (c instanceof ColumnComponent && c.field) && selectionKeys.find(k => typeof colIdentifier === 'function' ? k === colIdentifier(c, i) : k === i) ? [c] : []);
6858
+ const selectedColFields = selectedFieldCols.map(c => c.field);
6859
+ this.targetColField = selectedColFields[0];
6860
+ result.dataString = data.flatMap(item => {
6861
+ const itemString = this.itemToString(item.dataItem, selectedFieldCols);
6862
+ const existingItem = isPresent$1(itemString);
6863
+ if (!isPresent$1(this.targetRowIndex) && isPresent$1(itemString)) {
6864
+ this.targetRowIndex = item.dataRowIndex;
6865
+ }
6866
+ if (options.operationType === 'cut') {
6867
+ selectedColFields.forEach(f => item.dataItem[f] = null);
6868
+ }
6869
+ result.gridItems.push({
6870
+ dataItem: item.dataItem,
6871
+ fields: selectedColFields
6872
+ });
6873
+ return existingItem ? [itemString] : [];
6874
+ }).join(`\r\n`);
6875
+ if (options.copyHeaders) {
6876
+ result.dataString = this.addHeaders(result.dataString, selectedFieldCols);
6877
+ }
6878
+ }
6879
+ else { // split per row (uneven rows)
6880
+ const rowIdentifier = selectionDirective.selectionKey;
6881
+ result.dataString = data.flatMap(item => {
6882
+ // determine cols per item
6883
+ const key = rowIdentifier ?
6884
+ typeof rowIdentifier === 'string' ? item.dataItem[rowIdentifier] : rowIdentifier({ index: item.dataRowIndex, dataItem: item.dataItem }) :
6885
+ item.dataRowIndex;
6886
+ const selectionKeys = groups.find(gr => gr.value === key).items.map(item => item.columnKey);
6887
+ const selectedFieldCols = columns.flatMap((c, i) => (c instanceof ColumnComponent && c.field) && selectionKeys.find(k => typeof colIdentifier === 'function' ? k === colIdentifier(c, i) : k === i) ? [c] : []);
6888
+ const selectedColFields = selectedFieldCols.map(c => c.field);
6889
+ if (!this.targetColField) {
6890
+ this.targetColField = selectedColFields[0];
6891
+ }
6892
+ const itemString = this.itemToString(item.dataItem, selectedFieldCols);
6893
+ const existingItem = isPresent$1(itemString);
6894
+ if (!isPresent$1(this.targetRowIndex) && existingItem) {
6895
+ this.targetRowIndex = item.dataRowIndex;
6896
+ }
6897
+ if (existingItem) {
6898
+ if (options.operationType === 'cut') {
6899
+ selectedColFields.forEach(f => item.dataItem[f] = null);
6900
+ }
6901
+ result.gridItems.push({
6902
+ dataItem: item.dataItem,
6903
+ fields: selectedColFields
6904
+ });
6905
+ }
6906
+ return existingItem ? options.copyHeaders ? [this.addHeaders(itemString, selectedFieldCols)] : [itemString] : [];
6907
+ }).join(`\r\n`);
6908
+ }
6909
+ }
6910
+ else {
6911
+ const item = data[0];
6912
+ const col = columns[item.colIndex];
6913
+ const colField = col.field;
6914
+ const title = col.title;
6915
+ const copiedData = item.dataItem[colField];
6916
+ this.targetRowIndex = item.dataRowIndex;
6917
+ this.targetColField = colField;
6918
+ if (options.operationType === 'cut' && colField) {
6919
+ item.dataItem[colField] = null;
6920
+ }
6921
+ result = {
6922
+ gridItems: [{
6923
+ dataItem: item.dataItem,
6924
+ fields: colField ? [colField] : []
6925
+ }],
6926
+ dataString: options.copyHeaders ? [title || colField, copiedData].join(`\r\n`) : colField ? copiedData : ``
6927
+ };
6928
+ }
6929
+ }
6930
+ return result;
6931
+ }
6932
+ getGridData(data, columns, targetType, targetRowIndex, options) {
6933
+ const separator = data.includes(`\r\n`) ? `\r\n` : data.includes(`\n`) ? `\n` : null;
6934
+ const dataRows = separator ? data.split(separator) : [data];
6935
+ this.targetRowIndex = targetRowIndex;
6936
+ if (targetType === 'activeCell') {
6937
+ if (options.wholeRow) {
6938
+ this.targetColField = columns.find(c => c instanceof ColumnComponent && c.field)?.field;
6939
+ }
6940
+ else {
6941
+ const activeCellIndex = this.contextService.grid.activeCell.colIndex;
6942
+ for (let i = 0; i < columns.length; i++) {
6943
+ const col = columns[i];
6944
+ if (col instanceof ColumnComponent && col.field && i >= activeCellIndex) {
6945
+ this.targetColField = col.field;
6946
+ break;
6947
+ }
6948
+ }
6949
+ }
6950
+ }
6951
+ else {
6952
+ if (options.wholeRow || !options.isCellSelection) {
6953
+ this.targetColField = (columns.filter(c => c instanceof ColumnComponent && c.field))[0]['field'];
6954
+ }
6955
+ else {
6956
+ const { groups } = this.groupSelection();
6957
+ const selectionDirective = this.contextService.grid.selectionDirective;
6958
+ const colIdentifier = selectionDirective.columnKey;
6959
+ const visibleCols = columns.filter(c => c.isVisible);
6960
+ const selectionKeys = groups[0].items.map(item => item.columnKey);
6961
+ const selectedFieldCols = visibleCols.flatMap((c, i) => (c instanceof ColumnComponent && c.field) && selectionKeys.find(k => typeof colIdentifier === 'function' ? k === colIdentifier(c, i) : k === i) ? [c] : []);
6962
+ const selectedColFields = selectedFieldCols.map(c => c.field);
6963
+ this.targetColField = selectedColFields[0];
6964
+ }
6965
+ }
6966
+ const items = dataRows.map(rowString => {
6967
+ const cells = rowString.includes(`\t`) ? rowString.split(`\t`) : [rowString];
6968
+ const colFields = columns.flatMap(c => (c instanceof ColumnComponent) && c.field ? [c.field] : []);
6969
+ const targetColFieldIndex = colFields.indexOf(this.targetColField);
6970
+ const affectedFields = colFields.slice(targetColFieldIndex, targetColFieldIndex + cells.length);
6971
+ const item = {};
6972
+ colFields.slice(targetColFieldIndex, targetColFieldIndex + cells.length).forEach((colField, index) => item[colField] = cells[index]);
6973
+ return {
6974
+ dataItem: item,
6975
+ fields: affectedFields
6976
+ };
6977
+ });
6978
+ return items;
6979
+ }
6980
+ groupSelection() {
6981
+ const selection = this.contextService.grid.selection;
6982
+ const groups = groupBy(selection, [{ field: 'itemKey' }])
6983
+ .map(gr => {
6984
+ gr.items.sort((a, b) => a.columnKey - b.columnKey);
6985
+ return gr;
6986
+ });
6987
+ for (let i = 1; i < groups.length; i++) {
6988
+ if (!this.areEqual(groups[i].items, groups[i - 1].items)) {
6989
+ return {
6990
+ tabular: false,
6991
+ groups
6992
+ };
6993
+ }
6994
+ }
6995
+ return {
6996
+ tabular: true,
6997
+ groups
6998
+ };
6999
+ }
7000
+ areEqual(arr1, arr2) {
7001
+ if (arr1.length !== arr2.length) {
7002
+ return false;
7003
+ }
7004
+ for (let i = 0; i < arr1.length; i++) {
7005
+ if (arr1[i].columnKey !== arr2[i].columnKey) {
7006
+ return false;
7007
+ }
7008
+ }
7009
+ return true;
7010
+ }
7011
+ addHeaders(initialData, cols) {
7012
+ const headersRowData = cols.map(c => c.title || c.field).join(`\t`);
7013
+ return `${headersRowData}\r\n${initialData}`;
7014
+ }
7015
+ }
7016
+ ClipboardService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ClipboardService, deps: [{ token: ContextService }], target: i0.ɵɵFactoryTarget.Injectable });
7017
+ ClipboardService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ClipboardService });
7018
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ClipboardService, decorators: [{
7019
+ type: Injectable
7020
+ }], ctorParameters: function () { return [{ type: ContextService }]; } });
7021
+
6751
7022
  /**
6752
7023
  * @hidden
6753
7024
  */
@@ -7730,7 +8001,7 @@ PagerInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", ve
7730
8001
  </kendo-numerictextbox>
7731
8002
  {{textFor('pagerOf')}} {{totalPages}}
7732
8003
  </span>
7733
- `, isInline: true, components: [{ type: i3$1.NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode"], outputs: ["valueChange", "focus", "blur"], exportAs: ["kendoNumericTextBox"] }], directives: [{ type: PagerInputDirective, selector: "[kendoGridPagerInput]" }, { type: FocusableDirective, selector: "[kendoGridFocusable],\n [kendoGridEditCommand],\n [kendoGridRemoveCommand],\n [kendoGridSaveCommand],\n [kendoGridCancelCommand],\n [kendoGridSelectionCheckbox]\n ", inputs: ["kendoGridFocusable"] }, { type: i1$1.EventsOutsideAngularDirective, selector: "[kendoEventsOutsideAngular]", inputs: ["kendoEventsOutsideAngular", "scope"] }] });
8004
+ `, isInline: true, components: [{ type: i3$1.NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode"], outputs: ["valueChange", "focus", "blur", "inputFocus", "inputBlur"], exportAs: ["kendoNumericTextBox"] }], directives: [{ type: PagerInputDirective, selector: "[kendoGridPagerInput]" }, { type: FocusableDirective, selector: "[kendoGridFocusable],\n [kendoGridEditCommand],\n [kendoGridRemoveCommand],\n [kendoGridSaveCommand],\n [kendoGridCancelCommand],\n [kendoGridSelectionCheckbox]\n ", inputs: ["kendoGridFocusable"] }, { type: i1$1.EventsOutsideAngularDirective, selector: "[kendoEventsOutsideAngular]", inputs: ["kendoEventsOutsideAngular", "scope"] }] });
7734
8005
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PagerInputComponent, decorators: [{
7735
8006
  type: Component,
7736
8007
  args: [{
@@ -7881,7 +8152,6 @@ class PagerComponent {
7881
8152
  this.total = 0;
7882
8153
  this.skip = 1;
7883
8154
  this.pageChange = new EventEmitter();
7884
- this.pagerWrapClass = true;
7885
8155
  this.gridPagerClass = true;
7886
8156
  this.settings = normalize$1({});
7887
8157
  this.subscriptions = new Subscription();
@@ -8107,7 +8377,7 @@ class PagerComponent {
8107
8377
  }
8108
8378
  }
8109
8379
  PagerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PagerComponent, deps: [{ token: PagerContextService }, { token: NavigationService }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: ContextService }, { token: CELL_CONTEXT, optional: true }, { token: FocusRoot }, { token: FocusGroup }], target: i0.ɵɵFactoryTarget.Component });
8110
- PagerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: PagerComponent, selector: "kendo-pager", inputs: { total: "total", skip: "skip", pageSize: "pageSize", options: "options", size: "size", template: "template" }, outputs: { pageChange: "pageChange" }, host: { listeners: { "focusin": "onFocusIn($event)", "focusout": "onFocusOut()", "keydown.escape": "onEscape()", "keydown.enter": "onEnter($event)", "keydown.arrowleft": "navigateToPreviousPage($event)", "keydown.pageup": "navigateToPreviousPage($event)", "keydown.arrowright": "navigateToNextPage($event)", "keydown.pagedown": "navigateToNextPage($event)", "keydown.home": "navigateToFirstPage($event)", "keydown.end": "navigateToLastPage($event)" }, properties: { "class.k-pager-wrap": "this.pagerWrapClass", "class.k-grid-pager": "this.gridPagerClass", "class.k-pager-sm": "this.sizeSmallClass", "class.k-pager-md": "this.sizeMediumClass", "class.k-focus": "this.isFocused", "attr.aria-label": "this.pagerAriaLabel" } }, providers: [{
8380
+ PagerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: PagerComponent, selector: "kendo-pager", inputs: { total: "total", skip: "skip", pageSize: "pageSize", options: "options", size: "size", template: "template" }, outputs: { pageChange: "pageChange" }, host: { listeners: { "focusin": "onFocusIn($event)", "focusout": "onFocusOut()", "keydown.escape": "onEscape()", "keydown.enter": "onEnter($event)", "keydown.arrowleft": "navigateToPreviousPage($event)", "keydown.pageup": "navigateToPreviousPage($event)", "keydown.arrowright": "navigateToNextPage($event)", "keydown.pagedown": "navigateToNextPage($event)", "keydown.home": "navigateToFirstPage($event)", "keydown.end": "navigateToLastPage($event)" }, properties: { "class.k-grid-pager": "this.gridPagerClass", "class.k-pager-sm": "this.sizeSmallClass", "class.k-pager-md": "this.sizeMediumClass", "class.k-focus": "this.isFocused", "attr.aria-label": "this.pagerAriaLabel" } }, providers: [{
8111
8381
  provide: FOCUS_ROOT_ACTIVE,
8112
8382
  useValue: true
8113
8383
  }, {
@@ -8243,9 +8513,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
8243
8513
  type: Input
8244
8514
  }], pageChange: [{
8245
8515
  type: Output
8246
- }], pagerWrapClass: [{
8247
- type: HostBinding,
8248
- args: ['class.k-pager-wrap']
8249
8516
  }], gridPagerClass: [{
8250
8517
  type: HostBinding,
8251
8518
  args: ['class.k-grid-pager']
@@ -10174,7 +10441,7 @@ NumericFilterMenuInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion:
10174
10441
  </kendo-numerictextbox-messages>
10175
10442
  </kendo-numerictextbox>
10176
10443
  </kendo-grid-filter-menu-input-wrapper>
10177
- `, isInline: true, components: [{ type: FilterMenuInputWrapperComponent, selector: "kendo-grid-filter-menu-input-wrapper", inputs: ["filterService", "isFirstDropDown", "menuTabbingService", "currentFilter"] }, { type: i3$1.NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode"], outputs: ["valueChange", "focus", "blur"], exportAs: ["kendoNumericTextBox"] }, { type: i3$1.NumericTextBoxCustomMessagesComponent, selector: "kendo-numerictextbox-messages" }], directives: [{ type: FilterInputDirective, selector: "[kendoFilterInput]", inputs: ["filterDelay", "columnLabel", "value"] }] });
10444
+ `, isInline: true, components: [{ type: FilterMenuInputWrapperComponent, selector: "kendo-grid-filter-menu-input-wrapper", inputs: ["filterService", "isFirstDropDown", "menuTabbingService", "currentFilter"] }, { type: i3$1.NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode"], outputs: ["valueChange", "focus", "blur", "inputFocus", "inputBlur"], exportAs: ["kendoNumericTextBox"] }, { type: i3$1.NumericTextBoxCustomMessagesComponent, selector: "kendo-numerictextbox-messages" }], directives: [{ type: FilterInputDirective, selector: "[kendoFilterInput]", inputs: ["filterDelay", "columnLabel", "value"] }] });
10178
10445
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: NumericFilterMenuInputComponent, decorators: [{
10179
10446
  type: Component,
10180
10447
  args: [{
@@ -11303,7 +11570,7 @@ FilterMenuContainerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12
11303
11570
  MenuTabbingService
11304
11571
  ], viewQueries: [{ propertyName: "resetButton", first: true, predicate: ["resetButton"], descendants: true }, { propertyName: "filterButton", first: true, predicate: ["filterButton"], descendants: true }], ngImport: i0, template: `
11305
11572
  <form (submit)="submit()" (reset)="reset()"
11306
- class="k-filter-menu k-group k-reset k-state-border-up">
11573
+ class="k-filter-menu">
11307
11574
  <div class="k-filter-menu-container">
11308
11575
  <ng-container [ngSwitch]="hasTemplate">
11309
11576
  <ng-container *ngSwitchCase="false">
@@ -11349,7 +11616,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
11349
11616
  selector: 'kendo-grid-filter-menu-container',
11350
11617
  template: `
11351
11618
  <form (submit)="submit()" (reset)="reset()"
11352
- class="k-filter-menu k-group k-reset k-state-border-up">
11619
+ class="k-filter-menu">
11353
11620
  <div class="k-filter-menu-container">
11354
11621
  <ng-container [ngSwitch]="hasTemplate">
11355
11622
  <ng-container *ngSwitchCase="false">
@@ -11603,14 +11870,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
11603
11870
  type: Injectable
11604
11871
  }], ctorParameters: function () { return [{ type: MenuTabbingService }]; } });
11605
11872
 
11606
- /**
11607
- * @hidden
11608
- */
11609
- const ColumnMenuErrorMessages = {
11610
- autoSizeColumn: 'The auto size column does not work with enabled virtual columns',
11611
- autoSizeAllColumns: 'The auto size all columns does not work with enabled virtual columns'
11612
- };
11613
-
11614
11873
  /**
11615
11874
  * @hidden
11616
11875
  */
@@ -11620,7 +11879,7 @@ class ColumnMenuItemBase {
11620
11879
  }
11621
11880
  ngOnInit() {
11622
11881
  if (isDevMode() && !this.service) {
11623
- throw new Error('The service input of the predefined column menu components is mandatory.');
11882
+ throw new Error(ColumnMenuErrorMessages.serviceInput);
11624
11883
  }
11625
11884
  }
11626
11885
  /**
@@ -13223,7 +13482,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
13223
13482
  }]
13224
13483
  }], ctorParameters: function () { return [{ type: ContextService }]; } });
13225
13484
 
13226
- const POPUP_CLASS = 'k-grid-columnmenu-popup';
13485
+ const POPUP_CLASSES = 'k-grid-columnmenu-popup k-column-menu';
13227
13486
  let id$2 = 0;
13228
13487
  const getId = (gridId) => `${gridId}-column-menu-${id$2++}`;
13229
13488
  /**
@@ -13416,7 +13675,7 @@ class ColumnMenuComponent {
13416
13675
  this.expandedFilter = this.getExpandedState(this.settings.filter);
13417
13676
  this.expandedColumns = this.getExpandedState(this.settings.columnChooser);
13418
13677
  this.expandedPosition = this.getExpandedState(this.settings.setColumnPosition);
13419
- this.popupRef = this.popupService.open(anchor, template, this.popupRef, POPUP_CLASS);
13678
+ this.popupRef = this.popupService.open(anchor, template, this.popupRef, POPUP_CLASSES);
13420
13679
  // Needed as changes to 'popupRef' and 'popupId' are not reflected
13421
13680
  // automatically when the Popup is closed by clicking outside the anchor
13422
13681
  const ariaRoot = this.isNavigable ? anchor.closest('.k-table-th') : anchor;
@@ -13437,7 +13696,8 @@ class ColumnMenuComponent {
13437
13696
  ariaRoot && this.renderer.setAttribute(ariaRoot, 'aria-expanded', 'true');
13438
13697
  }
13439
13698
  if (this.settings.view === 'tabbed') {
13440
- this.renderer.addClass(this.popupRef.popupElement.querySelector('.k-grid-columnmenu-popup'), 'k-column-menu-tabbed');
13699
+ this.renderer.addClass(popupAriaElement, 'k-column-menu-tabbed');
13700
+ this.renderer.addClass(popupAriaElement, 'k-column-menu');
13441
13701
  this.cdr.detectChanges();
13442
13702
  this.tabStrip?.selectTab(0);
13443
13703
  }
@@ -13563,7 +13823,8 @@ ColumnMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", ve
13563
13823
  </kendo-grid-columnmenu-container>
13564
13824
  </ng-template>
13565
13825
  <ng-template #tabbedInterfaceTemplate>
13566
- <kendo-tabstrip #tabstrip (keydown.escape)="close(true)">
13826
+ <kendo-tabstrip #tabstrip
13827
+ (keydown.escape)="close(true)">
13567
13828
  <kendo-tabstrip-tab *ngIf="hasFilter">
13568
13829
  <ng-template kendoTabTitle>
13569
13830
  <kendo-icon-wrapper
@@ -13738,7 +13999,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
13738
13999
  </kendo-grid-columnmenu-container>
13739
14000
  </ng-template>
13740
14001
  <ng-template #tabbedInterfaceTemplate>
13741
- <kendo-tabstrip #tabstrip (keydown.escape)="close(true)">
14002
+ <kendo-tabstrip #tabstrip
14003
+ (keydown.escape)="close(true)">
13742
14004
  <kendo-tabstrip-tab *ngIf="hasFilter">
13743
14005
  <ng-template kendoTabTitle>
13744
14006
  <kendo-icon-wrapper
@@ -14303,7 +14565,7 @@ NumericFilterCellComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0
14303
14565
  </kendo-numerictextbox-messages>
14304
14566
  </kendo-numerictextbox>
14305
14567
  </kendo-grid-filter-wrapper-cell>
14306
- `, isInline: true, components: [{ type: FilterCellWrapperComponent, selector: "kendo-grid-filter-wrapper-cell", inputs: ["showOperators"] }, { type: i3$1.NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode"], outputs: ["valueChange", "focus", "blur"], exportAs: ["kendoNumericTextBox"] }, { type: i3$1.NumericTextBoxCustomMessagesComponent, selector: "kendo-numerictextbox-messages" }], directives: [{ type: FocusableDirective, selector: "[kendoGridFocusable],\n [kendoGridEditCommand],\n [kendoGridRemoveCommand],\n [kendoGridSaveCommand],\n [kendoGridCancelCommand],\n [kendoGridSelectionCheckbox]\n ", inputs: ["kendoGridFocusable"] }, { type: FilterInputDirective, selector: "[kendoFilterInput]", inputs: ["filterDelay", "columnLabel", "value"] }] });
14568
+ `, isInline: true, components: [{ type: FilterCellWrapperComponent, selector: "kendo-grid-filter-wrapper-cell", inputs: ["showOperators"] }, { type: i3$1.NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode"], outputs: ["valueChange", "focus", "blur", "inputFocus", "inputBlur"], exportAs: ["kendoNumericTextBox"] }, { type: i3$1.NumericTextBoxCustomMessagesComponent, selector: "kendo-numerictextbox-messages" }], directives: [{ type: FocusableDirective, selector: "[kendoGridFocusable],\n [kendoGridEditCommand],\n [kendoGridRemoveCommand],\n [kendoGridSaveCommand],\n [kendoGridCancelCommand],\n [kendoGridSelectionCheckbox]\n ", inputs: ["kendoGridFocusable"] }, { type: FilterInputDirective, selector: "[kendoFilterInput]", inputs: ["filterDelay", "columnLabel", "value"] }] });
14307
14569
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: NumericFilterCellComponent, decorators: [{
14308
14570
  type: Component,
14309
14571
  args: [{
@@ -15979,12 +16241,14 @@ HeaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", versio
15979
16241
  </ng-container>
15980
16242
 
15981
16243
  <ng-container *ngIf="isCheckboxColumn(column) && !column.headerTemplateRef && $any(column).showSelectAll">
15982
- <input
15983
- class="k-checkbox k-checkbox-md k-rounded-md"
15984
- [attr.id]="selectAllCheckboxId()"
15985
- [attr.aria-label]="selectAllCheckboxLabel"
15986
- kendoGridSelectAllCheckbox
15987
- kendoGridFocusable>
16244
+ <span class="k-checkbox-wrap">
16245
+ <input
16246
+ class="k-checkbox k-checkbox-md k-rounded-md"
16247
+ [attr.id]="selectAllCheckboxId()"
16248
+ [attr.aria-label]="selectAllCheckboxLabel"
16249
+ kendoGridSelectAllCheckbox
16250
+ kendoGridFocusable>
16251
+ </span>
15988
16252
  </ng-container>
15989
16253
  <span kendoGridColumnHandle
15990
16254
  kendoDraggable
@@ -16203,12 +16467,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
16203
16467
  </ng-container>
16204
16468
 
16205
16469
  <ng-container *ngIf="isCheckboxColumn(column) && !column.headerTemplateRef && $any(column).showSelectAll">
16206
- <input
16207
- class="k-checkbox k-checkbox-md k-rounded-md"
16208
- [attr.id]="selectAllCheckboxId()"
16209
- [attr.aria-label]="selectAllCheckboxLabel"
16210
- kendoGridSelectAllCheckbox
16211
- kendoGridFocusable>
16470
+ <span class="k-checkbox-wrap">
16471
+ <input
16472
+ class="k-checkbox k-checkbox-md k-rounded-md"
16473
+ [attr.id]="selectAllCheckboxId()"
16474
+ [attr.aria-label]="selectAllCheckboxLabel"
16475
+ kendoGridSelectAllCheckbox
16476
+ kendoGridFocusable>
16477
+ </span>
16212
16478
  </ng-container>
16213
16479
  <span kendoGridColumnHandle
16214
16480
  kendoDraggable
@@ -16855,11 +17121,13 @@ CellComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version:
16855
17121
  </ng-container>
16856
17122
  <ng-container *ngIf="isBoundColumn">{{ dataItem | valueOf: column.field: column.format}}</ng-container>
16857
17123
  <ng-container *ngIf="isCheckboxColumn && !isNew">
16858
- <input
16859
- class="k-checkbox k-checkbox-md k-rounded-md"
16860
- [kendoGridSelectionCheckbox]="rowIndex"
16861
- [attr.id]="selectionCheckboxId"
16862
- [attr.aria-label]="selectionCheckboxLabel" />
17124
+ <span class="k-checkbox-wrap">
17125
+ <input
17126
+ class="k-checkbox k-checkbox-md k-rounded-md"
17127
+ [kendoGridSelectionCheckbox]="rowIndex"
17128
+ [attr.id]="selectionCheckboxId"
17129
+ [attr.aria-label]="selectionCheckboxLabel" />
17130
+ </span>
16863
17131
  </ng-container>
16864
17132
  <ng-container *ngIf="isRowReorderColumn && !isNew">
16865
17133
  <kendo-icon-wrapper
@@ -16898,13 +17166,15 @@ CellComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version:
16898
17166
  kendoGridFocusable
16899
17167
  ></kendo-datepicker>
16900
17168
 
16901
- <input
16902
- *ngSwitchCase="'boolean'"
16903
- type="checkbox"
16904
- class="k-checkbox k-checkbox-md k-rounded-md"
16905
- [formControl]="$any(formGroup.get(column.field))"
16906
- kendoGridFocusable
16907
- />
17169
+ <span class="k-checkbox-wrap">
17170
+ <input
17171
+ *ngSwitchCase="'boolean'"
17172
+ type="checkbox"
17173
+ class="k-checkbox k-checkbox-md k-rounded-md"
17174
+ [formControl]="$any(formGroup.get(column.field))"
17175
+ kendoGridFocusable
17176
+ />
17177
+ </span>
16908
17178
 
16909
17179
  <input
16910
17180
  *ngSwitchDefault
@@ -16916,7 +17186,7 @@ CellComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version:
16916
17186
  </ng-container>
16917
17187
  </ng-container>
16918
17188
  </ng-container>
16919
- `, isInline: true, components: [{ type: i3.IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }, { type: i3$1.NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode"], outputs: ["valueChange", "focus", "blur"], exportAs: ["kendoNumericTextBox"] }, { type: i4$3.DatePickerComponent, selector: "kendo-datepicker", inputs: ["focusableId", "cellTemplate", "monthCellTemplate", "yearCellTemplate", "decadeCellTemplate", "centuryCellTemplate", "weekNumberTemplate", "headerTitleTemplate", "navigationItemTemplate", "activeView", "bottomView", "topView", "calendarType", "animateCalendarNavigation", "disabled", "readonly", "readOnlyInput", "popupSettings", "navigation", "min", "max", "incompleteDateValidation", "autoCorrectParts", "autoSwitchParts", "autoSwitchKeys", "enableMouseWheel", "allowCaretMode", "autoFill", "focusedDate", "value", "format", "twoDigitYearMax", "formatPlaceholder", "placeholder", "tabindex", "tabIndex", "disabledDates", "title", "subtitle", "rangeValidation", "disabledDatesValidation", "weekNumber", "size", "rounded", "fillMode", "adaptiveMode"], outputs: ["valueChange", "focus", "blur", "open", "close"], exportAs: ["kendo-datepicker"] }], directives: [{ type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: FocusableDirective, selector: "[kendoGridFocusable],\n [kendoGridEditCommand],\n [kendoGridRemoveCommand],\n [kendoGridSaveCommand],\n [kendoGridCancelCommand],\n [kendoGridSelectionCheckbox]\n ", inputs: ["kendoGridFocusable"] }, { type: SelectionCheckboxDirective, selector: "[kendoGridSelectionCheckbox]", inputs: ["kendoGridSelectionCheckbox"] }, { type: i4$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i4$2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i4.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i4$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }], pipes: { "valueOf": FieldAccessorPipe } });
17189
+ `, isInline: true, components: [{ type: i3.IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }, { type: i3$1.NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode"], outputs: ["valueChange", "focus", "blur", "inputFocus", "inputBlur"], exportAs: ["kendoNumericTextBox"] }, { type: i4$3.DatePickerComponent, selector: "kendo-datepicker", inputs: ["focusableId", "cellTemplate", "monthCellTemplate", "yearCellTemplate", "decadeCellTemplate", "centuryCellTemplate", "weekNumberTemplate", "headerTitleTemplate", "navigationItemTemplate", "activeView", "bottomView", "topView", "calendarType", "animateCalendarNavigation", "disabled", "readonly", "readOnlyInput", "popupSettings", "navigation", "min", "max", "incompleteDateValidation", "autoCorrectParts", "autoSwitchParts", "autoSwitchKeys", "enableMouseWheel", "allowCaretMode", "autoFill", "focusedDate", "value", "format", "twoDigitYearMax", "formatPlaceholder", "placeholder", "tabindex", "tabIndex", "disabledDates", "title", "subtitle", "rangeValidation", "disabledDatesValidation", "weekNumber", "size", "rounded", "fillMode", "adaptiveMode"], outputs: ["valueChange", "focus", "blur", "open", "close"], exportAs: ["kendo-datepicker"] }], directives: [{ type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: FocusableDirective, selector: "[kendoGridFocusable],\n [kendoGridEditCommand],\n [kendoGridRemoveCommand],\n [kendoGridSaveCommand],\n [kendoGridCancelCommand],\n [kendoGridSelectionCheckbox]\n ", inputs: ["kendoGridFocusable"] }, { type: SelectionCheckboxDirective, selector: "[kendoGridSelectionCheckbox]", inputs: ["kendoGridSelectionCheckbox"] }, { type: i4$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i4$2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i4.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i4$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }], pipes: { "valueOf": FieldAccessorPipe } });
16920
17190
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: CellComponent, decorators: [{
16921
17191
  type: Component,
16922
17192
  args: [{
@@ -16936,11 +17206,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
16936
17206
  </ng-container>
16937
17207
  <ng-container *ngIf="isBoundColumn">{{ dataItem | valueOf: column.field: column.format}}</ng-container>
16938
17208
  <ng-container *ngIf="isCheckboxColumn && !isNew">
16939
- <input
16940
- class="k-checkbox k-checkbox-md k-rounded-md"
16941
- [kendoGridSelectionCheckbox]="rowIndex"
16942
- [attr.id]="selectionCheckboxId"
16943
- [attr.aria-label]="selectionCheckboxLabel" />
17209
+ <span class="k-checkbox-wrap">
17210
+ <input
17211
+ class="k-checkbox k-checkbox-md k-rounded-md"
17212
+ [kendoGridSelectionCheckbox]="rowIndex"
17213
+ [attr.id]="selectionCheckboxId"
17214
+ [attr.aria-label]="selectionCheckboxLabel" />
17215
+ </span>
16944
17216
  </ng-container>
16945
17217
  <ng-container *ngIf="isRowReorderColumn && !isNew">
16946
17218
  <kendo-icon-wrapper
@@ -16979,13 +17251,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
16979
17251
  kendoGridFocusable
16980
17252
  ></kendo-datepicker>
16981
17253
 
16982
- <input
16983
- *ngSwitchCase="'boolean'"
16984
- type="checkbox"
16985
- class="k-checkbox k-checkbox-md k-rounded-md"
16986
- [formControl]="$any(formGroup.get(column.field))"
16987
- kendoGridFocusable
16988
- />
17254
+ <span class="k-checkbox-wrap">
17255
+ <input
17256
+ *ngSwitchCase="'boolean'"
17257
+ type="checkbox"
17258
+ class="k-checkbox k-checkbox-md k-rounded-md"
17259
+ [formControl]="$any(formGroup.get(column.field))"
17260
+ kendoGridFocusable
17261
+ />
17262
+ </span>
16989
17263
 
16990
17264
  <input
16991
17265
  *ngSwitchDefault
@@ -17745,7 +18019,7 @@ TableBodyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", ver
17745
18019
  [attr.data-kendo-grid-item-index]="$any(item).index"
17746
18020
  [class.k-selected]="isSelectable() && isRowSelected(item)">
17747
18021
  <ng-container *ngIf="!skipGroupDecoration">
17748
- <td class="k-group-cell" *ngFor="let g of groups" role="presentation"></td>
18022
+ <td class="k-group-cell k-table-td" *ngFor="let g of groups" role="presentation"></td>
17749
18023
  </ng-container>
17750
18024
  <td class="k-hierarchy-cell k-table-td"
17751
18025
  *ngIf="detailTemplate?.templateRef"
@@ -17847,7 +18121,7 @@ TableBodyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", ver
17847
18121
  [logicalCellsCount]="columns.length"
17848
18122
  [logicalSlaveCellsCount]="unlockedColumnsCount(item)">
17849
18123
  <ng-container *ngIf="!skipGroupDecoration">
17850
- <td class="k-group-cell" *ngFor="let g of groups"></td>
18124
+ <td class="k-group-cell k-table-td" *ngFor="let g of groups"></td>
17851
18125
  </ng-container>
17852
18126
  <td class="k-hierarchy-cell k-table-td"
17853
18127
  *ngIf="detailTemplate?.templateRef"
@@ -17975,7 +18249,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
17975
18249
  [attr.data-kendo-grid-item-index]="$any(item).index"
17976
18250
  [class.k-selected]="isSelectable() && isRowSelected(item)">
17977
18251
  <ng-container *ngIf="!skipGroupDecoration">
17978
- <td class="k-group-cell" *ngFor="let g of groups" role="presentation"></td>
18252
+ <td class="k-group-cell k-table-td" *ngFor="let g of groups" role="presentation"></td>
17979
18253
  </ng-container>
17980
18254
  <td class="k-hierarchy-cell k-table-td"
17981
18255
  *ngIf="detailTemplate?.templateRef"
@@ -18077,7 +18351,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
18077
18351
  [logicalCellsCount]="columns.length"
18078
18352
  [logicalSlaveCellsCount]="unlockedColumnsCount(item)">
18079
18353
  <ng-container *ngIf="!skipGroupDecoration">
18080
- <td class="k-group-cell" *ngFor="let g of groups"></td>
18354
+ <td class="k-group-cell k-table-td" *ngFor="let g of groups"></td>
18081
18355
  </ng-container>
18082
18356
  <td class="k-hierarchy-cell k-table-td"
18083
18357
  *ngIf="detailTemplate?.templateRef"
@@ -19694,11 +19968,7 @@ const createControl = (source) => (acc, key) => {
19694
19968
  const validateColumnsField = (columns) => expandColumns(columns.toArray())
19695
19969
  .filter(isColumnComponent)
19696
19970
  .filter(({ field }) => !isValidFieldName(field))
19697
- .forEach(({ field }) => console.warn(`
19698
- Grid column field name '${field}' does not look like a valid JavaScript identifier.
19699
- Identifiers can contain only alphanumeric characters (including "$" or "_"), and may not start with a digit.
19700
- Please use only valid identifier names to ensure error-free operation.
19701
- `));
19971
+ .forEach(({ field }) => console.warn(ColumnConfigurationErrorMessages.fieldName(field)));
19702
19972
  const handleExpandCollapseGroupsService = (service, expandEmitter, collapseEmitter, map) => (service.changes.pipe(filter(({ group }) => isPresent(group)))
19703
19973
  .subscribe((x) => x.expand ? expandEmitter.emit(map(x)) : collapseEmitter.emit(map(x))));
19704
19974
  const handleExpandCollapseDetailsService = (service, expandEmitter, collapseEmitter, map) => (service.changes.pipe(filter(({ dataItem }) => isPresent(dataItem)))
@@ -20213,7 +20483,7 @@ class GridComponent {
20213
20483
  */
20214
20484
  set rowClass(fn) {
20215
20485
  if (isDevMode() && typeof fn !== 'function') {
20216
- throw new Error(`rowClass must be a function, but received ${JSON.stringify(fn)}.`);
20486
+ throw new Error(GridConfigurationErrorMessages.functionType('rowClass', fn));
20217
20487
  }
20218
20488
  this._rowClass = fn;
20219
20489
  }
@@ -20226,7 +20496,7 @@ class GridComponent {
20226
20496
  */
20227
20497
  set rowSticky(fn) {
20228
20498
  if (isDevMode() && isPresent(fn) && typeof fn !== 'function') {
20229
- throw new Error(`rowSticky must be a function, but received ${JSON.stringify(fn)}.`);
20499
+ throw new Error(GridConfigurationErrorMessages.functionType('rowSticky', fn));
20230
20500
  }
20231
20501
  if (isPresent(fn)) {
20232
20502
  this._rowSticky = fn;
@@ -20242,7 +20512,7 @@ class GridComponent {
20242
20512
  */
20243
20513
  set rowSelected(fn) {
20244
20514
  if (isDevMode() && typeof fn !== 'function') {
20245
- throw new Error(`rowSelected must be a function, but received ${JSON.stringify(fn)}.`);
20515
+ throw new Error(GridConfigurationErrorMessages.functionType('rowSelected', fn));
20246
20516
  }
20247
20517
  this._rowSelected = fn;
20248
20518
  }
@@ -20259,7 +20529,7 @@ class GridComponent {
20259
20529
  */
20260
20530
  set cellSelected(fn) {
20261
20531
  if (isDevMode() && typeof fn !== 'function') {
20262
- throw new Error(`cellSelected must be a function, but received ${JSON.stringify(fn)}.`);
20532
+ throw new Error(GridConfigurationErrorMessages.functionType('cellSelected', fn));
20263
20533
  }
20264
20534
  this._cellSelected = fn;
20265
20535
  }
@@ -20278,6 +20548,16 @@ class GridComponent {
20278
20548
  get activeRow() {
20279
20549
  return this.navigationService.activeRow;
20280
20550
  }
20551
+ /**
20552
+ * Returns the current Grid selection.
20553
+ *
20554
+ * @hidden
20555
+ */
20556
+ get selection() {
20557
+ return (this.selectable || this.selectionDirective) ?
20558
+ this.defaultSelection ? this.defaultSelection.stateToArray() : this.selectionDirective.stateToArray() :
20559
+ [];
20560
+ }
20281
20561
  /**
20282
20562
  * Specifies if the loading indicator of the Grid will be displayed ([see example]({% slug binding_grid %})).
20283
20563
  *
@@ -21194,7 +21474,7 @@ class GridComponent {
21194
21474
  instance = column;
21195
21475
  }
21196
21476
  if (!instance && isDevMode()) {
21197
- throw new Error(`Invalid column ${column}`);
21477
+ throw new Error(ColumnConfigurationErrorMessages.invalidColumn(column));
21198
21478
  }
21199
21479
  return instance;
21200
21480
  }
@@ -21203,43 +21483,43 @@ class GridComponent {
21203
21483
  const locked = this.lockedLeafColumns.length || (this.columnMenu && this.columnMenu.lock);
21204
21484
  const stickyColumns = this.stickyColumns.length || (this.columnMenu && this.columnMenu.stick);
21205
21485
  if (locked && this.detailTemplate) {
21206
- throw new Error('Having both detail template and locked columns is not supported.');
21486
+ throw new Error(GridConfigurationErrorMessages.incompatibleFeatures('detail template', 'locked columns'));
21207
21487
  }
21208
21488
  if (stickyColumns && this.detailTemplate) {
21209
- throw new Error('Having both detail template and sticky columns is not supported.');
21489
+ throw new Error(GridConfigurationErrorMessages.incompatibleFeatures('detail template', 'sticky columns'));
21210
21490
  }
21211
21491
  if (this.lockedLeafColumns.length && !this.nonLockedLeafColumns.length) {
21212
- throw new Error('There should be at least one non-locked column');
21492
+ throw new Error(GridConfigurationErrorMessages.nonLockedColumnPresent);
21213
21493
  }
21214
21494
  if ((locked || this.virtualColumns) && expandColumns(this.columnList.toArray()).filter(column => !column.width && !isColumnGroupComponent(column)).length) {
21215
- throw new Error((locked ? 'Locked' : 'Virtual') + ' columns feature requires all columns to have set width.');
21495
+ throw new Error(ColumnConfigurationErrorMessages.requiredWidth(locked ? 'Locked' : 'Virtual'));
21216
21496
  }
21217
21497
  if (locked && !this.isScrollable) {
21218
- throw new Error('Locked columns are only supported when scrolling is enabled.');
21498
+ throw new Error(ColumnConfigurationErrorMessages.requiredScroll('Locked'));
21499
+ }
21500
+ if (stickyColumns && !this.isScrollable) {
21501
+ throw new Error(ColumnConfigurationErrorMessages.requiredScroll('Sticky'));
21219
21502
  }
21220
21503
  if (this.columnList.filter(isColumnGroupComponent).filter((x) => !x.hasChildren).length) {
21221
- throw new Error('ColumnGroupComponent should contain ColumnComponent or CommandColumnComponent.');
21504
+ throw new Error(ColumnConfigurationErrorMessages.groupColumnContent);
21222
21505
  }
21223
21506
  if (this.columnList.filter(x => x.locked && x.parent && !x.parent.isLocked).length) {
21224
- throw new Error('Locked child columns require their parent columns to be locked.');
21507
+ throw new Error(ColumnConfigurationErrorMessages.lockedParent);
21225
21508
  }
21226
21509
  if ((this.rowHeight || this.detailRowHeight) && !this.isVirtual) {
21227
- throw new Error('Row height and detail row height settings require virtual scrolling mode to be enabled.');
21510
+ throw new Error(GridConfigurationErrorMessages.rowHeightVirtual);
21228
21511
  }
21229
21512
  if (stickyColumns && expandColumns(this.columnList.toArray()).filter(column => !column.width && !isColumnGroupComponent(column)).length) {
21230
- throw new Error('Sticky columns feature requires all columns to have set width.');
21231
- }
21232
- if (stickyColumns && !this.isScrollable) {
21233
- throw new Error('Sticky columns are only supported when scrolling is enabled.');
21513
+ throw new Error(ColumnConfigurationErrorMessages.requiredWidth('Sticky'));
21234
21514
  }
21235
21515
  if (stickyColumns && this.virtualColumns) {
21236
- throw new Error('Having both sticky columns and column virtualization is not supported.');
21516
+ throw new Error(GridConfigurationErrorMessages.incompatibleFeatures('sticky columns', 'column virtualization'));
21237
21517
  }
21238
21518
  if (this.rowSticky && this.scrollable === 'virtual') {
21239
- throw new Error('Having both sticky rows and row virtualization (scrollable="virtual") is not supported.');
21519
+ throw new Error(GridConfigurationErrorMessages.incompatibleFeatures('sticky rows', 'row virtualization (scrollable="virtual")'));
21240
21520
  }
21241
21521
  if (this.rowSticky && this.groupable) {
21242
- throw new Error('Having both sticky rows and grouping is not supported.');
21522
+ throw new Error(GridConfigurationErrorMessages.incompatibleFeatures('sticky rows', 'grouping'));
21243
21523
  }
21244
21524
  validateColumnsField(this.columnList);
21245
21525
  }
@@ -21438,7 +21718,7 @@ class GridComponent {
21438
21718
  }
21439
21719
  assertNavigable() {
21440
21720
  if (isDevMode() && !this.navigationService.enabled) {
21441
- throw new Error('The Grid should be configured as navigable to control focus');
21721
+ throw new Error(GridConfigurationErrorMessages.focusNavigable);
21442
21722
  }
21443
21723
  }
21444
21724
  navigationMetadata() {
@@ -21510,9 +21790,7 @@ class GridComponent {
21510
21790
  toggleDetailRowLegacy(index, expand) {
21511
21791
  const hasCallback = typeof this.isDetailExpanded === 'function';
21512
21792
  if (isDevMode() && hasCallback) {
21513
- throw new Error('The expandRow and collapseRow methods should not be called when using the ' +
21514
- 'kendoGridDetailsExpandBy directive or the isDetailExpanded callback. ' +
21515
- 'These methods are provided only for backwards compatibility with legacy versions.');
21793
+ throw new Error(GridConfigurationErrorMessages.expandCollapseMethods('expandRow', 'collapseRow', 'kendoGridDetailsExpandBy', 'isDetailExpanded'));
21516
21794
  }
21517
21795
  if (!isDevMode() && hasCallback) {
21518
21796
  return;
@@ -21524,9 +21802,7 @@ class GridComponent {
21524
21802
  toggleGroupRowLegacy(index, expand) {
21525
21803
  const hasCallback = typeof this.isGroupExpanded === 'function';
21526
21804
  if (isDevMode() && hasCallback) {
21527
- throw new Error('The expandGroup and collapseGroup methods should not be called when using the ' +
21528
- 'kendoGridExpandGroupBy directive or the isGroupExpanded callback. ' +
21529
- 'These methods are provided only for backwards compatibility with legacy versions.');
21805
+ throw new Error(GridConfigurationErrorMessages.expandCollapseMethods('expandGroup', 'collapseGroup', 'kendoGridExpandGroupBy', 'isGroupExpanded'));
21530
21806
  }
21531
21807
  if (!isDevMode() && hasCallback) {
21532
21808
  return;
@@ -21600,7 +21876,8 @@ GridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version:
21600
21876
  SortService,
21601
21877
  ContextService,
21602
21878
  SizingOptionsService,
21603
- RowReorderService
21879
+ RowReorderService,
21880
+ ClipboardService
21604
21881
  ], queries: [{ propertyName: "columns", predicate: ColumnBase }, { propertyName: "detailTemplateChildren", predicate: DetailTemplateDirective }, { propertyName: "cellLoadingTemplateChildren", predicate: CellLoadingTemplateDirective }, { propertyName: "loadingTemplateChildren", predicate: LoadingTemplateDirective }, { propertyName: "statusBarTemplateChildren", predicate: StatusBarTemplateDirective }, { propertyName: "noRecordsTemplateChildren", predicate: NoRecordsTemplateDirective }, { propertyName: "pagerTemplateChildren", predicate: PagerTemplateDirective }, { propertyName: "toolbarTemplateChildren", predicate: ToolbarTemplateDirective }, { propertyName: "columnMenuTemplates", predicate: ColumnMenuTemplateDirective }], viewQueries: [{ propertyName: "lockedHeader", first: true, predicate: ["lockedHeader"], descendants: true }, { propertyName: "header", first: true, predicate: ["header"], descendants: true }, { propertyName: "ariaRoot", first: true, predicate: ["ariaRoot"], descendants: true, static: true }, { propertyName: "dragTargetContainer", first: true, predicate: DragTargetContainerDirective, descendants: true }, { propertyName: "dropTargetContainer", first: true, predicate: DropTargetContainerDirective, descendants: true }, { propertyName: "footer", predicate: ["footer"], descendants: true }], exportAs: ["kendoGrid"], usesOnChanges: true, ngImport: i0, template: `
21605
21882
  <ng-container kendoGridLocalizedMessages
21606
21883
  i18n-groupPanelEmpty="kendo.grid.groupPanelEmpty|The label visible in the Grid group panel when it is empty"
@@ -22228,7 +22505,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
22228
22505
  SortService,
22229
22506
  ContextService,
22230
22507
  SizingOptionsService,
22231
- RowReorderService
22508
+ RowReorderService,
22509
+ ClipboardService
22232
22510
  ],
22233
22511
  selector: 'kendo-grid',
22234
22512
  template: `
@@ -23158,11 +23436,12 @@ class DataBindingDirective {
23158
23436
  }
23159
23437
  }
23160
23438
  DataBindingDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: DataBindingDirective, deps: [{ token: GridComponent }, { token: i0.ChangeDetectorRef }, { token: LocalDataChangesService }, { token: RowReorderService }], target: i0.ɵɵFactoryTarget.Directive });
23161
- DataBindingDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.12", type: DataBindingDirective, selector: "[kendoGridBinding]", inputs: { skip: "skip", sort: "sort", filter: "filter", pageSize: "pageSize", group: "group", data: ["kendoGridBinding", "data"] }, usesOnChanges: true, ngImport: i0 });
23439
+ DataBindingDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.12", type: DataBindingDirective, selector: "[kendoGridBinding]", inputs: { skip: "skip", sort: "sort", filter: "filter", pageSize: "pageSize", group: "group", data: ["kendoGridBinding", "data"] }, exportAs: ["kendoGridBinding"], usesOnChanges: true, ngImport: i0 });
23162
23440
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: DataBindingDirective, decorators: [{
23163
23441
  type: Directive,
23164
23442
  args: [{
23165
- selector: '[kendoGridBinding]'
23443
+ selector: '[kendoGridBinding]',
23444
+ exportAs: 'kendoGridBinding'
23166
23445
  }]
23167
23446
  }], ctorParameters: function () { return [{ type: GridComponent }, { type: i0.ChangeDetectorRef }, { type: LocalDataChangesService }, { type: RowReorderService }]; }, propDecorators: { skip: [{
23168
23447
  type: Input
@@ -23539,7 +23818,7 @@ AutoCompleteFilterCellComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion:
23539
23818
  [value]="currentFilter?.value">
23540
23819
  </kendo-autocomplete>
23541
23820
  </kendo-grid-filter-wrapper-cell>
23542
- `, isInline: true, components: [{ type: FilterCellWrapperComponent, selector: "kendo-grid-filter-wrapper-cell", inputs: ["showOperators"] }, { type: i1$4.AutoCompleteComponent, selector: "kendo-autocomplete", inputs: ["highlightFirst", "showStickyHeader", "focusableId", "data", "value", "valueField", "placeholder", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "loading", "clearButton", "suggest", "disabled", "itemDisabled", "readonly", "tabindex", "tabIndex", "filterable", "virtual", "size", "rounded", "fillMode"], outputs: ["valueChange", "filterChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoAutoComplete"] }], directives: [{ type: FilterInputDirective, selector: "[kendoFilterInput]", inputs: ["filterDelay", "columnLabel", "value"] }] });
23821
+ `, isInline: true, components: [{ type: FilterCellWrapperComponent, selector: "kendo-grid-filter-wrapper-cell", inputs: ["showOperators"] }, { type: i1$4.AutoCompleteComponent, selector: "kendo-autocomplete", inputs: ["highlightFirst", "showStickyHeader", "focusableId", "data", "value", "valueField", "placeholder", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "loading", "clearButton", "suggest", "disabled", "itemDisabled", "readonly", "tabindex", "tabIndex", "filterable", "virtual", "size", "rounded", "fillMode"], outputs: ["valueChange", "filterChange", "open", "opened", "close", "closed", "focus", "blur", "inputFocus", "inputBlur"], exportAs: ["kendoAutoComplete"] }], directives: [{ type: FilterInputDirective, selector: "[kendoFilterInput]", inputs: ["filterDelay", "columnLabel", "value"] }] });
23543
23822
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: AutoCompleteFilterCellComponent, decorators: [{
23544
23823
  type: Component,
23545
23824
  args: [{
@@ -25683,8 +25962,7 @@ class LocalEditService {
25683
25962
  return data;
25684
25963
  }
25685
25964
  if (isDevMode()) {
25686
- throw new Error('The default edit service of the editing directives works only when binding to plain array.' +
25687
- 'Please provide an editService.');
25965
+ throw new Error(GridConfigurationErrorMessages.requiredEditService);
25688
25966
  }
25689
25967
  return [];
25690
25968
  }
@@ -26191,9 +26469,7 @@ class GroupBindingDirective extends DataBindingDirective {
26191
26469
  }
26192
26470
  ngAfterContentInit() {
26193
26471
  if (isDevMode() && this.grid.isGroupExpanded) {
26194
- throw new Error('Using the `kendoGridGroupBinding` directive in combination with the `kendoGridExpandGroupBy` directive ' +
26195
- 'or the `isGroupExpanded` callback is not supported. To use grouping with the `kendoGridGroupBinding` directive, ' +
26196
- 'set the Grid `groupable` property to `true`.');
26472
+ throw new Error(GridConfigurationErrorMessages.groupBindingDirectives);
26197
26473
  }
26198
26474
  }
26199
26475
  groupExpand({ groupIndex }) {
@@ -26325,6 +26601,176 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
26325
26601
  }]
26326
26602
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: ContextService }]; } });
26327
26603
 
26604
+ /**
26605
+ * The directive that enables the Grid built-in clipboard support. Allows copy, cut, and paste interactions
26606
+ * with the Grid.
26607
+ */
26608
+ class GridClipboardDirective {
26609
+ constructor(host, clipboardService, renderer, zone) {
26610
+ this.host = host;
26611
+ this.clipboardService = clipboardService;
26612
+ this.renderer = renderer;
26613
+ this.zone = zone;
26614
+ /**
26615
+ * Fires when the user performs `cut`, `copy` or `paste` action within the Grid content area.
26616
+ */
26617
+ this.clipboard = new EventEmitter();
26618
+ this._target = 'selection';
26619
+ this._clipboardSettings = {
26620
+ wholeRow: false,
26621
+ copyHeaders: false,
26622
+ copy: true,
26623
+ cut: true,
26624
+ paste: true
26625
+ };
26626
+ this.subs = new Subscription();
26627
+ this.onClipboard = (operationType, args) => {
26628
+ if (!this.clipboardSettings[operationType] || !this.inGrid(args)) {
26629
+ return;
26630
+ }
26631
+ const gridData = Array.isArray(this.host.data) ? this.host.data : this.host.data.data;
26632
+ const gridDataItems = gridData.flatMap(recursiveFlatMap);
26633
+ const selection = this.host.selection;
26634
+ const selectionDirective = this.host.selectionDirective;
26635
+ const targetType = this.clipboardTarget;
26636
+ const isCellSelection = (this.host.selectable?.cell || selectionDirective.isCellSelectionMode);
26637
+ let clipboardData = [];
26638
+ switch (targetType) {
26639
+ case 'activeCell':
26640
+ {
26641
+ const targetCell = { ...this.host.activeCell };
26642
+ clipboardData = targetCell && [{ dataItem: targetCell.dataItem, dataRowIndex: targetCell.dataRowIndex, colIndex: targetCell.colIndex }];
26643
+ }
26644
+ break;
26645
+ case 'selection':
26646
+ {
26647
+ const identifier = selectionDirective.selectionKey;
26648
+ clipboardData = gridDataItems.flatMap((item, index) => {
26649
+ if (identifier) {
26650
+ const key = typeof identifier === 'string' ? item[identifier] : identifier({ index: index + this.host.skip, dataItem: item });
26651
+ return isCellSelection ?
26652
+ selection.some(s => s.itemKey === key) ? [{ dataItem: item, dataRowIndex: index + this.host.skip }] : [] :
26653
+ selection.indexOf(key) > -1 ? [{ dataItem: item, dataRowIndex: index + this.host.skip }] : [];
26654
+ }
26655
+ return isCellSelection ?
26656
+ selection.some(s => s.itemKey === index + this.host.skip) ? [{ dataItem: item, dataRowIndex: index + this.host.skip }] : [] :
26657
+ selection.indexOf(index + this.host.skip) > -1 ? [{ dataItem: item, dataRowIndex: index + this.host.skip }] : [];
26658
+ });
26659
+ }
26660
+ break;
26661
+ }
26662
+ const isPaste = operationType === 'paste';
26663
+ const pastedData = args.clipboardData.getData('text').trim();
26664
+ const visibleCols = this.host.columns.toArray().filter(c => c.isVisible);
26665
+ const data = isPaste ?
26666
+ {
26667
+ dataString: pastedData,
26668
+ gridItems: this.clipboardService.getGridData(pastedData, visibleCols, this.clipboardTarget, clipboardData[0]?.dataRowIndex, {
26669
+ wholeRow: this.clipboardSettings.wholeRow,
26670
+ isCellSelection
26671
+ })
26672
+ } :
26673
+ this.clipboardService.createClipboardData(clipboardData || [], visibleCols, {
26674
+ wholeRow: this.clipboardSettings.wholeRow || (this.clipboardTarget === 'selection' && !isCellSelection),
26675
+ target: this.clipboardTarget,
26676
+ copyHeaders: this.clipboardSettings.copyHeaders,
26677
+ operationType
26678
+ });
26679
+ !isPaste && navigator.clipboard.writeText(data.dataString);
26680
+ if (hasObservers(this.clipboard)) {
26681
+ this.zone.run(() => {
26682
+ this.clipboard.emit({
26683
+ type: operationType,
26684
+ originalEvent: args,
26685
+ clipboardData: data.dataString,
26686
+ gridData: data.gridItems,
26687
+ target: {
26688
+ dataRowIndex: this.clipboardService.targetRowIndex,
26689
+ colField: this.clipboardService.targetColField,
26690
+ dataItem: clipboardData.find(item => item.dataRowIndex === this.clipboardService.targetRowIndex)?.dataItem
26691
+ }
26692
+ });
26693
+ });
26694
+ }
26695
+ this.clipboardService.targetColField = this.clipboardService.targetRowIndex = null;
26696
+ };
26697
+ this.inGrid = (args) => {
26698
+ const target = document.activeElement.matches('.k-table-td') ? document.activeElement : args.target;
26699
+ const inContentArea = closest(target, node => node.parentElement?.classList.contains('k-grid-container'));
26700
+ const inHost = contains$2(this.host.wrapper.nativeElement, target);
26701
+ return target && inHost && inContentArea;
26702
+ };
26703
+ }
26704
+ /**
26705
+ * Determines the target of the clipboard operation ([see example]({% slug clipboard_grid %}#toc-clipboard-target)). The possible options are:
26706
+ * - `activeCell`
26707
+ * - `selection`
26708
+ *
26709
+ * @default 'selection'
26710
+ */
26711
+ set clipboardTarget(value) {
26712
+ if (isDevMode()) {
26713
+ this.zone.onStable.pipe(take(1)).subscribe(() => {
26714
+ if (value === 'activeCell' && !(this.host.navigable.length)) {
26715
+ console.warn(ClipboardErrorMessages.clipboardTarget.activeCellNavigable);
26716
+ }
26717
+ else if (value === 'selection' && !(this.host.selectable || this.host.selectionDirective)) {
26718
+ console.warn(ClipboardErrorMessages.selectionSelectable);
26719
+ }
26720
+ });
26721
+ }
26722
+ this._target = value;
26723
+ }
26724
+ get clipboardTarget() {
26725
+ return this._target;
26726
+ }
26727
+ /**
26728
+ * The `GridClipboardDirective` settings.
26729
+ *
26730
+ * @default { wholeRow: false, copyHeaders: false copy: true, cut: true, paste: true }
26731
+ */
26732
+ set clipboardSettings(value) {
26733
+ this._clipboardSettings = Object.assign({}, this._clipboardSettings, value);
26734
+ }
26735
+ get clipboardSettings() {
26736
+ return this._clipboardSettings;
26737
+ }
26738
+ ngAfterViewInit() {
26739
+ if (!isDocumentAvailable()) {
26740
+ return;
26741
+ }
26742
+ if (this.clipboardTarget === 'selection' && !(this.host.selectable || this.host.selectionDirective)) {
26743
+ console.warn(ClipboardErrorMessages.selectionSelectable);
26744
+ }
26745
+ // needed due to the following issue in Chrome
26746
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=1156117&q=focus%20programmatically%20paste&can=2
26747
+ this.zone.runOutsideAngular(() => {
26748
+ this.subs.add(this.renderer.listen(document, 'copy', (args) => this.onClipboard('copy', args)));
26749
+ this.subs.add(this.renderer.listen(document, 'cut', (args) => this.onClipboard('cut', args)));
26750
+ this.subs.add(this.renderer.listen(document, 'paste', (args) => this.onClipboard('paste', args)));
26751
+ });
26752
+ }
26753
+ ngOnDestroy() {
26754
+ this.subs.unsubscribe();
26755
+ }
26756
+ }
26757
+ GridClipboardDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: GridClipboardDirective, deps: [{ token: GridComponent }, { token: ClipboardService }, { token: i0.Renderer2 }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive });
26758
+ GridClipboardDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.12", type: GridClipboardDirective, selector: "[kendoGridClipboard]", inputs: { clipboardTarget: "clipboardTarget", clipboardSettings: "clipboardSettings" }, outputs: { clipboard: "clipboard" }, providers: [ClipboardService], exportAs: ["kendoGridClipboard"], ngImport: i0 });
26759
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: GridClipboardDirective, decorators: [{
26760
+ type: Directive,
26761
+ args: [{
26762
+ selector: '[kendoGridClipboard]',
26763
+ exportAs: 'kendoGridClipboard',
26764
+ providers: [ClipboardService]
26765
+ }]
26766
+ }], ctorParameters: function () { return [{ type: GridComponent }, { type: ClipboardService }, { type: i0.Renderer2 }, { type: i0.NgZone }]; }, propDecorators: { clipboardTarget: [{
26767
+ type: Input
26768
+ }], clipboardSettings: [{
26769
+ type: Input
26770
+ }], clipboard: [{
26771
+ type: Output
26772
+ }] } });
26773
+
26328
26774
  const exportedModules$1 = [
26329
26775
  GridComponent,
26330
26776
  ToolbarTemplateDirective,
@@ -26349,7 +26795,8 @@ const exportedModules$1 = [
26349
26795
  ...PagerModule.exports(),
26350
26796
  ...RowFilterModule.exports(),
26351
26797
  ...FilterMenuModule.exports(),
26352
- ...ColumnMenuModule.exports()
26798
+ ...ColumnMenuModule.exports(),
26799
+ GridClipboardDirective
26353
26800
  ];
26354
26801
  const declarations$2 = [
26355
26802
  GridComponent,
@@ -26370,7 +26817,8 @@ const declarations$2 = [
26370
26817
  GridSpacerComponent,
26371
26818
  GridToolbarFocusableDirective,
26372
26819
  StatusBarComponent,
26373
- StatusBarTemplateDirective
26820
+ StatusBarTemplateDirective,
26821
+ GridClipboardDirective
26374
26822
  ];
26375
26823
  /**
26376
26824
  * Represents the [NgModule](link:site.data.urls.angular['ngmoduleapi'])
@@ -26414,7 +26862,8 @@ GridModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13
26414
26862
  GridSpacerComponent,
26415
26863
  GridToolbarFocusableDirective,
26416
26864
  StatusBarComponent,
26417
- StatusBarTemplateDirective], imports: [CommonModule,
26865
+ StatusBarTemplateDirective,
26866
+ GridClipboardDirective], imports: [CommonModule,
26418
26867
  GroupModule,
26419
26868
  SharedModule,
26420
26869
  BodyModule,
@@ -26440,7 +26889,7 @@ GridModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13
26440
26889
  InCellEditingDirective,
26441
26890
  ExpandDetailsDirective,
26442
26891
  ExpandGroupDirective,
26443
- GridToolbarFocusableDirective, GroupHeaderTemplateDirective, GroupHeaderColumnTemplateDirective, GroupFooterTemplateDirective, ColumnComponent, SpanColumnComponent, ColumnGroupComponent, FooterTemplateDirective, DetailTemplateDirective, FocusableDirective, GridTableDirective, CommandColumnComponent, CheckboxColumnComponent, SelectionCheckboxDirective, CellTemplateDirective, NoRecordsTemplateDirective, EditTemplateDirective, EditCommandDirective, CancelCommandDirective, SaveCommandDirective, RemoveCommandDirective, AddCommandDirective, CellLoadingTemplateDirective, LoadingTemplateDirective, RowReorderColumnComponent, HeaderTemplateDirective, SelectAllCheckboxDirective, PagerComponent, PagerPrevButtonsComponent, PagerNextButtonsComponent, PagerNumericButtonsComponent, PagerInputComponent, PagerInfoComponent, PagerPageSizesComponent, PagerTemplateDirective, PagerDropDownListDirective, PagerInputDirective, FilterRowComponent, FilterCellComponent, FilterCellTemplateDirective, FilterCellOperatorsComponent, StringFilterCellComponent, NumericFilterCellComponent, AutoCompleteFilterCellComponent, BooleanFilterCellComponent, DateFilterCellComponent, FilterCellOperatorsComponent, ContainsFilterOperatorComponent, DoesNotContainFilterOperatorComponent, EndsWithFilterOperatorComponent, EqualFilterOperatorComponent, IsEmptyFilterOperatorComponent, IsNotEmptyFilterOperatorComponent, IsNotNullFilterOperatorComponent, IsNullFilterOperatorComponent, NotEqualFilterOperatorComponent, StartsWithFilterOperatorComponent, GreaterFilterOperatorComponent, GreaterOrEqualToFilterOperatorComponent, LessFilterOperatorComponent, LessOrEqualToFilterOperatorComponent, AfterFilterOperatorComponent, AfterEqFilterOperatorComponent, BeforeEqFilterOperatorComponent, BeforeFilterOperatorComponent, StringFilterMenuComponent, FilterMenuTemplateDirective, NumericFilterMenuComponent, DateFilterMenuComponent, BooleanFilterMenuComponent, FilterMenuDropDownListDirective, BooleanFilterRadioButtonDirective, FilterCellOperatorsComponent, ContainsFilterOperatorComponent, DoesNotContainFilterOperatorComponent, EndsWithFilterOperatorComponent, EqualFilterOperatorComponent, IsEmptyFilterOperatorComponent, IsNotEmptyFilterOperatorComponent, IsNotNullFilterOperatorComponent, IsNullFilterOperatorComponent, NotEqualFilterOperatorComponent, StartsWithFilterOperatorComponent, GreaterFilterOperatorComponent, GreaterOrEqualToFilterOperatorComponent, LessFilterOperatorComponent, LessOrEqualToFilterOperatorComponent, AfterFilterOperatorComponent, AfterEqFilterOperatorComponent, BeforeEqFilterOperatorComponent, BeforeFilterOperatorComponent, ColumnChooserComponent, ColumnMenuFilterComponent, ColumnMenuItemComponent, ColumnMenuItemContentTemplateDirective, ColumnMenuSortComponent, ColumnMenuLockComponent, ColumnMenuStickComponent, ColumnMenuPositionComponent, ColumnMenuChooserComponent, ColumnMenuTemplateDirective, ColumnMenuContainerComponent, ColumnMenuItemDirective, ColumnMenuComponent, ColumnMenuAutoSizeColumnComponent, ColumnMenuAutoSizeAllColumnsComponent] });
26892
+ GridToolbarFocusableDirective, GroupHeaderTemplateDirective, GroupHeaderColumnTemplateDirective, GroupFooterTemplateDirective, ColumnComponent, SpanColumnComponent, ColumnGroupComponent, FooterTemplateDirective, DetailTemplateDirective, FocusableDirective, GridTableDirective, CommandColumnComponent, CheckboxColumnComponent, SelectionCheckboxDirective, CellTemplateDirective, NoRecordsTemplateDirective, EditTemplateDirective, EditCommandDirective, CancelCommandDirective, SaveCommandDirective, RemoveCommandDirective, AddCommandDirective, CellLoadingTemplateDirective, LoadingTemplateDirective, RowReorderColumnComponent, HeaderTemplateDirective, SelectAllCheckboxDirective, PagerComponent, PagerPrevButtonsComponent, PagerNextButtonsComponent, PagerNumericButtonsComponent, PagerInputComponent, PagerInfoComponent, PagerPageSizesComponent, PagerTemplateDirective, PagerDropDownListDirective, PagerInputDirective, FilterRowComponent, FilterCellComponent, FilterCellTemplateDirective, FilterCellOperatorsComponent, StringFilterCellComponent, NumericFilterCellComponent, AutoCompleteFilterCellComponent, BooleanFilterCellComponent, DateFilterCellComponent, FilterCellOperatorsComponent, ContainsFilterOperatorComponent, DoesNotContainFilterOperatorComponent, EndsWithFilterOperatorComponent, EqualFilterOperatorComponent, IsEmptyFilterOperatorComponent, IsNotEmptyFilterOperatorComponent, IsNotNullFilterOperatorComponent, IsNullFilterOperatorComponent, NotEqualFilterOperatorComponent, StartsWithFilterOperatorComponent, GreaterFilterOperatorComponent, GreaterOrEqualToFilterOperatorComponent, LessFilterOperatorComponent, LessOrEqualToFilterOperatorComponent, AfterFilterOperatorComponent, AfterEqFilterOperatorComponent, BeforeEqFilterOperatorComponent, BeforeFilterOperatorComponent, StringFilterMenuComponent, FilterMenuTemplateDirective, NumericFilterMenuComponent, DateFilterMenuComponent, BooleanFilterMenuComponent, FilterMenuDropDownListDirective, BooleanFilterRadioButtonDirective, FilterCellOperatorsComponent, ContainsFilterOperatorComponent, DoesNotContainFilterOperatorComponent, EndsWithFilterOperatorComponent, EqualFilterOperatorComponent, IsEmptyFilterOperatorComponent, IsNotEmptyFilterOperatorComponent, IsNotNullFilterOperatorComponent, IsNullFilterOperatorComponent, NotEqualFilterOperatorComponent, StartsWithFilterOperatorComponent, GreaterFilterOperatorComponent, GreaterOrEqualToFilterOperatorComponent, LessFilterOperatorComponent, LessOrEqualToFilterOperatorComponent, AfterFilterOperatorComponent, AfterEqFilterOperatorComponent, BeforeEqFilterOperatorComponent, BeforeFilterOperatorComponent, ColumnChooserComponent, ColumnMenuFilterComponent, ColumnMenuItemComponent, ColumnMenuItemContentTemplateDirective, ColumnMenuSortComponent, ColumnMenuLockComponent, ColumnMenuStickComponent, ColumnMenuPositionComponent, ColumnMenuChooserComponent, ColumnMenuTemplateDirective, ColumnMenuContainerComponent, ColumnMenuItemDirective, ColumnMenuComponent, ColumnMenuAutoSizeColumnComponent, ColumnMenuAutoSizeAllColumnsComponent, GridClipboardDirective] });
26444
26893
  GridModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: GridModule, imports: [[
26445
26894
  CommonModule,
26446
26895
  GroupModule,
@@ -26737,13 +27186,13 @@ class PDFComponent extends PDFExportComponent {
26737
27186
  * @hidden
26738
27187
  */
26739
27188
  saveAs(_) {
26740
- throw new Error('Not supported. Use GridComponent.saveAsPDF');
27189
+ throw new Error(GridConfigurationErrorMessages.unsupportedMethod('saveAs', 'GridComponent.saveAsPDF'));
26741
27190
  }
26742
27191
  /**
26743
27192
  * @hidden
26744
27193
  */
26745
27194
  export() {
26746
- throw new Error('Not supported. Use GridComponent.drawPDF');
27195
+ throw new Error(GridConfigurationErrorMessages.unsupportedMethod('export', 'GridComponent.drawPDF'));
26747
27196
  }
26748
27197
  savePDF(component) {
26749
27198
  this.createPDF(component, this.draw);
@@ -27338,5 +27787,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
27338
27787
  * Generated bundle index. Do not edit.
27339
27788
  */
27340
27789
 
27341
- export { AddCommandDirective, AfterEqFilterOperatorComponent, AfterFilterOperatorComponent, AutoCompleteFilterCellComponent, BaseFilterCellComponent, BeforeEqFilterOperatorComponent, BeforeFilterOperatorComponent, BodyModule, BooleanFilterCellComponent, BooleanFilterComponent, BooleanFilterMenuComponent, BooleanFilterRadioButtonDirective, BrowserSupportService, CELL_CONTEXT, CancelCommandDirective, CellCloseEvent, CellComponent, CellLoadingTemplateDirective, CellSelectionService, CellTemplateDirective, ChangeNotificationService, CheckboxColumnComponent, ColGroupComponent, ColumnBase, ColumnChooserComponent, ColumnComponent, ColumnGroupComponent, ColumnHandleDirective, ColumnInfoService, ColumnListComponent, ColumnLockedChangeEvent, ColumnMenuAutoSizeAllColumnsComponent, ColumnMenuAutoSizeColumnComponent, ColumnMenuChooserComponent, ColumnMenuComponent, ColumnMenuContainerComponent, ColumnMenuFilterComponent, ColumnMenuItemComponent, ColumnMenuItemContentTemplateDirective, ColumnMenuItemDirective, ColumnMenuLockComponent, ColumnMenuPositionComponent, ColumnMenuService, ColumnMenuSortComponent, ColumnMenuStickComponent, ColumnMenuTemplateDirective, ColumnReorderEvent, ColumnReorderService, ColumnResizingService, ColumnStickyChangeEvent, ColumnVisibilityChangeEvent, ColumnsContainer, CommandColumnComponent, ContainsFilterOperatorComponent, ContextService, CustomMessagesComponent, DEFAULT_SCROLLER_FACTORY, DataBindingDirective, DateFilterCellComponent, DateFilterComponent, DateFilterMenuComponent, DateFilterMenuInputComponent, DetailCollapseEvent, DetailExpandEvent, DetailTemplateDirective, DetailsService, DoesNotContainFilterOperatorComponent, DomEventsService, DragAndDropService, DragHintService, DropCueService, EditCommandDirective, EditService, EditTemplateDirective, EditingDirectiveBase, EndsWithFilterOperatorComponent, EqualFilterOperatorComponent, ExcelCommandDirective, ExcelComponent, ExcelExportEvent, ExcelModule, ExcelService, ExpandDetailsDirective, ExpandGroupDirective, FieldAccessorPipe, FilterCellComponent, FilterCellHostDirective, FilterCellOperatorsComponent, FilterCellTemplateDirective, FilterCellWrapperComponent, FilterInputDirective, FilterMenuComponent, FilterMenuContainerComponent, FilterMenuDropDownListDirective, FilterMenuHostDirective, FilterMenuInputWrapperComponent, FilterMenuModule, FilterMenuTemplateDirective, FilterRowComponent, FilterService, FocusRoot, FocusableDirective, FooterComponent, FooterModule, FooterTemplateDirective, GreaterFilterOperatorComponent, GreaterOrEqualToFilterOperatorComponent, GridComponent, GridModule, GridSpacerComponent, GridTableDirective, GridToolbarFocusableDirective, GridToolbarNavigationService, GroupBindingDirective, GroupFooterTemplateDirective, GroupHeaderColumnTemplateDirective, GroupHeaderComponent, GroupHeaderTemplateDirective, GroupInfoService, GroupModule, GroupPanelComponent, GroupsService, HeaderComponent, HeaderModule, HeaderTemplateDirective, IdService, InCellEditingDirective, IsEmptyFilterOperatorComponent, IsNotEmptyFilterOperatorComponent, IsNotNullFilterOperatorComponent, IsNullFilterOperatorComponent, LessFilterOperatorComponent, LessOrEqualToFilterOperatorComponent, ListComponent, LoadingComponent, LoadingTemplateDirective, LocalDataChangesService, LogicalCellDirective, LogicalRowDirective, MenuTabbingService, NavigationService, NoRecordsTemplateDirective, NotEqualFilterOperatorComponent, NumericFilterCellComponent, NumericFilterComponent, NumericFilterMenuComponent, NumericFilterMenuInputComponent, PDFCommandDirective, PDFComponent, PDFMarginComponent, PDFModule, PDFService, PDFTemplateDirective, PagerComponent, PagerContextService, PagerDropDownListDirective, PagerInfoComponent, PagerInputComponent, PagerInputDirective, PagerModule, PagerNextButtonsComponent, PagerNumericButtonsComponent, PagerPageSizesComponent, PagerPrevButtonsComponent, PagerTemplateDirective, PopupCloseEvent, ReactiveEditingDirective, RemoveCommandDirective, ResizableContainerDirective, ResizeService, ResponsiveService, RowEditingDirectiveBase, RowFilterModule, RowReorderColumnComponent, RowReorderService, SaveCommandDirective, ScrollRequestService, ScrollSyncService, SelectAllCheckboxDirective, SelectionCheckboxDirective, SelectionDirective, SelectionService, SharedFilterModule, SharedModule, SinglePopupService, SizingOptionsService, Skip, SortService, SpanColumnComponent, StartsWithFilterOperatorComponent, StatusBarTemplateDirective, StringFilterCellComponent, StringFilterComponent, StringFilterMenuComponent, StringFilterMenuInputComponent, SuspendService, TableBodyComponent, TableDirective, TemplateContextDirective, TemplateEditingDirective, ToolbarComponent, ToolbarTemplateDirective, count, defaultTrackBy, hasFilterMenu, hasFilterRow, isFilterable, slice };
27790
+ export { AddCommandDirective, AfterEqFilterOperatorComponent, AfterFilterOperatorComponent, AutoCompleteFilterCellComponent, BaseFilterCellComponent, BeforeEqFilterOperatorComponent, BeforeFilterOperatorComponent, BodyModule, BooleanFilterCellComponent, BooleanFilterComponent, BooleanFilterMenuComponent, BooleanFilterRadioButtonDirective, BrowserSupportService, CELL_CONTEXT, CancelCommandDirective, CellCloseEvent, CellComponent, CellLoadingTemplateDirective, CellSelectionService, CellTemplateDirective, ChangeNotificationService, CheckboxColumnComponent, ColGroupComponent, ColumnBase, ColumnChooserComponent, ColumnComponent, ColumnGroupComponent, ColumnHandleDirective, ColumnInfoService, ColumnListComponent, ColumnLockedChangeEvent, ColumnMenuAutoSizeAllColumnsComponent, ColumnMenuAutoSizeColumnComponent, ColumnMenuChooserComponent, ColumnMenuComponent, ColumnMenuContainerComponent, ColumnMenuFilterComponent, ColumnMenuItemComponent, ColumnMenuItemContentTemplateDirective, ColumnMenuItemDirective, ColumnMenuLockComponent, ColumnMenuPositionComponent, ColumnMenuService, ColumnMenuSortComponent, ColumnMenuStickComponent, ColumnMenuTemplateDirective, ColumnReorderEvent, ColumnReorderService, ColumnResizingService, ColumnStickyChangeEvent, ColumnVisibilityChangeEvent, ColumnsContainer, CommandColumnComponent, ContainsFilterOperatorComponent, ContextService, CustomMessagesComponent, DEFAULT_SCROLLER_FACTORY, DataBindingDirective, DateFilterCellComponent, DateFilterComponent, DateFilterMenuComponent, DateFilterMenuInputComponent, DetailCollapseEvent, DetailExpandEvent, DetailTemplateDirective, DetailsService, DoesNotContainFilterOperatorComponent, DomEventsService, DragAndDropService, DragHintService, DropCueService, EditCommandDirective, EditService, EditTemplateDirective, EditingDirectiveBase, EndsWithFilterOperatorComponent, EqualFilterOperatorComponent, ExcelCommandDirective, ExcelComponent, ExcelExportEvent, ExcelModule, ExcelService, ExpandDetailsDirective, ExpandGroupDirective, FieldAccessorPipe, FilterCellComponent, FilterCellHostDirective, FilterCellOperatorsComponent, FilterCellTemplateDirective, FilterCellWrapperComponent, FilterInputDirective, FilterMenuComponent, FilterMenuContainerComponent, FilterMenuDropDownListDirective, FilterMenuHostDirective, FilterMenuInputWrapperComponent, FilterMenuModule, FilterMenuTemplateDirective, FilterRowComponent, FilterService, FocusRoot, FocusableDirective, FooterComponent, FooterModule, FooterTemplateDirective, GreaterFilterOperatorComponent, GreaterOrEqualToFilterOperatorComponent, GridClipboardDirective, GridComponent, GridModule, GridSpacerComponent, GridTableDirective, GridToolbarFocusableDirective, GridToolbarNavigationService, GroupBindingDirective, GroupFooterTemplateDirective, GroupHeaderColumnTemplateDirective, GroupHeaderComponent, GroupHeaderTemplateDirective, GroupInfoService, GroupModule, GroupPanelComponent, GroupsService, HeaderComponent, HeaderModule, HeaderTemplateDirective, IdService, InCellEditingDirective, IsEmptyFilterOperatorComponent, IsNotEmptyFilterOperatorComponent, IsNotNullFilterOperatorComponent, IsNullFilterOperatorComponent, LessFilterOperatorComponent, LessOrEqualToFilterOperatorComponent, ListComponent, LoadingComponent, LoadingTemplateDirective, LocalDataChangesService, LogicalCellDirective, LogicalRowDirective, MenuTabbingService, NavigationService, NoRecordsTemplateDirective, NotEqualFilterOperatorComponent, NumericFilterCellComponent, NumericFilterComponent, NumericFilterMenuComponent, NumericFilterMenuInputComponent, PDFCommandDirective, PDFComponent, PDFMarginComponent, PDFModule, PDFService, PDFTemplateDirective, PagerComponent, PagerContextService, PagerDropDownListDirective, PagerInfoComponent, PagerInputComponent, PagerInputDirective, PagerModule, PagerNextButtonsComponent, PagerNumericButtonsComponent, PagerPageSizesComponent, PagerPrevButtonsComponent, PagerTemplateDirective, PopupCloseEvent, ReactiveEditingDirective, RemoveCommandDirective, ResizableContainerDirective, ResizeService, ResponsiveService, RowEditingDirectiveBase, RowFilterModule, RowReorderColumnComponent, RowReorderService, SaveCommandDirective, ScrollRequestService, ScrollSyncService, SelectAllCheckboxDirective, SelectionCheckboxDirective, SelectionDirective, SelectionService, SharedFilterModule, SharedModule, SinglePopupService, SizingOptionsService, Skip, SortService, SpanColumnComponent, StartsWithFilterOperatorComponent, StatusBarTemplateDirective, StringFilterCellComponent, StringFilterComponent, StringFilterMenuComponent, StringFilterMenuInputComponent, SuspendService, TableBodyComponent, TableDirective, TemplateContextDirective, TemplateEditingDirective, ToolbarComponent, ToolbarTemplateDirective, count, defaultTrackBy, hasFilterMenu, hasFilterRow, isFilterable, slice };
27342
27791