@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
@@ -3,37 +3,41 @@
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  import * as i0 from '@angular/core';
6
- import { Injectable, EventEmitter, Output, Inject, Optional, Component, Input, Directive, HostBinding, ElementRef, ViewChild, ViewChildren, HostListener, InjectionToken, forwardRef, ViewContainerRef, NgModule } from '@angular/core';
6
+ import { Injectable, EventEmitter, Output, Inject, Optional, Component, Input, Directive, HostBinding, ElementRef, ViewChild, ViewChildren, HostListener, InjectionToken, forwardRef, ContentChild, ViewContainerRef, NgModule } from '@angular/core';
7
7
  import { Subject, Subscription } from 'rxjs';
8
8
  import { take, map } from 'rxjs/operators';
9
9
  import { validatePackage } from '@progress/kendo-licensing';
10
- import { SpreadsheetWidget, registerEditor, Matrix, dateToSerial, validation, calc, serialToDate } from '@progress/kendo-spreadsheet-common';
10
+ import { SpreadsheetWidget, registerEditor, Matrix, dateToSerial, validation, calc, serialToDate, formatting } from '@progress/kendo-spreadsheet-common';
11
11
  export { CellRef, Context, Deferred, Matrix, Range, RangeRef, Ref, Sheet, SpreadsheetWidget, View, Workbook, defineFunction } from '@progress/kendo-spreadsheet-common';
12
12
  import * as i1$4 from '@progress/kendo-angular-intl';
13
13
  import { localeData } from '@progress/kendo-angular-intl';
14
- import { formulaFxIcon, trashIcon, copyIcon, pencilIcon, eyeSlashIcon, arrowRightIcon, arrowLeftIcon, alignCenterIcon, alignJustifyIcon, alignLeftIcon, alignRightIcon, alignTopIcon, alignMiddleIcon, alignBottomIcon, dropletIcon, boldIcon, foregroundColorIcon, italicIcon, arrowRotateCwIcon, underlineIcon, arrowRotateCcwIcon, textWrapIcon, tableColumnInsertLeftIcon, tableColumnInsertRightIcon, tableRowInsertAboveIcon, tableRowInsertBelowIcon, tableRowDeleteIcon, tableColumnDeleteIcon, bordersNoneIcon, folderOpenIcon, downloadIcon, customFormatIcon, fontSizeIcon, fontFamilyIcon, cellsMergeIcon, cellsMergeHorizontallyIcon, cellsMergeVerticallyIcon, tableUnmergeIcon, linkIcon, fontGrowIcon, fontShrinkIcon, decimalDecreaseIcon, exclamationCircleIcon, decimalIncreaseIcon, cutIcon, clipboardIcon, eyeIcon, plusIcon, menuIcon, caretAltDownIcon, calendarIcon } from '@progress/kendo-svg-icons';
14
+ import { formulaFxIcon, trashIcon, copyIcon, pencilIcon, eyeSlashIcon, arrowRightIcon, arrowLeftIcon, alignCenterIcon, alignJustifyIcon, alignLeftIcon, alignRightIcon, alignTopIcon, alignMiddleIcon, alignBottomIcon, dropletIcon, boldIcon, foregroundColorIcon, italicIcon, arrowRotateCwIcon, underlineIcon, arrowRotateCcwIcon, textWrapIcon, tableColumnInsertLeftIcon, tableColumnInsertRightIcon, tableRowInsertAboveIcon, tableRowInsertBelowIcon, tableRowDeleteIcon, tableColumnDeleteIcon, bordersNoneIcon, folderOpenIcon, downloadIcon, customFormatIcon, fontSizeIcon, fontFamilyIcon, cellsMergeIcon, cellsMergeHorizontallyIcon, cellsMergeVerticallyIcon, tableUnmergeIcon, linkIcon, fontGrowIcon, fontShrinkIcon, decimalDecreaseIcon, exclamationCircleIcon, decimalIncreaseIcon, cutIcon, clipboardIcon, eyeIcon, filterIcon, sortAscIcon, sortDescIcon, sortClearIcon, plusIcon, menuIcon, caretAltDownIcon, chevronUpIcon, chevronDownIcon, searchIcon, sortAscSmallIcon, sortDescSmallIcon, calendarIcon } from '@progress/kendo-svg-icons';
15
15
  import * as i1 from '@progress/kendo-angular-l10n';
16
16
  import { LocalizationService, L10N_PREFIX, RTL, ComponentMessages } from '@progress/kendo-angular-l10n';
17
17
  import * as i1$1 from '@progress/kendo-angular-popup';
18
18
  import { PopupService } from '@progress/kendo-angular-popup';
19
19
  import { MenuComponent, MenuItemComponent, ContextMenuComponent } from '@progress/kendo-angular-menu';
20
- import { EventsOutsideAngularDirective, replaceMessagePlaceholder, isDocumentAvailable, isPresent, normalizeKeys, Keys, hasObservers, getLicenseMessage, shouldShowValidationUI, WatermarkOverlayComponent, ResizeBatchService } from '@progress/kendo-angular-common';
20
+ import { EventsOutsideAngularDirective, replaceMessagePlaceholder, isDocumentAvailable, isPresent, normalizeKeys, Keys, hasObservers, guid, getLicenseMessage, shouldShowValidationUI, WatermarkOverlayComponent, ResizeBatchService } from '@progress/kendo-angular-common';
21
21
  import * as i1$2 from '@progress/kendo-angular-dialog';
22
22
  import { DialogContentBase, DialogActionsComponent, DialogContainerService, DialogService, WindowService, WindowContainerService } from '@progress/kendo-angular-dialog';
23
23
  import { IconWrapperComponent, IconsService } from '@progress/kendo-angular-icons';
24
24
  import * as i1$3 from '@progress/kendo-angular-toolbar';
25
25
  import { ToolBarToolComponent, ToolBarComponent, ToolBarButtonComponent, ToolBarButtonGroupComponent, ToolBarSeparatorComponent, ToolBarDropDownButtonComponent } from '@progress/kendo-angular-toolbar';
26
- import { TextBoxComponent, ColorPickerComponent, CheckBoxComponent, RadioButtonComponent } from '@progress/kendo-angular-inputs';
26
+ import * as i9 from '@progress/kendo-angular-inputs';
27
+ import { TextBoxComponent, ColorPickerComponent, CheckBoxComponent, RadioButtonComponent, InputsModule } from '@progress/kendo-angular-inputs';
27
28
  import { LabelComponent } from '@progress/kendo-angular-label';
28
29
  import { ButtonComponent, DropDownButtonComponent } from '@progress/kendo-angular-buttons';
29
30
  import { TabStripComponent, TabStripTabComponent, TabTemplateDirective } from '@progress/kendo-angular-layout';
30
31
  import { ComboBoxComponent, DropDownListComponent, ItemTemplateDirective } from '@progress/kendo-angular-dropdowns';
31
- import { NgStyle } from '@angular/common';
32
+ import { NgStyle, NgTemplateOutlet, NgClass } from '@angular/common';
32
33
  import { saveAs } from '@progress/kendo-file-saver';
33
34
  import { Workbook } from '@progress/kendo-ooxml';
34
35
  import * as i4 from '@angular/forms';
35
36
  import { FormGroup, FormControl, Validators, ReactiveFormsModule } from '@angular/forms';
36
- import { CalendarComponent as CalendarComponent$1 } from '@progress/kendo-angular-dateinputs';
37
+ import { CalendarComponent as CalendarComponent$1, DatePickerComponent } from '@progress/kendo-angular-dateinputs';
38
+ import { trigger, state, style, transition, animate } from '@angular/animations';
39
+ import * as i8 from '@progress/kendo-angular-treeview';
40
+ import { KENDO_TREEVIEW } from '@progress/kendo-angular-treeview';
37
41
 
38
42
  /**
39
43
  * @hidden
@@ -43,8 +47,8 @@ const packageMetadata = {
43
47
  productName: 'Kendo UI for Angular',
44
48
  productCode: 'KENDOUIANGULAR',
45
49
  productCodes: ['KENDOUIANGULAR'],
46
- publishDate: 1765533088,
47
- version: '21.3.1-develop.1',
50
+ publishDate: 1766140362,
51
+ version: '21.4.0-develop.10',
48
52
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/?utm_medium=product&utm_source=kendoangular&utm_campaign=kendo-ui-angular-purchase-license-keys-warning',
49
53
  };
50
54
 
@@ -54,10 +58,12 @@ let spreadsheetCounter = 0;
54
58
  */
