primeng 16.0.2 → 16.2.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 (481) hide show
  1. package/accordion/accordion.d.ts +47 -11
  2. package/api/primengconfig.d.ts +1 -1
  3. package/api/translation.d.ts +78 -0
  4. package/api/treenode.d.ts +1 -1
  5. package/avatar/avatar.d.ts +11 -1
  6. package/breadcrumb/breadcrumb.d.ts +5 -1
  7. package/button/button.d.ts +4 -1
  8. package/carousel/carousel.d.ts +17 -1
  9. package/chip/chip.d.ts +1 -0
  10. package/confirmdialog/confirmdialog.d.ts +7 -1
  11. package/contextmenu/contextmenu.d.ts +160 -68
  12. package/dialog/dialog.d.ts +1 -0
  13. package/dock/dock.d.ts +47 -2
  14. package/dom/domhandler.d.ts +1 -0
  15. package/dynamicdialog/dynamicdialog-config.d.ts +4 -0
  16. package/dynamicdialog/dynamicdialog.d.ts +2 -0
  17. package/esm2022/accordion/accordion.mjs +216 -54
  18. package/esm2022/animate/animate.mjs +7 -7
  19. package/esm2022/api/confirmationservice.mjs +3 -3
  20. package/esm2022/api/contextmenuservice.mjs +3 -3
  21. package/esm2022/api/filterservice.mjs +3 -3
  22. package/esm2022/api/messageservice.mjs +3 -3
  23. package/esm2022/api/overlayservice.mjs +3 -3
  24. package/esm2022/api/primengconfig.mjs +78 -5
  25. package/esm2022/api/shared.mjs +13 -13
  26. package/esm2022/api/translation.mjs +1 -1
  27. package/esm2022/api/treedragdropservice.mjs +3 -3
  28. package/esm2022/api/treenode.mjs +1 -1
  29. package/esm2022/autocomplete/autocomplete.mjs +10 -10
  30. package/esm2022/autofocus/autofocus.mjs +7 -7
  31. package/esm2022/avatar/avatar.mjs +24 -10
  32. package/esm2022/avatargroup/avatargroup.mjs +7 -7
  33. package/esm2022/badge/badge.mjs +10 -10
  34. package/esm2022/baseicon/baseicon.mjs +3 -3
  35. package/esm2022/blockui/blockui.mjs +26 -10
  36. package/esm2022/breadcrumb/breadcrumb.mjs +56 -39
  37. package/esm2022/button/button.mjs +47 -31
  38. package/esm2022/calendar/calendar.mjs +7 -7
  39. package/esm2022/card/card.mjs +10 -10
  40. package/esm2022/carousel/carousel.mjs +153 -27
  41. package/esm2022/cascadeselect/cascadeselect.mjs +10 -10
  42. package/esm2022/chart/chart.mjs +7 -7
  43. package/esm2022/checkbox/checkbox.mjs +7 -7
  44. package/esm2022/chip/chip.mjs +25 -20
  45. package/esm2022/chips/chips.mjs +7 -7
  46. package/esm2022/colorpicker/colorpicker.mjs +7 -7
  47. package/esm2022/confirmdialog/confirmdialog.mjs +28 -12
  48. package/esm2022/confirmpopup/confirmpopup.mjs +10 -8
  49. package/esm2022/contextmenu/contextmenu.mjs +1002 -552
  50. package/esm2022/dataview/dataview.mjs +10 -10
  51. package/esm2022/defer/defer.mjs +7 -7
  52. package/esm2022/dialog/dialog.mjs +21 -16
  53. package/esm2022/divider/divider.mjs +10 -10
  54. package/esm2022/dock/dock.mjs +290 -92
  55. package/esm2022/dom/domhandler.mjs +19 -7
  56. package/esm2022/dragdrop/dragdrop.mjs +10 -10
  57. package/esm2022/dropdown/dropdown.mjs +10 -10
  58. package/esm2022/dynamicdialog/dialogservice.mjs +3 -3
  59. package/esm2022/dynamicdialog/dynamicdialog-config.mjs +5 -1
  60. package/esm2022/dynamicdialog/dynamicdialog-ref.mjs +4 -1
  61. package/esm2022/dynamicdialog/dynamicdialog.mjs +23 -13
  62. package/esm2022/dynamicdialog/dynamicdialogcontent.mjs +3 -3
  63. package/esm2022/editor/editor.mjs +7 -7
  64. package/esm2022/fieldset/fieldset.mjs +66 -39
  65. package/esm2022/fileupload/fileupload.mjs +56 -48
  66. package/esm2022/focustrap/focustrap.mjs +7 -7
  67. package/esm2022/galleria/galleria.mjs +257 -48
  68. package/esm2022/icons/angledoubledown/angledoubledown.mjs +3 -3
  69. package/esm2022/icons/angledoubleleft/angledoubleleft.mjs +3 -3
  70. package/esm2022/icons/angledoubleright/angledoubleright.mjs +3 -3
  71. package/esm2022/icons/angledoubleup/angledoubleup.mjs +3 -3
  72. package/esm2022/icons/angledown/angledown.mjs +3 -3
  73. package/esm2022/icons/angleleft/angleleft.mjs +3 -3
  74. package/esm2022/icons/angleright/angleright.mjs +3 -3
  75. package/esm2022/icons/angleup/angleup.mjs +3 -3
  76. package/esm2022/icons/arrowdown/arrowdown.mjs +3 -3
  77. package/esm2022/icons/arrowdownleft/arrowdownleft.mjs +3 -3
  78. package/esm2022/icons/arrowdownright/arrowdownright.mjs +3 -3
  79. package/esm2022/icons/arrowleft/arrowleft.mjs +3 -3
  80. package/esm2022/icons/arrowright/arrowright.mjs +3 -3
  81. package/esm2022/icons/arrowup/arrowup.mjs +3 -3
  82. package/esm2022/icons/ban/ban.mjs +3 -3
  83. package/esm2022/icons/bars/bars.mjs +3 -3
  84. package/esm2022/icons/calendar/calendar.mjs +3 -3
  85. package/esm2022/icons/caretleft/caretleft.mjs +3 -3
  86. package/esm2022/icons/caretright/caretright.mjs +3 -3
  87. package/esm2022/icons/check/check.mjs +3 -3
  88. package/esm2022/icons/chevrondown/chevrondown.mjs +3 -3
  89. package/esm2022/icons/chevronleft/chevronleft.mjs +3 -3
  90. package/esm2022/icons/chevronright/chevronright.mjs +3 -3
  91. package/esm2022/icons/chevronup/chevronup.mjs +3 -3
  92. package/esm2022/icons/exclamationtriangle/exclamationtriangle.mjs +3 -3
  93. package/esm2022/icons/eye/eye.mjs +3 -3
  94. package/esm2022/icons/eyeslash/eyeslash.mjs +3 -3
  95. package/esm2022/icons/filter/filter.mjs +3 -3
  96. package/esm2022/icons/filterslash/filterslash.mjs +3 -3
  97. package/esm2022/icons/home/home.mjs +3 -3
  98. package/esm2022/icons/infocircle/infocircle.mjs +3 -3
  99. package/esm2022/icons/minus/minus.mjs +3 -3
  100. package/esm2022/icons/pencil/pencil.mjs +3 -3
  101. package/esm2022/icons/plus/plus.mjs +3 -3
  102. package/esm2022/icons/refresh/refresh.mjs +3 -3
  103. package/esm2022/icons/search/search.mjs +3 -3
  104. package/esm2022/icons/searchminus/searchminus.mjs +3 -3
  105. package/esm2022/icons/searchplus/searchplus.mjs +3 -3
  106. package/esm2022/icons/sortalt/sortalt.mjs +3 -3
  107. package/esm2022/icons/sortamountdown/sortamountdown.mjs +3 -3
  108. package/esm2022/icons/sortamountupalt/sortamountupalt.mjs +3 -3
  109. package/esm2022/icons/spinner/spinner.mjs +3 -3
  110. package/esm2022/icons/star/star.mjs +3 -3
  111. package/esm2022/icons/starfill/starfill.mjs +3 -3
  112. package/esm2022/icons/thlarge/thlarge.mjs +3 -3
  113. package/esm2022/icons/times/times.mjs +3 -3
  114. package/esm2022/icons/timescircle/timescircle.mjs +3 -3
  115. package/esm2022/icons/trash/trash.mjs +3 -3
  116. package/esm2022/icons/undo/undo.mjs +3 -3
  117. package/esm2022/icons/upload/upload.mjs +3 -3
  118. package/esm2022/icons/windowmaximize/windowmaximize.mjs +3 -3
  119. package/esm2022/icons/windowminimize/windowminimize.mjs +3 -3
  120. package/esm2022/image/image.mjs +76 -27
  121. package/esm2022/inplace/inplace.mjs +30 -23
  122. package/esm2022/inputmask/inputmask.mjs +7 -7
  123. package/esm2022/inputnumber/inputnumber.mjs +18 -8
  124. package/esm2022/inputswitch/inputswitch.mjs +7 -7
  125. package/esm2022/inputtext/inputtext.mjs +7 -7
  126. package/esm2022/inputtextarea/inputtextarea.mjs +7 -7
  127. package/esm2022/keyfilter/keyfilter.mjs +7 -7
  128. package/esm2022/knob/knob.mjs +7 -7
  129. package/esm2022/listbox/listbox.mjs +7 -7
  130. package/esm2022/megamenu/megamenu.mjs +1011 -353
  131. package/esm2022/menu/menu.mjs +414 -183
  132. package/esm2022/menubar/menubar.mjs +916 -294
  133. package/esm2022/message/message.mjs +7 -7
  134. package/esm2022/messages/messages.mjs +34 -34
  135. package/esm2022/multiselect/multiselect.mjs +12 -11
  136. package/esm2022/orderlist/orderlist.mjs +16 -22
  137. package/esm2022/organizationchart/organizationchart.mjs +15 -15
  138. package/esm2022/overlay/overlay.mjs +7 -7
  139. package/esm2022/overlaypanel/overlaypanel.mjs +12 -8
  140. package/esm2022/paginator/paginator.mjs +7 -7
  141. package/esm2022/panel/panel.mjs +51 -40
  142. package/esm2022/panelmenu/panelmenu.mjs +1007 -350
  143. package/esm2022/password/password.mjs +13 -13
  144. package/esm2022/picklist/picklist.mjs +7 -7
  145. package/esm2022/progressbar/progressbar.mjs +26 -22
  146. package/esm2022/progressspinner/progressspinner.mjs +12 -12
  147. package/esm2022/radiobutton/radiobutton.mjs +10 -10
  148. package/esm2022/rating/rating.mjs +7 -7
  149. package/esm2022/ripple/ripple.mjs +10 -8
  150. package/esm2022/scroller/scroller.mjs +7 -7
  151. package/esm2022/scrollpanel/scrollpanel.mjs +201 -29
  152. package/esm2022/scrolltop/scrolltop.mjs +17 -8
  153. package/esm2022/selectbutton/selectbutton.mjs +9 -9
  154. package/esm2022/sidebar/sidebar.mjs +51 -20
  155. package/esm2022/skeleton/skeleton.mjs +9 -9
  156. package/esm2022/slidemenu/slidemenu.mjs +1066 -372
  157. package/esm2022/slider/slider.mjs +7 -7
  158. package/esm2022/speeddial/speeddial.mjs +297 -21
  159. package/esm2022/spinner/spinner.mjs +7 -7
  160. package/esm2022/splitbutton/splitbutton.mjs +71 -16
  161. package/esm2022/splitter/splitter.mjs +166 -35
  162. package/esm2022/steps/steps.mjs +118 -28
  163. package/esm2022/styleclass/styleclass.mjs +7 -7
  164. package/esm2022/table/table.mjs +95 -89
  165. package/esm2022/tabmenu/tabmenu.mjs +208 -70
  166. package/esm2022/tabview/tabview.mjs +236 -53
  167. package/esm2022/tag/tag.mjs +7 -7
  168. package/esm2022/terminal/terminal.mjs +10 -10
  169. package/esm2022/terminal/terminalservice.mjs +3 -3
  170. package/esm2022/tieredmenu/tieredmenu.mjs +887 -400
  171. package/esm2022/timeline/timeline.mjs +9 -9
  172. package/esm2022/toast/toast.mjs +63 -35
  173. package/esm2022/togglebutton/togglebutton.mjs +9 -9
  174. package/esm2022/toolbar/toolbar.mjs +23 -16
  175. package/esm2022/tooltip/tooltip.mjs +14 -9
  176. package/esm2022/tree/tree.mjs +13 -13
  177. package/esm2022/treeselect/treeselect.mjs +7 -7
  178. package/esm2022/treetable/treetable.mjs +72 -72
  179. package/esm2022/tristatecheckbox/tristatecheckbox.mjs +7 -7
  180. package/esm2022/utils/objectutils.mjs +31 -1
  181. package/esm2022/utils/uniquecomponentid.mjs +2 -3
  182. package/esm2022/virtualscroller/virtualscroller.mjs +7 -7
  183. package/fesm2022/primeng-accordion.mjs +215 -53
  184. package/fesm2022/primeng-accordion.mjs.map +1 -1
  185. package/fesm2022/primeng-animate.mjs +7 -7
  186. package/fesm2022/primeng-api.mjs +108 -35
  187. package/fesm2022/primeng-api.mjs.map +1 -1
  188. package/fesm2022/primeng-autocomplete.mjs +9 -9
  189. package/fesm2022/primeng-autocomplete.mjs.map +1 -1
  190. package/fesm2022/primeng-autofocus.mjs +7 -7
  191. package/fesm2022/primeng-avatar.mjs +23 -9
  192. package/fesm2022/primeng-avatar.mjs.map +1 -1
  193. package/fesm2022/primeng-avatargroup.mjs +7 -7
  194. package/fesm2022/primeng-badge.mjs +10 -10
  195. package/fesm2022/primeng-baseicon.mjs +3 -3
  196. package/fesm2022/primeng-blockui.mjs +25 -9
  197. package/fesm2022/primeng-blockui.mjs.map +1 -1
  198. package/fesm2022/primeng-breadcrumb.mjs +55 -38
  199. package/fesm2022/primeng-breadcrumb.mjs.map +1 -1
  200. package/fesm2022/primeng-button.mjs +46 -30
  201. package/fesm2022/primeng-button.mjs.map +1 -1
  202. package/fesm2022/primeng-calendar.mjs +7 -7
  203. package/fesm2022/primeng-card.mjs +9 -9
  204. package/fesm2022/primeng-card.mjs.map +1 -1
  205. package/fesm2022/primeng-carousel.mjs +152 -26
  206. package/fesm2022/primeng-carousel.mjs.map +1 -1
  207. package/fesm2022/primeng-cascadeselect.mjs +10 -10
  208. package/fesm2022/primeng-chart.mjs +7 -7
  209. package/fesm2022/primeng-checkbox.mjs +7 -7
  210. package/fesm2022/primeng-chip.mjs +24 -19
  211. package/fesm2022/primeng-chip.mjs.map +1 -1
  212. package/fesm2022/primeng-chips.mjs +7 -7
  213. package/fesm2022/primeng-colorpicker.mjs +7 -7
  214. package/fesm2022/primeng-confirmdialog.mjs +27 -11
  215. package/fesm2022/primeng-confirmdialog.mjs.map +1 -1
  216. package/fesm2022/primeng-confirmpopup.mjs +9 -7
  217. package/fesm2022/primeng-confirmpopup.mjs.map +1 -1
  218. package/fesm2022/primeng-contextmenu.mjs +1001 -551
  219. package/fesm2022/primeng-contextmenu.mjs.map +1 -1
  220. package/fesm2022/primeng-dataview.mjs +10 -10
  221. package/fesm2022/primeng-defer.mjs +7 -7
  222. package/fesm2022/primeng-dialog.mjs +20 -15
  223. package/fesm2022/primeng-dialog.mjs.map +1 -1
  224. package/fesm2022/primeng-divider.mjs +9 -9
  225. package/fesm2022/primeng-divider.mjs.map +1 -1
  226. package/fesm2022/primeng-dock.mjs +289 -91
  227. package/fesm2022/primeng-dock.mjs.map +1 -1
  228. package/fesm2022/primeng-dom.mjs +18 -6
  229. package/fesm2022/primeng-dom.mjs.map +1 -1
  230. package/fesm2022/primeng-dragdrop.mjs +10 -10
  231. package/fesm2022/primeng-dropdown.mjs +10 -10
  232. package/fesm2022/primeng-dynamicdialog.mjs +35 -18
  233. package/fesm2022/primeng-dynamicdialog.mjs.map +1 -1
  234. package/fesm2022/primeng-editor.mjs +7 -7
  235. package/fesm2022/primeng-fieldset.mjs +64 -37
  236. package/fesm2022/primeng-fieldset.mjs.map +1 -1
  237. package/fesm2022/primeng-fileupload.mjs +55 -47
  238. package/fesm2022/primeng-fileupload.mjs.map +1 -1
  239. package/fesm2022/primeng-focustrap.mjs +7 -7
  240. package/fesm2022/primeng-galleria.mjs +256 -47
  241. package/fesm2022/primeng-galleria.mjs.map +1 -1
  242. package/fesm2022/primeng-icons-angledoubledown.mjs +3 -3
  243. package/fesm2022/primeng-icons-angledoubleleft.mjs +3 -3
  244. package/fesm2022/primeng-icons-angledoubleright.mjs +3 -3
  245. package/fesm2022/primeng-icons-angledoubleup.mjs +3 -3
  246. package/fesm2022/primeng-icons-angledown.mjs +3 -3
  247. package/fesm2022/primeng-icons-angleleft.mjs +3 -3
  248. package/fesm2022/primeng-icons-angleright.mjs +3 -3
  249. package/fesm2022/primeng-icons-angleup.mjs +3 -3
  250. package/fesm2022/primeng-icons-arrowdown.mjs +3 -3
  251. package/fesm2022/primeng-icons-arrowdownleft.mjs +3 -3
  252. package/fesm2022/primeng-icons-arrowdownright.mjs +3 -3
  253. package/fesm2022/primeng-icons-arrowleft.mjs +3 -3
  254. package/fesm2022/primeng-icons-arrowright.mjs +3 -3
  255. package/fesm2022/primeng-icons-arrowup.mjs +3 -3
  256. package/fesm2022/primeng-icons-ban.mjs +3 -3
  257. package/fesm2022/primeng-icons-bars.mjs +3 -3
  258. package/fesm2022/primeng-icons-calendar.mjs +3 -3
  259. package/fesm2022/primeng-icons-caretleft.mjs +3 -3
  260. package/fesm2022/primeng-icons-caretright.mjs +3 -3
  261. package/fesm2022/primeng-icons-check.mjs +3 -3
  262. package/fesm2022/primeng-icons-chevrondown.mjs +3 -3
  263. package/fesm2022/primeng-icons-chevronleft.mjs +3 -3
  264. package/fesm2022/primeng-icons-chevronright.mjs +3 -3
  265. package/fesm2022/primeng-icons-chevronup.mjs +3 -3
  266. package/fesm2022/primeng-icons-exclamationtriangle.mjs +3 -3
  267. package/fesm2022/primeng-icons-eye.mjs +3 -3
  268. package/fesm2022/primeng-icons-eyeslash.mjs +3 -3
  269. package/fesm2022/primeng-icons-filter.mjs +3 -3
  270. package/fesm2022/primeng-icons-filterslash.mjs +3 -3
  271. package/fesm2022/primeng-icons-home.mjs +3 -3
  272. package/fesm2022/primeng-icons-infocircle.mjs +3 -3
  273. package/fesm2022/primeng-icons-minus.mjs +3 -3
  274. package/fesm2022/primeng-icons-pencil.mjs +3 -3
  275. package/fesm2022/primeng-icons-plus.mjs +3 -3
  276. package/fesm2022/primeng-icons-refresh.mjs +3 -3
  277. package/fesm2022/primeng-icons-search.mjs +3 -3
  278. package/fesm2022/primeng-icons-searchminus.mjs +3 -3
  279. package/fesm2022/primeng-icons-searchplus.mjs +3 -3
  280. package/fesm2022/primeng-icons-sortalt.mjs +3 -3
  281. package/fesm2022/primeng-icons-sortamountdown.mjs +3 -3
  282. package/fesm2022/primeng-icons-sortamountupalt.mjs +3 -3
  283. package/fesm2022/primeng-icons-spinner.mjs +3 -3
  284. package/fesm2022/primeng-icons-star.mjs +3 -3
  285. package/fesm2022/primeng-icons-starfill.mjs +3 -3
  286. package/fesm2022/primeng-icons-thlarge.mjs +3 -3
  287. package/fesm2022/primeng-icons-times.mjs +3 -3
  288. package/fesm2022/primeng-icons-timescircle.mjs +3 -3
  289. package/fesm2022/primeng-icons-trash.mjs +3 -3
  290. package/fesm2022/primeng-icons-undo.mjs +3 -3
  291. package/fesm2022/primeng-icons-upload.mjs +3 -3
  292. package/fesm2022/primeng-icons-windowmaximize.mjs +3 -3
  293. package/fesm2022/primeng-icons-windowminimize.mjs +3 -3
  294. package/fesm2022/primeng-image.mjs +75 -26
  295. package/fesm2022/primeng-image.mjs.map +1 -1
  296. package/fesm2022/primeng-inplace.mjs +29 -22
  297. package/fesm2022/primeng-inplace.mjs.map +1 -1
  298. package/fesm2022/primeng-inputmask.mjs +7 -7
  299. package/fesm2022/primeng-inputnumber.mjs +17 -7
  300. package/fesm2022/primeng-inputnumber.mjs.map +1 -1
  301. package/fesm2022/primeng-inputswitch.mjs +7 -7
  302. package/fesm2022/primeng-inputtext.mjs +7 -7
  303. package/fesm2022/primeng-inputtextarea.mjs +7 -7
  304. package/fesm2022/primeng-keyfilter.mjs +7 -7
  305. package/fesm2022/primeng-knob.mjs +7 -7
  306. package/fesm2022/primeng-listbox.mjs +7 -7
  307. package/fesm2022/primeng-megamenu.mjs +1010 -353
  308. package/fesm2022/primeng-megamenu.mjs.map +1 -1
  309. package/fesm2022/primeng-menu.mjs +413 -182
  310. package/fesm2022/primeng-menu.mjs.map +1 -1
  311. package/fesm2022/primeng-menubar.mjs +915 -293
  312. package/fesm2022/primeng-menubar.mjs.map +1 -1
  313. package/fesm2022/primeng-message.mjs +7 -7
  314. package/fesm2022/primeng-messages.mjs +33 -33
  315. package/fesm2022/primeng-messages.mjs.map +1 -1
  316. package/fesm2022/primeng-multiselect.mjs +11 -10
  317. package/fesm2022/primeng-multiselect.mjs.map +1 -1
  318. package/fesm2022/primeng-orderlist.mjs +15 -21
  319. package/fesm2022/primeng-orderlist.mjs.map +1 -1
  320. package/fesm2022/primeng-organizationchart.mjs +14 -14
  321. package/fesm2022/primeng-organizationchart.mjs.map +1 -1
  322. package/fesm2022/primeng-overlay.mjs +7 -7
  323. package/fesm2022/primeng-overlaypanel.mjs +11 -7
  324. package/fesm2022/primeng-overlaypanel.mjs.map +1 -1
  325. package/fesm2022/primeng-paginator.mjs +7 -7
  326. package/fesm2022/primeng-panel.mjs +51 -40
  327. package/fesm2022/primeng-panel.mjs.map +1 -1
  328. package/fesm2022/primeng-panelmenu.mjs +1006 -350
  329. package/fesm2022/primeng-panelmenu.mjs.map +1 -1
  330. package/fesm2022/primeng-password.mjs +13 -13
  331. package/fesm2022/primeng-picklist.mjs +7 -7
  332. package/fesm2022/primeng-progressbar.mjs +25 -21
  333. package/fesm2022/primeng-progressbar.mjs.map +1 -1
  334. package/fesm2022/primeng-progressspinner.mjs +11 -11
  335. package/fesm2022/primeng-progressspinner.mjs.map +1 -1
  336. package/fesm2022/primeng-radiobutton.mjs +10 -10
  337. package/fesm2022/primeng-rating.mjs +7 -7
  338. package/fesm2022/primeng-ripple.mjs +9 -7
  339. package/fesm2022/primeng-ripple.mjs.map +1 -1
  340. package/fesm2022/primeng-scroller.mjs +7 -7
  341. package/fesm2022/primeng-scrollpanel.mjs +200 -28
  342. package/fesm2022/primeng-scrollpanel.mjs.map +1 -1
  343. package/fesm2022/primeng-scrolltop.mjs +16 -7
  344. package/fesm2022/primeng-scrolltop.mjs.map +1 -1
  345. package/fesm2022/primeng-selectbutton.mjs +9 -9
  346. package/fesm2022/primeng-selectbutton.mjs.map +1 -1
  347. package/fesm2022/primeng-sidebar.mjs +50 -19
  348. package/fesm2022/primeng-sidebar.mjs.map +1 -1
  349. package/fesm2022/primeng-skeleton.mjs +8 -8
  350. package/fesm2022/primeng-skeleton.mjs.map +1 -1
  351. package/fesm2022/primeng-slidemenu.mjs +1065 -371
  352. package/fesm2022/primeng-slidemenu.mjs.map +1 -1
  353. package/fesm2022/primeng-slider.mjs +7 -7
  354. package/fesm2022/primeng-speeddial.mjs +296 -20
  355. package/fesm2022/primeng-speeddial.mjs.map +1 -1
  356. package/fesm2022/primeng-spinner.mjs +7 -7
  357. package/fesm2022/primeng-splitbutton.mjs +70 -15
  358. package/fesm2022/primeng-splitbutton.mjs.map +1 -1
  359. package/fesm2022/primeng-splitter.mjs +166 -35
  360. package/fesm2022/primeng-splitter.mjs.map +1 -1
  361. package/fesm2022/primeng-steps.mjs +117 -27
  362. package/fesm2022/primeng-steps.mjs.map +1 -1
  363. package/fesm2022/primeng-styleclass.mjs +7 -7
  364. package/fesm2022/primeng-table.mjs +94 -88
  365. package/fesm2022/primeng-table.mjs.map +1 -1
  366. package/fesm2022/primeng-tabmenu.mjs +207 -69
  367. package/fesm2022/primeng-tabmenu.mjs.map +1 -1
  368. package/fesm2022/primeng-tabview.mjs +235 -52
  369. package/fesm2022/primeng-tabview.mjs.map +1 -1
  370. package/fesm2022/primeng-tag.mjs +7 -7
  371. package/fesm2022/primeng-terminal.mjs +12 -12
  372. package/fesm2022/primeng-terminal.mjs.map +1 -1
  373. package/fesm2022/primeng-tieredmenu.mjs +886 -399
  374. package/fesm2022/primeng-tieredmenu.mjs.map +1 -1
  375. package/fesm2022/primeng-timeline.mjs +9 -9
  376. package/fesm2022/primeng-timeline.mjs.map +1 -1
  377. package/fesm2022/primeng-toast.mjs +62 -34
  378. package/fesm2022/primeng-toast.mjs.map +1 -1
  379. package/fesm2022/primeng-togglebutton.mjs +9 -9
  380. package/fesm2022/primeng-togglebutton.mjs.map +1 -1
  381. package/fesm2022/primeng-toolbar.mjs +22 -15
  382. package/fesm2022/primeng-toolbar.mjs.map +1 -1
  383. package/fesm2022/primeng-tooltip.mjs +13 -8
  384. package/fesm2022/primeng-tooltip.mjs.map +1 -1
  385. package/fesm2022/primeng-tree.mjs +12 -12
  386. package/fesm2022/primeng-tree.mjs.map +1 -1
  387. package/fesm2022/primeng-treeselect.mjs +7 -7
  388. package/fesm2022/primeng-treetable.mjs +71 -71
  389. package/fesm2022/primeng-treetable.mjs.map +1 -1
  390. package/fesm2022/primeng-tristatecheckbox.mjs +7 -7
  391. package/fesm2022/primeng-utils.mjs +31 -2
  392. package/fesm2022/primeng-utils.mjs.map +1 -1
  393. package/fesm2022/primeng-virtualscroller.mjs +7 -7
  394. package/fieldset/fieldset.d.ts +6 -5
  395. package/galleria/galleria.d.ts +24 -4
  396. package/image/image.d.ts +11 -1
  397. package/inplace/inplace.d.ts +6 -1
  398. package/megamenu/megamenu.d.ts +140 -16
  399. package/menu/menu.d.ts +64 -7
  400. package/menubar/menubar.d.ts +119 -23
  401. package/orderlist/orderlist.d.ts +2 -1
  402. package/package.json +98 -98
  403. package/panel/panel.d.ts +6 -5
  404. package/panelmenu/panelmenu.d.ts +136 -22
  405. package/resources/components/autocomplete/autocomplete.css +9 -8
  406. package/resources/components/breadcrumb/breadcrumb.css +9 -3
  407. package/resources/components/button/button.css +4 -0
  408. package/resources/components/common/common.css +1 -1
  409. package/resources/components/contextmenu/contextmenu.css +1 -7
  410. package/resources/components/dock/dock.css +1 -1
  411. package/resources/components/megamenu/megamenu.css +9 -10
  412. package/resources/components/menubar/menubar.css +4 -0
  413. package/resources/components/panelmenu/panelmenu.css +4 -2
  414. package/resources/components/slidemenu/slidemenu.css +40 -41
  415. package/resources/components/tabview/tabview.css +3 -2
  416. package/resources/primeng.css +4 -1
  417. package/resources/primeng.min.css +1 -1
  418. package/resources/themes/arya-blue/theme.css +358 -396
  419. package/resources/themes/arya-green/theme.css +358 -396
  420. package/resources/themes/arya-orange/theme.css +358 -396
  421. package/resources/themes/arya-purple/theme.css +358 -396
  422. package/resources/themes/bootstrap4-dark-blue/theme.css +373 -422
  423. package/resources/themes/bootstrap4-dark-purple/theme.css +373 -422
  424. package/resources/themes/bootstrap4-light-blue/theme.css +385 -434
  425. package/resources/themes/bootstrap4-light-purple/theme.css +385 -434
  426. package/resources/themes/fluent-light/theme.css +368 -406
  427. package/resources/themes/lara-dark-blue/theme.css +360 -398
  428. package/resources/themes/lara-dark-indigo/theme.css +360 -398
  429. package/resources/themes/lara-dark-purple/theme.css +360 -398
  430. package/resources/themes/lara-dark-teal/theme.css +360 -398
  431. package/resources/themes/lara-light-blue/theme.css +386 -424
  432. package/resources/themes/lara-light-indigo/theme.css +386 -424
  433. package/resources/themes/lara-light-purple/theme.css +386 -424
  434. package/resources/themes/lara-light-teal/theme.css +386 -424
  435. package/resources/themes/luna-amber/theme.css +376 -414
  436. package/resources/themes/luna-blue/theme.css +376 -414
  437. package/resources/themes/luna-green/theme.css +376 -414
  438. package/resources/themes/luna-pink/theme.css +376 -414
  439. package/resources/themes/md-dark-deeppurple/theme.css +389 -409
  440. package/resources/themes/md-dark-indigo/theme.css +389 -409
  441. package/resources/themes/md-light-deeppurple/theme.css +389 -409
  442. package/resources/themes/md-light-indigo/theme.css +389 -409
  443. package/resources/themes/mdc-dark-deeppurple/theme.css +389 -409
  444. package/resources/themes/mdc-dark-indigo/theme.css +389 -409
  445. package/resources/themes/mdc-light-deeppurple/theme.css +389 -409
  446. package/resources/themes/mdc-light-indigo/theme.css +389 -409
  447. package/resources/themes/mira/theme.css +363 -401
  448. package/resources/themes/nano/theme.css +364 -402
  449. package/resources/themes/nova/theme.css +352 -390
  450. package/resources/themes/nova-accent/theme.css +352 -390
  451. package/resources/themes/nova-alt/theme.css +352 -390
  452. package/resources/themes/rhea/theme.css +352 -390
  453. package/resources/themes/saga-blue/theme.css +364 -402
  454. package/resources/themes/saga-green/theme.css +364 -402
  455. package/resources/themes/saga-orange/theme.css +364 -402
  456. package/resources/themes/saga-purple/theme.css +364 -402
  457. package/resources/themes/soho-dark/theme.css +378 -416
  458. package/resources/themes/soho-light/theme.css +386 -424
  459. package/resources/themes/tailwind-light/theme.css +377 -415
  460. package/resources/themes/vela-blue/theme.css +364 -402
  461. package/resources/themes/vela-green/theme.css +364 -402
  462. package/resources/themes/vela-orange/theme.css +364 -402
  463. package/resources/themes/vela-purple/theme.css +364 -402
  464. package/resources/themes/viva-dark/theme.css +358 -396
  465. package/resources/themes/viva-light/theme.css +364 -402
  466. package/scrollpanel/scrollpanel.d.ts +22 -4
  467. package/scrolltop/scrolltop.d.ts +6 -1
  468. package/sidebar/sidebar.d.ts +1 -0
  469. package/slidemenu/slidemenu.d.ts +192 -86
  470. package/speeddial/speeddial.d.ts +34 -1
  471. package/splitbutton/splitbutton.d.ts +5 -1
  472. package/splitter/splitter.d.ts +18 -5
  473. package/steps/steps.d.ts +20 -3
  474. package/table/table.d.ts +3 -1
  475. package/tabmenu/tabmenu.d.ts +27 -2
  476. package/tabview/tabview.d.ts +36 -5
  477. package/tieredmenu/tieredmenu.d.ts +137 -51
  478. package/toolbar/toolbar.d.ts +6 -1
  479. package/tooltip/tooltip.d.ts +1 -1
  480. package/utils/objectutils.d.ts +4 -0
  481. package/utils/uniquecomponentid.d.ts +1 -1
