@progress/kendo-angular-spreadsheet 21.3.1-develop.1 → 21.4.0-develop.10

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 (37) hide show
  1. package/common/spreadsheet.service.d.ts +3 -0
  2. package/directives.d.ts +3 -1
  3. package/esm2022/common/error-handling.service.mjs +1 -0
  4. package/esm2022/common/spreadsheet.service.mjs +2 -0
  5. package/esm2022/directives.mjs +5 -1
  6. package/esm2022/filter-menu/filter-menu-item-content-template.directive.mjs +26 -0
  7. package/esm2022/filter-menu/filter-menu-item.component.mjs +271 -0
  8. package/esm2022/localization/messages.mjs +175 -1
  9. package/esm2022/models/filter-menu-item.mjs +5 -0
  10. package/esm2022/models/index.mjs +2 -0
  11. package/esm2022/models/range-filter-value.mjs +5 -0
  12. package/esm2022/package-metadata.mjs +2 -2
  13. package/esm2022/spreadsheet.component.mjs +717 -47
  14. package/esm2022/spreadsheet.module.mjs +3 -1
  15. package/esm2022/tools/filter-sort/filter-tool.directive.mjs +75 -0
  16. package/esm2022/tools/filter-sort/sort-tool.directive.mjs +57 -0
  17. package/esm2022/tools/index.mjs +2 -0
  18. package/esm2022/tools/shared/command-icons.mjs +13 -3
  19. package/esm2022/tools/shared/constants.mjs +7 -0
  20. package/fesm2022/progress-kendo-angular-spreadsheet.mjs +1301 -59
  21. package/filter-menu/filter-menu-item-content-template.directive.d.ts +15 -0
  22. package/filter-menu/filter-menu-item.component.d.ts +83 -0
  23. package/index.d.ts +1 -1
  24. package/localization/messages.d.ts +117 -1
  25. package/models/events.d.ts +49 -0
  26. package/models/filter-menu-item.d.ts +14 -0
  27. package/models/index.d.ts +2 -0
  28. package/models/range-filter-value.d.ts +15 -0
  29. package/package.json +18 -17
  30. package/schematics/ngAdd/index.js +2 -2
  31. package/spreadsheet.component.d.ts +73 -12
  32. package/spreadsheet.module.d.ts +3 -1
  33. package/tools/filter-sort/filter-tool.directive.d.ts +23 -0
  34. package/tools/filter-sort/sort-tool.directive.d.ts +21 -0
  35. package/tools/index.d.ts +2 -0
  36. package/tools/shared/commands.d.ts +1 -1
  37. package/tools/shared/constants.d.ts +12 -0
@@ -2,14 +2,14 @@
2
2
  * Copyright © 2025 Progress Software Corporation. All rights reserved.
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
- import { Component, ElementRef, EventEmitter, HostBinding, Input, NgZone, Output, ViewChild, ViewContainerRef } from '@angular/core';
5
+ import { Component, ElementRef, EventEmitter, HostBinding, Input, NgZone, Output, ViewChild, ViewContainerRef, TemplateRef, ChangeDetectorRef } from '@angular/core';
6
6
  import { Subscription } from 'rxjs';
7
7
  import { take } from 'rxjs/operators';
8
8
  import { validatePackage } from '@progress/kendo-licensing';
9
9
  import { packageMetadata } from './package-metadata';
10
- import { SpreadsheetWidget, registerEditor, Matrix, dateToSerial, serialToDate, validation, calc } from '@progress/kendo-spreadsheet-common';
10
+ import { SpreadsheetWidget, registerEditor, Matrix, dateToSerial, serialToDate, validation, calc, formatting } from '@progress/kendo-spreadsheet-common';
11
11
  import { localeData, IntlService } from '@progress/kendo-angular-intl';
12
- import { calendarIcon, caretAltDownIcon, downloadIcon, folderOpenIcon, formulaFxIcon } from '@progress/kendo-svg-icons';
12
+ import { calendarIcon, caretAltDownIcon, downloadIcon, folderOpenIcon, formulaFxIcon, sortDescSmallIcon, sortAscSmallIcon, searchIcon } from '@progress/kendo-svg-icons';
13
13
  import { L10N_PREFIX, LocalizationService } from '@progress/kendo-angular-l10n';
14
14
  import { PopupService } from '@progress/kendo-angular-popup';
15
15
  import { ContextMenuComponent, MenuItemComponent, MenuComponent } from '@progress/kendo-angular-menu';
@@ -61,6 +61,15 @@ import { LocalizedMessagesDirective } from './localization/localized-messages.di
61
61
  import { SpreadsheetDataValidationDirective } from './tools/data-validation-tool.directive';
62
62
  import { ListEditorComponent } from './common/list-editor.component';
63
63
  import { CalendarComponent } from './common/calendar-editor.component';
64
+ import { SpreadsheetFilterDirective } from './tools/filter-sort/filter-tool.directive';
65
+ import { SpreadsheetFilterMenuItemComponent } from './filter-menu/filter-menu-item.component';
66
+ import { KENDO_TREEVIEW } from '@progress/kendo-angular-treeview';
67
+ import { FilterMenuItemContentTemplateDirective } from './filter-menu/filter-menu-item-content-template.directive';
68
+ import { ButtonComponent } from '@progress/kendo-angular-buttons';
69
+ import { DropDownListComponent } from "@progress/kendo-angular-dropdowns";
70
+ import { InputsModule } from "@progress/kendo-angular-inputs";
71
+ import { DatePickerComponent } from "@progress/kendo-angular-dateinputs";
72
+ import { SpreadsheetSortDirective } from './tools/filter-sort/sort-tool.directive';
64
73
  import * as i0 from "@angular/core";
65
74
  import * as i1 from "@progress/kendo-angular-intl";
66
75
  import * as i2 from "@progress/kendo-angular-l10n";
@@ -69,6 +78,8 @@ import * as i4 from "./tools/tools.service";
69
78
  import * as i5 from "./common/error-handling.service";
70
79
  import * as i6 from "@progress/kendo-angular-dialog";
71
80
  import * as i7 from "@progress/kendo-angular-popup";
81
+ import * as i8 from "@progress/kendo-angular-treeview";
82
+ import * as i9 from "@progress/kendo-angular-inputs";
72
83
  /**
73
84
  * Represents the [Kendo UI Spreadsheet component for Angular]({% slug overview_spreadsheet %}).
74
85
  *
@@ -91,11 +102,13 @@ export class SpreadsheetComponent {
91
102
  dialogService;
92
103
  popupService;
93
104
  container;
105
+ cdr;
94
106
  formulaBarInputRef;
95
107
  formulaCellInputRef;
96
108
  nameBoxRef;
97
109
  dialogContainer;
98
110
  contextMenu;
111
+ filterMenuTemplate;
99
112
  hostClass = true;
100
113
  role = 'application';
101
114
  /**
@@ -159,6 +172,14 @@ export class SpreadsheetComponent {
159
172
  get sheetsInfo() {
160
173
  return this._sheetsInfo;
161
174
  }
175
+ /**
176
+ * @hidden
177
+ */
178
+ expandedKeys = ['0'];
179
+ /**
180
+ * @hidden
181
+ */
182
+ checkedKeys = [];
162
183
  /**
163
184
  * The number of columns in the document.
164
185
  *
@@ -215,38 +236,46 @@ export class SpreadsheetComponent {
215
236
  */
216
237
  excel;
217
238
  /**
218
- * Fired when a value in the Spreadsheet is changed. Exposes the `SpreadsheetWidget` instance and the selected `Range` as event data.
239
+ * Fires when a value in the Spreadsheet is changed. Exposes the `SpreadsheetWidget` instance and the selected `Range` as event data.
219
240
  */
220
241
  change = new EventEmitter();
221
242
  /**
222
- * Fired when the selected range format is changed from the UI. Exposes the `SpreadsheetWidget` instance and the selected `Range` as event data.
243
+ * Fires when the selected range format is changed from the UI. Exposes the `SpreadsheetWidget` instance and the selected `Range` as event data.
223
244
  */
224
245
  formatChange = new EventEmitter();
225
246
  /**
226
- * Fired when the selection is changed by the end user. Exposes the `SpreadsheetWidget` instance and the selected `Range` as event data.
247
+ * Fires when the selection is changed by the end user. Exposes the `SpreadsheetWidget` instance and the selected `Range` as event data.
227
248
  */
228
249
  selectionChange = new EventEmitter();
229
250
  /**
230
- * Fired when the end user clicks the Export to Excel toolbar button.
251
+ * Fires when the end user clicks the Export to Excel toolbar button.
231
252
  * The event is preventable and exposes the `Workbook` object, a `preventDefault` method
232
253
  * (if invoked, the generated file will not be saved), and the `SpreadsheetWidget` instance.
233
254
  */
234
255
  excelExport = new EventEmitter();
235
256
  /**
236
- * Fired when the end user clicks the Open toolbar button.
257
+ * Fires when the end user clicks the Open toolbar button.
237
258
  * The event is preventable and exposes the selected `File` or `Blob`, a `preventDefault` method
238
259
  * (if invoked, the selected file will not be loaded), and the `SpreadsheetWidget` instance.
239
260
  */
240
261
  excelImport = new EventEmitter();
241
262
  /**
242
- * Fired when the active sheet is about to change.
263
+ * Fires when the active sheet is about to change.
243
264
  * The event exposes the new active `Sheet` and the `SpreadsheetWidget` instance.
244
265
  */
245
266
  activeSheetChange = new EventEmitter();
267
+ /**
268
+ * Fires when a clipboard action (cut, copy, or paste) occurs in the Spreadsheet.
269
+ */
270
+ clipboard = new EventEmitter();
246
271
  formulaFxIcon = formulaFxIcon;
247
272
  folderOpenIcon = folderOpenIcon;
248
273
  downloadIcon = downloadIcon;
274
+ searchIcon = searchIcon;
249
275
  selectedMenuItem;
276
+ rangeFilterValuesList = [];
277
+ sortAscSmallIcon = sortAscSmallIcon;
278
+ sortDescSmallIcon = sortDescSmallIcon;
250
279
  get spreadsheetWidget() {
251
280
  return this.spreadsheetService.spreadsheet;
252
281
  }
