@progress/kendo-angular-grid 14.4.0-develop.14 → 14.4.0-develop.15

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 (38) hide show
  1. package/common/clipboard-types.d.ts +102 -0
  2. package/common/clipboard.directive.d.ts +53 -0
  3. package/common/clipboard.service.d.ts +28 -0
  4. package/common/dom-events.service.d.ts +1 -0
  5. package/common/error-messages.d.ts +12 -0
  6. package/databinding.directive.d.ts +1 -1
  7. package/esm2020/column-menu/column-menu-item-base.mjs +2 -1
  8. package/esm2020/columns/column-base.mjs +3 -2
  9. package/esm2020/columns/column-group.component.mjs +2 -1
  10. package/esm2020/columns/span-column.component.mjs +2 -1
  11. package/esm2020/common/clipboard-types.mjs +5 -0
  12. package/esm2020/common/clipboard.directive.mjs +190 -0
  13. package/esm2020/common/clipboard.service.mjs +191 -0
  14. package/esm2020/common/dom-events.service.mjs +1 -0
  15. package/esm2020/common/error-messages.mjs +46 -1
  16. package/esm2020/databinding.directive.mjs +3 -2
  17. package/esm2020/editing-directives/local-edit.service.mjs +2 -2
  18. package/esm2020/excel/excel.service.mjs +2 -1
  19. package/esm2020/grid.component.mjs +40 -34
  20. package/esm2020/grid.module.mjs +8 -4
  21. package/esm2020/grouping/group-scroll-binding.directive.mjs +2 -3
  22. package/esm2020/index.mjs +2 -0
  23. package/esm2020/package-metadata.mjs +2 -2
  24. package/esm2020/pdf/pdf.component.mjs +3 -2
  25. package/esm2020/pdf/pdf.service.mjs +2 -1
  26. package/esm2020/rendering/details/detail-template.directive.mjs +2 -1
  27. package/esm2020/selection/selection-default.mjs +11 -5
  28. package/esm2020/utils.mjs +10 -0
  29. package/fesm2015/progress-kendo-angular-grid.mjs +498 -72
  30. package/fesm2020/progress-kendo-angular-grid.mjs +495 -72
  31. package/grid.component.d.ts +7 -1
  32. package/grid.module.d.ts +99 -98
  33. package/index.d.ts +3 -1
  34. package/package.json +16 -16
  35. package/schematics/ngAdd/index.js +3 -3
  36. package/selection/selection-default.d.ts +10 -4
  37. package/selection/types.d.ts +6 -0
  38. 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 });
@@ -440,6 +451,59 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
440
451
  }] }];
441
452
  } });
442
453
 
454
+ /**
455
+ * @hidden
456
+ */
457
+ const ColumnMenuErrorMessages = {
458
+ autoSizeColumn: 'The auto size column does not work with enabled virtual columns',
459
+ autoSizeAllColumns: 'The auto size all columns does not work with enabled virtual columns',
460
+ serviceInput: 'The service input of the predefined column menu components is mandatory.'
461
+ };
462
+ /**
463
+ * @hidden
464
+ */
465
+ const ClipboardErrorMessages = {
466
+ clipboardTarget: 'The "clipboardTarget" option must be set for the ClipboardDirective to function as designed.',
467
+ activeCellNavigable: 'Grid must be navigable to use "activeCell" as clipboard target type.',
468
+ selectionStartSelectable: 'Grid must be selectable to use "selectionStart" as clipboard target type.'
469
+ };
470
+ /**
471
+ * @hidden
472
+ */
473
+ const ColumnConfigurationErrorMessages = {
474
+ fieldName: (field) => `Grid column field name '${field}' does not look like a valid JavaScript identifier.
475
+ Identifiers can contain only alphanumeric characters (including "$" or "_"), and may not start with a digit.
476
+ Please use only valid identifier names to ensure error-free operation.`,
477
+ width: (value, parsedValue) => `Expected numeric value for column width, but got a string "${value}". Treating as ${parsedValue}px.`,
478
+ invalidColumn: (column) => `Invalid column ${column}.`,
479
+ requiredWidth: (columnType) => `${columnType} columns feature requires all columns to have set width.`,
480
+ requiredScroll: (columnType) => `${columnType} columns are only supported when scrolling is enabled.`,
481
+ groupColumnContent: 'ColumnGroupComponent should contain ColumnComponent or CommandColumnComponent.',
482
+ lockedParent: 'Locked child columns require their parent columns to be locked.',
483
+ columnNested: 'Columns can be nested only inside ColumnGroupComponent',
484
+ nestedInside: (nestedColumnNameType, parentColumnType) => `${nestedColumnNameType} cannot be nested inside ${parentColumnType}.`
485
+ };
486
+ /**
487
+ * @hidden
488
+ */
489
+ const GridConfigurationErrorMessages = {
490
+ functionType: (propName, fn) => `${propName} must be a function, but received ${JSON.stringify(fn)}.`,
491
+ incompatibleFeatures: (feat1Name, feat2Name) => `'Having both ${feat1Name} and ${feat2Name} is not supported.'`,
492
+ nonLockedColumnPresent: 'There should be at least one non-locked column',
493
+ rowHeightVirtual: 'Row height and detail row height settings require virtual scrolling mode to be enabled.',
494
+ focusNavigable: 'The Grid should be configured as navigable to control focus',
495
+ expandCollapseMethods: (expandMethodName, collapseMethodName, directiveName, callbackName) => `The ${expandMethodName} and ${collapseMethodName} methods should not be called
496
+ when using the ${directiveName} directive or the ${callbackName} callback.
497
+ These methods are provided only for backwards compatibility with legacy versions.`,
498
+ requiredEditService: `The default edit service of the editing directives works only when binding to plain array.
499
+ Please provide an editService.`,
500
+ requiredModule: (exportedType, moduleName, componentSelector) => `Creating ${exportedType} requires including the ${moduleName} and adding the ${componentSelector} component.`,
501
+ groupBindingDirectives: `Using the "kendoGridGroupBinding" directive in combination with the "kendoGridExpandGroupBy" directive
502
+ or the "isGroupExpanded" callback is not supported. To use grouping with the "kendoGridGroupBinding" directive,
503
+ set the Grid "groupable" property to "true".`,
504
+ unsupportedMethod: (methodName, suggestedMethodName) => `Using ${methodName} in this context is not supported. Use ${suggestedMethodName} instead.`
505
+ };
506
+
443
507
  // Incremented each time the service is instantiated.
