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

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 (39) hide show
  1. package/NOTICE.txt +146 -593
  2. package/common/clipboard-types.d.ts +102 -0
  3. package/common/clipboard.directive.d.ts +53 -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/columns/column-base.mjs +3 -2
  10. package/esm2020/columns/column-group.component.mjs +2 -1
  11. package/esm2020/columns/span-column.component.mjs +2 -1
  12. package/esm2020/common/clipboard-types.mjs +5 -0
  13. package/esm2020/common/clipboard.directive.mjs +190 -0
  14. package/esm2020/common/clipboard.service.mjs +191 -0
  15. package/esm2020/common/dom-events.service.mjs +1 -0
  16. package/esm2020/common/error-messages.mjs +46 -1
  17. package/esm2020/databinding.directive.mjs +3 -2
  18. package/esm2020/editing-directives/local-edit.service.mjs +2 -2
  19. package/esm2020/excel/excel.service.mjs +2 -1
  20. package/esm2020/grid.component.mjs +40 -34
  21. package/esm2020/grid.module.mjs +8 -4
  22. package/esm2020/grouping/group-scroll-binding.directive.mjs +2 -3
  23. package/esm2020/index.mjs +2 -0
  24. package/esm2020/package-metadata.mjs +2 -2
  25. package/esm2020/pdf/pdf.component.mjs +3 -2
  26. package/esm2020/pdf/pdf.service.mjs +2 -1
  27. package/esm2020/rendering/details/detail-template.directive.mjs +2 -1
  28. package/esm2020/selection/selection-default.mjs +11 -5
  29. package/esm2020/utils.mjs +10 -0
  30. package/fesm2015/progress-kendo-angular-grid.mjs +498 -72
  31. package/fesm2020/progress-kendo-angular-grid.mjs +495 -72
  32. package/grid.component.d.ts +7 -1
  33. package/grid.module.d.ts +99 -98
  34. package/index.d.ts +3 -1
  35. package/package.json +16 -16
  36. package/schematics/ngAdd/index.js +3 -3
  37. package/selection/selection-default.d.ts +10 -4
  38. package/selection/types.d.ts +6 -0
  39. 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,59 @@ 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
+ clipboardTarget: 'The "clipboardTarget" option must be set for the ClipboardDirective to function as designed.',
2266
+ activeCellNavigable: 'Grid must be navigable to use "activeCell" as clipboard target type.',
2267
+ selectionStartSelectable: 'Grid must be selectable to use "selectionStart" as clipboard target type.'
2268
+ };
2269
+ /**
2270
+ * @hidden
2271
+ */
2272
+ const ColumnConfigurationErrorMessages = {
2273
+ fieldName: (field) => `Grid column field name '${field}' does not look like a valid JavaScript identifier.
2274
+ Identifiers can contain only alphanumeric characters (including "$" or "_"), and may not start with a digit.
2275
+ Please use only valid identifier names to ensure error-free operation.`,
2276
+ width: (value, parsedValue) => `Expected numeric value for column width, but got a string "${value}". Treating as ${parsedValue}px.`,
2277
+ invalidColumn: (column) => `Invalid column ${column}.`,
2278
+ requiredWidth: (columnType) => `${columnType} columns feature requires all columns to have set width.`,
2279
+ requiredScroll: (columnType) => `${columnType} columns are only supported when scrolling is enabled.`,
2280
+ groupColumnContent: 'ColumnGroupComponent should contain ColumnComponent or CommandColumnComponent.',
2281
+ lockedParent: 'Locked child columns require their parent columns to be locked.',
2282
+ columnNested: 'Columns can be nested only inside ColumnGroupComponent',
2283
+ nestedInside: (nestedColumnNameType, parentColumnType) => `${nestedColumnNameType} cannot be nested inside ${parentColumnType}.`
2284
+ };
2285
+ /**
2286
+ * @hidden
2287
+ */
2288
+ const GridConfigurationErrorMessages = {
2289
+ functionType: (propName, fn) => `${propName} must be a function, but received ${JSON.stringify(fn)}.`,
2290
+ incompatibleFeatures: (feat1Name, feat2Name) => `'Having both ${feat1Name} and ${feat2Name} is not supported.'`,
2291
+ nonLockedColumnPresent: 'There should be at least one non-locked column',
2292
+ rowHeightVirtual: 'Row height and detail row height settings require virtual scrolling mode to be enabled.',
2293
+ focusNavigable: 'The Grid should be configured as navigable to control focus',
2294
+ expandCollapseMethods: (expandMethodName, collapseMethodName, directiveName, callbackName) => `The ${expandMethodName} and ${collapseMethodName} methods should not be called
2295
+ when using the ${directiveName} directive or the ${callbackName} callback.
2296
+ These methods are provided only for backwards compatibility with legacy versions.`,
2297
+ requiredEditService: `The default edit service of the editing directives works only when binding to plain array.
2298
+ Please provide an editService.`,
2299
+ requiredModule: (exportedType, moduleName, componentSelector) => `Creating ${exportedType} requires including the ${moduleName} and adding the ${componentSelector} component.`,
2300
+ groupBindingDirectives: `Using the "kendoGridGroupBinding" directive in combination with the "kendoGridExpandGroupBy" directive
2301
+ or the "isGroupExpanded" callback is not supported. To use grouping with the "kendoGridGroupBinding" directive,
2302
+ set the Grid "groupable" property to "true".`,
2303
+ unsupportedMethod: (methodName, suggestedMethodName) => `Using ${methodName} in this context is not supported. Use ${suggestedMethodName} instead.`
2304
+ };
2305
+
2242
2306
  /**
2243
2307
  * @hidden
2244
2308
  */
@@ -2332,7 +2396,7 @@ class ColumnBase {
2332
2396
  this.columnMenuTemplates = new QueryList();
2333
2397
  this.idService = idService;
2334
2398
  if (parent && idService && parent.idService.gridId() === idService.gridId() && !isColumnContainer(parent)) {
2335
- throw new Error('Columns can be nested only inside ColumnGroupComponent');
2399
+ throw new Error(ColumnConfigurationErrorMessages.columnNested);
2336
2400
  }
2337
2401
  }
