primeng 16.0.2 → 16.1.0

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 (222) hide show
  1. package/accordion/accordion.d.ts +35 -11
  2. package/api/translation.d.ts +23 -0
  3. package/api/treenode.d.ts +1 -1
  4. package/avatar/avatar.d.ts +11 -1
  5. package/breadcrumb/breadcrumb.d.ts +5 -1
  6. package/button/button.d.ts +3 -0
  7. package/chip/chip.d.ts +1 -0
  8. package/contextmenu/contextmenu.d.ts +157 -67
  9. package/dock/dock.d.ts +47 -2
  10. package/dom/domhandler.d.ts +1 -0
  11. package/esm2022/accordion/accordion.mjs +177 -43
  12. package/esm2022/api/primengconfig.mjs +75 -2
  13. package/esm2022/api/translation.mjs +1 -1
  14. package/esm2022/api/treenode.mjs +1 -1
  15. package/esm2022/autocomplete/autocomplete.mjs +3 -3
  16. package/esm2022/avatar/avatar.mjs +18 -4
  17. package/esm2022/blockui/blockui.mjs +19 -3
  18. package/esm2022/breadcrumb/breadcrumb.mjs +50 -33
  19. package/esm2022/button/button.mjs +4 -1
  20. package/esm2022/card/card.mjs +3 -3
  21. package/esm2022/chip/chip.mjs +18 -13
  22. package/esm2022/contextmenu/contextmenu.mjs +993 -547
  23. package/esm2022/divider/divider.mjs +3 -3
  24. package/esm2022/dock/dock.mjs +284 -86
  25. package/esm2022/dom/domhandler.mjs +19 -7
  26. package/esm2022/dynamicdialog/dynamicdialog-ref.mjs +4 -1
  27. package/esm2022/fieldset/fieldset.mjs +59 -32
  28. package/esm2022/image/image.mjs +11 -3
  29. package/esm2022/inplace/inplace.mjs +18 -11
  30. package/esm2022/megamenu/megamenu.mjs +997 -348
  31. package/esm2022/menu/menu.mjs +397 -166
  32. package/esm2022/menubar/menubar.mjs +895 -282
  33. package/esm2022/orderlist/orderlist.mjs +9 -15
  34. package/esm2022/panel/panel.mjs +44 -33
  35. package/esm2022/panelmenu/panelmenu.mjs +982 -344
  36. package/esm2022/progressbar/progressbar.mjs +19 -15
  37. package/esm2022/progressspinner/progressspinner.mjs +5 -5
  38. package/esm2022/ripple/ripple.mjs +3 -1
  39. package/esm2022/scrollpanel/scrollpanel.mjs +195 -23
  40. package/esm2022/scrolltop/scrolltop.mjs +11 -2
  41. package/esm2022/skeleton/skeleton.mjs +3 -3
  42. package/esm2022/slidemenu/slidemenu.mjs +1059 -372
  43. package/esm2022/splitbutton/splitbutton.mjs +2 -2
  44. package/esm2022/splitter/splitter.mjs +160 -29
  45. package/esm2022/steps/steps.mjs +112 -22
  46. package/esm2022/table/table.mjs +13 -7
  47. package/esm2022/tabmenu/tabmenu.mjs +191 -63
  48. package/esm2022/tabview/tabview.mjs +173 -39
  49. package/esm2022/terminal/terminal.mjs +3 -3
  50. package/esm2022/tieredmenu/tieredmenu.mjs +868 -392
  51. package/esm2022/toolbar/toolbar.mjs +17 -10
  52. package/esm2022/tooltip/tooltip.mjs +1 -1
  53. package/esm2022/tree/tree.mjs +3 -3
  54. package/esm2022/treetable/treetable.mjs +17 -17
  55. package/esm2022/utils/objectutils.mjs +31 -1
  56. package/esm2022/utils/uniquecomponentid.mjs +2 -3
  57. package/fesm2022/primeng-accordion.mjs +176 -42
  58. package/fesm2022/primeng-accordion.mjs.map +1 -1
  59. package/fesm2022/primeng-api.mjs +74 -1
  60. package/fesm2022/primeng-api.mjs.map +1 -1
  61. package/fesm2022/primeng-autocomplete.mjs +2 -2
  62. package/fesm2022/primeng-autocomplete.mjs.map +1 -1
  63. package/fesm2022/primeng-avatar.mjs +17 -3
  64. package/fesm2022/primeng-avatar.mjs.map +1 -1
  65. package/fesm2022/primeng-blockui.mjs +18 -2
  66. package/fesm2022/primeng-blockui.mjs.map +1 -1
  67. package/fesm2022/primeng-breadcrumb.mjs +49 -32
  68. package/fesm2022/primeng-breadcrumb.mjs.map +1 -1
  69. package/fesm2022/primeng-button.mjs +3 -0
  70. package/fesm2022/primeng-button.mjs.map +1 -1
  71. package/fesm2022/primeng-card.mjs +2 -2
  72. package/fesm2022/primeng-card.mjs.map +1 -1
  73. package/fesm2022/primeng-chip.mjs +17 -12
  74. package/fesm2022/primeng-chip.mjs.map +1 -1
  75. package/fesm2022/primeng-contextmenu.mjs +992 -546
  76. package/fesm2022/primeng-contextmenu.mjs.map +1 -1
  77. package/fesm2022/primeng-divider.mjs +2 -2
  78. package/fesm2022/primeng-divider.mjs.map +1 -1
  79. package/fesm2022/primeng-dock.mjs +283 -85
  80. package/fesm2022/primeng-dock.mjs.map +1 -1
  81. package/fesm2022/primeng-dom.mjs +18 -6
  82. package/fesm2022/primeng-dom.mjs.map +1 -1
  83. package/fesm2022/primeng-dynamicdialog.mjs +3 -0
  84. package/fesm2022/primeng-dynamicdialog.mjs.map +1 -1
  85. package/fesm2022/primeng-fieldset.mjs +57 -30
  86. package/fesm2022/primeng-fieldset.mjs.map +1 -1
  87. package/fesm2022/primeng-image.mjs +10 -2
  88. package/fesm2022/primeng-image.mjs.map +1 -1
  89. package/fesm2022/primeng-inplace.mjs +17 -10
  90. package/fesm2022/primeng-inplace.mjs.map +1 -1
  91. package/fesm2022/primeng-megamenu.mjs +996 -348
  92. package/fesm2022/primeng-megamenu.mjs.map +1 -1
  93. package/fesm2022/primeng-menu.mjs +396 -165
  94. package/fesm2022/primeng-menu.mjs.map +1 -1
  95. package/fesm2022/primeng-menubar.mjs +894 -281
  96. package/fesm2022/primeng-menubar.mjs.map +1 -1
  97. package/fesm2022/primeng-orderlist.mjs +8 -14
  98. package/fesm2022/primeng-orderlist.mjs.map +1 -1
  99. package/fesm2022/primeng-panel.mjs +44 -33
  100. package/fesm2022/primeng-panel.mjs.map +1 -1
  101. package/fesm2022/primeng-panelmenu.mjs +981 -344
  102. package/fesm2022/primeng-panelmenu.mjs.map +1 -1
  103. package/fesm2022/primeng-progressbar.mjs +18 -14
  104. package/fesm2022/primeng-progressbar.mjs.map +1 -1
  105. package/fesm2022/primeng-progressspinner.mjs +4 -4
  106. package/fesm2022/primeng-progressspinner.mjs.map +1 -1
  107. package/fesm2022/primeng-ripple.mjs +2 -0
  108. package/fesm2022/primeng-ripple.mjs.map +1 -1
  109. package/fesm2022/primeng-scrollpanel.mjs +194 -22
  110. package/fesm2022/primeng-scrollpanel.mjs.map +1 -1
  111. package/fesm2022/primeng-scrolltop.mjs +10 -1
  112. package/fesm2022/primeng-scrolltop.mjs.map +1 -1
  113. package/fesm2022/primeng-skeleton.mjs +2 -2
  114. package/fesm2022/primeng-skeleton.mjs.map +1 -1
  115. package/fesm2022/primeng-slidemenu.mjs +1058 -371
  116. package/fesm2022/primeng-slidemenu.mjs.map +1 -1
  117. package/fesm2022/primeng-splitbutton.mjs +1 -1
  118. package/fesm2022/primeng-splitbutton.mjs.map +1 -1
  119. package/fesm2022/primeng-splitter.mjs +160 -29
  120. package/fesm2022/primeng-splitter.mjs.map +1 -1
  121. package/fesm2022/primeng-steps.mjs +111 -21
  122. package/fesm2022/primeng-steps.mjs.map +1 -1
  123. package/fesm2022/primeng-table.mjs +12 -6
  124. package/fesm2022/primeng-table.mjs.map +1 -1
  125. package/fesm2022/primeng-tabmenu.mjs +190 -62
  126. package/fesm2022/primeng-tabmenu.mjs.map +1 -1
  127. package/fesm2022/primeng-tabview.mjs +172 -38
  128. package/fesm2022/primeng-tabview.mjs.map +1 -1
  129. package/fesm2022/primeng-terminal.mjs +2 -2
  130. package/fesm2022/primeng-terminal.mjs.map +1 -1
  131. package/fesm2022/primeng-tieredmenu.mjs +867 -391
  132. package/fesm2022/primeng-tieredmenu.mjs.map +1 -1
  133. package/fesm2022/primeng-toolbar.mjs +16 -9
  134. package/fesm2022/primeng-toolbar.mjs.map +1 -1
  135. package/fesm2022/primeng-tooltip.mjs.map +1 -1
  136. package/fesm2022/primeng-tree.mjs +2 -2
  137. package/fesm2022/primeng-tree.mjs.map +1 -1
  138. package/fesm2022/primeng-treetable.mjs +16 -16
  139. package/fesm2022/primeng-treetable.mjs.map +1 -1
  140. package/fesm2022/primeng-utils.mjs +31 -2
  141. package/fesm2022/primeng-utils.mjs.map +1 -1
  142. package/fieldset/fieldset.d.ts +6 -5
  143. package/image/image.d.ts +1 -0
  144. package/inplace/inplace.d.ts +6 -1
  145. package/megamenu/megamenu.d.ts +137 -15
  146. package/menu/menu.d.ts +64 -7
  147. package/menubar/menubar.d.ts +116 -22
  148. package/orderlist/orderlist.d.ts +2 -1
  149. package/package.json +124 -124
  150. package/panel/panel.d.ts +6 -5
  151. package/panelmenu/panelmenu.d.ts +134 -22
  152. package/resources/components/autocomplete/autocomplete.css +9 -8
  153. package/resources/components/breadcrumb/breadcrumb.css +9 -3
  154. package/resources/components/common/common.css +1 -1
  155. package/resources/components/contextmenu/contextmenu.css +1 -7
  156. package/resources/components/dock/dock.css +1 -1
  157. package/resources/components/megamenu/megamenu.css +9 -10
  158. package/resources/components/panelmenu/panelmenu.css +4 -2
  159. package/resources/components/slidemenu/slidemenu.css +40 -41
  160. package/resources/primeng.css +1 -1
  161. package/resources/primeng.min.css +1 -1
  162. package/resources/themes/arya-blue/theme.css +342 -390
  163. package/resources/themes/arya-green/theme.css +342 -390
  164. package/resources/themes/arya-orange/theme.css +342 -390
  165. package/resources/themes/arya-purple/theme.css +342 -390
  166. package/resources/themes/bootstrap4-dark-blue/theme.css +357 -416
  167. package/resources/themes/bootstrap4-dark-purple/theme.css +357 -416
  168. package/resources/themes/bootstrap4-light-blue/theme.css +369 -428
  169. package/resources/themes/bootstrap4-light-purple/theme.css +369 -428
  170. package/resources/themes/fluent-light/theme.css +352 -400
  171. package/resources/themes/lara-dark-blue/theme.css +344 -392
  172. package/resources/themes/lara-dark-indigo/theme.css +344 -392
  173. package/resources/themes/lara-dark-purple/theme.css +344 -392
  174. package/resources/themes/lara-dark-teal/theme.css +344 -392
  175. package/resources/themes/lara-light-blue/theme.css +370 -418
  176. package/resources/themes/lara-light-indigo/theme.css +370 -418
  177. package/resources/themes/lara-light-purple/theme.css +370 -418
  178. package/resources/themes/lara-light-teal/theme.css +370 -418
  179. package/resources/themes/luna-amber/theme.css +360 -408
  180. package/resources/themes/luna-blue/theme.css +360 -408
  181. package/resources/themes/luna-green/theme.css +360 -408
  182. package/resources/themes/luna-pink/theme.css +360 -408
  183. package/resources/themes/md-dark-deeppurple/theme.css +373 -403
  184. package/resources/themes/md-dark-indigo/theme.css +373 -403
  185. package/resources/themes/md-light-deeppurple/theme.css +373 -403
  186. package/resources/themes/md-light-indigo/theme.css +373 -403
  187. package/resources/themes/mdc-dark-deeppurple/theme.css +373 -403
  188. package/resources/themes/mdc-dark-indigo/theme.css +373 -403
  189. package/resources/themes/mdc-light-deeppurple/theme.css +373 -403
  190. package/resources/themes/mdc-light-indigo/theme.css +373 -403
  191. package/resources/themes/mira/theme.css +347 -395
  192. package/resources/themes/nano/theme.css +348 -396
  193. package/resources/themes/nova/theme.css +336 -384
  194. package/resources/themes/nova-accent/theme.css +336 -384
  195. package/resources/themes/nova-alt/theme.css +336 -384
  196. package/resources/themes/rhea/theme.css +336 -384
  197. package/resources/themes/saga-blue/theme.css +348 -396
  198. package/resources/themes/saga-green/theme.css +348 -396
  199. package/resources/themes/saga-orange/theme.css +348 -396
  200. package/resources/themes/saga-purple/theme.css +348 -396
  201. package/resources/themes/soho-dark/theme.css +362 -410
  202. package/resources/themes/soho-light/theme.css +370 -418
  203. package/resources/themes/tailwind-light/theme.css +361 -409
  204. package/resources/themes/vela-blue/theme.css +348 -396
  205. package/resources/themes/vela-green/theme.css +348 -396
  206. package/resources/themes/vela-orange/theme.css +348 -396
  207. package/resources/themes/vela-purple/theme.css +348 -396
  208. package/resources/themes/viva-dark/theme.css +342 -390
  209. package/resources/themes/viva-light/theme.css +348 -396
  210. package/scrollpanel/scrollpanel.d.ts +22 -4
  211. package/scrolltop/scrolltop.d.ts +6 -1
  212. package/slidemenu/slidemenu.d.ts +192 -88
  213. package/splitter/splitter.d.ts +18 -5
  214. package/steps/steps.d.ts +20 -3
  215. package/table/table.d.ts +3 -1
  216. package/tabmenu/tabmenu.d.ts +24 -1
  217. package/tabview/tabview.d.ts +26 -3
  218. package/tieredmenu/tieredmenu.d.ts +134 -50
  219. package/toolbar/toolbar.d.ts +6 -1
  220. package/tooltip/tooltip.d.ts +1 -1
  221. package/utils/objectutils.d.ts +4 -0
  222. package/utils/uniquecomponentid.d.ts +1 -1