444
508
  let sequence = 0;
445
509
  /**
@@ -561,7 +625,7 @@ class ColumnBase {
561
625
  this.columnMenuTemplates = new QueryList();
562
626
  this.idService = idService;
563
627
  if (parent && idService && parent.idService.gridId() === idService.gridId() && !isColumnContainer(parent)) {
564
- throw new Error('Columns can be nested only inside ColumnGroupComponent');
628
+ throw new Error(ColumnConfigurationErrorMessages.columnNested);
565
629
  }
566
630
  }
567
631
  /**
@@ -583,7 +647,7 @@ class ColumnBase {
583
647
  if (typeof value === 'string') {
584
648
  const parsedValue = this._width = parseInt(value, 10);
585
649
  if (isDevMode()) {
586
- console.warn(`Expected numeric value for column width, but got a string "${value}". Treating as ${parsedValue}px.`);
650
+ console.warn(ColumnConfigurationErrorMessages.width(value, parsedValue));
587
651
  }
588
652
  }
589
653
  else {
@@ -1181,7 +1245,7 @@ class SpanColumnComponent extends ColumnBase {
1181
1245
  this.includeInChooser = false;
1182
1246
  this._editable = true;
1183
1247
  if (parent && parent.isSpanColumn) {
1184
- throw new Error('SpanColumn cannot be nested inside another SpanColumn');
1248
+ throw new Error(ColumnConfigurationErrorMessages.nestedInside('SpanColumnComponent', 'SpanColumnComponent'));
1185
1249
  }
1186
1250
  }
1187
1251
  /**
@@ -1396,7 +1460,7 @@ class ColumnGroupComponent extends ColumnBase {
1396
1460
  */
1397
1461
  this.minResizableWidth = 10;
1398
1462
  if (parent && parent.isSpanColumn) {
1399
- throw new Error('ColumnGroupComponent cannot be nested inside SpanColumnComponent');
1463
+ throw new Error(ColumnConfigurationErrorMessages.nestedInside('ColumnGroupComponent', 'SpanColumnComponent'));
1400
1464
  }
1401
1465
  }
1402
1466
  /**
@@ -4475,8 +4539,8 @@ const packageMetadata = {
4475
4539
  name: '@progress/kendo-angular-grid',
4476
4540
  productName: 'Kendo UI for Angular',
4477
4541
  productCodes: ['KENDOUIANGULAR', 'KENDOUICOMPLETE'],
4478
- publishDate: 1705930325,
4479
- version: '14.4.0-develop.14',
4542
+ publishDate: 1706010524,
4543
+ version: '14.4.0-develop.15',
4480
4544
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/'
4481
4545
  };
4482
4546
 
@@ -4508,7 +4572,7 @@ class DetailTemplateDirective {
4508
4572
  */
4509
4573
  set showIf(fn) {
4510
4574
  if (typeof fn !== 'function') {
4511
- throw new Error(`showIf must be a function, but received ${JSON.stringify(fn)}.`);
4575
+ throw new Error(GridConfigurationErrorMessages.functionType('showIf', fn));
4512
4576
  }
4513
4577
  this._condition = fn;
4514
4578
  }
@@ -5004,6 +5068,9 @@ class Selection {
5004
5068
  this.cellSelectionState = new PairSet();
5005
5069
  this.init();
5006
5070
  }
5071
+ /**
5072
+ * @hidden
5073
+ */
5007
5074
  get isCellSelectionMode() {
5008
5075
  return isPresent(this.ctx.grid.selectable) && this.ctx.grid.selectable['cell'];
5009
5076
  }
@@ -5057,6 +5124,14 @@ class Selection {
5057
5124
  }
5058
5125
  return row.index;
5059
5126
  }
5127
+ /**
5128
+ * @hidden
5129
+ */
5130
+ stateToArray() {
5131
+ return this.isCellSelectionMode ?
5132
+ this.cellSelectionState.toArray('itemKey', 'columnKey') :
5133
+ Array.from(this.rowSelectionState);
5134
+ }
5060
5135
  getSelectionItem(row, col, colIndex) {
5061
5136
  const itemIdentifiers = {};
5062
5137
  itemIdentifiers.itemKey = this.getItemKey(row);
@@ -5117,11 +5192,6 @@ class Selection {
5117
5192
  this.rowSelectionState = new Set(selectedKeys);
5118
5193
  }
5119
5194
  }
5120
- stateToArray() {
5121
- return this.isCellSelectionMode ?
5122
- this.cellSelectionState.toArray('itemKey', 'columnKey') :
5123
- Array.from(this.rowSelectionState);
5124
- }
5125
5195
  }
5126
5196
  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 });
5127
5197
  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 });
@@ -5489,7 +5559,7 @@ class PDFService {
5489
5559
  emitEvent(emitter, args) {
5490
5560
  if (emitter.observers.length === 0) {
5491
5561
  if (isDevMode()) {
5492
- throw new Error('Creating PDF requires including the PDFModule and adding the <kendo-grid-pdf> component.');
5562
+ throw new Error(GridConfigurationErrorMessages.requiredModule('PDF', 'PDFModule', '<kendo-grid-pdf>'));
5493
5563
  }
5494
5564
  }
5495
5565
  else {
@@ -5571,7 +5641,7 @@ class ExcelService {
5571
5641
  save(component) {
5572
5642
  if (this.saveToExcel.observers.length === 0) {
5573
5643
  if (isDevMode()) {
5574
- throw new Error('Saving excel requires including the ExcelModule and adding the <kendo-grid-excel> component.');
5644
+ throw new Error(GridConfigurationErrorMessages.requiredModule('excel', 'ExcelModule', '<kendo-grid-excel>'));
5575
5645
  }
5576
5646
  }
5577
5647
  else {
@@ -6794,6 +6864,189 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
6794
6864
  }]
6795
6865
  }], ctorParameters: function () { return [{ type: i0.TemplateRef }]; } });