2338
2402
  /**
@@ -2354,7 +2418,7 @@ class ColumnBase {
2354
2418
  if (typeof value === 'string') {
2355
2419
  const parsedValue = this._width = parseInt(value, 10);
2356
2420
  if (isDevMode()) {
2357
- console.warn(`Expected numeric value for column width, but got a string "${value}". Treating as ${parsedValue}px.`);
2421
+ console.warn(ColumnConfigurationErrorMessages.width(value, parsedValue));
2358
2422
  }
2359
2423
  }
2360
2424
  else {
@@ -2936,7 +3000,7 @@ class SpanColumnComponent extends ColumnBase {
2936
3000
  this.includeInChooser = false;
2937
3001
  this._editable = true;
2938
3002
  if (parent && parent.isSpanColumn) {
2939
- throw new Error('SpanColumn cannot be nested inside another SpanColumn');
3003
+ throw new Error(ColumnConfigurationErrorMessages.nestedInside('SpanColumnComponent', 'SpanColumnComponent'));
2940
3004
  }
2941
3005
  }
2942
3006
  /**
@@ -3149,7 +3213,7 @@ class ColumnGroupComponent extends ColumnBase {
3149
3213
  */
3150
3214
  this.minResizableWidth = 10;
3151
3215
  if (parent && parent.isSpanColumn) {
3152
- throw new Error('ColumnGroupComponent cannot be nested inside SpanColumnComponent');
3216
+ throw new Error(ColumnConfigurationErrorMessages.nestedInside('ColumnGroupComponent', 'SpanColumnComponent'));
3153
3217
  }
3154
3218
  }
3155
3219
  /**
@@ -4443,8 +4507,8 @@ const packageMetadata = {
4443
4507
  name: '@progress/kendo-angular-grid',
4444
4508
  productName: 'Kendo UI for Angular',
4445
4509
  productCodes: ['KENDOUIANGULAR', 'KENDOUICOMPLETE'],
4446
- publishDate: 1705930325,
4447
- version: '14.4.0-develop.14',
4510
+ publishDate: 1706186543,
4511
+ version: '14.4.0-develop.16',
4448
4512
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/'
4449
4513
  };
4450
4514
 
@@ -4476,7 +4540,7 @@ class DetailTemplateDirective {
4476
4540
  */
4477
4541
  set showIf(fn) {
4478
4542
  if (typeof fn !== 'function') {
4479
- throw new Error(`showIf must be a function, but received ${JSON.stringify(fn)}.`);
4543
+ throw new Error(GridConfigurationErrorMessages.functionType('showIf', fn));
4480
4544
  }
4481
4545
  this._condition = fn;
4482
4546
  }
@@ -4970,6 +5034,9 @@ class Selection {
4970
5034
  this.cellSelectionState = new PairSet();
4971
5035
  this.init();
4972
5036
  }
5037
+ /**
5038
+ * @hidden
5039
+ */
4973
5040
  get isCellSelectionMode() {
4974
5041
  return isPresent(this.ctx.grid.selectable) && this.ctx.grid.selectable['cell'];
4975
5042
  }
@@ -5023,6 +5090,14 @@ class Selection {
5023
5090
  }
5024
5091
  return row.index;
5025
5092
  }
5093
+ /**
5094
+ * @hidden
5095
+ */
5096
+ stateToArray() {
5097
+ return this.isCellSelectionMode ?
5098
+ this.cellSelectionState.toArray('itemKey', 'columnKey') :
5099
+ Array.from(this.rowSelectionState);
5100
+ }
5026
5101
  getSelectionItem(row, col, colIndex) {
5027
5102
  const itemIdentifiers = {};
5028
5103
  itemIdentifiers.itemKey = this.getItemKey(row);
@@ -5083,11 +5158,6 @@ class Selection {
5083
5158
  this.rowSelectionState = new Set(selectedKeys);
5084
5159
  }
5085
5160
  }
5086
- stateToArray() {
5087
- return this.isCellSelectionMode ?
5088
- this.cellSelectionState.toArray('itemKey', 'columnKey') :
5089
- Array.from(this.rowSelectionState);
5090
- }
5091
5161
  }
5092
5162
  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
5163
  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 +5519,7 @@ class PDFService {
5449
5519
  emitEvent(emitter, args) {
5450
5520
  if (emitter.observers.length === 0) {
5451
5521
  if (isDevMode()) {
5452
- throw new Error('Creating PDF requires including the PDFModule and adding the <kendo-grid-pdf> component.');
5522
+ throw new Error(GridConfigurationErrorMessages.requiredModule('PDF', 'PDFModule', '<kendo-grid-pdf>'));
5453
5523
  }
5454
5524
  }
5455
5525
  else {
@@ -5531,7 +5601,7 @@ class ExcelService {
5531
5601
  save(component) {
5532
5602
  if (this.saveToExcel.observers.length === 0) {
5533
5603
  if (isDevMode()) {
5534
- throw new Error('Saving excel requires including the ExcelModule and adding the <kendo-grid-excel> component.');
5604
+ throw new Error(GridConfigurationErrorMessages.requiredModule('excel', 'ExcelModule', '<kendo-grid-excel>'));
5535
5605
  }
5536
5606
  }
5537
5607
  else {
@@ -6748,6 +6818,187 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
6748
6818
  }]
6749
6819
  }], ctorParameters: function () { return [{ type: i0.TemplateRef }]; } });
6750
6820
 