@@ -259,13 +288,31 @@ export class SpreadsheetComponent {
259
288
  */
260
289
  licenseMessage;
261
290
  contextMenuItems = [];
291
+ sortMenuItems = [];
292
+ conditionExpanded = false;
293
+ valueExpanded = false;
294
+ filterConditionsList = {};
295
+ conditionValue = '';
296
+ set selectedCondition(value) {
297
+ if (this._selectedCondition?.type !== value.type) {
298
+ this.conditionValue = '';
299
+ }
300
+ this._selectedCondition = value;
301
+ }
302
+ get selectedCondition() {
303
+ return this._selectedCondition;
304
+ }
305
+ _selectedCondition;
262
306
  _sheetsInfo;
263
307
  _activeSheet;
264
308
  _menuItems;
265
309
  currentRange;
266
310
  subs = new Subscription();
311
+ filterMenuOpened = false;
312
+ currentFilterOptions = null;
267
313
  popupRef;
268
- constructor(ngZone, intl, host, localization, spreadsheetService, toolsService, errorService, dialogService, popupService, container) {
314
+ popupPositionChangeSub;
315
+ constructor(ngZone, intl, host, localization, spreadsheetService, toolsService, errorService, dialogService, popupService, container, cdr) {
269
316
  this.ngZone = ngZone;
270
317
  this.intl = intl;
271
318
  this.host = host;
@@ -276,6 +323,7 @@ export class SpreadsheetComponent {
276
323
  this.dialogService = dialogService;
277
324
  this.popupService = popupService;
278
325
  this.container = container;
326
+ this.cdr = cdr;
279
327
  const isValid = validatePackage(packageMetadata);
280
328
  this.licenseMessage = getLicenseMessage(packageMetadata);
281
329
  this.showLicenseWatermark = shouldShowValidationUI(isValid);
@@ -322,25 +370,36 @@ export class SpreadsheetComponent {
322
370
  spreadsheet.view.bind('update', this.updateState);
323
371
  spreadsheet.view.bind('message', this.onMessage);
324
372
  spreadsheet.bind('contextmenu', this.onContextMenu.bind(this));
373
+ spreadsheet.bind('copy', (e) => { this.onClipboardEvent(e, 'copy'); });
374
+ spreadsheet.bind('cut', (e) => { this.onClipboardEvent(e, 'cut'); });
375
+ spreadsheet.bind('paste', (e) => { this.onClipboardEvent(e, 'paste'); });
325
376
  const sheet = spreadsheet.activeSheet();
326
377
  if (sheet) {
327
378
  this.updateState({ range: sheet.range(sheet.activeCell()) });
328
379
  }
329
380
  this.updateActiveSheet(this.activeSheet || spreadsheet?.activeSheet()?.name());
330
381
  this.configureSheets(spreadsheet);
382
+ this.spreadsheetService.componentInitialized.next();
331
383
  });
332
384
  this.subs.add(this.spreadsheetService.sheetsChanged.subscribe(this.onSheetsChanged.bind(this)));
333
385
  this.subs.add(this.spreadsheetService.activeSheetChanged.subscribe(this.onActiveSheetChanged.bind(this)));
334
386
  this.subs.add(this.spreadsheetService.selectionChanged.subscribe(range => {
335
387
  this.currentRange = range;
336
- if (this.popupRef) {
337
- this.popupRef.close();
338
- this.popupRef = null;
339
- }
388
+ this.closePopup();
340
389
  }));
341
390
  this.spreadsheetService.dialogContainer = this.dialogContainer;
342
391
  });
343
392
  this.registerEditors();
393
+ this.spreadsheetService.spreadsheetComponent = this;
394
+ this.sortMenuItems = [{
395
+ text: this.messageFor('sortAsc'),
396
+ svgIcon: this.sortAscSmallIcon,
397
+ icon: 'sort-asc-small'
398
+ }, {
399
+ text: this.messageFor('sortDesc'),
400
+ svgIcon: this.sortDescSmallIcon,
401
+ icon: 'sort-desc-small'
402
+ }];
344
403
  }
345
404
  ngOnChanges(changes) {
346
405
  const dynamicOptions = [
@@ -383,6 +442,18 @@ export class SpreadsheetComponent {
383
442
  this.contextMenuItems = this.contextMenuItemsForTarget(targetType, e.showUnhide, e.showUnmerge);
384
443
  this.contextMenu.show({ top: e.originalEvent.pageY, left: e.originalEvent.pageX });
385
444
  }
445
+ /**
446
+ * @hidden
447
+ */
448
+ isChecked = (dataItem) => {
449
+ if (this.containsItem(dataItem)) {
450
+ return "checked";
451
+ }
452
+ if (this.isIndeterminate(dataItem.items)) {
453
+ return "indeterminate";
454
+ }
455
+ return "none";
456
+ };
386
457
  /**
387
458
  * @hidden
388
459
  */
@@ -486,11 +557,116 @@ export class SpreadsheetComponent {
486
557
  this.selectedMenuItem = this.menuItems.find(item => item.active);
487
558
  }
488
559
  }
560
+ /**
561
+ * @hidden
562
+ */
563
+ onToggle(expanded, filterType) {
564
+ this[`${filterType}Expanded`] = expanded;
565
+ if (expanded) {
566
+ const otherFilterType = filterType === 'condition' ? 'value' : 'condition';
567
+ this[`${otherFilterType}Expanded`] = false;
568
+ }
569
+ this.cdr.detectChanges();
570
+ }
571
+ /**
572
+ * @hidden
573
+ */
574
+ filterApply(filterType) {
575
+ if (!this.currentFilterOptions) {
576
+ return;
577
+ }
578
+ let filterData;
579
+ if (filterType === 'value') {
580
+ const checkedValues = this.checkedKeys
581
+ .filter(key => key !== this.messageFor('filterMenuAll'))
582
+ .map(key => {
583
+ const item = this.findItemByText(this.rangeFilterValuesList, key);
584
+ return item ? item.unformattedValue : key;
585
+ });
586
+ const hasBlanks = checkedValues.some(v => v === undefined || v === null);
587
+ const nonBlankValues = checkedValues.filter(v => v !== undefined && v !== null);
588
+ filterData = {
589
+ blanks: hasBlanks,
590
+ values: nonBlankValues.length > 0 ? nonBlankValues : undefined
591
+ };
592
+ }
593
+ else if (this.selectedCondition?.comparer !== 'none' && this.conditionValue !== null && this.conditionValue !== undefined) {
594
+ filterData = {
595
+ criteria: [{
596
+ operator: this.selectedCondition.comparer,
597
+ value: this.conditionValue
598
+ }]
599
+ };
600
+ }
601
+ else if (this.selectedCondition?.comparer === 'none') {
602
+ this.spreadsheetWidget.executeCommand({
603
+ command: 'ClearFilterCommand',
604
+ options: { column: this.currentFilterOptions?.column }
605
+ });
606
+ this.closePopup();
607
+ return;
608
+ }
609
+ if (filterData) {
610
+ const commandOptions = {
611
+ column: this.currentFilterOptions.column,
612
+ operatingRange: this.currentFilterOptions.range
613
+ };
614
+ if (filterType === 'value') {
615
+ commandOptions.valueFilter = filterData;
616
+ }
617
+ else {
618
+ commandOptions.customFilter = filterData;
619
+ }
620
+ this.spreadsheetWidget.executeCommand({
621
+ command: 'ApplyFilterCommand',
622
+ options: commandOptions
623
+ });
624
+ }
625
+ this.closePopup();
626
+ }
627
+ /**
628
+ * @hidden
629
+ */
630
+ filterClear() {
631
+ this.spreadsheetWidget.executeCommand({
632
+ command: 'ClearFilterCommand',
633
+ options: { column: this.currentFilterOptions?.column }
634
+ });
635
+ this.closePopup();
636
+ }
637
+ /**
638
+ * @hidden
639
+ */
640
+ onSortItemClick(item) {
641
+ const dir = item.text === this.messageFor('sortAsc') ? 'asc' : 'desc';
642
+ const noHeaderRange = this.currentFilterOptions?.range?.resize({ top: 1 });
643
+ const options = {
644
+ value: dir,
645
+ sheet: false,
646
+ operatingRange: noHeaderRange,
647
+ column: this.currentFilterOptions?.column
648
+ };
649
+ this.spreadsheetWidget.executeCommand({ command: 'SortCommand', options });
650
+ }
651
+ /**
652
+ * @hidden
653
+ */
654
+ closePopup() {
655
+ if (this.popupRef) {
656
+ this.popupRef.close();
657
+ this.popupRef = null;
658
+ }
659
+ if (this.popupPositionChangeSub) {
660
+ this.popupPositionChangeSub.unsubscribe();
661
+ this.popupPositionChangeSub = null;
662
+ }
663
+ }
489
664
  onChange = (e) => {
490
665
  hasObservers(this.change) && this.change.emit(e);
491
666
  this.spreadsheetService.selectionChanged.next(e.range);
492
667
  };
493
668
  onSelectionChange = (e) => {
669
+ this.closePopup();
494
670
  hasObservers(this.selectionChange) && this.selectionChange.emit(e);
495
671
  this.spreadsheetService.selectionChanged.next(e.range);
496
672
  };
@@ -526,6 +702,25 @@ export class SpreadsheetComponent {
526
702
  this.updateActiveSheet(this.spreadsheetService.activeSheet);
527
703
  });
528
704
  }
705
+ onClipboardEvent(event, type) {
706
+ if (hasObservers(this.clipboard)) {
707
+ this.ngZone.runOutsideAngular(() => {
708
+ setTimeout(() => {
709
+ const { preventDefault, isDefaultPrevented, clipboardContent, range, sender } = event;
710
+ const workbookClipboardContent = clipboardContent || this.spreadsheetWidget.workbook._clipboard._internalContent;
711
+ const eventArgs = {
712
+ type,
713
+ clipboardContent: { data: workbookClipboardContent.data, mergedCells: workbookClipboardContent.mergedCells },
714
+ range,
715
+ sender,
716
+ preventDefault: preventDefault.bind(event),
717
+ isDefaultPrevented: isDefaultPrevented.bind(event)
718
+ };
719
+ this.ngZone.run(() => this.clipboard.emit(eventArgs));
720
+ });
721
+ });
722
+ }
723
+ }
529
724
  get options() {
530
725
  return {
531
726
  activeSheet: this.activeSheet,
@@ -551,12 +746,17 @@ export class SpreadsheetComponent {
551
746
  formulaCellInputRef: { current: this.formulaCellInputRef.current },
552
747
  nameBoxRef: { current: this.nameBoxRef.current },
553
748
  getIconHTMLString: (options) => {
749
+ if (typeof options === 'string' && options === 'k-i-caret-alt-down') {
750
+ //the caret-alt-down filter button icon has different config coming from the common package and has to be handled separately
751
+ options = { iconName: 'caret-alt-down', svgIcon: caretAltDownIcon };
752
+ }
554
753
  const iconWrapper = this.container.createComponent(IconWrapperComponent);
555
754
  iconWrapper.instance.name = options.iconName;
556
755
  iconWrapper.instance.svgIcon = options.svgIcon;
557
756
  iconWrapper.changeDetectorRef.detectChanges();
558
757
  return iconWrapper.instance.element.nativeElement;
559
- }
758
+ },
759
+ createFilterMenu: this.createFilterMenu.bind(this)
560
760
  };
561
761
  }