6796
6866
 
6867
+ /**
6868
+ * @hidden
6869
+ */
6870
+ class ClipboardService {
6871
+ constructor(contextService) {
6872
+ this.contextService = contextService;
6873
+ this.itemToString = (item, cols) => {
6874
+ if (!cols.length) {
6875
+ return null;
6876
+ }
6877
+ return cols.map(col => item[col.field]).join(`\t`);
6878
+ };
6879
+ }
6880
+ createClipboardData(data, columns, options) {
6881
+ var _a;
6882
+ let result = {
6883
+ gridItems: [],
6884
+ dataString: ''
6885
+ };
6886
+ if (options.wholeRow) {
6887
+ const fieldCols = columns.flatMap(c => c instanceof ColumnComponent && isPresent$1(c.field) ? [c] : []);
6888
+ this.targetColField = (_a = fieldCols[0]) === null || _a === void 0 ? void 0 : _a.field;
6889
+ this.targetRowIndex = data[0].dataRowIndex;
6890
+ const clipboardData = { items: [], dataStrings: [] };
6891
+ const colFields = fieldCols.map(c => c.field);
6892
+ data.forEach(item => {
6893
+ clipboardData.items.push({ dataItem: Object.assign({}, item.dataItem), fields: colFields });
6894
+ clipboardData.dataStrings.push(this.itemToString(item.dataItem, fieldCols));
6895
+ });
6896
+ result = {
6897
+ gridItems: options.operationType === 'cut' ? clipboardData.items.map(item => {
6898
+ item.fields.forEach(field => item.dataItem[field] = null);
6899
+ return item;
6900
+ }) : [...clipboardData.items],
6901
+ dataString: options.copyHeaders ? this.addHeaders(clipboardData.dataStrings.join(`\r\n`), fieldCols) : clipboardData.dataStrings.join(`\n`)
6902
+ };
6903
+ }
6904
+ else {
6905
+ const { tabular, groups } = this.groupSelection();
6906
+ const selectionDirective = this.contextService.grid.selectionDirective;
6907
+ const colIdentifier = selectionDirective.columnKey;
6908
+ if (tabular) {
6909
+ const selectionKeys = groups[0].items.map(item => item.columnKey);
6910
+ const selectedFieldCols = columns.flatMap((c, i) => (c instanceof ColumnComponent && c.field) && selectionKeys.find(k => typeof colIdentifier === 'function' ? k === colIdentifier(c, i) : k === i) ? [c] : []);
6911
+ const selectedColFields = selectedFieldCols.map(c => c.field);
6912
+ this.targetColField = selectedColFields[0];
6913
+ result.dataString = data.flatMap(item => {
6914
+ const itemString = this.itemToString(item.dataItem, selectedFieldCols);
6915
+ const existingItem = isPresent$1(itemString);
6916
+ if (!isPresent$1(this.targetRowIndex) && isPresent$1(itemString)) {
6917
+ this.targetRowIndex = item.dataRowIndex;
6918
+ }
6919
+ result.gridItems.push({
6920
+ dataItem: item.dataItem,
6921
+ fields: selectedColFields
6922
+ });
6923
+ return existingItem ? [itemString] : [];
6924
+ }).join(`\r\n`);
6925
+ if (options.copyHeaders) {
6926
+ result.dataString = this.addHeaders(result.dataString, selectedFieldCols);
6927
+ }
6928
+ }
6929
+ else { // split per row (uneven rows)
6930
+ const rowIdentifier = selectionDirective.selectionKey;
6931
+ result.dataString = data.flatMap(item => {
6932
+ // determine cols per item
6933
+ const key = rowIdentifier ?
6934
+ typeof rowIdentifier === 'string' ? item.dataItem[rowIdentifier] : rowIdentifier({ index: item.dataRowIndex, dataItem: item.dataItem }) :
6935
+ item.dataRowIndex;
6936
+ const selectionKeys = groups.find(gr => gr.value === key).items.map(item => item.columnKey);
6937
+ const selectedFieldCols = columns.flatMap((c, i) => (c instanceof ColumnComponent && c.field) && selectionKeys.find(k => typeof colIdentifier === 'function' ? k === colIdentifier(c, i) : k === i) ? [c] : []);
6938
+ const selectedColFields = selectedFieldCols.map(c => c.field);
6939
+ if (!this.targetColField) {
6940
+ this.targetColField = selectedColFields[0];
6941
+ }
6942
+ const itemString = this.itemToString(item.dataItem, selectedFieldCols);
6943
+ const existingItem = isPresent$1(itemString);
6944
+ if (!isPresent$1(this.targetRowIndex) && existingItem) {
6945
+ this.targetRowIndex = item.dataRowIndex;
6946
+ }
6947
+ if (existingItem) {
6948
+ result.gridItems.push({
6949
+ dataItem: item.dataItem,
6950
+ fields: selectedColFields
6951
+ });
6952
+ }
6953
+ return existingItem ? options.copyHeaders ? [this.addHeaders(itemString, selectedFieldCols)] : [itemString] : [];
6954
+ }).join(`\r\n`);
6955
+ }
6956
+ }
6957
+ return result;
6958
+ }
6959
+ getGridData(data, columns, targetType, targetRowIndex, options) {
6960
+ var _a;
6961
+ const separator = data.includes(`\r\n`) ? `\r\n` : data.includes(`\n`) ? `\n` : null;
6962
+ const dataRows = separator ? data.split(separator) : [data];
6963
+ this.targetRowIndex = targetRowIndex;
6964
+ if (targetType === 'activeCell') {
6965
+ if (options.wholeRow) {
6966
+ this.targetColField = (_a = columns.find(c => c instanceof ColumnComponent && c.field)) === null || _a === void 0 ? void 0 : _a.field;
6967
+ }
6968
+ else {
6969
+ const activeCellIndex = this.contextService.grid.activeCell.colIndex;
6970
+ for (let i = 0; i < columns.length; i++) {
6971
+ const col = columns[i];
6972
+ if (col instanceof ColumnComponent && col.field && i >= activeCellIndex) {
6973
+ this.targetColField = col.field;
6974
+ break;
6975
+ }
6976
+ }
6977
+ }
6978
+ }
6979
+ else {
6980
+ if (options.wholeRow || !options.isCellSelection) {
6981
+ this.targetColField = (columns.filter(c => c instanceof ColumnComponent && c.field))[0]['field'];
6982
+ }
6983
+ else {
6984
+ const { groups } = this.groupSelection();
6985
+ const selectionDirective = this.contextService.grid.selectionDirective;
6986
+ const colIdentifier = selectionDirective.columnKey;
6987
+ const visibleCols = columns.filter(c => c.isVisible);
6988
+ const selectionKeys = groups[0].items.map(item => item.columnKey);
6989
+ const selectedFieldCols = visibleCols.flatMap((c, i) => (c instanceof ColumnComponent && c.field) && selectionKeys.find(k => typeof colIdentifier === 'function' ? k === colIdentifier(c, i) : k === i) ? [c] : []);
6990
+ const selectedColFields = selectedFieldCols.map(c => c.field);
6991
+ this.targetColField = selectedColFields[0];
6992
+ }
6993
+ }
6994
+ const items = dataRows.map(rowString => {
6995
+ const cells = rowString.includes(`\t`) ? rowString.split(`\t`) : [rowString];
6996
+ const colFields = columns.flatMap(c => (c instanceof ColumnComponent) && c.field ? [c.field] : []);
6997
+ const targetColFieldIndex = colFields.indexOf(this.targetColField);
6998
+ const affectedFields = colFields.slice(targetColFieldIndex, targetColFieldIndex + cells.length);
6999
+ const item = {};
7000
+ colFields.slice(targetColFieldIndex, targetColFieldIndex + cells.length).forEach((colField, index) => item[colField] = cells[index]);
7001
+ return {
7002
+ dataItem: item,
7003
+ fields: affectedFields
7004
+ };
7005
+ });
7006
+ return items;
7007
+ }
7008
+ groupSelection() {
7009
+ const selection = this.contextService.grid.selection;
7010
+ const groups = groupBy(selection, [{ field: 'itemKey' }])
7011
+ .map(gr => {
7012
+ gr.items.sort((a, b) => a.columnKey - b.columnKey);
7013
+ return gr;
7014
+ });
7015
+ for (let i = 1; i < groups.length; i++) {
7016
+ if (!this.areEqual(groups[i].items, groups[i - 1].items)) {
7017
+ return {
7018
+ tabular: false,
7019
+ groups
7020
+ };
7021
+ }
7022
+ }
7023
+ return {
7024
+ tabular: true,
7025
+ groups
7026
+ };
7027
+ }
7028
+ areEqual(arr1, arr2) {
7029
+ if (arr1.length !== arr2.length) {
7030
+ return false;
7031
+ }
7032
+ for (let i = 0; i < arr1.length; i++) {
7033
+ if (arr1[i].columnKey !== arr2[i].columnKey) {
7034
+ return false;
7035
+ }
7036
+ }
7037
+ return true;
7038
+ }
7039
+ addHeaders(initialData, cols) {
7040
+ const headersRowData = cols.map(c => c.title || c.field).join(`\t`);
7041
+ return `${headersRowData}\r\n${initialData}`;
7042
+ }
7043
+ }
7044
+ ClipboardService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ClipboardService, deps: [{ token: ContextService }], target: i0.ɵɵFactoryTarget.Injectable });
7045
+ ClipboardService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ClipboardService });
7046
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ClipboardService, decorators: [{
7047
+ type: Injectable
7048
+ }], ctorParameters: function () { return [{ type: ContextService }]; } });
7049
+
6797
7050
  /**
6798
7051
  * @hidden
6799
7052
  */