55
59
  class SpreadsheetService {
56
60
  spreadsheet;
61
+ spreadsheetComponent;
57
62
  sheetsChanged = new Subject();
58
63
  onSheetsBarFocus = new Subject();
59
64
  activeSheetChanged = new Subject();
60
65
  selectionChanged = new Subject();
66
+ componentInitialized = new Subject();
61
67
  dialogContainer;
62
68
  constructor() {
63
69
  spreadsheetCounter++;
@@ -559,6 +565,7 @@ class ErrorHandlingService {
559
565
  actionsLayout: 'start'
560
566
  };
561
567
  const dialog = this.dialogService.open(dialogSettings);
568
+ this.spreadsheetService.spreadsheetComponent.closePopup();
562
569
  const dialogInstance = dialog.dialog?.instance;
563
570
  dialogInstance.action.pipe(take(1)).subscribe((event) => {
564
571
  if (event.text === this.messageFor('dialogOk')) {
@@ -630,7 +637,12 @@ const commandIcons = {
630
637
  hideRow: 'eye-slash',
631
638
  unhideRow: 'eye',
632
639
  hideColumn: 'eye-slash',
633
- unhideColumn: 'eye'
640
+ unhideColumn: 'eye',
641
+ filter: 'filter',
642
+ sort: 'sort-asc',
643
+ sortAsc: 'sort-asc',
644
+ sortDesc: 'sort-desc',
645
+ unsort: 'sort-clear'
634
646
  };
635
647
  /**
636
648
  * @hidden
@@ -683,7 +695,12 @@ const commandSVGIcons = {
683
695
  hideRow: eyeSlashIcon,
684
696
  unhideRow: eyeIcon,
685
697
  hideColumn: eyeSlashIcon,
686
- unhideColumn: eyeIcon
698
+ unhideColumn: eyeIcon,
699
+ filter: filterIcon,
700
+ sort: sortAscIcon,
701
+ sortAsc: sortAscIcon,
702
+ sortDesc: sortDescIcon,
703
+ unsort: sortClearIcon
687
704
  };
688
705
 
689
706
  /**
@@ -1396,6 +1413,13 @@ const MERGE = [
1396
1413
  { icon: commandIcons.mergeVertically, svgIcon: commandSVGIcons.mergeVertically, textKey: 'Merge vertically', commandName: 'vertically', value: 'vertically', disabled: false, commandId: 'mergeVertically' },
1397
1414
  { icon: commandIcons.unmerge, svgIcon: commandSVGIcons.unmerge, textKey: 'Unmerge', commandName: 'unmerge', value: 'unmerge', disabled: false, commandId: 'unmerge' }
1398
1415
  ];
1416
+ /**
1417
+ * @hidden
1418
+ */
1419
+ const SORT = [
1420
+ { icon: commandIcons.sortAsc, svgIcon: commandSVGIcons.sortAsc, textKey: 'Sort range A to Z', commandName: 'sortAsc', value: 'asc', disabled: false, commandId: 'sortAsc' },
1421
+ { icon: commandIcons.sortDesc, svgIcon: commandSVGIcons.sortDesc, textKey: 'Sort range Z to A', commandName: 'sortDesc', value: 'desc', disabled: false, commandId: 'sortDesc' }
1422
+ ];
1399
1423
  /**
1400
1424
  * @hidden
1401
1425
  */
@@ -3845,8 +3869,124 @@ class MessagesDirective extends ComponentMessages {
3845
3869
  * internally with the current value, and the resulting label will be rendered as **A1% is invalid**.
3846
3870
  */
3847
3871
  invalidNameError;
3872
+ /**
3873
+ * The content of the dialog that warns about sorting range containing cells of mixed shapes.
3874
+ */
3875
+ cantSortMixedCells;
3876
+ /**
3877
+ * The text of the **Apply** button in the filter menu.
3878
+ */
3879
+ filterApply;
3880
+ /**
3881
+ * The text of the **Clear** button in the filter menu.
3882
+ */
3883
+ filterClear;
3884
+ /**
3885
+ * The text of the **All** grouping item in the filter menu.
3886
+ */
3887
+ filterMenuAll;
3888
+ /**
3889
+ * The text for the blank (empty) values.
3890
+ */
3891
+ blankValues;
3892
+ /**
3893
+ * The text of the **contains** filter operator.
3894
+ */
3895
+ filterContainsOperator;
3896
+ /**
3897
+ * The text of the **does not contain** filter operator.
3898
+ */
3899
+ filterNotContainsOperator;
3900
+ /**
3901
+ * The text of the **starts with** filter operator.
3902
+ */
3903
+ filterStartsWithOperator;
3904
+ /**
3905
+ * The text of the **ends with** filter operator.
3906
+ */
3907
+ filterEndsWithOperator;
3908
+ /**
3909
+ * The text of the **matches** filter operator.
3910
+ */
3911
+ filterMatchesOperator;
3912
+ /**
3913
+ * The text of the **does not match** filter operator.
3914
+ */
3915
+ filterNotMatchesOperator;
3916
+ /**
3917
+ * The text of the **Date is** filter operator.
3918
+ */
3919
+ filterDateEqOperator;
3920
+ /**
3921
+ * The text of the **Date is not** filter operator.
3922
+ */
3923
+ filterDateNotEqOperator;
3924
+ /**
3925
+ * The text of the **Date is before** filter operator.
3926
+ */
3927
+ filterBeforeOperator;
3928
+ /**
3929
+ * The text of the **Date is after** filter operator.
3930
+ */
3931
+ filterAfterOperator;
3932
+ /**
3933
+ * Sets the text for the **Equal (Is equal to)** filter operator.
3934
+ */
3935
+ filterEqOperator;
3936
+ /**
3937
+ * Sets the text for the **Not equal (Is not equal to)** filter operator.
3938
+ */
3939
+ filterNotEqOperator;
3940
+ /**
3941
+ * The text of the greater than or equal filter operator.
3942
+ */
3943
+ filterGteOperator;
3944
+ /**
3945
+ * The text of the **greater than** filter operator.
3946
+ */
3947
+ filterGtOperator;
3948
+ /**
3949
+ * The text of the **less than or equal** filter operator.
3950
+ */
3951
+ filterLteOperator;
3952
+ /**
3953
+ * The text of the **less than** filter operator.
3954
+ */
3955
+ filterLtOperator;
3956
+ /**
3957
+ * The text of the **none** filter operator.
3958
+ */
3959
+ filterNoneOperator;
3960
+ /**
3961
+ * The text of the **Filter by condition** menu item.
3962
+ */
3963
+ filterMenuConditionItem;
3964
+ /**
3965
+ * The text of the **Filter by value** menu item.
3966
+ */
3967
+ filterMenuValueItem;
3968
+ /**
3969
+ * The title of the Sort ToolBar tool.
3970
+ */
3971
+ sort;
3972
+ /**
3973
+ * The text of the **Sort range A to Z** option.
3974
+ */
3975
+ sortAsc;
3976
+ /**
3977
+ * The text of the **Sort range Z to A** option.
3978
+ */
3979
+ sortDesc;
3980
+ /**
3981
+ * The text of the **Unsort** option.
3982
+ */
3983
+ unsort;
3984
+ /**
3985
+ * The content of the dialog that warns about sorting incorrect (empty) range.
3986
+ */
3987
+ cantSortNullRef;
3848
3988
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MessagesDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
3849
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: MessagesDirective, isStandalone: true, selector: "[kendoSpreadsheetMessages]", inputs: { home: "home", file: "file", insert: "insert", formatTab: "formatTab", dataTab: "dataTab", saveFile: "saveFile", loadFile: "loadFile", bold: "bold", dataValidation: "dataValidation", validationCellRange: "validationCellRange", validationCriteria: "validationCriteria", validationComparer: "validationComparer", validationMinValue: "validationMinValue", validationMaxValue: "validationMaxValue", validationStartValue: "validationStartValue", validationEndValue: "validationEndValue", validationValue: "validationValue", validationShowListButtonCheckbox: "validationShowListButtonCheckbox", validationShowDateButtonCheckbox: "validationShowDateButtonCheckbox", validationIgnoreBlankCheckbox: "validationIgnoreBlankCheckbox", validationOnInvalidData: "validationOnInvalidData", validationRejectInput: "validationRejectInput", validationShowWarning: "validationShowWarning", validationShowHint: "validationShowHint", anyValueValidationCriteria: "anyValueValidationCriteria", numberValidationCriteria: "numberValidationCriteria", textValidationCriteria: "textValidationCriteria", dateValidationCriteria: "dateValidationCriteria", customFormulaValidationCriteria: "customFormulaValidationCriteria", listValidationCriteria: "listValidationCriteria", greaterThanValidationComparer: "greaterThanValidationComparer", lessThanValidationComparer: "lessThanValidationComparer", betweenValidationComparer: "betweenValidationComparer", notBetweenValidationComparer: "notBetweenValidationComparer", equalToValidationComparer: "equalToValidationComparer", notEqualToValidationComparer: "notEqualToValidationComparer", greaterThanOrEqualToValidationComparer: "greaterThanOrEqualToValidationComparer", lessThanOrEqualToValidationComparer: "lessThanOrEqualToValidationComparer", validationHintMessage: "validationHintMessage", validationHintTitle: "validationHintTitle", italic: "italic", underline: "underline", format: "format", fontFamily: "fontFamily", fontSize: "fontSize", undo: "undo", redo: "redo", background: "background", color: "color", gridLines: "gridLines", addColumnLeft: "addColumnLeft", addColumnRight: "addColumnRight", addRowBelow: "addRowBelow", addRowAbove: "addRowAbove", deleteColumn: "deleteColumn", deleteRow: "deleteRow", wrap: "wrap", align: "align", alignHorizontal: "alignHorizontal", alignVertical: "alignVertical", alignLeft: "alignLeft", alignCenter: "alignCenter", alignRight: "alignRight", alignJustify: "alignJustify", alignTop: "alignTop", alignMiddle: "alignMiddle", alignBottom: "alignBottom", dialogApply: "dialogApply", dialogCancel: "dialogCancel", dialogDelete: "dialogDelete", dialogRename: "dialogRename", dialogInsert: "dialogInsert", dialogRemove: "dialogRemove", dialogRemoveLink: "dialogRemoveLink", delete: "delete", rename: "rename", nameBox: "nameBox", formulaInput: "formulaInput", addSheet: "addSheet", sheetsMenu: "sheetsMenu", view: "view", merge: "merge", mergeHorizontally: "mergeHorizontally", mergeVertically: "mergeVertically", mergeAll: "mergeAll", unmerge: "unmerge", insertLink: "insertLink", increaseDecimal: "increaseDecimal", decreaseDecimal: "decreaseDecimal", increaseFontSize: "increaseFontSize", decreaseFontSize: "decreaseFontSize", openUnsupported: "openUnsupported", modifyMerged: "modifyMerged", cannotModifyDisabled: "cannotModifyDisabled", dialogOk: "dialogOk", dialogError: "dialogError", duplicateSheetName: "duplicateSheetName", copy: "copy", cut: "cut", paste: "paste", hideRow: "hideRow", unhideRow: "unhideRow", hideColumn: "hideColumn", unhideColumn: "unhideColumn", sheetDelete: "sheetDelete", sheetRename: "sheetRename", sheetHide: "sheetHide", sheetDuplicate: "sheetDuplicate", sheetMoveLeft: "sheetMoveLeft", sheetMoveRight: "sheetMoveRight", invalidNameError: "invalidNameError" }, usesInheritance: true, ngImport: i0 });
3989
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: MessagesDirective, isStandalone: true, selector: "[kendoSpreadsheetMessages]", inputs: { home: "home", file: "file", insert: "insert", formatTab: "formatTab", dataTab: "dataTab", saveFile: "saveFile", loadFile: "loadFile", bold: "bold", dataValidation: "dataValidation", validationCellRange: "validationCellRange", validationCriteria: "validationCriteria", validationComparer: "validationComparer", validationMinValue: "validationMinValue", validationMaxValue: "validationMaxValue", validationStartValue: "validationStartValue", validationEndValue: "validationEndValue", validationValue: "validationValue", validationShowListButtonCheckbox: "validationShowListButtonCheckbox", validationShowDateButtonCheckbox: "validationShowDateButtonCheckbox", validationIgnoreBlankCheckbox: "validationIgnoreBlankCheckbox", validationOnInvalidData: "validationOnInvalidData", validationRejectInput: "validationRejectInput", validationShowWarning: "validationShowWarning", validationShowHint: "validationShowHint", anyValueValidationCriteria: "anyValueValidationCriteria", numberValidationCriteria: "numberValidationCriteria", textValidationCriteria: "textValidationCriteria", dateValidationCriteria: "dateValidationCriteria", customFormulaValidationCriteria: "customFormulaValidationCriteria", listValidationCriteria: "listValidationCriteria", greaterThanValidationComparer: "greaterThanValidationComparer", lessThanValidationComparer: "lessThanValidationComparer", betweenValidationComparer: "betweenValidationComparer", notBetweenValidationComparer: "notBetweenValidationComparer", equalToValidationComparer: "equalToValidationComparer", notEqualToValidationComparer: "notEqualToValidationComparer", greaterThanOrEqualToValidationComparer: "greaterThanOrEqualToValidationComparer", lessThanOrEqualToValidationComparer: "lessThanOrEqualToValidationComparer", validationHintMessage: "validationHintMessage", validationHintTitle: "validationHintTitle", italic: "italic", underline: "underline", format: "format", fontFamily: "fontFamily", fontSize: "fontSize", undo: "undo", redo: "redo", background: "background", color: "color", gridLines: "gridLines", addColumnLeft: "addColumnLeft", addColumnRight: "addColumnRight", addRowBelow: "addRowBelow", addRowAbove: "addRowAbove", deleteColumn: "deleteColumn", deleteRow: "deleteRow", wrap: "wrap", align: "align", alignHorizontal: "alignHorizontal", alignVertical: "alignVertical", alignLeft: "alignLeft", alignCenter: "alignCenter", alignRight: "alignRight", alignJustify: "alignJustify", alignTop: "alignTop", alignMiddle: "alignMiddle", alignBottom: "alignBottom", dialogApply: "dialogApply", dialogCancel: "dialogCancel", dialogDelete: "dialogDelete", dialogRename: "dialogRename", dialogInsert: "dialogInsert", dialogRemove: "dialogRemove", dialogRemoveLink: "dialogRemoveLink", delete: "delete", rename: "rename", nameBox: "nameBox", formulaInput: "formulaInput", addSheet: "addSheet", sheetsMenu: "sheetsMenu", view: "view", merge: "merge", mergeHorizontally: "mergeHorizontally", mergeVertically: "mergeVertically", mergeAll: "mergeAll", unmerge: "unmerge", insertLink: "insertLink", increaseDecimal: "increaseDecimal", decreaseDecimal: "decreaseDecimal", increaseFontSize: "increaseFontSize", decreaseFontSize: "decreaseFontSize", openUnsupported: "openUnsupported", modifyMerged: "modifyMerged", cannotModifyDisabled: "cannotModifyDisabled", dialogOk: "dialogOk", dialogError: "dialogError", duplicateSheetName: "duplicateSheetName", copy: "copy", cut: "cut", paste: "paste", hideRow: "hideRow", unhideRow: "unhideRow", hideColumn: "hideColumn", unhideColumn: "unhideColumn", sheetDelete: "sheetDelete", sheetRename: "sheetRename", sheetHide: "sheetHide", sheetDuplicate: "sheetDuplicate", sheetMoveLeft: "sheetMoveLeft", sheetMoveRight: "sheetMoveRight", invalidNameError: "invalidNameError", cantSortMixedCells: "cantSortMixedCells", filterApply: "filterApply", filterClear: "filterClear", filterMenuAll: "filterMenuAll", blankValues: "blankValues", filterContainsOperator: "filterContainsOperator", filterNotContainsOperator: "filterNotContainsOperator", filterStartsWithOperator: "filterStartsWithOperator", filterEndsWithOperator: "filterEndsWithOperator", filterMatchesOperator: "filterMatchesOperator", filterNotMatchesOperator: "filterNotMatchesOperator", filterDateEqOperator: "filterDateEqOperator", filterDateNotEqOperator: "filterDateNotEqOperator", filterBeforeOperator: "filterBeforeOperator", filterAfterOperator: "filterAfterOperator", filterEqOperator: "filterEqOperator", filterNotEqOperator: "filterNotEqOperator", filterGteOperator: "filterGteOperator", filterGtOperator: "filterGtOperator", filterLteOperator: "filterLteOperator", filterLtOperator: "filterLtOperator", filterNoneOperator: "filterNoneOperator", filterMenuConditionItem: "filterMenuConditionItem", filterMenuValueItem: "filterMenuValueItem", sort: "sort", sortAsc: "sortAsc", sortDesc: "sortDesc", unsort: "unsort", cantSortNullRef: "cantSortNullRef" }, usesInheritance: true, ngImport: i0 });
3850
3990
  }
3851
3991
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MessagesDirective, decorators: [{
3852
3992
  type: Directive,
@@ -4076,6 +4216,64 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
4076
4216
  type: Input
4077
4217
  }], invalidNameError: [{
4078
4218
  type: Input
4219
+ }], cantSortMixedCells: [{
4220
+ type: Input
4221
+ }], filterApply: [{
4222
+ type: Input
4223
+ }], filterClear: [{
4224
+ type: Input
4225
+ }], filterMenuAll: [{
4226
+ type: Input
4227
+ }], blankValues: [{
4228
+ type: Input
4229
+ }], filterContainsOperator: [{
4230
+ type: Input
4231
+ }], filterNotContainsOperator: [{
4232
+ type: Input
4233
+ }], filterStartsWithOperator: [{
4234
+ type: Input
4235
+ }], filterEndsWithOperator: [{
4236
+ type: Input
4237
+ }], filterMatchesOperator: [{
4238
+ type: Input
4239
+ }], filterNotMatchesOperator: [{
4240
+ type: Input
4241
+ }], filterDateEqOperator: [{
4242
+ type: Input
4243
+ }], filterDateNotEqOperator: [{
4244
+ type: Input
4245
+ }], filterBeforeOperator: [{
4246
+ type: Input
4247
+ }], filterAfterOperator: [{
4248
+ type: Input
4249
+ }], filterEqOperator: [{
4250
+ type: Input
4251
+ }], filterNotEqOperator: [{
4252
+ type: Input
4253
+ }], filterGteOperator: [{
4254
+ type: Input
4255
+ }], filterGtOperator: [{
4256
+ type: Input
4257
+ }], filterLteOperator: [{
4258
+ type: Input
4259
+ }], filterLtOperator: [{
4260
+ type: Input
4261
+ }], filterNoneOperator: [{
4262
+ type: Input
4263
+ }], filterMenuConditionItem: [{
4264
+ type: Input
4265
+ }], filterMenuValueItem: [{
4266
+ type: Input
4267
+ }], sort: [{
4268
+ type: Input
4269
+ }], sortAsc: [{
4270
+ type: Input
4271
+ }], sortDesc: [{
4272
+ type: Input
4273
+ }], unsort: [{
4274
+ type: Input
4275
+ }], cantSortNullRef: [{
4276
+ type: Input
4079
4277
  }] } });