562
762
  contextMenuItemsForTarget(target, unhide, unmerge) {
@@ -731,8 +931,7 @@ export class SpreadsheetComponent {
731
931
  registerEditor('_validation_list', () => {
732
932
  return {
733
933
  edit: (options) => {
734
- this.popupRef?.close();
735
- this.popupRef = null;
934
+ this.closePopup();
736
935
  this.popupRef = this.popupService.open({
737
936
  anchor: options.view.element.querySelector('.k-spreadsheet-editor-button'),
738
937
  content: ListEditorComponent,
@@ -742,16 +941,14 @@ export class SpreadsheetComponent {
742
941
  });
743
942
  const list = this.popupRef.content.instance;
744
943
  list.itemSelect.subscribe((item) => {
745
- this.popupRef.close();
746
- this.popupRef = null;
944
+ this.closePopup();
747
945
  const itemValue = item.value;
748
946
  if (isPresent(itemValue)) {
749
947
  options.callback(itemValue);
750
948
  }
751
949
  });
752
950
  list.close.subscribe(() => {
753
- this.popupRef.close();
754
- this.popupRef = null;
951
+ this.closePopup();
755
952
  });
756
953
  const items = options.validation.from.value;
757
954
  const data = [];
@@ -770,8 +967,7 @@ export class SpreadsheetComponent {
770
967
  registerEditor('_validation_date', () => {
771
968
  return {
772
969
  edit: (options) => {
773
- this.popupRef?.close();
774
- this.popupRef = null;
970
+ this.closePopup();
775
971
  this.popupRef = this.popupService.open({
776
972
  anchor: options.view.element.querySelector('.k-spreadsheet-editor-button'),
777
973
  content: CalendarComponent,
@@ -780,8 +976,7 @@ export class SpreadsheetComponent {
780
976
  });
781
977
  const calendar = this.popupRef.content.instance;
782
978
  calendar.valueChange.subscribe((value) => {
783
- this.popupRef.close();
784
- this.popupRef = null;
979
+ this.closePopup();
785
980
  if (!options.range.format()) {
786
981
  options.range.format('yyyy-mm-dd');
787
982
  }
@@ -880,12 +1075,6 @@ export class SpreadsheetComponent {
880
1075
  });
881
1076
  });
882
1077
  }
883
- closePopup() {
884
- if (this.popupRef) {
885
- this.popupRef.close();
886
- this.popupRef = null;
887
- }
888
- }
889
1078
  isValidFormula(validation) {
890
1079
  const formula = calc.runtime.Formula;
891
1080
  return validation instanceof formula && rowAndColPresent(validation.value);
@@ -893,8 +1082,196 @@ export class SpreadsheetComponent {
893
1082
  createDate(validation, sheet) {
894
1083
  return new Date(serialToDate(isPresent(sheet) ? sheet.range(validation.value.row, validation.value.col).value() : validation));
895
1084
  }
896
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpreadsheetComponent, deps: [{ token: i0.NgZone }, { token: i1.IntlService }, { token: i0.ElementRef }, { token: i2.LocalizationService }, { token: i3.SpreadsheetService }, { token: i4.SpreadsheetToolsService }, { token: i5.ErrorHandlingService }, { token: i6.DialogService }, { token: i7.PopupService }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component });
897
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SpreadsheetComponent, isStandalone: true, selector: "kendo-spreadsheet", inputs: { menuItems: "menuItems", overflow: "overflow", formulaListMaxHeight: "formulaListMaxHeight", activeSheet: "activeSheet", sheets: "sheets", columns: "columns", columnWidth: "columnWidth", defaultCellStyle: "defaultCellStyle", headerHeight: "headerHeight", headerWidth: "headerWidth", rowHeight: "rowHeight", rows: "rows", cellEditors: "cellEditors", images: "images", excel: "excel" }, outputs: { change: "change", formatChange: "formatChange", selectionChange: "selectionChange", excelExport: "excelExport", excelImport: "excelImport", activeSheetChange: "activeSheetChange" }, host: { properties: { "class.k-spreadsheet": "this.hostClass", "attr.role": "this.role" } }, providers: [
1085
+ createFilterMenu(options) {
1086
+ this.closePopup();
1087
+ this.currentFilterOptions = options;
1088
+ if (this.filterMenuOpened) {
1089
+ this.filterMenuOpened = false;
1090
+ return {
1091
+ bind: () => { },
1092
+ openFor: () => { },
1093
+ close: () => { },
1094
+ destroy: () => { }
1095
+ };
1096
+ }
1097
+ this.ngZone.onStable.pipe(take(1)).subscribe(() => {
1098
+ const childItems = this.extractColumnFilterValues(options.range, options.column);
1099
+ const parentItem = {
1100
+ text: this.messageFor('filterMenuAll'),
1101
+ value: null,
1102
+ checked: childItems.every(i => i.checked),
1103
+ items: childItems
1104
+ };
1105
+ this.rangeFilterValuesList = [parentItem];
1106
+ this.checkedKeys = [parentItem, ...childItems].filter(i => i.checked).map(i => i.text);
1107
+ });
1108
+ this.filterConditionsList = [
1109
+ { type: 'none', comparerType: 'none', comparer: 'none', text: this.messageFor('filterNoneOperator') },
1110
+ { type: 'string', comparerType: 'string_contains', comparer: 'contains', text: this.messageFor('filterContainsOperator') },
1111
+ { type: 'string', comparerType: 'string_doesnotcontain', comparer: 'doesnotcontain', text: this.messageFor('filterNotContainsOperator') },
1112
+ { type: 'string', comparerType: 'string_startswith', comparer: 'startswith', text: this.messageFor('filterStartsWithOperator') },
1113
+ { type: 'string', comparerType: 'string_endswith', comparer: 'endswith', text: this.messageFor('filterEndsWithOperator') },
1114
+ { type: 'string', comparerType: 'string_matches', comparer: 'eq', text: this.messageFor('filterMatchesOperator') },
1115
+ { type: 'string', comparerType: 'string_doesnotmatch', comparer: 'neq', text: this.messageFor('filterNotMatchesOperator') },
1116
+ { type: 'date', comparerType: 'date_eq', comparer: 'eq', text: this.messageFor('filterDateEqOperator') },
1117
+ { type: 'date', comparerType: 'date_neq', comparer: 'neq', text: this.messageFor('filterDateNotEqOperator') },
1118
+ { type: 'date', comparerType: 'date_lt', comparer: 'lt', text: this.messageFor('filterBeforeOperator') },
1119
+ { type: 'date', comparerType: 'date_gt', comparer: 'gt', text: this.messageFor('filterAfterOperator') },
1120
+ { type: 'number', comparerType: 'number_eq', comparer: 'eq', text: this.messageFor('filterEqOperator') },
1121
+ { type: 'number', comparerType: 'number_neq', comparer: 'neq', text: this.messageFor('filterNotEqOperator') },
1122
+ { type: 'number', comparerType: 'number_gte', comparer: 'gte', text: this.messageFor('filterGteOperator') },
1123
+ { type: 'number', comparerType: 'number_gt', comparer: 'gt', text: this.messageFor('filterGtOperator') },
1124
+ { type: 'number', comparerType: 'number_lte', comparer: 'lte', text: this.messageFor('filterLteOperator') },
1125
+ { type: 'number', comparerType: 'number_lt', comparer: 'lt', text: this.messageFor('filterLtOperator') }
1126
+ ];
1127
+ const currentSheetFilter = this.spreadsheetWidget.activeSheet().filter();
1128
+ const columnFilter = currentSheetFilter?.columns?.find((col) => col.index === options.column);
1129
+ if (columnFilter) {
1130
+ const filter = columnFilter.filter.toJSON();
1131
+ if (filter.filter === 'custom') {
1132
+ const valueType = typeof filter.criteria[0].value === 'object' ? 'date' : typeof filter.criteria[0].value;
1133
+ this.selectedCondition = this.filterConditionsList.find(c => (c.comparer === filter?.criteria?.[0]?.operator) && (c.type === valueType));
1134
+ this.conditionValue = filter?.criteria?.[0]?.value;
1135
+ }
1136
+ else {
1137
+ this.checkedKeys = filter.values;
1138
+ }
1139
+ }
1140
+ else {
1141
+ this.selectedCondition = this.filterConditionsList[0];
1142
+ }
1143
+ return {
1144
+ bind: (_eventName, _handler) => { },
1145
+ openFor: (anchor) => {
1146
+ this.popupRef = this.popupService.open({
1147
+ anchor,
1148
+ content: this.filterMenuTemplate,
1149
+ popupAlign: { horizontal: 'left', vertical: 'top' },
1150
+ anchorAlign: { horizontal: 'left', vertical: 'bottom' },
1151
+ popupClass: 'k-spreadsheet-filter-menu k-column-menu k-group k-reset'
1152
+ });
1153
+ this.popupPositionChangeSub = this.popupRef.popupPositionChange.subscribe(({ offset }) => {
1154
+ if (offset.top === 0 && offset.left === 0) {
1155
+ this.closePopup();
1156
+ this.filterMenuOpened = false;
1157
+ }
1158
+ });
1159
+ this.filterMenuOpened = true;
1160
+ },
1161
+ close: () => { this.closePopup(); this.filterMenuOpened = false; },
1162
+ destroy: () => { this.closePopup(); this.filterMenuOpened = false; }
1163
+ };
1164
+ }
1165
+ extractColumnFilterValues(range, column) {
1166
+ const results = [];
1167
+ const sheet = range.sheet();
1168
+ const columnRange = range.column(column).resize({ top: 1 });
1169
+ const blanksMessage = this.localization.get('blankValues');
1170
+ columnRange.forEachCell((rowIndex, _colIndex, cellData) => {
1171
+ const isVisible = !sheet.isHiddenRow(rowIndex);
1172
+ let cellValue = cellData.value;
1173
+ const unformattedValue = cellValue;
1174
+ let displayText;
1175
+ let valueType;
1176
+ if (cellValue === undefined) {
1177
+ valueType = 'blank';
1178
+ }
1179
+ else if (cellData.format) {
1180
+ valueType = formatting.type(cellValue, cellData.format);
1181
+ }
1182
+ else {
1183
+ valueType = typeof cellValue;
1184
+ }
1185
+ if (cellValue !== null && cellData.format) {
1186
+ displayText = formatting.text(cellValue, cellData.format);
1187
+ }
1188
+ else {
1189
+ displayText = valueType === 'blank' ? blanksMessage : cellValue;
1190
+ }
1191
+ if (valueType === 'percent' || valueType === 'currency') {
1192
+ valueType = 'number';
1193
+ }
1194
+ if (valueType === 'date') {
1195
+ cellValue = serialToDate(cellValue);
1196
+ }
1197
+ results.push({
1198
+ dataType: valueType,
1199
+ value: cellValue,
1200
+ text: displayText,
1201
+ checked: isVisible,
1202
+ unformattedValue
1203
+ });
1204
+ });
1205
+ const uniqueValuesSorted = this.removeDuplicateValues(results).sort(this.compareFilterValues);
1206
+ return uniqueValuesSorted;
1207
+ }
1208
+ removeDuplicateValues(values) {
1209
+ const uniqueMap = new Map();
1210
+ for (const item of values) {
1211
+ const key = `${item.dataType}:${item.value}`;
1212
+ if (!uniqueMap.has(key)) {
1213
+ uniqueMap.set(key, item);
1214
+ }
1215
+ }
1216
+ return Array.from(uniqueMap.values());
1217
+ }
1218
+ compareFilterValues(a, b) {
1219
+ if (a.dataType === b.dataType) {
1220
+ switch (a.dataType) {
1221
+ case 'number':
1222
+ return a.value - b.value;
1223
+ case 'date':
1224
+ return a.value.getTime() - b.value.getTime();
1225
+ case 'blank':
1226
+ return 0;
1227
+ default:
1228
+ return String(a.value).localeCompare(String(b.value));
1229
+ }
1230
+ }
1231
+ if (a.dataType === 'blank')
1232
+ return -1;
1233
+ if (b.dataType === 'blank')
1234
+ return 1;
1235
+ if (a.dataType === 'number')
1236
+ return -1;
1237
+ if (b.dataType === 'number')
1238
+ return 1;
1239
+ if (a.dataType === 'date')
1240
+ return -1;
1241
+ if (b.dataType === 'date')
1242
+ return 1;
1243
+ return 0;
1244
+ }
1245
+ containsItem(item) {
1246
+ return this.checkedKeys.indexOf(item.text) > -1;
1247
+ }
1248
+ findItemByText(items, text) {
1249
+ for (const item of items) {
1250
+ if (item.text === text) {
1251
+ return item;
1252
+ }
1253
+ if (item.items && item.items.length > 0) {
1254
+ const found = this.findItemByText(item.items, text);
1255
+ if (found) {
1256
+ return found;
1257
+ }
1258
+ }
1259
+ }
1260
+ return null;
1261
+ }
1262
+ isIndeterminate(items = []) {
1263
+ let idx = 0;
1264
+ let item;
1265
+ while ((item = items[idx])) {
1266
+ if (this.isIndeterminate(item.items) || this.containsItem(item)) {
1267
+ return true;
1268
+ }
1269
+ idx += 1;
1270
+ }
1271
+ return false;
1272
+ }
1273
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpreadsheetComponent, deps: [{ token: i0.NgZone }, { token: i1.IntlService }, { token: i0.ElementRef }, { token: i2.LocalizationService }, { token: i3.SpreadsheetService }, { token: i4.SpreadsheetToolsService }, { token: i5.ErrorHandlingService }, { token: i6.DialogService }, { token: i7.PopupService }, { token: i0.ViewContainerRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
1274
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SpreadsheetComponent, isStandalone: true, selector: "kendo-spreadsheet", inputs: { menuItems: "menuItems", overflow: "overflow", formulaListMaxHeight: "formulaListMaxHeight", activeSheet: "activeSheet", sheets: "sheets", columns: "columns", columnWidth: "columnWidth", defaultCellStyle: "defaultCellStyle", headerHeight: "headerHeight", headerWidth: "headerWidth", rowHeight: "rowHeight", rows: "rows", cellEditors: "cellEditors", images: "images", excel: "excel" }, outputs: { change: "change", formatChange: "formatChange", selectionChange: "selectionChange", excelExport: "excelExport", excelImport: "excelImport", activeSheetChange: "activeSheetChange", clipboard: "clipboard" }, host: { properties: { "class.k-spreadsheet": "this.hostClass", "attr.role": "this.role" } }, providers: [
898
1275
  SpreadsheetLocalizationService,
899
1276
  SpreadsheetService,
900
1277
  {
@@ -908,7 +1285,7 @@ export class SpreadsheetComponent {
908
1285
  SpreadsheetToolsService,
909
1286
  PopupService,
910
1287
  ErrorHandlingService
911
- ], viewQueries: [{ propertyName: "formulaBarInputRef", first: true, predicate: ["formulaBar"], descendants: true, read: FormulaInputDirective }, { propertyName: "formulaCellInputRef", first: true, predicate: ["formulaCell"], descendants: true, read: FormulaInputDirective }, { propertyName: "nameBoxRef", first: true, predicate: ["nameBox"], descendants: true }, { propertyName: "dialogContainer", first: true, predicate: ["dialogContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "contextMenu", first: true, predicate: ["contextMenu"], descendants: true }], exportAs: ["kendo-spreadsheet"], usesOnChanges: true, ngImport: i0, template: `
1288
+ ], viewQueries: [{ propertyName: "formulaBarInputRef", first: true, predicate: ["formulaBar"], descendants: true, read: FormulaInputDirective }, { propertyName: "formulaCellInputRef", first: true, predicate: ["formulaCell"], descendants: true, read: FormulaInputDirective }, { propertyName: "nameBoxRef", first: true, predicate: ["nameBox"], descendants: true }, { propertyName: "dialogContainer", first: true, predicate: ["dialogContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "contextMenu", first: true, predicate: ["contextMenu"], descendants: true }, { propertyName: "filterMenuTemplate", first: true, predicate: ["filterMenuTemplate"], descendants: true }], exportAs: ["kendo-spreadsheet"], usesOnChanges: true, ngImport: i0, template: `
912
1289
  <ng-container
913
1290
  kendoSpreadsheetLocalizedMessages
914
1291
  i18n-background="kendo.spreadsheet.background|The title of the tool that changes the text background color."
@@ -1132,7 +1509,65 @@ export class SpreadsheetComponent {
1132
1509
  i18n-sheetMoveRight="kendo.spreadsheet.sheetMoveRight|The text of the Sheet menu Move Right option."
1133
1510
  sheetMoveRight="Move Right"
1134
1511
  i18n-invalidNameError="kendo.spreadsheet.invalidNameError|The content of the dialog that warns about invalid name input."
1135
- invalidNameError="{{ 'Invalid name: {inputValue}' }}">
1512
+ invalidNameError="{{ 'Invalid name: {inputValue}' }}"
1513
+ i18n-cantSortMixedCells="kendo.spreadsheet.cantSortMixedCells|The content of the dialog that warns about sorting range containing cells of mixed shapes."
1514
+ cantSortMixedCells="Cannot sort range containing cells of mixed shapes"
1515
+ i18n-cantSortNullRef="kendo.spreadsheet.cantSortNullRef|The content of the dialog that warns about sorting incorrect (empty) range."
1516
+ cantSortNullRef="Cannot sort empty selection"
1517
+ i18n-filterApply="kendo.spreadsheet.filterApply|The text of the **Apply** button in the filter menu."
1518
+ filterApply="Apply"
1519
+ i18n-filterClear="kendo.spreadsheet.filterClear|The text of the **Clear** button in the filter menu."
1520
+ filterClear="Clear"
1521
+ i18n-filterMenuAll="kendo.spreadsheet.filterMenuAll|The text of the **All** grouping item in the filter menu."
1522
+ filterMenuAll="All"
1523
+ i18n-blankValues="kendo.spreadsheet.blankValues|The text for the blank (empty) values."
1524
+ blankValues="Blank"
1525
+ i18n-filterNoneOperator="kendo.spreadsheet.filterNoneOperator|The text for the **none** filter operator."
1526
+ filterNoneOperator="None"
1527
+ i18n-filterContainsOperator="kendo.spreadsheet.filterContainsOperator|The text of the **contains** filter operator"
1528
+ filterContainsOperator="Text contains"
1529
+ i18n-filterNotContainsOperator="kendo.spreadsheet.filterNotContainsOperator|The text of the **does not contain** filter operator"
1530
+ filterNotContainsOperator="Text does not contain"
1531
+ i18n-filterStartsWithOperator="kendo.spreadsheet.filterStartsWithOperator|The text of the **starts with** filter operator"
1532
+ filterStartsWithOperator="Text starts with"
1533
+ i18n-filterEndsWithOperator="kendo.spreadsheet.filterEndsWithOperator|The text of the **ends with** filter operator"
1534
+ filterEndsWithOperator="Text ends with"
1535
+ i18n-filterMatchesOperator="kendo.spreadsheet.filterMatchesOperator|The text of the **matches** filter operator"
1536
+ filterMatchesOperator="Text matches"
1537
+ i18n-filterNotMatchesOperator="kendo.spreadsheet.filterNotMatchesOperator|The text of the **does not match** filter operator"
1538
+ filterNotMatchesOperator="Text does not match"
1539
+ i18n-filterDateEqOperator="kendo.spreadsheet.filterDateEqOperator|The text of the **Date is** filter operator"
1540
+ filterDateEqOperator="Date is"
1541
+ i18n-filterDateNotEqOperator="kendo.spreadsheet.filterDateNotEqOperator|The text of the **Date is not** filter operator"
1542
+ filterDateNotEqOperator="Date is not"
1543
+ i18n-filterBeforeOperator="kendo.spreadsheet.filterBeforeOperator|The text of the **Date is before** filter operator"
1544
+ filterBeforeOperator="Date is before"
1545
+ i18n-filterAfterOperator="kendo.spreadsheet.filterAfterOperator|The text of the **Date is after** filter operator"
1546
+ filterAfterOperator="Date is after"
1547
+ i18n-filterEqOperator="kendo.spreadsheet.filterEqOperator|Sets the text for the **Equal (Is equal to)** filter operator."
1548
+ filterEqOperator="Is equal to"
1549
+ i18n-filterNotEqOperator="kendo.spreadsheet.filterNotEqOperator|Sets the text for the **Not equal (Is not equal to)** filter operator."
1550
+ filterNotEqOperator="Is not equal to"
1551
+ i18n-filterGteOperator="kendo.spreadsheet.filterGteOperator|The text of the **greater than or equal to** filter operator"
1552
+ filterGteOperator="Is greater than or equal to"
1553
+ i18n-filterGtOperator="kendo.spreadsheet.filterGtOperator|The text of the **greater than** filter operator"
1554
+ filterGtOperator="Is greater than"
1555
+ i18n-filterLteOperator="kendo.spreadsheet.filterLteOperator|The text of the **less than or equal to** filter operator"
1556
+ filterLteOperator="Is less than or equal to"
1557
+ i18n-filterLtOperator="kendo.spreadsheet.filterLtOperator|The text of the **less than** filter operator"
1558
+ filterLtOperator="Is less than"
1559
+ i18n-filterMenuConditionItem="kendo.spreadsheet.filterMenuConditionItem|The text of the **Filter by condition** menu item."
1560
+ filterMenuConditionItem="Filter by condition"
1561
+ i18n-filterMenuValueItem="kendo.spreadsheet.filterMenuValueItem|The text of the **Filter by value** menu item."
1562
+ filterMenuValueItem="Filter by value"
1563
+ i18n-sort="kendo.spreadsheet.sort|The title of the Sort ToolBar tool."
1564
+ sort="Sort"
1565
+ i18n-sortAsc="kendo.spreadsheet.sortAsc|The text of the **Sort range A to Z** option."
1566
+ sortAsc="Sort range A to Z"
1567
+ i18n-sortDesc="kendo.spreadsheet.sortDesc|The text of the **Sort range Z to A** option."
1568
+ sortDesc="Sort range Z to A"
1569
+ i18n-unsort="kendo.spreadsheet.unsort|The text of the **Unsort** option."
1570
+ unsort="Unsort">
1136
1571
  </ng-container>
1137
1572
  <div class="k-spreadsheet-header">
1138
1573
  <kendo-menu kendoSpreadsheetMenu (select)="onMenuItemSelect($event)">
@@ -1227,6 +1662,10 @@ export class SpreadsheetComponent {
1227
1662
  class="k-spreadsheet-toolbar"
1228
1663
  [overflow]="overflow">
1229
1664
  <kendo-toolbar-button kendoSpreadsheetDataValidation></kendo-toolbar-button>
1665
+ <kendo-toolbar-separator></kendo-toolbar-separator>
1666
+ <kendo-toolbar-button kendoSpreadsheetFilter></kendo-toolbar-button>
1667
+ <kendo-toolbar-separator></kendo-toolbar-separator>
1668
+ <kendo-toolbar-dropdownbutton kendoSpreadsheetSort></kendo-toolbar-dropdownbutton>
1230
1669
  </kendo-toolbar>
1231
1670
  }
1232
1671
  </div>
@@ -1260,16 +1699,98 @@ export class SpreadsheetComponent {
1260
1699
  [sheetDescriptors]="sheets">
1261
1700
  </div>
1262
1701
  <ng-container #dialogContainer></ng-container>
1263
-
1264
- <kendo-contextmenu
1265
- #contextMenu
1702
+
1703
+ <kendo-contextmenu #contextMenu
1266
1704
  [items]="contextMenuItems"
1267
- (select)="onContextMenuSelect($event)"></kendo-contextmenu>
1705
+ (select)="onContextMenuSelect($event)">
1706
+ </kendo-contextmenu>
1268
1707
 
1708
+ <ng-template #filterMenuTemplate>
1709
+ <kendo-spreadsheet-filtermenu-item
1710
+ [innerMenuItems]="sortMenuItems"
1711
+ (itemClick)="onSortItemClick($event)">
1712
+ </kendo-spreadsheet-filtermenu-item>
1713
+ <kendo-spreadsheet-filtermenu-item
1714
+ [expandable]="true"
1715
+ [expanded]="conditionExpanded"
1716
+ expanderClass="k-spreadsheet-condition-filter"
1717
+ [innerMenuItems]="[{text: messageFor('filterMenuConditionItem')}]"
1718
+ (collapse)="onToggle(false, 'condition')"
1719
+ (expand)="onToggle(true, 'condition')">
1720
+ <ng-template kendoSpreadsheetFilterMenuItemContentTemplate>
1721
+ <div class="k-details-content">
1722
+ <kendo-dropdownlist
1723
+ [data]="filterConditionsList"
1724
+ textField="text"
1725
+ valueField="comparerType"
1726
+ [(value)]="selectedCondition">
1727
+ </kendo-dropdownlist>
1728
+ @if (selectedCondition?.type === 'string') {
1729
+ <kendo-textbox [(value)]="conditionValue"></kendo-textbox>
1730
+ } @else if (selectedCondition?.type === 'number') {
1731
+ <kendo-numerictextbox [(value)]="conditionValue"></kendo-numerictextbox>
1732
+ } @else if (selectedCondition?.type === 'date') {
1733
+ <kendo-datepicker [(value)]="conditionValue"></kendo-datepicker>
1734
+ }
1735
+ </div>
1736
+ <div class="k-actions k-actions-stretched k-actions-horizontal">
1737
+ <button
1738
+ kendoButton
1739
+ themeColor="primary"
1740
+ (click)="filterApply('condition')">
1741
+ {{ messageFor('filterApply') }}
1742
+ </button>
1743
+ <button
1744
+ kendoButton
1745
+ (click)="filterClear()">
1746
+ {{ messageFor('filterClear') }}
1747
+ </button>
1748
+ </div>
1749
+ </ng-template>
1750
+ </kendo-spreadsheet-filtermenu-item>
1751
+ <kendo-spreadsheet-filtermenu-item
1752
+ [expandable]="true"
1753
+ [expanded]="valueExpanded"
1754
+ [innerMenuItems]="[{text: messageFor('filterMenuValueItem')}]"
1755
+ (collapse)="onToggle(false, 'value')"
1756
+ (expand)="onToggle(true, 'value')">
1757
+ <ng-template kendoSpreadsheetFilterMenuItemContentTemplate>
1758
+ <div class="k-spreadsheet-value-treeview-wrapper">
1759
+ <kendo-treeview #treeview
1760
+ kendoTreeViewHierarchyBinding
1761
+ childrenField="items"
1762
+ textField="text"
1763
+ [nodes]="rangeFilterValuesList"
1764
+ kendoTreeViewExpandable
1765
+ [(expandedKeys)]="expandedKeys"
1766
+ [filterable]="true"
1767
+ [kendoTreeViewCheckable]="{checkOnClick: true}"
1768
+ [(checkedKeys)]="checkedKeys"
1769
+ checkBy="text"
1770
+ [isChecked]="isChecked">
1771
+ </kendo-treeview>
1772
+ </div>
1773
+ <div class="k-actions k-actions-stretched k-actions-horizontal">
1774
+ <button
1775
+ kendoButton
1776
+ themeColor="primary"
1777
+ (click)="filterApply('value')">
1778
+ {{ messageFor('filterApply') }}
1779
+ </button>
1780
+ <button
1781
+ kendoButton
1782
+ (click)="filterClear()">
1783
+ {{ messageFor('filterClear') }}
1784
+ </button>
1785
+ </div>
1786
+ </ng-template>
1787
+ </kendo-spreadsheet-filtermenu-item>
1788
+ </ng-template>
1789
+
1269
1790
  @if (showLicenseWatermark) {
1270
1791
  <div kendoWatermarkOverlay [licenseMessage]="licenseMessage"></div>
1271
1792
  }
1272
- `, isInline: true, dependencies: [{ kind: "directive", type: LocalizedMessagesDirective, selector: "[kendoSpreadsheetLocalizedMessages]" }, { kind: "component", type: MenuComponent, selector: "kendo-menu", inputs: ["appendTo", "menuItemTemplate", "ariaRole", "menuItemLinkTemplate"], outputs: ["select", "open", "close"], exportAs: ["kendoMenu"] }, { kind: "directive", type: MainMenuDirective, selector: "[kendoSpreadsheetMenu]" }, { kind: "component", type: MenuItemComponent, selector: "kendo-menu-item", inputs: ["text", "url", "disabled", "cssClass", "cssStyle", "icon", "svgIcon", "data", "separator"] }, { kind: "component", type: ToolBarComponent, selector: "kendo-toolbar", inputs: ["overflow", "resizable", "popupSettings", "fillMode", "tabindex", "size", "tabIndex", "showIcon", "showText"], outputs: ["open", "close"], exportAs: ["kendoToolBar"] }, { kind: "component", type: SpreadsheetLoadFileComponent, selector: "kendo-spreadsheet-load-file-tool" }, { kind: "component", type: ToolBarButtonComponent, selector: "kendo-toolbar-button", inputs: ["showText", "showIcon", "text", "style", "className", "title", "disabled", "toggleable", "look", "togglable", "selected", "fillMode", "rounded", "themeColor", "icon", "iconClass", "svgIcon", "imageUrl"], outputs: ["click", "pointerdown", "selectedChange"], exportAs: ["kendoToolBarButton"] }, { kind: "directive", type: SpreadsheetSaveFileDirective, selector: "[kendoSpreadsheetSaveFile]" }, { kind: "component", type: ToolBarButtonGroupComponent, selector: "kendo-toolbar-buttongroup", inputs: ["disabled", "fillMode", "selection", "width", "look"], exportAs: ["kendoToolBarButtonGroup"] }, { kind: "directive", type: SpreadsheetUndoDirective, selector: "kendo-toolbar-button[kendoSpreadsheetUndo]" }, { kind: "directive", type: SpreadsheetRedoDirective, selector: "kendo-toolbar-button[kendoSpreadsheetRedo]" }, { kind: "component", type: ToolBarSeparatorComponent, selector: "kendo-toolbar-separator", exportAs: ["kendoToolBarSeparator"] }, { kind: "component", type: SpreadsheetFontFamilyComponent, selector: "kendo-toolbar-dropdownlist[kendoSpreadsheetFontFamily]" }, { kind: "component", type: SpreadsheetFontSizeComponent, selector: "kendo-toolbar-dropdownlist[kendoSpreadsheetFontSize]" }, { kind: "directive", type: SpreadsheetIncreaseFontSizeDirective, selector: "kendo-toolbar-button[kendoSpreadsheetIncreaseFontSize]" }, { kind: "directive", type: SpreadsheetDecreaseFontSizeDirective, selector: "kendo-toolbar-button[kendoSpreadsheetDecreaseFontSize]" }, { kind: "directive", type: SpreadsheetBoldDirective, selector: "kendo-toolbar-button[kendoSpreadsheetBold]" }, { kind: "directive", type: SpreadsheetItalicDirective, selector: "kendo-toolbar-button[kendoSpreadsheetItalic]" }, { kind: "directive", type: SpreadsheetUnderlineDirective, selector: "kendo-toolbar-button[kendoSpreadsheetUnderline]" }, { kind: "component", type: SpreadsheetForeColorComponent, selector: "kendo-spreadsheet-forecolor-tool" }, { kind: "component", type: SpreadsheetBackColorComponent, selector: "kendo-spreadsheet-backcolor-tool" }, { kind: "component", type: ToolBarDropDownButtonComponent, selector: "kendo-toolbar-dropdownbutton", inputs: ["arrowIcon", "title", "showText", "showIcon", "text", "icon", "svgIcon", "iconClass", "imageUrl", "popupSettings", "look", "primary", "fillMode", "themeColor", "buttonClass", "textField", "disabled", "data"], outputs: ["itemClick", "open", "close"], exportAs: ["kendoToolBarDropDownButton"] }, { kind: "directive", type: SpreadsheetHorizontalTextAlignDirective, selector: "[kendoSpreadsheetHorizontalTextAlign]" }, { kind: "directive", type: SpreadsheetVerticalTextAlignDirective, selector: "[kendoSpreadsheetVerticalTextAlign]" }, { kind: "directive", type: SpreadsheetTextWrapDirective, selector: "kendo-toolbar-button[kendoSpreadsheetTextWrap]" }, { kind: "directive", type: SpreadsheetFormatDirective, selector: "[kendoSpreadsheetFormat]" }, { kind: "directive", type: SpreadsheetInsertLinkDirective, selector: "kendo-toolbar-button[kendoSpreadsheetInsertLink]" }, { kind: "directive", type: SpreadsheetAddColumnLeftButtonDirective, selector: "kendo-toolbar-button[kendoSpreadsheetAddColumnLeftButton]" }, { kind: "directive", type: SpreadsheetAddColumnRightButtonDirective, selector: "kendo-toolbar-button[kendoSpreadsheetAddColumnRightButton]" }, { kind: "directive", type: SpreadsheetAddRowBelowButtonDirective, selector: "kendo-toolbar-button[kendoSpreadsheetAddRowBelowButton]" }, { kind: "directive", type: SpreadsheetAddRowAboveButtonDirective, selector: "kendo-toolbar-button[kendoSpreadsheetAddRowAboveButton]" }, { kind: "directive", type: SpreadsheetDeleteColumnButtonDirective, selector: "kendo-toolbar-button[kendoSpreadsheetDeleteColumnButton]" }, { kind: "directive", type: SpreadsheetDeleteRowButtonDirective, selector: "kendo-toolbar-button[kendoSpreadsheetDeleteRowButton]" }, { kind: "directive", type: SpreadsheetDecreaseDecimalDirective, selector: "kendo-toolbar-button[kendoSpreadsheetDecreaseDecimal]" }, { kind: "directive", type: SpreadsheetIncreaseDecimalDirective, selector: "kendo-toolbar-button[kendoSpreadsheetIncreaseDecimal]" }, { kind: "directive", type: SpreadsheetMergeDirective, selector: "[kendoSpreadsheetMerge]" }, { kind: "directive", type: SpreadsheetGridLinesDirective, selector: "kendo-toolbar-button[kendoSpreadsheetGridLines]" }, { kind: "component", type: NameBoxComponent, selector: "[kendoSpreadsheetNameBox]", inputs: ["data", "spreadsheetWidget"] }, { kind: "component", type: IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }, { kind: "directive", type: FormulaInputDirective, selector: "[kendoSpreadsheetFormulaInput]", inputs: ["formulaListMaxHeight"] }, { kind: "component", type: SheetsBarComponent, selector: "[kendoSpreadsheetSheetsBar]", inputs: ["sheets", "sheetDescriptors"] }, { kind: "component", type: ContextMenuComponent, selector: "kendo-contextmenu", inputs: ["showOn", "target", "filter", "alignToAnchor", "vertical", "popupAnimate", "popupAlign", "anchorAlign", "collision", "appendTo", "ariaLabel"], outputs: ["popupOpen", "popupClose", "select", "open", "close"], exportAs: ["kendoContextMenu"] }, { kind: "component", type: WatermarkOverlayComponent, selector: "div[kendoWatermarkOverlay]", inputs: ["licenseMessage"] }, { kind: "directive", type: SpreadsheetDataValidationDirective, selector: "kendo-toolbar-button[kendoSpreadsheetDataValidation]" }] });
1793
+ `, isInline: true, dependencies: [{ kind: "directive", type: LocalizedMessagesDirective, selector: "[kendoSpreadsheetLocalizedMessages]" }, { kind: "component", type: MenuComponent, selector: "kendo-menu", inputs: ["appendTo", "menuItemTemplate", "ariaRole", "menuItemLinkTemplate"], outputs: ["select", "open", "close"], exportAs: ["kendoMenu"] }, { kind: "directive", type: MainMenuDirective, selector: "[kendoSpreadsheetMenu]" }, { kind: "component", type: MenuItemComponent, selector: "kendo-menu-item", inputs: ["text", "url", "disabled", "cssClass", "cssStyle", "icon", "svgIcon", "data", "separator"] }, { kind: "component", type: ToolBarComponent, selector: "kendo-toolbar", inputs: ["overflow", "resizable", "popupSettings", "fillMode", "tabindex", "size", "tabIndex", "showIcon", "showText"], outputs: ["open", "close"], exportAs: ["kendoToolBar"] }, { kind: "component", type: SpreadsheetLoadFileComponent, selector: "kendo-spreadsheet-load-file-tool" }, { kind: "component", type: ToolBarButtonComponent, selector: "kendo-toolbar-button", inputs: ["showText", "showIcon", "text", "style", "className", "title", "disabled", "toggleable", "look", "togglable", "selected", "fillMode", "rounded", "themeColor", "icon", "iconClass", "svgIcon", "imageUrl"], outputs: ["click", "pointerdown", "selectedChange"], exportAs: ["kendoToolBarButton"] }, { kind: "directive", type: SpreadsheetSaveFileDirective, selector: "[kendoSpreadsheetSaveFile]" }, { kind: "component", type: ToolBarButtonGroupComponent, selector: "kendo-toolbar-buttongroup", inputs: ["disabled", "fillMode", "selection", "width", "look"], exportAs: ["kendoToolBarButtonGroup"] }, { kind: "directive", type: SpreadsheetUndoDirective, selector: "kendo-toolbar-button[kendoSpreadsheetUndo]" }, { kind: "directive", type: SpreadsheetRedoDirective, selector: "kendo-toolbar-button[kendoSpreadsheetRedo]" }, { kind: "component", type: ToolBarSeparatorComponent, selector: "kendo-toolbar-separator", exportAs: ["kendoToolBarSeparator"] }, { kind: "component", type: SpreadsheetFontFamilyComponent, selector: "kendo-toolbar-dropdownlist[kendoSpreadsheetFontFamily]" }, { kind: "component", type: SpreadsheetFontSizeComponent, selector: "kendo-toolbar-dropdownlist[kendoSpreadsheetFontSize]" }, { kind: "directive", type: SpreadsheetIncreaseFontSizeDirective, selector: "kendo-toolbar-button[kendoSpreadsheetIncreaseFontSize]" }, { kind: "directive", type: SpreadsheetDecreaseFontSizeDirective, selector: "kendo-toolbar-button[kendoSpreadsheetDecreaseFontSize]" }, { kind: "directive", type: SpreadsheetBoldDirective, selector: "kendo-toolbar-button[kendoSpreadsheetBold]" }, { kind: "directive", type: SpreadsheetItalicDirective, selector: "kendo-toolbar-button[kendoSpreadsheetItalic]" }, { kind: "directive", type: SpreadsheetUnderlineDirective, selector: "kendo-toolbar-button[kendoSpreadsheetUnderline]" }, { kind: "component", type: SpreadsheetForeColorComponent, selector: "kendo-spreadsheet-forecolor-tool" }, { kind: "component", type: SpreadsheetBackColorComponent, selector: "kendo-spreadsheet-backcolor-tool" }, { kind: "component", type: ToolBarDropDownButtonComponent, selector: "kendo-toolbar-dropdownbutton", inputs: ["arrowIcon", "title", "showText", "showIcon", "text", "icon", "svgIcon", "iconClass", "imageUrl", "popupSettings", "look", "primary", "fillMode", "themeColor", "buttonClass", "textField", "disabled", "data"], outputs: ["itemClick", "open", "close"], exportAs: ["kendoToolBarDropDownButton"] }, { kind: "directive", type: SpreadsheetHorizontalTextAlignDirective, selector: "[kendoSpreadsheetHorizontalTextAlign]" }, { kind: "directive", type: SpreadsheetVerticalTextAlignDirective, selector: "[kendoSpreadsheetVerticalTextAlign]" }, { kind: "directive", type: SpreadsheetTextWrapDirective, selector: "kendo-toolbar-button[kendoSpreadsheetTextWrap]" }, { kind: "directive", type: SpreadsheetFormatDirective, selector: "[kendoSpreadsheetFormat]" }, { kind: "directive", type: SpreadsheetInsertLinkDirective, selector: "kendo-toolbar-button[kendoSpreadsheetInsertLink]" }, { kind: "directive", type: SpreadsheetAddColumnLeftButtonDirective, selector: "kendo-toolbar-button[kendoSpreadsheetAddColumnLeftButton]" }, { kind: "directive", type: SpreadsheetAddColumnRightButtonDirective, selector: "kendo-toolbar-button[kendoSpreadsheetAddColumnRightButton]" }, { kind: "directive", type: SpreadsheetAddRowBelowButtonDirective, selector: "kendo-toolbar-button[kendoSpreadsheetAddRowBelowButton]" }, { kind: "directive", type: SpreadsheetAddRowAboveButtonDirective, selector: "kendo-toolbar-button[kendoSpreadsheetAddRowAboveButton]" }, { kind: "directive", type: SpreadsheetDeleteColumnButtonDirective, selector: "kendo-toolbar-button[kendoSpreadsheetDeleteColumnButton]" }, { kind: "directive", type: SpreadsheetDeleteRowButtonDirective, selector: "kendo-toolbar-button[kendoSpreadsheetDeleteRowButton]" }, { kind: "directive", type: SpreadsheetDecreaseDecimalDirective, selector: "kendo-toolbar-button[kendoSpreadsheetDecreaseDecimal]" }, { kind: "directive", type: SpreadsheetIncreaseDecimalDirective, selector: "kendo-toolbar-button[kendoSpreadsheetIncreaseDecimal]" }, { kind: "directive", type: SpreadsheetMergeDirective, selector: "[kendoSpreadsheetMerge]" }, { kind: "directive", type: SpreadsheetGridLinesDirective, selector: "kendo-toolbar-button[kendoSpreadsheetGridLines]" }, { kind: "component", type: NameBoxComponent, selector: "[kendoSpreadsheetNameBox]", inputs: ["data", "spreadsheetWidget"] }, { kind: "component", type: IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }, { kind: "directive", type: FormulaInputDirective, selector: "[kendoSpreadsheetFormulaInput]", inputs: ["formulaListMaxHeight"] }, { kind: "component", type: SheetsBarComponent, selector: "[kendoSpreadsheetSheetsBar]", inputs: ["sheets", "sheetDescriptors"] }, { kind: "component", type: ContextMenuComponent, selector: "kendo-contextmenu", inputs: ["showOn", "target", "filter", "alignToAnchor", "vertical", "popupAnimate", "popupAlign", "anchorAlign", "collision", "appendTo", "ariaLabel"], outputs: ["popupOpen", "popupClose", "select", "open", "close"], exportAs: ["kendoContextMenu"] }, { kind: "component", type: WatermarkOverlayComponent, selector: "div[kendoWatermarkOverlay]", inputs: ["licenseMessage"] }, { kind: "directive", type: SpreadsheetDataValidationDirective, selector: "kendo-toolbar-button[kendoSpreadsheetDataValidation]" }, { kind: "directive", type: SpreadsheetFilterDirective, selector: "kendo-toolbar-button[kendoSpreadsheetFilter]" }, { kind: "component", type: SpreadsheetFilterMenuItemComponent, selector: "kendo-spreadsheet-filtermenu-item", inputs: ["text", "innerMenuItems", "icon", "expanderClass", "expandable", "svgIcon", "expanded"], outputs: ["itemClick", "expand", "collapse"] }, { kind: "directive", type: FilterMenuItemContentTemplateDirective, selector: "[kendoSpreadsheetFilterMenuItemContentTemplate]" }, { kind: "component", type: i8.TreeViewComponent, selector: "kendo-treeview", inputs: ["filterInputPlaceholder", "expandDisabledNodes", "animate", "nodeTemplate", "loadMoreButtonTemplate", "trackBy", "nodes", "textField", "hasChildren", "isChecked", "isDisabled", "hasCheckbox", "isExpanded", "isSelected", "isVisible", "navigable", "children", "loadOnDemand", "filterable", "filter", "size", "disableParentNodesOnly"], outputs: ["childrenLoaded", "blur", "focus", "expand", "collapse", "nodeDragStart", "nodeDrag", "filterStateChange", "nodeDrop", "nodeDragEnd", "addItem", "removeItem", "checkedChange", "selectionChange", "filterChange", "nodeClick", "nodeDblClick"], exportAs: ["kendoTreeView"] }, { kind: "directive", type: i8.CheckDirective, selector: "[kendoTreeViewCheckable]", inputs: ["isChecked", "checkBy", "checkedKeys", "kendoTreeViewCheckable"], outputs: ["checkedKeysChange"] }, { kind: "directive", type: i8.ExpandDirective, selector: "[kendoTreeViewExpandable]", inputs: ["isExpanded", "expandBy", "expandOnFilter", "expandedKeys"], outputs: ["expandedKeysChange"] }, { kind: "directive", type: i8.HierarchyBindingDirective, selector: "[kendoTreeViewHierarchyBinding]", inputs: ["childrenField", "nodes", "isVisible", "loadOnDemand"] }, { kind: "component", type: ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "component", type: DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["customIconClass", "showStickyHeader", "icon", "svgIcon", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "adaptiveTitle", "adaptiveSubtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "leftRightArrowsNavigation", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }, { kind: "ngmodule", type: InputsModule }, { kind: "component", type: i9.TextBoxComponent, selector: "kendo-textbox", inputs: ["focusableId", "title", "type", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "successIcon", "successSvgIcon", "errorIcon", "errorSvgIcon", "clearButtonIcon", "clearButtonSvgIcon", "size", "rounded", "fillMode", "tabIndex", "placeholder", "maxlength", "inputAttributes"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { kind: "component", type: i9.NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode", "inputAttributes"], outputs: ["valueChange", "focus", "blur", "inputFocus", "inputBlur"], exportAs: ["kendoNumericTextBox"] }, { kind: "component", type: DatePickerComponent, selector: "kendo-datepicker", inputs: ["focusableId", "cellTemplate", "clearButton", "inputAttributes", "monthCellTemplate", "yearCellTemplate", "decadeCellTemplate", "centuryCellTemplate", "weekNumberTemplate", "headerTitleTemplate", "headerTemplate", "footerTemplate", "footer", "navigationItemTemplate", "weekDaysFormat", "showOtherMonthDays", "activeView", "bottomView", "topView", "calendarType", "animateCalendarNavigation", "disabled", "readonly", "readOnlyInput", "popupSettings", "navigation", "min", "max", "incompleteDateValidation", "autoCorrectParts", "autoSwitchParts", "autoSwitchKeys", "enableMouseWheel", "allowCaretMode", "autoFill", "focusedDate", "value", "format", "twoDigitYearMax", "formatPlaceholder", "placeholder", "tabindex", "tabIndex", "disabledDates", "adaptiveTitle", "adaptiveSubtitle", "rangeValidation", "disabledDatesValidation", "weekNumber", "size", "rounded", "fillMode", "adaptiveMode"], outputs: ["valueChange", "focus", "blur", "open", "close", "escape"], exportAs: ["kendo-datepicker"] }, { kind: "directive", type: SpreadsheetSortDirective, selector: "[kendoSpreadsheetSort]" }] });
1273
1794
  }
1274
1795
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpreadsheetComponent, decorators: [{
1275
1796
  type: Component,
@@ -1515,7 +2036,65 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
1515
2036
  i18n-sheetMoveRight="kendo.spreadsheet.sheetMoveRight|The text of the Sheet menu Move Right option."
1516
2037
  sheetMoveRight="Move Right"
1517
2038
  i18n-invalidNameError="kendo.spreadsheet.invalidNameError|The content of the dialog that warns about invalid name input."
1518
- invalidNameError="{{ 'Invalid name: {inputValue}' }}">
2039
+ invalidNameError="{{ 'Invalid name: {inputValue}' }}"
2040
+ i18n-cantSortMixedCells="kendo.spreadsheet.cantSortMixedCells|The content of the dialog that warns about sorting range containing cells of mixed shapes."
2041
+ cantSortMixedCells="Cannot sort range containing cells of mixed shapes"
2042
+ i18n-cantSortNullRef="kendo.spreadsheet.cantSortNullRef|The content of the dialog that warns about sorting incorrect (empty) range."
2043
+ cantSortNullRef="Cannot sort empty selection"
2044
+ i18n-filterApply="kendo.spreadsheet.filterApply|The text of the **Apply** button in the filter menu."
2045
+ filterApply="Apply"
2046
+ i18n-filterClear="kendo.spreadsheet.filterClear|The text of the **Clear** button in the filter menu."
2047
+ filterClear="Clear"
2048
+ i18n-filterMenuAll="kendo.spreadsheet.filterMenuAll|The text of the **All** grouping item in the filter menu."
2049
+ filterMenuAll="All"
2050
+ i18n-blankValues="kendo.spreadsheet.blankValues|The text for the blank (empty) values."
2051
+ blankValues="Blank"
2052
+ i18n-filterNoneOperator="kendo.spreadsheet.filterNoneOperator|The text for the **none** filter operator."
2053
+ filterNoneOperator="None"
2054
+ i18n-filterContainsOperator="kendo.spreadsheet.filterContainsOperator|The text of the **contains** filter operator"
2055
+ filterContainsOperator="Text contains"
2056
+ i18n-filterNotContainsOperator="kendo.spreadsheet.filterNotContainsOperator|The text of the **does not contain** filter operator"
2057
+ filterNotContainsOperator="Text does not contain"
2058
+ i18n-filterStartsWithOperator="kendo.spreadsheet.filterStartsWithOperator|The text of the **starts with** filter operator"
2059
+ filterStartsWithOperator="Text starts with"
2060
+ i18n-filterEndsWithOperator="kendo.spreadsheet.filterEndsWithOperator|The text of the **ends with** filter operator"
2061
+ filterEndsWithOperator="Text ends with"
2062
+ i18n-filterMatchesOperator="kendo.spreadsheet.filterMatchesOperator|The text of the **matches** filter operator"
2063
+ filterMatchesOperator="Text matches"
2064
+ i18n-filterNotMatchesOperator="kendo.spreadsheet.filterNotMatchesOperator|The text of the **does not match** filter operator"
2065
+ filterNotMatchesOperator="Text does not match"
2066
+ i18n-filterDateEqOperator="kendo.spreadsheet.filterDateEqOperator|The text of the **Date is** filter operator"
2067
+ filterDateEqOperator="Date is"
2068
+ i18n-filterDateNotEqOperator="kendo.spreadsheet.filterDateNotEqOperator|The text of the **Date is not** filter operator"
2069
+ filterDateNotEqOperator="Date is not"
2070
+ i18n-filterBeforeOperator="kendo.spreadsheet.filterBeforeOperator|The text of the **Date is before** filter operator"
2071
+ filterBeforeOperator="Date is before"
2072
+ i18n-filterAfterOperator="kendo.spreadsheet.filterAfterOperator|The text of the **Date is after** filter operator"
2073
+ filterAfterOperator="Date is after"
2074
+ i18n-filterEqOperator="kendo.spreadsheet.filterEqOperator|Sets the text for the **Equal (Is equal to)** filter operator."
2075
+ filterEqOperator="Is equal to"
2076
+ i18n-filterNotEqOperator="kendo.spreadsheet.filterNotEqOperator|Sets the text for the **Not equal (Is not equal to)** filter operator."
2077
+ filterNotEqOperator="Is not equal to"
2078
+ i18n-filterGteOperator="kendo.spreadsheet.filterGteOperator|The text of the **greater than or equal to** filter operator"
2079
+ filterGteOperator="Is greater than or equal to"
2080
+ i18n-filterGtOperator="kendo.spreadsheet.filterGtOperator|The text of the **greater than** filter operator"
2081
+ filterGtOperator="Is greater than"
2082
+ i18n-filterLteOperator="kendo.spreadsheet.filterLteOperator|The text of the **less than or equal to** filter operator"
2083
+ filterLteOperator="Is less than or equal to"
2084
+ i18n-filterLtOperator="kendo.spreadsheet.filterLtOperator|The text of the **less than** filter operator"
2085
+ filterLtOperator="Is less than"
2086
+ i18n-filterMenuConditionItem="kendo.spreadsheet.filterMenuConditionItem|The text of the **Filter by condition** menu item."
2087
+ filterMenuConditionItem="Filter by condition"
2088
+ i18n-filterMenuValueItem="kendo.spreadsheet.filterMenuValueItem|The text of the **Filter by value** menu item."
2089
+ filterMenuValueItem="Filter by value"
2090
+ i18n-sort="kendo.spreadsheet.sort|The title of the Sort ToolBar tool."
2091
+ sort="Sort"
2092
+ i18n-sortAsc="kendo.spreadsheet.sortAsc|The text of the **Sort range A to Z** option."
2093
+ sortAsc="Sort range A to Z"
2094
+ i18n-sortDesc="kendo.spreadsheet.sortDesc|The text of the **Sort range Z to A** option."
2095
+ sortDesc="Sort range Z to A"
2096
+ i18n-unsort="kendo.spreadsheet.unsort|The text of the **Unsort** option."
2097
+ unsort="Unsort">
1519
2098
  </ng-container>
1520
2099
  <div class="k-spreadsheet-header">
1521
2100
  <kendo-menu kendoSpreadsheetMenu (select)="onMenuItemSelect($event)">
@@ -1610,6 +2189,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
1610
2189
  class="k-spreadsheet-toolbar"
1611
2190
  [overflow]="overflow">
1612
2191
  <kendo-toolbar-button kendoSpreadsheetDataValidation></kendo-toolbar-button>
2192
+ <kendo-toolbar-separator></kendo-toolbar-separator>
2193
+ <kendo-toolbar-button kendoSpreadsheetFilter></kendo-toolbar-button>
2194
+ <kendo-toolbar-separator></kendo-toolbar-separator>
2195
+ <kendo-toolbar-dropdownbutton kendoSpreadsheetSort></kendo-toolbar-dropdownbutton>
1613
2196
  </kendo-toolbar>
1614
2197
  }
1615
2198
  </div>
@@ -1643,20 +2226,102 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
1643
2226
  [sheetDescriptors]="sheets">
1644
2227
  </div>
1645
2228
  <ng-container #dialogContainer></ng-container>
1646
-
1647
- <kendo-contextmenu
1648
- #contextMenu
2229
+
2230
+ <kendo-contextmenu #contextMenu
1649
2231
  [items]="contextMenuItems"
1650
- (select)="onContextMenuSelect($event)"></kendo-contextmenu>
2232
+ (select)="onContextMenuSelect($event)">
2233
+ </kendo-contextmenu>
1651
2234
 
2235
+ <ng-template #filterMenuTemplate>
2236
+ <kendo-spreadsheet-filtermenu-item
2237
+ [innerMenuItems]="sortMenuItems"
2238
+ (itemClick)="onSortItemClick($event)">
2239
+ </kendo-spreadsheet-filtermenu-item>
2240
+ <kendo-spreadsheet-filtermenu-item
2241
+ [expandable]="true"
2242
+ [expanded]="conditionExpanded"
2243
+ expanderClass="k-spreadsheet-condition-filter"
2244
+ [innerMenuItems]="[{text: messageFor('filterMenuConditionItem')}]"
2245
+ (collapse)="onToggle(false, 'condition')"
2246
+ (expand)="onToggle(true, 'condition')">
2247
+ <ng-template kendoSpreadsheetFilterMenuItemContentTemplate>
2248
+ <div class="k-details-content">
2249
+ <kendo-dropdownlist
2250
+ [data]="filterConditionsList"
2251
+ textField="text"
2252
+ valueField="comparerType"
2253
+ [(value)]="selectedCondition">
2254
+ </kendo-dropdownlist>
2255
+ @if (selectedCondition?.type === 'string') {
2256
+ <kendo-textbox [(value)]="conditionValue"></kendo-textbox>
2257
+ } @else if (selectedCondition?.type === 'number') {
2258
+ <kendo-numerictextbox [(value)]="conditionValue"></kendo-numerictextbox>
2259
+ } @else if (selectedCondition?.type === 'date') {
2260
+ <kendo-datepicker [(value)]="conditionValue"></kendo-datepicker>
2261
+ }
2262
+ </div>
2263
+ <div class="k-actions k-actions-stretched k-actions-horizontal">
2264
+ <button
2265
+ kendoButton
2266
+ themeColor="primary"
2267
+ (click)="filterApply('condition')">
2268
+ {{ messageFor('filterApply') }}
2269
+ </button>
2270
+ <button
2271
+ kendoButton
2272
+ (click)="filterClear()">
2273
+ {{ messageFor('filterClear') }}
2274
+ </button>
2275
+ </div>
2276
+ </ng-template>
2277
+ </kendo-spreadsheet-filtermenu-item>
2278
+ <kendo-spreadsheet-filtermenu-item
2279
+ [expandable]="true"
2280
+ [expanded]="valueExpanded"
2281
+ [innerMenuItems]="[{text: messageFor('filterMenuValueItem')}]"
2282
+ (collapse)="onToggle(false, 'value')"
2283
+ (expand)="onToggle(true, 'value')">
2284
+ <ng-template kendoSpreadsheetFilterMenuItemContentTemplate>
2285
+ <div class="k-spreadsheet-value-treeview-wrapper">
2286
+ <kendo-treeview #treeview
2287
+ kendoTreeViewHierarchyBinding
2288
+ childrenField="items"
2289
+ textField="text"
2290
+ [nodes]="rangeFilterValuesList"
2291
+ kendoTreeViewExpandable
2292
+ [(expandedKeys)]="expandedKeys"
2293
+ [filterable]="true"
2294
+ [kendoTreeViewCheckable]="{checkOnClick: true}"
2295
+ [(checkedKeys)]="checkedKeys"
2296
+ checkBy="text"
2297
+ [isChecked]="isChecked">
2298
+ </kendo-treeview>
2299
+ </div>
2300
+ <div class="k-actions k-actions-stretched k-actions-horizontal">
2301
+ <button
2302
+ kendoButton
2303
+ themeColor="primary"
2304
+ (click)="filterApply('value')">
2305
+ {{ messageFor('filterApply') }}
2306
+ </button>
2307
+ <button
2308
+ kendoButton
2309
+ (click)="filterClear()">
2310
+ {{ messageFor('filterClear') }}
2311
+ </button>
2312
+ </div>
2313
+ </ng-template>
2314
+ </kendo-spreadsheet-filtermenu-item>
2315
+ </ng-template>
2316
+
1652
2317
  @if (showLicenseWatermark) {
1653
2318
  <div kendoWatermarkOverlay [licenseMessage]="licenseMessage"></div>
1654
2319
  }
1655
2320
  `,
1656
2321
  standalone: true,
1657
- imports: [LocalizedMessagesDirective, MenuComponent, MainMenuDirective, MenuItemComponent, ToolBarComponent, SpreadsheetLoadFileComponent, ToolBarButtonComponent, SpreadsheetSaveFileDirective, ToolBarButtonGroupComponent, SpreadsheetUndoDirective, SpreadsheetRedoDirective, ToolBarSeparatorComponent, SpreadsheetFontFamilyComponent, SpreadsheetFontSizeComponent, SpreadsheetIncreaseFontSizeDirective, SpreadsheetDecreaseFontSizeDirective, SpreadsheetBoldDirective, SpreadsheetItalicDirective, SpreadsheetUnderlineDirective, SpreadsheetForeColorComponent, SpreadsheetBackColorComponent, ToolBarDropDownButtonComponent, SpreadsheetHorizontalTextAlignDirective, SpreadsheetVerticalTextAlignDirective, SpreadsheetTextWrapDirective, SpreadsheetFormatDirective, SpreadsheetInsertLinkDirective, SpreadsheetAddColumnLeftButtonDirective, SpreadsheetAddColumnRightButtonDirective, SpreadsheetAddRowBelowButtonDirective, SpreadsheetAddRowAboveButtonDirective, SpreadsheetDeleteColumnButtonDirective, SpreadsheetDeleteRowButtonDirective, SpreadsheetDecreaseDecimalDirective, SpreadsheetIncreaseDecimalDirective, SpreadsheetMergeDirective, SpreadsheetGridLinesDirective, NameBoxComponent, IconWrapperComponent, FormulaInputDirective, SheetsBarComponent, ContextMenuComponent, WatermarkOverlayComponent, SpreadsheetDataValidationDirective]
2322
+ imports: [LocalizedMessagesDirective, MenuComponent, MainMenuDirective, MenuItemComponent, ToolBarComponent, SpreadsheetLoadFileComponent, ToolBarButtonComponent, SpreadsheetSaveFileDirective, ToolBarButtonGroupComponent, SpreadsheetUndoDirective, SpreadsheetRedoDirective, ToolBarSeparatorComponent, SpreadsheetFontFamilyComponent, SpreadsheetFontSizeComponent, SpreadsheetIncreaseFontSizeDirective, SpreadsheetDecreaseFontSizeDirective, SpreadsheetBoldDirective, SpreadsheetItalicDirective, SpreadsheetUnderlineDirective, SpreadsheetForeColorComponent, SpreadsheetBackColorComponent, ToolBarDropDownButtonComponent, SpreadsheetHorizontalTextAlignDirective, SpreadsheetVerticalTextAlignDirective, SpreadsheetTextWrapDirective, SpreadsheetFormatDirective, SpreadsheetInsertLinkDirective, SpreadsheetAddColumnLeftButtonDirective, SpreadsheetAddColumnRightButtonDirective, SpreadsheetAddRowBelowButtonDirective, SpreadsheetAddRowAboveButtonDirective, SpreadsheetDeleteColumnButtonDirective, SpreadsheetDeleteRowButtonDirective, SpreadsheetDecreaseDecimalDirective, SpreadsheetIncreaseDecimalDirective, SpreadsheetMergeDirective, SpreadsheetGridLinesDirective, NameBoxComponent, IconWrapperComponent, FormulaInputDirective, SheetsBarComponent, ContextMenuComponent, WatermarkOverlayComponent, SpreadsheetDataValidationDirective, SpreadsheetFilterDirective, SpreadsheetFilterMenuItemComponent, FilterMenuItemContentTemplateDirective, KENDO_TREEVIEW, ButtonComponent, DropDownListComponent, InputsModule, DatePickerComponent, SpreadsheetSortDirective]
1658
2323
  }]
1659
- }], ctorParameters: () => [{ type: i0.NgZone }, { type: i1.IntlService }, { type: i0.ElementRef }, { type: i2.LocalizationService }, { type: i3.SpreadsheetService }, { type: i4.SpreadsheetToolsService }, { type: i5.ErrorHandlingService }, { type: i6.DialogService }, { type: i7.PopupService }, { type: i0.ViewContainerRef }], propDecorators: { formulaBarInputRef: [{
2324
+ }], ctorParameters: () => [{ type: i0.NgZone }, { type: i1.IntlService }, { type: i0.ElementRef }, { type: i2.LocalizationService }, { type: i3.SpreadsheetService }, { type: i4.SpreadsheetToolsService }, { type: i5.ErrorHandlingService }, { type: i6.DialogService }, { type: i7.PopupService }, { type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }], propDecorators: { formulaBarInputRef: [{
1660
2325
  type: ViewChild,
1661
2326
  args: ['formulaBar', { read: FormulaInputDirective }]
1662
2327
  }], formulaCellInputRef: [{
@@ -1671,6 +2336,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
1671
2336
  }], contextMenu: [{
1672
2337
  type: ViewChild,
1673
2338
  args: ['contextMenu']
2339
+ }], filterMenuTemplate: [{
2340
+ type: ViewChild,
2341
+ args: ['filterMenuTemplate']
1674
2342
  }], hostClass: [{
1675
2343
  type: HostBinding,
1676
2344
  args: ['class.k-spreadsheet']
@@ -1719,4 +2387,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
1719
2387
  type: Output
1720
2388
  }], activeSheetChange: [{
1721
2389
  type: Output
2390
+ }], clipboard: [{
2391
+ type: Output
1722
2392
  }] } });