@@ -1,298 +1,477 @@
1
+ import { trigger, transition, style, animate } from '@angular/animations';
1
2
  import * as i1 from '@angular/common';
2
- import { DOCUMENT, CommonModule } from '@angular/common';
3
+ import { DOCUMENT, isPlatformBrowser, CommonModule } from '@angular/common';
3
4
  import * as i0 from '@angular/core';
4
- import { EventEmitter, forwardRef, Component, ViewEncapsulation, Inject, Input, Output, ViewChild, ChangeDetectionStrategy, ContentChildren, NgModule } from '@angular/core';
5
+ import { EventEmitter, Component, ViewEncapsulation, Inject, Input, Output, ViewChild, signal, effect, PLATFORM_ID, ChangeDetectionStrategy, ContentChildren, NgModule } from '@angular/core';
5
6
  import * as i2 from '@angular/router';
6
7
  import { RouterModule } from '@angular/router';
7
8
  import * as i5 from 'primeng/api';
8
- import { PrimeTemplate, SharedModule, ContextMenuService } from 'primeng/api';
9
+ import { PrimeTemplate, SharedModule } from 'primeng/api';
9
10
  import { DomHandler } from 'primeng/dom';
10
11
  import { AngleRightIcon } from 'primeng/icons/angleright';
11
12
  import * as i3 from 'primeng/ripple';