4080
4278
 
4081
4279
  /**
@@ -4884,6 +5082,389 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
4884
5082
  type: Output
4885
5083
  }] } });
4886
5084
 
5085
+ /**
5086
+ * @hidden
5087
+ */
5088
+ class SpreadsheetFilterDirective extends SpreadsheetCommandButton {
5089
+ cdr;
5090
+ constructor(button, localization, spreadsheetService, toolsService, cdr) {
5091
+ super('filter', button, localization, spreadsheetService, toolsService, {
5092
+ command: 'FilterCommand'
5093
+ });
5094
+ this.cdr = cdr;
5095
+ this.subs.add(spreadsheetService.componentInitialized.subscribe(() => {
5096
+ this.toggleActiveState(button);
5097
+ }));
5098
+ this.subs.add(spreadsheetService.selectionChanged.subscribe((range) => {
5099
+ this.toggleActiveState(button, range);
5100
+ }));
5101
+ this.subs.add(spreadsheetService.activeSheetChanged.subscribe(() => {
5102
+ this.toggleActiveState(button);
5103
+ }));
5104
+ }
5105
+ ngOnDestroy() {
5106
+ this.subs.unsubscribe();
5107
+ }
5108
+ clickHandler() {
5109
+ this.spreadsheetService.spreadsheetComponent.closePopup();
5110
+ const options = {
5111
+ command: 'FilterCommand',
5112
+ options: { property: 'hasFilter' }
5113
+ };
5114
+ this.spreadsheetService.spreadsheet.executeCommand(options);
5115
+ }
5116
+ toggleActiveState(button, range) {
5117
+ const currentSheet = this.spreadsheetService.spreadsheet.activeSheet();
5118
+ const currentRange = isPresent(range) ? range : currentSheet.range(currentSheet.activeCell());
5119
+ let disabled = true;
5120
+ let rangeHasValue = false;
5121
+ currentRange.values().forEach((nestedArr) => {
5122
+ if (nestedArr.some(value => isPresent(value) && value !== '') && !rangeHasValue) {
5123
+ rangeHasValue = true;
5124
+ }
5125
+ });
5126
+ const currentRangeRef = currentRange._ref;
5127
+ const isSingleCell = currentRangeRef?.ref === 'cell' || (currentRangeRef.bottomRight.row === currentRangeRef.topLeft.row && currentRangeRef.bottomRight.col === currentRangeRef.topLeft.col);
5128
+ disabled = currentRangeRef?.height() <= 1 || !rangeHasValue || isSingleCell;
5129
+ if (button.disabled !== disabled) {
5130
+ button.disabled = disabled;
5131
+ this.cdr.detectChanges();
5132
+ }
5133
+ }
5134
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpreadsheetFilterDirective, deps: [{ token: i1$3.ToolBarButtonComponent }, { token: SpreadsheetLocalizationService }, { token: SpreadsheetService }, { token: SpreadsheetToolsService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive });
5135
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: SpreadsheetFilterDirective, isStandalone: true, selector: "kendo-toolbar-button[kendoSpreadsheetFilter]", usesInheritance: true, ngImport: i0 });
5136
+ }
5137
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpreadsheetFilterDirective, decorators: [{
5138
+ type: Directive,
5139
+ args: [{
5140
+ selector: 'kendo-toolbar-button[kendoSpreadsheetFilter]',
5141
+ standalone: true
5142
+ }]
5143
+ }], ctorParameters: () => [{ type: i1$3.ToolBarButtonComponent }, { type: SpreadsheetLocalizationService }, { type: SpreadsheetService }, { type: SpreadsheetToolsService }, { type: i0.ChangeDetectorRef }] });
5144
+
5145
+ /**
5146
+ * @hidden
5147
+ */
5148
+ class FilterMenuItemContentTemplateDirective {
5149
+ templateRef;
5150
+ constructor(templateRef) {
5151
+ this.templateRef = templateRef;
5152
+ }
5153
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FilterMenuItemContentTemplateDirective, deps: [{ token: i0.TemplateRef, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
5154
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: FilterMenuItemContentTemplateDirective, isStandalone: true, selector: "[kendoSpreadsheetFilterMenuItemContentTemplate]", ngImport: i0 });
5155
+ }
5156
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FilterMenuItemContentTemplateDirective, decorators: [{
5157
+ type: Directive,
5158
+ args: [{
5159
+ selector: '[kendoSpreadsheetFilterMenuItemContentTemplate]',
5160
+ standalone: true
5161
+ }]
5162
+ }], ctorParameters: () => [{ type: i0.TemplateRef, decorators: [{
5163
+ type: Optional
5164
+ }] }] });
5165
+
5166
+ /**
5167
+ * Represents an item that you can place inside the Spreadsheet filter menu.
5168
+ *
5169
+ * @hidden
5170
+ */
5171
+ class SpreadsheetFilterMenuItemComponent {
5172
+ ngZone;
5173
+ element;
5174
+ contentTemplate;
5175
+ hostClass = true;
5176
+ /**
5177
+ * Specifies the item text.
5178
+ */
5179
+ text;
5180
+ /**
5181
+ * Specifies the items.
5182
+ */
5183
+ innerMenuItems;
5184
+ /**
5185
+ * Specifies the item icon.
5186
+ */
5187
+ icon;
5188
+ /**
5189
+ * Specifies the item icon.
5190
+ */
5191
+ expanderClass;
5192
+ /**
5193
+ * Specifies the item icon.
5194
+ */
5195
+ expandable = false;
5196
+ /**
5197
+ * Specifies the item svgIcon.
5198
+ */
5199
+ svgIcon;
5200
+ /**
5201
+ * Specifies if the item is expanded.
5202
+ */
5203
+ set expanded(value) {
5204
+ this._expanded = value;
5205
+ this.updateContentState();
5206
+ }
5207
+ get expanded() {
5208
+ return this._expanded;
5209
+ }
5210
+ /**
5211
+ * Fires when the item is clicked.
5212
+ */
5213
+ itemClick = new EventEmitter();
5214
+ /**
5215
+ * Fires when the content expands.
5216
+ */
5217
+ expand = new EventEmitter();
5218
+ /**
5219
+ * Fires when the content collapses.
5220
+ */
5221
+ collapse = new EventEmitter();
5222
+ constructor(ngZone, element) {
5223
+ this.ngZone = ngZone;
5224
+ this.element = element;
5225
+ }
5226
+ ngAfterViewInit() {
5227
+ this.ngZone.onStable.pipe(take(1)).subscribe(() => {
5228
+ this.contentTemplate && (this.contentId = `k-${guid()}`);
5229
+ });
5230
+ }
5231
+ /**
5232
+ * @hidden
5233
+ */
5234
+ get expandedIcon() {
5235
+ return this.expanded ? 'arrow-chevron-up' : 'arrow-chevron-down';
5236
+ }
5237
+ /**
5238
+ * @hidden
5239
+ */
5240
+ get expandedSvgIcon() {
5241
+ return this.expanded ? this.chevronUpIcon : this.chevronDownIcon;
5242
+ }
5243
+ contentState = 'collapsed';
5244
+ contentId;
5245
+ chevronUpIcon = chevronUpIcon;
5246
+ chevronDownIcon = chevronDownIcon;
5247
+ _expanded = false;
5248
+ /**
5249
+ * @hidden
5250
+ */
5251
+ onClick(e, item) {
5252
+ this.itemClick.emit(item);
5253
+ e.preventDefault();
5254
+ e.stopImmediatePropagation();
5255
+ if (this.contentTemplate) {
5256
+ if (this.expanded) {
5257
+ this.collapse.emit();
5258
+ }
5259
+ else {
5260
+ this.expand.emit();
5261
+ }
5262
+ }
5263
+ }
5264
+ updateContentState() {
5265
+ this.contentState = this.expanded ? 'expanded' : 'collapsed';
5266
+ }
5267
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpreadsheetFilterMenuItemComponent, deps: [{ token: i0.NgZone }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
5268
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SpreadsheetFilterMenuItemComponent, isStandalone: true, selector: "kendo-spreadsheet-filtermenu-item", inputs: { text: "text", innerMenuItems: "innerMenuItems", icon: "icon", expanderClass: "expanderClass", expandable: "expandable", svgIcon: "svgIcon", expanded: "expanded" }, outputs: { itemClick: "itemClick", expand: "expand", collapse: "collapse" }, host: { properties: { "class.k-columnmenu-item-wrapper": "this.hostClass" } }, queries: [{ propertyName: "contentTemplate", first: true, predicate: FilterMenuItemContentTemplateDirective, descendants: true }], ngImport: i0, template: `
5269
+ @if (expandable) {
5270
+ <div class="k-expander" [ngClass]="expanderClass">
5271
+ <ng-container [ngTemplateOutlet]="itemsTemplate"></ng-container>
5272
+ </div>
5273
+ } @else {
5274
+ <ng-container [ngTemplateOutlet]="itemsTemplate"></ng-container>
5275
+ }
5276
+
5277
+ <ng-template #itemsTemplate>
5278
+ @for (item of innerMenuItems; track item) {
5279
+ <div class="k-columnmenu-item" (click)="onClick($event, item)">
5280
+ @if (item.icon || item.svgIcon) {
5281
+ <kendo-icon-wrapper
5282
+ [name]="item.icon"
5283
+ [svgIcon]="item.svgIcon">
5284
+ </kendo-icon-wrapper>
5285
+ }
5286
+ {{item.text}}
5287
+ @if (expandable) {
5288
+ <span class="k-spacer"></span>
5289
+ <span class="k-expander-indicator">
5290
+ <kendo-icon-wrapper
5291
+ [name]="expandedIcon"
5292
+ [svgIcon]="expandedSvgIcon">
5293
+ </kendo-icon-wrapper>
5294
+ </span>
5295
+ }
5296
+ </div>
5297
+ }
5298
+ </ng-template>
5299
+
5300
+ @if (contentTemplate) {
5301
+ <div class="k-columnmenu-item-content" [attr.id]="contentId" [@state]="contentState" [style.overflow]="'hidden'">
5302
+ <ng-template [ngTemplateOutlet]="contentTemplate.templateRef"></ng-template>
5303
+ </div>
5304
+ }
5305
+ `, isInline: true, dependencies: [{ kind: "component", type: IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], animations: [
5306
+ trigger('state', [
5307
+ state('collapsed', style({ display: 'none' })),
5308
+ state('expanded', style({ display: 'block' })),
5309
+ transition('collapsed => expanded', [
5310
+ style({
5311
+ height: '0px',
5312
+ display: 'block'
5313
+ }),
5314
+ animate('100ms ease-in', style({
5315
+ height: '*'
5316
+ }))
5317
+ ]),
5318
+ transition('expanded => collapsed', [
5319
+ style({
5320
+ height: '*'
5321
+ }),
5322
+ animate('100ms ease-in', style({
5323
+ height: '0px'
5324
+ }))
5325
+ ])
5326
+ ])
5327
+ ] });
5328
+ }
5329
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpreadsheetFilterMenuItemComponent, decorators: [{
5330
+ type: Component,
5331
+ args: [{
5332
+ selector: 'kendo-spreadsheet-filtermenu-item',
5333
+ template: `
5334
+ @if (expandable) {
5335
+ <div class="k-expander" [ngClass]="expanderClass">
5336
+ <ng-container [ngTemplateOutlet]="itemsTemplate"></ng-container>
5337
+ </div>
5338
+ } @else {
5339
+ <ng-container [ngTemplateOutlet]="itemsTemplate"></ng-container>
5340
+ }
5341
+
5342
+ <ng-template #itemsTemplate>
5343
+ @for (item of innerMenuItems; track item) {
5344
+ <div class="k-columnmenu-item" (click)="onClick($event, item)">
5345
+ @if (item.icon || item.svgIcon) {
5346
+ <kendo-icon-wrapper
5347
+ [name]="item.icon"
5348
+ [svgIcon]="item.svgIcon">
5349
+ </kendo-icon-wrapper>
5350
+ }
5351
+ {{item.text}}
5352
+ @if (expandable) {
5353
+ <span class="k-spacer"></span>
5354
+ <span class="k-expander-indicator">
5355
+ <kendo-icon-wrapper
5356
+ [name]="expandedIcon"
5357
+ [svgIcon]="expandedSvgIcon">
5358
+ </kendo-icon-wrapper>
5359
+ </span>
5360
+ }
5361
+ </div>
5362
+ }
5363
+ </ng-template>
5364
+
5365
+ @if (contentTemplate) {
5366
+ <div class="k-columnmenu-item-content" [attr.id]="contentId" [@state]="contentState" [style.overflow]="'hidden'">
5367
+ <ng-template [ngTemplateOutlet]="contentTemplate.templateRef"></ng-template>
5368
+ </div>
5369
+ }
5370
+ `,
5371
+ standalone: true,
5372
+ imports: [IconWrapperComponent, NgTemplateOutlet, NgClass],
5373
+ animations: [
5374
+ trigger('state', [
5375
+ state('collapsed', style({ display: 'none' })),
5376
+ state('expanded', style({ display: 'block' })),
5377
+ transition('collapsed => expanded', [
5378
+ style({
5379
+ height: '0px',
5380
+ display: 'block'
5381
+ }),
5382
+ animate('100ms ease-in', style({
5383
+ height: '*'
5384
+ }))
5385
+ ]),
5386
+ transition('expanded => collapsed', [
5387
+ style({
5388
+ height: '*'
5389
+ }),
5390
+ animate('100ms ease-in', style({
5391
+ height: '0px'
5392
+ }))
5393
+ ])
5394
+ ])
5395
+ ]
5396
+ }]
5397
+ }], ctorParameters: () => [{ type: i0.NgZone }, { type: i0.ElementRef }], propDecorators: { contentTemplate: [{
5398
+ type: ContentChild,
5399
+ args: [FilterMenuItemContentTemplateDirective]
5400
+ }], hostClass: [{
5401
+ type: HostBinding,
5402
+ args: ['class.k-columnmenu-item-wrapper']
5403
+ }], text: [{
5404
+ type: Input
5405
+ }], innerMenuItems: [{
5406
+ type: Input
5407
+ }], icon: [{
5408
+ type: Input
5409
+ }], expanderClass: [{
5410
+ type: Input
5411
+ }], expandable: [{
5412
+ type: Input
5413
+ }], svgIcon: [{
5414
+ type: Input
5415
+ }], expanded: [{
5416
+ type: Input
5417
+ }], itemClick: [{
5418
+ type: Output
5419
+ }], expand: [{
5420
+ type: Output
5421
+ }], collapse: [{
5422
+ type: Output
5423
+ }] } });
5424
+
5425
+ /**
5426
+ * @hidden
5427
+ */
5428
+ class SpreadsheetSortDirective {
5429
+ spreadsheetService;
5430
+ commandName = 'sort';
5431
+ subs = new Subscription();
5432
+ constructor(host, localization, spreadsheetService) {
5433
+ this.spreadsheetService = spreadsheetService;
5434
+ host.svgIcon = commandSVGIcons[this.commandName];
5435
+ host.icon = commandIcons[this.commandName];
5436
+ host.arrowIcon = true;
5437
+ host.fillMode = 'flat';
5438
+ host.data = SORT.map(item => ({ ...item, textKey: localization.get(item.commandId) }));
5439
+ this.subs.add(host.itemClick.subscribe((e) => this.onItemClick(e)));
5440
+ host.title = localization.get(this.commandName);
5441
+ host.textField = 'textKey';
5442
+ }
5443
+ ngOnDestroy() {
5444
+ this.subs.unsubscribe();
5445
+ }
5446
+ onItemClick(item) {
5447
+ if (item.disabled) {
5448
+ return;
5449
+ }
5450
+ const dir = item.value;
5451
+ const options = {
5452
+ value: dir,
5453
+ sheet: false
5454
+ };
5455
+ this.spreadsheetService.spreadsheet.executeCommand({ command: 'SortCommand', options });
5456
+ }
5457
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpreadsheetSortDirective, deps: [{ token: i1$3.ToolBarDropDownButtonComponent }, { token: SpreadsheetLocalizationService }, { token: SpreadsheetService }], target: i0.ɵɵFactoryTarget.Directive });
5458
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: SpreadsheetSortDirective, isStandalone: true, selector: "[kendoSpreadsheetSort]", ngImport: i0 });
5459
+ }
5460
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpreadsheetSortDirective, decorators: [{
5461
+ type: Directive,
5462
+ args: [{
5463
+ selector: '[kendoSpreadsheetSort]',
5464
+ standalone: true
5465
+ }]
5466
+ }], ctorParameters: () => [{ type: i1$3.ToolBarDropDownButtonComponent }, { type: SpreadsheetLocalizationService }, { type: SpreadsheetService }] });
5467
+
4887
5468
  /**
4888
5469
  * Represents the [Kendo UI Spreadsheet component for Angular]({% slug overview_spreadsheet %}).
4889
5470
  *
@@ -4906,11 +5487,13 @@ class SpreadsheetComponent {
4906
5487
  dialogService;
4907
5488
  popupService;
4908
5489
  container;
5490
+ cdr;
4909
5491
  formulaBarInputRef;
4910
5492
  formulaCellInputRef;
4911
5493
  nameBoxRef;
4912
5494
  dialogContainer;
4913
5495
  contextMenu;
5496
+ filterMenuTemplate;
4914
5497
  hostClass = true;
4915
5498
  role = 'application';
4916
5499
  /**
@@ -4974,6 +5557,14 @@ class SpreadsheetComponent {
4974
5557
  get sheetsInfo() {
4975
5558
  return this._sheetsInfo;
4976
5559
  }
5560
+ /**
5561
+ * @hidden
5562
+ */
5563
+ expandedKeys = ['0'];
5564
+ /**
5565
+ * @hidden
5566
+ */
5567
+ checkedKeys = [];
4977
5568
  /**
4978
5569
  * The number of columns in the document.
4979
5570
  *
@@ -5030,38 +5621,46 @@ class SpreadsheetComponent {
5030
5621
  */