6821
+ /**
6822
+ * @hidden
6823
+ */
6824
+ class ClipboardService {
6825
+ constructor(contextService) {
6826
+ this.contextService = contextService;
6827
+ this.itemToString = (item, cols) => {
6828
+ if (!cols.length) {
6829
+ return null;
6830
+ }
6831
+ return cols.map(col => item[col.field]).join(`\t`);
6832
+ };
6833
+ }
6834
+ createClipboardData(data, columns, options) {
6835
+ let result = {
6836
+ gridItems: [],
6837
+ dataString: ''
6838
+ };
6839
+ if (options.wholeRow) {
6840
+ const fieldCols = columns.flatMap(c => c instanceof ColumnComponent && isPresent$1(c.field) ? [c] : []);
6841
+ this.targetColField = fieldCols[0]?.field;
6842
+ this.targetRowIndex = data[0].dataRowIndex;
6843
+ const clipboardData = { items: [], dataStrings: [] };
6844
+ const colFields = fieldCols.map(c => c.field);
6845
+ data.forEach(item => {
6846
+ clipboardData.items.push({ dataItem: { ...item.dataItem }, fields: colFields });
6847
+ clipboardData.dataStrings.push(this.itemToString(item.dataItem, fieldCols));
6848
+ });
6849
+ result = {
6850
+ gridItems: options.operationType === 'cut' ? clipboardData.items.map(item => {
6851
+ item.fields.forEach(field => item.dataItem[field] = null);
6852
+ return item;
6853
+ }) : [...clipboardData.items],
6854
+ dataString: options.copyHeaders ? this.addHeaders(clipboardData.dataStrings.join(`\r\n`), fieldCols) : clipboardData.dataStrings.join(`\n`)
6855
+ };
6856
+ }
6857
+ else {
6858
+ const { tabular, groups } = this.groupSelection();
6859
+ const selectionDirective = this.contextService.grid.selectionDirective;
6860
+ const colIdentifier = selectionDirective.columnKey;
6861
+ if (tabular) {
6862
+ const selectionKeys = groups[0].items.map(item => item.columnKey);
6863
+ const selectedFieldCols = columns.flatMap((c, i) => (c instanceof ColumnComponent && c.field) && selectionKeys.find(k => typeof colIdentifier === 'function' ? k === colIdentifier(c, i) : k === i) ? [c] : []);
6864
+ const selectedColFields = selectedFieldCols.map(c => c.field);
6865
+ this.targetColField = selectedColFields[0];
6866
+ result.dataString = data.flatMap(item => {
6867
+ const itemString = this.itemToString(item.dataItem, selectedFieldCols);
6868
+ const existingItem = isPresent$1(itemString);
6869
+ if (!isPresent$1(this.targetRowIndex) && isPresent$1(itemString)) {
6870
+ this.targetRowIndex = item.dataRowIndex;
6871
+ }
6872
+ result.gridItems.push({
6873
+ dataItem: item.dataItem,
6874
+ fields: selectedColFields
6875
+ });
6876
+ return existingItem ? [itemString] : [];
6877
+ }).join(`\r\n`);
6878
+ if (options.copyHeaders) {
6879
+ result.dataString = this.addHeaders(result.dataString, selectedFieldCols);
6880
+ }
6881
+ }
6882
+ else { // split per row (uneven rows)
6883
+ const rowIdentifier = selectionDirective.selectionKey;
6884
+ result.dataString = data.flatMap(item => {
6885
+ // determine cols per item
6886
+ const key = rowIdentifier ?
6887
+ typeof rowIdentifier === 'string' ? item.dataItem[rowIdentifier] : rowIdentifier({ index: item.dataRowIndex, dataItem: item.dataItem }) :
6888
+ item.dataRowIndex;
6889
+ const selectionKeys = groups.find(gr => gr.value === key).items.map(item => item.columnKey);
6890
+ const selectedFieldCols = columns.flatMap((c, i) => (c instanceof ColumnComponent && c.field) && selectionKeys.find(k => typeof colIdentifier === 'function' ? k === colIdentifier(c, i) : k === i) ? [c] : []);
6891
+ const selectedColFields = selectedFieldCols.map(c => c.field);
6892
+ if (!this.targetColField) {
6893
+ this.targetColField = selectedColFields[0];
6894
+ }
6895
+ const itemString = this.itemToString(item.dataItem, selectedFieldCols);
6896
+ const existingItem = isPresent$1(itemString);
6897
+ if (!isPresent$1(this.targetRowIndex) && existingItem) {
6898
+ this.targetRowIndex = item.dataRowIndex;
6899
+ }
6900
+ if (existingItem) {
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
+ return result;
6911
+ }
6912
+ getGridData(data, columns, targetType, targetRowIndex, options) {
6913
+ const separator = data.includes(`\r\n`) ? `\r\n` : data.includes(`\n`) ? `\n` : null;
6914
+ const dataRows = separator ? data.split(separator) : [data];
6915
+ this.targetRowIndex = targetRowIndex;
6916
+ if (targetType === 'activeCell') {
6917
+ if (options.wholeRow) {
6918
+ this.targetColField = columns.find(c => c instanceof ColumnComponent && c.field)?.field;
6919
+ }
6920
+ else {
6921
+ const activeCellIndex = this.contextService.grid.activeCell.colIndex;
6922
+ for (let i = 0; i < columns.length; i++) {
6923
+ const col = columns[i];
6924
+ if (col instanceof ColumnComponent && col.field && i >= activeCellIndex) {
6925
+ this.targetColField = col.field;
6926
+ break;
6927
+ }
6928
+ }
6929
+ }
6930
+ }
6931
+ else {
6932
+ if (options.wholeRow || !options.isCellSelection) {
6933
+ this.targetColField = (columns.filter(c => c instanceof ColumnComponent && c.field))[0]['field'];
6934
+ }
6935
+ else {
6936
+ const { groups } = this.groupSelection();
6937
+ const selectionDirective = this.contextService.grid.selectionDirective;
6938
+ const colIdentifier = selectionDirective.columnKey;
6939
+ const visibleCols = columns.filter(c => c.isVisible);
6940
+ const selectionKeys = groups[0].items.map(item => item.columnKey);
6941
+ const selectedFieldCols = visibleCols.flatMap((c, i) => (c instanceof ColumnComponent && c.field) && selectionKeys.find(k => typeof colIdentifier === 'function' ? k === colIdentifier(c, i) : k === i) ? [c] : []);
6942
+ const selectedColFields = selectedFieldCols.map(c => c.field);
6943
+ this.targetColField = selectedColFields[0];
6944
+ }
6945
+ }
6946
+ const items = dataRows.map(rowString => {
6947
+ const cells = rowString.includes(`\t`) ? rowString.split(`\t`) : [rowString];
6948
+ const colFields = columns.flatMap(c => (c instanceof ColumnComponent) && c.field ? [c.field] : []);
6949
+ const targetColFieldIndex = colFields.indexOf(this.targetColField);
6950
+ const affectedFields = colFields.slice(targetColFieldIndex, targetColFieldIndex + cells.length);
6951
+ const item = {};
6952
+ colFields.slice(targetColFieldIndex, targetColFieldIndex + cells.length).forEach((colField, index) => item[colField] = cells[index]);
6953
+ return {
6954
+ dataItem: item,
6955
+ fields: affectedFields
6956
+ };
6957
+ });
6958
+ return items;
6959
+ }
6960
+ groupSelection() {
6961
+ const selection = this.contextService.grid.selection;
6962
+ const groups = groupBy(selection, [{ field: 'itemKey' }])
6963
+ .map(gr => {
6964
+ gr.items.sort((a, b) => a.columnKey - b.columnKey);
6965
+ return gr;
6966
+ });
6967
+ for (let i = 1; i < groups.length; i++) {
6968
+ if (!this.areEqual(groups[i].items, groups[i - 1].items)) {
6969
+ return {
6970
+ tabular: false,
6971
+ groups
6972
+ };
6973
+ }
6974
+ }
6975
+ return {
6976
+ tabular: true,
6977
+ groups
6978
+ };
6979
+ }
6980
+ areEqual(arr1, arr2) {
6981
+ if (arr1.length !== arr2.length) {
6982
+ return false;
6983
+ }
6984
+ for (let i = 0; i < arr1.length; i++) {
6985
+ if (arr1[i].columnKey !== arr2[i].columnKey) {
6986
+ return false;
6987
+ }
6988
+ }
6989
+ return true;
6990
+ }
6991
+ addHeaders(initialData, cols) {
6992
+ const headersRowData = cols.map(c => c.title || c.field).join(`\t`);
6993
+ return `${headersRowData}\r\n${initialData}`;
6994
+ }
6995
+ }
6996
+ ClipboardService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ClipboardService, deps: [{ token: ContextService }], target: i0.ɵɵFactoryTarget.Injectable });
6997
+ ClipboardService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ClipboardService });
6998
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ClipboardService, decorators: [{
6999
+ type: Injectable
7000
+ }], ctorParameters: function () { return [{ type: ContextService }]; } });
7001
+
6751
7002
  /**
6752
7003
  * @hidden
6753
7004
  */