@@ -11662,14 +11915,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
11662
11915
  type: Injectable
11663
11916
  }], ctorParameters: function () { return [{ type: MenuTabbingService }]; } });
11664
11917
 
11665
- /**
11666
- * @hidden
11667
- */
11668
- const ColumnMenuErrorMessages = {
11669
- autoSizeColumn: 'The auto size column does not work with enabled virtual columns',
11670
- autoSizeAllColumns: 'The auto size all columns does not work with enabled virtual columns'
11671
- };
11672
-
11673
11918
  /**
11674
11919
  * @hidden
11675
11920
  */
@@ -11679,7 +11924,7 @@ class ColumnMenuItemBase {
11679
11924
  }
11680
11925
  ngOnInit() {
11681
11926
  if (isDevMode() && !this.service) {
11682
- throw new Error('The service input of the predefined column menu components is mandatory.');
11927
+ throw new Error(ColumnMenuErrorMessages.serviceInput);
11683
11928
  }
11684
11929
  }
11685
11930
  /**
@@ -19789,11 +20034,7 @@ const createControl = (source) => (acc, key) => {
19789
20034
  const validateColumnsField = (columns) => expandColumns(columns.toArray())
19790
20035
  .filter(isColumnComponent)
19791
20036
  .filter(({ field }) => !isValidFieldName(field))
19792
- .forEach(({ field }) => console.warn(`
19793
- Grid column field name '${field}' does not look like a valid JavaScript identifier.
19794
- Identifiers can contain only alphanumeric characters (including "$" or "_"), and may not start with a digit.
19795
- Please use only valid identifier names to ensure error-free operation.
19796
- `));
20037
+ .forEach(({ field }) => console.warn(ColumnConfigurationErrorMessages.fieldName(field)));
19797
20038
  const handleExpandCollapseGroupsService = (service, expandEmitter, collapseEmitter, map) => (service.changes.pipe(filter(({ group }) => isPresent(group)))
19798
20039
  .subscribe((x) => x.expand ? expandEmitter.emit(map(x)) : collapseEmitter.emit(map(x))));
19799
20040
  const handleExpandCollapseDetailsService = (service, expandEmitter, collapseEmitter, map) => (service.changes.pipe(filter(({ dataItem }) => isPresent(dataItem)))
@@ -20309,7 +20550,7 @@ class GridComponent {
20309
20550
  */
20310
20551
  set rowClass(fn) {
20311
20552
  if (isDevMode() && typeof fn !== 'function') {
20312
- throw new Error(`rowClass must be a function, but received ${JSON.stringify(fn)}.`);
20553
+ throw new Error(GridConfigurationErrorMessages.functionType('rowClass', fn));
20313
20554
  }
20314
20555
  this._rowClass = fn;
20315
20556
  }