5031
5622
  excel;
5032
5623
  /**
5033
- * Fired when a value in the Spreadsheet is changed. Exposes the `SpreadsheetWidget` instance and the selected `Range` as event data.
5624
+ * Fires when a value in the Spreadsheet is changed. Exposes the `SpreadsheetWidget` instance and the selected `Range` as event data.
5034
5625
  */
5035
5626
  change = new EventEmitter();
5036
5627
  /**
5037
- * Fired when the selected range format is changed from the UI. Exposes the `SpreadsheetWidget` instance and the selected `Range` as event data.
5628
+ * Fires when the selected range format is changed from the UI. Exposes the `SpreadsheetWidget` instance and the selected `Range` as event data.
5038
5629
  */
5039
5630
  formatChange = new EventEmitter();
5040
5631
  /**
5041
- * Fired when the selection is changed by the end user. Exposes the `SpreadsheetWidget` instance and the selected `Range` as event data.
5632
+ * Fires when the selection is changed by the end user. Exposes the `SpreadsheetWidget` instance and the selected `Range` as event data.
5042
5633
  */
5043
5634
  selectionChange = new EventEmitter();
5044
5635
  /**
5045
- * Fired when the end user clicks the Export to Excel toolbar button.
5636
+ * Fires when the end user clicks the Export to Excel toolbar button.
5046
5637
  * The event is preventable and exposes the `Workbook` object, a `preventDefault` method
5047
5638
  * (if invoked, the generated file will not be saved), and the `SpreadsheetWidget` instance.
5048
5639
  */
5049
5640
  excelExport = new EventEmitter();
5050
5641
  /**
5051
- * Fired when the end user clicks the Open toolbar button.
5642
+ * Fires when the end user clicks the Open toolbar button.
5052
5643
  * The event is preventable and exposes the selected `File` or `Blob`, a `preventDefault` method
5053
5644
  * (if invoked, the selected file will not be loaded), and the `SpreadsheetWidget` instance.
5054
5645
  */
5055
5646
  excelImport = new EventEmitter();
5056
5647
  /**
5057
- * Fired when the active sheet is about to change.
5648
+ * Fires when the active sheet is about to change.
5058
5649
  * The event exposes the new active `Sheet` and the `SpreadsheetWidget` instance.
5059
5650
  */
5060
5651
  activeSheetChange = new EventEmitter();
5652
+ /**
5653
+ * Fires when a clipboard action (cut, copy, or paste) occurs in the Spreadsheet.
5654
+ */
5655
+ clipboard = new EventEmitter();
5061
5656
  formulaFxIcon = formulaFxIcon;
5062
5657
  folderOpenIcon = folderOpenIcon;
5063
5658
  downloadIcon = downloadIcon;
5659
+ searchIcon = searchIcon;
5064
5660
  selectedMenuItem;
5661
+ rangeFilterValuesList = [];
5662
+ sortAscSmallIcon = sortAscSmallIcon;
5663
+ sortDescSmallIcon = sortDescSmallIcon;
5065
5664
  get spreadsheetWidget() {
5066
5665
  return this.spreadsheetService.spreadsheet;
5067
5666
  }
@@ -5074,13 +5673,31 @@ class SpreadsheetComponent {
5074
5673
  */
5075
5674
  licenseMessage;
5076
5675
  contextMenuItems = [];
5676
+ sortMenuItems = [];
5677
+ conditionExpanded = false;
5678
+ valueExpanded = false;
5679
+ filterConditionsList = {};
5680
+ conditionValue = '';
5681
+ set selectedCondition(value) {
5682
+ if (this._selectedCondition?.type !== value.type) {
5683
+ this.conditionValue = '';
5684
+ }
5685
+ this._selectedCondition = value;
5686
+ }
5687
+ get selectedCondition() {
5688
+ return this._selectedCondition;
5689
+ }
5690
+ _selectedCondition;
5077
5691
  _sheetsInfo;
5078
5692
  _activeSheet;
5079
5693
  _menuItems;
5080
5694
  currentRange;
5081
5695
  subs = new Subscription();
5696
+ filterMenuOpened = false;
5697
+ currentFilterOptions = null;
5082
5698
  popupRef;
5083
- constructor(ngZone, intl, host, localization, spreadsheetService, toolsService, errorService, dialogService, popupService, container) {
5699
+ popupPositionChangeSub;
5700
+ constructor(ngZone, intl, host, localization, spreadsheetService, toolsService, errorService, dialogService, popupService, container, cdr) {
5084
5701
  this.ngZone = ngZone;
5085
5702
  this.intl = intl;
5086
5703
  this.host = host;
@@ -5091,6 +5708,7 @@ class SpreadsheetComponent {
5091
5708
  this.dialogService = dialogService;
5092
5709
  this.popupService = popupService;
5093
5710
  this.container = container;
5711
+ this.cdr = cdr;
5094
5712
  const isValid = validatePackage(packageMetadata);
5095
5713
  this.licenseMessage = getLicenseMessage(packageMetadata);
5096
5714
  this.showLicenseWatermark = shouldShowValidationUI(isValid);
@@ -5137,25 +5755,36 @@ class SpreadsheetComponent {
5137
5755
  spreadsheet.view.bind('update', this.updateState);
5138
5756
  spreadsheet.view.bind('message', this.onMessage);
5139
5757
  spreadsheet.bind('contextmenu', this.onContextMenu.bind(this));
5758
+ spreadsheet.bind('copy', (e) => { this.onClipboardEvent(e, 'copy'); });
5759
+ spreadsheet.bind('cut', (e) => { this.onClipboardEvent(e, 'cut'); });
5760
+ spreadsheet.bind('paste', (e) => { this.onClipboardEvent(e, 'paste'); });
5140
5761
  const sheet = spreadsheet.activeSheet();
5141
5762
  if (sheet) {
5142
5763
  this.updateState({ range: sheet.range(sheet.activeCell()) });
5143
5764
  }
5144
5765
  this.updateActiveSheet(this.activeSheet || spreadsheet?.activeSheet()?.name());
5145
5766
  this.configureSheets(spreadsheet);
5767
+ this.spreadsheetService.componentInitialized.next();
5146
5768
  });
5147
5769
  this.subs.add(this.spreadsheetService.sheetsChanged.subscribe(this.onSheetsChanged.bind(this)));
5148
5770
  this.subs.add(this.spreadsheetService.activeSheetChanged.subscribe(this.onActiveSheetChanged.bind(this)));
5149
5771
  this.subs.add(this.spreadsheetService.selectionChanged.subscribe(range => {
5150
5772
  this.currentRange = range;
5151
- if (this.popupRef) {
5152
- this.popupRef.close();
5153
- this.popupRef = null;
5154
- }
5773
+ this.closePopup();
5155
5774
  }));
5156
5775
  this.spreadsheetService.dialogContainer = this.dialogContainer;
5157
5776
  });
5158
5777
  this.registerEditors();
5778
+ this.spreadsheetService.spreadsheetComponent = this;
5779
+ this.sortMenuItems = [{
5780
+ text: this.messageFor('sortAsc'),
5781
+ svgIcon: this.sortAscSmallIcon,
5782
+ icon: 'sort-asc-small'
5783
+ }, {
5784
+ text: this.messageFor('sortDesc'),
5785
+ svgIcon: this.sortDescSmallIcon,
5786
+ icon: 'sort-desc-small'
5787
+ }];
5159
5788
  }