12
13
  import { RippleModule } from 'primeng/ripple';
13
14
  import * as i4 from 'primeng/tooltip';
14
15
  import { TooltipModule } from 'primeng/tooltip';
15
- import { ZIndexUtils } from 'primeng/utils';
16
- import { Subject } from 'rxjs';
17
- import { takeUntil } from 'rxjs/operators';
16
+ import { ObjectUtils, UniqueComponentId, ZIndexUtils } from 'primeng/utils';
18
17
 
19
18
  class ContextMenuSub {
20
- item;
21
- root;
22
- parentItemKey;
23
- leafClick = new EventEmitter();
24
- sublistViewChild;
25
- menuitemViewChild;
19
+ document;
20
+ el;
21
+ renderer;
22
+ cd;
26
23
  contextMenu;
27
- activeItemKey;
28
- hideTimeout;
29
- activeItemKeyChangeSubscription;
30
- constructor(contextMenu) {
24
+ ref;
25
+ visible = false;
26
+ items;
27
+ root = false;
28
+ autoZIndex = true;
29
+ baseZIndex = 0;
30
+ popup;
31
+ menuId;
32
+ ariaLabel;
33
+ ariaLabelledBy;
34
+ level = 0;
35
+ focusedItemId;
36
+ activeItemPath;
37
+ tabindex = 0;
38
+ itemClick = new EventEmitter();
39
+ itemMouseEnter = new EventEmitter();
40
+ menuFocus = new EventEmitter();
41
+ menuBlur = new EventEmitter();
42
+ menuKeydown = new EventEmitter();
43
+ sublistViewChild;
44
+ constructor(document, el, renderer, cd, contextMenu, ref) {
45
+ this.document = document;
46
+ this.el = el;
47
+ this.renderer = renderer;
48
+ this.cd = cd;
31
49
  this.contextMenu = contextMenu;
50
+ this.ref = ref;
32
51
  }
33
- ngOnInit() {
34
- this.activeItemKeyChangeSubscription = this.contextMenu.contextMenuService.activeItemKeyChange$.pipe(takeUntil(this.contextMenu.ngDestroy$)).subscribe((activeItemKey) => {
35
- this.activeItemKey = activeItemKey;
36
- if (this.isActive(this.parentItemKey) && DomHandler.hasClass(this.sublistViewChild?.nativeElement, 'p-submenu-list-active')) {
37
- this.contextMenu.positionSubmenu(this.sublistViewChild?.nativeElement);
38
- }
39
- this.contextMenu.cd.markForCheck();
40
- });
52
+ getItemProp(processedItem, name, params = null) {
53
+ return processedItem && processedItem.item ? ObjectUtils.getItemValue(processedItem.item[name], params) : undefined;
41
54
  }
42
- onItemMouseEnter(event, item, key) {
43
- if (this.hideTimeout) {
44
- clearTimeout(this.hideTimeout);
45
- this.hideTimeout = null;
46
- }
47
- if (item.disabled) {
48
- this.activeItemKey = null;
49
- return;
50
- }
51
- if (item.items) {
52
- let childSublist = DomHandler.findSingle(event.currentTarget, '.p-submenu-list');
53
- DomHandler.addClass(childSublist, 'p-submenu-list-active');
54
- }
55
- this.contextMenu.contextMenuService.changeKey(key);
55
+ getItemId(processedItem) {
56
+ return `${this.menuId}_${processedItem.key}`;
56
57
  }
57
- onItemMouseLeave(event, item) {
58
- if (item.disabled) {
59
- return;
60
- }
61
- if (this.contextMenu.el.nativeElement.contains(event.target)) {
62
- if (item.items) {
63
- this.contextMenu.removeActiveFromSubLists(event.currentTarget);
64
- }
65
- if (!this.root) {
66
- this.contextMenu.contextMenuService.changeKey(this.parentItemKey);
67
- }
68
- }
58
+ getItemKey(processedItem) {
59
+ return this.getItemId(processedItem);
69
60
  }
70
- onItemClick(event, item, menuitem, key) {
71
- if (item.disabled) {
72
- event.preventDefault();
73
- return;
74
- }
75
- if (!item.url && !item.routerLink) {
76
- event.preventDefault();
77
- }
78
- if (item.command) {
79
- item.command({
80
- originalEvent: event,
81
- item: item
82
- });
83
- }
84
- if (item.items) {
85
- let childSublist = DomHandler.findSingle(menuitem, '.p-submenu-list');
86
- if (childSublist) {
87
- if (this.isActive(key) && DomHandler.hasClass(childSublist, 'p-submenu-list-active')) {
88
- this.contextMenu.removeActiveFromSubLists(menuitem);
89
- }
90
- else {
91
- DomHandler.addClass(childSublist, 'p-submenu-list-active');
92
- }
93
- this.contextMenu.contextMenuService.changeKey(key);
94
- }
95
- }
96
- if (!item.items) {
97
- this.onLeafClick();
98
- }
61
+ getItemClass(processedItem) {
62
+ return {
63
+ ...this.getItemProp(processedItem, 'class'),
64
+ 'p-menuitem': true,
65
+ 'p-highlight': this.isItemActive(processedItem),
66
+ 'p-menuitem-active': this.isItemActive(processedItem),
67
+ 'p-focus': this.isItemFocused(processedItem),
68
+ 'p-disabled': this.isItemDisabled(processedItem)
69
+ };
70
+ }
71
+ getItemLabel(processedItem) {
72
+ return this.getItemProp(processedItem, 'label');
73
+ }
74
+ getSeparatorItemClass(processedItem) {
75
+ return {
76
+ ...this.getItemProp(processedItem, 'class'),
77
+ 'p-menuitem-separator': true
78
+ };
79
+ }
80
+ getAriaSetSize() {
81
+ return this.items.filter((processedItem) => this.isItemVisible(processedItem) && !this.getItemProp(processedItem, 'separator')).length;
99
82
  }
100
- onLeafClick() {
101
- if (this.root) {
102
- this.contextMenu.hide();
83
+ getAriaPosInset(index) {
84
+ return index - this.items.slice(0, index).filter((processedItem) => this.isItemVisible(processedItem) && this.getItemProp(processedItem, 'separator')).length + 1;
85
+ }
86
+ isItemVisible(processedItem) {
87
+ return this.getItemProp(processedItem, 'visible') !== false;
88
+ }
89
+ isItemActive(processedItem) {
90
+ if (this.activeItemPath) {
91
+ return this.activeItemPath.some((path) => path.key === processedItem.key);
103
92
  }
104
- this.leafClick.emit();
105
93
  }
106
- getKey(index) {
107
- return this.root ? String(index) : this.parentItemKey + '_' + index;
94
+ isItemDisabled(processedItem) {
95
+ return this.getItemProp(processedItem, 'disabled');
96
+ }
97
+ isItemFocused(processedItem) {
98
+ return this.focusedItemId === this.getItemId(processedItem);
99
+ }
100
+ isItemGroup(processedItem) {
101
+ return ObjectUtils.isNotEmpty(processedItem.items);
108
102
  }
109
- isActive(key) {
110
- return this.activeItemKey && (this.activeItemKey.startsWith(key + '_') || this.activeItemKey === key);
103
+ onItemMouseEnter(param) {
104
+ const { event, processedItem } = param;
105
+ this.itemMouseEnter.emit({ originalEvent: event, processedItem });
106
+ }
107
+ onItemClick(event, processedItem) {
108
+ this.getItemProp(processedItem, 'command', { originalEvent: event, item: processedItem.item });
109
+ this.itemClick.emit({ originalEvent: event, processedItem, isFocus: true });
110
+ }
111
+ onEnter(event, sublist) {
112
+ if (event.fromState === 'void' && event.toState) {
113
+ const sublist = event.element;
114
+ this.position(sublist);
115
+ }
116
+ }
117
+ position(sublist) {
118
+ const parentItem = sublist.parentElement.parentElement;
119
+ const containerOffset = DomHandler.getOffset(sublist.parentElement.parentElement);
120
+ const viewport = DomHandler.getViewport();
121
+ const sublistWidth = sublist.offsetParent ? sublist.offsetWidth : DomHandler.getHiddenElementOuterWidth(sublist);
122
+ const itemOuterWidth = DomHandler.getOuterWidth(parentItem.children[0]);
123
+ sublist.style.top = '0px';
124
+ if (parseInt(containerOffset.left, 10) + itemOuterWidth + sublistWidth > viewport.width - DomHandler.calculateScrollbarWidth()) {
125
+ sublist.style.left = -1 * sublistWidth + 'px';
126
+ }
127
+ else {
128
+ sublist.style.left = itemOuterWidth + 'px';
129
+ }
111
130
  }
112
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: ContextMenuSub, deps: [{ token: forwardRef(() => ContextMenu) }], target: i0.ɵɵFactoryTarget.Component });
113
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.2", type: ContextMenuSub, selector: "p-contextMenuSub", inputs: { item: "item", root: "root", parentItemKey: "parentItemKey" }, outputs: { leafClick: "leafClick" }, host: { classAttribute: "p-element" }, viewQueries: [{ propertyName: "sublistViewChild", first: true, predicate: ["sublist"], descendants: true }, { propertyName: "menuitemViewChild", first: true, predicate: ["menuitem"], descendants: true }], ngImport: i0, template: `
114
- <ul #sublist [ngClass]="{ 'p-submenu-list': !root }">
115
- <ng-template ngFor let-child let-index="index" [ngForOf]="root ? item : item?.items">
116
- <li *ngIf="child.separator" #menuitem class="p-menu-separator" [ngClass]="{ 'p-hidden': child.visible === false }" role="separator"></li>
131
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.0", ngImport: i0, type: ContextMenuSub, deps: [{ token: DOCUMENT }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: ContextMenu }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component });
132
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.0", type: ContextMenuSub, selector: "p-contextMenuSub", inputs: { visible: "visible", items: "items", root: "root", autoZIndex: "autoZIndex", baseZIndex: "baseZIndex", popup: "popup", menuId: "menuId", ariaLabel: "ariaLabel", ariaLabelledBy: "ariaLabelledBy", level: "level", focusedItemId: "focusedItemId", activeItemPath: "activeItemPath", tabindex: "tabindex" }, outputs: { itemClick: "itemClick", itemMouseEnter: "itemMouseEnter", menuFocus: "menuFocus", menuBlur: "menuBlur", menuKeydown: "menuKeydown" }, host: { classAttribute: "p-element" }, viewQueries: [{ propertyName: "sublistViewChild", first: true, predicate: ["sublist"], descendants: true }], ngImport: i0, template: `
133
+ <ul
134
+ *ngIf="root ? true : visible"
135
+ #sublist
136
+ role="menu"
137
+ [ngClass]="{ 'p-submenu-list': !root, 'p-contextmenu-root-list': root }"
138
+ [@overlayAnimation]="visible"
139
+ (@overlayAnimation.start)="onEnter($event, sublist)"
140
+ [id]="menuId + '_list'"
141
+ [tabindex]="tabindex"
142
+ [attr.aria-label]="ariaLabel"
143
+ [attr.aria-labelledBy]="ariaLabelledBy"
144
+ [attr.aria-activedescendant]="focusedItemId"
145
+ [attr.aria-orientation]="'vertical'"
146
+ [attr.data-pc-section]="'menu'"
147
+ (keydown)="menuKeydown.emit($event)"
148
+ (focus)="menuFocus.emit($event)"
149
+ (blur)="menuBlur.emit($event)"
150
+ >
151
+ <ng-template ngFor let-processedItem [ngForOf]="items" let-index="index">
117
152
  <li
118
- *ngIf="!child.separator"
119
- #menuitem
120
- [ngClass]="{ 'p-menuitem': true, 'p-menuitem-active': isActive(getKey(index)), 'p-hidden': child.visible === false }"
121
- [ngStyle]="child.style"
122
- [class]="child.styleClass"
153
+ *ngIf="isItemVisible(processedItem) && getItemProp(processedItem, 'separator')"
154
+ [id]="getItemId(processedItem)"
155
+ [style]="getItemProp(processedItem, 'style')"
156
+ [ngClass]="getSeparatorItemClass(processedItem)"
157
+ role="separator"
158
+ [attr.data-pc-section]="'separator'"
159
+ ></li>
160
+ <li
161
+ #listItem
162
+ *ngIf="isItemVisible(processedItem) && !getItemProp(processedItem, 'separator')"
163
+ role="menuitem"
164
+ [id]="getItemId(processedItem)"
165
+ [attr.data-pc-section]="'menuitem'"
166
+ [attr.data-p-highlight]="isItemActive(processedItem)"
167
+ [attr.data-p-focused]="isItemFocused(processedItem)"
168
+ [attr.data-p-disabled]="isItemDisabled(processedItem)"
169
+ [attr.aria-label]="getItemLabel(processedItem)"
170
+ [attr.aria-disabled]="isItemDisabled(processedItem) || undefined"
171
+ [attr.aria-haspopup]="isItemGroup(processedItem) && !getItemProp(processedItem, 'to') ? 'menu' : undefined"
172
+ [attr.aria-expanded]="isItemGroup(processedItem) ? isItemActive(processedItem) : undefined"
173
+ [attr.aria-level]="level + 1"
174
+ [attr.aria-setsize]="getAriaSetSize()"
175
+ [attr.aria-posinset]="getAriaPosInset(index)"
176
+ [ngStyle]="getItemProp(processedItem, 'style')"
177
+ [ngClass]="getItemClass(processedItem)"
178
+ [class]="getItemProp(processedItem, 'styleClass')"
123
179
  pTooltip
124
- [tooltipOptions]="child.tooltipOptions"
125
- (mouseenter)="onItemMouseEnter($event, child, getKey(index))"
126
- (mouseleave)="onItemMouseLeave($event, child)"
127
- role="none"
128
- [attr.data-ik]="getKey(index)"
180
+ [tooltipOptions]="getItemProp(processedItem, 'tooltipOptions')"
129
181
  >
130
- <a
131
- *ngIf="!child.routerLink"
132
- [attr.href]="child.url ? child.url : null"
133
- [target]="child.target"
134
- [attr.title]="child.title"
135
- [attr.id]="child.id"
136
- [attr.tabindex]="child.disabled ? null : '0'"
137
- (click)="onItemClick($event, child, menuitem, getKey(index))"
138
- [ngClass]="{ 'p-menuitem-link': true, 'p-disabled': child.disabled }"
139
- pRipple
140
- [attr.aria-haspopup]="item.items != null"
141
- [attr.aria-expanded]="isActive(getKey(index))"
142
- >
143
- <span class="p-menuitem-icon" *ngIf="child.icon" [ngClass]="child.icon" [ngStyle]="child.iconStyle"></span>
144
- <span class="p-menuitem-text" *ngIf="child.escape !== false; else htmlLabel">{{ child.label }}</span>
145
- <ng-template #htmlLabel><span class="p-menuitem-text" [innerHTML]="child.label"></span></ng-template>
146
- <span class="p-menuitem-badge" *ngIf="child.badge" [ngClass]="child.badgeStyleClass">{{ child.badge }}</span>
147
- <ng-container *ngIf="child.items">
148
- <AngleRightIcon *ngIf="!contextMenu.submenuIconTemplate" [styleClass]="'p-submenu-icon'" />
149
- <span *ngIf="contextMenu.submenuIconTemplate" class="p-submenu-icon">
150
- <ng-template *ngTemplateOutlet="contextMenu.submenuIconTemplate"></ng-template>
182
+ <div [attr.data-pc-section]="'content'" class="p-menuitem-content" (click)="onItemClick($event, processedItem)" (mouseenter)="onItemMouseEnter({$event, processedItem})">
183
+ <a
184
+ *ngIf="!getItemProp(processedItem, 'routerLink')"
185
+ [attr.href]="getItemProp(processedItem, 'url')"
186
+ [attr.aria-hidden]="true"
187
+ [attr.data-automationid]="getItemProp(processedItem, 'automationId')"
188
+ [attr.data-pc-section]="'action'"
189
+ [target]="getItemProp(processedItem, 'target')"
190
+ [ngClass]="{ 'p-menuitem-link': true, 'p-disabled': getItemProp(processedItem, 'disabled') }"
191
+ [attr.tabindex]="-1"
192
+ pRipple
193
+ >
194
+ <span
195
+ *ngIf="getItemProp(processedItem, 'icon')"
196
+ class="p-menuitem-icon"
197
+ [ngClass]="getItemProp(processedItem, 'icon')"
198
+ [ngStyle]="getItemProp(processedItem, 'iconStyle')"
199
+ [attr.data-pc-section]="'icon'"
200
+ [attr.aria-hidden]="true"
201
+ [attr.tabindex]="-1"
202
+ >
203
+ </span>
204
+ <span *ngIf="getItemProp(processedItem, 'escape'); else htmlLabel" class="p-menuitem-text" [attr.data-pc-section]="'label'">
205
+ {{ getItemLabel(processedItem) }}
151
206
  </span>
152
- </ng-container>
153
- </a>
154
- <a
155
- *ngIf="child.routerLink"
156
- [routerLink]="child.routerLink"
157
- [queryParams]="child.queryParams"
158
- [routerLinkActive]="'p-menuitem-link-active'"
159
- role="menuitem"
160
- [routerLinkActiveOptions]="child.routerLinkActiveOptions || { exact: false }"
161
- [target]="child.target"
162
- [attr.title]="child.title"
163
- [attr.id]="child.id"
164
- [attr.tabindex]="child.disabled ? null : '0'"
165
- (click)="onItemClick($event, child, menuitem, getKey(index))"
166
- [ngClass]="{ 'p-menuitem-link': true, 'p-disabled': child.disabled }"
167
- pRipple
168
- [fragment]="child.fragment"
169
- [queryParamsHandling]="child.queryParamsHandling"
170
- [preserveFragment]="child.preserveFragment"
171
- [skipLocationChange]="child.skipLocationChange"
172
- [replaceUrl]="child.replaceUrl"
173
- [state]="child.state"
174
- >
175
- <span class="p-menuitem-icon" *ngIf="child.icon" [ngClass]="child.icon" [ngStyle]="child.iconStyle"></span>
176
- <span class="p-menuitem-text" *ngIf="child.escape !== false; else htmlRouteLabel">{{ child.label }}</span>
177
- <ng-template #htmlRouteLabel><span class="p-menuitem-text" [innerHTML]="child.label"></span></ng-template>
178
- <span class="p-menuitem-badge" *ngIf="child.badge" [ngClass]="child.badgeStyleClass">{{ child.badge }}</span>
179
- <ng-container *ngIf="child.items">
180
- <AngleRightIcon *ngIf="!contextMenu.submenuIconTemplate" [styleClass]="'p-submenu-icon'" />
181
- <span *ngIf="contextMenu.submenuIconTemplate" class="p-submenu-icon">
182
- <ng-template *ngTemplateOutlet="contextMenu.submenuIconTemplate"></ng-template>
207
+ <ng-template #htmlLabel>
208
+ <span class="p-menuitem-text" [innerHTML]="getItemLabel(processedItem)" [attr.data-pc-section]="'label'"></span>
209
+ </ng-template>
210
+ <span class="p-menuitem-badge" *ngIf="getItemProp(processedItem, 'badge')" [ngClass]="getItemProp(processedItem, 'badgeStyleClass')">{{ child.badge }}</span>
211
+
212
+ <ng-container *ngIf="isItemGroup(processedItem)">
213
+ <AngleRightIcon *ngIf="!contextMenu.submenuIconTemplate" [styleClass]="'p-submenu-icon'" [attr.data-pc-section]="'submenuicon'" [attr.aria-hidden]="true" />
214
+ <ng-template *ngTemplateOutlet="contextMenu.submenuIconTemplate" [attr.data-pc-section]="'submenuicon'" [attr.aria-hidden]="true"></ng-template>
215
+ </ng-container>
216
+ </a>
217
+ <a
218
+ *ngIf="getItemProp(processedItem, 'routerLink')"
219
+ [routerLink]="getItemProp(processedItem, 'routerLink')"
220
+ [attr.data-automationid]="getItemProp(processedItem, 'automationId')"
221
+ [attr.tabindex]="-1"
222
+ [attr.aria-hidden]="true"
223
+ [attr.data-pc-section]="'action'"
224
+ [queryParams]="getItemProp(processedItem, 'queryParams')"
225
+ [routerLinkActive]="'p-menuitem-link-active'"
226
+ [routerLinkActiveOptions]="getItemProp(processedItem, 'routerLinkActiveOptions') || { exact: false }"
227
+ [target]="getItemProp(processedItem, 'target')"
228
+ [ngClass]="{ 'p-menuitem-link': true, 'p-disabled': getItemProp(processedItem, 'disabled') }"
229
+ [fragment]="getItemProp(processedItem, 'fragment')"
230
+ [queryParamsHandling]="getItemProp(processedItem, 'queryParamsHandling')"
231
+ [preserveFragment]="getItemProp(processedItem, 'preserveFragment')"
232
+ [skipLocationChange]="getItemProp(processedItem, 'skipLocationChange')"
233
+ [replaceUrl]="getItemProp(processedItem, 'replaceUrl')"
234
+ [state]="getItemProp(processedItem, 'state')"
235
+ pRipple
236
+ >
237
+ <span
238
+ *ngIf="getItemProp(processedItem, 'icon')"
239
+ class="p-menuitem-icon"
240
+ [ngClass]="getItemProp(processedItem, 'icon')"
241
+ [ngStyle]="getItemProp(processedItem, 'iconStyle')"
242
+ [attr.data-pc-section]="'icon'"
243
+ [attr.aria-hidden]="true"
244
+ [attr.tabindex]="-1"
245
+ >
183
246
  </span>
184
- </ng-container>
185
- </a>
186
- <p-contextMenuSub [parentItemKey]="getKey(index)" [item]="child" *ngIf="child.items" (leafClick)="onLeafClick()"></p-contextMenuSub>
247
+ <span *ngIf="getItemProp(processedItem, 'escape'); else htmlLabel" class="p-menuitem-text" [attr.data-pc-section]="'label'">
248
+ {{ getItemLabel(processedItem) }}
249
+ </span>
250
+ <ng-template #htmlLabel>
251
+ <span class="p-menuitem-text" [innerHTML]="getItemLabel(processedItem)" [attr.data-pc-section]="'label'"></span>
252
+ </ng-template>
253
+ <span class="p-menuitem-badge" *ngIf="getItemProp(processedItem, 'badge')" [ngClass]="getItemProp(processedItem, 'badgeStyleClass')">{{ child.badge }}</span>
254
+
255
+ <ng-container *ngIf="isItemGroup(processedItem)">
256
+ <AngleRightIcon *ngIf="!contextMenu.submenuIconTemplate" [styleClass]="'p-submenu-icon'" [attr.data-pc-section]="'submenuicon'" [attr.aria-hidden]="true" />
257
+ <ng-template *ngTemplateOutlet="contextMenu.submenuIconTemplate" [attr.data-pc-section]="'submenuicon'" [attr.aria-hidden]="true"></ng-template>
258
+ </ng-container>
259
+ </a>
260
+ </div>
261
+
262
+ <p-contextMenuSub
263
+ *ngIf="isItemVisible(processedItem) && isItemGroup(processedItem)"
264
+ [items]="processedItem.items"
265
+ [menuId]="menuId"
266
+ [visible]="isItemActive(processedItem) && isItemGroup(processedItem)"
267
+ [activeItemPath]="activeItemPath"
268
+ [focusedItemId]="focusedItemId"
269
+ [level]="level + 1"
270
+ (itemClick)="itemClick.emit($event)"
271
+ (itemMouseEnter)="onItemMouseEnter($event)"
272
+ ></p-contextMenuSub>
187
273
  </li>
188
274
  </ng-template>
189
275
  </ul>
190
- `, 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.Ripple; }), selector: "[pRipple]" }, { kind: "directive", type: i0.forwardRef(function () { return i4.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 AngleRightIcon; }), selector: "AngleRightIcon" }, { kind: "component", type: i0.forwardRef(function () { return ContextMenuSub; }), selector: "p-contextMenuSub", inputs: ["item", "root", "parentItemKey"], outputs: ["leafClick"] }], encapsulation: i0.ViewEncapsulation.None });
276
+ `, 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.Ripple; }), selector: "[pRipple]" }, { kind: "directive", type: i0.forwardRef(function () { return i4.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 AngleRightIcon; }), selector: "AngleRightIcon" }, { kind: "component", type: i0.forwardRef(function () { return ContextMenuSub; }), selector: "p-contextMenuSub", inputs: ["visible", "items", "root", "autoZIndex", "baseZIndex", "popup", "menuId", "ariaLabel", "ariaLabelledBy", "level", "focusedItemId", "activeItemPath", "tabindex"], outputs: ["itemClick", "itemMouseEnter", "menuFocus", "menuBlur", "menuKeydown"] }], animations: [trigger('overlayAnimation', [transition(':enter', [style({ opacity: 0 })]), transition(':leave', [style({ opacity: 0 })])])], encapsulation: i0.ViewEncapsulation.None });
191
277
  }
192
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: ContextMenuSub, decorators: [{
278
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.0", ngImport: i0, type: ContextMenuSub, decorators: [{
193
279
  type: Component,
194
280
  args: [{
195
281
  selector: 'p-contextMenuSub',
196
282
  template: `
197
- <ul #sublist [ngClass]="{ 'p-submenu-list': !root }">
198
- <ng-template ngFor let-child let-index="index" [ngForOf]="root ? item : item?.items">
199
- <li *ngIf="child.separator" #menuitem class="p-menu-separator" [ngClass]="{ 'p-hidden': child.visible === false }" role="separator"></li>
283
+ <ul
284
+ *ngIf="root ? true : visible"
285
+ #sublist
286
+ role="menu"
287
+ [ngClass]="{ 'p-submenu-list': !root, 'p-contextmenu-root-list': root }"
288
+ [@overlayAnimation]="visible"
289
+ (@overlayAnimation.start)="onEnter($event, sublist)"
290
+ [id]="menuId + '_list'"
291
+ [tabindex]="tabindex"
292
+ [attr.aria-label]="ariaLabel"
293
+ [attr.aria-labelledBy]="ariaLabelledBy"
294
+ [attr.aria-activedescendant]="focusedItemId"
295
+ [attr.aria-orientation]="'vertical'"
296
+ [attr.data-pc-section]="'menu'"
297
+ (keydown)="menuKeydown.emit($event)"
298
+ (focus)="menuFocus.emit($event)"
299
+ (blur)="menuBlur.emit($event)"
300
+ >
301
+ <ng-template ngFor let-processedItem [ngForOf]="items" let-index="index">
302
+ <li
303
+ *ngIf="isItemVisible(processedItem) && getItemProp(processedItem, 'separator')"
304
+ [id]="getItemId(processedItem)"
305
+ [style]="getItemProp(processedItem, 'style')"
306
+ [ngClass]="getSeparatorItemClass(processedItem)"
307
+ role="separator"
308
+ [attr.data-pc-section]="'separator'"
309
+ ></li>
200
310
  <li
201
- *ngIf="!child.separator"
202
- #menuitem
203
- [ngClass]="{ 'p-menuitem': true, 'p-menuitem-active': isActive(getKey(index)), 'p-hidden': child.visible === false }"
204
- [ngStyle]="child.style"
205
- [class]="child.styleClass"
311
+ #listItem
312
+ *ngIf="isItemVisible(processedItem) && !getItemProp(processedItem, 'separator')"
313
+ role="menuitem"
314
+ [id]="getItemId(processedItem)"
315
+ [attr.data-pc-section]="'menuitem'"
316
+ [attr.data-p-highlight]="isItemActive(processedItem)"
317
+ [attr.data-p-focused]="isItemFocused(processedItem)"
318
+ [attr.data-p-disabled]="isItemDisabled(processedItem)"
319
+ [attr.aria-label]="getItemLabel(processedItem)"
320
+ [attr.aria-disabled]="isItemDisabled(processedItem) || undefined"
321
+ [attr.aria-haspopup]="isItemGroup(processedItem) && !getItemProp(processedItem, 'to') ? 'menu' : undefined"
322
+ [attr.aria-expanded]="isItemGroup(processedItem) ? isItemActive(processedItem) : undefined"
323
+ [attr.aria-level]="level + 1"
324
+ [attr.aria-setsize]="getAriaSetSize()"
325
+ [attr.aria-posinset]="getAriaPosInset(index)"
326
+ [ngStyle]="getItemProp(processedItem, 'style')"
327
+ [ngClass]="getItemClass(processedItem)"
328
+ [class]="getItemProp(processedItem, 'styleClass')"
206
329
  pTooltip
207
- [tooltipOptions]="child.tooltipOptions"
208
- (mouseenter)="onItemMouseEnter($event, child, getKey(index))"
209
- (mouseleave)="onItemMouseLeave($event, child)"
210
- role="none"
211
- [attr.data-ik]="getKey(index)"
330
+ [tooltipOptions]="getItemProp(processedItem, 'tooltipOptions')"
212
331
  >
213
- <a
214
- *ngIf="!child.routerLink"
215
- [attr.href]="child.url ? child.url : null"
216
- [target]="child.target"
217
- [attr.title]="child.title"
218
- [attr.id]="child.id"
219
- [attr.tabindex]="child.disabled ? null : '0'"
220
- (click)="onItemClick($event, child, menuitem, getKey(index))"
221
- [ngClass]="{ 'p-menuitem-link': true, 'p-disabled': child.disabled }"
222
- pRipple
223
- [attr.aria-haspopup]="item.items != null"
224
- [attr.aria-expanded]="isActive(getKey(index))"
225
- >
226
- <span class="p-menuitem-icon" *ngIf="child.icon" [ngClass]="child.icon" [ngStyle]="child.iconStyle"></span>
227
- <span class="p-menuitem-text" *ngIf="child.escape !== false; else htmlLabel">{{ child.label }}</span>
228
- <ng-template #htmlLabel><span class="p-menuitem-text" [innerHTML]="child.label"></span></ng-template>
229
- <span class="p-menuitem-badge" *ngIf="child.badge" [ngClass]="child.badgeStyleClass">{{ child.badge }}</span>
230
- <ng-container *ngIf="child.items">
231
- <AngleRightIcon *ngIf="!contextMenu.submenuIconTemplate" [styleClass]="'p-submenu-icon'" />
232
- <span *ngIf="contextMenu.submenuIconTemplate" class="p-submenu-icon">
233
- <ng-template *ngTemplateOutlet="contextMenu.submenuIconTemplate"></ng-template>
332
+ <div [attr.data-pc-section]="'content'" class="p-menuitem-content" (click)="onItemClick($event, processedItem)" (mouseenter)="onItemMouseEnter({$event, processedItem})">
333
+ <a
334
+ *ngIf="!getItemProp(processedItem, 'routerLink')"
335
+ [attr.href]="getItemProp(processedItem, 'url')"
336
+ [attr.aria-hidden]="true"
337
+ [attr.data-automationid]="getItemProp(processedItem, 'automationId')"
338
+ [attr.data-pc-section]="'action'"
339
+ [target]="getItemProp(processedItem, 'target')"
340
+ [ngClass]="{ 'p-menuitem-link': true, 'p-disabled': getItemProp(processedItem, 'disabled') }"
341
+ [attr.tabindex]="-1"
342
+ pRipple
343
+ >
344
+ <span
345
+ *ngIf="getItemProp(processedItem, 'icon')"
346
+ class="p-menuitem-icon"
347
+ [ngClass]="getItemProp(processedItem, 'icon')"
348
+ [ngStyle]="getItemProp(processedItem, 'iconStyle')"
349
+ [attr.data-pc-section]="'icon'"
350
+ [attr.aria-hidden]="true"
351
+ [attr.tabindex]="-1"
352
+ >
234
353
  </span>
235
- </ng-container>
236
- </a>
237
- <a
238
- *ngIf="child.routerLink"
239
- [routerLink]="child.routerLink"
240
- [queryParams]="child.queryParams"
241
- [routerLinkActive]="'p-menuitem-link-active'"
242
- role="menuitem"
243
- [routerLinkActiveOptions]="child.routerLinkActiveOptions || { exact: false }"
244
- [target]="child.target"
245
- [attr.title]="child.title"
246
- [attr.id]="child.id"
247
- [attr.tabindex]="child.disabled ? null : '0'"
248
- (click)="onItemClick($event, child, menuitem, getKey(index))"
249
- [ngClass]="{ 'p-menuitem-link': true, 'p-disabled': child.disabled }"
250
- pRipple
251
- [fragment]="child.fragment"
252
- [queryParamsHandling]="child.queryParamsHandling"
253
- [preserveFragment]="child.preserveFragment"
254
- [skipLocationChange]="child.skipLocationChange"
255
- [replaceUrl]="child.replaceUrl"
256
- [state]="child.state"
257
- >
258
- <span class="p-menuitem-icon" *ngIf="child.icon" [ngClass]="child.icon" [ngStyle]="child.iconStyle"></span>
259
- <span class="p-menuitem-text" *ngIf="child.escape !== false; else htmlRouteLabel">{{ child.label }}</span>
260
- <ng-template #htmlRouteLabel><span class="p-menuitem-text" [innerHTML]="child.label"></span></ng-template>
261
- <span class="p-menuitem-badge" *ngIf="child.badge" [ngClass]="child.badgeStyleClass">{{ child.badge }}</span>
262
- <ng-container *ngIf="child.items">
263
- <AngleRightIcon *ngIf="!contextMenu.submenuIconTemplate" [styleClass]="'p-submenu-icon'" />
264
- <span *ngIf="contextMenu.submenuIconTemplate" class="p-submenu-icon">
265
- <ng-template *ngTemplateOutlet="contextMenu.submenuIconTemplate"></ng-template>
354
+ <span *ngIf="getItemProp(processedItem, 'escape'); else htmlLabel" class="p-menuitem-text" [attr.data-pc-section]="'label'">
355
+ {{ getItemLabel(processedItem) }}
356
+ </span>
357
+ <ng-template #htmlLabel>
358
+ <span class="p-menuitem-text" [innerHTML]="getItemLabel(processedItem)" [attr.data-pc-section]="'label'"></span>
359
+ </ng-template>
360
+ <span class="p-menuitem-badge" *ngIf="getItemProp(processedItem, 'badge')" [ngClass]="getItemProp(processedItem, 'badgeStyleClass')">{{ child.badge }}</span>
361
+
362
+ <ng-container *ngIf="isItemGroup(processedItem)">
363
+ <AngleRightIcon *ngIf="!contextMenu.submenuIconTemplate" [styleClass]="'p-submenu-icon'" [attr.data-pc-section]="'submenuicon'" [attr.aria-hidden]="true" />
364
+ <ng-template *ngTemplateOutlet="contextMenu.submenuIconTemplate" [attr.data-pc-section]="'submenuicon'" [attr.aria-hidden]="true"></ng-template>
365
+ </ng-container>
366
+ </a>
367
+ <a
368
+ *ngIf="getItemProp(processedItem, 'routerLink')"
369
+ [routerLink]="getItemProp(processedItem, 'routerLink')"
370
+ [attr.data-automationid]="getItemProp(processedItem, 'automationId')"
371
+ [attr.tabindex]="-1"
372
+ [attr.aria-hidden]="true"
373
+ [attr.data-pc-section]="'action'"
374
+ [queryParams]="getItemProp(processedItem, 'queryParams')"
375
+ [routerLinkActive]="'p-menuitem-link-active'"
376
+ [routerLinkActiveOptions]="getItemProp(processedItem, 'routerLinkActiveOptions') || { exact: false }"
377
+ [target]="getItemProp(processedItem, 'target')"
378
+ [ngClass]="{ 'p-menuitem-link': true, 'p-disabled': getItemProp(processedItem, 'disabled') }"
379
+ [fragment]="getItemProp(processedItem, 'fragment')"
380
+ [queryParamsHandling]="getItemProp(processedItem, 'queryParamsHandling')"
381
+ [preserveFragment]="getItemProp(processedItem, 'preserveFragment')"
382
+ [skipLocationChange]="getItemProp(processedItem, 'skipLocationChange')"
383
+ [replaceUrl]="getItemProp(processedItem, 'replaceUrl')"
384
+ [state]="getItemProp(processedItem, 'state')"
385
+ pRipple
386
+ >
387
+ <span
388
+ *ngIf="getItemProp(processedItem, 'icon')"
389
+ class="p-menuitem-icon"
390
+ [ngClass]="getItemProp(processedItem, 'icon')"
391
+ [ngStyle]="getItemProp(processedItem, 'iconStyle')"
392
+ [attr.data-pc-section]="'icon'"
393
+ [attr.aria-hidden]="true"
394
+ [attr.tabindex]="-1"
395
+ >
266
396
  </span>
267
- </ng-container>
268
- </a>
269
- <p-contextMenuSub [parentItemKey]="getKey(index)" [item]="child" *ngIf="child.items" (leafClick)="onLeafClick()"></p-contextMenuSub>
397
+ <span *ngIf="getItemProp(processedItem, 'escape'); else htmlLabel" class="p-menuitem-text" [attr.data-pc-section]="'label'">
398
+ {{ getItemLabel(processedItem) }}
399
+ </span>
400
+ <ng-template #htmlLabel>
401
+ <span class="p-menuitem-text" [innerHTML]="getItemLabel(processedItem)" [attr.data-pc-section]="'label'"></span>
402
+ </ng-template>
403
+ <span class="p-menuitem-badge" *ngIf="getItemProp(processedItem, 'badge')" [ngClass]="getItemProp(processedItem, 'badgeStyleClass')">{{ child.badge }}</span>
404
+
405
+ <ng-container *ngIf="isItemGroup(processedItem)">
406
+ <AngleRightIcon *ngIf="!contextMenu.submenuIconTemplate" [styleClass]="'p-submenu-icon'" [attr.data-pc-section]="'submenuicon'" [attr.aria-hidden]="true" />
407
+ <ng-template *ngTemplateOutlet="contextMenu.submenuIconTemplate" [attr.data-pc-section]="'submenuicon'" [attr.aria-hidden]="true"></ng-template>
408
+ </ng-container>
409
+ </a>
410
+ </div>
411
+
412
+ <p-contextMenuSub
413
+ *ngIf="isItemVisible(processedItem) && isItemGroup(processedItem)"
414
+ [items]="processedItem.items"
415
+ [menuId]="menuId"
416
+ [visible]="isItemActive(processedItem) && isItemGroup(processedItem)"
417
+ [activeItemPath]="activeItemPath"
418
+ [focusedItemId]="focusedItemId"
419
+ [level]="level + 1"
420
+ (itemClick)="itemClick.emit($event)"
421
+ (itemMouseEnter)="onItemMouseEnter($event)"
422
+ ></p-contextMenuSub>
270
423
  </li>
271
424
  </ng-template>
272
425
  </ul>
273
426
  `,
427
+ animations: [trigger('overlayAnimation', [transition(':enter', [style({ opacity: 0 })]), transition(':leave', [style({ opacity: 0 })])])],
274
428
  encapsulation: ViewEncapsulation.None,
275
429
  host: {
276
430
  class: 'p-element'
277
431
  }
278
432
  }]
279
- }], ctorParameters: function () { return [{ type: ContextMenu, decorators: [{
433
+ }], ctorParameters: function () { return [{ type: Document, decorators: [{
280
434
  type: Inject,
281
- args: [forwardRef(() => ContextMenu)]
282
- }] }]; }, propDecorators: { item: [{
435
+ args: [DOCUMENT]
436
+ }] }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: ContextMenu }, { type: i0.ViewContainerRef }]; }, propDecorators: { visible: [{
437
+ type: Input
438
+ }], items: [{
283
439
  type: Input
284
440
  }], root: [{
285
441
  type: Input
286
- }], parentItemKey: [{
442
+ }], autoZIndex: [{
443
+ type: Input
444
+ }], baseZIndex: [{
445
+ type: Input
446
+ }], popup: [{
447
+ type: Input
448
+ }], menuId: [{
449
+ type: Input
450
+ }], ariaLabel: [{
451
+ type: Input
452
+ }], ariaLabelledBy: [{
453
+ type: Input
454
+ }], level: [{
455
+ type: Input
456
+ }], focusedItemId: [{
457
+ type: Input
458
+ }], activeItemPath: [{
459
+ type: Input
460
+ }], tabindex: [{
287
461
  type: Input
288
- }], leafClick: [{
462
+ }], itemClick: [{
463
+ type: Output
464
+ }], itemMouseEnter: [{
465
+ type: Output
466
+ }], menuFocus: [{
467
+ type: Output
468
+ }], menuBlur: [{
469
+ type: Output
470
+ }], menuKeydown: [{
289
471
  type: Output
290
472
  }], sublistViewChild: [{
291
473
  type: ViewChild,
292
474
  args: ['sublist']
293
- }], menuitemViewChild: [{
294
- type: ViewChild,
295
- args: ['menuitem']
296
475
  }] } });