@@ -2,7 +2,7 @@ import { trigger, state, style, transition, animate } from '@angular/animations'
2
2
  import * as i1 from '@angular/common';
3
3
  import { CommonModule } from '@angular/common';
4
4
  import * as i0 from '@angular/core';
5
- import { Component, ViewEncapsulation, Input, ChangeDetectionStrategy, ContentChildren, NgModule } from '@angular/core';
5
+ import { EventEmitter, Component, ViewEncapsulation, Input, Output, ViewChild, signal, computed, ChangeDetectionStrategy, ContentChildren, NgModule } from '@angular/core';
6
6
  import * as i2 from '@angular/router';
7
7
  import { RouterModule } from '@angular/router';
8
8
  import { PrimeTemplate, SharedModule } from 'primeng/api';
@@ -13,130 +13,172 @@ import { ChevronDownIcon } from 'primeng/icons/chevrondown';
13
13
  import { ChevronRightIcon } from 'primeng/icons/chevronright';
14
14
  import * as i3 from 'primeng/tooltip';
15
15
  import { TooltipModule } from 'primeng/tooltip';
16
+ import { ObjectUtils, UniqueComponentId } from 'primeng/utils';
16
17
 
17
- class BasePanelMenuItem {
18
- ref;
19
- constructor(ref) {
20
- this.ref = ref;
21
- }
22
- handleClick(event, item) {
23
- if (item.disabled) {
24
- event.preventDefault();
25
- return;
26
- }
27
- item.expanded = !item.expanded;
28
- this.ref.detectChanges();
29
- if (!item.url && !item.routerLink) {
30
- event.preventDefault();
31
- }
32
- if (item.command) {
33
- item.command({
34
- originalEvent: event,
35
- item: item
36
- });
37
- }
38
- }
39
- }
40
- class PanelMenuSub extends BasePanelMenuItem {
18
+ class PanelMenuSub {
41
19
  panelMenu;
42
- item;
43
- expanded;
44
- parentExpanded;
45
- transitionOptions;
20
+ el;
21
+ panelId;
22
+ focusedItemId;
23
+ items;
24
+ level = 0;
25
+ activeItemPath;
46
26
  root;
47
- constructor(ref, panelMenu) {
48
- super(ref);
27
+ tabindex;
28
+ transitionOptions;
29
+ itemToggle = new EventEmitter();
30
+ menuFocus = new EventEmitter();
31
+ menuBlur = new EventEmitter();
32
+ menuKeyDown = new EventEmitter();
33
+ listViewChild;
34
+ constructor(panelMenu, el) {
49
35
  this.panelMenu = panelMenu;
36
+ this.el = el;
50
37
  }
51
- onItemKeyDown(event) {
52
- let listItem = event.currentTarget;
53
- switch (event.code) {
54
- case 'Space':
55
- case 'Enter':
56
- if (listItem && !DomHandler.hasClass(listItem, 'p-disabled')) {
57
- listItem.click();
58
- }
59
- event.preventDefault();
60
- break;
61
- default:
62
- break;
63
- }
38
+ getItemId(processedItem) {
39
+ return `${this.panelId}_${processedItem.key}`;
64
40
  }
65
- getAnimation() {
66
- return this.expanded ? { value: 'visible', params: { transitionParams: this.transitionOptions, height: '*' } } : { value: 'hidden', params: { transitionParams: this.transitionOptions, height: '0' } };
67
- }
68
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: PanelMenuSub, deps: [{ token: i0.ChangeDetectorRef }, { token: PanelMenu }], target: i0.ɵɵFactoryTarget.Component });
69
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.2", type: PanelMenuSub, selector: "p-panelMenuSub", inputs: { item: "item", expanded: "expanded", parentExpanded: "parentExpanded", transitionOptions: "transitionOptions", root: "root" }, host: { classAttribute: "p-element" }, usesInheritance: true, ngImport: i0, template: `
70
- <ul [ngClass]="{ 'p-submenu-list': true, 'p-panelmenu-root-submenu': root, 'p-submenu-expanded': expanded }" [@submenu]="getAnimation()" role="tree">
71
- <ng-template ngFor let-child [ngForOf]="item?.items">
72
- <li *ngIf="child.separator" class="p-menu-separator" role="separator"></li>
73
- <li *ngIf="!child.separator" class="p-menuitem" [ngClass]="child.styleClass" [class.p-hidden]="child.visible === false" [ngStyle]="child.style" pTooltip [tooltipOptions]="child.tooltipOptions">
74
- <a
75
- *ngIf="!child.routerLink"
76
- (keydown)="onItemKeyDown($event)"
77
- [attr.href]="child.url"
78
- class="p-menuitem-link"
79
- [attr.tabindex]="!item.expanded || !parentExpanded ? null : child.disabled ? null : '0'"
80
- [attr.id]="child.id"
81
- [ngClass]="{ 'p-disabled': child.disabled }"
82
- role="treeitem"
83
- [attr.aria-expanded]="child.expanded"
84
- (click)="handleClick($event, child)"
85
- [target]="child.target"
86
- [attr.title]="child.title"
87
- >
88
- <ng-container *ngIf="child.items">
89
- <ng-container *ngIf="!panelMenu.submenuIconTemplate">
90
- <AngleDownIcon [styleClass]="'p-panelmenu-icon'" *ngIf="child.expanded" [ngStyle]="child.iconStyle" />
91
- <AngleRightIcon [styleClass]="'p-panelmenu-icon'" *ngIf="!child.expanded" [ngStyle]="child.iconStyle" />
41
+ getItemKey(processedItem) {
42
+ return this.getItemId(processedItem);
43
+ }
44
+ getItemProp(processedItem, name, params) {
45
+ return processedItem && processedItem.item ? ObjectUtils.getItemValue(processedItem.item[name], params) : undefined;
46
+ }
47
+ getItemLabel(processedItem) {
48
+ return this.getItemProp(processedItem, 'label');
49
+ }
50
+ isItemActive(processedItem) {
51
+ return processedItem.expanded || this.activeItemPath.some((path) => path && path.key === processedItem.key);
52
+ }
53
+ isItemVisible(processedItem) {
54
+ return this.getItemProp(processedItem, 'visible') !== false;
55
+ }
56
+ isItemDisabled(processedItem) {
57
+ return this.getItemProp(processedItem, 'disabled');
58
+ }
59
+ isItemFocused(processedItem) {
60
+ return this.focusedItemId === this.getItemId(processedItem);
61
+ }
62
+ isItemGroup(processedItem) {
63
+ return ObjectUtils.isNotEmpty(processedItem.items);
64
+ }
65
+ getAnimation(processedItem) {
66
+ return this.isItemActive(processedItem) ? { value: 'visible', params: { transitionParams: this.transitionOptions, height: '*' } } : { value: 'hidden', params: { transitionParams: this.transitionOptions, height: '0' } };
67
+ }
68
+ getAriaSetSize() {
69
+ return this.items.filter((processedItem) => this.isItemVisible(processedItem) && !this.getItemProp(processedItem, 'separator')).length;
70
+ }
71
+ getAriaPosInset(index) {
72
+ return index - this.items.slice(0, index).filter((processedItem) => this.isItemVisible(processedItem) && this.getItemProp(processedItem, 'separator')).length + 1;
73
+ }
74
+ onItemClick(event, processedItem) {
75
+ this.getItemProp(processedItem, 'command', { originalEvent: event, item: processedItem.item });
76
+ this.itemToggle.emit({ processedItem, expanded: !this.isItemActive(processedItem) });
77
+ }
78
+ onItemToggle(event) {
79
+ this.itemToggle.emit(event);
80
+ }
81
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: PanelMenuSub, deps: [{ token: PanelMenu }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
82
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.2", type: PanelMenuSub, selector: "p-panelMenuSub", inputs: { panelId: "panelId", focusedItemId: "focusedItemId", items: "items", level: "level", activeItemPath: "activeItemPath", root: "root", tabindex: "tabindex", transitionOptions: "transitionOptions" }, outputs: { itemToggle: "itemToggle", menuFocus: "menuFocus", menuBlur: "menuBlur", menuKeyDown: "menuKeyDown" }, host: { classAttribute: "p-element" }, viewQueries: [{ propertyName: "listViewChild", first: true, predicate: ["list"], descendants: true }], ngImport: i0, template: `
83
+ <ul
84
+ #list
85
+ [ngClass]="{ 'p-submenu-list': true, 'p-panelmenu-root-list': root }"
86
+ role="tree"
87
+ [tabindex]="-1"
88
+ [attr.aria-activedescendant]="focusedItemId"
89
+ [attr.data-pc-section]="'menu'"
90
+ (focusin)="menuFocus.emit($event)"
91
+ (focusout)="menuBlur.emit($event)"
92
+ (keydown)="menuKeyDown.emit($event)"
93
+ >
94
+ <ng-template ngFor let-processedItem let-index="index" [ngForOf]="items">
95
+ <li *ngIf="processedItem.separator" class="p-menu-separator" role="separator"></li>
96
+ <li
97
+ *ngIf="!processedItem.separator"
98
+ class="p-menuitem"
99
+ role="treeitem"
100
+ [id]="getItemId(processedItem)"
101
+ [attr.aria-label]="getItemProp(processedItem, 'label')"
102
+ [attr.aria-expanded]="isItemGroup(processedItem) ? isItemActive(processedItem) : undefined"
103
+ [attr.aria-level]="level + 1"
104
+ [attr.aria-setsize]="getAriaSetSize()"
105
+ [attr.aria-posinset]="getAriaPosInset(index)"
106
+ [ngClass]="processedItem.styleClass"
107
+ [class.p-hidden]="processedItem.visible === false"
108
+ [class.p-focus]="isItemFocused(processedItem)"
109
+ [ngStyle]="processedItem.style"
110
+ pTooltip
111
+ [tooltipOptions]="processedItem.tooltipOptions"
112
+ >
113
+ <div class="p-menuitem-content" (click)="onItemClick($event, processedItem)">
114
+ <a
115
+ *ngIf="!getItemProp(processedItem, 'routerLink')"
116
+ [attr.href]="getItemProp(processedItem, 'url')"
117
+ class="p-menuitem-link"
118
+ [ngClass]="{ 'p-disabled': getItemProp(processedItem, 'disabled') }"
119
+ [target]="getItemProp(processedItem, 'target')"
120
+ [attr.data-pc-section]="'action'"
121
+ >
122
+ <ng-container *ngIf="isItemGroup(processedItem)">
123
+ <ng-container *ngIf="!panelMenu.submenuIconTemplate">
124
+ <AngleDownIcon [styleClass]="'p-submenu-icon'" *ngIf="isItemActive(processedItem)" [ngStyle]="getItemProp(processedItem, 'iconStyle')" />
125
+ <AngleRightIcon [styleClass]="'p-submenu-icon'" *ngIf="!isItemActive(processedItem)" [ngStyle]="getItemProp(processedItem, 'iconStyle')" />
126
+ </ng-container>
127
+ <ng-template *ngTemplateOutlet="panelMenu.submenuIconTemplate"></ng-template>
92
128
  </ng-container>
93
- <ng-template *ngTemplateOutlet="panelMenu.submenuIconTemplate"></ng-template>
94
- </ng-container>
95
- <span class="p-menuitem-icon" [ngClass]="child.icon" *ngIf="child.icon" [ngStyle]="child.iconStyle"></span>
96
- <span class="p-menuitem-text" *ngIf="child.escape !== false; else htmlLabel">{{ child.label }}</span>
97
- <ng-template #htmlLabel><span class="p-menuitem-text" [innerHTML]="child.label"></span></ng-template>
98
- <span class="p-menuitem-badge" *ngIf="child.badge" [ngClass]="child.badgeStyleClass">{{ child.badge }}</span>
99
- </a>
100
- <a
101
- *ngIf="child.routerLink"
102
- (keydown)="onItemKeyDown($event)"
103
- [routerLink]="child.routerLink"
104
- [queryParams]="child.queryParams"
105
- [routerLinkActive]="'p-menuitem-link-active'"
106
- [routerLinkActiveOptions]="child.routerLinkActiveOptions || { exact: false }"
107
- class="p-menuitem-link"
108
- [ngClass]="{ 'p-disabled': child.disabled }"
109
- [attr.tabindex]="!item.expanded || !parentExpanded ? null : child.disabled ? null : '0'"
110
- [attr.id]="child.id"
111
- role="treeitem"
112
- [attr.aria-expanded]="child.expanded"
113
- (click)="handleClick($event, child)"
114
- [target]="child.target"
115
- [attr.title]="child.title"
116
- [fragment]="child.fragment"
117
- [queryParamsHandling]="child.queryParamsHandling"
118
- [preserveFragment]="child.preserveFragment"
119
- [skipLocationChange]="child.skipLocationChange"
120
- [replaceUrl]="child.replaceUrl"
121
- [state]="child.state"
122
- >
123
- <ng-container *ngIf="child.items">
124
- <ng-container *ngIf="!panelMenu.submenuIconTemplate">
125
- <AngleDownIcon *ngIf="child.expanded" [styleClass]="'p-panelmenu-icon'" [ngStyle]="child.iconStyle" />
126
- <AngleRightIcon *ngIf="!child.expanded" [styleClass]="'p-panelmenu-icon'" [ngStyle]="child.iconStyle" />
129
+ <span class="p-menuitem-icon" [ngClass]="processedItem.icon" *ngIf="processedItem.icon" [ngStyle]="getItemProp(processedItem, 'iconStyle')"></span>
130
+ <span class="p-menuitem-text" *ngIf="processedItem.escape !== false; else htmlLabel">{{ getItemProp(processedItem, 'label') }}</span>
131
+ <ng-template #htmlLabel><span class="p-menuitem-text" [innerHTML]="getItemProp(processedItem, 'label')"></span></ng-template>
132
+ <span class="p-menuitem-badge" *ngIf="processedItem.badge" [ngClass]="processedItem.badgeStyleClass">{{ processedItem.badge }}</span>
133
+ </a>
134
+ <a
135
+ *ngIf="getItemProp(processedItem, 'routerLink')"
136
+ [routerLink]="getItemProp(processedItem, 'routerLink')"
137
+ [queryParams]="getItemProp(processedItem, 'queryParams')"
138
+ [routerLinkActive]="'p-menuitem-link-active'"
139
+ [routerLinkActiveOptions]="getItemProp(processedItem, 'routerLinkActiveOptions') || { exact: false }"
140
+ class="p-menuitem-link"
141
+ [ngClass]="{ 'p-disabled': getItemProp(processedItem, 'disabled') }"
142
+ [target]="getItemProp(processedItem, 'target')"
143
+ [attr.title]="getItemProp(processedItem, 'title')"
144
+ [fragment]="getItemProp(processedItem, 'fragment')"
145
+ [queryParamsHandling]="getItemProp(processedItem, 'queryParamsHandling')"
146
+ [preserveFragment]="getItemProp(processedItem, 'preserveFragment')"
147
+ [skipLocationChange]="getItemProp(processedItem, 'skipLocationChange')"
148
+ [replaceUrl]="getItemProp(processedItem, 'replaceUrl')"
149
+ [state]="getItemProp(processedItem, 'state')"
150
+ [attr.data-pc-section]="'action'"
151
+ >
152
+ <ng-container *ngIf="isItemGroup(processedItem)">
153
+ <ng-container *ngIf="!panelMenu.submenuIconTemplate">
154
+ <AngleDownIcon *ngIf="isItemActive(processedItem)" [styleClass]="'p-submenu-icon'" [ngStyle]="getItemProp(processedItem, 'iconStyle')" />
155
+ <AngleRightIcon *ngIf="!isItemActive(processedItem)" [styleClass]="'p-submenu-icon'" [ngStyle]="getItemProp(processedItem, 'iconStyle')" />
156
+ </ng-container>
157
+ <ng-template *ngTemplateOutlet="panelMenu.submenuIconTemplate"></ng-template>
127
158
  </ng-container>
128
- <ng-template *ngTemplateOutlet="panelMenu.submenuIconTemplate"></ng-template>
129
- </ng-container>
130
- <span class="p-menuitem-icon" [ngClass]="child.icon" *ngIf="child.icon" [ngStyle]="child.iconStyle"></span>
131
- <span class="p-menuitem-text" *ngIf="child.escape !== false; else htmlRouteLabel">{{ child.label }}</span>
132
- <ng-template #htmlRouteLabel><span class="p-menuitem-text" [innerHTML]="child.label"></span></ng-template>
133
- <span class="p-menuitem-badge" *ngIf="child.badge" [ngClass]="child.badgeStyleClass">{{ child.badge }}</span>
134
- </a>
135
- <p-panelMenuSub [item]="child" [parentExpanded]="expanded && parentExpanded" [expanded]="child.expanded" [transitionOptions]="transitionOptions" *ngIf="child.items"></p-panelMenuSub>
159
+ <span class="p-menuitem-icon" [ngClass]="processedItem.icon" *ngIf="processedItem.icon" [ngStyle]="getItemProp(processedItem, 'iconStyle')"></span>
160
+ <span class="p-menuitem-text" *ngIf="getItemProp(processedItem, 'escape') !== false; else htmlRouteLabel">{{ getItemProp(processedItem, 'label') }}</span>
161
+ <ng-template #htmlRouteLabel><span class="p-menuitem-text" [innerHTML]="getItemProp(processedItem, 'label')"></span></ng-template>
162
+ <span class="p-menuitem-badge" *ngIf="processedItem.badge" [ngClass]="getItemProp(processedItem, 'badgeStyleClass')">{{ getItemProp(processedItem, 'badge') }}</span>
163
+ </a>
164
+ </div>
165
+ <div class="p-toggleable-content" [@submenu]="getAnimation(processedItem)">
166
+ <p-panelMenuSub
167
+ *ngIf="isItemVisible(processedItem) && isItemGroup(processedItem)"
168
+ [id]="getItemId(processedItem) + '_list'"
169
+ [panelId]="panelId"
170
+ [items]="processedItem.items"
171
+ [transitionOptions]="transitionOptions"
172
+ [focusedItemId]="focusedItemId"
173
+ [activeItemPath]="activeItemPath"
174
+ [level]="level + 1"
175
+ (itemToggle)="onItemToggle($event)"
176
+ ></p-panelMenuSub>
177
+ </div>
136
178
  </li>
137
179
  </ng-template>
138
180
  </ul>
139
- `, isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return i1.NgClass; }), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgForOf; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgTemplateOutlet; }), selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgStyle; }), selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i0.forwardRef(function () { return i2.RouterLink; }), selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i0.forwardRef(function () { return i2.RouterLinkActive; }), selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: i0.forwardRef(function () { return i3.Tooltip; }), selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i0.forwardRef(function () { return AngleDownIcon; }), selector: "AngleDownIcon" }, { kind: "component", type: i0.forwardRef(function () { return AngleRightIcon; }), selector: "AngleRightIcon" }, { kind: "component", type: i0.forwardRef(function () { return PanelMenuSub; }), selector: "p-panelMenuSub", inputs: ["item", "expanded", "parentExpanded", "transitionOptions", "root"] }], animations: [
181
+ `, isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return i1.NgClass; }), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgForOf; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgTemplateOutlet; }), selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgStyle; }), selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i0.forwardRef(function () { return i2.RouterLink; }), selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i0.forwardRef(function () { return i2.RouterLinkActive; }), selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: i0.forwardRef(function () { return i3.Tooltip; }), selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i0.forwardRef(function () { return AngleDownIcon; }), selector: "AngleDownIcon" }, { kind: "component", type: i0.forwardRef(function () { return AngleRightIcon; }), selector: "AngleRightIcon" }, { kind: "component", type: i0.forwardRef(function () { return PanelMenuSub; }), selector: "p-panelMenuSub", inputs: ["panelId", "focusedItemId", "items", "level", "activeItemPath", "root", "tabindex", "transitionOptions"], outputs: ["itemToggle", "menuFocus", "menuBlur", "menuKeyDown"] }], animations: [
140
182
  trigger('submenu', [
141
183
  state('hidden', style({
142
184
  height: '0'
@@ -154,72 +196,101 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImpor
154
196
  args: [{
155
197
  selector: 'p-panelMenuSub',
156
198
  template: `
157
- <ul [ngClass]="{ 'p-submenu-list': true, 'p-panelmenu-root-submenu': root, 'p-submenu-expanded': expanded }" [@submenu]="getAnimation()" role="tree">
158
- <ng-template ngFor let-child [ngForOf]="item?.items">
159
- <li *ngIf="child.separator" class="p-menu-separator" role="separator"></li>
160
- <li *ngIf="!child.separator" class="p-menuitem" [ngClass]="child.styleClass" [class.p-hidden]="child.visible === false" [ngStyle]="child.style" pTooltip [tooltipOptions]="child.tooltipOptions">
161
- <a
162
- *ngIf="!child.routerLink"
163
- (keydown)="onItemKeyDown($event)"
164
- [attr.href]="child.url"
165
- class="p-menuitem-link"
166
- [attr.tabindex]="!item.expanded || !parentExpanded ? null : child.disabled ? null : '0'"
167
- [attr.id]="child.id"
168
- [ngClass]="{ 'p-disabled': child.disabled }"
169
- role="treeitem"
170
- [attr.aria-expanded]="child.expanded"
171
- (click)="handleClick($event, child)"
172
- [target]="child.target"
173
- [attr.title]="child.title"
174
- >
175
- <ng-container *ngIf="child.items">
176
- <ng-container *ngIf="!panelMenu.submenuIconTemplate">
177
- <AngleDownIcon [styleClass]="'p-panelmenu-icon'" *ngIf="child.expanded" [ngStyle]="child.iconStyle" />
178
- <AngleRightIcon [styleClass]="'p-panelmenu-icon'" *ngIf="!child.expanded" [ngStyle]="child.iconStyle" />
199
+ <ul
200
+ #list
201
+ [ngClass]="{ 'p-submenu-list': true, 'p-panelmenu-root-list': root }"
202
+ role="tree"
203
+ [tabindex]="-1"
204
+ [attr.aria-activedescendant]="focusedItemId"
205
+ [attr.data-pc-section]="'menu'"
206
+ (focusin)="menuFocus.emit($event)"
207
+ (focusout)="menuBlur.emit($event)"
208
+ (keydown)="menuKeyDown.emit($event)"
209
+ >
210
+ <ng-template ngFor let-processedItem let-index="index" [ngForOf]="items">
211
+ <li *ngIf="processedItem.separator" class="p-menu-separator" role="separator"></li>
212
+ <li
213
+ *ngIf="!processedItem.separator"
214
+ class="p-menuitem"
215
+ role="treeitem"
216
+ [id]="getItemId(processedItem)"
217
+ [attr.aria-label]="getItemProp(processedItem, 'label')"
218
+ [attr.aria-expanded]="isItemGroup(processedItem) ? isItemActive(processedItem) : undefined"
219
+ [attr.aria-level]="level + 1"
220
+ [attr.aria-setsize]="getAriaSetSize()"
221
+ [attr.aria-posinset]="getAriaPosInset(index)"
222
+ [ngClass]="processedItem.styleClass"
223
+ [class.p-hidden]="processedItem.visible === false"
224
+ [class.p-focus]="isItemFocused(processedItem)"
225
+ [ngStyle]="processedItem.style"
226
+ pTooltip
227
+ [tooltipOptions]="processedItem.tooltipOptions"
228
+ >
229
+ <div class="p-menuitem-content" (click)="onItemClick($event, processedItem)">
230
+ <a
231
+ *ngIf="!getItemProp(processedItem, 'routerLink')"
232
+ [attr.href]="getItemProp(processedItem, 'url')"
233
+ class="p-menuitem-link"
234
+ [ngClass]="{ 'p-disabled': getItemProp(processedItem, 'disabled') }"
235
+ [target]="getItemProp(processedItem, 'target')"
236
+ [attr.data-pc-section]="'action'"
237
+ >
238
+ <ng-container *ngIf="isItemGroup(processedItem)">
239
+ <ng-container *ngIf="!panelMenu.submenuIconTemplate">
240
+ <AngleDownIcon [styleClass]="'p-submenu-icon'" *ngIf="isItemActive(processedItem)" [ngStyle]="getItemProp(processedItem, 'iconStyle')" />
241
+ <AngleRightIcon [styleClass]="'p-submenu-icon'" *ngIf="!isItemActive(processedItem)" [ngStyle]="getItemProp(processedItem, 'iconStyle')" />
242
+ </ng-container>
243
+ <ng-template *ngTemplateOutlet="panelMenu.submenuIconTemplate"></ng-template>
179
244
  </ng-container>
180
- <ng-template *ngTemplateOutlet="panelMenu.submenuIconTemplate"></ng-template>
181
- </ng-container>
182
- <span class="p-menuitem-icon" [ngClass]="child.icon" *ngIf="child.icon" [ngStyle]="child.iconStyle"></span>
183
- <span class="p-menuitem-text" *ngIf="child.escape !== false; else htmlLabel">{{ child.label }}</span>
184
- <ng-template #htmlLabel><span class="p-menuitem-text" [innerHTML]="child.label"></span></ng-template>
185
- <span class="p-menuitem-badge" *ngIf="child.badge" [ngClass]="child.badgeStyleClass">{{ child.badge }}</span>
186
- </a>
187
- <a
188
- *ngIf="child.routerLink"
189
- (keydown)="onItemKeyDown($event)"
190
- [routerLink]="child.routerLink"
191
- [queryParams]="child.queryParams"
192
- [routerLinkActive]="'p-menuitem-link-active'"
193
- [routerLinkActiveOptions]="child.routerLinkActiveOptions || { exact: false }"
194
- class="p-menuitem-link"
195
- [ngClass]="{ 'p-disabled': child.disabled }"
196
- [attr.tabindex]="!item.expanded || !parentExpanded ? null : child.disabled ? null : '0'"
197
- [attr.id]="child.id"
198
- role="treeitem"
199
- [attr.aria-expanded]="child.expanded"
200
- (click)="handleClick($event, child)"
201
- [target]="child.target"
202
- [attr.title]="child.title"
203
- [fragment]="child.fragment"
204
- [queryParamsHandling]="child.queryParamsHandling"
205
- [preserveFragment]="child.preserveFragment"
206
- [skipLocationChange]="child.skipLocationChange"
207
- [replaceUrl]="child.replaceUrl"
208
- [state]="child.state"
209
- >
210
- <ng-container *ngIf="child.items">
211
- <ng-container *ngIf="!panelMenu.submenuIconTemplate">
212
- <AngleDownIcon *ngIf="child.expanded" [styleClass]="'p-panelmenu-icon'" [ngStyle]="child.iconStyle" />
213
- <AngleRightIcon *ngIf="!child.expanded" [styleClass]="'p-panelmenu-icon'" [ngStyle]="child.iconStyle" />
245
+ <span class="p-menuitem-icon" [ngClass]="processedItem.icon" *ngIf="processedItem.icon" [ngStyle]="getItemProp(processedItem, 'iconStyle')"></span>
246
+ <span class="p-menuitem-text" *ngIf="processedItem.escape !== false; else htmlLabel">{{ getItemProp(processedItem, 'label') }}</span>
247
+ <ng-template #htmlLabel><span class="p-menuitem-text" [innerHTML]="getItemProp(processedItem, 'label')"></span></ng-template>
248
+ <span class="p-menuitem-badge" *ngIf="processedItem.badge" [ngClass]="processedItem.badgeStyleClass">{{ processedItem.badge }}</span>
249
+ </a>
250
+ <a
251
+ *ngIf="getItemProp(processedItem, 'routerLink')"
252
+ [routerLink]="getItemProp(processedItem, 'routerLink')"
253
+ [queryParams]="getItemProp(processedItem, 'queryParams')"
254
+ [routerLinkActive]="'p-menuitem-link-active'"
255
+ [routerLinkActiveOptions]="getItemProp(processedItem, 'routerLinkActiveOptions') || { exact: false }"
256
+ class="p-menuitem-link"
257
+ [ngClass]="{ 'p-disabled': getItemProp(processedItem, 'disabled') }"
258
+ [target]="getItemProp(processedItem, 'target')"
259
+ [attr.title]="getItemProp(processedItem, 'title')"
260
+ [fragment]="getItemProp(processedItem, 'fragment')"
261
+ [queryParamsHandling]="getItemProp(processedItem, 'queryParamsHandling')"
262
+ [preserveFragment]="getItemProp(processedItem, 'preserveFragment')"
263
+ [skipLocationChange]="getItemProp(processedItem, 'skipLocationChange')"
264
+ [replaceUrl]="getItemProp(processedItem, 'replaceUrl')"
265
+ [state]="getItemProp(processedItem, 'state')"
266
+ [attr.data-pc-section]="'action'"
267
+ >
268
+ <ng-container *ngIf="isItemGroup(processedItem)">
269
+ <ng-container *ngIf="!panelMenu.submenuIconTemplate">
270
+ <AngleDownIcon *ngIf="isItemActive(processedItem)" [styleClass]="'p-submenu-icon'" [ngStyle]="getItemProp(processedItem, 'iconStyle')" />
271
+ <AngleRightIcon *ngIf="!isItemActive(processedItem)" [styleClass]="'p-submenu-icon'" [ngStyle]="getItemProp(processedItem, 'iconStyle')" />
272
+ </ng-container>
273
+ <ng-template *ngTemplateOutlet="panelMenu.submenuIconTemplate"></ng-template>
214
274
  </ng-container>
215
- <ng-template *ngTemplateOutlet="panelMenu.submenuIconTemplate"></ng-template>
216
- </ng-container>
217
- <span class="p-menuitem-icon" [ngClass]="child.icon" *ngIf="child.icon" [ngStyle]="child.iconStyle"></span>
218
- <span class="p-menuitem-text" *ngIf="child.escape !== false; else htmlRouteLabel">{{ child.label }}</span>
219
- <ng-template #htmlRouteLabel><span class="p-menuitem-text" [innerHTML]="child.label"></span></ng-template>
220
- <span class="p-menuitem-badge" *ngIf="child.badge" [ngClass]="child.badgeStyleClass">{{ child.badge }}</span>
221
- </a>
222
- <p-panelMenuSub [item]="child" [parentExpanded]="expanded && parentExpanded" [expanded]="child.expanded" [transitionOptions]="transitionOptions" *ngIf="child.items"></p-panelMenuSub>
275
+ <span class="p-menuitem-icon" [ngClass]="processedItem.icon" *ngIf="processedItem.icon" [ngStyle]="getItemProp(processedItem, 'iconStyle')"></span>
276
+ <span class="p-menuitem-text" *ngIf="getItemProp(processedItem, 'escape') !== false; else htmlRouteLabel">{{ getItemProp(processedItem, 'label') }}</span>
277
+ <ng-template #htmlRouteLabel><span class="p-menuitem-text" [innerHTML]="getItemProp(processedItem, 'label')"></span></ng-template>
278
+ <span class="p-menuitem-badge" *ngIf="processedItem.badge" [ngClass]="getItemProp(processedItem, 'badgeStyleClass')">{{ getItemProp(processedItem, 'badge') }}</span>
279
+ </a>
280
+ </div>
281
+ <div class="p-toggleable-content" [@submenu]="getAnimation(processedItem)">
282
+ <p-panelMenuSub
283
+ *ngIf="isItemVisible(processedItem) && isItemGroup(processedItem)"
284
+ [id]="getItemId(processedItem) + '_list'"
285
+ [panelId]="panelId"
286
+ [items]="processedItem.items"
287
+ [transitionOptions]="transitionOptions"
288
+ [focusedItemId]="focusedItemId"
289
+ [activeItemPath]="activeItemPath"
290
+ [level]="level + 1"
291
+ (itemToggle)="onItemToggle($event)"
292
+ ></p-panelMenuSub>
293
+ </div>
223
294
  </li>
224
295
  </ng-template>
225
296
  </ul>
@@ -241,22 +312,412 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImpor
241
312
  class: 'p-element'
242
313
  }
243
314
  }]
244
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: PanelMenu }]; }, propDecorators: { item: [{
315
+ }], ctorParameters: function () { return [{ type: PanelMenu }, { type: i0.ElementRef }]; }, propDecorators: { panelId: [{
245
316
  type: Input
246
- }], expanded: [{
317
+ }], focusedItemId: [{
318
+ type: Input
319
+ }], items: [{
320
+ type: Input
321
+ }], level: [{
322
+ type: Input
323
+ }], activeItemPath: [{
324
+ type: Input
325
+ }], root: [{
326
+ type: Input
327
+ }], tabindex: [{
328
+ type: Input
329
+ }], transitionOptions: [{
330
+ type: Input
331
+ }], itemToggle: [{
332
+ type: Output
333
+ }], menuFocus: [{
334
+ type: Output
335
+ }], menuBlur: [{
336
+ type: Output
337
+ }], menuKeyDown: [{
338
+ type: Output
339
+ }], listViewChild: [{
340
+ type: ViewChild,
341
+ args: ['list']
342
+ }] } });
343
+ class PanelMenuList {
344
+ panelId;
345
+ id;
346
+ items;
347
+ parentExpanded;
348
+ expanded;
349
+ transitionOptions;
350
+ root;
351
+ tabindex;
352
+ activeItem;
353
+ itemToggle = new EventEmitter();
354
+ headerFocus = new EventEmitter();
355
+ subMenuViewChild;
356
+ searchTimeout;
357
+ searchValue;
358
+ focused;
359
+ focusedItem = signal(null);
360
+ activeItemPath = signal([]);
361
+ processedItems = signal([]);
362
+ visibleItems = computed(() => {
363
+ const processedItems = this.processedItems();
364
+ return this.flatItems(processedItems);
365
+ });
366
+ get focusedItemId() {
367
+ return ObjectUtils.isNotEmpty(this.focusedItem()) ? `${this.panelId}_${this.focusedItem().key}` : undefined;
368
+ }
369
+ ngOnChanges(changes) {
370
+ if (changes && changes.items && changes.items.currentValue) {
371
+ this.processedItems.set(this.createProcessedItems(changes.items.currentValue || []));
372
+ }
373
+ }
374
+ getItemProp(processedItem, name) {
375
+ return processedItem && processedItem.item ? ObjectUtils.getItemValue(processedItem.item[name]) : undefined;
376
+ }
377
+ getItemLabel(processedItem) {
378
+ return this.getItemProp(processedItem, 'label');
379
+ }
380
+ isItemVisible(processedItem) {
381
+ return this.getItemProp(processedItem, 'visible') !== false;
382
+ }
383
+ isItemDisabled(processedItem) {
384
+ return this.getItemProp(processedItem, 'disabled');
385
+ }
386
+ isItemActive(processedItem) {
387
+ return this.activeItemPath().some((path) => path.key === processedItem.parentKey);
388
+ }
389
+ isItemGroup(processedItem) {
390
+ return ObjectUtils.isNotEmpty(processedItem.items);
391
+ }
392
+ isElementInPanel(event, element) {
393
+ const panel = event.currentTarget.closest('[data-pc-section="panel"]');
394
+ return panel && panel.contains(element);
395
+ }
396
+ isItemMatched(processedItem) {
397
+ return this.isValidItem(processedItem) && this.getItemLabel(processedItem).toLocaleLowerCase().startsWith(this.searchValue.toLocaleLowerCase());
398
+ }
399
+ isVisibleItem(processedItem) {
400
+ return !!processedItem && (processedItem.level === 0 || this.isItemActive(processedItem)) && this.isItemVisible(processedItem);
401
+ }
402
+ isValidItem(processedItem) {
403
+ return !!processedItem && !this.isItemDisabled(processedItem);
404
+ }
405
+ findFirstItem() {
406
+ return this.visibleItems().find((processedItem) => this.isValidItem(processedItem));
407
+ }
408
+ findLastItem() {
409
+ return ObjectUtils.findLast(this.visibleItems(), (processedItem) => this.isValidItem(processedItem));
410
+ }
411
+ createProcessedItems(items, level = 0, parent = {}, parentKey = '') {
412
+ const processedItems = [];
413
+ items &&
414
+ items.forEach((item, index) => {
415
+ const key = (parentKey !== '' ? parentKey + '_' : '') + index;
416
+ const newItem = {
417
+ icon: item.icon,
418
+ expanded: item.expanded,
419
+ item,
420
+ index,
421
+ level,
422
+ key,
423
+ parent,
424
+ parentKey
425
+ };
426
+ newItem['items'] = this.createProcessedItems(item.items, level + 1, newItem, key);
427
+ processedItems.push(newItem);
428
+ });
429
+ return processedItems;
430
+ }
431
+ findProcessedItemByItemKey(key, processedItems, level = 0) {
432
+ processedItems = processedItems || this.processedItems();
433
+ if (processedItems && processedItems.length) {
434
+ for (let i = 0; i < processedItems.length; i++) {
435
+ const processedItem = processedItems[i];
436
+ if (this.getItemProp(processedItem, 'key') === key)
437
+ return processedItem;
438
+ const matchedItem = this.findProcessedItemByItemKey(key, processedItem.items, level + 1);
439
+ if (matchedItem)
440
+ return matchedItem;
441
+ }
442
+ }
443
+ }
444
+ flatItems(processedItems, processedFlattenItems = []) {
445
+ processedItems &&
446
+ processedItems.forEach((processedItem) => {
447
+ if (this.isVisibleItem(processedItem)) {
448
+ processedFlattenItems.push(processedItem);
449
+ this.flatItems(processedItem.items, processedFlattenItems);
450
+ }
451
+ });
452
+ return processedFlattenItems;
453
+ }
454
+ changeFocusedItem(event) {
455
+ const { originalEvent, processedItem, focusOnNext, selfCheck, allowHeaderFocus = true } = event;
456
+ if (ObjectUtils.isNotEmpty(this.focusedItem()) && this.focusedItem().key !== processedItem.key) {
457
+ this.focusedItem.set(processedItem);
458
+ this.scrollInView();
459
+ }
460
+ else if (allowHeaderFocus) {
461
+ this.headerFocus.emit({ originalEvent, focusOnNext, selfCheck });
462
+ }
463
+ }
464
+ scrollInView() {
465
+ const element = DomHandler.findSingle(this.subMenuViewChild.listViewChild.nativeElement, `li[id="${`${this.focusedItemId}`}"]`);
466
+ if (element) {
467
+ element.scrollIntoView && element.scrollIntoView({ block: 'nearest', inline: 'start' });
468
+ }
469
+ }
470
+ onFocus(event) {
471
+ this.focused = true;
472
+ const focusedItem = this.focusedItem() || (this.isElementInPanel(event, event.relatedTarget) ? this.findFirstItem() : this.findLastItem());
473
+ if (event.relatedTarget !== null)
474
+ this.focusedItem.set(focusedItem);
475
+ }
476
+ onBlur(event) {
477
+ this.focused = false;
478
+ this.focusedItem.set(null);
479
+ this.searchValue = '';
480
+ }
481
+ onItemToggle(event) {
482
+ const { processedItem, expanded } = event;
483
+ processedItem.expanded = !processedItem.expanded;
484
+ const activeItemPath = this.activeItemPath().filter((p) => p.parentKey !== processedItem.parentKey);
485
+ expanded && activeItemPath.push(processedItem);
486
+ this.activeItemPath.set(activeItemPath);
487
+ this.processedItems.mutate((value) => value.map((i) => (i === processedItem ? processedItem : i)));
488
+ this.focusedItem.set(processedItem);
489
+ }
490
+ onKeyDown(event) {
491
+ const metaKey = event.metaKey || event.ctrlKey;
492
+ switch (event.code) {
493
+ case 'ArrowDown':
494
+ this.onArrowDownKey(event);
495
+ break;
496
+ case 'ArrowUp':
497
+ this.onArrowUpKey(event);
498
+ break;
499
+ case 'ArrowLeft':
500
+ this.onArrowLeftKey(event);
501
+ break;
502
+ case 'ArrowRight':
503
+ this.onArrowRightKey(event);
504
+ break;
505
+ case 'Home':
506
+ this.onHomeKey(event);
507
+ break;
508
+ case 'End':
509
+ this.onEndKey(event);
510
+ break;
511
+ case 'Space':
512
+ this.onSpaceKey(event);
513
+ break;
514
+ case 'Enter':
515
+ this.onEnterKey(event);
516
+ break;
517
+ case 'Escape':
518
+ case 'Tab':
519
+ case 'PageDown':
520
+ case 'PageUp':
521
+ case 'Backspace':
522
+ case 'ShiftLeft':
523
+ case 'ShiftRight':
524
+ //NOOP
525
+ break;
526
+ default:
527
+ if (!metaKey && ObjectUtils.isPrintableCharacter(event.key)) {
528
+ this.searchItems(event, event.key);
529
+ }
530
+ break;
531
+ }
532
+ }
533
+ onArrowDownKey(event) {
534
+ const processedItem = ObjectUtils.isNotEmpty(this.focusedItem()) ? this.findNextItem(this.focusedItem()) : this.findFirstItem();
535
+ this.changeFocusedItem({ originalEvent: event, processedItem, focusOnNext: true });
536
+ event.preventDefault();
537
+ }
538
+ onArrowUpKey(event) {
539
+ const processedItem = ObjectUtils.isNotEmpty(this.focusedItem()) ? this.findPrevItem(this.focusedItem()) : this.findLastItem();
540
+ this.changeFocusedItem({ originalEvent: event, processedItem, selfCheck: true });
541
+ event.preventDefault();
542
+ }
543
+ onArrowLeftKey(event) {
544
+ if (ObjectUtils.isNotEmpty(this.focusedItem())) {
545
+ const matched = this.activeItemPath().some((p) => p.key === this.focusedItem().key);
546
+ if (matched) {
547
+ const activeItemPath = this.activeItemPath().filter((p) => p.key !== this.focusedItem().key);
548
+ this.activeItemPath.set(activeItemPath);
549
+ }
550
+ else {
551
+ const focusedItem = ObjectUtils.isNotEmpty(this.focusedItem().parent) ? this.focusedItem().parent : this.focusedItem();
552
+ this.focusedItem.set(focusedItem);
553
+ }
554
+ event.preventDefault();
555
+ }
556
+ }
557
+ onArrowRightKey(event) {
558
+ if (ObjectUtils.isNotEmpty(this.focusedItem())) {
559
+ const grouped = this.isItemGroup(this.focusedItem());
560
+ if (grouped) {
561
+ const matched = this.activeItemPath().some((p) => p.key === this.focusedItem().key);
562
+ if (matched) {
563
+ this.onArrowDownKey(event);
564
+ }
565
+ else {
566
+ const activeItemPath = this.activeItemPath().filter((p) => p.parentKey !== this.focusedItem().parentKey);
567
+ activeItemPath.push(this.focusedItem());
568
+ this.activeItemPath.set(activeItemPath);
569
+ }
570
+ }
571
+ event.preventDefault();
572
+ }
573
+ }
574
+ onHomeKey(event) {
575
+ this.changeFocusedItem({ originalEvent: event, processedItem: this.findFirstItem(), allowHeaderFocus: false });
576
+ event.preventDefault();
577
+ }
578
+ onEndKey(event) {
579
+ this.changeFocusedItem({ originalEvent: event, processedItem: this.findLastItem(), focusOnNext: true, allowHeaderFocus: false });
580
+ event.preventDefault();
581
+ }
582
+ onEnterKey(event) {
583
+ if (ObjectUtils.isNotEmpty(this.focusedItem())) {
584
+ const element = DomHandler.findSingle(this.subMenuViewChild.listViewChild.nativeElement, `li[id="${`${this.focusedItemId}`}"]`);
585
+ const anchorElement = element && (DomHandler.findSingle(element, '[data-pc-section="action"]') || DomHandler.findSingle(element, 'a,button'));
586
+ anchorElement ? anchorElement.click() : element && element.click();
587
+ }
588
+ event.preventDefault();
589
+ }
590
+ onSpaceKey(event) {
591
+ this.onEnterKey(event);
592
+ }
593
+ findNextItem(processedItem) {
594
+ const index = this.visibleItems().findIndex((item) => item.key === processedItem.key);
595
+ const matchedItem = index < this.visibleItems().length - 1
596
+ ? this.visibleItems()
597
+ .slice(index + 1)
598
+ .find((pItem) => this.isValidItem(pItem))
599
+ : undefined;
600
+ return matchedItem || processedItem;
601
+ }
602
+ findPrevItem(processedItem) {
603
+ const index = this.visibleItems().findIndex((item) => item.key === processedItem.key);
604
+ const matchedItem = index > 0 ? ObjectUtils.findLast(this.visibleItems().slice(0, index), (pItem) => this.isValidItem(pItem)) : undefined;
605
+ return matchedItem || processedItem;
606
+ }
607
+ searchItems(event, char) {
608
+ this.searchValue = (this.searchValue || '') + char;
609
+ let matchedItem = null;
610
+ let matched = false;
611
+ if (ObjectUtils.isNotEmpty(this.focusedItem())) {
612
+ const focusedItemIndex = this.visibleItems().findIndex((processedItem) => processedItem.key === this.focusedItem().key);
613
+ matchedItem = this.visibleItems()
614
+ .slice(focusedItemIndex)
615
+ .find((processedItem) => this.isItemMatched(processedItem));
616
+ matchedItem = ObjectUtils.isEmpty(matchedItem)
617
+ ? this.visibleItems()
618
+ .slice(0, focusedItemIndex)
619
+ .find((processedItem) => this.isItemMatched(processedItem))
620
+ : matchedItem;
621
+ }
622
+ else {
623
+ matchedItem = this.visibleItems().find((processedItem) => this.isItemMatched(processedItem));
624
+ }
625
+ if (ObjectUtils.isNotEmpty(matchedItem)) {
626
+ matched = true;
627
+ }
628
+ if (ObjectUtils.isEmpty(matchedItem) && ObjectUtils.isEmpty(this.focusedItem())) {
629
+ matchedItem = this.findFirstItem();
630
+ }
631
+ if (ObjectUtils.isNotEmpty(matchedItem)) {
632
+ this.changeFocusedItem({
633
+ originalEvent: event,
634
+ processedItem: matchedItem,
635
+ allowHeaderFocus: false
636
+ });
637
+ }
638
+ if (this.searchTimeout) {
639
+ clearTimeout(this.searchTimeout);
640
+ }
641
+ this.searchTimeout = setTimeout(() => {
642
+ this.searchValue = '';
643
+ this.searchTimeout = null;
644
+ }, 500);
645
+ return matched;
646
+ }
647
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: PanelMenuList, deps: [], target: i0.ɵɵFactoryTarget.Component });
648
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.2", type: PanelMenuList, selector: "p-panelMenuList", inputs: { panelId: "panelId", id: "id", items: "items", parentExpanded: "parentExpanded", expanded: "expanded", transitionOptions: "transitionOptions", root: "root", tabindex: "tabindex", activeItem: "activeItem" }, outputs: { itemToggle: "itemToggle", headerFocus: "headerFocus" }, host: { classAttribute: "p-element" }, viewQueries: [{ propertyName: "subMenuViewChild", first: true, predicate: ["submenu"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
649
+ <p-panelMenuSub
650
+ #submenu
651
+ [root]="true"
652
+ [id]="panelId + '_list'"
653
+ [panelId]="panelId"
654
+ [tabindex]="tabindex"
655
+ [focusedItemId]="focused ? focusedItemId : undefined"
656
+ [activeItemPath]="activeItemPath()"
657
+ [transitionOptions]="transitionOptions"
658
+ [items]="processedItems()"
659
+ [activeItemPath]="activeItemPath()"
660
+ (itemToggle)="onItemToggle($event)"
661
+ (keydown)="onKeyDown($event)"
662
+ (menuFocus)="onFocus($event)"
663
+ (menuBlur)="onBlur($event)"
664
+ ></p-panelMenuSub>
665
+ `, isInline: true, styles: [".p-panelmenu .p-panelmenu-header-action{display:flex;align-items:center;-webkit-user-select:none;user-select:none;cursor:pointer;position:relative;text-decoration:none}.p-panelmenu .p-panelmenu-header-action:focus{z-index:1}.p-panelmenu .p-submenu-list{margin:0;padding:0;list-style:none}.p-panelmenu .p-menuitem-link{display:flex;align-items:center;-webkit-user-select:none;user-select:none;cursor:pointer;text-decoration:none;position:relative;overflow:hidden}.p-panelmenu .p-menuitem-text{line-height:1}.p-panelmenu-expanded.p-toggleable-content:not(.ng-animating),.p-panelmenu .p-submenu-expanded:not(.ng-animating){overflow:visible}.p-panelmenu .p-toggleable-content,.p-panelmenu .p-submenu-list{overflow:hidden}\n"], dependencies: [{ kind: "component", type: PanelMenuSub, selector: "p-panelMenuSub", inputs: ["panelId", "focusedItemId", "items", "level", "activeItemPath", "root", "tabindex", "transitionOptions"], outputs: ["itemToggle", "menuFocus", "menuBlur", "menuKeyDown"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
666
+ }
667
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: PanelMenuList, decorators: [{
668
+ type: Component,
669
+ args: [{ selector: 'p-panelMenuList', template: `
670
+ <p-panelMenuSub
671
+ #submenu
672
+ [root]="true"
673
+ [id]="panelId + '_list'"
674
+ [panelId]="panelId"
675
+ [tabindex]="tabindex"
676
+ [focusedItemId]="focused ? focusedItemId : undefined"
677
+ [activeItemPath]="activeItemPath()"
678
+ [transitionOptions]="transitionOptions"
679
+ [items]="processedItems()"
680
+ [activeItemPath]="activeItemPath()"
681
+ (itemToggle)="onItemToggle($event)"
682
+ (keydown)="onKeyDown($event)"
683
+ (menuFocus)="onFocus($event)"
684
+ (menuBlur)="onBlur($event)"
685
+ ></p-panelMenuSub>
686
+ `, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
687
+ class: 'p-element'
688
+ }, styles: [".p-panelmenu .p-panelmenu-header-action{display:flex;align-items:center;-webkit-user-select:none;user-select:none;cursor:pointer;position:relative;text-decoration:none}.p-panelmenu .p-panelmenu-header-action:focus{z-index:1}.p-panelmenu .p-submenu-list{margin:0;padding:0;list-style:none}.p-panelmenu .p-menuitem-link{display:flex;align-items:center;-webkit-user-select:none;user-select:none;cursor:pointer;text-decoration:none;position:relative;overflow:hidden}.p-panelmenu .p-menuitem-text{line-height:1}.p-panelmenu-expanded.p-toggleable-content:not(.ng-animating),.p-panelmenu .p-submenu-expanded:not(.ng-animating){overflow:visible}.p-panelmenu .p-toggleable-content,.p-panelmenu .p-submenu-list{overflow:hidden}\n"] }]
689
+ }], propDecorators: { panelId: [{
690
+ type: Input
691
+ }], id: [{
692
+ type: Input
693
+ }], items: [{
247
694
  type: Input
248
695
  }], parentExpanded: [{
249
696
  type: Input
697
+ }], expanded: [{
698
+ type: Input
250
699
  }], transitionOptions: [{
251
700
  type: Input
252
701
  }], root: [{
253
702
  type: Input
703
+ }], tabindex: [{
704
+ type: Input
705
+ }], activeItem: [{
706
+ type: Input
707
+ }], itemToggle: [{
708
+ type: Output
709
+ }], headerFocus: [{
710
+ type: Output
711
+ }], subMenuViewChild: [{
712
+ type: ViewChild,
713
+ args: ['submenu']
254
714
  }] } });
255
715
  /**
256
716
  * PanelMenu is a hybrid of Accordion and Tree components.
257
717
  * @group Components
258
718
  */
259
- class PanelMenu extends BasePanelMenuItem {
719
+ class PanelMenu {
720
+ cd;
260
721
  /**
261
722
  * An array of menuitems.
262
723
  * @group Props
@@ -276,17 +737,29 @@ class PanelMenu extends BasePanelMenuItem {
276
737
  * Whether multiple tabs can be activated at the same time or not.
277
738
  * @group Props
278
739
  */
279
- multiple = true;
740
+ multiple = false;
280
741
  /**
281
742
  * Transition options of the animation.
282
743
  * @group Props
283
744
  */
284
745
  transitionOptions = '400ms cubic-bezier(0.86, 0, 0.07, 1)';
746
+ /**
747
+ * Current id state as a string.
748
+ * @group Props
749
+ */
750
+ id;
751
+ /**
752
+ * Index of the element in tabbing order.
753
+ * @group Props
754
+ */
755
+ tabindex = 0;
285
756
  templates;
757
+ containerViewChild;
286
758
  submenuIconTemplate;
287
759
  animating;
288
- constructor(ref) {
289
- super(ref);
760
+ activeItem = signal(null);
761
+ ngOnInit() {
762
+ this.id = this.id || UniqueComponentId();
290
763
  }
291
764
  ngAfterContentInit() {
292
765
  this.templates?.forEach((item) => {
@@ -297,14 +770,96 @@ class PanelMenu extends BasePanelMenuItem {
297
770
  }
298
771
  });
299
772
  }
773
+ constructor(cd) {
774
+ this.cd = cd;
775
+ }
776
+ /**
777
+ * Collapses open panels.
778
+ * @group Method
779
+ */
300
780
  collapseAll() {
301
781
  for (let item of this.model) {
302
782
  if (item.expanded) {
303
783
  item.expanded = false;
304
784
  }
305
785
  }
786
+ this.cd.detectChanges();
787
+ }
788
+ onToggleDone() {
789
+ this.animating = false;
790
+ }
791
+ changeActiveItem(event, item, index, selfActive = false) {
792
+ if (!this.isItemDisabled(item)) {
793
+ const activeItem = selfActive ? item : this.activeItem && ObjectUtils.equals(item, this.activeItem) ? null : item;
794
+ this.activeItem.set(activeItem);
795
+ }
796
+ }
797
+ getAnimation(item) {
798
+ return item.expanded ? { value: 'visible', params: { transitionParams: this.animating ? this.transitionOptions : '0ms', height: '*' } } : { value: 'hidden', params: { transitionParams: this.transitionOptions, height: '0' } };
799
+ }
800
+ getItemProp(item, name) {
801
+ return item ? ObjectUtils.getItemValue(item[name]) : undefined;
802
+ }
803
+ getItemLabel(item) {
804
+ return this.getItemProp(item, 'label');
306
805
  }
307
- handleClick(event, item) {
806
+ isItemActive(item) {
807
+ return item.expanded;
808
+ }
809
+ isItemVisible(item) {
810
+ return this.getItemProp(item, 'visible') !== false;
811
+ }
812
+ isItemDisabled(item) {
813
+ return this.getItemProp(item, 'disabled');
814
+ }
815
+ isItemGroup(item) {
816
+ return ObjectUtils.isNotEmpty(item.items);
817
+ }
818
+ getPanelId(index) {
819
+ return `${this.id}_${index}`;
820
+ }
821
+ getPanelKey(index) {
822
+ return this.getPanelId(index);
823
+ }
824
+ getHeaderId(index) {
825
+ return `${this.getPanelId(index)}_header`;
826
+ }
827
+ getContentId(index) {
828
+ return `${this.getPanelId(index)}_content`;
829
+ }
830
+ updateFocusedHeader(event) {
831
+ const { originalEvent, focusOnNext, selfCheck } = event;
832
+ const panelElement = originalEvent.currentTarget.closest('[data-pc-section="panel"]');
833
+ const header = selfCheck ? DomHandler.findSingle(panelElement, '[data-pc-section="header"]') : focusOnNext ? this.findNextHeader(panelElement) : this.findPrevHeader(panelElement);
834
+ header ? this.changeFocusedHeader(originalEvent, header) : focusOnNext ? this.onHeaderHomeKey(originalEvent) : this.onHeaderEndKey(originalEvent);
835
+ }
836
+ changeFocusedHeader(event, element) {
837
+ element && DomHandler.focus(element);
838
+ }
839
+ findNextHeader(panelElement, selfCheck = false) {
840
+ const nextPanelElement = selfCheck ? panelElement : panelElement.nextElementSibling;
841
+ const headerElement = DomHandler.findSingle(nextPanelElement, '[data-pc-section="header"]');
842
+ return headerElement ? (DomHandler.getAttribute(headerElement, 'data-p-disabled') ? this.findNextHeader(headerElement.parentElement) : headerElement) : null;
843
+ }
844
+ findPrevHeader(panelElement, selfCheck = false) {
845
+ const prevPanelElement = selfCheck ? panelElement : panelElement.previousElementSibling;
846
+ const headerElement = DomHandler.findSingle(prevPanelElement, '[data-pc-section="header"]');
847
+ return headerElement ? (DomHandler.getAttribute(headerElement, 'data-p-disabled') ? this.findPrevHeader(headerElement.parentElement) : headerElement) : null;
848
+ }
849
+ findFirstHeader() {
850
+ return this.findNextHeader(this.containerViewChild.nativeElement.firstElementChild, true);
851
+ }
852
+ findLastHeader() {
853
+ return this.findPrevHeader(this.containerViewChild.nativeElement.lastElementChild, true);
854
+ }
855
+ onHeaderClick(event, item, index) {
856
+ if (this.isItemDisabled(item)) {
857
+ event.preventDefault();
858
+ return;
859
+ }
860
+ if (item.command) {
861
+ item.command({ originalEvent: event, item });
862
+ }
308
863
  if (!this.multiple) {
309
864
  for (let modelItem of this.model) {
310
865
  if (item !== modelItem && modelItem.expanded) {
@@ -312,112 +867,162 @@ class PanelMenu extends BasePanelMenuItem {
312
867
  }
313
868
  }
314
869
  }
870
+ item.expanded = !item.expanded;
871
+ this.changeActiveItem(event, item, index);
315
872
  this.animating = true;
316
- super.handleClick(event, item);
873
+ DomHandler.focus(event.currentTarget);
317
874
  }
318
- onToggleDone() {
319
- this.animating = false;
320
- }
321
- onItemKeyDown(event) {
322
- let listItem = event.currentTarget;
875
+ onHeaderKeyDown(event, item, index) {
323
876
  switch (event.code) {
324
- case 'Space':
877
+ case 'ArrowDown':
878
+ this.onHeaderArrowDownKey(event);
879
+ break;
880
+ case 'ArrowUp':
881
+ this.onHeaderArrowUpKey(event);
882
+ break;
883
+ case 'Home':
884
+ this.onHeaderHomeKey(event);
885
+ break;
886
+ case 'End':
887
+ this.onHeaderEndKey(event);
888
+ break;
325
889
  case 'Enter':
326
- if (listItem && !DomHandler.hasClass(listItem, 'p-disabled')) {
327
- listItem.click();
328
- }
329
- event.preventDefault();
890
+ case 'Space':
891
+ this.onHeaderEnterKey(event, item, index);
330
892
  break;
331
893
  default:
332
894
  break;
333
895
  }
334
896
  }
335
- visible(item) {
336
- return item.visible !== false;
897
+ onHeaderArrowDownKey(event) {
898
+ const rootList = DomHandler.getAttribute(event.currentTarget, 'data-p-highlight') === true ? DomHandler.findSingle(event.currentTarget.nextElementSibling, '[data-pc-section="menu"]') : null;
899
+ rootList ? DomHandler.focus(rootList) : this.updateFocusedHeader({ originalEvent: event, focusOnNext: true });
900
+ event.preventDefault();
337
901
  }
338
- getAnimation(item) {
339
- return item.expanded ? { value: 'visible', params: { transitionParams: this.animating ? this.transitionOptions : '0ms', height: '*' } } : { value: 'hidden', params: { transitionParams: this.transitionOptions, height: '0' } };
902
+ onHeaderArrowUpKey(event) {
903
+ const prevHeader = this.findPrevHeader(event.currentTarget.parentElement) || this.findLastHeader();
904
+ const rootList = DomHandler.getAttribute(prevHeader, 'data-p-highlight') === true ? DomHandler.findSingle(prevHeader.nextElementSibling, '[data-pc-section="menu"]') : null;
905
+ rootList ? DomHandler.focus(rootList) : this.updateFocusedHeader({ originalEvent: event, focusOnNext: false });
906
+ event.preventDefault();
907
+ }
908
+ onHeaderHomeKey(event) {
909
+ this.changeFocusedHeader(event, this.findFirstHeader());
910
+ event.preventDefault();
911
+ }
912
+ onHeaderEndKey(event) {
913
+ this.changeFocusedHeader(event, this.findLastHeader());
914
+ event.preventDefault();
915
+ }
916
+ onHeaderEnterKey(event, item, index) {
917
+ const headerAction = DomHandler.findSingle(event.currentTarget, '[data-pc-section="headeraction"]');
918
+ headerAction ? headerAction.click() : this.onHeaderClick(event, item, index);
919
+ event.preventDefault();
340
920
  }
341
921
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: PanelMenu, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
342
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.2", type: PanelMenu, selector: "p-panelMenu", inputs: { model: "model", style: "style", styleClass: "styleClass", multiple: "multiple", transitionOptions: "transitionOptions" }, host: { classAttribute: "p-element" }, queries: [{ propertyName: "templates", predicate: PrimeTemplate }], usesInheritance: true, ngImport: i0, template: `
343
- <div [class]="styleClass" [ngStyle]="style" [ngClass]="'p-panelmenu p-component'">
344
- <ng-container *ngFor="let item of model; let f = first; let l = last">
345
- <div class="p-panelmenu-panel" *ngIf="visible(item)">
346
- <div [ngClass]="{ 'p-component p-panelmenu-header': true, 'p-highlight': item.expanded, 'p-disabled': item.disabled }" [class]="item.styleClass" [ngStyle]="item.style" pTooltip [tooltipOptions]="item.tooltipOptions">
347
- <a
348
- *ngIf="!item.routerLink"
349
- [attr.href]="item.url"
350
- (click)="handleClick($event, item)"
351
- (keydown)="onItemKeyDown($event)"
352
- [attr.tabindex]="item.disabled ? null : '0'"
353
- [attr.id]="item.id"
354
- [target]="item.target"
355
- [attr.title]="item.title"
356
- class="p-panelmenu-header-link"
357
- [attr.aria-expanded]="item.expanded"
358
- [attr.id]="item.id + '_header'"
359
- [attr.aria-controls]="item.id + '_content'"
360
- >
361
- <!--
362
- <span *ngIf="item.items" class="p-panelmenu-icon pi" [ngClass]="{ 'pi-chevron-right': !item.expanded, 'pi-chevron-down': item.expanded }"></span>
363
- -->
364
- <ng-container *ngIf="item.items">
365
- <ng-container *ngIf="!submenuIconTemplate">
366
- <ChevronDownIcon [styleClass]="'p-panelmenu-icon'" *ngIf="item.expanded" />
367
- <ChevronRightIcon [styleClass]="'p-panelmenu-icon'" *ngIf="!item.expanded" />
922
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.2", type: PanelMenu, selector: "p-panelMenu", inputs: { model: "model", style: "style", styleClass: "styleClass", multiple: "multiple", transitionOptions: "transitionOptions", id: "id", tabindex: "tabindex" }, host: { classAttribute: "p-element" }, queries: [{ propertyName: "templates", predicate: PrimeTemplate }], viewQueries: [{ propertyName: "containerViewChild", first: true, predicate: ["container"], descendants: true }], ngImport: i0, template: `
923
+ <div [class]="styleClass" [ngStyle]="style" [ngClass]="'p-panelmenu p-component'" #container>
924
+ <ng-container *ngFor="let item of model; let f = first; let l = last; let i = index">
925
+ <div *ngIf="isItemVisible(item)" class="p-panelmenu-panel" [ngClass]="getItemProp(item, 'headerClass')" [ngStyle]="getItemProp(item, 'style')" [attr.data-pc-section]="'panel'">
926
+ <div
927
+ [ngClass]="{ 'p-component p-panelmenu-header': true, 'p-highlight': isItemActive(item), 'p-disabled': isItemDisabled(item) }"
928
+ [class]="getItemProp(item, 'styleClass')"
929
+ [ngStyle]="getItemProp(item, 'style')"
930
+ pTooltip
931
+ [id]="getHeaderId(i)"
932
+ [tabindex]="0"
933
+ role="button"
934
+ [tooltipOptions]="getItemProp(item, tooltipOptions)"
935
+ [attr.aria-expanded]="isItemActive(item)"
936
+ [attr.arial-label]="getItemProp(item, 'label')"
937
+ [attr.aria-controls]="getContentId(i)"
938
+ [attr.aria-disabled]="isItemDisabled(item)"
939
+ [attr.data-p-highlight]="isItemActive(item)"
940
+ [attr.data-p-disabled]="isItemDisabled(item)"
941
+ [attr.data-pc-section]="'header'"
942
+ (click)="onHeaderClick($event, item, i)"
943
+ (keydown)="onHeaderKeyDown($event, item, i)"
944
+ >
945
+ <div class="p-panelmenu-header-content">
946
+ <a
947
+ *ngIf="!getItemProp(item, 'routerLink')"
948
+ [attr.href]="getItemProp(item, 'url')"
949
+ [attr.tabindex]="-1"
950
+ [target]="getItemProp(item, 'target')"
951
+ [attr.title]="getItemProp(item, 'title')"
952
+ class="p-panelmenu-header-action"
953
+ [attr.data-pc-section]="'headeraction'"
954
+ >
955
+ <ng-container *ngIf="isItemGroup(item)">
956
+ <ng-container *ngIf="!submenuIconTemplate">
957
+ <ChevronDownIcon [styleClass]="'p-submenu-icon'" *ngIf="isItemActive(item)" />
958
+ <ChevronRightIcon [styleClass]="'p-submenu-icon'" *ngIf="!isItemActive(item)" />
959
+ </ng-container>
960
+ <ng-template *ngTemplateOutlet="submenuIconTemplate"></ng-template>
368
961
  </ng-container>
369
- <ng-template *ngTemplateOutlet="submenuIconTemplate"></ng-template>
370
- </ng-container>
371
- <span class="p-menuitem-icon" [ngClass]="item.icon" *ngIf="item.icon" [ngStyle]="item.iconStyle"></span>
372
- <span class="p-menuitem-text" *ngIf="item.escape !== false; else htmlLabel">{{ item.label }}</span>
373
- <ng-template #htmlLabel><span class="p-menuitem-text" [innerHTML]="item.label"></span></ng-template>
374
- <span class="p-menuitem-badge" *ngIf="item.badge" [ngClass]="item.badgeStyleClass">{{ item.badge }}</span>
375
- </a>
376
- <a
377
- *ngIf="item.routerLink"
378
- [routerLink]="item.routerLink"
379
- [queryParams]="item.queryParams"
380
- [routerLinkActive]="'p-menuitem-link-active'"
381
- [routerLinkActiveOptions]="item.routerLinkActiveOptions || { exact: false }"
382
- (click)="handleClick($event, item)"
383
- (keydown)="onItemKeyDown($event)"
384
- [target]="item.target"
385
- [attr.title]="item.title"
386
- class="p-panelmenu-header-link"
387
- [attr.id]="item.id"
388
- [attr.tabindex]="item.disabled ? null : '0'"
389
- [fragment]="item.fragment"
390
- [queryParamsHandling]="item.queryParamsHandling"
391
- [preserveFragment]="item.preserveFragment"
392
- [skipLocationChange]="item.skipLocationChange"
393
- [replaceUrl]="item.replaceUrl"
394
- [state]="item.state"
395
- >
396
- <!--
397
- <span *ngIf="item.items" class="p-panelmenu-icon pi" [ngClass]="{ 'pi-chevron-right': !item.expanded, 'pi-chevron-down': item.expanded }"></span>
398
- -->
399
- <ng-container *ngIf="item.items">
400
- <ng-container *ngIf="!submenuIconTemplate">
401
- <ChevronDownIcon [styleClass]="'p-panelmenu-icon'" *ngIf="item.expanded" />
402
- <ChevronRightIcon [styleClass]="'p-panelmenu-icon'" *ngIf="!item.expanded" />
962
+ <span class="p-menuitem-icon" [ngClass]="item.icon" *ngIf="item.icon" [ngStyle]="getItemProp(item, 'iconStyle')"></span>
963
+ <span class="p-menuitem-text" *ngIf="getItemProp(item, 'escape') !== false; else htmlLabel">{{ getItemProp(item, 'label') }}</span>
964
+ <ng-template #htmlLabel><span class="p-menuitem-text" [innerHTML]="getItemProp(item, 'label')"></span></ng-template>
965
+ <span class="p-menuitem-badge" *ngIf="getItemProp(item, 'badge')" [ngClass]="getItemProp(item, 'badgeStyleClass')">{{ getItemProp(item, 'badge') }}</span>
966
+ </a>
967
+ <a
968
+ *ngIf="getItemProp(item, 'routerLink')"
969
+ [routerLink]="getItemProp(item, 'routerLink')"
970
+ [queryParams]="getItemProp(item, 'queryParams')"
971
+ [routerLinkActive]="'p-menuitem-link-active'"
972
+ [routerLinkActiveOptions]="getItemProp(item, 'routerLinkActiveOptions') || { exact: false }"
973
+ [target]="getItemProp(item, 'target')"
974
+ class="p-panelmenu-header-action"
975
+ [attr.tabindex]="-1"
976
+ [fragment]="getItemProp(item, 'fragment')"
977
+ [queryParamsHandling]="getItemProp(item, 'queryParamsHandling')"
978
+ [preserveFragment]="getItemProp(item, 'preserveFragment')"
979
+ [skipLocationChange]="getItemProp(item, 'skipLocationChange')"
980
+ [replaceUrl]="getItemProp(item, 'replaceUrl')"
981
+ [state]="getItemProp(item, 'state')"
982
+ [attr.data-pc-section]="'headeraction'"
983
+ >
984
+ <ng-container *ngIf="isItemGroup(item)">
985
+ <ng-container *ngIf="!submenuIconTemplate">
986
+ <ChevronDownIcon [styleClass]="'p-submenu-icon'" *ngIf="isItemActive(item)" />
987
+ <ChevronRightIcon [styleClass]="'p-submenu-icon'" *ngIf="!isItemActive(item)" />
988
+ </ng-container>
989
+ <ng-template *ngTemplateOutlet="submenuIconTemplate"></ng-template>
403
990
  </ng-container>
404
- <ng-template *ngTemplateOutlet="submenuIconTemplate"></ng-template>
405
- </ng-container>
406
- <span class="p-menuitem-icon" [ngClass]="item.icon" *ngIf="item.icon" [ngStyle]="item.iconStyle"></span>
407
- <span class="p-menuitem-text" *ngIf="item.escape !== false; else htmlRouteLabel">{{ item.label }}</span>
408
- <ng-template #htmlRouteLabel><span class="p-menuitem-text" [innerHTML]="item.label"></span></ng-template>
409
- <span class="p-menuitem-badge" *ngIf="item.badge" [ngClass]="item.badgeStyleClass">{{ item.badge }}</span>
410
- </a>
991
+ <span class="p-menuitem-icon" [ngClass]="item.icon" *ngIf="item.icon" [ngStyle]="getItemProp(item, 'iconStyle')"></span>
992
+ <span class="p-menuitem-text" *ngIf="getItemProp(item, 'escape') !== false; else htmlRouteLabel">{{ getItemProp(item, 'label') }}</span>
993
+ <ng-template #htmlRouteLabel><span class="p-menuitem-text" [innerHTML]="getItemProp(item, 'label')"></span></ng-template>
994
+ <span class="p-menuitem-badge" *ngIf="getItemProp(item, 'badge')" [ngClass]="getItemProp(item, 'badgeStyleClass')">{{ getItemProp(item, 'badge') }}</span>
995
+ </a>
996
+ </div>
411
997
  </div>
412
- <div *ngIf="item.items" class="p-toggleable-content" [ngClass]="{ 'p-panelmenu-expanded': item.expanded }" [@rootItem]="getAnimation(item)" (@rootItem.done)="onToggleDone()">
413
- <div class="p-panelmenu-content" role="region" [attr.id]="item.id + '_content'" [attr.aria-labelledby]="item.id + '_header'">
414
- <p-panelMenuSub [item]="item" [parentExpanded]="item.expanded" [expanded]="true" [transitionOptions]="transitionOptions" [root]="true"></p-panelMenuSub>
998
+ <div
999
+ *ngIf="isItemGroup(item)"
1000
+ class="p-toggleable-content"
1001
+ [ngClass]="{ 'p-panelmenu-expanded': isItemActive(item) }"
1002
+ [@rootItem]="getAnimation(item)"
1003
+ (@rootItem.done)="onToggleDone()"
1004
+ role="region"
1005
+ [id]="getContentId(i)"
1006
+ [attr.aria-labelledby]="getHeaderId(i)"
1007
+ [attr.data-pc-section]="'toggleablecontent'"
1008
+ >
1009
+ <div class="p-panelmenu-content" [attr.data-pc-section]="'menucontent'">
1010
+ <p-panelMenuList
1011
+ [panelId]="getPanelId(i)"
1012
+ [items]="getItemProp(item, 'items')"
1013
+ [transitionOptions]="transitionOptions"
1014
+ [root]="true"
1015
+ [activeItem]="activeItem()"
1016
+ [tabindex]="tabindex"
1017
+ (itemToggle)="changeExpandedKeys($event)"
1018
+ (headerFocus)="updateFocusedHeader($event)"
1019
+ ></p-panelMenuList>
415
1020
  </div>
416
1021
  </div>
417
1022
  </div>
418
1023
  </ng-container>
419
1024
  </div>
420
- `, isInline: true, styles: [".p-panelmenu .p-panelmenu-header-link{display:flex;align-items:center;-webkit-user-select:none;user-select:none;cursor:pointer;position:relative;text-decoration:none}.p-panelmenu .p-panelmenu-header-link:focus{z-index:1}.p-panelmenu .p-submenu-list{margin:0;padding:0;list-style:none}.p-panelmenu .p-menuitem-link{display:flex;align-items:center;-webkit-user-select:none;user-select:none;cursor:pointer;text-decoration:none}.p-panelmenu .p-menuitem-text{line-height:1}.p-panelmenu-expanded.p-toggleable-content:not(.ng-animating),.p-panelmenu .p-submenu-expanded:not(.ng-animating){overflow:visible}.p-panelmenu .p-toggleable-content,.p-panelmenu .p-submenu-list{overflow:hidden}\n"], dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return i1.NgClass; }), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgForOf; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgTemplateOutlet; }), selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgStyle; }), selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i0.forwardRef(function () { return i2.RouterLink; }), selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i0.forwardRef(function () { return i2.RouterLinkActive; }), selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: i0.forwardRef(function () { return i3.Tooltip; }), selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i0.forwardRef(function () { return ChevronDownIcon; }), selector: "ChevronDownIcon" }, { kind: "component", type: i0.forwardRef(function () { return ChevronRightIcon; }), selector: "ChevronRightIcon" }, { kind: "component", type: i0.forwardRef(function () { return PanelMenuSub; }), selector: "p-panelMenuSub", inputs: ["item", "expanded", "parentExpanded", "transitionOptions", "root"] }], animations: [
1025
+ `, isInline: true, styles: [".p-panelmenu .p-panelmenu-header-action{display:flex;align-items:center;-webkit-user-select:none;user-select:none;cursor:pointer;position:relative;text-decoration:none}.p-panelmenu .p-panelmenu-header-action:focus{z-index:1}.p-panelmenu .p-submenu-list{margin:0;padding:0;list-style:none}.p-panelmenu .p-menuitem-link{display:flex;align-items:center;-webkit-user-select:none;user-select:none;cursor:pointer;text-decoration:none;position:relative;overflow:hidden}.p-panelmenu .p-menuitem-text{line-height:1}.p-panelmenu-expanded.p-toggleable-content:not(.ng-animating),.p-panelmenu .p-submenu-expanded:not(.ng-animating){overflow:visible}.p-panelmenu .p-toggleable-content,.p-panelmenu .p-submenu-list{overflow:hidden}\n"], dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return i1.NgClass; }), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgForOf; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgTemplateOutlet; }), selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgStyle; }), selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i0.forwardRef(function () { return i2.RouterLink; }), selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i0.forwardRef(function () { return i2.RouterLinkActive; }), selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: i0.forwardRef(function () { return i3.Tooltip; }), selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i0.forwardRef(function () { return ChevronDownIcon; }), selector: "ChevronDownIcon" }, { kind: "component", type: i0.forwardRef(function () { return ChevronRightIcon; }), selector: "ChevronRightIcon" }, { kind: "component", type: i0.forwardRef(function () { return PanelMenuList; }), selector: "p-panelMenuList", inputs: ["panelId", "id", "items", "parentExpanded", "expanded", "transitionOptions", "root", "tabindex", "activeItem"], outputs: ["itemToggle", "headerFocus"] }], animations: [
421
1026
  trigger('rootItem', [
422
1027
  state('hidden', style({
423
1028
  height: '0'
@@ -433,78 +1038,103 @@ class PanelMenu extends BasePanelMenuItem {
433
1038
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: PanelMenu, decorators: [{
434
1039
  type: Component,
435
1040
  args: [{ selector: 'p-panelMenu', template: `
436
- <div [class]="styleClass" [ngStyle]="style" [ngClass]="'p-panelmenu p-component'">
437
- <ng-container *ngFor="let item of model; let f = first; let l = last">
438
- <div class="p-panelmenu-panel" *ngIf="visible(item)">
439
- <div [ngClass]="{ 'p-component p-panelmenu-header': true, 'p-highlight': item.expanded, 'p-disabled': item.disabled }" [class]="item.styleClass" [ngStyle]="item.style" pTooltip [tooltipOptions]="item.tooltipOptions">
440
- <a
441
- *ngIf="!item.routerLink"
442
- [attr.href]="item.url"
443
- (click)="handleClick($event, item)"
444
- (keydown)="onItemKeyDown($event)"
445
- [attr.tabindex]="item.disabled ? null : '0'"
446
- [attr.id]="item.id"
447
- [target]="item.target"
448
- [attr.title]="item.title"
449
- class="p-panelmenu-header-link"
450
- [attr.aria-expanded]="item.expanded"
451
- [attr.id]="item.id + '_header'"
452
- [attr.aria-controls]="item.id + '_content'"
453
- >
454
- <!--
455
- <span *ngIf="item.items" class="p-panelmenu-icon pi" [ngClass]="{ 'pi-chevron-right': !item.expanded, 'pi-chevron-down': item.expanded }"></span>
456
- -->
457
- <ng-container *ngIf="item.items">
458
- <ng-container *ngIf="!submenuIconTemplate">
459
- <ChevronDownIcon [styleClass]="'p-panelmenu-icon'" *ngIf="item.expanded" />
460
- <ChevronRightIcon [styleClass]="'p-panelmenu-icon'" *ngIf="!item.expanded" />
1041
+ <div [class]="styleClass" [ngStyle]="style" [ngClass]="'p-panelmenu p-component'" #container>
1042
+ <ng-container *ngFor="let item of model; let f = first; let l = last; let i = index">
1043
+ <div *ngIf="isItemVisible(item)" class="p-panelmenu-panel" [ngClass]="getItemProp(item, 'headerClass')" [ngStyle]="getItemProp(item, 'style')" [attr.data-pc-section]="'panel'">
1044
+ <div
1045
+ [ngClass]="{ 'p-component p-panelmenu-header': true, 'p-highlight': isItemActive(item), 'p-disabled': isItemDisabled(item) }"
1046
+ [class]="getItemProp(item, 'styleClass')"
1047
+ [ngStyle]="getItemProp(item, 'style')"
1048
+ pTooltip
1049
+ [id]="getHeaderId(i)"
1050
+ [tabindex]="0"
1051
+ role="button"
1052
+ [tooltipOptions]="getItemProp(item, tooltipOptions)"
1053
+ [attr.aria-expanded]="isItemActive(item)"
1054
+ [attr.arial-label]="getItemProp(item, 'label')"
1055
+ [attr.aria-controls]="getContentId(i)"
1056
+ [attr.aria-disabled]="isItemDisabled(item)"
1057
+ [attr.data-p-highlight]="isItemActive(item)"
1058
+ [attr.data-p-disabled]="isItemDisabled(item)"
1059
+ [attr.data-pc-section]="'header'"
1060
+ (click)="onHeaderClick($event, item, i)"
1061
+ (keydown)="onHeaderKeyDown($event, item, i)"
1062
+ >
1063
+ <div class="p-panelmenu-header-content">
1064
+ <a
1065
+ *ngIf="!getItemProp(item, 'routerLink')"
1066
+ [attr.href]="getItemProp(item, 'url')"
1067
+ [attr.tabindex]="-1"
1068
+ [target]="getItemProp(item, 'target')"
1069
+ [attr.title]="getItemProp(item, 'title')"
1070
+ class="p-panelmenu-header-action"
1071
+ [attr.data-pc-section]="'headeraction'"
1072
+ >
1073
+ <ng-container *ngIf="isItemGroup(item)">
1074
+ <ng-container *ngIf="!submenuIconTemplate">
1075
+ <ChevronDownIcon [styleClass]="'p-submenu-icon'" *ngIf="isItemActive(item)" />
1076
+ <ChevronRightIcon [styleClass]="'p-submenu-icon'" *ngIf="!isItemActive(item)" />
1077
+ </ng-container>
1078
+ <ng-template *ngTemplateOutlet="submenuIconTemplate"></ng-template>
461
1079
  </ng-container>
462
- <ng-template *ngTemplateOutlet="submenuIconTemplate"></ng-template>
463
- </ng-container>
464
- <span class="p-menuitem-icon" [ngClass]="item.icon" *ngIf="item.icon" [ngStyle]="item.iconStyle"></span>
465
- <span class="p-menuitem-text" *ngIf="item.escape !== false; else htmlLabel">{{ item.label }}</span>
466
- <ng-template #htmlLabel><span class="p-menuitem-text" [innerHTML]="item.label"></span></ng-template>
467
- <span class="p-menuitem-badge" *ngIf="item.badge" [ngClass]="item.badgeStyleClass">{{ item.badge }}</span>
468
- </a>
469
- <a
470
- *ngIf="item.routerLink"
471
- [routerLink]="item.routerLink"
472
- [queryParams]="item.queryParams"
473
- [routerLinkActive]="'p-menuitem-link-active'"
474
- [routerLinkActiveOptions]="item.routerLinkActiveOptions || { exact: false }"
475
- (click)="handleClick($event, item)"
476
- (keydown)="onItemKeyDown($event)"
477
- [target]="item.target"
478
- [attr.title]="item.title"
479
- class="p-panelmenu-header-link"
480
- [attr.id]="item.id"
481
- [attr.tabindex]="item.disabled ? null : '0'"
482
- [fragment]="item.fragment"
483
- [queryParamsHandling]="item.queryParamsHandling"
484
- [preserveFragment]="item.preserveFragment"
485
- [skipLocationChange]="item.skipLocationChange"
486
- [replaceUrl]="item.replaceUrl"
487
- [state]="item.state"
488
- >
489
- <!--
490
- <span *ngIf="item.items" class="p-panelmenu-icon pi" [ngClass]="{ 'pi-chevron-right': !item.expanded, 'pi-chevron-down': item.expanded }"></span>
491
- -->
492
- <ng-container *ngIf="item.items">
493
- <ng-container *ngIf="!submenuIconTemplate">
494
- <ChevronDownIcon [styleClass]="'p-panelmenu-icon'" *ngIf="item.expanded" />
495
- <ChevronRightIcon [styleClass]="'p-panelmenu-icon'" *ngIf="!item.expanded" />
1080
+ <span class="p-menuitem-icon" [ngClass]="item.icon" *ngIf="item.icon" [ngStyle]="getItemProp(item, 'iconStyle')"></span>
1081
+ <span class="p-menuitem-text" *ngIf="getItemProp(item, 'escape') !== false; else htmlLabel">{{ getItemProp(item, 'label') }}</span>
1082
+ <ng-template #htmlLabel><span class="p-menuitem-text" [innerHTML]="getItemProp(item, 'label')"></span></ng-template>
1083
+ <span class="p-menuitem-badge" *ngIf="getItemProp(item, 'badge')" [ngClass]="getItemProp(item, 'badgeStyleClass')">{{ getItemProp(item, 'badge') }}</span>
1084
+ </a>
1085
+ <a
1086
+ *ngIf="getItemProp(item, 'routerLink')"
1087
+ [routerLink]="getItemProp(item, 'routerLink')"
1088
+ [queryParams]="getItemProp(item, 'queryParams')"
1089
+ [routerLinkActive]="'p-menuitem-link-active'"
1090
+ [routerLinkActiveOptions]="getItemProp(item, 'routerLinkActiveOptions') || { exact: false }"
1091
+ [target]="getItemProp(item, 'target')"
1092
+ class="p-panelmenu-header-action"
1093
+ [attr.tabindex]="-1"
1094
+ [fragment]="getItemProp(item, 'fragment')"
1095
+ [queryParamsHandling]="getItemProp(item, 'queryParamsHandling')"
1096
+ [preserveFragment]="getItemProp(item, 'preserveFragment')"
1097
+ [skipLocationChange]="getItemProp(item, 'skipLocationChange')"
1098
+ [replaceUrl]="getItemProp(item, 'replaceUrl')"
1099
+ [state]="getItemProp(item, 'state')"
1100
+ [attr.data-pc-section]="'headeraction'"
1101
+ >
1102
+ <ng-container *ngIf="isItemGroup(item)">
1103
+ <ng-container *ngIf="!submenuIconTemplate">
1104
+ <ChevronDownIcon [styleClass]="'p-submenu-icon'" *ngIf="isItemActive(item)" />
1105
+ <ChevronRightIcon [styleClass]="'p-submenu-icon'" *ngIf="!isItemActive(item)" />
1106
+ </ng-container>
1107
+ <ng-template *ngTemplateOutlet="submenuIconTemplate"></ng-template>
496
1108
  </ng-container>
497
- <ng-template *ngTemplateOutlet="submenuIconTemplate"></ng-template>
498
- </ng-container>
499
- <span class="p-menuitem-icon" [ngClass]="item.icon" *ngIf="item.icon" [ngStyle]="item.iconStyle"></span>
500
- <span class="p-menuitem-text" *ngIf="item.escape !== false; else htmlRouteLabel">{{ item.label }}</span>
501
- <ng-template #htmlRouteLabel><span class="p-menuitem-text" [innerHTML]="item.label"></span></ng-template>
502
- <span class="p-menuitem-badge" *ngIf="item.badge" [ngClass]="item.badgeStyleClass">{{ item.badge }}</span>
503
- </a>
1109
+ <span class="p-menuitem-icon" [ngClass]="item.icon" *ngIf="item.icon" [ngStyle]="getItemProp(item, 'iconStyle')"></span>
1110
+ <span class="p-menuitem-text" *ngIf="getItemProp(item, 'escape') !== false; else htmlRouteLabel">{{ getItemProp(item, 'label') }}</span>
1111
+ <ng-template #htmlRouteLabel><span class="p-menuitem-text" [innerHTML]="getItemProp(item, 'label')"></span></ng-template>
1112
+ <span class="p-menuitem-badge" *ngIf="getItemProp(item, 'badge')" [ngClass]="getItemProp(item, 'badgeStyleClass')">{{ getItemProp(item, 'badge') }}</span>
1113
+ </a>
1114
+ </div>
504
1115
  </div>
505
- <div *ngIf="item.items" class="p-toggleable-content" [ngClass]="{ 'p-panelmenu-expanded': item.expanded }" [@rootItem]="getAnimation(item)" (@rootItem.done)="onToggleDone()">
506
- <div class="p-panelmenu-content" role="region" [attr.id]="item.id + '_content'" [attr.aria-labelledby]="item.id + '_header'">
507
- <p-panelMenuSub [item]="item" [parentExpanded]="item.expanded" [expanded]="true" [transitionOptions]="transitionOptions" [root]="true"></p-panelMenuSub>
1116
+ <div
1117
+ *ngIf="isItemGroup(item)"
1118
+ class="p-toggleable-content"
1119
+ [ngClass]="{ 'p-panelmenu-expanded': isItemActive(item) }"
1120
+ [@rootItem]="getAnimation(item)"
1121
+ (@rootItem.done)="onToggleDone()"
1122
+ role="region"
1123
+ [id]="getContentId(i)"
1124
+ [attr.aria-labelledby]="getHeaderId(i)"
1125
+ [attr.data-pc-section]="'toggleablecontent'"
1126
+ >
1127
+ <div class="p-panelmenu-content" [attr.data-pc-section]="'menucontent'">
1128
+ <p-panelMenuList
1129
+ [panelId]="getPanelId(i)"
1130
+ [items]="getItemProp(item, 'items')"
1131
+ [transitionOptions]="transitionOptions"
1132
+ [root]="true"
1133
+ [activeItem]="activeItem()"
1134
+ [tabindex]="tabindex"
1135
+ (itemToggle)="changeExpandedKeys($event)"
1136
+ (headerFocus)="updateFocusedHeader($event)"
1137
+ ></p-panelMenuList>
508
1138
  </div>
509
1139
  </div>
510
1140
  </div>
@@ -523,7 +1153,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImpor
523
1153
  ])
524
1154
  ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
525
1155
  class: 'p-element'
526
- }, styles: [".p-panelmenu .p-panelmenu-header-link{display:flex;align-items:center;-webkit-user-select:none;user-select:none;cursor:pointer;position:relative;text-decoration:none}.p-panelmenu .p-panelmenu-header-link:focus{z-index:1}.p-panelmenu .p-submenu-list{margin:0;padding:0;list-style:none}.p-panelmenu .p-menuitem-link{display:flex;align-items:center;-webkit-user-select:none;user-select:none;cursor:pointer;text-decoration:none}.p-panelmenu .p-menuitem-text{line-height:1}.p-panelmenu-expanded.p-toggleable-content:not(.ng-animating),.p-panelmenu .p-submenu-expanded:not(.ng-animating){overflow:visible}.p-panelmenu .p-toggleable-content,.p-panelmenu .p-submenu-list{overflow:hidden}\n"] }]
1156
+ }, styles: [".p-panelmenu .p-panelmenu-header-action{display:flex;align-items:center;-webkit-user-select:none;user-select:none;cursor:pointer;position:relative;text-decoration:none}.p-panelmenu .p-panelmenu-header-action:focus{z-index:1}.p-panelmenu .p-submenu-list{margin:0;padding:0;list-style:none}.p-panelmenu .p-menuitem-link{display:flex;align-items:center;-webkit-user-select:none;user-select:none;cursor:pointer;text-decoration:none;position:relative;overflow:hidden}.p-panelmenu .p-menuitem-text{line-height:1}.p-panelmenu-expanded.p-toggleable-content:not(.ng-animating),.p-panelmenu .p-submenu-expanded:not(.ng-animating){overflow:visible}.p-panelmenu .p-toggleable-content,.p-panelmenu .p-submenu-list{overflow:hidden}\n"] }]
527
1157
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { model: [{
528
1158
  type: Input
529
1159
  }], style: [{
@@ -534,13 +1164,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImpor
534
1164
  type: Input
535
1165
  }], transitionOptions: [{
536
1166
  type: Input
1167
+ }], id: [{
1168
+ type: Input
1169
+ }], tabindex: [{
1170
+ type: Input
537
1171
  }], templates: [{
538
1172
  type: ContentChildren,
539
1173
  args: [PrimeTemplate]
1174
+ }], containerViewChild: [{
1175
+ type: ViewChild,
1176
+ args: ['container']
540
1177
  }] } });
541
1178
  class PanelMenuModule {
542
1179
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: PanelMenuModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
543
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.0.2", ngImport: i0, type: PanelMenuModule, declarations: [PanelMenu, PanelMenuSub], imports: [CommonModule, RouterModule, TooltipModule, SharedModule, AngleDownIcon, AngleRightIcon, ChevronDownIcon, ChevronRightIcon], exports: [PanelMenu, RouterModule, TooltipModule, SharedModule] });
1180
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.0.2", ngImport: i0, type: PanelMenuModule, declarations: [PanelMenu, PanelMenuSub, PanelMenuList], imports: [CommonModule, RouterModule, TooltipModule, SharedModule, AngleDownIcon, AngleRightIcon, ChevronDownIcon, ChevronRightIcon], exports: [PanelMenu, RouterModule, TooltipModule, SharedModule] });
544
1181
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: PanelMenuModule, imports: [CommonModule, RouterModule, TooltipModule, SharedModule, AngleDownIcon, AngleRightIcon, ChevronDownIcon, ChevronRightIcon, RouterModule, TooltipModule, SharedModule] });
545
1182
  }
546
1183
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: PanelMenuModule, decorators: [{
@@ -548,7 +1185,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImpor
548
1185
  args: [{
549
1186
  imports: [CommonModule, RouterModule, TooltipModule, SharedModule, AngleDownIcon, AngleRightIcon, ChevronDownIcon, ChevronRightIcon],
550
1187
  exports: [PanelMenu, RouterModule, TooltipModule, SharedModule],
551
- declarations: [PanelMenu, PanelMenuSub]
1188
+ declarations: [PanelMenu, PanelMenuSub, PanelMenuList]
552
1189
  }]
553
1190
  }] });
554
1191
 
@@ -556,5 +1193,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImpor
556
1193
  * Generated bundle index. Do not edit.
557
1194
  */
558
1195
 
559
- export { BasePanelMenuItem, PanelMenu, PanelMenuModule, PanelMenuSub };
1196
+ export { PanelMenu, PanelMenuList, PanelMenuModule, PanelMenuSub };
560
1197
  //# sourceMappingURL=primeng-panelmenu.mjs.map