5160
5789
  ngOnChanges(changes) {
5161
5790
  const dynamicOptions = [
@@ -5198,6 +5827,18 @@ class SpreadsheetComponent {
5198
5827
  this.contextMenuItems = this.contextMenuItemsForTarget(targetType, e.showUnhide, e.showUnmerge);
5199
5828
  this.contextMenu.show({ top: e.originalEvent.pageY, left: e.originalEvent.pageX });
5200
5829
  }
5830
+ /**
5831
+ * @hidden
5832
+ */
5833
+ isChecked = (dataItem) => {
5834
+ if (this.containsItem(dataItem)) {
5835
+ return "checked";
5836
+ }
5837
+ if (this.isIndeterminate(dataItem.items)) {
5838
+ return "indeterminate";
5839
+ }
5840
+ return "none";
5841
+ };
5201
5842
  /**
5202
5843
  * @hidden
5203
5844
  */
@@ -5301,11 +5942,116 @@ class SpreadsheetComponent {
5301
5942
  this.selectedMenuItem = this.menuItems.find(item => item.active);
5302
5943
  }
5303
5944
  }
5945
+ /**
5946
+ * @hidden
5947
+ */
5948
+ onToggle(expanded, filterType) {
5949
+ this[`${filterType}Expanded`] = expanded;
5950
+ if (expanded) {
5951
+ const otherFilterType = filterType === 'condition' ? 'value' : 'condition';
5952
+ this[`${otherFilterType}Expanded`] = false;
5953
+ }
5954
+ this.cdr.detectChanges();
5955
+ }
5956
+ /**
5957
+ * @hidden
5958
+ */
5959
+ filterApply(filterType) {
5960
+ if (!this.currentFilterOptions) {
5961
+ return;
5962
+ }
5963
+ let filterData;
5964
+ if (filterType === 'value') {
5965
+ const checkedValues = this.checkedKeys
5966
+ .filter(key => key !== this.messageFor('filterMenuAll'))
5967
+ .map(key => {
5968
+ const item = this.findItemByText(this.rangeFilterValuesList, key);
5969
+ return item ? item.unformattedValue : key;
5970
+ });
5971
+ const hasBlanks = checkedValues.some(v => v === undefined || v === null);
5972
+ const nonBlankValues = checkedValues.filter(v => v !== undefined && v !== null);
5973
+ filterData = {
5974
+ blanks: hasBlanks,
5975
+ values: nonBlankValues.length > 0 ? nonBlankValues : undefined
5976
+ };
5977
+ }
5978
+ else if (this.selectedCondition?.comparer !== 'none' && this.conditionValue !== null && this.conditionValue !== undefined) {
5979
+ filterData = {
5980
+ criteria: [{
5981
+ operator: this.selectedCondition.comparer,
5982
+ value: this.conditionValue
5983
+ }]
5984
+ };
5985
+ }
5986
+ else if (this.selectedCondition?.comparer === 'none') {
5987
+ this.spreadsheetWidget.executeCommand({
5988
+ command: 'ClearFilterCommand',
5989
+ options: { column: this.currentFilterOptions?.column }
5990
+ });
5991
+ this.closePopup();
5992
+ return;
5993
+ }
5994
+ if (filterData) {
5995
+ const commandOptions = {
5996
+ column: this.currentFilterOptions.column,
5997
+ operatingRange: this.currentFilterOptions.range
5998
+ };
5999
+ if (filterType === 'value') {
6000
+ commandOptions.valueFilter = filterData;
6001
+ }
6002
+ else {
6003
+ commandOptions.customFilter = filterData;
6004
+ }
6005
+ this.spreadsheetWidget.executeCommand({
6006
+ command: 'ApplyFilterCommand',
6007
+ options: commandOptions
6008
+ });
6009
+ }
6010
+ this.closePopup();
6011
+ }
6012
+ /**
6013
+ * @hidden
6014
+ */
6015
+ filterClear() {
6016
+ this.spreadsheetWidget.executeCommand({
6017
+ command: 'ClearFilterCommand',
6018
+ options: { column: this.currentFilterOptions?.column }
6019
+ });
6020
+ this.closePopup();
6021
+ }
6022
+ /**
6023
+ * @hidden
6024
+ */
6025
+ onSortItemClick(item) {
6026
+ const dir = item.text === this.messageFor('sortAsc') ? 'asc' : 'desc';
6027
+ const noHeaderRange = this.currentFilterOptions?.range?.resize({ top: 1 });
6028
+ const options = {
6029
+ value: dir,
6030
+ sheet: false,
6031
+ operatingRange: noHeaderRange,
6032
+ column: this.currentFilterOptions?.column
6033
+ };
6034
+ this.spreadsheetWidget.executeCommand({ command: 'SortCommand', options });
6035
+ }
6036
+ /**
6037
+ * @hidden
6038
+ */
6039
+ closePopup() {
6040
+ if (this.popupRef) {
6041
+ this.popupRef.close();
6042
+ this.popupRef = null;
6043
+ }
6044
+ if (this.popupPositionChangeSub) {
6045
+ this.popupPositionChangeSub.unsubscribe();
6046
+ this.popupPositionChangeSub = null;
6047
+ }
6048
+ }
5304
6049
  onChange = (e) => {
5305
6050
  hasObservers(this.change) && this.change.emit(e);
5306
6051
  this.spreadsheetService.selectionChanged.next(e.range);
5307
6052
  };
5308
6053
  onSelectionChange = (e) => {
6054
+ this.closePopup();
5309
6055
  hasObservers(this.selectionChange) && this.selectionChange.emit(e);
5310
6056
  this.spreadsheetService.selectionChanged.next(e.range);
5311
6057
  };
@@ -5341,6 +6087,25 @@ class SpreadsheetComponent {
5341
6087
  this.updateActiveSheet(this.spreadsheetService.activeSheet);
5342
6088
  });
5343
6089
  }
6090
+ onClipboardEvent(event, type) {
6091
+ if (hasObservers(this.clipboard)) {
6092
+ this.ngZone.runOutsideAngular(() => {
6093
+ setTimeout(() => {
6094
+ const { preventDefault, isDefaultPrevented, clipboardContent, range, sender } = event;
6095
+ const workbookClipboardContent = clipboardContent || this.spreadsheetWidget.workbook._clipboard._internalContent;
6096
+ const eventArgs = {
6097
+ type,
6098
+ clipboardContent: { data: workbookClipboardContent.data, mergedCells: workbookClipboardContent.mergedCells },
6099
+ range,
6100
+ sender,
6101
+ preventDefault: preventDefault.bind(event),
6102
+ isDefaultPrevented: isDefaultPrevented.bind(event)
6103
+ };
6104
+ this.ngZone.run(() => this.clipboard.emit(eventArgs));
6105
+ });
6106
+ });
6107
+ }
6108
+ }
5344
6109
  get options() {
5345
6110
  return {
5346
6111
  activeSheet: this.activeSheet,
@@ -5366,12 +6131,17 @@ class SpreadsheetComponent {
5366
6131
  formulaCellInputRef: { current: this.formulaCellInputRef.current },
5367
6132
  nameBoxRef: { current: this.nameBoxRef.current },
5368
6133
  getIconHTMLString: (options) => {
6134
+ if (typeof options === 'string' && options === 'k-i-caret-alt-down') {
6135
+ //the caret-alt-down filter button icon has different config coming from the common package and has to be handled separately
6136
+ options = { iconName: 'caret-alt-down', svgIcon: caretAltDownIcon };
6137
+ }
5369
6138
  const iconWrapper = this.container.createComponent(IconWrapperComponent);
5370
6139
  iconWrapper.instance.name = options.iconName;
5371
6140
  iconWrapper.instance.svgIcon = options.svgIcon;
5372
6141
  iconWrapper.changeDetectorRef.detectChanges();
5373
6142
  return iconWrapper.instance.element.nativeElement;
5374
- }
6143
+ },
6144
+ createFilterMenu: this.createFilterMenu.bind(this)
5375
6145
  };
5376
6146
  }