297
476
  /**
298
477
  * ContextMenu displays an overlay menu on right click of its target. Note that components like Table has special integration with ContextMenu.
@@ -300,39 +479,50 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImpor
300
479
  */
301
480
  class ContextMenu {
302
481
  document;
482
+ platformId;
303
483
  el;
304
484
  renderer;
305
485
  cd;
306
- zone;
307
- contextMenuService;
308
486
  config;
487
+ overlayService;
309
488
  /**
310
489
  * An array of menuitems.
311
490
  * @group Props
312
491
  */
313
- model;
492
+ set model(value) {
493
+ this._model = value;
494
+ this._processedItems = this.createProcessedItems(this._model || []);
495
+ }
496
+ get model() {
497
+ return this._model;
498
+ }
314
499
  /**
315
- * Attaches the menu to document instead of a particular item.
500
+ * Event for which the menu must be displayed.
316
501
  * @group Props
317
502
  */
318
- global;
503
+ triggerEvent = 'contextmenu';
319
504
  /**
320
505
  * Local template variable name of the element to attach the context menu.
321
506
  * @group Props
322
507
  */
323
508
  target;
324
509
  /**
325
- * Inline style of the element.
510
+ * Attaches the menu to document instead of a particular item.
511
+ * @group Props
512
+ */
513
+ global;
514
+ /**
515
+ * Inline style of the component.
326
516
  * @group Props
327
517
  */
328
518
  style;
329
519
  /**
330
- * Class of the element.
520
+ * Style class of the component.
331
521
  * @group Props
332
522
  */
333
523
  styleClass;
334
524
  /**
335
- * Target element to attach the overlay, valid values are "body" or a local ng-template variable of another element (note: use binding with brackets for template variables, e.g. [appendTo]="mydiv" for a div element having #mydiv as variable name).
525
+ * Target element to attach the overlay, valid values are "body" or a local ng-template variable of another element.
336
526
  * @group Props
337
527
  */
338
528
  appendTo;
@@ -347,328 +537,534 @@ class ContextMenu {
347
537
  */
348
538
  baseZIndex = 0;
349
539
  /**
350
- * Event for which the menu must be displayed.
540
+ * Current id state as a string.
351
541
  * @group Props
352
542
  */
353
- triggerEvent = 'contextmenu';
543
+ id;
544
+ /**
545
+ * Defines a string value that labels an interactive element.
546
+ * @group Props
547
+ */
548
+ ariaLabel;
354
549
  /**
355
- * Displays the popup menu.
550
+ * Identifier of the underlying input element.
551
+ * @group Props
552
+ */
553
+ ariaLabelledBy;
554
+ /**
555
+ * Callback to invoke when overlay menu is shown.
356
556
  * @group Emits
357
557
  */
358
558
  onShow = new EventEmitter();
359
559
  /**
360
- * Hides the popup menu.
560
+ * Callback to invoke when overlay menu is hidden.
361
561
  * @group Emits
362
562
  */
363
563
  onHide = new EventEmitter();
564
+ templates;
565
+ rootmenu;
364
566
  containerViewChild;
567
+ submenuIconTemplate;
568
+ container;
569
+ outsideClickListener;
570
+ resizeListener;
571
+ triggerEventListener;
365
572
  documentClickListener;
366
573
  documentTriggerListener;
367
- documentKeydownListener;
368
- windowResizeListener;
369
- triggerEventListener;
370
- ngDestroy$ = new Subject();
371
- preventDocumentDefault = false;
574
+ pageX;
575
+ pageY;
576
+ visible = signal(false);
577
+ relativeAlign;
372
578
  window;
373
- templates;
374
- submenuIconTemplate;
375
- constructor(document, el, renderer, cd, zone, contextMenuService, config) {
579
+ focused = false;
580
+ activeItemPath = signal([]);
581
+ focusedItemInfo = signal({ index: -1, level: 0, parentKey: '' });
582
+ submenuVisible = signal(false);
583
+ searchValue = '';
584
+ searchTimeout;
585
+ _processedItems;
586
+ _model;
587
+ get visibleItems() {
588
+ const processedItem = this.activeItemPath().find((p) => p.key === this.focusedItemInfo().parentKey);
589
+ return processedItem ? processedItem.items : this.processedItems;
590
+ }
591
+ get processedItems() {
592
+ if (!this._processedItems || !this._processedItems.length) {
593
+ this._processedItems = this.createProcessedItems(this.model || []);
594
+ }
595
+ return this._processedItems;
596
+ }
597
+ get focusedItemId() {
598
+ const focusedItemInfo = this.focusedItemInfo();
599
+ return focusedItemInfo.index !== -1 ? `${this.id}${ObjectUtils.isNotEmpty(focusedItemInfo.parentKey) ? '_' + focusedItemInfo.parentKey : ''}_${focusedItemInfo.index}` : null;
600
+ }
601
+ constructor(document, platformId, el, renderer, cd, config, overlayService) {
376
602
  this.document = document;
603
+ this.platformId = platformId;
377
604
  this.el = el;
378
605
  this.renderer = renderer;
379
606
  this.cd = cd;
380
- this.zone = zone;
381
- this.contextMenuService = contextMenuService;
382
607
  this.config = config;
608
+ this.overlayService = overlayService;
383
609
  this.window = this.document.defaultView;
610
+ effect(() => {
611
+ const path = this.activeItemPath();
612
+ if (ObjectUtils.isNotEmpty(path)) {
613
+ this.bindGlobalListeners();
614
+ }
615
+ else if (!this.visible()) {
616
+ this.unbindGlobalListeners();
617
+ }
618
+ });
384
619
  }
385
- ngAfterViewInit() {
386
- if (this.global) {
387
- const documentTarget = this.el ? this.el.nativeElement.ownerDocument : 'document';
388
- this.triggerEventListener = this.renderer.listen(documentTarget, this.triggerEvent, (event) => {
389
- if (this.containerViewChild && this.containerViewChild.nativeElement.style.display !== 'none') {
390
- this.hide();
620
+ ngOnInit() {
621
+ this.id = this.id || UniqueComponentId();
622
+ this.bindTriggerEventListener();
623
+ }
624
+ bindTriggerEventListener() {
625
+ if (isPlatformBrowser(this.platformId)) {
626
+ if (!this.triggerEventListener) {
627
+ if (this.global) {
628
+ this.triggerEventListener = this.renderer.listen(this.document, this.triggerEvent, (event) => {
629
+ this.show(event);
630
+ });
391
631
  }
392
- this.show(event);
393
- event.preventDefault();
394
- });
632
+ else if (this.target) {
633
+ this.triggerEventListener = this.renderer.listen(this.target, this.triggerEvent, (event) => {
634
+ this.show(event);
635
+ });
636
+ }
637
+ }
395
638
  }
396
- else if (this.target) {
397
- this.triggerEventListener = this.renderer.listen(this.target, this.triggerEvent, (event) => {
398
- if (this.containerViewChild && this.containerViewChild.nativeElement.style.display !== 'none') {
639
+ }
640
+ bindGlobalListeners() {
641
+ if (isPlatformBrowser(this.platformId)) {
642
+ if (!this.documentClickListener) {
643
+ const documentTarget = this.el ? this.el.nativeElement.ownerDocument : 'document';
644
+ this.documentClickListener = this.renderer.listen(documentTarget, 'click', (event) => {
645
+ if (this.containerViewChild.nativeElement.offsetParent && this.isOutsideClicked(event) && !event.ctrlKey && event.button !== 2 && this.triggerEvent !== 'click') {
646
+ this.hide();
647
+ }
648
+ });
649
+ this.documentTriggerListener = this.renderer.listen(documentTarget, this.triggerEvent, (event) => {
650
+ if (this.containerViewChild.nativeElement.offsetParent && this.isOutsideClicked(event)) {
651
+ this.hide();
652
+ }
653
+ });
654
+ }
655
+ if (!this.resizeListener) {
656
+ this.resizeListener = this.renderer.listen(this.document.defaultView, 'resize', (event) => {
399
657
  this.hide();
400
- }
401
- this.show(event);
402
- event.preventDefault();
658
+ });
659
+ }
660
+ }
661
+ }
662
+ ngAfterContentInit() {
663
+ this.templates?.forEach((item) => {
664
+ switch (item.getType()) {
665
+ case 'submenuicon':
666
+ this.submenuIconTemplate = item.template;
667
+ break;
668
+ }
669
+ });
670
+ }
671
+ createProcessedItems(items, level = 0, parent = {}, parentKey = '') {
672
+ const processedItems = [];
673
+ items &&
674
+ items.forEach((item, index) => {
675
+ const key = (parentKey !== '' ? parentKey + '_' : '') + index;
676
+ const newItem = {
677
+ item,
678
+ index,
679
+ level,
680
+ key,
681
+ parent,
682
+ parentKey
683
+ };
684
+ newItem['items'] = this.createProcessedItems(item.items, level + 1, newItem, key);
685
+ processedItems.push(newItem);
403
686
  });
687
+ return processedItems;
688
+ }
689
+ getItemProp(item, name) {
690
+ return item ? ObjectUtils.getItemValue(item[name]) : undefined;
691
+ }
692
+ getProccessedItemLabel(processedItem) {
693
+ return processedItem ? this.getItemLabel(processedItem.item) : undefined;
694
+ }
695
+ getItemLabel(item) {
696
+ return this.getItemProp(item, 'label');
697
+ }
698
+ isProcessedItemGroup(processedItem) {
699
+ return processedItem && ObjectUtils.isNotEmpty(processedItem.items);
700
+ }
701
+ isSelected(processedItem) {
702
+ return this.activeItemPath().some((p) => p.key === processedItem.key);
703
+ }
704
+ isValidSelectedItem(processedItem) {
705
+ return this.isValidItem(processedItem) && this.isSelected(processedItem);
706
+ }
707
+ isValidItem(processedItem) {
708
+ return !!processedItem && !this.isItemDisabled(processedItem.item) && !this.isItemSeparator(processedItem.item);
709
+ }
710
+ isItemDisabled(item) {
711
+ return this.getItemProp(item, 'disabled');
712
+ }
713
+ isItemSeparator(item) {
714
+ return this.getItemProp(item, 'separator');
715
+ }
716
+ isItemMatched(processedItem) {
717
+ return this.isValidItem(processedItem) && this.getProccessedItemLabel(processedItem).toLocaleLowerCase().startsWith(this.searchValue.toLocaleLowerCase());
718
+ }
719
+ isProccessedItemGroup(processedItem) {
720
+ return processedItem && ObjectUtils.isNotEmpty(processedItem.items);
721
+ }
722
+ onItemClick(event) {
723
+ const { processedItem } = event;
724
+ const grouped = this.isProcessedItemGroup(processedItem);
725
+ const selected = this.isSelected(processedItem);
726
+ if (selected) {
727
+ const { index, key, level, parentKey } = processedItem;
728
+ this.activeItemPath.set(this.activeItemPath().filter((p) => key !== p.key && key.startsWith(p.key)));
729
+ this.focusedItemInfo.set({ index, level, parentKey });
730
+ DomHandler.focus(this.rootmenu.sublistViewChild.nativeElement);
404
731
  }
405
- if (this.appendTo) {
406
- if (this.appendTo === 'body')
407
- this.renderer.appendChild(this.document.body, this.containerViewChild?.nativeElement);
408
- else
409
- DomHandler.appendChild(this.containerViewChild?.nativeElement, this.appendTo);
732
+ else {
733
+ grouped ? this.onItemChange(event) : this.hide();
410
734
  }
411
735
  }
412
- show(event) {
413
- this.clearActiveItem();
414
- this.position(event);
415
- this.moveOnTop();
416
- this.containerViewChild.nativeElement.style.display = 'block';
417
- this.preventDocumentDefault = true;
418
- DomHandler.fadeIn(this.containerViewChild?.nativeElement, 250);
419
- this.bindGlobalListeners();
420
- if (event) {
421
- event.preventDefault();
422
- }
423
- this.onShow.emit();
736
+ onItemMouseEnter(event) {
737
+ this.onItemChange(event);
424
738
  }
425
- hide() {
426
- this.containerViewChild.nativeElement.style.display = 'none';
427
- if (this.autoZIndex) {
428
- ZIndexUtils.clear(this.containerViewChild?.nativeElement);
739
+ onKeyDown(event) {
740
+ const metaKey = event.metaKey || event.ctrlKey;
741
+ switch (event.code) {
742
+ case 'ArrowDown':
743
+ this.onArrowDownKey(event);
744
+ break;
745
+ case 'ArrowUp':
746
+ this.onArrowUpKey(event);
747
+ break;
748
+ case 'ArrowLeft':
749
+ this.onArrowLeftKey(event);
750
+ break;
751
+ case 'ArrowRight':
752
+ this.onArrowRightKey(event);
753
+ break;
754
+ case 'Home':
755
+ this.onHomeKey(event);
756
+ break;
757
+ case 'End':
758
+ this.onEndKey(event);
759
+ break;
760
+ case 'Space':
761
+ this.onSpaceKey(event);
762
+ break;
763
+ case 'Enter':
764
+ this.onEnterKey(event);
765
+ break;
766
+ case 'Escape':
767
+ this.onEscapeKey(event);
768
+ break;
769
+ case 'Tab':
770
+ this.onTabKey(event);
771
+ break;
772
+ case 'PageDown':
773
+ case 'PageUp':
774
+ case 'Backspace':
775
+ case 'ShiftLeft':
776
+ case 'ShiftRight':
777
+ //NOOP
778
+ break;
779
+ default:
780
+ if (!metaKey && ObjectUtils.isPrintableCharacter(event.key)) {
781
+ this.searchItems(event, event.key);
782
+ }
783
+ break;
429
784
  }
430
- this.clearActiveItem();
431
- this.unbindGlobalListeners();
432
- this.onHide.emit();
433
785
  }
434
- moveOnTop() {
435
- if (this.autoZIndex && this.containerViewChild && this.containerViewChild.nativeElement.style.display !== 'block') {
436
- ZIndexUtils.set('menu', this.containerViewChild.nativeElement, this.baseZIndex + this.config.zIndex.menu);
437
- }
786
+ onArrowDownKey(event) {
787
+ const itemIndex = this.focusedItemInfo().index !== -1 ? this.findNextItemIndex(this.focusedItemInfo().index) : this.findFirstFocusedItemIndex();
788
+ this.changeFocusedItemIndex(event, itemIndex);
789
+ event.preventDefault();
438
790
  }
439
- toggle(event) {
440
- if (this.containerViewChild.nativeElement.offsetParent)
441
- this.hide();
442
- else
443
- this.show(event);
444
- }
445
- position(event) {
446
- if (event) {
447
- let left = event.pageX + 1;
448
- let top = event.pageY + 1;
449
- let width = this.containerViewChild?.nativeElement.offsetParent ? this.containerViewChild.nativeElement.offsetWidth : DomHandler.getHiddenElementOuterWidth(this.containerViewChild?.nativeElement);
450
- let height = this.containerViewChild?.nativeElement.offsetParent ? this.containerViewChild.nativeElement.offsetHeight : DomHandler.getHiddenElementOuterHeight(this.containerViewChild?.nativeElement);
451
- let viewport = DomHandler.getViewport();
452
- //flip
453
- if (left + width - this.document.scrollingElement.scrollLeft > viewport.width) {
454
- left -= width;
455
- }
456
- //flip
457
- if (top + height - this.document.scrollingElement.scrollTop > viewport.height) {
458
- top -= height;
459
- }
460
- //fit
461
- if (left < this.document.scrollingElement.scrollLeft) {
462
- left = this.document.scrollingElement.scrollLeft;
463
- }
464
- //fit
465
- if (top < this.document.scrollingElement.scrollTop) {
466
- top = this.document.scrollingElement.scrollTop;
467
- }
468
- this.containerViewChild.nativeElement.style.left = left + 'px';
469
- this.containerViewChild.nativeElement.style.top = top + 'px';
791
+ onArrowRightKey(event) {
792
+ const processedItem = this.visibleItems[this.focusedItemInfo().index];
793
+ const grouped = this.isProccessedItemGroup(processedItem);
794
+ if (grouped) {
795
+ this.onItemChange({ originalEvent: event, processedItem });
796
+ this.focusedItemInfo.set({ index: -1, parentKey: processedItem.key });
797
+ this.searchValue = '';
798
+ this.onArrowDownKey(event);
470
799
  }
800
+ event.preventDefault();
471
801
  }
472
- positionSubmenu(sublist) {
473
- let parentMenuItem = sublist.parentElement?.parentElement;
474
- let viewport = DomHandler.getViewport();
475
- let sublistWidth = sublist.offsetParent ? sublist.offsetWidth : DomHandler.getHiddenElementOuterWidth(sublist);
476
- let sublistHeight = sublist.offsetHeight ? sublist.offsetHeight : DomHandler.getHiddenElementOuterHeight(sublist);
477
- let itemOuterWidth = DomHandler.getOuterWidth(parentMenuItem?.children[0]);
478
- let itemOuterHeight = DomHandler.getOuterHeight(parentMenuItem?.children[0]);
479
- let containerOffset = DomHandler.getOffset(parentMenuItem?.parentElement);
480
- sublist.style.zIndex = (++DomHandler.zindex).toString();
481
- if (parseInt(containerOffset.top) + itemOuterHeight + sublistHeight > viewport.height - DomHandler.calculateScrollbarHeight()) {
482
- sublist.style.removeProperty('top');
483
- sublist.style.bottom = '0px';
802
+ onArrowUpKey(event) {
803
+ if (event.altKey) {
804
+ if (this.focusedItemInfo().index !== -1) {
805
+ const processedItem = this.visibleItems[this.focusedItemInfo().index];
806
+ const grouped = this.isProccessedItemGroup(processedItem);
807
+ !grouped && this.onItemChange({ originalEvent: event, processedItem });
808
+ }
809
+ this.hide();
810
+ event.preventDefault();
484
811
  }
485
812
  else {
486
- sublist.style.removeProperty('bottom');
487
- sublist.style.top = '0px';
488
- }
489
- if (parseInt(containerOffset.left) + itemOuterWidth + sublistWidth > viewport.width - DomHandler.calculateScrollbarWidth()) {
490
- sublist.style.left = -sublistWidth + 'px';
813
+ const itemIndex = this.focusedItemInfo().index !== -1 ? this.findPrevItemIndex(this.focusedItemInfo().index) : this.findLastFocusedItemIndex();
814
+ this.changeFocusedItemIndex(event, itemIndex);
815
+ event.preventDefault();
491
816
  }
492
- else {
493
- sublist.style.left = itemOuterWidth + 'px';
817
+ }
818
+ onArrowLeftKey(event) {
819
+ const processedItem = this.visibleItems[this.focusedItemInfo().index];
820
+ const parentItem = this.activeItemPath().find((p) => p.key === processedItem.parentKey);
821
+ const root = ObjectUtils.isEmpty(processedItem.parent);
822
+ if (!root) {
823
+ this.focusedItemInfo.set({ index: -1, parentKey: parentItem ? parentItem.parentKey : '' });
824
+ this.searchValue = '';
825
+ this.onArrowDownKey(event);
494
826
  }
827
+ const activeItemPath = this.activeItemPath().filter((p) => p.parentKey !== this.focusedItemInfo().parentKey);
828
+ this.activeItemPath.set(activeItemPath);
829
+ event.preventDefault();
495
830
  }
496
- isItemMatched(menuitem) {
497
- return DomHandler.hasClass(menuitem, 'p-menuitem') && !DomHandler.hasClass(menuitem.children[0], 'p-disabled');
831
+ onHomeKey(event) {
832
+ this.changeFocusedItemIndex(event, this.findFirstItemIndex());
833
+ event.preventDefault();
498
834
  }
499
- findNextItem(menuitem, isRepeated) {
500
- let nextMenuitem = menuitem.nextElementSibling;
501
- if (nextMenuitem) {
502
- return this.isItemMatched(nextMenuitem) ? nextMenuitem : this.findNextItem(nextMenuitem, isRepeated);
503
- }
504
- else {
505
- let firstItem = menuitem.parentElement?.children[0];
506
- return this.isItemMatched(firstItem) ? firstItem : !isRepeated ? this.findNextItem(firstItem, true) : null;
835
+ onEndKey(event) {
836
+ this.changeFocusedItemIndex(event, this.findLastItemIndex());
837
+ event.preventDefault();
838
+ }
839
+ onSpaceKey(event) {
840
+ this.onEnterKey(event);
841
+ }
842
+ onEscapeKey(event) {
843
+ this.hide();
844
+ this.focusedItemInfo.mutate((value) => {
845
+ value.index = this.findFirstFocusedItemIndex();
846
+ });
847
+ event.preventDefault();
848
+ }
849
+ onTabKey(event) {
850
+ if (this.focusedItemInfo().index !== -1) {
851
+ const processedItem = this.visibleItems[this.focusedItemInfo().index];
852
+ const grouped = this.isProccessedItemGroup(processedItem);
853
+ !grouped && this.onItemChange({ originalEvent: event, processedItem });
507
854
  }
855
+ this.hide();
508
856
  }
509
- findPrevItem(menuitem, isRepeated) {
510
- let prevMenuitem = menuitem.previousElementSibling;
511
- if (prevMenuitem) {
512
- return this.isItemMatched(prevMenuitem) ? prevMenuitem : this.findPrevItem(prevMenuitem, isRepeated);
857
+ onEnterKey(event) {
858
+ if (this.focusedItemInfo().index !== -1) {
859
+ const element = DomHandler.findSingle(this.rootmenu.el.nativeElement, `li[id="${`${this.focusedItemId}`}"]`);
860
+ const anchorElement = element && DomHandler.findSingle(element, 'a[data-pc-section="action"]');
861
+ anchorElement ? anchorElement.click() : element && element.click();
862
+ const processedItem = this.visibleItems[this.focusedItemInfo().index];
863
+ const grouped = this.isProccessedItemGroup(processedItem);
864
+ if (!grouped) {
865
+ this.focusedItemInfo.mutate((value) => {
866
+ value.index = this.findFirstFocusedItemIndex();
867
+ });
868
+ }
513
869
  }
514
- else {
515
- let lastItem = menuitem.parentElement?.children[menuitem.parentElement.children.length - 1];
516
- return this.isItemMatched(lastItem) ? lastItem : !isRepeated ? this.findPrevItem(lastItem, true) : null;
870
+ event.preventDefault();
871
+ }
872
+ onItemChange(event) {
873
+ const { processedItem, isFocus } = event;
874
+ if (ObjectUtils.isEmpty(processedItem))
875
+ return;
876
+ const { index, key, level, parentKey, items } = processedItem;
877
+ const grouped = ObjectUtils.isNotEmpty(items);
878
+ const activeItemPath = this.activeItemPath().filter((p) => p.parentKey !== parentKey && p.parentKey !== key);
879
+ if (grouped) {
880
+ activeItemPath.push(processedItem);
881
+ this.submenuVisible.set(true);
517
882
  }
883
+ this.focusedItemInfo.set({ index, level, parentKey });
884
+ this.activeItemPath.set(activeItemPath);
885
+ isFocus && DomHandler.focus(this.rootmenu.sublistViewChild.nativeElement);
518
886
  }
519
- getActiveItem() {
520
- let activeItemKey = this.contextMenuService.activeItemKey;
521
- return activeItemKey == null ? null : DomHandler.findSingle(this.containerViewChild?.nativeElement, '.p-menuitem[data-ik="' + activeItemKey + '"]');
887
+ onMenuFocus(event) {
888
+ this.focused = true;
889
+ const focusedItemInfo = this.focusedItemInfo().index !== -1 ? this.focusedItemInfo() : { index: -1, level: 0, parentKey: '' };
890
+ this.focusedItemInfo.set(focusedItemInfo);
522
891
  }
523
- clearActiveItem() {
524
- if (this.contextMenuService.activeItemKey) {
525
- this.removeActiveFromSubLists(this.containerViewChild?.nativeElement);
526
- this.contextMenuService.reset();
892
+ onMenuBlur(event) {
893
+ this.focused = false;
894
+ this.focusedItemInfo.set({ index: -1, level: 0, parentKey: '' });
895
+ this.searchValue = '';
896
+ }
897
+ onOverlayAnimationStart(event) {
898
+ switch (event.toState) {
899
+ case 'visible':
900
+ this.container = event.element;
901
+ this.position();
902
+ this.moveOnTop();
903
+ this.appendOverlay();
904
+ this.bindGlobalListeners();
905
+ this.onShow.emit();
906
+ DomHandler.focus(this.rootmenu.sublistViewChild.nativeElement);
907
+ break;
527
908
  }
528
909
  }
529
- removeActiveFromSubLists(el) {
530
- let sublists = DomHandler.find(el, '.p-submenu-list-active');
531
- for (let sublist of sublists) {
532
- DomHandler.removeClass(sublist, 'p-submenu-list-active');
910
+ onOverlayAnimationEnd(event) {
911
+ switch (event.toState) {
912
+ case 'void':
913
+ this.onOverlayHide();
914
+ break;
533
915
  }
534
916
  }
535
- removeActiveFromSublist(menuitem) {
536
- if (menuitem) {
537
- let sublist = DomHandler.findSingle(menuitem, '.p-submenu-list');
538
- if (sublist && DomHandler.hasClass(menuitem, 'p-submenu-list-active')) {
539
- DomHandler.removeClass(menuitem, 'p-submenu-list-active');
540
- }
917
+ appendOverlay() {
918
+ if (this.appendTo) {
919
+ if (this.appendTo === 'body')
920
+ this.renderer.appendChild(this.document.body, this.containerViewChild.nativeElement);
921
+ else
922
+ DomHandler.appendChild(this.containerViewChild.nativeElement, this.appendTo);
541
923
  }
542
924
  }
543
- bindGlobalListeners() {
544
- if (!this.documentClickListener) {
545
- const documentTarget = this.el ? this.el.nativeElement.ownerDocument : 'document';
546
- this.documentClickListener = this.renderer.listen(documentTarget, 'click', (event) => {
547
- if (this.containerViewChild?.nativeElement.offsetParent && this.isOutsideClicked(event) && !event.ctrlKey && event.button !== 2 && this.triggerEvent !== 'click') {
548
- this.hide();
549
- }
550
- });
551
- this.documentTriggerListener = this.renderer.listen(documentTarget, this.triggerEvent, (event) => {
552
- if (this.containerViewChild?.nativeElement.offsetParent && this.isOutsideClicked(event) && !this.preventDocumentDefault) {
553
- this.hide();
554
- }
555
- this.preventDocumentDefault = false;
556
- });
925
+ moveOnTop() {
926
+ if (this.autoZIndex && this.containerViewChild) {
927
+ ZIndexUtils.set('menu', this.containerViewChild.nativeElement, this.baseZIndex + this.config.zIndex.menu);
557
928
  }
558
- this.zone.runOutsideAngular(() => {
559
- if (!this.windowResizeListener) {
560
- this.renderer.listen(this.window, 'resize', this.onWindowResize.bind(this));
561
- }
562
- });
563
- if (!this.documentKeydownListener) {
564
- const documentTarget = this.el ? this.el.nativeElement.ownerDocument : 'document';
565
- this.documentKeydownListener = this.renderer.listen(documentTarget, 'keydown', (event) => {
566
- let activeItem = this.getActiveItem();
567
- switch (event.key) {
568
- case 'ArrowDown':
569
- if (activeItem) {
570
- this.removeActiveFromSublist(activeItem);
571
- activeItem = this.findNextItem(activeItem);
572
- }
573
- else {
574
- let firstItem = DomHandler.findSingle(this.containerViewChild?.nativeElement, '.p-menuitem-link').parentElement;
575
- activeItem = this.isItemMatched(firstItem) ? firstItem : this.findNextItem(firstItem);
576
- }
577
- if (activeItem) {
578
- this.contextMenuService.changeKey(activeItem.getAttribute('data-ik'));
579
- }
580
- event.preventDefault();
581
- break;
582
- case 'ArrowUp':
583
- if (activeItem) {
584
- this.removeActiveFromSublist(activeItem);
585
- activeItem = this.findPrevItem(activeItem);
586
- }
587
- else {
588
- let sublist = DomHandler.findSingle(this.containerViewChild?.nativeElement, 'ul');
589
- let lastItem = sublist.children[sublist.children.length - 1];
590
- activeItem = this.isItemMatched(lastItem) ? lastItem : this.findPrevItem(lastItem);
591
- }
592
- if (activeItem) {
593
- this.contextMenuService.changeKey(activeItem.getAttribute('data-ik'));
594
- }
595
- event.preventDefault();
596
- break;
597
- case 'ArrowRight':
598
- if (activeItem) {
599
- let sublist = DomHandler.findSingle(activeItem, '.p-submenu-list');
600
- if (sublist) {
601
- DomHandler.addClass(sublist, 'p-submenu-list-active');
602
- activeItem = DomHandler.findSingle(sublist, '.p-menuitem-link:not(.p-disabled)').parentElement;
603
- if (activeItem) {
604
- this.contextMenuService.changeKey(activeItem.getAttribute('data-ik'));
605
- }
606
- }
607
- }
608
- event.preventDefault();
609
- break;
610
- case 'ArrowLeft':
611
- if (activeItem) {
612
- let sublist = activeItem.parentElement;
613
- if (sublist && DomHandler.hasClass(sublist, 'p-submenu-list-active')) {
614
- DomHandler.removeClass(sublist, 'p-submenu-list-active');
615
- activeItem = sublist.parentElement.parentElement;
616
- if (activeItem) {
617
- this.contextMenuService.changeKey(activeItem.getAttribute('data-ik'));
618
- }
619
- }
620
- }
621
- event.preventDefault();
622
- break;
623
- case 'Escape':
624
- this.hide();
625
- event.preventDefault();
626
- break;
627
- case 'Enter':
628
- if (activeItem) {
629
- this.handleItemClick(event, this.findModelItemFromKey(this.contextMenuService.activeItemKey), activeItem);
630
- }
631
- event.preventDefault();
632
- break;
633
- default:
634
- break;
635
- }
636
- });
929
+ }
930
+ onOverlayHide() {
931
+ this.unbindGlobalListeners();
932
+ if (!this.cd.destroyed) {
933
+ this.target = null;
934
+ }
935
+ if (this.container && this.autoZIndex) {
936
+ ZIndexUtils.clear(this.container);
637
937
  }
938
+ this.container = null;
939
+ this.onHide.emit();
638
940
  }
639
- findModelItemFromKey(key) {
640
- if (key == null || !this.model) {
641
- return null;
941
+ hide() {
942
+ this.visible.set(false);
943
+ this.activeItemPath.set([]);
944
+ this.focusedItemInfo.set({ index: -1, level: 0, parentKey: '' });
945
+ }
946
+ toggle(event) {
947
+ this.visible() ? this.hide() : this.show(event);
948
+ }
949
+ show(event) {
950
+ this.activeItemPath.set([]);
951
+ this.focusedItemInfo.set({ index: -1, level: 0, parentKey: '' });
952
+ this.pageX = event.pageX;
953
+ this.pageY = event.pageY;
954
+ this.visible() ? this.position() : this.visible.set(true);
955
+ event.stopPropagation();
956
+ event.preventDefault();
957
+ }
958
+ position() {
959
+ let left = this.pageX + 1;
960
+ let top = this.pageY + 1;
961
+ let width = this.containerViewChild.nativeElement.offsetParent ? this.containerViewChild.nativeElement.offsetWidth : DomHandler.getHiddenElementOuterWidth(this.containerViewChild.nativeElement);
962
+ let height = this.containerViewChild.nativeElement.offsetParent ? this.containerViewChild.nativeElement.offsetHeight : DomHandler.getHiddenElementOuterHeight(this.containerViewChild.nativeElement);
963
+ let viewport = DomHandler.getViewport();
964
+ //flip
965
+ if (left + width - this.document.scrollingElement.scrollLeft > viewport.width) {
966
+ left -= width;
967
+ }
968
+ //flip
969
+ if (top + height - this.document.scrollingElement.scrollTop > viewport.height) {
970
+ top -= height;
971
+ }
972
+ //fit
973
+ if (left < this.document.scrollingElement.scrollLeft) {
974
+ left = this.document.scrollingElement.scrollLeft;
642
975
  }
643
- let indexes = key.split('_');
644
- return indexes.reduce((item, currentIndex) => {
645
- return item ? item.items[currentIndex] : this.model[currentIndex];
646
- }, null);
976
+ //fit
977
+ if (top < this.document.scrollingElement.scrollTop) {
978
+ top = this.document.scrollingElement.scrollTop;
979
+ }
980
+ this.containerViewChild.nativeElement.style.left = left + 'px';
981
+ this.containerViewChild.nativeElement.style.top = top + 'px';
647
982
  }
648
- handleItemClick(event, item, menuitem) {
649
- if (!item || item.disabled) {
650
- return;
983
+ searchItems(event, char) {
984
+ this.searchValue = (this.searchValue || '') + char;
985
+ let itemIndex = -1;
986
+ let matched = false;
987
+ if (this.focusedItemInfo().index !== -1) {
988
+ itemIndex = this.visibleItems.slice(this.focusedItemInfo().index).findIndex((processedItem) => this.isItemMatched(processedItem));
989
+ itemIndex = itemIndex === -1 ? this.visibleItems.slice(0, this.focusedItemInfo().index).findIndex((processedItem) => this.isItemMatched(processedItem)) : itemIndex + this.focusedItemInfo().index;
990
+ }
991
+ else {
992
+ itemIndex = this.visibleItems.findIndex((processedItem) => this.isItemMatched(processedItem));
651
993
  }
652
- if (item.command) {
653
- item.command({
654
- originalEvent: event,
655
- item: item
994
+ if (itemIndex !== -1) {
995
+ matched = true;
996
+ }
997
+ if (itemIndex === -1 && this.focusedItemInfo().index === -1) {
998
+ itemIndex = this.findFirstFocusedItemIndex();
999
+ }
1000
+ if (itemIndex !== -1) {
1001
+ this.changeFocusedItemIndex(event, itemIndex);
1002
+ }
1003
+ if (this.searchTimeout) {
1004
+ clearTimeout(this.searchTimeout);
1005
+ }
1006
+ this.searchTimeout = setTimeout(() => {
1007
+ this.searchValue = '';
1008
+ this.searchTimeout = null;
1009
+ }, 500);
1010
+ return matched;
1011
+ }
1012
+ findLastFocusedItemIndex() {
1013
+ const selectedIndex = this.findSelectedItemIndex();
1014
+ return selectedIndex < 0 ? this.findLastItemIndex() : selectedIndex;
1015
+ }
1016
+ findLastItemIndex() {
1017
+ return ObjectUtils.findLastIndex(this.visibleItems, (processedItem) => this.isValidItem(processedItem));
1018
+ }
1019
+ findPrevItemIndex(index) {
1020
+ const matchedItemIndex = index > 0 ? ObjectUtils.findLastIndex(this.visibleItems.slice(0, index), (processedItem) => this.isValidItem(processedItem)) : -1;
1021
+ return matchedItemIndex > -1 ? matchedItemIndex : index;
1022
+ }
1023
+ findNextItemIndex(index) {
1024
+ const matchedItemIndex = index < this.visibleItems.length - 1 ? this.visibleItems.slice(index + 1).findIndex((processedItem) => this.isValidItem(processedItem)) : -1;
1025
+ return matchedItemIndex > -1 ? matchedItemIndex + index + 1 : index;
1026
+ }
1027
+ findFirstFocusedItemIndex() {
1028
+ const selectedIndex = this.findSelectedItemIndex();
1029
+ return selectedIndex < 0 ? this.findFirstItemIndex() : selectedIndex;
1030
+ }
1031
+ findFirstItemIndex() {
1032
+ return this.visibleItems.findIndex((processedItem) => this.isValidItem(processedItem));
1033
+ }
1034
+ findSelectedItemIndex() {
1035
+ return this.visibleItems.findIndex((processedItem) => this.isValidSelectedItem(processedItem));
1036
+ }
1037
+ changeFocusedItemIndex(event, index) {
1038
+ if (this.focusedItemInfo().index !== index) {
1039
+ this.focusedItemInfo.mutate((value) => {
1040
+ value.index = index;
656
1041
  });
1042
+ this.scrollInView();
657
1043
  }
658
- if (item.items) {
659
- let childSublist = DomHandler.findSingle(menuitem, '.p-submenu-list');
660
- if (childSublist) {
661
- if (DomHandler.hasClass(childSublist, 'p-submenu-list-active')) {
662
- this.removeActiveFromSubLists(menuitem);
663
- }
664
- else {
665
- DomHandler.addClass(childSublist, 'p-submenu-list-active');
666
- this.positionSubmenu(childSublist);
667
- }
1044
+ }
1045
+ scrollInView(index = -1) {
1046
+ const id = index !== -1 ? `${this.id}_${index}` : this.focusedItemId;
1047
+ const element = DomHandler.findSingle(this.rootmenu.el.nativeElement, `li[id="${id}"]`);
1048
+ if (element) {
1049
+ element.scrollIntoView && element.scrollIntoView({ block: 'nearest', inline: 'start' });
1050
+ }
1051
+ }
1052
+ bindResizeListener() {
1053
+ if (isPlatformBrowser(this.platformId)) {
1054
+ if (!this.resizeListener) {
1055
+ this.resizeListener = this.renderer.listen(this.document.defaultView, 'resize', (event) => {
1056
+ this.hide();
1057
+ });
668
1058
  }
669
1059
  }
670
- if (!item.items) {
671
- this.hide();
1060
+ }
1061
+ isOutsideClicked(event) {
1062
+ return !(this.containerViewChild.nativeElement.isSameNode(event.target) || this.containerViewChild.nativeElement.contains(event.target));
1063
+ }
1064
+ unbindResizeListener() {
1065
+ if (this.resizeListener) {
1066
+ this.resizeListener();
1067
+ this.resizeListener = null;
672
1068
  }
673
1069
  }
674
1070
  unbindGlobalListeners() {
@@ -680,63 +1076,111 @@ class ContextMenu {
680
1076
  this.documentTriggerListener();
681
1077
  this.documentTriggerListener = null;
682
1078
  }
683
- if (this.windowResizeListener) {
684
- this.windowResizeListener();
685
- this.windowResizeListener = null;
686
- }
687
- if (this.documentKeydownListener) {
688
- this.documentKeydownListener();
689
- this.documentKeydownListener = null;
690
- }
691
- }
692
- onWindowResize() {
693
- if (this.containerViewChild?.nativeElement.offsetParent) {
694
- this.hide();
1079
+ if (this.resizeListener) {
1080
+ this.resizeListener();
1081
+ this.resizeListener = null;
695
1082
  }
696
1083
  }
697
- isOutsideClicked(event) {
698
- return !(this.containerViewChild?.nativeElement.isSameNode(event.target) || this.containerViewChild?.nativeElement.contains(event.target));
699
- }
700
- ngOnDestroy() {
701
- this.unbindGlobalListeners();
1084
+ unbindTriggerEventListener() {
702
1085
  if (this.triggerEventListener) {
703
1086
  this.triggerEventListener();
704
1087
  this.triggerEventListener = null;
705
1088
  }
706
- if (this.containerViewChild && this.autoZIndex) {
707
- ZIndexUtils.clear(this.containerViewChild.nativeElement);
708
- }
709
- if (this.appendTo) {
710
- this.renderer.appendChild(this.el.nativeElement, this.containerViewChild?.nativeElement);
711
- }
712
- this.ngDestroy$.next(true);
713
- this.ngDestroy$.complete();
714
1089
  }
715
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: ContextMenu, deps: [{ token: DOCUMENT }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i5.ContextMenuService }, { token: i5.PrimeNGConfig }], target: i0.ɵɵFactoryTarget.Component });
716
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.2", type: ContextMenu, selector: "p-contextMenu", inputs: { model: "model", global: "global", target: "target", style: "style", styleClass: "styleClass", appendTo: "appendTo", autoZIndex: "autoZIndex", baseZIndex: "baseZIndex", triggerEvent: "triggerEvent" }, outputs: { onShow: "onShow", onHide: "onHide" }, host: { classAttribute: "p-element" }, queries: [{ propertyName: "templates", predicate: PrimeTemplate }], viewQueries: [{ propertyName: "containerViewChild", first: true, predicate: ["container"], descendants: true }], ngImport: i0, template: `
717
- <div #container [ngClass]="'p-contextmenu p-component'" [class]="styleClass" [ngStyle]="style">
718
- <p-contextMenuSub [item]="model" [root]="true"></p-contextMenuSub>
1090
+ ngOnDestroy() {
1091
+ this.unbindGlobalListeners();
1092
+ this.unbindTriggerEventListener();
1093
+ }
1094
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.0", ngImport: i0, type: ContextMenu, deps: [{ token: DOCUMENT }, { token: PLATFORM_ID }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: i5.PrimeNGConfig }, { token: i5.OverlayService }], target: i0.ɵɵFactoryTarget.Component });
1095
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.0", type: ContextMenu, selector: "p-contextMenu", inputs: { model: "model", triggerEvent: "triggerEvent", target: "target", global: "global", style: "style", styleClass: "styleClass", appendTo: "appendTo", autoZIndex: "autoZIndex", baseZIndex: "baseZIndex", id: "id", ariaLabel: "ariaLabel", ariaLabelledBy: "ariaLabelledBy" }, outputs: { onShow: "onShow", onHide: "onHide" }, host: { classAttribute: "p-element" }, queries: [{ propertyName: "templates", predicate: PrimeTemplate }], viewQueries: [{ propertyName: "rootmenu", first: true, predicate: ["rootmenu"], descendants: true }, { propertyName: "containerViewChild", first: true, predicate: ["container"], descendants: true }], ngImport: i0, template: `
1096
+ <div
1097
+ #container
1098
+ [attr.data-pc-section]="'root'"
1099
+ [attr.data-pc-name]="'contextmenu'"
1100
+ [id]="id"
1101
+ [ngClass]="{ 'p-contextmenu p-component': true, 'p-contextmenu-overlay': true }"
1102
+ [class]="styleClass"
1103
+ [ngStyle]="style"
1104
+ [@overlayAnimation]="{ value: 'visible' }"
1105
+ (@overlayAnimation.start)="onOverlayAnimationStart($event)"
1106
+ (@overlayAnimation.done)="onOverlayAnimationEnd($event)"
1107
+ *ngIf="visible()"
1108
+ >
1109
+ <p-contextMenuSub
1110
+ #rootmenu
1111
+ [root]="true"
1112
+ [items]="processedItems"
1113
+ [menuId]="id"
1114
+ [tabindex]="!disabled ? tabindex : -1"
1115
+ [ariaLabel]="ariaLabel"
1116
+ [ariaLabelledBy]="ariaLabelledBy"
1117
+ [baseZIndex]="baseZIndex"
1118
+ [autoZIndex]="autoZIndex"
1119
+ [visible]="submenuVisible()"
1120
+ [focusedItemId]="focused ? focusedItemId : undefined"
1121
+ [activeItemPath]="activeItemPath()"
1122
+ (itemClick)="onItemClick($event)"
1123
+ (menuFocus)="onMenuFocus($event)"
1124
+ (menuBlur)="onMenuBlur($event)"
1125
+ (menuKeydown)="onKeyDown($event)"
1126
+ (itemMouseEnter)="onItemMouseEnter($event)"
1127
+ ></p-contextMenuSub>
719
1128
  </div>
720
- `, isInline: true, styles: [".p-contextmenu{position:absolute;display:none}.p-contextmenu ul{margin:0;padding:0;list-style:none}.p-contextmenu .p-submenu-list{position:absolute;min-width:100%;z-index:1;display:none}.p-contextmenu .p-menuitem-link{cursor:pointer;display:flex;align-items:center;text-decoration:none;overflow:hidden;position:relative}.p-contextmenu .p-menuitem-text{line-height:1}.p-contextmenu .p-menuitem{position:relative}.p-contextmenu .p-menuitem-link .p-submenu-icon:not(svg){margin-left:auto}.p-contextmenu .p-menuitem-link .p-icon-wrapper{margin-left:auto}.p-contextmenu .p-menuitem-active>p-contextmenusub>.p-submenu-list.p-submenu-list-active{display:block!important}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: ContextMenuSub, selector: "p-contextMenuSub", inputs: ["item", "root", "parentItemKey"], outputs: ["leafClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1129
+ `, isInline: true, styles: [".p-contextmenu{position:absolute}.p-contextmenu ul{margin:0;padding:0;list-style:none}.p-contextmenu .p-submenu-list{position:absolute;min-width:100%;z-index:1}.p-contextmenu .p-menuitem-link{cursor:pointer;display:flex;align-items:center;text-decoration:none;overflow:hidden;position:relative}.p-contextmenu .p-menuitem-text{line-height:1}.p-contextmenu .p-menuitem{position:relative}.p-contextmenu .p-menuitem-link .p-submenu-icon:not(svg){margin-left:auto}.p-contextmenu .p-menuitem-link .p-icon-wrapper{margin-left:auto}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: ContextMenuSub, selector: "p-contextMenuSub", inputs: ["visible", "items", "root", "autoZIndex", "baseZIndex", "popup", "menuId", "ariaLabel", "ariaLabelledBy", "level", "focusedItemId", "activeItemPath", "tabindex"], outputs: ["itemClick", "itemMouseEnter", "menuFocus", "menuBlur", "menuKeydown"] }], animations: [trigger('overlayAnimation', [transition(':enter', [style({ opacity: 0 }), animate('250ms')]), transition(':leave', [animate('.1s linear', style({ opacity: 0 }))])])], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
721
1130
  }
722
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: ContextMenu, decorators: [{
1131
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.0", ngImport: i0, type: ContextMenu, decorators: [{
723
1132
  type: Component,
724
1133
  args: [{ selector: 'p-contextMenu', template: `
725
- <div #container [ngClass]="'p-contextmenu p-component'" [class]="styleClass" [ngStyle]="style">
726
- <p-contextMenuSub [item]="model" [root]="true"></p-contextMenuSub>
1134
+ <div
1135
+ #container
1136
+ [attr.data-pc-section]="'root'"
1137
+ [attr.data-pc-name]="'contextmenu'"
1138
+ [id]="id"
1139
+ [ngClass]="{ 'p-contextmenu p-component': true, 'p-contextmenu-overlay': true }"
1140
+ [class]="styleClass"
1141
+ [ngStyle]="style"
1142
+ [@overlayAnimation]="{ value: 'visible' }"
1143
+ (@overlayAnimation.start)="onOverlayAnimationStart($event)"
1144
+ (@overlayAnimation.done)="onOverlayAnimationEnd($event)"
1145
+ *ngIf="visible()"
1146
+ >
1147
+ <p-contextMenuSub
1148
+ #rootmenu
1149
+ [root]="true"
1150
+ [items]="processedItems"
1151
+ [menuId]="id"
1152
+ [tabindex]="!disabled ? tabindex : -1"
1153
+ [ariaLabel]="ariaLabel"
1154
+ [ariaLabelledBy]="ariaLabelledBy"
1155
+ [baseZIndex]="baseZIndex"
1156
+ [autoZIndex]="autoZIndex"
1157
+ [visible]="submenuVisible()"
1158
+ [focusedItemId]="focused ? focusedItemId : undefined"
1159
+ [activeItemPath]="activeItemPath()"
1160
+ (itemClick)="onItemClick($event)"
1161
+ (menuFocus)="onMenuFocus($event)"
1162
+ (menuBlur)="onMenuBlur($event)"
1163
+ (menuKeydown)="onKeyDown($event)"
1164
+ (itemMouseEnter)="onItemMouseEnter($event)"
1165
+ ></p-contextMenuSub>
727
1166
  </div>
728
- `, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
1167
+ `, animations: [trigger('overlayAnimation', [transition(':enter', [style({ opacity: 0 }), animate('250ms')]), transition(':leave', [animate('.1s linear', style({ opacity: 0 }))])])], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
729
1168
  class: 'p-element'
730
- }, styles: [".p-contextmenu{position:absolute;display:none}.p-contextmenu ul{margin:0;padding:0;list-style:none}.p-contextmenu .p-submenu-list{position:absolute;min-width:100%;z-index:1;display:none}.p-contextmenu .p-menuitem-link{cursor:pointer;display:flex;align-items:center;text-decoration:none;overflow:hidden;position:relative}.p-contextmenu .p-menuitem-text{line-height:1}.p-contextmenu .p-menuitem{position:relative}.p-contextmenu .p-menuitem-link .p-submenu-icon:not(svg){margin-left:auto}.p-contextmenu .p-menuitem-link .p-icon-wrapper{margin-left:auto}.p-contextmenu .p-menuitem-active>p-contextmenusub>.p-submenu-list.p-submenu-list-active{display:block!important}\n"] }]
1169
+ }, styles: [".p-contextmenu{position:absolute}.p-contextmenu ul{margin:0;padding:0;list-style:none}.p-contextmenu .p-submenu-list{position:absolute;min-width:100%;z-index:1}.p-contextmenu .p-menuitem-link{cursor:pointer;display:flex;align-items:center;text-decoration:none;overflow:hidden;position:relative}.p-contextmenu .p-menuitem-text{line-height:1}.p-contextmenu .p-menuitem{position:relative}.p-contextmenu .p-menuitem-link .p-submenu-icon:not(svg){margin-left:auto}.p-contextmenu .p-menuitem-link .p-icon-wrapper{margin-left:auto}\n"] }]
731
1170
  }], ctorParameters: function () { return [{ type: Document, decorators: [{
732
1171
  type: Inject,
733
1172
  args: [DOCUMENT]
734
- }] }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i5.ContextMenuService }, { type: i5.PrimeNGConfig }]; }, propDecorators: { model: [{
1173
+ }] }, { type: undefined, decorators: [{
1174
+ type: Inject,
1175
+ args: [PLATFORM_ID]
1176
+ }] }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: i5.PrimeNGConfig }, { type: i5.OverlayService }]; }, propDecorators: { model: [{
735
1177
  type: Input
736
- }], global: [{
1178
+ }], triggerEvent: [{
737
1179
  type: Input
738
1180
  }], target: [{
739
1181
  type: Input
1182
+ }], global: [{
1183
+ type: Input
740
1184
  }], style: [{
741
1185
  type: Input
742
1186
  }], styleClass: [{
@@ -747,31 +1191,37 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImpor
747
1191
  type: Input
748
1192
  }], baseZIndex: [{
749
1193
  type: Input
750
- }], triggerEvent: [{
1194
+ }], id: [{
1195
+ type: Input
1196
+ }], ariaLabel: [{
1197
+ type: Input
1198
+ }], ariaLabelledBy: [{
751
1199
  type: Input
752
1200
  }], onShow: [{
753
1201
  type: Output
754
1202
  }], onHide: [{
755
1203
  type: Output
756
- }], containerViewChild: [{
757
- type: ViewChild,
758
- args: ['container']
759
1204
  }], templates: [{
760
1205
  type: ContentChildren,
761
1206
  args: [PrimeTemplate]
1207
+ }], rootmenu: [{
1208
+ type: ViewChild,
1209
+ args: ['rootmenu']
1210
+ }], containerViewChild: [{
1211
+ type: ViewChild,
1212
+ args: ['container']
762
1213
  }] } });
763
1214
  class ContextMenuModule {
764
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: ContextMenuModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
765
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.0.2", ngImport: i0, type: ContextMenuModule, declarations: [ContextMenu, ContextMenuSub], imports: [CommonModule, RouterModule, RippleModule, TooltipModule, SharedModule, AngleRightIcon], exports: [ContextMenu, RouterModule, TooltipModule, SharedModule] });
766
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: ContextMenuModule, providers: [ContextMenuService], imports: [CommonModule, RouterModule, RippleModule, TooltipModule, SharedModule, AngleRightIcon, RouterModule, TooltipModule, SharedModule] });
1215
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.0", ngImport: i0, type: ContextMenuModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
1216
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.0", ngImport: i0, type: ContextMenuModule, declarations: [ContextMenu, ContextMenuSub], imports: [CommonModule, RouterModule, RippleModule, TooltipModule, AngleRightIcon, SharedModule], exports: [ContextMenu, RouterModule, TooltipModule, SharedModule] });
1217
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.0", ngImport: i0, type: ContextMenuModule, imports: [CommonModule, RouterModule, RippleModule, TooltipModule, AngleRightIcon, SharedModule, RouterModule, TooltipModule, SharedModule] });
767
1218
  }
768
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: ContextMenuModule, decorators: [{
1219
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.0", ngImport: i0, type: ContextMenuModule, decorators: [{
769
1220
  type: NgModule,
770
1221
  args: [{
771
- imports: [CommonModule, RouterModule, RippleModule, TooltipModule, SharedModule, AngleRightIcon],
1222
+ imports: [CommonModule, RouterModule, RippleModule, TooltipModule, AngleRightIcon, SharedModule],
772
1223
  exports: [ContextMenu, RouterModule, TooltipModule, SharedModule],
773
- declarations: [ContextMenu, ContextMenuSub],
774
- providers: [ContextMenuService]
1224
+ declarations: [ContextMenu, ContextMenuSub]
775
1225
  }]
776
1226
  }] });
777
1227