@@ -11599,14 +11850,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
11599
11850
  type: Injectable
11600
11851
  }], ctorParameters: function () { return [{ type: MenuTabbingService }]; } });
11601
11852
 
11602
- /**
11603
- * @hidden
11604
- */
11605
- const ColumnMenuErrorMessages = {
11606
- autoSizeColumn: 'The auto size column does not work with enabled virtual columns',
11607
- autoSizeAllColumns: 'The auto size all columns does not work with enabled virtual columns'
11608
- };
11609
-
11610
11853
  /**
11611
11854
  * @hidden
11612
11855
  */
@@ -11616,7 +11859,7 @@ class ColumnMenuItemBase {
11616
11859
  }
11617
11860
  ngOnInit() {
11618
11861
  if (isDevMode() && !this.service) {
11619
- throw new Error('The service input of the predefined column menu components is mandatory.');
11862
+ throw new Error(ColumnMenuErrorMessages.serviceInput);
11620
11863
  }
11621
11864
  }
11622
11865
  /**
@@ -19705,11 +19948,7 @@ const createControl = (source) => (acc, key) => {
19705
19948
  const validateColumnsField = (columns) => expandColumns(columns.toArray())
19706
19949
  .filter(isColumnComponent)
19707
19950
  .filter(({ field }) => !isValidFieldName(field))
19708
- .forEach(({ field }) => console.warn(`
19709
- Grid column field name '${field}' does not look like a valid JavaScript identifier.
19710
- Identifiers can contain only alphanumeric characters (including "$" or "_"), and may not start with a digit.
19711
- Please use only valid identifier names to ensure error-free operation.
19712
- `));
19951
+ .forEach(({ field }) => console.warn(ColumnConfigurationErrorMessages.fieldName(field)));
19713
19952
  const handleExpandCollapseGroupsService = (service, expandEmitter, collapseEmitter, map) => (service.changes.pipe(filter(({ group }) => isPresent(group)))
19714
19953
  .subscribe((x) => x.expand ? expandEmitter.emit(map(x)) : collapseEmitter.emit(map(x))));
19715
19954
  const handleExpandCollapseDetailsService = (service, expandEmitter, collapseEmitter, map) => (service.changes.pipe(filter(({ dataItem }) => isPresent(dataItem)))
@@ -20224,7 +20463,7 @@ class GridComponent {
20224
20463
  */
20225
20464
  set rowClass(fn) {
20226
20465
  if (isDevMode() && typeof fn !== 'function') {
20227
- throw new Error(`rowClass must be a function, but received ${JSON.stringify(fn)}.`);
20466
+ throw new Error(GridConfigurationErrorMessages.functionType('rowClass', fn));
20228
20467
  }
20229
20468
  this._rowClass = fn;
20230
20469
  }