@@ -20322,7 +20563,7 @@ class GridComponent {
20322
20563
  */
20323
20564
  set rowSticky(fn) {
20324
20565
  if (isDevMode() && isPresent(fn) && typeof fn !== 'function') {
20325
- throw new Error(`rowSticky must be a function, but received ${JSON.stringify(fn)}.`);
20566
+ throw new Error(GridConfigurationErrorMessages.functionType('rowSticky', fn));
20326
20567
  }
20327
20568
  if (isPresent(fn)) {
20328
20569
  this._rowSticky = fn;
@@ -20338,7 +20579,7 @@ class GridComponent {
20338
20579
  */
20339
20580
  set rowSelected(fn) {
20340
20581
  if (isDevMode() && typeof fn !== 'function') {
20341
- throw new Error(`rowSelected must be a function, but received ${JSON.stringify(fn)}.`);
20582
+ throw new Error(GridConfigurationErrorMessages.functionType('rowSelected', fn));
20342
20583
  }
20343
20584
  this._rowSelected = fn;
20344
20585
  }
@@ -20355,7 +20596,7 @@ class GridComponent {
20355
20596
  */
20356
20597
  set cellSelected(fn) {
20357
20598
  if (isDevMode() && typeof fn !== 'function') {
20358
- throw new Error(`cellSelected must be a function, but received ${JSON.stringify(fn)}.`);
20599
+ throw new Error(GridConfigurationErrorMessages.functionType('cellSelected', fn));
20359
20600
  }
20360
20601
  this._cellSelected = fn;
20361
20602
  }
@@ -20374,6 +20615,16 @@ class GridComponent {
20374
20615
  get activeRow() {
20375
20616
  return this.navigationService.activeRow;
20376
20617
  }
20618
+ /**
20619
+ * Returns the current Grid selection.
20620
+ *
20621
+ * @hidden
20622
+ */
20623
+ get selection() {
20624
+ return (this.selectable || this.selectionDirective) ?
20625
+ this.defaultSelection ? this.defaultSelection.stateToArray() : this.selectionDirective.stateToArray() :
20626
+ [];
20627
+ }
20377
20628
  /**
20378
20629
  * Specifies if the loading indicator of the Grid will be displayed ([see example]({% slug binding_grid %})).
20379
20630
  *
@@ -21291,7 +21542,7 @@ class GridComponent {
21291
21542
  instance = column;
21292
21543
  }
21293
21544
  if (!instance && isDevMode()) {
21294
- throw new Error(`Invalid column ${column}`);
21545
+ throw new Error(ColumnConfigurationErrorMessages.invalidColumn(column));
21295
21546
  }
21296
21547
  return instance;
21297
21548
  }
@@ -21300,43 +21551,43 @@ class GridComponent {
21300
21551
  const locked = this.lockedLeafColumns.length || (this.columnMenu && this.columnMenu.lock);
21301
21552
  const stickyColumns = this.stickyColumns.length || (this.columnMenu && this.columnMenu.stick);
21302
21553
  if (locked && this.detailTemplate) {
21303
- throw new Error('Having both detail template and locked columns is not supported.');
21554
+ throw new Error(GridConfigurationErrorMessages.incompatibleFeatures('detail template', 'locked columns'));
21304
21555
  }
21305
21556
  if (stickyColumns && this.detailTemplate) {
21306
- throw new Error('Having both detail template and sticky columns is not supported.');
21557
+ throw new Error(GridConfigurationErrorMessages.incompatibleFeatures('detail template', 'sticky columns'));
21307
21558
  }
21308
21559
  if (this.lockedLeafColumns.length && !this.nonLockedLeafColumns.length) {
21309
- throw new Error('There should be at least one non-locked column');
21560
+ throw new Error(GridConfigurationErrorMessages.nonLockedColumnPresent);
21310
21561
  }
21311
21562
  if ((locked || this.virtualColumns) && expandColumns(this.columnList.toArray()).filter(column => !column.width && !isColumnGroupComponent(column)).length) {
21312
- throw new Error((locked ? 'Locked' : 'Virtual') + ' columns feature requires all columns to have set width.');
21563
+ throw new Error(ColumnConfigurationErrorMessages.requiredWidth(locked ? 'Locked' : 'Virtual'));
21313
21564
  }
21314
21565
  if (locked && !this.isScrollable) {
21315
- throw new Error('Locked columns are only supported when scrolling is enabled.');
21566
+ throw new Error(ColumnConfigurationErrorMessages.requiredScroll('Locked'));
21567
+ }
21568
+ if (stickyColumns && !this.isScrollable) {
21569
+ throw new Error(ColumnConfigurationErrorMessages.requiredScroll('Sticky'));
21316
21570
  }
21317
21571
  if (this.columnList.filter(isColumnGroupComponent).filter((x) => !x.hasChildren).length) {
21318
- throw new Error('ColumnGroupComponent should contain ColumnComponent or CommandColumnComponent.');
21572
+ throw new Error(ColumnConfigurationErrorMessages.groupColumnContent);
21319
21573
  }
21320
21574
  if (this.columnList.filter(x => x.locked && x.parent && !x.parent.isLocked).length) {
21321
- throw new Error('Locked child columns require their parent columns to be locked.');
21575
+ throw new Error(ColumnConfigurationErrorMessages.lockedParent);
21322
21576
  }
21323
21577
  if ((this.rowHeight || this.detailRowHeight) && !this.isVirtual) {
21324
- throw new Error('Row height and detail row height settings require virtual scrolling mode to be enabled.');
21578
+ throw new Error(GridConfigurationErrorMessages.rowHeightVirtual);
21325
21579
  }
21326
21580
  if (stickyColumns && expandColumns(this.columnList.toArray()).filter(column => !column.width && !isColumnGroupComponent(column)).length) {
21327
- throw new Error('Sticky columns feature requires all columns to have set width.');
21328
- }
21329
- if (stickyColumns && !this.isScrollable) {
21330
- throw new Error('Sticky columns are only supported when scrolling is enabled.');
21581
+ throw new Error(ColumnConfigurationErrorMessages.requiredWidth('Sticky'));
21331
21582
  }
21332
21583
  if (stickyColumns && this.virtualColumns) {
21333
- throw new Error('Having both sticky columns and column virtualization is not supported.');
21584
+ throw new Error(GridConfigurationErrorMessages.incompatibleFeatures('sticky columns', 'column virtualization'));
21334
21585
  }
21335
21586
  if (this.rowSticky && this.scrollable === 'virtual') {
21336
- throw new Error('Having both sticky rows and row virtualization (scrollable="virtual") is not supported.');
21587
+ throw new Error(GridConfigurationErrorMessages.incompatibleFeatures('sticky rows', 'row virtualization (scrollable="virtual")'));
21337
21588
  }
21338
21589
  if (this.rowSticky && this.groupable) {
21339
- throw new Error('Having both sticky rows and grouping is not supported.');
21590
+ throw new Error(GridConfigurationErrorMessages.incompatibleFeatures('sticky rows', 'grouping'));
21340
21591
  }
21341
21592
  validateColumnsField(this.columnList);
21342
21593
  }
@@ -21535,7 +21786,7 @@ class GridComponent {
21535
21786
  }
21536
21787
  assertNavigable() {
21537
21788
  if (isDevMode() && !this.navigationService.enabled) {
21538
- throw new Error('The Grid should be configured as navigable to control focus');
21789
+ throw new Error(GridConfigurationErrorMessages.focusNavigable);
21539
21790
  }
21540
21791
  }
21541
21792
  navigationMetadata() {
@@ -21607,9 +21858,7 @@ class GridComponent {
21607
21858
  toggleDetailRowLegacy(index, expand) {
21608
21859
  const hasCallback = typeof this.isDetailExpanded === 'function';
21609
21860
  if (isDevMode() && hasCallback) {
21610
- throw new Error('The expandRow and collapseRow methods should not be called when using the ' +
21611
- 'kendoGridDetailsExpandBy directive or the isDetailExpanded callback. ' +
21612
- 'These methods are provided only for backwards compatibility with legacy versions.');
21861
+ throw new Error(GridConfigurationErrorMessages.expandCollapseMethods('expandRow', 'collapseRow', 'kendoGridDetailsExpandBy', 'isDetailExpanded'));
21613
21862
  }
21614
21863
  if (!isDevMode() && hasCallback) {
21615
21864
  return;
@@ -21621,9 +21870,7 @@ class GridComponent {
21621
21870
  toggleGroupRowLegacy(index, expand) {
21622
21871
  const hasCallback = typeof this.isGroupExpanded === 'function';
21623
21872
  if (isDevMode() && hasCallback) {
21624
- throw new Error('The expandGroup and collapseGroup methods should not be called when using the ' +
21625
- 'kendoGridExpandGroupBy directive or the isGroupExpanded callback. ' +
21626
- 'These methods are provided only for backwards compatibility with legacy versions.');
21873
+ throw new Error(GridConfigurationErrorMessages.expandCollapseMethods('expandGroup', 'collapseGroup', 'kendoGridExpandGroupBy', 'isGroupExpanded'));
21627
21874
  }
21628
21875
  if (!isDevMode() && hasCallback) {
21629
21876
  return;
@@ -21698,7 +21945,8 @@ GridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version:
21698
21945
  SortService,
21699
21946
  ContextService,
21700
21947
  SizingOptionsService,
21701
- RowReorderService
21948
+ RowReorderService,
21949
+ ClipboardService
21702
21950
  ], 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: `
21703
21951
  <ng-container kendoGridLocalizedMessages
21704
21952
  i18n-groupPanelEmpty="kendo.grid.groupPanelEmpty|The label visible in the Grid group panel when it is empty"
@@ -22326,7 +22574,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
22326
22574
  SortService,
22327
22575
  ContextService,
22328
22576
  SizingOptionsService,
22329
- RowReorderService
22577
+ RowReorderService,
22578
+ ClipboardService
22330
22579
  ],
22331
22580
  selector: 'kendo-grid',
22332
22581
  template: `
@@ -23256,11 +23505,12 @@ class DataBindingDirective {
23256
23505
  }
23257
23506
  }
23258
23507
  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 });
23259
- 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 });
23508
+ 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 });
23260
23509
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: DataBindingDirective, decorators: [{
23261
23510
  type: Directive,
23262
23511
  args: [{
23263
- selector: '[kendoGridBinding]'
23512
+ selector: '[kendoGridBinding]',
23513
+ exportAs: 'kendoGridBinding'
23264
23514
  }]
23265
23515
  }], ctorParameters: function () { return [{ type: GridComponent }, { type: i0.ChangeDetectorRef }, { type: LocalDataChangesService }, { type: RowReorderService }]; }, propDecorators: { skip: [{
23266
23516
  type: Input
@@ -25795,8 +26045,7 @@ class LocalEditService {
25795
26045
  return data;
25796
26046
  }
25797
26047
  if (isDevMode()) {
25798
- throw new Error('The default edit service of the editing directives works only when binding to plain array.' +
25799
- 'Please provide an editService.');
26048
+ throw new Error(GridConfigurationErrorMessages.requiredEditService);
25800
26049
  }
25801
26050
  return [];
25802
26051
  }
@@ -26303,9 +26552,7 @@ class GroupBindingDirective extends DataBindingDirective {
26303
26552
  }
26304
26553
  ngAfterContentInit() {
26305
26554
  if (isDevMode() && this.grid.isGroupExpanded) {
26306
- throw new Error('Using the `kendoGridGroupBinding` directive in combination with the `kendoGridExpandGroupBy` directive ' +
26307
- 'or the `isGroupExpanded` callback is not supported. To use grouping with the `kendoGridGroupBinding` directive, ' +
26308
- 'set the Grid `groupable` property to `true`.');
26555
+ throw new Error(GridConfigurationErrorMessages.groupBindingDirectives);
26309
26556
  }
26310
26557
  }
26311
26558
  groupExpand({ groupIndex }) {
@@ -26439,6 +26686,182 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
26439
26686
  }]
26440
26687
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: ContextService }]; } });
26441
26688
 
26689
+ /**
26690
+ * The directive that enables the Grid built-in clipboard support. Allows copy, cut, and paste interactions
26691
+ * with the Grid.
26692
+ */
26693
+ class GridClipboardDirective {
26694
+ constructor(host, clipboardService, renderer, zone) {
26695
+ this.host = host;
26696
+ this.clipboardService = clipboardService;
26697
+ this.renderer = renderer;
26698
+ this.zone = zone;
26699
+ /**
26700
+ * Fires when the user performs `cut`, `copy` or `paste` action within the Grid content area.
26701
+ */
26702
+ this.clipboard = new EventEmitter();
26703
+ this._clipboardSettings = {
26704
+ wholeRow: false,
26705
+ copyHeaders: false,
26706
+ copy: true,
26707
+ cut: true,
26708
+ paste: true
26709
+ };
26710
+ this.subs = new Subscription();
26711
+ this.onClipboard = (operationType, args) => {
26712
+ var _a, _b;
26713
+ if (!this.inGrid(args) || !this.clipboardSettings[operationType]) {
26714
+ return;
26715
+ }
26716
+ const gridData = Array.isArray(this.host.data) ? this.host.data : this.host.data.data;
26717
+ const gridDataItems = gridData.flatMap(recursiveFlatMap);
26718
+ const selection = this.host.selection;
26719
+ const selectionDirective = this.host.selectionDirective;
26720
+ const targetType = this.clipboardTarget;
26721
+ const isCellSelection = (((_a = this.host.selectable) === null || _a === void 0 ? void 0 : _a.cell) || selectionDirective.isCellSelectionMode);
26722
+ let clipboardData = [];
26723
+ switch (targetType) {
26724
+ case 'activeCell':
26725
+ {
26726
+ const targetCell = Object.assign({}, this.host.activeCell);
26727
+ clipboardData = targetCell && [{ dataItem: targetCell.dataItem, dataRowIndex: targetCell.dataRowIndex }];
26728
+ }
26729
+ break;
26730
+ case 'selectionStart':
26731
+ {
26732
+ const identifier = selectionDirective.selectionKey;
26733
+ clipboardData = gridDataItems.flatMap((item, index) => {
26734
+ if (identifier) {
26735
+ const key = typeof identifier === 'string' ? item[identifier] : identifier({ index: index + this.host.skip, dataItem: item });
26736
+ return isCellSelection ?
26737
+ selection.some(s => s.itemKey === key) ? [{ dataItem: item, dataRowIndex: index + this.host.skip }] : [] :
26738
+ selection.indexOf(key) > -1 ? [{ dataItem: item, dataRowIndex: index + this.host.skip }] : [];
26739
+ }
26740
+ return isCellSelection ?
26741
+ selection.some(s => s.itemKey === index + this.host.skip) ? [{ dataItem: item, dataRowIndex: index + this.host.skip }] : [] :
26742
+ selection.indexOf(index + this.host.skip) > -1 ? [{ dataItem: item, dataRowIndex: index + this.host.skip }] : [];
26743
+ });
26744
+ }
26745
+ break;
26746
+ }
26747
+ const isPaste = operationType === 'paste';
26748
+ const pastedData = args.clipboardData.getData('text').trim();
26749
+ const visibleCols = this.host.columns.toArray().filter(c => c.isVisible);
26750
+ const data = isPaste ?
26751
+ {
26752
+ dataString: pastedData,
26753
+ gridItems: this.clipboardService.getGridData(pastedData, visibleCols, this.clipboardTarget, clipboardData[0].dataRowIndex, {
26754
+ wholeRow: this.clipboardSettings.wholeRow,
26755
+ isCellSelection
26756
+ })
26757
+ } :
26758
+ this.clipboardService.createClipboardData(clipboardData || [], visibleCols, {
26759
+ wholeRow: this.clipboardSettings.wholeRow || !isCellSelection,
26760
+ copyHeaders: this.clipboardSettings.copyHeaders,
26761
+ operationType
26762
+ });
26763
+ !isPaste && navigator.clipboard.writeText(data.dataString);
26764
+ if (hasObservers(this.clipboard)) {
26765
+ this.clipboard.emit({
26766
+ type: operationType,
26767
+ originalEvent: args,
26768
+ clipboardData: data.dataString,
26769
+ gridData: data.gridItems,
26770
+ target: {
26771
+ dataRowIndex: this.clipboardService.targetRowIndex,
26772
+ colField: this.clipboardService.targetColField,
26773
+ dataItem: (_b = clipboardData.find(item => item.dataRowIndex === this.clipboardService.targetRowIndex)) === null || _b === void 0 ? void 0 : _b.dataItem
26774
+ }
26775
+ });
26776
+ }
26777
+ this.clipboardService.targetColField = this.clipboardService.targetRowIndex = null;
26778
+ };
26779
+ this.inGrid = (args) => {
26780
+ const target = document.activeElement.matches('.k-table-td') ? document.activeElement : args.target;
26781
+ const inContentArea = closest(target, node => { var _a; return (_a = node.parentElement) === null || _a === void 0 ? void 0 : _a.classList.contains('k-grid-container'); });
26782
+ const inHost = contains$2(this.host.wrapper.nativeElement, target);
26783
+ return target && inHost && inContentArea;
26784
+ };
26785
+ }
26786
+ /**
26787
+ * Determines the target of the clipboard operation. The possible options are:
26788
+ * - `activeCell`&mdash;Only the content of the current active cell or the row it is in will be copied to the clipboard.
26789
+ * When pasting, the active cell will be the pivotal point for pasted content.
26790
+ * - `selectionStart`&mdash;The content of all selected cells or rows from the current page will be copied to the clipboard.
26791
+ * When pasting the first selected cell will be the pivotal point for pasted content.
26792
+ *
26793
+ * This option must be set, and the Grid keyboard navigation and/or selection functionalities must be enabled
26794
+ * for the Clipboard directive to function as designed.
26795
+ */
26796
+ set clipboardTarget(value) {
26797
+ if (isDevMode()) {
26798
+ this.zone.onStable.pipe(take(1)).subscribe(() => {
26799
+ if (value === 'activeCell' && !(this.host.navigable.length)) {
26800
+ console.warn(ClipboardErrorMessages.clipboardTarget.activeCellNavigable);
26801
+ }
26802
+ else if (value === 'selectionStart' && !(this.host.selectable || this.host.selectionDirective)) {
26803
+ console.warn(ClipboardErrorMessages.selectionStartSelectable);
26804
+ }
26805
+ else if (!isPresent(value)) {
26806
+ console.warn(ClipboardErrorMessages.clipboardTarget);
26807
+ }
26808
+ });
26809
+ }
26810
+ this._target = value;
26811
+ }
26812
+ get clipboardTarget() {
26813
+ return this._target;
26814
+ }
26815
+ /**
26816
+ * The `GridClipboardDirective` settings.
26817
+ *
26818
+ * @default { wholeRow: false, copyHeaders: false copy: true, cut: true, paste: true }
26819
+ */
26820
+ set clipboardSettings(value) {
26821
+ this._clipboardSettings = Object.assign({}, this._clipboardSettings, value);
26822
+ }
26823
+ get clipboardSettings() {
26824
+ return this._clipboardSettings;
26825
+ }
26826
+ ngAfterViewInit() {
26827
+ if (!isDocumentAvailable()) {
26828
+ return;
26829
+ }
26830
+ if (isDevMode() && !isPresent(this.clipboardTarget)) {
26831
+ console.warn(ClipboardErrorMessages.clipboardTarget);
26832
+ }
26833
+ // needed due to the following issue in Chrome
26834
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=1156117&q=focus%20programmatically%20paste&can=2
26835
+ this.subs.add(this.renderer.listen(document, 'copy', (args) => this.onClipboard('copy', args)));
26836
+ this.subs.add(this.renderer.listen(document, 'cut', (args) => this.onClipboard('cut', args)));
26837
+ this.subs.add(this.renderer.listen(document, 'paste', (args) => this.onClipboard('paste', args)));
26838
+ }
26839
+ ngOnChanges(changes) {
26840
+ if (changes['clipboardTarget'] && isDevMode() && !isPresent(changes['clipboardTarget'].currentValue)) {
26841
+ console.warn(ClipboardErrorMessages.clipboardTarget);
26842
+ }
26843
+ }
26844
+ ngOnDestroy() {
26845
+ this.subs.unsubscribe();
26846
+ }
26847
+ }
26848
+ 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 });
26849
+ 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"], usesOnChanges: true, ngImport: i0 });
26850
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: GridClipboardDirective, decorators: [{
26851
+ type: Directive,
26852
+ args: [{
26853
+ selector: '[kendoGridClipboard]',
26854
+ exportAs: 'kendoGridClipboard',
26855
+ providers: [ClipboardService]
26856
+ }]
26857
+ }], ctorParameters: function () { return [{ type: GridComponent }, { type: ClipboardService }, { type: i0.Renderer2 }, { type: i0.NgZone }]; }, propDecorators: { clipboardTarget: [{
26858
+ type: Input
26859
+ }], clipboardSettings: [{
26860
+ type: Input
26861
+ }], clipboard: [{
26862
+ type: Output
26863
+ }] } });
26864
+
26442
26865
  const exportedModules$1 = [
26443
26866
  GridComponent,
26444
26867
  ToolbarTemplateDirective,
@@ -26463,7 +26886,8 @@ const exportedModules$1 = [
26463
26886
  ...PagerModule.exports(),
26464
26887
  ...RowFilterModule.exports(),
26465
26888
  ...FilterMenuModule.exports(),
26466
- ...ColumnMenuModule.exports()
26889
+ ...ColumnMenuModule.exports(),
26890
+ GridClipboardDirective
26467
26891
  ];
26468
26892
  const declarations$2 = [
26469
26893
  GridComponent,
@@ -26484,7 +26908,8 @@ const declarations$2 = [
26484
26908
  GridSpacerComponent,
26485
26909
  GridToolbarFocusableDirective,
26486
26910
  StatusBarComponent,
26487
- StatusBarTemplateDirective
26911
+ StatusBarTemplateDirective,
26912
+ GridClipboardDirective
26488
26913
  ];
26489
26914
  /**
26490
26915
  * Represents the [NgModule](link:site.data.urls.angular['ngmoduleapi'])
@@ -26528,7 +26953,8 @@ GridModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13
26528
26953
  GridSpacerComponent,
26529
26954
  GridToolbarFocusableDirective,
26530
26955
  StatusBarComponent,
26531
- StatusBarTemplateDirective], imports: [CommonModule,
26956
+ StatusBarTemplateDirective,
26957
+ GridClipboardDirective], imports: [CommonModule,
26532
26958
  GroupModule,
26533
26959
  SharedModule,
26534
26960
  BodyModule,
@@ -26554,7 +26980,7 @@ GridModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13
26554
26980
  InCellEditingDirective,
26555
26981
  ExpandDetailsDirective,
26556
26982
  ExpandGroupDirective,
26557
- 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] });
26983
+ 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] });
26558
26984
  GridModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: GridModule, imports: [[
26559
26985
  CommonModule,
26560
26986
  GroupModule,
@@ -26853,13 +27279,13 @@ class PDFComponent extends PDFExportComponent {
26853
27279
  * @hidden
26854
27280
  */
26855
27281
  saveAs(_) {
26856
- throw new Error('Not supported. Use GridComponent.saveAsPDF');
27282
+ throw new Error(GridConfigurationErrorMessages.unsupportedMethod('saveAs', 'GridComponent.saveAsPDF'));
26857
27283
  }
26858
27284
  /**
26859
27285
  * @hidden
26860
27286
  */
26861
27287
  export() {
26862
- throw new Error('Not supported. Use GridComponent.drawPDF');
27288
+ throw new Error(GridConfigurationErrorMessages.unsupportedMethod('export', 'GridComponent.drawPDF'));
26863
27289
  }
26864
27290
  savePDF(component) {
26865
27291
  this.createPDF(component, this.draw);
@@ -27457,5 +27883,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
27457
27883
  * Generated bundle index. Do not edit.
27458
27884
  */
27459
27885
 
27460
- 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 };
27886
+ 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 };
27461
27887