@progress/kendo-angular-menu 23.3.0-develop.17 → 23.3.0-develop.19

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.
@@ -22,8 +22,8 @@ const packageMetadata = {
22
22
  productName: 'Kendo UI for Angular',
23
23
  productCode: 'KENDOUIANGULAR',
24
24
  productCodes: ['KENDOUIANGULAR'],
25
- publishDate: 1774600060,
26
- version: '23.3.0-develop.17',
25
+ publishDate: 1774605709,
26
+ version: '23.3.0-develop.19',
27
27
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/'
28
28
  };
29
29
 
@@ -1133,6 +1133,58 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
1133
1133
  args: [MenuItemComponent]
1134
1134
  }] } });
1135
1135
 
1136
+ /**
1137
+ * @hidden
1138
+ */
1139
+ const defined = (value) => typeof value !== 'undefined';
1140
+ /**
1141
+ * @hidden
1142
+ */
1143
+ const bodyFactory = () => {
1144
+ if (isDocumentAvailable()) {
1145
+ return new ElementRef(document.body);
1146
+ }
1147
+ };
1148
+ /**
1149
+ * @hidden
1150
+ */
1151
+ const getSizeClass = (size) => {
1152
+ const SIZE_CLASSES = {
1153
+ 'small': 'k-menu-group-sm',
1154
+ 'medium': 'k-menu-group-md',
1155
+ 'large': 'k-menu-group-lg'
1156
+ };
1157
+ return SIZE_CLASSES[size];
1158
+ };
1159
+ /**
1160
+ * @hidden
1161
+ */
1162
+ const getFontIcon = (horizontal, rtl) => {
1163
+ const icon = horizontal ?
1164
+ rtl ?
1165
+ 'caret-alt-left' :
1166
+ 'caret-alt-right' :
1167
+ 'caret-alt-down';
1168
+ return icon;
1169
+ };
1170
+ /**
1171
+ * @hidden
1172
+ */
1173
+ const getSVGIcon = (horizontal, rtl) => {
1174
+ const icon = horizontal ?
1175
+ rtl ?
1176
+ caretAltLeftIcon :
1177
+ caretAltRightIcon :
1178
+ caretAltDownIcon;
1179
+ return icon;
1180
+ };
1181
+ /**
1182
+ * @hidden
1183
+ */
1184
+ function defaultTrackBy(index) {
1185
+ return index;
1186
+ }
1187
+
1136
1188
  /**
1137
1189
  * @hidden
1138
1190
  */
@@ -1175,6 +1227,11 @@ class MenuBase {
1175
1227
  * Allows customization of the popup class and margin.
1176
1228
  */
1177
1229
  popupSettings;
1230
+ /**
1231
+ * Defines a function that determines how to track changes for the menu items.
1232
+ * By default, the component tracks changes by index.
1233
+ */
1234
+ trackBy = defaultTrackBy;
1178
1235
  /**
1179
1236
  * @hidden
1180
1237
  */
@@ -1194,7 +1251,7 @@ class MenuBase {
1194
1251
  return this.items || (this.children ? this.children.toArray() : []);
1195
1252
  }
1196
1253
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: MenuBase, deps: [], target: i0.ɵɵFactoryTarget.Component });
1197
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: MenuBase, isStandalone: true, selector: "kendo-menu-base", inputs: { items: "items", vertical: "vertical", openOnClick: "openOnClick", hoverDelay: "hoverDelay", animate: "animate", size: "size", popupSettings: "popupSettings" }, queries: [{ propertyName: "itemTemplate", predicate: ItemTemplateDirective }, { propertyName: "itemLinkTemplate", predicate: ItemLinkTemplateDirective }, { propertyName: "children", predicate: MenuItemComponent }], ngImport: i0, template: ``, isInline: true });
1254
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: MenuBase, isStandalone: true, selector: "kendo-menu-base", inputs: { items: "items", vertical: "vertical", openOnClick: "openOnClick", hoverDelay: "hoverDelay", animate: "animate", size: "size", popupSettings: "popupSettings", trackBy: "trackBy" }, queries: [{ propertyName: "itemTemplate", predicate: ItemTemplateDirective }, { propertyName: "itemLinkTemplate", predicate: ItemLinkTemplateDirective }, { propertyName: "children", predicate: MenuItemComponent }], ngImport: i0, template: ``, isInline: true });
1198
1255
  }