@@ -20237,7 +20476,7 @@ class GridComponent {
20237
20476
  */
20238
20477
  set rowSticky(fn) {
20239
20478
  if (isDevMode() && isPresent(fn) && typeof fn !== 'function') {
20240
- throw new Error(`rowSticky must be a function, but received ${JSON.stringify(fn)}.`);
20479
+ throw new Error(GridConfigurationErrorMessages.functionType('rowSticky', fn));
20241
20480
  }
20242
20481
  if (isPresent(fn)) {
20243
20482
  this._rowSticky = fn;
@@ -20253,7 +20492,7 @@ class GridComponent {
20253
20492
  */
20254
20493
  set rowSelected(fn) {
20255
20494
  if (isDevMode() && typeof fn !== 'function') {
20256
- throw new Error(`rowSelected must be a function, but received ${JSON.stringify(fn)}.`);
20495
+ throw new Error(GridConfigurationErrorMessages.functionType('rowSelected', fn));
20257
20496
  }
20258
20497
  this._rowSelected = fn;
20259
20498
  }
@@ -20270,7 +20509,7 @@ class GridComponent {
20270
20509
  */
20271
20510
  set cellSelected(fn) {
20272
20511
  if (isDevMode() && typeof fn !== 'function') {
20273
- throw new Error(`cellSelected must be a function, but received ${JSON.stringify(fn)}.`);
20512
+ throw new Error(GridConfigurationErrorMessages.functionType('cellSelected', fn));
20274
20513
  }
20275
20514
  this._cellSelected = fn;
20276
20515
  }
@@ -20289,6 +20528,16 @@ class GridComponent {
20289
20528
  get activeRow() {
20290
20529
  return this.navigationService.activeRow;
20291
20530
  }
20531
+ /**
20532
+ * Returns the current Grid selection.
20533
+ *
20534
+ * @hidden
20535
+ */
20536
+ get selection() {
20537
+ return (this.selectable || this.selectionDirective) ?
20538
+ this.defaultSelection ? this.defaultSelection.stateToArray() : this.selectionDirective.stateToArray() :
20539
+ [];
20540
+ }
20292
20541
  /**
20293
20542
  * Specifies if the loading indicator of the Grid will be displayed ([see example]({% slug binding_grid %})).
20294
20543
  *
@@ -21205,7 +21454,7 @@ class GridComponent {
21205
21454
  instance = column;
21206
21455
  }
21207
21456
  if (!instance && isDevMode()) {
21208
- throw new Error(`Invalid column ${column}`);
21457
+ throw new Error(ColumnConfigurationErrorMessages.invalidColumn(column));
21209
21458
  }
21210
21459
  return instance;
21211
21460
  }
@@ -21214,43 +21463,43 @@ class GridComponent {
21214
21463
  const locked = this.lockedLeafColumns.length || (this.columnMenu && this.columnMenu.lock);
21215
21464
  const stickyColumns = this.stickyColumns.length || (this.columnMenu && this.columnMenu.stick);
21216
21465
  if (locked && this.detailTemplate) {
21217
- throw new Error('Having both detail template and locked columns is not supported.');
21466
+ throw new Error(GridConfigurationErrorMessages.incompatibleFeatures('detail template', 'locked columns'));
21218
21467
  }
21219
21468
  if (stickyColumns && this.detailTemplate) {
21220
- throw new Error('Having both detail template and sticky columns is not supported.');
21469
+ throw new Error(GridConfigurationErrorMessages.incompatibleFeatures('detail template', 'sticky columns'));
21221
21470
  }
21222
21471
  if (this.lockedLeafColumns.length && !this.nonLockedLeafColumns.length) {
21223
- throw new Error('There should be at least one non-locked column');
21472
+ throw new Error(GridConfigurationErrorMessages.nonLockedColumnPresent);
21224
21473
  }
21225
21474
  if ((locked || this.virtualColumns) && expandColumns(this.columnList.toArray()).filter(column => !column.width && !isColumnGroupComponent(column)).length) {
21226
- throw new Error((locked ? 'Locked' : 'Virtual') + ' columns feature requires all columns to have set width.');
21475
+ throw new Error(ColumnConfigurationErrorMessages.requiredWidth(locked ? 'Locked' : 'Virtual'));
21227
21476
  }
21228
21477
  if (locked && !this.isScrollable) {
21229
- throw new Error('Locked columns are only supported when scrolling is enabled.');
21478
+ throw new Error(ColumnConfigurationErrorMessages.requiredScroll('Locked'));
21479
+ }
21480
+ if (stickyColumns && !this.isScrollable) {
21481
+ throw new Error(ColumnConfigurationErrorMessages.requiredScroll('Sticky'));
21230
21482
  }
21231
21483
  if (this.columnList.filter(isColumnGroupComponent).filter((x) => !x.hasChildren).length) {
21232
- throw new Error('ColumnGroupComponent should contain ColumnComponent or CommandColumnComponent.');
21484
+ throw new Error(ColumnConfigurationErrorMessages.groupColumnContent);
21233
21485
  }
21234
21486
  if (this.columnList.filter(x => x.locked && x.parent && !x.parent.isLocked).length) {
21235
- throw new Error('Locked child columns require their parent columns to be locked.');
21487
+ throw new Error(ColumnConfigurationErrorMessages.lockedParent);
21236
21488
  }
21237
21489
  if ((this.rowHeight || this.detailRowHeight) && !this.isVirtual) {
21238
- throw new Error('Row height and detail row height settings require virtual scrolling mode to be enabled.');
21490
+ throw new Error(GridConfigurationErrorMessages.rowHeightVirtual);
21239
21491
  }
21240
21492
  if (stickyColumns && expandColumns(this.columnList.toArray()).filter(column => !column.width && !isColumnGroupComponent(column)).length) {
21241
- throw new Error('Sticky columns feature requires all columns to have set width.');
21242
- }
21243
- if (stickyColumns && !this.isScrollable) {
21244
- throw new Error('Sticky columns are only supported when scrolling is enabled.');
21493
+ throw new Error(ColumnConfigurationErrorMessages.requiredWidth('Sticky'));
21245
21494
  }
21246
21495
  if (stickyColumns && this.virtualColumns) {
21247
- throw new Error('Having both sticky columns and column virtualization is not supported.');
21496
+ throw new Error(GridConfigurationErrorMessages.incompatibleFeatures('sticky columns', 'column virtualization'));
21248
21497
  }
21249
21498
  if (this.rowSticky && this.scrollable === 'virtual') {
21250
- throw new Error('Having both sticky rows and row virtualization (scrollable="virtual") is not supported.');
21499
+ throw new Error(GridConfigurationErrorMessages.incompatibleFeatures('sticky rows', 'row virtualization (scrollable="virtual")'));
21251
21500
  }
21252
21501
  if (this.rowSticky && this.groupable) {
21253
- throw new Error('Having both sticky rows and grouping is not supported.');
21502
+ throw new Error(GridConfigurationErrorMessages.incompatibleFeatures('sticky rows', 'grouping'));
21254
21503
  }
21255
21504
  validateColumnsField(this.columnList);
21256
21505
  }
@@ -21449,7 +21698,7 @@ class GridComponent {
21449
21698
  }
21450
21699
  assertNavigable() {
21451
21700
  if (isDevMode() && !this.navigationService.enabled) {
21452
- throw new Error('The Grid should be configured as navigable to control focus');
21701
+ throw new Error(GridConfigurationErrorMessages.focusNavigable);
21453
21702
  }
21454
21703
  }
21455
21704
  navigationMetadata() {
@@ -21521,9 +21770,7 @@ class GridComponent {
21521
21770
  toggleDetailRowLegacy(index, expand) {
21522
21771
  const hasCallback = typeof this.isDetailExpanded === 'function';
21523
21772
  if (isDevMode() && hasCallback) {
21524
- throw new Error('The expandRow and collapseRow methods should not be called when using the ' +
21525
- 'kendoGridDetailsExpandBy directive or the isDetailExpanded callback. ' +
21526
- 'These methods are provided only for backwards compatibility with legacy versions.');
21773
+ throw new Error(GridConfigurationErrorMessages.expandCollapseMethods('expandRow', 'collapseRow', 'kendoGridDetailsExpandBy', 'isDetailExpanded'));
21527
21774
  }
21528
21775
  if (!isDevMode() && hasCallback) {
21529
21776
  return;
@@ -21535,9 +21782,7 @@ class GridComponent {
21535
21782
  toggleGroupRowLegacy(index, expand) {
21536
21783
  const hasCallback = typeof this.isGroupExpanded === 'function';
21537
21784
  if (isDevMode() && hasCallback) {
21538
- throw new Error('The expandGroup and collapseGroup methods should not be called when using the ' +
21539
- 'kendoGridExpandGroupBy directive or the isGroupExpanded callback. ' +
21540
- 'These methods are provided only for backwards compatibility with legacy versions.');
21785
+ throw new Error(GridConfigurationErrorMessages.expandCollapseMethods('expandGroup', 'collapseGroup', 'kendoGridExpandGroupBy', 'isGroupExpanded'));
21541
21786
  }
21542
21787
  if (!isDevMode() && hasCallback) {
21543
21788
  return;
@@ -21611,7 +21856,8 @@ GridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version:
21611
21856
  SortService,
21612
21857
  ContextService,
21613
21858
  SizingOptionsService,
21614
- RowReorderService
21859
+ RowReorderService,
21860
+ ClipboardService
21615
21861
  ], 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: `
21616
21862
  <ng-container kendoGridLocalizedMessages
21617
21863
  i18n-groupPanelEmpty="kendo.grid.groupPanelEmpty|The label visible in the Grid group panel when it is empty"
@@ -22239,7 +22485,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
22239
22485
  SortService,
22240
22486
  ContextService,
22241
22487
  SizingOptionsService,
22242
- RowReorderService
22488
+ RowReorderService,
22489
+ ClipboardService
22243
22490
  ],
22244
22491
  selector: 'kendo-grid',
22245
22492
  template: `
@@ -23169,11 +23416,12 @@ class DataBindingDirective {
23169
23416
  }
23170
23417
  }
23171
23418
  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 });
23172
- 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 });
23419
+ 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 });
23173
23420
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: DataBindingDirective, decorators: [{
23174
23421
  type: Directive,
23175
23422
  args: [{
23176
- selector: '[kendoGridBinding]'
23423
+ selector: '[kendoGridBinding]',
23424
+ exportAs: 'kendoGridBinding'
23177
23425
  }]
23178
23426
  }], ctorParameters: function () { return [{ type: GridComponent }, { type: i0.ChangeDetectorRef }, { type: LocalDataChangesService }, { type: RowReorderService }]; }, propDecorators: { skip: [{
23179
23427
  type: Input
@@ -25694,8 +25942,7 @@ class LocalEditService {
25694
25942
  return data;
25695
25943
  }
25696
25944
  if (isDevMode()) {
25697
- throw new Error('The default edit service of the editing directives works only when binding to plain array.' +
25698
- 'Please provide an editService.');
25945
+ throw new Error(GridConfigurationErrorMessages.requiredEditService);
25699
25946
  }
25700
25947
  return [];
25701
25948
  }
@@ -26202,9 +26449,7 @@ class GroupBindingDirective extends DataBindingDirective {
26202
26449
  }
26203
26450
  ngAfterContentInit() {
26204
26451
  if (isDevMode() && this.grid.isGroupExpanded) {
26205
- throw new Error('Using the `kendoGridGroupBinding` directive in combination with the `kendoGridExpandGroupBy` directive ' +
26206
- 'or the `isGroupExpanded` callback is not supported. To use grouping with the `kendoGridGroupBinding` directive, ' +
26207
- 'set the Grid `groupable` property to `true`.');
26452
+ throw new Error(GridConfigurationErrorMessages.groupBindingDirectives);
26208
26453
  }
26209
26454
  }
26210
26455
  groupExpand({ groupIndex }) {
@@ -26336,6 +26581,181 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
26336
26581
  }]
26337
26582
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: ContextService }]; } });
26338
26583
 
26584
+ /**
26585
+ * The directive that enables the Grid built-in clipboard support. Allows copy, cut, and paste interactions
26586
+ * with the Grid.
26587
+ */
26588
+ class GridClipboardDirective {
26589
+ constructor(host, clipboardService, renderer, zone) {
26590
+ this.host = host;
26591
+ this.clipboardService = clipboardService;
26592
+ this.renderer = renderer;
26593
+ this.zone = zone;
26594
+ /**
26595
+ * Fires when the user performs `cut`, `copy` or `paste` action within the Grid content area.
26596
+ */
26597
+ this.clipboard = new EventEmitter();
26598
+ this._clipboardSettings = {
26599
+ wholeRow: false,
26600
+ copyHeaders: false,
26601
+ copy: true,
26602
+ cut: true,
26603
+ paste: true
26604
+ };
26605
+ this.subs = new Subscription();
26606
+ this.onClipboard = (operationType, args) => {
26607
+ if (!this.inGrid(args) || !this.clipboardSettings[operationType]) {
26608
+ return;
26609
+ }
26610
+ const gridData = Array.isArray(this.host.data) ? this.host.data : this.host.data.data;
26611
+ const gridDataItems = gridData.flatMap(recursiveFlatMap);
26612
+ const selection = this.host.selection;
26613
+ const selectionDirective = this.host.selectionDirective;
26614
+ const targetType = this.clipboardTarget;
26615
+ const isCellSelection = (this.host.selectable?.cell || selectionDirective.isCellSelectionMode);
26616
+ let clipboardData = [];
26617
+ switch (targetType) {
26618
+ case 'activeCell':
26619
+ {
26620
+ const targetCell = { ...this.host.activeCell };
26621
+ clipboardData = targetCell && [{ dataItem: targetCell.dataItem, dataRowIndex: targetCell.dataRowIndex }];
26622
+ }
26623
+ break;
26624
+ case 'selectionStart':
26625
+ {
26626
+ const identifier = selectionDirective.selectionKey;
26627
+ clipboardData = gridDataItems.flatMap((item, index) => {
26628
+ if (identifier) {
26629
+ const key = typeof identifier === 'string' ? item[identifier] : identifier({ index: index + this.host.skip, dataItem: item });
26630
+ return isCellSelection ?
26631
+ selection.some(s => s.itemKey === key) ? [{ dataItem: item, dataRowIndex: index + this.host.skip }] : [] :
26632
+ selection.indexOf(key) > -1 ? [{ dataItem: item, dataRowIndex: index + this.host.skip }] : [];
26633
+ }
26634
+ return isCellSelection ?
26635
+ selection.some(s => s.itemKey === index + this.host.skip) ? [{ dataItem: item, dataRowIndex: index + this.host.skip }] : [] :
26636
+ selection.indexOf(index + this.host.skip) > -1 ? [{ dataItem: item, dataRowIndex: index + this.host.skip }] : [];
26637
+ });
26638
+ }
26639
+ break;
26640
+ }
26641
+ const isPaste = operationType === 'paste';
26642
+ const pastedData = args.clipboardData.getData('text').trim();
26643
+ const visibleCols = this.host.columns.toArray().filter(c => c.isVisible);
26644
+ const data = isPaste ?
26645
+ {
26646
+ dataString: pastedData,
26647
+ gridItems: this.clipboardService.getGridData(pastedData, visibleCols, this.clipboardTarget, clipboardData[0].dataRowIndex, {
26648
+ wholeRow: this.clipboardSettings.wholeRow,
26649
+ isCellSelection
26650
+ })
26651
+ } :
26652
+ this.clipboardService.createClipboardData(clipboardData || [], visibleCols, {
26653
+ wholeRow: this.clipboardSettings.wholeRow || !isCellSelection,
26654
+ copyHeaders: this.clipboardSettings.copyHeaders,
26655
+ operationType
26656
+ });
26657
+ !isPaste && navigator.clipboard.writeText(data.dataString);
26658
+ if (hasObservers(this.clipboard)) {
26659
+ this.clipboard.emit({
26660
+ type: operationType,
26661
+ originalEvent: args,
26662
+ clipboardData: data.dataString,
26663
+ gridData: data.gridItems,
26664
+ target: {
26665
+ dataRowIndex: this.clipboardService.targetRowIndex,
26666
+ colField: this.clipboardService.targetColField,
26667
+ dataItem: clipboardData.find(item => item.dataRowIndex === this.clipboardService.targetRowIndex)?.dataItem
26668
+ }
26669
+ });
26670
+ }
26671
+ this.clipboardService.targetColField = this.clipboardService.targetRowIndex = null;
26672
+ };
26673
+ this.inGrid = (args) => {
26674
+ const target = document.activeElement.matches('.k-table-td') ? document.activeElement : args.target;
26675
+ const inContentArea = closest(target, node => node.parentElement?.classList.contains('k-grid-container'));
26676
+ const inHost = contains$2(this.host.wrapper.nativeElement, target);
26677
+ return target && inHost && inContentArea;
26678
+ };
26679
+ }
26680
+ /**
26681
+ * Determines the target of the clipboard operation. The possible options are:
26682
+ * - `activeCell`&mdash;Only the content of the current active cell or the row it is in will be copied to the clipboard.
26683
+ * When pasting, the active cell will be the pivotal point for pasted content.
26684
+ * - `selectionStart`&mdash;The content of all selected cells or rows from the current page will be copied to the clipboard.
26685
+ * When pasting the first selected cell will be the pivotal point for pasted content.
26686
+ *
26687
+ * This option must be set, and the Grid keyboard navigation and/or selection functionalities must be enabled
26688
+ * for the Clipboard directive to function as designed.
26689
+ */
26690
+ set clipboardTarget(value) {
26691
+ if (isDevMode()) {
26692
+ this.zone.onStable.pipe(take(1)).subscribe(() => {
26693
+ if (value === 'activeCell' && !(this.host.navigable.length)) {
26694
+ console.warn(ClipboardErrorMessages.clipboardTarget.activeCellNavigable);
26695
+ }
26696
+ else if (value === 'selectionStart' && !(this.host.selectable || this.host.selectionDirective)) {
26697
+ console.warn(ClipboardErrorMessages.selectionStartSelectable);
26698
+ }
26699
+ else if (!isPresent(value)) {
26700
+ console.warn(ClipboardErrorMessages.clipboardTarget);
26701
+ }
26702
+ });
26703
+ }
26704
+ this._target = value;
26705
+ }
26706
+ get clipboardTarget() {
26707
+ return this._target;
26708
+ }
26709
+ /**
26710
+ * The `GridClipboardDirective` settings.
26711
+ *
26712
+ * @default { wholeRow: false, copyHeaders: false copy: true, cut: true, paste: true }
26713
+ */
26714
+ set clipboardSettings(value) {
26715
+ this._clipboardSettings = Object.assign({}, this._clipboardSettings, value);
26716
+ }
26717
+ get clipboardSettings() {
26718
+ return this._clipboardSettings;
26719
+ }
26720
+ ngAfterViewInit() {
26721
+ if (!isDocumentAvailable()) {
26722
+ return;
26723
+ }
26724
+ if (isDevMode() && !isPresent(this.clipboardTarget)) {
26725
+ console.warn(ClipboardErrorMessages.clipboardTarget);
26726
+ }
26727
+ // needed due to the following issue in Chrome
26728
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=1156117&q=focus%20programmatically%20paste&can=2
26729
+ this.subs.add(this.renderer.listen(document, 'copy', (args) => this.onClipboard('copy', args)));
26730
+ this.subs.add(this.renderer.listen(document, 'cut', (args) => this.onClipboard('cut', args)));
26731
+ this.subs.add(this.renderer.listen(document, 'paste', (args) => this.onClipboard('paste', args)));
26732
+ }
26733
+ ngOnChanges(changes) {
26734
+ if (changes['clipboardTarget'] && isDevMode() && !isPresent(changes['clipboardTarget'].currentValue)) {
26735
+ console.warn(ClipboardErrorMessages.clipboardTarget);
26736
+ }
26737
+ }
26738
+ ngOnDestroy() {
26739
+ this.subs.unsubscribe();
26740
+ }
26741
+ }
26742
+ 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 });
26743
+ 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 });
26744
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: GridClipboardDirective, decorators: [{
26745
+ type: Directive,
26746
+ args: [{
26747
+ selector: '[kendoGridClipboard]',
26748
+ exportAs: 'kendoGridClipboard',
26749
+ providers: [ClipboardService]
26750
+ }]
26751
+ }], ctorParameters: function () { return [{ type: GridComponent }, { type: ClipboardService }, { type: i0.Renderer2 }, { type: i0.NgZone }]; }, propDecorators: { clipboardTarget: [{
26752
+ type: Input
26753
+ }], clipboardSettings: [{
26754
+ type: Input
26755
+ }], clipboard: [{
26756
+ type: Output
26757
+ }] } });
26758
+
26339
26759
  const exportedModules$1 = [
26340
26760
  GridComponent,
26341
26761
  ToolbarTemplateDirective,
@@ -26360,7 +26780,8 @@ const exportedModules$1 = [
26360
26780
  ...PagerModule.exports(),
26361
26781
  ...RowFilterModule.exports(),
26362
26782
  ...FilterMenuModule.exports(),
26363
- ...ColumnMenuModule.exports()
26783
+ ...ColumnMenuModule.exports(),
26784
+ GridClipboardDirective
26364
26785
  ];
26365
26786
  const declarations$2 = [
26366
26787
  GridComponent,
@@ -26381,7 +26802,8 @@ const declarations$2 = [
26381
26802
  GridSpacerComponent,
26382
26803
  GridToolbarFocusableDirective,
26383
26804
  StatusBarComponent,
26384
- StatusBarTemplateDirective
26805
+ StatusBarTemplateDirective,
26806
+ GridClipboardDirective
26385
26807
  ];
26386
26808
  /**
26387
26809
  * Represents the [NgModule](link:site.data.urls.angular['ngmoduleapi'])
@@ -26425,7 +26847,8 @@ GridModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13
26425
26847
  GridSpacerComponent,
26426
26848
  GridToolbarFocusableDirective,
26427
26849
  StatusBarComponent,
26428
- StatusBarTemplateDirective], imports: [CommonModule,
26850
+ StatusBarTemplateDirective,
26851
+ GridClipboardDirective], imports: [CommonModule,
26429
26852
  GroupModule,
26430
26853
  SharedModule,
26431
26854
  BodyModule,
@@ -26451,7 +26874,7 @@ GridModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13
26451
26874
  InCellEditingDirective,
26452
26875
  ExpandDetailsDirective,
26453
26876
  ExpandGroupDirective,
26454
- 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] });
26877
+ 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] });
26455
26878
  GridModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: GridModule, imports: [[
26456
26879
  CommonModule,
26457
26880
  GroupModule,
@@ -26748,13 +27171,13 @@ class PDFComponent extends PDFExportComponent {
26748
27171
  * @hidden
26749
27172
  */
26750
27173
  saveAs(_) {
26751
- throw new Error('Not supported. Use GridComponent.saveAsPDF');
27174
+ throw new Error(GridConfigurationErrorMessages.unsupportedMethod('saveAs', 'GridComponent.saveAsPDF'));
26752
27175
  }
26753
27176
  /**
26754
27177
  * @hidden
26755
27178
  */
26756
27179
  export() {
26757
- throw new Error('Not supported. Use GridComponent.drawPDF');
27180
+ throw new Error(GridConfigurationErrorMessages.unsupportedMethod('export', 'GridComponent.drawPDF'));
26758
27181
  }
26759
27182
  savePDF(component) {
26760
27183
  this.createPDF(component, this.draw);
@@ -27349,5 +27772,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
27349
27772
  * Generated bundle index. Do not edit.
27350
27773
  */
27351
27774
 
27352
- 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 };
27775
+ 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 };
27353
27776