5377
6147
  contextMenuItemsForTarget(target, unhide, unmerge) {
@@ -5546,8 +6316,7 @@ class SpreadsheetComponent {
5546
6316
  registerEditor('_validation_list', () => {
5547
6317
  return {
5548
6318
  edit: (options) => {
5549
- this.popupRef?.close();
5550
- this.popupRef = null;
6319
+ this.closePopup();
5551
6320
  this.popupRef = this.popupService.open({
5552
6321
  anchor: options.view.element.querySelector('.k-spreadsheet-editor-button'),
5553
6322
  content: ListEditorComponent,
@@ -5557,16 +6326,14 @@ class SpreadsheetComponent {
5557
6326
  });
5558
6327
  const list = this.popupRef.content.instance;
5559
6328
  list.itemSelect.subscribe((item) => {
5560
- this.popupRef.close();
5561
- this.popupRef = null;
6329
+ this.closePopup();
5562
6330
  const itemValue = item.value;
5563
6331
  if (isPresent(itemValue)) {
5564
6332
  options.callback(itemValue);
5565
6333
  }
5566
6334
  });
5567
6335
  list.close.subscribe(() => {
5568
- this.popupRef.close();
5569
- this.popupRef = null;
6336
+ this.closePopup();
5570
6337
  });
5571
6338
  const items = options.validation.from.value;
5572
6339
  const data = [];
@@ -5585,8 +6352,7 @@ class SpreadsheetComponent {
5585
6352
  registerEditor('_validation_date', () => {
5586
6353
  return {
5587
6354
  edit: (options) => {
5588
- this.popupRef?.close();
5589
- this.popupRef = null;
6355
+ this.closePopup();
5590
6356
  this.popupRef = this.popupService.open({
5591
6357
  anchor: options.view.element.querySelector('.k-spreadsheet-editor-button'),
5592
6358
  content: CalendarComponent,
@@ -5595,8 +6361,7 @@ class SpreadsheetComponent {
5595
6361
  });
5596
6362
  const calendar = this.popupRef.content.instance;
5597
6363
  calendar.valueChange.subscribe((value) => {
5598
- this.popupRef.close();
5599
- this.popupRef = null;
6364
+ this.closePopup();
5600
6365
  if (!options.range.format()) {
5601
6366
  options.range.format('yyyy-mm-dd');
5602
6367
  }
@@ -5695,12 +6460,6 @@ class SpreadsheetComponent {
5695
6460
  });
5696
6461
  });
5697
6462
  }
5698
- closePopup() {
5699
- if (this.popupRef) {
5700
- this.popupRef.close();
5701
- this.popupRef = null;
5702
- }
5703
- }
5704
6463
  isValidFormula(validation) {
5705
6464
  const formula = calc.runtime.Formula;
5706
6465
  return validation instanceof formula && rowAndColPresent(validation.value);
@@ -5708,8 +6467,196 @@ class SpreadsheetComponent {
5708
6467
  createDate(validation, sheet) {
5709
6468
  return new Date(serialToDate(isPresent(sheet) ? sheet.range(validation.value.row, validation.value.col).value() : validation));
5710
6469
  }
5711
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpreadsheetComponent, deps: [{ token: i0.NgZone }, { token: i1$4.IntlService }, { token: i0.ElementRef }, { token: i1.LocalizationService }, { token: SpreadsheetService }, { token: SpreadsheetToolsService }, { token: ErrorHandlingService }, { token: i1$2.DialogService }, { token: i1$1.PopupService }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component });
5712
- 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: [
6470
+ createFilterMenu(options) {
6471
+ this.closePopup();
6472
+ this.currentFilterOptions = options;
6473
+ if (this.filterMenuOpened) {
6474
+ this.filterMenuOpened = false;
6475
+ return {
6476
+ bind: () => { },
6477
+ openFor: () => { },
6478
+ close: () => { },
6479
+ destroy: () => { }
6480
+ };
6481
+ }
6482
+ this.ngZone.onStable.pipe(take(1)).subscribe(() => {
6483
+ const childItems = this.extractColumnFilterValues(options.range, options.column);
6484
+ const parentItem = {
6485
+ text: this.messageFor('filterMenuAll'),
6486
+ value: null,
6487
+ checked: childItems.every(i => i.checked),
6488
+ items: childItems
6489
+ };
6490
+ this.rangeFilterValuesList = [parentItem];
6491
+ this.checkedKeys = [parentItem, ...childItems].filter(i => i.checked).map(i => i.text);
6492
+ });
6493
+ this.filterConditionsList = [
6494
+ { type: 'none', comparerType: 'none', comparer: 'none', text: this.messageFor('filterNoneOperator') },
6495
+ { type: 'string', comparerType: 'string_contains', comparer: 'contains', text: this.messageFor('filterContainsOperator') },
6496
+ { type: 'string', comparerType: 'string_doesnotcontain', comparer: 'doesnotcontain', text: this.messageFor('filterNotContainsOperator') },
6497
+ { type: 'string', comparerType: 'string_startswith', comparer: 'startswith', text: this.messageFor('filterStartsWithOperator') },
6498
+ { type: 'string', comparerType: 'string_endswith', comparer: 'endswith', text: this.messageFor('filterEndsWithOperator') },
6499
+ { type: 'string', comparerType: 'string_matches', comparer: 'eq', text: this.messageFor('filterMatchesOperator') },
6500
+ { type: 'string', comparerType: 'string_doesnotmatch', comparer: 'neq', text: this.messageFor('filterNotMatchesOperator') },
6501
+ { type: 'date', comparerType: 'date_eq', comparer: 'eq', text: this.messageFor('filterDateEqOperator') },
6502
+ { type: 'date', comparerType: 'date_neq', comparer: 'neq', text: this.messageFor('filterDateNotEqOperator') },
6503
+ { type: 'date', comparerType: 'date_lt', comparer: 'lt', text: this.messageFor('filterBeforeOperator') },
6504
+ { type: 'date', comparerType: 'date_gt', comparer: 'gt', text: this.messageFor('filterAfterOperator') },
6505
+ { type: 'number', comparerType: 'number_eq', comparer: 'eq', text: this.messageFor('filterEqOperator') },
6506
+ { type: 'number', comparerType: 'number_neq', comparer: 'neq', text: this.messageFor('filterNotEqOperator') },
6507
+ { type: 'number', comparerType: 'number_gte', comparer: 'gte', text: this.messageFor('filterGteOperator') },
6508
+ { type: 'number', comparerType: 'number_gt', comparer: 'gt', text: this.messageFor('filterGtOperator') },
6509
+ { type: 'number', comparerType: 'number_lte', comparer: 'lte', text: this.messageFor('filterLteOperator') },
6510
+ { type: 'number', comparerType: 'number_lt', comparer: 'lt', text: this.messageFor('filterLtOperator') }
6511
+ ];
6512
+ const currentSheetFilter = this.spreadsheetWidget.activeSheet().filter();
6513
+ const columnFilter = currentSheetFilter?.columns?.find((col) => col.index === options.column);
6514
+ if (columnFilter) {
6515
+ const filter = columnFilter.filter.toJSON();
6516
+ if (filter.filter === 'custom') {
6517
+ const valueType = typeof filter.criteria[0].value === 'object' ? 'date' : typeof filter.criteria[0].value;
6518
+ this.selectedCondition = this.filterConditionsList.find(c => (c.comparer === filter?.criteria?.[0]?.operator) && (c.type === valueType));
6519
+ this.conditionValue = filter?.criteria?.[0]?.value;
6520
+ }
6521
+ else {
6522
+ this.checkedKeys = filter.values;
6523
+ }
6524
+ }
6525
+ else {
6526
+ this.selectedCondition = this.filterConditionsList[0];
6527
+ }
6528
+ return {
6529
+ bind: (_eventName, _handler) => { },
6530
+ openFor: (anchor) => {
6531
+ this.popupRef = this.popupService.open({
6532
+ anchor,
6533
+ content: this.filterMenuTemplate,
6534
+ popupAlign: { horizontal: 'left', vertical: 'top' },
6535
+ anchorAlign: { horizontal: 'left', vertical: 'bottom' },
6536
+ popupClass: 'k-spreadsheet-filter-menu k-column-menu k-group k-reset'
6537
+ });
6538
+ this.popupPositionChangeSub = this.popupRef.popupPositionChange.subscribe(({ offset }) => {
6539
+ if (offset.top === 0 && offset.left === 0) {
6540
+ this.closePopup();
6541
+ this.filterMenuOpened = false;
6542
+ }
6543
+ });
6544
+ this.filterMenuOpened = true;
6545
+ },
6546
+ close: () => { this.closePopup(); this.filterMenuOpened = false; },
6547
+ destroy: () => { this.closePopup(); this.filterMenuOpened = false; }
6548
+ };
6549
+ }
6550
+ extractColumnFilterValues(range, column) {
6551
+ const results = [];
6552
+ const sheet = range.sheet();
6553
+ const columnRange = range.column(column).resize({ top: 1 });
6554
+ const blanksMessage = this.localization.get('blankValues');
6555
+ columnRange.forEachCell((rowIndex, _colIndex, cellData) => {
6556
+ const isVisible = !sheet.isHiddenRow(rowIndex);
6557
+ let cellValue = cellData.value;
6558
+ const unformattedValue = cellValue;
6559
+ let displayText;
6560
+ let valueType;
6561
+ if (cellValue === undefined) {
6562
+ valueType = 'blank';
6563
+ }
6564
+ else if (cellData.format) {
6565
+ valueType = formatting.type(cellValue, cellData.format);
6566
+ }
6567
+ else {
6568
+ valueType = typeof cellValue;
6569
+ }
6570
+ if (cellValue !== null && cellData.format) {
6571
+ displayText = formatting.text(cellValue, cellData.format);
6572
+ }
6573
+ else {
6574
+ displayText = valueType === 'blank' ? blanksMessage : cellValue;
6575
+ }
6576
+ if (valueType === 'percent' || valueType === 'currency') {
6577
+ valueType = 'number';
6578
+ }
6579
+ if (valueType === 'date') {
6580
+ cellValue = serialToDate(cellValue);
6581
+ }
6582
+ results.push({
6583
+ dataType: valueType,
6584
+ value: cellValue,
6585
+ text: displayText,
6586
+ checked: isVisible,
6587
+ unformattedValue
6588
+ });
6589
+ });
6590
+ const uniqueValuesSorted = this.removeDuplicateValues(results).sort(this.compareFilterValues);
6591
+ return uniqueValuesSorted;
6592
+ }
6593
+ removeDuplicateValues(values) {
6594
+ const uniqueMap = new Map();
6595
+ for (const item of values) {
6596
+ const key = `${item.dataType}:${item.value}`;
6597
+ if (!uniqueMap.has(key)) {
6598
+ uniqueMap.set(key, item);
6599
+ }
6600
+ }
6601
+ return Array.from(uniqueMap.values());
6602
+ }
6603
+ compareFilterValues(a, b) {
6604
+ if (a.dataType === b.dataType) {
6605
+ switch (a.dataType) {
6606
+ case 'number':
6607
+ return a.value - b.value;
6608
+ case 'date':
6609
+ return a.value.getTime() - b.value.getTime();
6610
+ case 'blank':
6611
+ return 0;
6612
+ default:
6613
+ return String(a.value).localeCompare(String(b.value));
6614
+ }
6615
+ }
6616
+ if (a.dataType === 'blank')
6617
+ return -1;
6618
+ if (b.dataType === 'blank')
6619
+ return 1;
6620
+ if (a.dataType === 'number')
6621
+ return -1;
6622
+ if (b.dataType === 'number')
6623
+ return 1;
6624
+ if (a.dataType === 'date')
6625
+ return -1;
6626
+ if (b.dataType === 'date')
6627
+ return 1;
6628
+ return 0;
6629
+ }
6630
+ containsItem(item) {
6631
+ return this.checkedKeys.indexOf(item.text) > -1;
6632
+ }
6633
+ findItemByText(items, text) {
6634
+ for (const item of items) {
6635
+ if (item.text === text) {
6636
+ return item;
6637
+ }
6638
+ if (item.items && item.items.length > 0) {
6639
+ const found = this.findItemByText(item.items, text);
6640
+ if (found) {
6641
+ return found;
6642
+ }
6643
+ }
6644
+ }
6645
+ return null;
6646
+ }
6647
+ isIndeterminate(items = []) {
6648
+ let idx = 0;
6649
+ let item;
6650
+ while ((item = items[idx])) {
6651
+ if (this.isIndeterminate(item.items) || this.containsItem(item)) {
6652
+ return true;
6653
+ }
6654
+ idx += 1;
6655
+ }
6656
+ return false;
6657
+ }
6658
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpreadsheetComponent, deps: [{ token: i0.NgZone }, { token: i1$4.IntlService }, { token: i0.ElementRef }, { token: i1.LocalizationService }, { token: SpreadsheetService }, { token: SpreadsheetToolsService }, { token: ErrorHandlingService }, { token: i1$2.DialogService }, { token: i1$1.PopupService }, { token: i0.ViewContainerRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
6659
+ 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: [
5713
6660
  SpreadsheetLocalizationService,
5714
6661
  SpreadsheetService,
5715
6662
  {
@@ -5723,7 +6670,7 @@ class SpreadsheetComponent {
5723
6670
  SpreadsheetToolsService,
5724
6671
  PopupService,
5725
6672
  ErrorHandlingService
5726
- ], 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: `
6673
+ ], 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: `
5727
6674
  <ng-container
5728
6675
  kendoSpreadsheetLocalizedMessages
5729
6676
  i18n-background="kendo.spreadsheet.background|The title of the tool that changes the text background color."
@@ -5947,7 +6894,65 @@ class SpreadsheetComponent {
5947
6894
  i18n-sheetMoveRight="kendo.spreadsheet.sheetMoveRight|The text of the Sheet menu Move Right option."
5948
6895
  sheetMoveRight="Move Right"
5949
6896
  i18n-invalidNameError="kendo.spreadsheet.invalidNameError|The content of the dialog that warns about invalid name input."
5950
- invalidNameError="{{ 'Invalid name: {inputValue}' }}">
6897
+ invalidNameError="{{ 'Invalid name: {inputValue}' }}"
6898
+ i18n-cantSortMixedCells="kendo.spreadsheet.cantSortMixedCells|The content of the dialog that warns about sorting range containing cells of mixed shapes."
6899
+ cantSortMixedCells="Cannot sort range containing cells of mixed shapes"
6900
+ i18n-cantSortNullRef="kendo.spreadsheet.cantSortNullRef|The content of the dialog that warns about sorting incorrect (empty) range."
6901
+ cantSortNullRef="Cannot sort empty selection"
6902
+ i18n-filterApply="kendo.spreadsheet.filterApply|The text of the **Apply** button in the filter menu."
6903
+ filterApply="Apply"
6904
+ i18n-filterClear="kendo.spreadsheet.filterClear|The text of the **Clear** button in the filter menu."
6905
+ filterClear="Clear"
6906
+ i18n-filterMenuAll="kendo.spreadsheet.filterMenuAll|The text of the **All** grouping item in the filter menu."
6907
+ filterMenuAll="All"
6908
+ i18n-blankValues="kendo.spreadsheet.blankValues|The text for the blank (empty) values."
6909
+ blankValues="Blank"
6910
+ i18n-filterNoneOperator="kendo.spreadsheet.filterNoneOperator|The text for the **none** filter operator."
6911
+ filterNoneOperator="None"
6912
+ i18n-filterContainsOperator="kendo.spreadsheet.filterContainsOperator|The text of the **contains** filter operator"
6913
+ filterContainsOperator="Text contains"
6914
+ i18n-filterNotContainsOperator="kendo.spreadsheet.filterNotContainsOperator|The text of the **does not contain** filter operator"
6915
+ filterNotContainsOperator="Text does not contain"
6916
+ i18n-filterStartsWithOperator="kendo.spreadsheet.filterStartsWithOperator|The text of the **starts with** filter operator"
6917
+ filterStartsWithOperator="Text starts with"
6918
+ i18n-filterEndsWithOperator="kendo.spreadsheet.filterEndsWithOperator|The text of the **ends with** filter operator"
6919
+ filterEndsWithOperator="Text ends with"
6920
+ i18n-filterMatchesOperator="kendo.spreadsheet.filterMatchesOperator|The text of the **matches** filter operator"
6921
+ filterMatchesOperator="Text matches"
6922
+ i18n-filterNotMatchesOperator="kendo.spreadsheet.filterNotMatchesOperator|The text of the **does not match** filter operator"
6923
+ filterNotMatchesOperator="Text does not match"
6924
+ i18n-filterDateEqOperator="kendo.spreadsheet.filterDateEqOperator|The text of the **Date is** filter operator"
6925
+ filterDateEqOperator="Date is"
6926
+ i18n-filterDateNotEqOperator="kendo.spreadsheet.filterDateNotEqOperator|The text of the **Date is not** filter operator"
6927
+ filterDateNotEqOperator="Date is not"
6928
+ i18n-filterBeforeOperator="kendo.spreadsheet.filterBeforeOperator|The text of the **Date is before** filter operator"
6929
+ filterBeforeOperator="Date is before"
6930
+ i18n-filterAfterOperator="kendo.spreadsheet.filterAfterOperator|The text of the **Date is after** filter operator"
6931
+ filterAfterOperator="Date is after"
6932
+ i18n-filterEqOperator="kendo.spreadsheet.filterEqOperator|Sets the text for the **Equal (Is equal to)** filter operator."
6933
+ filterEqOperator="Is equal to"
6934
+ i18n-filterNotEqOperator="kendo.spreadsheet.filterNotEqOperator|Sets the text for the **Not equal (Is not equal to)** filter operator."
6935
+ filterNotEqOperator="Is not equal to"
6936
+ i18n-filterGteOperator="kendo.spreadsheet.filterGteOperator|The text of the **greater than or equal to** filter operator"
6937
+ filterGteOperator="Is greater than or equal to"
6938
+ i18n-filterGtOperator="kendo.spreadsheet.filterGtOperator|The text of the **greater than** filter operator"
6939
+ filterGtOperator="Is greater than"
6940
+ i18n-filterLteOperator="kendo.spreadsheet.filterLteOperator|The text of the **less than or equal to** filter operator"
6941
+ filterLteOperator="Is less than or equal to"
6942
+ i18n-filterLtOperator="kendo.spreadsheet.filterLtOperator|The text of the **less than** filter operator"
6943
+ filterLtOperator="Is less than"
6944
+ i18n-filterMenuConditionItem="kendo.spreadsheet.filterMenuConditionItem|The text of the **Filter by condition** menu item."
6945
+ filterMenuConditionItem="Filter by condition"
6946
+ i18n-filterMenuValueItem="kendo.spreadsheet.filterMenuValueItem|The text of the **Filter by value** menu item."
6947
+ filterMenuValueItem="Filter by value"
6948
+ i18n-sort="kendo.spreadsheet.sort|The title of the Sort ToolBar tool."
6949
+ sort="Sort"
6950
+ i18n-sortAsc="kendo.spreadsheet.sortAsc|The text of the **Sort range A to Z** option."
6951
+ sortAsc="Sort range A to Z"
6952
+ i18n-sortDesc="kendo.spreadsheet.sortDesc|The text of the **Sort range Z to A** option."
6953
+ sortDesc="Sort range Z to A"
6954
+ i18n-unsort="kendo.spreadsheet.unsort|The text of the **Unsort** option."
6955
+ unsort="Unsort">
5951
6956
  </ng-container>
5952
6957
  <div class="k-spreadsheet-header">
5953
6958
  <kendo-menu kendoSpreadsheetMenu (select)="onMenuItemSelect($event)">
@@ -6042,6 +7047,10 @@ class SpreadsheetComponent {
6042
7047
  class="k-spreadsheet-toolbar"
6043
7048
  [overflow]="overflow">
6044
7049
  <kendo-toolbar-button kendoSpreadsheetDataValidation></kendo-toolbar-button>
7050
+ <kendo-toolbar-separator></kendo-toolbar-separator>
7051
+ <kendo-toolbar-button kendoSpreadsheetFilter></kendo-toolbar-button>
7052
+ <kendo-toolbar-separator></kendo-toolbar-separator>
7053
+ <kendo-toolbar-dropdownbutton kendoSpreadsheetSort></kendo-toolbar-dropdownbutton>
6045
7054
  </kendo-toolbar>
6046
7055
  }
6047
7056
  </div>
@@ -6075,16 +7084,98 @@ class SpreadsheetComponent {
6075
7084
  [sheetDescriptors]="sheets">
6076
7085
  </div>
6077
7086
  <ng-container #dialogContainer></ng-container>
6078
-
6079
- <kendo-contextmenu
6080
- #contextMenu
7087
+
7088
+ <kendo-contextmenu #contextMenu
6081
7089
  [items]="contextMenuItems"
6082
- (select)="onContextMenuSelect($event)"></kendo-contextmenu>
7090
+ (select)="onContextMenuSelect($event)">
7091
+ </kendo-contextmenu>
6083
7092
 
7093
+ <ng-template #filterMenuTemplate>
7094
+ <kendo-spreadsheet-filtermenu-item
7095
+ [innerMenuItems]="sortMenuItems"
7096
+ (itemClick)="onSortItemClick($event)">
7097
+ </kendo-spreadsheet-filtermenu-item>
7098
+ <kendo-spreadsheet-filtermenu-item
7099
+ [expandable]="true"
7100
+ [expanded]="conditionExpanded"
7101
+ expanderClass="k-spreadsheet-condition-filter"
7102
+ [innerMenuItems]="[{text: messageFor('filterMenuConditionItem')}]"
7103
+ (collapse)="onToggle(false, 'condition')"
7104
+ (expand)="onToggle(true, 'condition')">
7105
+ <ng-template kendoSpreadsheetFilterMenuItemContentTemplate>
7106
+ <div class="k-details-content">
7107
+ <kendo-dropdownlist
7108
+ [data]="filterConditionsList"
7109
+ textField="text"
7110
+ valueField="comparerType"
7111
+ [(value)]="selectedCondition">
7112
+ </kendo-dropdownlist>
7113
+ @if (selectedCondition?.type === 'string') {
7114
+ <kendo-textbox [(value)]="conditionValue"></kendo-textbox>
7115
+ } @else if (selectedCondition?.type === 'number') {
7116
+ <kendo-numerictextbox [(value)]="conditionValue"></kendo-numerictextbox>
7117
+ } @else if (selectedCondition?.type === 'date') {
7118
+ <kendo-datepicker [(value)]="conditionValue"></kendo-datepicker>
7119
+ }
7120
+ </div>
7121
+ <div class="k-actions k-actions-stretched k-actions-horizontal">
7122
+ <button
7123
+ kendoButton
7124
+ themeColor="primary"
7125
+ (click)="filterApply('condition')">
7126
+ {{ messageFor('filterApply') }}
7127
+ </button>
7128
+ <button
7129
+ kendoButton
7130
+ (click)="filterClear()">
7131
+ {{ messageFor('filterClear') }}
7132
+ </button>
7133
+ </div>
7134
+ </ng-template>
7135
+ </kendo-spreadsheet-filtermenu-item>
7136
+ <kendo-spreadsheet-filtermenu-item
7137
+ [expandable]="true"
7138
+ [expanded]="valueExpanded"
7139
+ [innerMenuItems]="[{text: messageFor('filterMenuValueItem')}]"
7140
+ (collapse)="onToggle(false, 'value')"
7141
+ (expand)="onToggle(true, 'value')">
7142
+ <ng-template kendoSpreadsheetFilterMenuItemContentTemplate>
7143
+ <div class="k-spreadsheet-value-treeview-wrapper">
7144
+ <kendo-treeview #treeview
7145
+ kendoTreeViewHierarchyBinding
7146
+ childrenField="items"
7147
+ textField="text"
7148
+ [nodes]="rangeFilterValuesList"
7149
+ kendoTreeViewExpandable
7150
+ [(expandedKeys)]="expandedKeys"
7151
+ [filterable]="true"
7152
+ [kendoTreeViewCheckable]="{checkOnClick: true}"
7153
+ [(checkedKeys)]="checkedKeys"
7154
+ checkBy="text"
7155
+ [isChecked]="isChecked">
7156
+ </kendo-treeview>
7157
+ </div>
7158
+ <div class="k-actions k-actions-stretched k-actions-horizontal">
7159
+ <button
7160
+ kendoButton
7161
+ themeColor="primary"
7162
+ (click)="filterApply('value')">
7163
+ {{ messageFor('filterApply') }}
7164
+ </button>
7165
+ <button
7166
+ kendoButton
7167
+ (click)="filterClear()">
7168
+ {{ messageFor('filterClear') }}
7169
+ </button>
7170
+ </div>
7171
+ </ng-template>
7172
+ </kendo-spreadsheet-filtermenu-item>
7173
+ </ng-template>
7174
+
6084
7175
  @if (showLicenseWatermark) {
6085
7176
  <div kendoWatermarkOverlay [licenseMessage]="licenseMessage"></div>
6086
7177
  }
6087
- `, 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]" }] });
7178
+ `, 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]" }] });
6088
7179
  }
6089
7180
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpreadsheetComponent, decorators: [{
6090
7181
  type: Component,
@@ -6330,7 +7421,65 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
6330
7421
  i18n-sheetMoveRight="kendo.spreadsheet.sheetMoveRight|The text of the Sheet menu Move Right option."
6331
7422
  sheetMoveRight="Move Right"
6332
7423
  i18n-invalidNameError="kendo.spreadsheet.invalidNameError|The content of the dialog that warns about invalid name input."
6333
- invalidNameError="{{ 'Invalid name: {inputValue}' }}">
7424
+ invalidNameError="{{ 'Invalid name: {inputValue}' }}"
7425
+ i18n-cantSortMixedCells="kendo.spreadsheet.cantSortMixedCells|The content of the dialog that warns about sorting range containing cells of mixed shapes."
7426
+ cantSortMixedCells="Cannot sort range containing cells of mixed shapes"
7427
+ i18n-cantSortNullRef="kendo.spreadsheet.cantSortNullRef|The content of the dialog that warns about sorting incorrect (empty) range."
7428
+ cantSortNullRef="Cannot sort empty selection"
7429
+ i18n-filterApply="kendo.spreadsheet.filterApply|The text of the **Apply** button in the filter menu."
7430
+ filterApply="Apply"
7431
+ i18n-filterClear="kendo.spreadsheet.filterClear|The text of the **Clear** button in the filter menu."
7432
+ filterClear="Clear"
7433
+ i18n-filterMenuAll="kendo.spreadsheet.filterMenuAll|The text of the **All** grouping item in the filter menu."
7434
+ filterMenuAll="All"
7435
+ i18n-blankValues="kendo.spreadsheet.blankValues|The text for the blank (empty) values."
7436
+ blankValues="Blank"
7437
+ i18n-filterNoneOperator="kendo.spreadsheet.filterNoneOperator|The text for the **none** filter operator."
7438
+ filterNoneOperator="None"
7439
+ i18n-filterContainsOperator="kendo.spreadsheet.filterContainsOperator|The text of the **contains** filter operator"
7440
+ filterContainsOperator="Text contains"
7441
+ i18n-filterNotContainsOperator="kendo.spreadsheet.filterNotContainsOperator|The text of the **does not contain** filter operator"
7442
+ filterNotContainsOperator="Text does not contain"
7443
+ i18n-filterStartsWithOperator="kendo.spreadsheet.filterStartsWithOperator|The text of the **starts with** filter operator"
7444
+ filterStartsWithOperator="Text starts with"
7445
+ i18n-filterEndsWithOperator="kendo.spreadsheet.filterEndsWithOperator|The text of the **ends with** filter operator"
7446
+ filterEndsWithOperator="Text ends with"
7447
+ i18n-filterMatchesOperator="kendo.spreadsheet.filterMatchesOperator|The text of the **matches** filter operator"
7448
+ filterMatchesOperator="Text matches"
7449
+ i18n-filterNotMatchesOperator="kendo.spreadsheet.filterNotMatchesOperator|The text of the **does not match** filter operator"
7450
+ filterNotMatchesOperator="Text does not match"
7451
+ i18n-filterDateEqOperator="kendo.spreadsheet.filterDateEqOperator|The text of the **Date is** filter operator"
7452
+ filterDateEqOperator="Date is"
7453
+ i18n-filterDateNotEqOperator="kendo.spreadsheet.filterDateNotEqOperator|The text of the **Date is not** filter operator"
7454
+ filterDateNotEqOperator="Date is not"
7455
+ i18n-filterBeforeOperator="kendo.spreadsheet.filterBeforeOperator|The text of the **Date is before** filter operator"
7456
+ filterBeforeOperator="Date is before"
7457
+ i18n-filterAfterOperator="kendo.spreadsheet.filterAfterOperator|The text of the **Date is after** filter operator"
7458
+ filterAfterOperator="Date is after"
7459
+ i18n-filterEqOperator="kendo.spreadsheet.filterEqOperator|Sets the text for the **Equal (Is equal to)** filter operator."
7460
+ filterEqOperator="Is equal to"
7461
+ i18n-filterNotEqOperator="kendo.spreadsheet.filterNotEqOperator|Sets the text for the **Not equal (Is not equal to)** filter operator."
7462
+ filterNotEqOperator="Is not equal to"
7463
+ i18n-filterGteOperator="kendo.spreadsheet.filterGteOperator|The text of the **greater than or equal to** filter operator"
7464
+ filterGteOperator="Is greater than or equal to"
7465
+ i18n-filterGtOperator="kendo.spreadsheet.filterGtOperator|The text of the **greater than** filter operator"
7466
+ filterGtOperator="Is greater than"
7467
+ i18n-filterLteOperator="kendo.spreadsheet.filterLteOperator|The text of the **less than or equal to** filter operator"
7468
+ filterLteOperator="Is less than or equal to"
7469
+ i18n-filterLtOperator="kendo.spreadsheet.filterLtOperator|The text of the **less than** filter operator"
7470
+ filterLtOperator="Is less than"
7471
+ i18n-filterMenuConditionItem="kendo.spreadsheet.filterMenuConditionItem|The text of the **Filter by condition** menu item."
7472
+ filterMenuConditionItem="Filter by condition"
7473
+ i18n-filterMenuValueItem="kendo.spreadsheet.filterMenuValueItem|The text of the **Filter by value** menu item."
7474
+ filterMenuValueItem="Filter by value"
7475
+ i18n-sort="kendo.spreadsheet.sort|The title of the Sort ToolBar tool."
7476
+ sort="Sort"
7477
+ i18n-sortAsc="kendo.spreadsheet.sortAsc|The text of the **Sort range A to Z** option."
7478
+ sortAsc="Sort range A to Z"
7479
+ i18n-sortDesc="kendo.spreadsheet.sortDesc|The text of the **Sort range Z to A** option."
7480
+ sortDesc="Sort range Z to A"
7481
+ i18n-unsort="kendo.spreadsheet.unsort|The text of the **Unsort** option."
7482
+ unsort="Unsort">
6334
7483
  </ng-container>
6335
7484
  <div class="k-spreadsheet-header">
6336
7485
  <kendo-menu kendoSpreadsheetMenu (select)="onMenuItemSelect($event)">
@@ -6425,6 +7574,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
6425
7574
  class="k-spreadsheet-toolbar"
6426
7575
  [overflow]="overflow">
6427
7576
  <kendo-toolbar-button kendoSpreadsheetDataValidation></kendo-toolbar-button>
7577
+ <kendo-toolbar-separator></kendo-toolbar-separator>
7578
+ <kendo-toolbar-button kendoSpreadsheetFilter></kendo-toolbar-button>
7579
+ <kendo-toolbar-separator></kendo-toolbar-separator>
7580
+ <kendo-toolbar-dropdownbutton kendoSpreadsheetSort></kendo-toolbar-dropdownbutton>
6428
7581
  </kendo-toolbar>
6429
7582
  }
6430
7583
  </div>
@@ -6458,20 +7611,102 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
6458
7611
  [sheetDescriptors]="sheets">
6459
7612
  </div>
6460
7613
  <ng-container #dialogContainer></ng-container>
6461
-
6462
- <kendo-contextmenu
6463
- #contextMenu
7614
+
7615
+ <kendo-contextmenu #contextMenu
6464
7616
  [items]="contextMenuItems"
6465
- (select)="onContextMenuSelect($event)"></kendo-contextmenu>
7617
+ (select)="onContextMenuSelect($event)">
7618
+ </kendo-contextmenu>
6466
7619
 
7620
+ <ng-template #filterMenuTemplate>
7621
+ <kendo-spreadsheet-filtermenu-item
7622
+ [innerMenuItems]="sortMenuItems"
7623
+ (itemClick)="onSortItemClick($event)">
7624
+ </kendo-spreadsheet-filtermenu-item>
7625
+ <kendo-spreadsheet-filtermenu-item
7626
+ [expandable]="true"
7627
+ [expanded]="conditionExpanded"
7628
+ expanderClass="k-spreadsheet-condition-filter"
7629
+ [innerMenuItems]="[{text: messageFor('filterMenuConditionItem')}]"
7630
+ (collapse)="onToggle(false, 'condition')"
7631
+ (expand)="onToggle(true, 'condition')">
7632
+ <ng-template kendoSpreadsheetFilterMenuItemContentTemplate>
7633
+ <div class="k-details-content">
7634
+ <kendo-dropdownlist
7635
+ [data]="filterConditionsList"
7636
+ textField="text"
7637
+ valueField="comparerType"
7638
+ [(value)]="selectedCondition">
7639
+ </kendo-dropdownlist>
7640
+ @if (selectedCondition?.type === 'string') {
7641
+ <kendo-textbox [(value)]="conditionValue"></kendo-textbox>
7642
+ } @else if (selectedCondition?.type === 'number') {
7643
+ <kendo-numerictextbox [(value)]="conditionValue"></kendo-numerictextbox>
7644
+ } @else if (selectedCondition?.type === 'date') {
7645
+ <kendo-datepicker [(value)]="conditionValue"></kendo-datepicker>
7646
+ }
7647
+ </div>
7648
+ <div class="k-actions k-actions-stretched k-actions-horizontal">
7649
+ <button
7650
+ kendoButton
7651
+ themeColor="primary"
7652
+ (click)="filterApply('condition')">
7653
+ {{ messageFor('filterApply') }}
7654
+ </button>
7655
+ <button
7656
+ kendoButton
7657
+ (click)="filterClear()">
7658
+ {{ messageFor('filterClear') }}
7659
+ </button>
7660
+ </div>
7661
+ </ng-template>
7662
+ </kendo-spreadsheet-filtermenu-item>
7663
+ <kendo-spreadsheet-filtermenu-item
7664
+ [expandable]="true"
7665
+ [expanded]="valueExpanded"
7666
+ [innerMenuItems]="[{text: messageFor('filterMenuValueItem')}]"
7667
+ (collapse)="onToggle(false, 'value')"
7668
+ (expand)="onToggle(true, 'value')">
7669
+ <ng-template kendoSpreadsheetFilterMenuItemContentTemplate>
7670
+ <div class="k-spreadsheet-value-treeview-wrapper">
7671
+ <kendo-treeview #treeview
7672
+ kendoTreeViewHierarchyBinding
7673
+ childrenField="items"
7674
+ textField="text"
7675
+ [nodes]="rangeFilterValuesList"
7676
+ kendoTreeViewExpandable
7677
+ [(expandedKeys)]="expandedKeys"
7678
+ [filterable]="true"
7679
+ [kendoTreeViewCheckable]="{checkOnClick: true}"
7680
+ [(checkedKeys)]="checkedKeys"
7681
+ checkBy="text"
7682
+ [isChecked]="isChecked">
7683
+ </kendo-treeview>
7684
+ </div>
7685
+ <div class="k-actions k-actions-stretched k-actions-horizontal">
7686
+ <button
7687
+ kendoButton
7688
+ themeColor="primary"
7689
+ (click)="filterApply('value')">
7690
+ {{ messageFor('filterApply') }}
7691
+ </button>
7692
+ <button
7693
+ kendoButton
7694
+ (click)="filterClear()">
7695
+ {{ messageFor('filterClear') }}
7696
+ </button>
7697
+ </div>
7698
+ </ng-template>
7699
+ </kendo-spreadsheet-filtermenu-item>
7700
+ </ng-template>
7701
+
6467
7702
  @if (showLicenseWatermark) {
6468
7703
  <div kendoWatermarkOverlay [licenseMessage]="licenseMessage"></div>
6469
7704
  }
6470
7705
  `,
6471
7706
  standalone: true,
6472
- 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]
7707
+ 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]
6473
7708
  }]
6474
- }], ctorParameters: () => [{ type: i0.NgZone }, { type: i1$4.IntlService }, { type: i0.ElementRef }, { type: i1.LocalizationService }, { type: SpreadsheetService }, { type: SpreadsheetToolsService }, { type: ErrorHandlingService }, { type: i1$2.DialogService }, { type: i1$1.PopupService }, { type: i0.ViewContainerRef }], propDecorators: { formulaBarInputRef: [{
7709
+ }], ctorParameters: () => [{ type: i0.NgZone }, { type: i1$4.IntlService }, { type: i0.ElementRef }, { type: i1.LocalizationService }, { type: SpreadsheetService }, { type: SpreadsheetToolsService }, { type: ErrorHandlingService }, { type: i1$2.DialogService }, { type: i1$1.PopupService }, { type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }], propDecorators: { formulaBarInputRef: [{
6475
7710
  type: ViewChild,
6476
7711
  args: ['formulaBar', { read: FormulaInputDirective }]
6477
7712
  }], formulaCellInputRef: [{
@@ -6486,6 +7721,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
6486
7721
  }], contextMenu: [{
6487
7722
  type: ViewChild,
6488
7723
  args: ['contextMenu']
7724
+ }], filterMenuTemplate: [{
7725
+ type: ViewChild,
7726
+ args: ['filterMenuTemplate']
6489
7727
  }], hostClass: [{
6490
7728
  type: HostBinding,
6491
7729
  args: ['class.k-spreadsheet']
@@ -6534,6 +7772,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
6534
7772
  type: Output
6535
7773
  }], activeSheetChange: [{
6536
7774
  type: Output
7775
+ }], clipboard: [{
7776
+ type: Output
6537
7777
  }] } });
6538
7778
 
6539
7779
  /**
@@ -6678,7 +7918,9 @@ const KENDO_SPREADSHEET = [
6678
7918
  SpreadsheetIncreaseDecimalDirective,
6679
7919
  SpreadsheetDecreaseDecimalDirective,
6680
7920
  SpreadsheetHorizontalTextAlignDirective,
6681
- SpreadsheetVerticalTextAlignDirective
7921
+ SpreadsheetVerticalTextAlignDirective,
7922
+ SpreadsheetFilterDirective,
7923
+ SpreadsheetSortDirective
6682
7924
  ];
6683
7925
 
6684
7926
  // IMPORTANT: NgModule export kept for backwards compatibility
@@ -6697,7 +7939,7 @@ const KENDO_SPREADSHEET = [
6697
7939
  */
6698
7940
  class SpreadsheetModule {
6699
7941
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpreadsheetModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
6700
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: SpreadsheetModule, imports: [SpreadsheetComponent, CustomMessagesComponent, SpreadsheetBoldDirective, SpreadsheetDataValidationDirective, SpreadsheetItalicDirective, SpreadsheetUnderlineDirective, SpreadsheetLoadFileComponent, SpreadsheetSaveFileDirective, SpreadsheetFormatDirective, SpreadsheetUndoDirective, SpreadsheetRedoDirective, SpreadsheetFontFamilyComponent, SpreadsheetFontSizeComponent, SpreadsheetBackColorComponent, SpreadsheetForeColorComponent, SpreadsheetGridLinesDirective, SpreadsheetAddColumnLeftButtonDirective, SpreadsheetAddColumnRightButtonDirective, SpreadsheetAddRowAboveButtonDirective, SpreadsheetAddRowBelowButtonDirective, SpreadsheetDeleteColumnButtonDirective, SpreadsheetDeleteRowButtonDirective, SpreadsheetTextAlignDirective, SpreadsheetTextWrapDirective, SpreadsheetMergeDirective, SpreadsheetInsertLinkDirective, SpreadsheetIncreaseFontSizeDirective, SpreadsheetDecreaseFontSizeDirective, SpreadsheetIncreaseDecimalDirective, SpreadsheetDecreaseDecimalDirective, SpreadsheetHorizontalTextAlignDirective, SpreadsheetVerticalTextAlignDirective], exports: [SpreadsheetComponent, CustomMessagesComponent, SpreadsheetBoldDirective, SpreadsheetDataValidationDirective, SpreadsheetItalicDirective, SpreadsheetUnderlineDirective, SpreadsheetLoadFileComponent, SpreadsheetSaveFileDirective, SpreadsheetFormatDirective, SpreadsheetUndoDirective, SpreadsheetRedoDirective, SpreadsheetFontFamilyComponent, SpreadsheetFontSizeComponent, SpreadsheetBackColorComponent, SpreadsheetForeColorComponent, SpreadsheetGridLinesDirective, SpreadsheetAddColumnLeftButtonDirective, SpreadsheetAddColumnRightButtonDirective, SpreadsheetAddRowAboveButtonDirective, SpreadsheetAddRowBelowButtonDirective, SpreadsheetDeleteColumnButtonDirective, SpreadsheetDeleteRowButtonDirective, SpreadsheetTextAlignDirective, SpreadsheetTextWrapDirective, SpreadsheetMergeDirective, SpreadsheetInsertLinkDirective, SpreadsheetIncreaseFontSizeDirective, SpreadsheetDecreaseFontSizeDirective, SpreadsheetIncreaseDecimalDirective, SpreadsheetDecreaseDecimalDirective, SpreadsheetHorizontalTextAlignDirective, SpreadsheetVerticalTextAlignDirective] });
7942
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: SpreadsheetModule, imports: [SpreadsheetComponent, CustomMessagesComponent, SpreadsheetBoldDirective, SpreadsheetDataValidationDirective, SpreadsheetItalicDirective, SpreadsheetUnderlineDirective, SpreadsheetLoadFileComponent, SpreadsheetSaveFileDirective, SpreadsheetFormatDirective, SpreadsheetUndoDirective, SpreadsheetRedoDirective, SpreadsheetFontFamilyComponent, SpreadsheetFontSizeComponent, SpreadsheetBackColorComponent, SpreadsheetForeColorComponent, SpreadsheetGridLinesDirective, SpreadsheetAddColumnLeftButtonDirective, SpreadsheetAddColumnRightButtonDirective, SpreadsheetAddRowAboveButtonDirective, SpreadsheetAddRowBelowButtonDirective, SpreadsheetDeleteColumnButtonDirective, SpreadsheetDeleteRowButtonDirective, SpreadsheetTextAlignDirective, SpreadsheetTextWrapDirective, SpreadsheetMergeDirective, SpreadsheetInsertLinkDirective, SpreadsheetIncreaseFontSizeDirective, SpreadsheetDecreaseFontSizeDirective, SpreadsheetIncreaseDecimalDirective, SpreadsheetDecreaseDecimalDirective, SpreadsheetHorizontalTextAlignDirective, SpreadsheetVerticalTextAlignDirective, SpreadsheetFilterDirective, SpreadsheetSortDirective], exports: [SpreadsheetComponent, CustomMessagesComponent, SpreadsheetBoldDirective, SpreadsheetDataValidationDirective, SpreadsheetItalicDirective, SpreadsheetUnderlineDirective, SpreadsheetLoadFileComponent, SpreadsheetSaveFileDirective, SpreadsheetFormatDirective, SpreadsheetUndoDirective, SpreadsheetRedoDirective, SpreadsheetFontFamilyComponent, SpreadsheetFontSizeComponent, SpreadsheetBackColorComponent, SpreadsheetForeColorComponent, SpreadsheetGridLinesDirective, SpreadsheetAddColumnLeftButtonDirective, SpreadsheetAddColumnRightButtonDirective, SpreadsheetAddRowAboveButtonDirective, SpreadsheetAddRowBelowButtonDirective, SpreadsheetDeleteColumnButtonDirective, SpreadsheetDeleteRowButtonDirective, SpreadsheetTextAlignDirective, SpreadsheetTextWrapDirective, SpreadsheetMergeDirective, SpreadsheetInsertLinkDirective, SpreadsheetIncreaseFontSizeDirective, SpreadsheetDecreaseFontSizeDirective, SpreadsheetIncreaseDecimalDirective, SpreadsheetDecreaseDecimalDirective, SpreadsheetHorizontalTextAlignDirective, SpreadsheetVerticalTextAlignDirective, SpreadsheetFilterDirective, SpreadsheetSortDirective] });
6701
7943
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpreadsheetModule, providers: [IconsService, PopupService, ResizeBatchService, DialogContainerService, DialogService, WindowService, WindowContainerService], imports: [SpreadsheetComponent, SpreadsheetLoadFileComponent, SpreadsheetFontFamilyComponent, SpreadsheetFontSizeComponent, SpreadsheetBackColorComponent, SpreadsheetForeColorComponent] });
6702
7944
  }
6703
7945
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpreadsheetModule, decorators: [{
@@ -6713,5 +7955,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
6713
7955
  * Generated bundle index. Do not edit.
6714
7956
  */
6715
7957
 
6716
- export { CustomMessagesComponent, FormulaInputDirective, FormulaListComponent, KENDO_SPREADSHEET, NameBoxComponent, SheetsBarComponent, SpreadsheetAddColumnLeftButtonDirective, SpreadsheetAddColumnRightButtonDirective, SpreadsheetAddRowAboveButtonDirective, SpreadsheetAddRowBelowButtonDirective, SpreadsheetBackColorComponent, SpreadsheetBoldDirective, SpreadsheetComponent, SpreadsheetDataValidationDirective, SpreadsheetDecreaseDecimalDirective, SpreadsheetDecreaseFontSizeDirective, SpreadsheetDeleteColumnButtonDirective, SpreadsheetDeleteRowButtonDirective, SpreadsheetFontFamilyComponent, SpreadsheetFontSizeComponent, SpreadsheetForeColorComponent, SpreadsheetFormatDirective, SpreadsheetGridLinesDirective, SpreadsheetHorizontalTextAlignDirective, SpreadsheetIncreaseDecimalDirective, SpreadsheetIncreaseFontSizeDirective, SpreadsheetInsertLinkDirective, SpreadsheetItalicDirective, SpreadsheetLoadFileComponent, SpreadsheetMergeDirective, SpreadsheetModule, SpreadsheetRedoDirective, SpreadsheetSaveFileDirective, SpreadsheetTextAlignDirective, SpreadsheetTextWrapDirective, SpreadsheetUnderlineDirective, SpreadsheetUndoDirective, SpreadsheetVerticalTextAlignDirective };
7958
+ export { CustomMessagesComponent, FormulaInputDirective, FormulaListComponent, KENDO_SPREADSHEET, NameBoxComponent, SheetsBarComponent, SpreadsheetAddColumnLeftButtonDirective, SpreadsheetAddColumnRightButtonDirective, SpreadsheetAddRowAboveButtonDirective, SpreadsheetAddRowBelowButtonDirective, SpreadsheetBackColorComponent, SpreadsheetBoldDirective, SpreadsheetComponent, SpreadsheetDataValidationDirective, SpreadsheetDecreaseDecimalDirective, SpreadsheetDecreaseFontSizeDirective, SpreadsheetDeleteColumnButtonDirective, SpreadsheetDeleteRowButtonDirective, SpreadsheetFilterDirective, SpreadsheetFontFamilyComponent, SpreadsheetFontSizeComponent, SpreadsheetForeColorComponent, SpreadsheetFormatDirective, SpreadsheetGridLinesDirective, SpreadsheetHorizontalTextAlignDirective, SpreadsheetIncreaseDecimalDirective, SpreadsheetIncreaseFontSizeDirective, SpreadsheetInsertLinkDirective, SpreadsheetItalicDirective, SpreadsheetLoadFileComponent, SpreadsheetMergeDirective, SpreadsheetModule, SpreadsheetRedoDirective, SpreadsheetSaveFileDirective, SpreadsheetSortDirective, SpreadsheetTextAlignDirective, SpreadsheetTextWrapDirective, SpreadsheetUnderlineDirective, SpreadsheetUndoDirective, SpreadsheetVerticalTextAlignDirective };
6717
7959