1199
1256
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: MenuBase, decorators: [{
1200
1257
  type: Component,
@@ -1216,6 +1273,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
1216
1273
  type: Input
1217
1274
  }], popupSettings: [{
1218
1275
  type: Input
1276
+ }], trackBy: [{
1277
+ type: Input
1219
1278
  }], itemTemplate: [{
1220
1279
  type: ContentChildren,
1221
1280
  args: [ItemTemplateDirective]
@@ -1227,52 +1286,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
1227
1286
  args: [MenuItemComponent]
1228
1287
  }] } });
1229
1288
 
1230
- /**
1231
- * @hidden
1232
- */
1233
- const defined = (value) => typeof value !== 'undefined';
1234
- /**
1235
- * @hidden
1236
- */
1237
- const bodyFactory = () => {
1238
- if (isDocumentAvailable()) {
1239
- return new ElementRef(document.body);
1240
- }
1241
- };
1242
- /**
1243
- * @hidden
1244
- */
1245
- const getSizeClass = (size) => {
1246
- const SIZE_CLASSES = {
1247
- 'small': 'k-menu-group-sm',
1248
- 'medium': 'k-menu-group-md',
1249
- 'large': 'k-menu-group-lg'
1250
- };
1251
- return SIZE_CLASSES[size];
1252
- };
1253
- /**
1254
- * @hidden
1255
- */
1256
- const getFontIcon = (horizontal, rtl) => {
1257
- const icon = horizontal ?
1258
- rtl ?
1259
- 'caret-alt-left' :
1260
- 'caret-alt-right' :
1261
- 'caret-alt-down';
1262
- return icon;
1263
- };
1264
- /**
1265
- * @hidden
1266
- */
1267
- const getSVGIcon = (horizontal, rtl) => {
1268
- const icon = horizontal ?
1269
- rtl ?
1270
- caretAltLeftIcon :
1271
- caretAltRightIcon :
1272
- caretAltDownIcon;
1273
- return icon;
1274
- };
1275
-
1276
1289
  const POPUP_ALIGN = {
1277
1290
  vertical: 'top',
1278
1291
  horizontal: 'left'
@@ -1367,6 +1380,7 @@ class ListComponent {
1367
1380
  itemTemplate;
1368
1381
  itemLinkTemplate;
1369
1382
  popupSettings;
1383
+ trackBy;
1370
1384
  domSubscriptions;
1371
1385
  constructor(itemsService, hover, actions, navigation, renderer, ngZone, element) {
1372
1386
  this.itemsService = itemsService;
@@ -1377,6 +1391,9 @@ class ListComponent {
1377
1391
  this.ngZone = ngZone;
1378
1392
  this.element = element;
1379
1393
  }
1394
+ trackByWrapper(index, item) {
1395
+ return this.trackBy ? this.trackBy(index, item) : index;
1396
+ }
1380
1397
  hierarchyIndex(index) {
1381
1398
  return this.itemsService.itemIndex(this.index, index);
1382
1399
  }
@@ -1516,14 +1533,14 @@ class ListComponent {
1516
1533
  this.actions.execute();
1517
1534
  }
1518
1535
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: ListComponent, deps: [{ token: ItemsService }, { token: HoverService }, { token: ActionsService }, { token: NavigationService }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
1519
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.20", type: ListComponent, isStandalone: true, selector: "[kendoMenuList]", inputs: { appendTo: "appendTo", items: "items", level: "level", index: "index", animate: "animate", size: "size", vertical: "vertical", rtl: "rtl", openOnClick: "openOnClick", itemTemplate: "itemTemplate", itemLinkTemplate: "itemLinkTemplate", popupSettings: "popupSettings" }, ngImport: i0, template: "\n @for (item of items; track item; let idx = $index) {\n @if (!item.separator) {\n <li\n kendoMenuItem\n [appendTo]=\"appendTo\"\n [item]=\"item\"\n [level]=\"level\"\n [size]=\"size\"\n [vertical]=\"vertical\"\n [animate]=\"animate\"\n [rtl]=\"rtl\"\n [itemTemplate]=\"itemTemplate\"\n [itemLinkTemplate]=\"itemLinkTemplate\"\n [popupSettings]=\"popupSettings\"\n [openOnClick]=\"openOnClick\"\n [index]=\"hierarchyIndex(idx)\"\n [siblingIndex]=\"idx\"\n [attr.data-kendo-menu-index]=\"hierarchyIndex(idx)\"\n [ngClass]=\"item.cssClass\"\n [ngStyle]=\"item.cssStyle\"\n role=\"menuitem\"\n class=\"k-item k-menu-item\"\n [class.k-first]=\"idx === 0\"\n [class.k-last]=\"idx === items.length - 1\"\n [class.k-disabled]=\"item.disabled\"></li>\n }\n @if (item.separator) {\n <li\n class=\"k-separator k-item\"\n [ngClass]=\"item.cssClass\"\n aria-hidden=\"true\"\n [ngStyle]=\"item.cssStyle\">\n &nbsp;\n </li>\n }\n }\n ", isInline: true, dependencies: [{ kind: "component", type: i0.forwardRef(() => ItemComponent), selector: "[kendoMenuItem]", inputs: ["appendTo", "item", "level", "index", "siblingIndex", "animate", "size", "vertical", "rtl", "openOnClick", "itemTemplate", "itemLinkTemplate", "popupSettings"] }, { kind: "directive", type: i0.forwardRef(() => NgClass), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(() => NgStyle), selector: "[ngStyle]", inputs: ["ngStyle"] }] });
1536
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.20", type: ListComponent, isStandalone: true, selector: "[kendoMenuList]", inputs: { appendTo: "appendTo", items: "items", level: "level", index: "index", animate: "animate", size: "size", vertical: "vertical", rtl: "rtl", openOnClick: "openOnClick", itemTemplate: "itemTemplate", itemLinkTemplate: "itemLinkTemplate", popupSettings: "popupSettings", trackBy: "trackBy" }, ngImport: i0, template: "\n @for (item of items; track trackByWrapper($index, item); let idx = $index) {\n @if (!item.separator) {\n <li\n kendoMenuItem\n [appendTo]=\"appendTo\"\n [item]=\"item\"\n [level]=\"level\"\n [size]=\"size\"\n [vertical]=\"vertical\"\n [animate]=\"animate\"\n [rtl]=\"rtl\"\n [itemTemplate]=\"itemTemplate\"\n [itemLinkTemplate]=\"itemLinkTemplate\"\n [popupSettings]=\"popupSettings\"\n [trackBy]=\"trackBy\"\n [openOnClick]=\"openOnClick\"\n [index]=\"hierarchyIndex(idx)\"\n [siblingIndex]=\"idx\"\n [attr.data-kendo-menu-index]=\"hierarchyIndex(idx)\"\n [ngClass]=\"item.cssClass\"\n [ngStyle]=\"item.cssStyle\"\n role=\"menuitem\"\n class=\"k-item k-menu-item\"\n [class.k-first]=\"idx === 0\"\n [class.k-last]=\"idx === items.length - 1\"\n [class.k-disabled]=\"item.disabled\"></li>\n }\n @if (item.separator) {\n <li\n class=\"k-separator k-item\"\n [ngClass]=\"item.cssClass\"\n aria-hidden=\"true\"\n [ngStyle]=\"item.cssStyle\">\n &nbsp;\n </li>\n }\n }\n ", isInline: true, dependencies: [{ kind: "component", type: i0.forwardRef(() => ItemComponent), selector: "[kendoMenuItem]", inputs: ["appendTo", "item", "level", "index", "siblingIndex", "animate", "size", "vertical", "rtl", "openOnClick", "itemTemplate", "itemLinkTemplate", "popupSettings", "trackBy"] }, { kind: "directive", type: i0.forwardRef(() => NgClass), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(() => NgStyle), selector: "[ngStyle]", inputs: ["ngStyle"] }] });
1520
1537
  }
1521
1538
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: ListComponent, decorators: [{
1522
1539
  type: Component,
1523
1540
  args: [{
1524
1541
  selector: '[kendoMenuList]',
1525
1542
  template: `
1526
- @for (item of items; track item; let idx = $index) {
1543
+ @for (item of items; track trackByWrapper($index, item); let idx = $index) {
1527
1544
  @if (!item.separator) {
1528
1545
  <li
1529
1546
  kendoMenuItem
@@ -1537,6 +1554,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
1537
1554
  [itemTemplate]="itemTemplate"
1538
1555
  [itemLinkTemplate]="itemLinkTemplate"
1539
1556
  [popupSettings]="popupSettings"
1557
+ [trackBy]="trackBy"
1540
1558
  [openOnClick]="openOnClick"
1541
1559
  [index]="hierarchyIndex(idx)"
1542
1560
  [siblingIndex]="idx"
@@ -1587,6 +1605,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
1587
1605
  type: Input
1588
1606
  }], popupSettings: [{
1589
1607
  type: Input
1608
+ }], trackBy: [{
1609
+ type: Input
1590
1610
  }] } });
1591
1611
  /**
1592
1612
  * @hidden
@@ -1625,6 +1645,7 @@ class ItemComponent {
1625
1645
  itemTemplate;
1626
1646
  itemLinkTemplate;
1627
1647
  popupSettings;
1648
+ trackBy;
1628
1649
  link;
1629
1650
  popupTemplate;
1630
1651
  get disabled() {
@@ -1715,6 +1736,11 @@ class ItemComponent {
1715
1736
  ngOnInit() {
1716
1737
  this.itemsService.add(this);
1717
1738
  }
1739
+ ngOnChanges(changes) {
1740
+ if (changes['item'] && !changes['item'].firstChange && this.opened) {
1741
+ this.close();
1742
+ }
1743
+ }
1718
1744
  ngAfterViewInit() {
1719
1745
  if (this.hasContent) {
1720
1746
  this.setAttribute('aria-expanded', this.opened.toString());
@@ -1809,10 +1835,10 @@ class ItemComponent {
1809
1835
  };
1810
1836
  }
1811
1837
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: ItemComponent, deps: [{ token: ItemsService }, { token: NavigationService }, { token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: i5.PopupService }, { token: i0.ElementRef }, { token: ContextMenuService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
1812
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.20", type: ItemComponent, isStandalone: true, selector: "[kendoMenuItem]", inputs: { appendTo: "appendTo", item: "item", level: "level", index: "index", siblingIndex: "siblingIndex", animate: "animate", size: "size", vertical: "vertical", rtl: "rtl", openOnClick: "openOnClick", itemTemplate: "itemTemplate", itemLinkTemplate: "itemLinkTemplate", popupSettings: "popupSettings" }, host: { properties: { "attr.aria-disabled": "this.disabled", "attr.aria-haspopup": "this.hasPopup", "attr.aria-label": "this.label" } }, providers: [PopupService, {
1838
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.20", type: ItemComponent, isStandalone: true, selector: "[kendoMenuItem]", inputs: { appendTo: "appendTo", item: "item", level: "level", index: "index", siblingIndex: "siblingIndex", animate: "animate", size: "size", vertical: "vertical", rtl: "rtl", openOnClick: "openOnClick", itemTemplate: "itemTemplate", itemLinkTemplate: "itemLinkTemplate", popupSettings: "popupSettings", trackBy: "trackBy" }, host: { properties: { "attr.aria-disabled": "this.disabled", "attr.aria-haspopup": "this.hasPopup", "attr.aria-label": "this.label" } }, providers: [PopupService, {
1813
1839
  provide: POPUP_CONTAINER,
1814
1840
  useFactory: bodyFactory
1815
- }], viewQueries: [{ propertyName: "link", first: true, predicate: ["link"], descendants: true }, { propertyName: "popupTemplate", first: true, predicate: ["popupTemplate"], descendants: true, static: true }], ngImport: i0, template: `
1841
+ }], viewQueries: [{ propertyName: "link", first: true, predicate: ["link"], descendants: true }, { propertyName: "popupTemplate", first: true, predicate: ["popupTemplate"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: `
1816
1842
  @if (!hasLink && !item.content && !linkTemplate) {
1817
1843
  <span class="k-link k-menu-link" #link
1818
1844
  [class.k-active]="opened" role="presentation">
@@ -1855,6 +1881,7 @@ class ItemComponent {
1855
1881
  [itemTemplate]="itemTemplate"
1856
1882
  [itemLinkTemplate]="itemLinkTemplate"
1857
1883
  [popupSettings]="popupSettings"
1884
+ [trackBy]="trackBy"
1858
1885
  [ngClass]="menuListClasses"
1859
1886
  role="menu">
1860
1887
  </ul>
@@ -1875,7 +1902,7 @@ class ItemComponent {
1875
1902
  <kendo-icon-wrapper [name]="fontIcon(horizontal, rtl)" [svgIcon]="SVGIcon(horizontal, rtl)" class="k-menu-expand-arrow" aria-hidden="true"></kendo-icon-wrapper>
1876
1903
  }
1877
1904
  </ng-template>
1878
- `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ListComponent, selector: "[kendoMenuList]", inputs: ["appendTo", "items", "level", "index", "animate", "size", "vertical", "rtl", "openOnClick", "itemTemplate", "itemLinkTemplate", "popupSettings"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }] });
1905
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ListComponent, selector: "[kendoMenuList]", inputs: ["appendTo", "items", "level", "index", "animate", "size", "vertical", "rtl", "openOnClick", "itemTemplate", "itemLinkTemplate", "popupSettings", "trackBy"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }] });
1879
1906
  }
1880
1907
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: ItemComponent, decorators: [{
1881
1908
  type: Component,
@@ -1928,6 +1955,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
1928
1955
  [itemTemplate]="itemTemplate"
1929
1956
  [itemLinkTemplate]="itemLinkTemplate"
1930
1957
  [popupSettings]="popupSettings"
1958
+ [trackBy]="trackBy"
1931
1959
  [ngClass]="menuListClasses"
1932
1960
  role="menu">
1933
1961
  </ul>
@@ -1980,6 +2008,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
1980
2008
  type: Input
1981
2009
  }], popupSettings: [{
1982
2010
  type: Input
2011
+ }], trackBy: [{
2012
+ type: Input
1983
2013
  }], link: [{
1984
2014
  type: ViewChild,
1985
2015
  args: ['link', { static: false }]
@@ -2215,9 +2245,10 @@ class MenuComponent extends MenuBase {
2215
2245
  [itemTemplate]="itemTemplate.first?.templateRef || menuItemTemplate"
2216
2246
  [itemLinkTemplate]="itemLinkTemplate.first?.templateRef || menuItemLinkTemplate"
2217
2247
  [popupSettings]="popupSettings"
2248
+ [trackBy]="trackBy"
2218
2249
  [ngClass]="menuClasses">
2219
2250
  </ul>
2220
- `, isInline: true, dependencies: [{ kind: "component", type: ListComponent, selector: "[kendoMenuList]", inputs: ["appendTo", "items", "level", "index", "animate", "size", "vertical", "rtl", "openOnClick", "itemTemplate", "itemLinkTemplate", "popupSettings"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
2251
+ `, isInline: true, dependencies: [{ kind: "component", type: ListComponent, selector: "[kendoMenuList]", inputs: ["appendTo", "items", "level", "index", "animate", "size", "vertical", "rtl", "openOnClick", "itemTemplate", "itemLinkTemplate", "popupSettings", "trackBy"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
2221
2252
  }
2222
2253
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: MenuComponent, decorators: [{
2223
2254
  type: Component,
@@ -2248,6 +2279,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
2248
2279
  [itemTemplate]="itemTemplate.first?.templateRef || menuItemTemplate"
2249
2280
  [itemLinkTemplate]="itemLinkTemplate.first?.templateRef || menuItemLinkTemplate"
2250
2281
  [popupSettings]="popupSettings"
2282
+ [trackBy]="trackBy"
2251
2283
  [ngClass]="menuClasses">
2252
2284
  </ul>
2253
2285
  `,
@@ -3382,6 +3414,7 @@ class ContextMenuComponent extends MenuBase {
3382
3414
  [hoverDelay]="hoverDelay"
3383
3415
  [animate]="animate"
3384
3416
  [popupSettings]="popupSettings"
3417
+ [trackBy]="trackBy"
3385
3418
  [menuItemTemplate]="itemTemplate.first?.templateRef"
3386
3419
  [menuItemLinkTemplate]="itemLinkTemplate.first?.templateRef"
3387
3420
  ></kendo-menu>
@@ -3425,6 +3458,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
3425
3458
  [hoverDelay]="hoverDelay"
3426
3459
  [animate]="animate"
3427
3460
  [popupSettings]="popupSettings"
3461
+ [trackBy]="trackBy"
3428
3462
  [menuItemTemplate]="itemTemplate.first?.templateRef"
3429
3463
  [menuItemLinkTemplate]="itemLinkTemplate.first?.templateRef"
3430
3464
  ></kendo-menu>
package/menu-base.d.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  * Copyright © 2026 Progress Software Corporation. All rights reserved.
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
- import { QueryList } from '@angular/core';
5
+ import { QueryList, TrackByFunction } from '@angular/core';
6
6
  import { MenuItemComponent } from './menu-item.component';
7
7
  import { MenuAnimation } from './menu-animation.interface';
8
8
  import { OpenOnClickSettings } from './open-on-click-settings';
@@ -53,6 +53,11 @@ export declare class MenuBase {
53
53
  * Allows customization of the popup class and margin.
54
54
  */
55
55
  popupSettings: PopupSettings;
56
+ /**
57
+ * Defines a function that determines how to track changes for the menu items.
58
+ * By default, the component tracks changes by index.
59
+ */
60
+ trackBy: TrackByFunction<any>;
56
61
  /**
57
62
  * @hidden
58
63
  */
@@ -70,5 +75,5 @@ export declare class MenuBase {
70
75
  */
71
76
  get rootItems(): any[];
72
77
  static ɵfac: i0.ɵɵFactoryDeclaration<MenuBase, never>;
73
- static ɵcmp: i0.ɵɵComponentDeclaration<MenuBase, "kendo-menu-base", never, { "items": { "alias": "items"; "required": false; }; "vertical": { "alias": "vertical"; "required": false; }; "openOnClick": { "alias": "openOnClick"; "required": false; }; "hoverDelay": { "alias": "hoverDelay"; "required": false; }; "animate": { "alias": "animate"; "required": false; }; "size": { "alias": "size"; "required": false; }; "popupSettings": { "alias": "popupSettings"; "required": false; }; }, {}, ["itemTemplate", "itemLinkTemplate", "children"], never, true, never>;
78
+ static ɵcmp: i0.ɵɵComponentDeclaration<MenuBase, "kendo-menu-base", never, { "items": { "alias": "items"; "required": false; }; "vertical": { "alias": "vertical"; "required": false; }; "openOnClick": { "alias": "openOnClick"; "required": false; }; "hoverDelay": { "alias": "hoverDelay"; "required": false; }; "animate": { "alias": "animate"; "required": false; }; "size": { "alias": "size"; "required": false; }; "popupSettings": { "alias": "popupSettings"; "required": false; }; "trackBy": { "alias": "trackBy"; "required": false; }; }, {}, ["itemTemplate", "itemLinkTemplate", "children"], never, true, never>;
74
79
  }
@@ -7,7 +7,7 @@ export const packageMetadata = {
7
7
  "productCodes": [
8
8
  "KENDOUIANGULAR"
9
9
  ],
10
- "publishDate": 1774600060,
11
- "version": "23.3.0-develop.17",
10
+ "publishDate": 1774605709,
11
+ "version": "23.3.0-develop.19",
12
12
  "licensingDocsUrl": "https://www.telerik.com/kendo-angular-ui/my-license/"
13
13
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@progress/kendo-angular-menu",
3
- "version": "23.3.0-develop.17",
3
+ "version": "23.3.0-develop.19",
4
4
  "description": "Kendo UI Angular Menu component",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "author": "Progress",
@@ -19,7 +19,7 @@
19
19
  "package": {
20
20
  "productName": "Kendo UI for Angular",
21
21
  "productCode": "KENDOUIANGULAR",
22
- "publishDate": 1774600060,
22
+ "publishDate": 1774605709,
23
23
  "licensingDocsUrl": "https://www.telerik.com/kendo-angular-ui/my-license/"
24
24
  }
25
25
  },
@@ -29,15 +29,15 @@
29
29
  "@angular/core": "19 - 21",
30
30
  "@angular/platform-browser": "19 - 21",
31
31
  "@progress/kendo-licensing": "^1.10.0",
32
- "@progress/kendo-angular-common": "23.3.0-develop.17",
33
- "@progress/kendo-angular-l10n": "23.3.0-develop.17",
34
- "@progress/kendo-angular-icons": "23.3.0-develop.17",
35
- "@progress/kendo-angular-popup": "23.3.0-develop.17",
32
+ "@progress/kendo-angular-common": "23.3.0-develop.19",
33
+ "@progress/kendo-angular-l10n": "23.3.0-develop.19",
34
+ "@progress/kendo-angular-icons": "23.3.0-develop.19",
35
+ "@progress/kendo-angular-popup": "23.3.0-develop.19",
36
36
  "rxjs": "^6.5.3 || ^7.0.0"
37
37
  },
38
38
  "dependencies": {
39
39
  "tslib": "^2.3.1",
40
- "@progress/kendo-angular-schematics": "23.3.0-develop.17"
40
+ "@progress/kendo-angular-schematics": "23.3.0-develop.19"
41
41
  },
42
42
  "schematics": "./schematics/collection.json",
43
43
  "module": "fesm2022/progress-kendo-angular-menu.mjs",
@@ -2,7 +2,7 @@
2
2
  * Copyright © 2026 Progress Software Corporation. All rights reserved.
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
- import { AfterViewInit, ElementRef, NgZone, OnDestroy, OnInit, Renderer2, TemplateRef, ViewContainerRef } from '@angular/core';
5
+ import { AfterViewInit, ElementRef, NgZone, OnChanges, OnDestroy, OnInit, Renderer2, SimpleChanges, TemplateRef, TrackByFunction, ViewContainerRef } from '@angular/core';
6
6
  import { ChangeDetectorRef } from '@angular/core';
7
7
  import { PopupService } from '@progress/kendo-angular-popup';
8
8
  import { ContextMenuService } from '../context-menu/context-menu.service';
@@ -37,8 +37,10 @@ export declare class ListComponent implements OnInit, OnDestroy {
37
37
  itemTemplate: TemplateRef<any>;
38
38
  itemLinkTemplate: TemplateRef<any>;
39
39
  popupSettings: PopupSettings;
40
+ trackBy: TrackByFunction<any>;
40
41
  private domSubscriptions;
41
42
  constructor(itemsService: ItemsService, hover: HoverService, actions: ActionsService, navigation: NavigationService, renderer: Renderer2, ngZone: NgZone, element: ElementRef);
43
+ trackByWrapper(index: number, item: any): any;
42
44
  hierarchyIndex(index: number): string;
43
45
  ngOnInit(): void;
44
46
  ngOnDestroy(): void;
@@ -48,12 +50,12 @@ export declare class ListComponent implements OnInit, OnDestroy {
48
50
  private nodeItem;
49
51
  private clickHandler;
50
52
  static ɵfac: i0.ɵɵFactoryDeclaration<ListComponent, never>;
51
- static ɵcmp: i0.ɵɵComponentDeclaration<ListComponent, "[kendoMenuList]", never, { "appendTo": { "alias": "appendTo"; "required": false; }; "items": { "alias": "items"; "required": false; }; "level": { "alias": "level"; "required": false; }; "index": { "alias": "index"; "required": false; }; "animate": { "alias": "animate"; "required": false; }; "size": { "alias": "size"; "required": false; }; "vertical": { "alias": "vertical"; "required": false; }; "rtl": { "alias": "rtl"; "required": false; }; "openOnClick": { "alias": "openOnClick"; "required": false; }; "itemTemplate": { "alias": "itemTemplate"; "required": false; }; "itemLinkTemplate": { "alias": "itemLinkTemplate"; "required": false; }; "popupSettings": { "alias": "popupSettings"; "required": false; }; }, {}, never, never, true, never>;
53
+ static ɵcmp: i0.ɵɵComponentDeclaration<ListComponent, "[kendoMenuList]", never, { "appendTo": { "alias": "appendTo"; "required": false; }; "items": { "alias": "items"; "required": false; }; "level": { "alias": "level"; "required": false; }; "index": { "alias": "index"; "required": false; }; "animate": { "alias": "animate"; "required": false; }; "size": { "alias": "size"; "required": false; }; "vertical": { "alias": "vertical"; "required": false; }; "rtl": { "alias": "rtl"; "required": false; }; "openOnClick": { "alias": "openOnClick"; "required": false; }; "itemTemplate": { "alias": "itemTemplate"; "required": false; }; "itemLinkTemplate": { "alias": "itemLinkTemplate"; "required": false; }; "popupSettings": { "alias": "popupSettings"; "required": false; }; "trackBy": { "alias": "trackBy"; "required": false; }; }, {}, never, never, true, never>;
52
54
  }
53
55
  /**
54
56
  * @hidden
55
57
  */
56
- export declare class ItemComponent implements OnInit, AfterViewInit, OnDestroy {
58
+ export declare class ItemComponent implements OnInit, OnChanges, AfterViewInit, OnDestroy {
57
59
  private itemsService;
58
60
  private navigation;
59
61
  private changeDetector;
@@ -75,6 +77,7 @@ export declare class ItemComponent implements OnInit, AfterViewInit, OnDestroy {
75
77
  itemTemplate: TemplateRef<any>;
76
78
  itemLinkTemplate: TemplateRef<any>;
77
79
  popupSettings: PopupSettings;
80
+ trackBy: TrackByFunction<any>;
78
81
  link: ElementRef;
79
82
  popupTemplate: TemplateRef<any>;
80
83
  get disabled(): boolean;
@@ -109,6 +112,7 @@ export declare class ItemComponent implements OnInit, AfterViewInit, OnDestroy {
109
112
  constructor(itemsService: ItemsService, navigation: NavigationService, changeDetector: ChangeDetectorRef, renderer: Renderer2, popupService: PopupService, element: ElementRef, contextService?: ContextMenuService);
110
113
  hasContentTemplates(): boolean;
111
114
  ngOnInit(): void;
115
+ ngOnChanges(changes: SimpleChanges): void;
112
116
  ngAfterViewInit(): void;
113
117
  ngOnDestroy(): void;
114
118
  focus(): void;
@@ -120,5 +124,5 @@ export declare class ItemComponent implements OnInit, AfterViewInit, OnDestroy {
120
124
  private setAttribute;
121
125
  private getMergedPopupSettings;
122
126
  static ɵfac: i0.ɵɵFactoryDeclaration<ItemComponent, [null, null, null, null, null, null, { optional: true; }]>;
123
- static ɵcmp: i0.ɵɵComponentDeclaration<ItemComponent, "[kendoMenuItem]", never, { "appendTo": { "alias": "appendTo"; "required": false; }; "item": { "alias": "item"; "required": false; }; "level": { "alias": "level"; "required": false; }; "index": { "alias": "index"; "required": false; }; "siblingIndex": { "alias": "siblingIndex"; "required": false; }; "animate": { "alias": "animate"; "required": false; }; "size": { "alias": "size"; "required": false; }; "vertical": { "alias": "vertical"; "required": false; }; "rtl": { "alias": "rtl"; "required": false; }; "openOnClick": { "alias": "openOnClick"; "required": false; }; "itemTemplate": { "alias": "itemTemplate"; "required": false; }; "itemLinkTemplate": { "alias": "itemLinkTemplate"; "required": false; }; "popupSettings": { "alias": "popupSettings"; "required": false; }; }, {}, never, never, true, never>;
127
+ static ɵcmp: i0.ɵɵComponentDeclaration<ItemComponent, "[kendoMenuItem]", never, { "appendTo": { "alias": "appendTo"; "required": false; }; "item": { "alias": "item"; "required": false; }; "level": { "alias": "level"; "required": false; }; "index": { "alias": "index"; "required": false; }; "siblingIndex": { "alias": "siblingIndex"; "required": false; }; "animate": { "alias": "animate"; "required": false; }; "size": { "alias": "size"; "required": false; }; "vertical": { "alias": "vertical"; "required": false; }; "rtl": { "alias": "rtl"; "required": false; }; "openOnClick": { "alias": "openOnClick"; "required": false; }; "itemTemplate": { "alias": "itemTemplate"; "required": false; }; "itemLinkTemplate": { "alias": "itemLinkTemplate"; "required": false; }; "popupSettings": { "alias": "popupSettings"; "required": false; }; "trackBy": { "alias": "trackBy"; "required": false; }; }, {}, never, never, true, never>;
124
128
  }
package/utils.d.ts CHANGED
@@ -25,3 +25,7 @@ export declare const getFontIcon: (horizontal: boolean, rtl: boolean) => string;
25
25
  * @hidden
26
26
  */
27
27
  export declare const getSVGIcon: (horizontal: boolean, rtl: boolean) => SVGIcon;
28
+ /**
29
+ * @hidden
30
+ */
31
+ export declare function defaultTrackBy(index: number): number;