primevue 3.17.0 → 3.18.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 (316) hide show
  1. package/LICENSE.md +1 -1
  2. package/accordion/Accordion.vue +4 -4
  3. package/accordion/accordion.cjs.js +4 -4
  4. package/accordion/accordion.cjs.min.js +1 -1
  5. package/accordion/accordion.esm.js +4 -4
  6. package/accordion/accordion.esm.min.js +1 -1
  7. package/accordion/accordion.js +5 -5
  8. package/accordion/accordion.min.js +1 -1
  9. package/api/api.cjs.js +24 -2
  10. package/api/api.cjs.min.js +1 -1
  11. package/api/api.esm.js +24 -2
  12. package/api/api.esm.min.js +1 -1
  13. package/api/api.js +24 -2
  14. package/api/api.min.js +1 -1
  15. package/autocomplete/AutoComplete.d.ts +10 -0
  16. package/autocomplete/AutoComplete.vue +14 -6
  17. package/autocomplete/autocomplete.cjs.js +18 -10
  18. package/autocomplete/autocomplete.cjs.min.js +1 -1
  19. package/autocomplete/autocomplete.esm.js +16 -8
  20. package/autocomplete/autocomplete.esm.min.js +1 -1
  21. package/autocomplete/autocomplete.js +17 -9
  22. package/autocomplete/autocomplete.min.js +1 -1
  23. package/breadcrumb/Breadcrumb.d.ts +9 -1
  24. package/breadcrumb/Breadcrumb.vue +14 -5
  25. package/breadcrumb/BreadcrumbItem.vue +9 -3
  26. package/breadcrumb/breadcrumb.cjs.js +25 -14
  27. package/breadcrumb/breadcrumb.cjs.min.js +1 -1
  28. package/breadcrumb/breadcrumb.esm.js +25 -14
  29. package/breadcrumb/breadcrumb.esm.min.js +1 -1
  30. package/breadcrumb/breadcrumb.js +25 -14
  31. package/breadcrumb/breadcrumb.min.js +1 -1
  32. package/button/Button.vue +6 -3
  33. package/button/button.cjs.js +6 -3
  34. package/button/button.cjs.min.js +1 -1
  35. package/button/button.esm.js +6 -3
  36. package/button/button.esm.min.js +1 -1
  37. package/button/button.js +6 -3
  38. package/button/button.min.js +1 -1
  39. package/calendar/Calendar.vue +71 -26
  40. package/calendar/calendar.cjs.js +140 -95
  41. package/calendar/calendar.cjs.min.js +1 -1
  42. package/calendar/calendar.esm.js +138 -93
  43. package/calendar/calendar.esm.min.js +1 -1
  44. package/calendar/calendar.js +139 -94
  45. package/calendar/calendar.min.js +1 -1
  46. package/cascadeselect/CascadeSelect.d.ts +10 -0
  47. package/cascadeselect/CascadeSelect.vue +13 -4
  48. package/cascadeselect/CascadeSelectSub.vue +18 -13
  49. package/cascadeselect/cascadeselect.cjs.js +39 -26
  50. package/cascadeselect/cascadeselect.cjs.min.js +1 -1
  51. package/cascadeselect/cascadeselect.esm.js +38 -25
  52. package/cascadeselect/cascadeselect.esm.min.js +1 -1
  53. package/cascadeselect/cascadeselect.js +39 -26
  54. package/cascadeselect/cascadeselect.min.js +1 -1
  55. package/config/PrimeVue.d.ts +4 -1
  56. package/config/config.cjs.js +5 -2
  57. package/config/config.cjs.min.js +1 -1
  58. package/config/config.esm.js +5 -2
  59. package/config/config.esm.min.js +1 -1
  60. package/config/config.js +6 -3
  61. package/config/config.min.js +1 -1
  62. package/contextmenu/ContextMenu.d.ts +41 -2
  63. package/contextmenu/ContextMenu.vue +440 -33
  64. package/contextmenu/ContextMenuSub.vue +119 -98
  65. package/contextmenu/contextmenu.cjs.js +619 -194
  66. package/contextmenu/contextmenu.cjs.min.js +1 -1
  67. package/contextmenu/contextmenu.esm.js +620 -195
  68. package/contextmenu/contextmenu.esm.min.js +1 -1
  69. package/contextmenu/contextmenu.js +620 -195
  70. package/contextmenu/contextmenu.min.js +1 -1
  71. package/core/core.js +1369 -675
  72. package/core/core.min.js +10 -10
  73. package/datatable/DataTable.d.ts +1 -2
  74. package/datatable/DataTable.vue +3 -3
  75. package/datatable/datatable.cjs.js +2334 -2334
  76. package/datatable/datatable.cjs.min.js +1 -1
  77. package/datatable/datatable.esm.js +2319 -2319
  78. package/datatable/datatable.esm.min.js +1 -1
  79. package/datatable/datatable.js +2319 -2319
  80. package/datatable/datatable.min.js +1 -1
  81. package/dock/Dock.d.ts +33 -2
  82. package/dock/Dock.vue +18 -2
  83. package/dock/DockSub.vue +206 -53
  84. package/dock/dock.cjs.js +261 -90
  85. package/dock/dock.cjs.min.js +1 -1
  86. package/dock/dock.esm.js +261 -90
  87. package/dock/dock.esm.min.js +1 -1
  88. package/dock/dock.js +262 -92
  89. package/dock/dock.min.js +1 -1
  90. package/dropdown/Dropdown.d.ts +15 -0
  91. package/dropdown/Dropdown.vue +19 -7
  92. package/dropdown/dropdown.cjs.js +37 -24
  93. package/dropdown/dropdown.cjs.min.js +1 -1
  94. package/dropdown/dropdown.esm.js +36 -23
  95. package/dropdown/dropdown.esm.min.js +1 -1
  96. package/dropdown/dropdown.js +36 -23
  97. package/dropdown/dropdown.min.js +1 -1
  98. package/fileupload/FileContent.vue +51 -0
  99. package/fileupload/FileUpload.d.ts +21 -1
  100. package/fileupload/FileUpload.vue +62 -48
  101. package/fileupload/fileupload.cjs.js +214 -115
  102. package/fileupload/fileupload.cjs.min.js +1 -1
  103. package/fileupload/fileupload.esm.js +214 -115
  104. package/fileupload/fileupload.esm.min.js +1 -1
  105. package/fileupload/fileupload.js +214 -115
  106. package/fileupload/fileupload.min.js +1 -1
  107. package/galleria/GalleriaThumbnails.vue +2 -2
  108. package/galleria/galleria.cjs.js +1 -1
  109. package/galleria/galleria.cjs.min.js +1 -1
  110. package/galleria/galleria.esm.js +1 -1
  111. package/galleria/galleria.esm.min.js +1 -1
  112. package/galleria/galleria.js +1 -1
  113. package/galleria/galleria.min.js +1 -1
  114. package/inlinemessage/inlinemessage.cjs.js +1 -2
  115. package/inlinemessage/inlinemessage.cjs.min.js +1 -1
  116. package/inlinemessage/inlinemessage.esm.js +1 -2
  117. package/inlinemessage/inlinemessage.esm.min.js +1 -1
  118. package/inlinemessage/inlinemessage.js +1 -2
  119. package/inlinemessage/inlinemessage.min.js +1 -1
  120. package/inputnumber/InputNumber.vue +11 -4
  121. package/inputnumber/inputnumber.cjs.js +12 -5
  122. package/inputnumber/inputnumber.cjs.min.js +1 -1
  123. package/inputnumber/inputnumber.esm.js +11 -4
  124. package/inputnumber/inputnumber.esm.min.js +1 -1
  125. package/inputnumber/inputnumber.js +12 -6
  126. package/inputnumber/inputnumber.min.js +1 -1
  127. package/listbox/Listbox.d.ts +5 -0
  128. package/listbox/Listbox.vue +5 -1
  129. package/listbox/listbox.cjs.js +25 -20
  130. package/listbox/listbox.cjs.min.js +1 -1
  131. package/listbox/listbox.esm.js +25 -20
  132. package/listbox/listbox.esm.min.js +1 -1
  133. package/listbox/listbox.js +25 -20
  134. package/listbox/listbox.min.js +1 -1
  135. package/megamenu/MegaMenu.d.ts +29 -2
  136. package/megamenu/MegaMenu.vue +486 -228
  137. package/megamenu/MegaMenuSub.vue +231 -0
  138. package/megamenu/megamenu.cjs.js +818 -377
  139. package/megamenu/megamenu.cjs.min.js +1 -1
  140. package/megamenu/megamenu.esm.js +820 -379
  141. package/megamenu/megamenu.esm.min.js +1 -1
  142. package/megamenu/megamenu.js +818 -377
  143. package/megamenu/megamenu.min.js +1 -1
  144. package/menu/Menu.d.ts +25 -2
  145. package/menu/Menu.vue +182 -18
  146. package/menu/Menuitem.vue +35 -28
  147. package/menu/menu.cjs.js +293 -114
  148. package/menu/menu.cjs.min.js +1 -1
  149. package/menu/menu.esm.js +293 -114
  150. package/menu/menu.esm.min.js +1 -1
  151. package/menu/menu.js +293 -114
  152. package/menu/menu.min.js +1 -1
  153. package/menubar/Menubar.d.ts +14 -2
  154. package/menubar/Menubar.vue +526 -15
  155. package/menubar/MenubarSub.vue +105 -238
  156. package/menubar/menubar.cjs.js +691 -316
  157. package/menubar/menubar.cjs.min.js +1 -1
  158. package/menubar/menubar.esm.js +693 -318
  159. package/menubar/menubar.esm.min.js +1 -1
  160. package/menubar/menubar.js +691 -316
  161. package/menubar/menubar.min.js +1 -1
  162. package/multiselect/MultiSelect.d.ts +25 -0
  163. package/multiselect/MultiSelect.vue +31 -11
  164. package/multiselect/multiselect.cjs.js +58 -37
  165. package/multiselect/multiselect.cjs.min.js +1 -1
  166. package/multiselect/multiselect.esm.js +57 -36
  167. package/multiselect/multiselect.esm.min.js +1 -1
  168. package/multiselect/multiselect.js +57 -36
  169. package/multiselect/multiselect.min.js +1 -1
  170. package/package.json +3 -3
  171. package/paginator/Paginator.d.ts +2 -2
  172. package/paginator/Paginator.vue +118 -23
  173. package/paginator/paginator.cjs.js +277 -182
  174. package/paginator/paginator.cjs.min.js +1 -1
  175. package/paginator/paginator.esm.js +278 -183
  176. package/paginator/paginator.esm.min.js +1 -1
  177. package/paginator/paginator.js +278 -184
  178. package/paginator/paginator.min.js +1 -1
  179. package/panelmenu/PanelMenu.d.ts +32 -1
  180. package/panelmenu/PanelMenu.vue +189 -83
  181. package/panelmenu/PanelMenuList.vue +335 -0
  182. package/panelmenu/PanelMenuSub.vue +124 -85
  183. package/panelmenu/panelmenu.cjs.js +1383 -285
  184. package/panelmenu/panelmenu.cjs.min.js +1 -1
  185. package/panelmenu/panelmenu.esm.js +1380 -286
  186. package/panelmenu/panelmenu.esm.min.js +1 -1
  187. package/panelmenu/panelmenu.js +1383 -286
  188. package/panelmenu/panelmenu.min.js +1 -1
  189. package/password/Password.vue +5 -4
  190. package/password/password.cjs.js +6 -5
  191. package/password/password.cjs.min.js +1 -1
  192. package/password/password.esm.js +5 -4
  193. package/password/password.esm.min.js +1 -1
  194. package/password/password.js +6 -5
  195. package/password/password.min.js +1 -1
  196. package/resources/primevue.css +21 -2
  197. package/resources/primevue.min.css +1 -1
  198. package/resources/themes/arya-blue/theme.css +317 -270
  199. package/resources/themes/arya-green/theme.css +317 -270
  200. package/resources/themes/arya-orange/theme.css +317 -270
  201. package/resources/themes/arya-purple/theme.css +317 -270
  202. package/resources/themes/bootstrap4-dark-blue/theme.css +332 -285
  203. package/resources/themes/bootstrap4-dark-purple/theme.css +332 -285
  204. package/resources/themes/bootstrap4-light-blue/theme.css +345 -298
  205. package/resources/themes/bootstrap4-light-purple/theme.css +345 -298
  206. package/resources/themes/fluent-light/theme.css +327 -280
  207. package/resources/themes/lara-dark-blue/theme.css +320 -273
  208. package/resources/themes/lara-dark-indigo/theme.css +320 -273
  209. package/resources/themes/lara-dark-purple/theme.css +320 -273
  210. package/resources/themes/lara-dark-teal/theme.css +320 -273
  211. package/resources/themes/lara-light-blue/theme.css +344 -297
  212. package/resources/themes/lara-light-indigo/theme.css +344 -297
  213. package/resources/themes/lara-light-purple/theme.css +344 -297
  214. package/resources/themes/lara-light-teal/theme.css +344 -297
  215. package/resources/themes/luna-amber/theme.css +348 -301
  216. package/resources/themes/luna-blue/theme.css +348 -301
  217. package/resources/themes/luna-green/theme.css +348 -301
  218. package/resources/themes/luna-pink/theme.css +348 -301
  219. package/resources/themes/md-dark-deeppurple/theme.css +367 -298
  220. package/resources/themes/md-dark-indigo/theme.css +367 -298
  221. package/resources/themes/md-light-deeppurple/theme.css +367 -298
  222. package/resources/themes/md-light-indigo/theme.css +367 -298
  223. package/resources/themes/mdc-dark-deeppurple/theme.css +367 -298
  224. package/resources/themes/mdc-dark-indigo/theme.css +367 -298
  225. package/resources/themes/mdc-light-deeppurple/theme.css +367 -298
  226. package/resources/themes/mdc-light-indigo/theme.css +367 -298
  227. package/resources/themes/nova/theme.css +312 -265
  228. package/resources/themes/nova-accent/theme.css +312 -265
  229. package/resources/themes/nova-alt/theme.css +312 -265
  230. package/resources/themes/nova-vue/theme.css +312 -265
  231. package/resources/themes/rhea/theme.css +312 -265
  232. package/resources/themes/saga-blue/theme.css +324 -277
  233. package/resources/themes/saga-green/theme.css +324 -277
  234. package/resources/themes/saga-orange/theme.css +324 -277
  235. package/resources/themes/saga-purple/theme.css +324 -277
  236. package/resources/themes/tailwind-light/theme.css +336 -289
  237. package/resources/themes/vela-blue/theme.css +324 -277
  238. package/resources/themes/vela-green/theme.css +324 -277
  239. package/resources/themes/vela-orange/theme.css +324 -277
  240. package/resources/themes/vela-purple/theme.css +324 -277
  241. package/ripple/ripple.cjs.js +12 -0
  242. package/ripple/ripple.cjs.min.js +1 -1
  243. package/ripple/ripple.esm.js +12 -0
  244. package/ripple/ripple.esm.min.js +1 -1
  245. package/ripple/ripple.js +12 -0
  246. package/ripple/ripple.min.js +1 -1
  247. package/speeddial/SpeedDial.vue +21 -16
  248. package/speeddial/speeddial.cjs.js +34 -27
  249. package/speeddial/speeddial.cjs.min.js +1 -1
  250. package/speeddial/speeddial.esm.js +34 -27
  251. package/speeddial/speeddial.esm.min.js +1 -1
  252. package/speeddial/speeddial.js +34 -27
  253. package/speeddial/speeddial.min.js +1 -1
  254. package/steps/Steps.vue +108 -9
  255. package/steps/steps.cjs.js +111 -20
  256. package/steps/steps.cjs.min.js +1 -1
  257. package/steps/steps.esm.js +112 -21
  258. package/steps/steps.esm.min.js +1 -1
  259. package/steps/steps.js +111 -20
  260. package/steps/steps.min.js +1 -1
  261. package/styleclass/styleclass.cjs.js +1 -1
  262. package/styleclass/styleclass.cjs.min.js +1 -1
  263. package/styleclass/styleclass.esm.js +1 -1
  264. package/styleclass/styleclass.esm.min.js +1 -1
  265. package/styleclass/styleclass.js +1 -1
  266. package/styleclass/styleclass.min.js +1 -1
  267. package/tabmenu/TabMenu.d.ts +9 -1
  268. package/tabmenu/TabMenu.vue +135 -6
  269. package/tabmenu/tabmenu.cjs.js +137 -17
  270. package/tabmenu/tabmenu.cjs.min.js +1 -1
  271. package/tabmenu/tabmenu.esm.js +137 -17
  272. package/tabmenu/tabmenu.esm.min.js +1 -1
  273. package/tabmenu/tabmenu.js +138 -18
  274. package/tabmenu/tabmenu.min.js +1 -1
  275. package/tabview/TabView.vue +2 -2
  276. package/tabview/tabview.cjs.js +2 -2
  277. package/tabview/tabview.cjs.min.js +1 -1
  278. package/tabview/tabview.esm.js +2 -2
  279. package/tabview/tabview.esm.min.js +1 -1
  280. package/tabview/tabview.js +3 -3
  281. package/tabview/tabview.min.js +1 -1
  282. package/tieredmenu/TieredMenu.d.ts +46 -3
  283. package/tieredmenu/TieredMenu.vue +482 -48
  284. package/tieredmenu/TieredMenuSub.vue +111 -204
  285. package/tieredmenu/tieredmenu.cjs.js +656 -320
  286. package/tieredmenu/tieredmenu.cjs.min.js +1 -1
  287. package/tieredmenu/tieredmenu.esm.js +657 -321
  288. package/tieredmenu/tieredmenu.esm.min.js +1 -1
  289. package/tieredmenu/tieredmenu.js +657 -321
  290. package/tieredmenu/tieredmenu.min.js +1 -1
  291. package/toast/Toast.vue +5 -3
  292. package/toast/ToastMessage.vue +5 -3
  293. package/toast/toast.cjs.js +19 -15
  294. package/toast/toast.cjs.min.js +1 -1
  295. package/toast/toast.esm.js +18 -14
  296. package/toast/toast.esm.min.js +1 -1
  297. package/toast/toast.js +19 -15
  298. package/toast/toast.min.js +1 -1
  299. package/togglebutton/ToggleButton.vue +42 -7
  300. package/togglebutton/togglebutton.cjs.js +42 -6
  301. package/togglebutton/togglebutton.cjs.min.js +1 -1
  302. package/togglebutton/togglebutton.esm.js +42 -6
  303. package/togglebutton/togglebutton.esm.min.js +1 -1
  304. package/togglebutton/togglebutton.js +42 -6
  305. package/togglebutton/togglebutton.min.js +1 -1
  306. package/tree/Tree.d.ts +8 -0
  307. package/utils/Utils.d.ts +3 -0
  308. package/utils/utils.cjs.js +26 -0
  309. package/utils/utils.cjs.min.js +1 -1
  310. package/utils/utils.esm.js +26 -0
  311. package/utils/utils.esm.min.js +1 -1
  312. package/utils/utils.js +26 -0
  313. package/utils/utils.min.js +1 -1
  314. package/vetur-attributes.json +175 -3
  315. package/vetur-tags.json +54 -11
  316. package/web-types.json +675 -51
@@ -1,12 +1,884 @@
1
- import { resolveComponent, openBlock, createElementBlock, Fragment, renderList, normalizeClass, normalizeStyle, createBlock, withCtx, createElementVNode, toDisplayString, createCommentVNode, resolveDynamicComponent, createVNode, Transition, withDirectives, vShow } from 'vue';
2
- import { UniqueComponentId } from 'primevue/utils';
1
+ import { ObjectUtils, DomHandler as DomHandler$1, UniqueComponentId } from 'primevue/utils';
2
+ import Ripple from 'primevue/ripple';
3
+ import { resolveComponent, resolveDirective, openBlock, createElementBlock, Fragment, renderList, normalizeStyle, normalizeClass, createElementVNode, createBlock, withCtx, withDirectives, createCommentVNode, toDisplayString, resolveDynamicComponent, createVNode, Transition, vShow } from 'vue';
4
+
5
+ var DomHandler = {
6
+ innerWidth(el) {
7
+ if (el) {
8
+ let width = el.offsetWidth;
9
+ let style = getComputedStyle(el);
10
+
11
+ width += parseFloat(style.paddingLeft) + parseFloat(style.paddingRight);
12
+
13
+ return width;
14
+ }
15
+
16
+ return 0;
17
+ },
18
+
19
+ width(el) {
20
+ if (el) {
21
+ let width = el.offsetWidth;
22
+ let style = getComputedStyle(el);
23
+
24
+ width -= parseFloat(style.paddingLeft) + parseFloat(style.paddingRight);
25
+
26
+ return width;
27
+ }
28
+
29
+ return 0;
30
+ },
31
+
32
+ getWindowScrollTop() {
33
+ let doc = document.documentElement;
34
+
35
+ return (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0);
36
+ },
37
+
38
+ getWindowScrollLeft() {
39
+ let doc = document.documentElement;
40
+
41
+ return (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0);
42
+ },
43
+
44
+ getOuterWidth(el, margin) {
45
+ if (el) {
46
+ let width = el.offsetWidth;
47
+
48
+ if (margin) {
49
+ let style = getComputedStyle(el);
50
+
51
+ width += parseFloat(style.marginLeft) + parseFloat(style.marginRight);
52
+ }
53
+
54
+ return width;
55
+ }
56
+
57
+ return 0;
58
+ },
59
+
60
+ getOuterHeight(el, margin) {
61
+ if (el) {
62
+ let height = el.offsetHeight;
63
+
64
+ if (margin) {
65
+ let style = getComputedStyle(el);
66
+
67
+ height += parseFloat(style.marginTop) + parseFloat(style.marginBottom);
68
+ }
69
+
70
+ return height;
71
+ }
72
+
73
+ return 0;
74
+ },
75
+
76
+ getClientHeight(el, margin) {
77
+ if (el) {
78
+ let height = el.clientHeight;
79
+
80
+ if (margin) {
81
+ let style = getComputedStyle(el);
82
+
83
+ height += parseFloat(style.marginTop) + parseFloat(style.marginBottom);
84
+ }
85
+
86
+ return height;
87
+ }
88
+
89
+ return 0;
90
+ },
91
+
92
+ getViewport() {
93
+ let win = window,
94
+ d = document,
95
+ e = d.documentElement,
96
+ g = d.getElementsByTagName('body')[0],
97
+ w = win.innerWidth || e.clientWidth || g.clientWidth,
98
+ h = win.innerHeight || e.clientHeight || g.clientHeight;
99
+
100
+ return { width: w, height: h };
101
+ },
102
+
103
+ getOffset(el) {
104
+ if (el) {
105
+ let rect = el.getBoundingClientRect();
106
+
107
+ return {
108
+ top: rect.top + (window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0),
109
+ left: rect.left + (window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0)
110
+ };
111
+ }
112
+
113
+ return {
114
+ top: 'auto',
115
+ left: 'auto'
116
+ };
117
+ },
118
+
119
+ index(element) {
120
+ if (element) {
121
+ let children = element.parentNode.childNodes;
122
+ let num = 0;
123
+
124
+ for (let i = 0; i < children.length; i++) {
125
+ if (children[i] === element) return num;
126
+ if (children[i].nodeType === 1) num++;
127
+ }
128
+ }
129
+
130
+ return -1;
131
+ },
132
+
133
+ addMultipleClasses(element, className) {
134
+ if (element && className) {
135
+ if (element.classList) {
136
+ let styles = className.split(' ');
137
+
138
+ for (let i = 0; i < styles.length; i++) {
139
+ element.classList.add(styles[i]);
140
+ }
141
+ } else {
142
+ let styles = className.split(' ');
143
+
144
+ for (let i = 0; i < styles.length; i++) {
145
+ element.className += ' ' + styles[i];
146
+ }
147
+ }
148
+ }
149
+ },
150
+
151
+ addClass(element, className) {
152
+ if (element && className) {
153
+ if (element.classList) element.classList.add(className);
154
+ else element.className += ' ' + className;
155
+ }
156
+ },
157
+
158
+ removeClass(element, className) {
159
+ if (element && className) {
160
+ if (element.classList) element.classList.remove(className);
161
+ else element.className = element.className.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'), ' ');
162
+ }
163
+ },
164
+
165
+ hasClass(element, className) {
166
+ if (element) {
167
+ if (element.classList) return element.classList.contains(className);
168
+ else return new RegExp('(^| )' + className + '( |$)', 'gi').test(element.className);
169
+ }
170
+
171
+ return false;
172
+ },
173
+
174
+ find(element, selector) {
175
+ return element ? element.querySelectorAll(selector) : [];
176
+ },
177
+
178
+ findSingle(element, selector) {
179
+ if (element) {
180
+ return element.querySelector(selector);
181
+ }
182
+
183
+ return null;
184
+ },
185
+
186
+ getHeight(el) {
187
+ if (el) {
188
+ let height = el.offsetHeight;
189
+ let style = getComputedStyle(el);
190
+
191
+ height -= parseFloat(style.paddingTop) + parseFloat(style.paddingBottom) + parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth);
192
+
193
+ return height;
194
+ }
195
+
196
+ return 0;
197
+ },
198
+
199
+ getWidth(el) {
200
+ if (el) {
201
+ let width = el.offsetWidth;
202
+ let style = getComputedStyle(el);
203
+
204
+ width -= parseFloat(style.paddingLeft) + parseFloat(style.paddingRight) + parseFloat(style.borderLeftWidth) + parseFloat(style.borderRightWidth);
205
+
206
+ return width;
207
+ }
208
+
209
+ return 0;
210
+ },
211
+
212
+ absolutePosition(element, target) {
213
+ if (element) {
214
+ let elementDimensions = element.offsetParent ? { width: element.offsetWidth, height: element.offsetHeight } : this.getHiddenElementDimensions(element);
215
+ let elementOuterHeight = elementDimensions.height;
216
+ let elementOuterWidth = elementDimensions.width;
217
+ let targetOuterHeight = target.offsetHeight;
218
+ let targetOuterWidth = target.offsetWidth;
219
+ let targetOffset = target.getBoundingClientRect();
220
+ let windowScrollTop = this.getWindowScrollTop();
221
+ let windowScrollLeft = this.getWindowScrollLeft();
222
+ let viewport = this.getViewport();
223
+ let top, left;
224
+
225
+ if (targetOffset.top + targetOuterHeight + elementOuterHeight > viewport.height) {
226
+ top = targetOffset.top + windowScrollTop - elementOuterHeight;
227
+ element.style.transformOrigin = 'bottom';
228
+
229
+ if (top < 0) {
230
+ top = windowScrollTop;
231
+ }
232
+ } else {
233
+ top = targetOuterHeight + targetOffset.top + windowScrollTop;
234
+ element.style.transformOrigin = 'top';
235
+ }
236
+
237
+ if (targetOffset.left + elementOuterWidth > viewport.width) left = Math.max(0, targetOffset.left + windowScrollLeft + targetOuterWidth - elementOuterWidth);
238
+ else left = targetOffset.left + windowScrollLeft;
239
+
240
+ element.style.top = top + 'px';
241
+ element.style.left = left + 'px';
242
+ }
243
+ },
244
+
245
+ relativePosition(element, target) {
246
+ if (element) {
247
+ let elementDimensions = element.offsetParent ? { width: element.offsetWidth, height: element.offsetHeight } : this.getHiddenElementDimensions(element);
248
+ const targetHeight = target.offsetHeight;
249
+ const targetOffset = target.getBoundingClientRect();
250
+ const viewport = this.getViewport();
251
+ let top, left;
252
+
253
+ if (targetOffset.top + targetHeight + elementDimensions.height > viewport.height) {
254
+ top = -1 * elementDimensions.height;
255
+ element.style.transformOrigin = 'bottom';
256
+
257
+ if (targetOffset.top + top < 0) {
258
+ top = -1 * targetOffset.top;
259
+ }
260
+ } else {
261
+ top = targetHeight;
262
+ element.style.transformOrigin = 'top';
263
+ }
264
+
265
+ if (elementDimensions.width > viewport.width) {
266
+ // element wider then viewport and cannot fit on screen (align at left side of viewport)
267
+ left = targetOffset.left * -1;
268
+ } else if (targetOffset.left + elementDimensions.width > viewport.width) {
269
+ // element wider then viewport but can be fit on screen (align at right side of viewport)
270
+ left = (targetOffset.left + elementDimensions.width - viewport.width) * -1;
271
+ } else {
272
+ // element fits on screen (align with target)
273
+ left = 0;
274
+ }
275
+
276
+ element.style.top = top + 'px';
277
+ element.style.left = left + 'px';
278
+ }
279
+ },
280
+
281
+ getParents(element, parents = []) {
282
+ return element['parentNode'] === null ? parents : this.getParents(element.parentNode, parents.concat([element.parentNode]));
283
+ },
284
+
285
+ getScrollableParents(element) {
286
+ let scrollableParents = [];
287
+
288
+ if (element) {
289
+ let parents = this.getParents(element);
290
+ const overflowRegex = /(auto|scroll)/;
291
+
292
+ const overflowCheck = (node) => {
293
+ let styleDeclaration = window['getComputedStyle'](node, null);
294
+
295
+ return overflowRegex.test(styleDeclaration.getPropertyValue('overflow')) || overflowRegex.test(styleDeclaration.getPropertyValue('overflowX')) || overflowRegex.test(styleDeclaration.getPropertyValue('overflowY'));
296
+ };
297
+
298
+ for (let parent of parents) {
299
+ let scrollSelectors = parent.nodeType === 1 && parent.dataset['scrollselectors'];
300
+
301
+ if (scrollSelectors) {
302
+ let selectors = scrollSelectors.split(',');
303
+
304
+ for (let selector of selectors) {
305
+ let el = this.findSingle(parent, selector);
306
+
307
+ if (el && overflowCheck(el)) {
308
+ scrollableParents.push(el);
309
+ }
310
+ }
311
+ }
312
+
313
+ if (parent.nodeType !== 9 && overflowCheck(parent)) {
314
+ scrollableParents.push(parent);
315
+ }
316
+ }
317
+ }
318
+
319
+ return scrollableParents;
320
+ },
321
+
322
+ getHiddenElementOuterHeight(element) {
323
+ if (element) {
324
+ element.style.visibility = 'hidden';
325
+ element.style.display = 'block';
326
+ let elementHeight = element.offsetHeight;
327
+
328
+ element.style.display = 'none';
329
+ element.style.visibility = 'visible';
330
+
331
+ return elementHeight;
332
+ }
333
+
334
+ return 0;
335
+ },
336
+
337
+ getHiddenElementOuterWidth(element) {
338
+ if (element) {
339
+ element.style.visibility = 'hidden';
340
+ element.style.display = 'block';
341
+ let elementWidth = element.offsetWidth;
342
+
343
+ element.style.display = 'none';
344
+ element.style.visibility = 'visible';
345
+
346
+ return elementWidth;
347
+ }
348
+
349
+ return 0;
350
+ },
351
+
352
+ getHiddenElementDimensions(element) {
353
+ if (element) {
354
+ let dimensions = {};
355
+
356
+ element.style.visibility = 'hidden';
357
+ element.style.display = 'block';
358
+ dimensions.width = element.offsetWidth;
359
+ dimensions.height = element.offsetHeight;
360
+ element.style.display = 'none';
361
+ element.style.visibility = 'visible';
362
+
363
+ return dimensions;
364
+ }
365
+
366
+ return 0;
367
+ },
368
+
369
+ fadeIn(element, duration) {
370
+ if (element) {
371
+ element.style.opacity = 0;
372
+
373
+ let last = +new Date();
374
+ let opacity = 0;
375
+
376
+ let tick = function () {
377
+ opacity = +element.style.opacity + (new Date().getTime() - last) / duration;
378
+ element.style.opacity = opacity;
379
+ last = +new Date();
380
+
381
+ if (+opacity < 1) {
382
+ (window.requestAnimationFrame && requestAnimationFrame(tick)) || setTimeout(tick, 16);
383
+ }
384
+ };
385
+
386
+ tick();
387
+ }
388
+ },
389
+
390
+ fadeOut(element, ms) {
391
+ if (element) {
392
+ let opacity = 1,
393
+ interval = 50,
394
+ duration = ms,
395
+ gap = interval / duration;
396
+
397
+ let fading = setInterval(() => {
398
+ opacity -= gap;
399
+
400
+ if (opacity <= 0) {
401
+ opacity = 0;
402
+ clearInterval(fading);
403
+ }
404
+
405
+ element.style.opacity = opacity;
406
+ }, interval);
407
+ }
408
+ },
409
+
410
+ getUserAgent() {
411
+ return navigator.userAgent;
412
+ },
413
+
414
+ appendChild(element, target) {
415
+ if (this.isElement(target)) target.appendChild(element);
416
+ else if (target.el && target.elElement) target.elElement.appendChild(element);
417
+ else throw new Error('Cannot append ' + target + ' to ' + element);
418
+ },
419
+
420
+ scrollInView(container, item) {
421
+ let borderTopValue = getComputedStyle(container).getPropertyValue('borderTopWidth');
422
+ let borderTop = borderTopValue ? parseFloat(borderTopValue) : 0;
423
+ let paddingTopValue = getComputedStyle(container).getPropertyValue('paddingTop');
424
+ let paddingTop = paddingTopValue ? parseFloat(paddingTopValue) : 0;
425
+ let containerRect = container.getBoundingClientRect();
426
+ let itemRect = item.getBoundingClientRect();
427
+ let offset = itemRect.top + document.body.scrollTop - (containerRect.top + document.body.scrollTop) - borderTop - paddingTop;
428
+ let scroll = container.scrollTop;
429
+ let elementHeight = container.clientHeight;
430
+ let itemHeight = this.getOuterHeight(item);
431
+
432
+ if (offset < 0) {
433
+ container.scrollTop = scroll + offset;
434
+ } else if (offset + itemHeight > elementHeight) {
435
+ container.scrollTop = scroll + offset - elementHeight + itemHeight;
436
+ }
437
+ },
438
+
439
+ clearSelection() {
440
+ if (window.getSelection) {
441
+ if (window.getSelection().empty) {
442
+ window.getSelection().empty();
443
+ } else if (window.getSelection().removeAllRanges && window.getSelection().rangeCount > 0 && window.getSelection().getRangeAt(0).getClientRects().length > 0) {
444
+ window.getSelection().removeAllRanges();
445
+ }
446
+ } else if (document['selection'] && document['selection'].empty) {
447
+ try {
448
+ document['selection'].empty();
449
+ } catch (error) {
450
+ //ignore IE bug
451
+ }
452
+ }
453
+ },
454
+
455
+ getSelection() {
456
+ if (window.getSelection) return window.getSelection().toString();
457
+ else if (document.getSelection) return document.getSelection().toString();
458
+ else if (document['selection']) return document['selection'].createRange().text;
459
+
460
+ return null;
461
+ },
462
+
463
+ calculateScrollbarWidth() {
464
+ if (this.calculatedScrollbarWidth != null) return this.calculatedScrollbarWidth;
465
+
466
+ let scrollDiv = document.createElement('div');
467
+
468
+ scrollDiv.className = 'p-scrollbar-measure';
469
+ document.body.appendChild(scrollDiv);
470
+
471
+ let scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
472
+
473
+ document.body.removeChild(scrollDiv);
474
+
475
+ this.calculatedScrollbarWidth = scrollbarWidth;
476
+
477
+ return scrollbarWidth;
478
+ },
479
+
480
+ getBrowser() {
481
+ if (!this.browser) {
482
+ let matched = this.resolveUserAgent();
483
+
484
+ this.browser = {};
485
+
486
+ if (matched.browser) {
487
+ this.browser[matched.browser] = true;
488
+ this.browser['version'] = matched.version;
489
+ }
490
+
491
+ if (this.browser['chrome']) {
492
+ this.browser['webkit'] = true;
493
+ } else if (this.browser['webkit']) {
494
+ this.browser['safari'] = true;
495
+ }
496
+ }
497
+
498
+ return this.browser;
499
+ },
500
+
501
+ resolveUserAgent() {
502
+ let ua = navigator.userAgent.toLowerCase();
503
+ let match = /(chrome)[ ]([\w.]+)/.exec(ua) || /(webkit)[ ]([\w.]+)/.exec(ua) || /(opera)(?:.*version|)[ ]([\w.]+)/.exec(ua) || /(msie) ([\w.]+)/.exec(ua) || (ua.indexOf('compatible') < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua)) || [];
504
+
505
+ return {
506
+ browser: match[1] || '',
507
+ version: match[2] || '0'
508
+ };
509
+ },
510
+
511
+ isVisible(element) {
512
+ return element && element.offsetParent != null;
513
+ },
514
+
515
+ invokeElementMethod(element, methodName, args) {
516
+ element[methodName].apply(element, args);
517
+ },
518
+
519
+ isExist(element) {
520
+ return element !== null && typeof element !== 'undefined' && element.nodeName && element.parentNode;
521
+ },
522
+
523
+ isClient() {
524
+ return !!(typeof window !== 'undefined' && window.document && window.document.createElement);
525
+ },
526
+
527
+ focus(el, options) {
528
+ el && document.activeElement !== el && el.focus(options);
529
+ },
530
+
531
+ getFocusableElements(element, selector = '') {
532
+ let focusableElements = this.find(
533
+ element,
534
+ `button:not([tabindex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${selector},
535
+ [href][clientHeight][clientWidth]:not([tabindex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${selector},
536
+ input:not([tabindex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${selector},
537
+ select:not([tabindex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${selector},
538
+ textarea:not([tabindex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${selector},
539
+ [tabIndex]:not([tabIndex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${selector},
540
+ [contenteditable]:not([tabIndex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${selector}`
541
+ );
542
+
543
+ let visibleFocusableElements = [];
544
+
545
+ for (let focusableElement of focusableElements) {
546
+ if (getComputedStyle(focusableElement).display != 'none' && getComputedStyle(focusableElement).visibility != 'hidden') visibleFocusableElements.push(focusableElement);
547
+ }
548
+
549
+ return visibleFocusableElements;
550
+ },
551
+
552
+ getFirstFocusableElement(element, selector) {
553
+ const focusableElements = this.getFocusableElements(element, selector);
554
+
555
+ return focusableElements.length > 0 ? focusableElements[0] : null;
556
+ },
557
+
558
+ isClickable(element) {
559
+ const targetNode = element.nodeName;
560
+ const parentNode = element.parentElement && element.parentElement.nodeName;
561
+
562
+ return (
563
+ targetNode == 'INPUT' ||
564
+ targetNode == 'BUTTON' ||
565
+ targetNode == 'A' ||
566
+ parentNode == 'INPUT' ||
567
+ parentNode == 'BUTTON' ||
568
+ parentNode == 'A' ||
569
+ this.hasClass(element, 'p-button') ||
570
+ this.hasClass(element.parentElement, 'p-button') ||
571
+ this.hasClass(element.parentElement, 'p-checkbox') ||
572
+ this.hasClass(element.parentElement, 'p-radiobutton')
573
+ );
574
+ },
575
+
576
+ applyStyle(element, style) {
577
+ if (typeof style === 'string') {
578
+ element.style.cssText = style;
579
+ } else {
580
+ for (let prop in style) {
581
+ element.style[prop] = style[prop];
582
+ }
583
+ }
584
+ },
585
+
586
+ isIOS() {
587
+ return /iPad|iPhone|iPod/.test(navigator.userAgent) && !window['MSStream'];
588
+ },
589
+
590
+ isAndroid() {
591
+ return /(android)/i.test(navigator.userAgent);
592
+ },
593
+
594
+ isTouchDevice() {
595
+ return 'ontouchstart' in window || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0;
596
+ },
597
+
598
+ exportCSV(csv, filename) {
599
+ let blob = new Blob([csv], {
600
+ type: 'application/csv;charset=utf-8;'
601
+ });
602
+
603
+ if (window.navigator.msSaveOrOpenBlob) {
604
+ navigator.msSaveOrOpenBlob(blob, filename + '.csv');
605
+ } else {
606
+ let link = document.createElement('a');
607
+
608
+ if (link.download !== undefined) {
609
+ link.setAttribute('href', URL.createObjectURL(blob));
610
+ link.setAttribute('download', filename + '.csv');
611
+ link.style.display = 'none';
612
+ document.body.appendChild(link);
613
+ link.click();
614
+ document.body.removeChild(link);
615
+ } else {
616
+ csv = 'data:text/csv;charset=utf-8,' + csv;
617
+ window.open(encodeURI(csv));
618
+ }
619
+ }
620
+ }
621
+ };
622
+
623
+ var script$2 = {
624
+ name: 'PanelMenuSub',
625
+ emits: ['item-toggle'],
626
+ props: {
627
+ panelId: {
628
+ type: String,
629
+ default: null
630
+ },
631
+ focusedItemId: {
632
+ type: String,
633
+ default: null
634
+ },
635
+ items: {
636
+ type: Array,
637
+ default: null
638
+ },
639
+ level: {
640
+ type: Number,
641
+ default: 0
642
+ },
643
+ template: {
644
+ type: Function,
645
+ default: null
646
+ },
647
+ activeItemPath: {
648
+ type: Object,
649
+ default: null
650
+ },
651
+ exact: {
652
+ type: Boolean,
653
+ default: true
654
+ }
655
+ },
656
+ methods: {
657
+ getItemId(processedItem) {
658
+ return `${this.panelId}_${processedItem.key}`;
659
+ },
660
+ getItemKey(processedItem) {
661
+ return this.getItemId(processedItem);
662
+ },
663
+ getItemProp(processedItem, name) {
664
+ return processedItem && processedItem.item ? ObjectUtils.getItemValue(processedItem.item[name]) : undefined;
665
+ },
666
+ getItemLabel(processedItem) {
667
+ return this.getItemProp(processedItem, 'label');
668
+ },
669
+ isItemActive(processedItem) {
670
+ return this.activeItemPath.some((path) => path.key === processedItem.key);
671
+ },
672
+ isItemVisible(processedItem) {
673
+ return this.getItemProp(processedItem, 'visible') !== false;
674
+ },
675
+ isItemDisabled(processedItem) {
676
+ return this.getItemProp(processedItem, 'disabled');
677
+ },
678
+ isItemFocused(processedItem) {
679
+ return this.focusedItemId === this.getItemId(processedItem);
680
+ },
681
+ isItemGroup(processedItem) {
682
+ return ObjectUtils.isNotEmpty(processedItem.items);
683
+ },
684
+ onItemClick(event, processedItem) {
685
+ const command = this.getItemProp(processedItem, 'command');
686
+
687
+ command && command({ originalEvent: event, item: processedItem.item });
688
+ this.$emit('item-toggle', { processedItem, expanded: !this.isItemActive(processedItem) });
689
+ },
690
+ onItemToggle(event) {
691
+ this.$emit('item-toggle', event);
692
+ },
693
+ onItemActionClick(event, navigate) {
694
+ navigate && navigate(event);
695
+ },
696
+ getAriaSetSize() {
697
+ return this.items.filter((processedItem) => this.isItemVisible(processedItem) && !this.getItemProp(processedItem, 'separator')).length;
698
+ },
699
+ getAriaPosInset(index) {
700
+ return index - this.items.slice(0, index).filter((processedItem) => this.isItemVisible(processedItem) && this.getItemProp(processedItem, 'separator')).length + 1;
701
+ },
702
+ getItemClass(processedItem) {
703
+ return [
704
+ 'p-menuitem',
705
+ this.getItemProp(processedItem, 'class'),
706
+ {
707
+ 'p-focus': this.isItemFocused(processedItem),
708
+ 'p-disabled': this.isItemDisabled(processedItem)
709
+ }
710
+ ];
711
+ },
712
+ getItemActionClass(processedItem, routerProps) {
713
+ return [
714
+ 'p-menuitem-link',
715
+ {
716
+ 'router-link-active': routerProps && routerProps.isActive,
717
+ 'router-link-active-exact': this.exact && routerProps && routerProps.isExactActive
718
+ }
719
+ ];
720
+ },
721
+ getItemIconClass(processedItem) {
722
+ return ['p-menuitem-icon', this.getItemProp(processedItem, 'icon')];
723
+ },
724
+ getItemToggleIconClass(processedItem) {
725
+ return ['p-submenu-icon', this.isItemActive(processedItem) ? 'pi pi-fw pi-chevron-down' : 'pi pi-fw pi-chevron-right'];
726
+ },
727
+ getSeparatorItemClass(processedItem) {
728
+ return ['p-menuitem-separator', this.getItemProp(processedItem, 'class')];
729
+ }
730
+ },
731
+ directives: {
732
+ ripple: Ripple
733
+ }
734
+ };
735
+
736
+ const _hoisted_1$1 = { class: "p-submenu-list" };
737
+ const _hoisted_2$1 = ["id", "aria-label", "aria-expanded", "aria-level", "aria-setsize", "aria-posinset"];
738
+ const _hoisted_3$1 = ["onClick"];
739
+ const _hoisted_4$1 = ["href", "onClick"];
740
+ const _hoisted_5$1 = { class: "p-menuitem-text" };
741
+ const _hoisted_6$1 = ["href", "target"];
742
+ const _hoisted_7$1 = { class: "p-menuitem-text" };
743
+ const _hoisted_8$1 = { class: "p-toggleable-content" };
744
+
745
+ function render$2(_ctx, _cache, $props, $setup, $data, $options) {
746
+ const _component_router_link = resolveComponent("router-link");
747
+ const _component_PanelMenuSub = resolveComponent("PanelMenuSub", true);
748
+ const _directive_ripple = resolveDirective("ripple");
749
+
750
+ return (openBlock(), createElementBlock("ul", _hoisted_1$1, [
751
+ (openBlock(true), createElementBlock(Fragment, null, renderList($props.items, (processedItem, index) => {
752
+ return (openBlock(), createElementBlock(Fragment, {
753
+ key: $options.getItemKey(processedItem)
754
+ }, [
755
+ ($options.isItemVisible(processedItem) && !$options.getItemProp(processedItem, 'separator'))
756
+ ? (openBlock(), createElementBlock("li", {
757
+ key: 0,
758
+ id: $options.getItemId(processedItem),
759
+ style: normalizeStyle($options.getItemProp(processedItem, 'style')),
760
+ class: normalizeClass($options.getItemClass(processedItem)),
761
+ role: "treeitem",
762
+ "aria-label": $options.getItemLabel(processedItem),
763
+ "aria-expanded": $options.isItemGroup(processedItem) ? $options.isItemActive(processedItem) : undefined,
764
+ "aria-level": $props.level + 1,
765
+ "aria-setsize": $options.getAriaSetSize(),
766
+ "aria-posinset": $options.getAriaPosInset(index)
767
+ }, [
768
+ createElementVNode("div", {
769
+ class: "p-menuitem-content",
770
+ onClick: $event => ($options.onItemClick($event, processedItem))
771
+ }, [
772
+ (!$props.template)
773
+ ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
774
+ ($options.getItemProp(processedItem, 'to') && !$options.isItemDisabled(processedItem))
775
+ ? (openBlock(), createBlock(_component_router_link, {
776
+ key: 0,
777
+ to: $options.getItemProp(processedItem, 'to'),
778
+ custom: ""
779
+ }, {
780
+ default: withCtx(({ navigate, href, isActive, isExactActive }) => [
781
+ withDirectives((openBlock(), createElementBlock("a", {
782
+ href: href,
783
+ class: normalizeClass($options.getItemActionClass(processedItem, { isActive, isExactActive })),
784
+ tabindex: "-1",
785
+ "aria-hidden": "true",
786
+ onClick: $event => ($options.onItemActionClick($event, navigate))
787
+ }, [
788
+ ($options.getItemProp(processedItem, 'icon'))
789
+ ? (openBlock(), createElementBlock("span", {
790
+ key: 0,
791
+ class: normalizeClass($options.getItemIconClass(processedItem))
792
+ }, null, 2))
793
+ : createCommentVNode("", true),
794
+ createElementVNode("span", _hoisted_5$1, toDisplayString($options.getItemLabel(processedItem)), 1)
795
+ ], 10, _hoisted_4$1)), [
796
+ [_directive_ripple]
797
+ ])
798
+ ]),
799
+ _: 2
800
+ }, 1032, ["to"]))
801
+ : withDirectives((openBlock(), createElementBlock("a", {
802
+ key: 1,
803
+ href: $options.getItemProp(processedItem, 'url'),
804
+ class: normalizeClass($options.getItemActionClass(processedItem)),
805
+ target: $options.getItemProp(processedItem, 'target'),
806
+ tabindex: "-1",
807
+ "aria-hidden": "true"
808
+ }, [
809
+ ($options.isItemGroup(processedItem))
810
+ ? (openBlock(), createElementBlock("span", {
811
+ key: 0,
812
+ class: normalizeClass($options.getItemToggleIconClass(processedItem))
813
+ }, null, 2))
814
+ : createCommentVNode("", true),
815
+ ($options.getItemProp(processedItem, 'icon'))
816
+ ? (openBlock(), createElementBlock("span", {
817
+ key: 1,
818
+ class: normalizeClass($options.getItemIconClass(processedItem))
819
+ }, null, 2))
820
+ : createCommentVNode("", true),
821
+ createElementVNode("span", _hoisted_7$1, toDisplayString($options.getItemLabel(processedItem)), 1)
822
+ ], 10, _hoisted_6$1)), [
823
+ [_directive_ripple]
824
+ ])
825
+ ], 64))
826
+ : (openBlock(), createBlock(resolveDynamicComponent($props.template), {
827
+ key: 1,
828
+ item: processedItem.item
829
+ }, null, 8, ["item"]))
830
+ ], 8, _hoisted_3$1),
831
+ createVNode(Transition, { name: "p-toggleable-content" }, {
832
+ default: withCtx(() => [
833
+ withDirectives(createElementVNode("div", _hoisted_8$1, [
834
+ ($options.isItemVisible(processedItem) && $options.isItemGroup(processedItem))
835
+ ? (openBlock(), createBlock(_component_PanelMenuSub, {
836
+ key: 0,
837
+ id: $options.getItemId(processedItem) + '_list',
838
+ role: "group",
839
+ panelId: $props.panelId,
840
+ focusedItemId: $props.focusedItemId,
841
+ items: processedItem.items,
842
+ level: $props.level + 1,
843
+ template: $props.template,
844
+ activeItemPath: $props.activeItemPath,
845
+ exact: $props.exact,
846
+ onItemToggle: $options.onItemToggle
847
+ }, null, 8, ["id", "panelId", "focusedItemId", "items", "level", "template", "activeItemPath", "exact", "onItemToggle"]))
848
+ : createCommentVNode("", true)
849
+ ], 512), [
850
+ [vShow, $options.isItemActive(processedItem)]
851
+ ])
852
+ ]),
853
+ _: 2
854
+ }, 1024)
855
+ ], 14, _hoisted_2$1))
856
+ : createCommentVNode("", true),
857
+ ($options.isItemVisible(processedItem) && $options.getItemProp(processedItem, 'separator'))
858
+ ? (openBlock(), createElementBlock("li", {
859
+ key: 1,
860
+ style: normalizeStyle($options.getItemProp(processedItem, 'style')),
861
+ class: normalizeClass($options.getSeparatorItemClass(processedItem)),
862
+ role: "separator"
863
+ }, null, 6))
864
+ : createCommentVNode("", true)
865
+ ], 64))
866
+ }), 128))
867
+ ]))
868
+ }
869
+
870
+ script$2.render = render$2;
3
871
 
4
872
  var script$1 = {
5
- name: 'PanelMenuSub',
6
- emits: ['item-toggle'],
873
+ name: 'PanelMenuList',
874
+ emits: ['item-toggle', 'header-focus'],
7
875
  props: {
8
- model: {
9
- type: null,
876
+ panelId: {
877
+ type: String,
878
+ default: null
879
+ },
880
+ items: {
881
+ type: Array,
10
882
  default: null
11
883
  },
12
884
  template: {
@@ -14,7 +886,7 @@ var script$1 = {
14
886
  default: null
15
887
  },
16
888
  expandedKeys: {
17
- type: null,
889
+ type: Object,
18
890
  default: null
19
891
  },
20
892
  exact: {
@@ -24,202 +896,319 @@ var script$1 = {
24
896
  },
25
897
  data() {
26
898
  return {
27
- activeItem: null
899
+ focused: false,
900
+ focusedItem: null,
901
+ activeItemPath: []
28
902
  };
29
903
  },
904
+ watch: {
905
+ expandedKeys(newValue) {
906
+ this.autoUpdateActiveItemPath(newValue);
907
+ }
908
+ },
909
+ mounted() {
910
+ this.autoUpdateActiveItemPath(this.expandedKeys);
911
+ },
30
912
  methods: {
31
- onItemClick(event, item, navigate) {
32
- if (this.isActive(item) && this.activeItem === null) {
33
- this.activeItem = item;
913
+ getItemProp(processedItem, name) {
914
+ return processedItem && processedItem.item ? ObjectUtils.getItemValue(processedItem.item[name]) : undefined;
915
+ },
916
+ isItemVisible(processedItem) {
917
+ return this.getItemProp(processedItem, 'visible') !== false;
918
+ },
919
+ isItemDisabled(processedItem) {
920
+ return this.getItemProp(processedItem, 'disabled');
921
+ },
922
+ isItemActive(processedItem) {
923
+ return this.activeItemPath.some((path) => path.key === processedItem.parentKey);
924
+ },
925
+ isItemGroup(processedItem) {
926
+ return ObjectUtils.isNotEmpty(processedItem.items);
927
+ },
928
+ onFocus(event) {
929
+ this.focused = true;
930
+ this.focusedItem = this.focusedItem || (this.isElementInPanel(event, event.relatedTarget) ? this.findFirstItem() : this.findLastItem());
931
+ },
932
+ onBlur() {
933
+ this.focused = false;
934
+ this.focusedItem = null;
935
+ },
936
+ onKeyDown(event) {
937
+ switch (event.code) {
938
+ case 'ArrowDown':
939
+ this.onArrowDownKey(event);
940
+ break;
941
+
942
+ case 'ArrowUp':
943
+ this.onArrowUpKey(event);
944
+ break;
945
+
946
+ case 'ArrowLeft':
947
+ this.onArrowLeftKey(event);
948
+ break;
949
+
950
+ case 'ArrowRight':
951
+ this.onArrowRightKey(event);
952
+ break;
953
+
954
+ case 'Home':
955
+ this.onHomeKey(event);
956
+ break;
957
+
958
+ case 'End':
959
+ this.onEndKey(event);
960
+ break;
961
+
962
+ case 'Space':
963
+ this.onSpaceKey(event);
964
+ break;
965
+
966
+ case 'Enter':
967
+ this.onEnterKey(event);
968
+ break;
34
969
  }
970
+ },
971
+ onArrowDownKey(event) {
972
+ const processedItem = ObjectUtils.isNotEmpty(this.focusedItem) ? this.findNextItem(this.focusedItem) : this.findFirstItem();
35
973
 
36
- if (this.disabled(item)) {
37
- event.preventDefault();
974
+ this.changeFocusedItem({ originalEvent: event, processedItem, focusOnNext: true });
975
+ event.preventDefault();
976
+ },
977
+ onArrowUpKey(event) {
978
+ const processedItem = ObjectUtils.isNotEmpty(this.focusedItem) ? this.findPrevItem(this.focusedItem) : this.findLastItem();
38
979
 
39
- return;
980
+ this.changeFocusedItem({ originalEvent: event, processedItem, selfCheck: true });
981
+ event.preventDefault();
982
+ },
983
+ onArrowLeftKey(event) {
984
+ if (ObjectUtils.isNotEmpty(this.focusedItem)) {
985
+ const matched = this.activeItemPath.some((p) => p.key === this.focusedItem.key);
986
+
987
+ if (matched) {
988
+ this.activeItemPath = this.activeItemPath.filter((p) => p.key !== this.focusedItem.key);
989
+ } else {
990
+ this.focusedItem = ObjectUtils.isNotEmpty(this.focusedItem.parent) ? this.focusedItem.parent : this.focusedItem;
991
+ }
992
+
993
+ event.preventDefault();
40
994
  }
995
+ },
996
+ onArrowRightKey(event) {
997
+ if (ObjectUtils.isNotEmpty(this.focusedItem)) {
998
+ const grouped = this.isItemGroup(this.focusedItem);
41
999
 
42
- if (item.command) {
43
- item.command({
44
- originalEvent: event,
45
- item: item
46
- });
1000
+ if (grouped) {
1001
+ const matched = this.activeItemPath.some((p) => p.key === this.focusedItem.key);
1002
+
1003
+ if (matched) {
1004
+ this.onArrowDownKey(event);
1005
+ } else {
1006
+ this.activeItemPath = this.activeItemPath.filter((p) => p.parentKey !== this.focusedItem.parentKey);
1007
+ this.activeItemPath.push(this.focusedItem);
1008
+ }
1009
+ }
1010
+
1011
+ event.preventDefault();
47
1012
  }
1013
+ },
1014
+ onHomeKey(event) {
1015
+ this.changeFocusedItem({ originalEvent: event, processedItem: this.findFirstItem(), allowHeaderFocus: false });
1016
+ event.preventDefault();
1017
+ },
1018
+ onEndKey(event) {
1019
+ this.changeFocusedItem({ originalEvent: event, processedItem: this.findLastItem(), focusOnNext: true, allowHeaderFocus: false });
1020
+ event.preventDefault();
1021
+ },
1022
+ onEnterKey(event) {
1023
+ if (ObjectUtils.isNotEmpty(this.focusedItem)) {
1024
+ const element = DomHandler.findSingle(this.$el, `li[id="${`${this.focusedItemId}`}"]`);
1025
+ const anchorElement = element && DomHandler.findSingle(element, '.p-menuitem-link');
48
1026
 
49
- if (this.activeItem && this.activeItem === item) this.activeItem = null;
50
- else this.activeItem = item;
1027
+ anchorElement ? anchorElement.click() : element && element.click();
1028
+ }
51
1029
 
52
- this.$emit('item-toggle', { item: item, expanded: this.activeItem != null });
1030
+ event.preventDefault();
1031
+ },
1032
+ onSpaceKey(event) {
1033
+ this.onEnterKey(event);
1034
+ },
1035
+ onItemToggle(event) {
1036
+ const { processedItem, expanded } = event;
53
1037
 
54
- if (item.to && navigate) {
55
- navigate(event);
1038
+ if (this.expandedKeys) {
1039
+ this.$emit('item-toggle', { item: processedItem.item, expanded });
1040
+ } else {
1041
+ this.activeItemPath = this.activeItemPath.filter((p) => p.parentKey !== processedItem.parentKey);
1042
+ expanded && this.activeItemPath.push(processedItem);
56
1043
  }
1044
+
1045
+ this.focusedItem = processedItem;
1046
+ DomHandler.focus(this.$el);
1047
+ },
1048
+ isElementInPanel(event, element) {
1049
+ const panel = event.currentTarget.closest('.p-panelmenu-panel');
1050
+
1051
+ return panel && panel.contains(element);
1052
+ },
1053
+ isVisibleItem(processedItem) {
1054
+ return !!processedItem && (processedItem.level === 0 || this.isItemActive(processedItem)) && this.isItemVisible(processedItem);
57
1055
  },
58
- onItemKeydown(event, item) {
59
- if (event.which === 13) {
60
- this.onItemClick(event, item);
1056
+ isValidItem(processedItem) {
1057
+ return !!processedItem && !this.isItemDisabled(processedItem);
1058
+ },
1059
+ findFirstItem() {
1060
+ return this.visibleItems.find((processedItem) => this.isValidItem(processedItem));
1061
+ },
1062
+ findLastItem() {
1063
+ return ObjectUtils.findLast(this.visibleItems, (processedItem) => this.isValidItem(processedItem));
1064
+ },
1065
+ findNextItem(processedItem) {
1066
+ const index = this.visibleItems.findIndex((item) => item.key === processedItem.key);
1067
+ const matchedItem = index < this.visibleItems.length - 1 ? this.visibleItems.slice(index + 1).find((pItem) => this.isValidItem(pItem)) : undefined;
1068
+
1069
+ return matchedItem || processedItem;
1070
+ },
1071
+ findPrevItem(processedItem) {
1072
+ const index = this.visibleItems.findIndex((item) => item.key === processedItem.key);
1073
+ const matchedItem = index > 0 ? ObjectUtils.findLast(this.visibleItems.slice(0, index), (pItem) => this.isValidItem(pItem)) : undefined;
1074
+
1075
+ return matchedItem || processedItem;
1076
+ },
1077
+ changeFocusedItem(event) {
1078
+ const { originalEvent, processedItem, focusOnNext, selfCheck, allowHeaderFocus = true } = event;
1079
+
1080
+ if (ObjectUtils.isNotEmpty(this.focusedItem) && this.focusedItem.key !== processedItem.key) {
1081
+ this.focusedItem = processedItem;
1082
+ this.scrollInView();
1083
+ } else if (allowHeaderFocus) {
1084
+ this.$emit('header-focus', { originalEvent, focusOnNext, selfCheck });
61
1085
  }
62
1086
  },
63
- getItemClass(item) {
64
- return ['p-menuitem', item.className];
1087
+ scrollInView() {
1088
+ const element = DomHandler.findSingle(this.$el, `li[id="${`${this.focusedItemId}`}"]`);
1089
+
1090
+ if (element) {
1091
+ element.scrollIntoView && element.scrollIntoView({ block: 'nearest', inline: 'start' });
1092
+ }
65
1093
  },
66
- linkClass(item, routerProps) {
67
- return [
68
- 'p-menuitem-link',
69
- {
70
- 'p-disabled': this.disabled(item),
71
- 'router-link-active': routerProps && routerProps.isActive,
72
- 'router-link-active-exact': this.exact && routerProps && routerProps.isExactActive
1094
+ autoUpdateActiveItemPath(expandedKeys) {
1095
+ this.activeItemPath = Object.entries(expandedKeys || {}).reduce((acc, [key, val]) => {
1096
+ if (val) {
1097
+ const processedItem = this.findProcessedItemByItemKey(key);
1098
+
1099
+ processedItem && acc.push(processedItem);
73
1100
  }
74
- ];
1101
+
1102
+ return acc;
1103
+ }, []);
75
1104
  },
76
- isActive(item) {
77
- return this.expandedKeys ? this.expandedKeys[item.key] : item === this.activeItem;
1105
+ findProcessedItemByItemKey(key, processedItems, level = 0) {
1106
+ processedItems = processedItems || (level === 0 && this.processedItems);
1107
+
1108
+ if (!processedItems) return null;
1109
+
1110
+ for (let i = 0; i < processedItems.length; i++) {
1111
+ const processedItem = processedItems[i];
1112
+
1113
+ if (this.getItemProp(processedItem, 'key') === key) return processedItem;
1114
+
1115
+ const matchedItem = this.findProcessedItemByItemKey(key, processedItem.items, level + 1);
1116
+
1117
+ if (matchedItem) return matchedItem;
1118
+ }
78
1119
  },
79
- getSubmenuIcon(item) {
80
- const active = this.isActive(item);
1120
+ createProcessedItems(items, level = 0, parent = {}, parentKey = '') {
1121
+ const processedItems = [];
81
1122
 
82
- return ['p-panelmenu-icon pi pi-fw', { 'pi-angle-right': !active, 'pi-angle-down': active }];
1123
+ items &&
1124
+ items.forEach((item, index) => {
1125
+ const key = (parentKey !== '' ? parentKey + '_' : '') + index;
1126
+ const newItem = {
1127
+ item,
1128
+ index,
1129
+ level,
1130
+ key,
1131
+ parent,
1132
+ parentKey
1133
+ };
1134
+
1135
+ newItem['items'] = this.createProcessedItems(item.items, level + 1, newItem, key);
1136
+ processedItems.push(newItem);
1137
+ });
1138
+
1139
+ return processedItems;
83
1140
  },
84
- visible(item) {
85
- return typeof item.visible === 'function' ? item.visible() : item.visible !== false;
1141
+ flatItems(processedItems, processedFlattenItems = []) {
1142
+ processedItems &&
1143
+ processedItems.forEach((processedItem) => {
1144
+ if (this.isVisibleItem(processedItem)) {
1145
+ processedFlattenItems.push(processedItem);
1146
+ this.flatItems(processedItem.items, processedFlattenItems);
1147
+ }
1148
+ });
1149
+
1150
+ return processedFlattenItems;
1151
+ }
1152
+ },
1153
+ computed: {
1154
+ processedItems() {
1155
+ return this.createProcessedItems(this.items || []);
86
1156
  },
87
- disabled(item) {
88
- return typeof item.disabled === 'function' ? item.disabled() : item.disabled;
1157
+ visibleItems() {
1158
+ return this.flatItems(this.processedItems);
89
1159
  },
90
- label(item) {
91
- return typeof item.label === 'function' ? item.label() : item.label;
1160
+ focusedItemId() {
1161
+ return ObjectUtils.isNotEmpty(this.focusedItem) ? `${this.panelId}_${this.focusedItem.key}` : null;
92
1162
  }
1163
+ },
1164
+ components: {
1165
+ PanelMenuSub: script$2
93
1166
  }
94
1167
  };
95
1168
 
96
- const _hoisted_1$1 = {
97
- class: "p-submenu-list",
98
- role: "tree"
99
- };
100
- const _hoisted_2$1 = ["href", "onClick", "aria-expanded"];
101
- const _hoisted_3$1 = { class: "p-menuitem-text" };
102
- const _hoisted_4$1 = ["href", "target", "onClick", "onKeydown", "aria-expanded", "tabindex"];
103
- const _hoisted_5$1 = { class: "p-menuitem-text" };
104
- const _hoisted_6$1 = { class: "p-toggleable-content" };
105
-
106
1169
  function render$1(_ctx, _cache, $props, $setup, $data, $options) {
107
- const _component_router_link = resolveComponent("router-link");
108
- const _component_PanelMenuSub = resolveComponent("PanelMenuSub", true);
1170
+ const _component_PanelMenuSub = resolveComponent("PanelMenuSub");
109
1171
 
110
- return (openBlock(), createElementBlock("ul", _hoisted_1$1, [
111
- (openBlock(true), createElementBlock(Fragment, null, renderList($props.model, (item, i) => {
112
- return (openBlock(), createElementBlock(Fragment, {
113
- key: $options.label(item) + i.toString()
114
- }, [
115
- ($options.visible(item) && !item.separator)
116
- ? (openBlock(), createElementBlock("li", {
117
- key: 0,
118
- role: "none",
119
- class: normalizeClass($options.getItemClass(item)),
120
- style: normalizeStyle(item.style)
121
- }, [
122
- (!$props.template)
123
- ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
124
- (item.to && !$options.disabled(item))
125
- ? (openBlock(), createBlock(_component_router_link, {
126
- key: 0,
127
- to: item.to,
128
- custom: ""
129
- }, {
130
- default: withCtx(({ navigate, href, isActive: isRouterActive, isExactActive }) => [
131
- createElementVNode("a", {
132
- href: href,
133
- class: normalizeClass($options.linkClass(item, { isActive: isRouterActive, isExactActive })),
134
- onClick: $event => ($options.onItemClick($event, item, navigate)),
135
- role: "treeitem",
136
- "aria-expanded": $options.isActive(item)
137
- }, [
138
- createElementVNode("span", {
139
- class: normalizeClass(['p-menuitem-icon', item.icon])
140
- }, null, 2),
141
- createElementVNode("span", _hoisted_3$1, toDisplayString($options.label(item)), 1)
142
- ], 10, _hoisted_2$1)
143
- ]),
144
- _: 2
145
- }, 1032, ["to"]))
146
- : (openBlock(), createElementBlock("a", {
147
- key: 1,
148
- href: item.url,
149
- class: normalizeClass($options.linkClass(item)),
150
- target: item.target,
151
- onClick: $event => ($options.onItemClick($event, item)),
152
- onKeydown: $event => ($options.onItemKeydown($event, item)),
153
- role: "treeitem",
154
- "aria-expanded": $options.isActive(item),
155
- tabindex: $options.disabled(item) ? null : '0'
156
- }, [
157
- (item.items)
158
- ? (openBlock(), createElementBlock("span", {
159
- key: 0,
160
- class: normalizeClass($options.getSubmenuIcon(item))
161
- }, null, 2))
162
- : createCommentVNode("", true),
163
- createElementVNode("span", {
164
- class: normalizeClass(['p-menuitem-icon', item.icon])
165
- }, null, 2),
166
- createElementVNode("span", _hoisted_5$1, toDisplayString($options.label(item)), 1)
167
- ], 42, _hoisted_4$1))
168
- ], 64))
169
- : (openBlock(), createBlock(resolveDynamicComponent($props.template), {
170
- key: 1,
171
- item: item
172
- }, null, 8, ["item"])),
173
- createVNode(Transition, { name: "p-toggleable-content" }, {
174
- default: withCtx(() => [
175
- withDirectives(createElementVNode("div", _hoisted_6$1, [
176
- ($options.visible(item) && item.items)
177
- ? (openBlock(), createBlock(_component_PanelMenuSub, {
178
- key: $options.label(item) + '_sub_',
179
- model: item.items,
180
- template: $props.template,
181
- expandedKeys: $props.expandedKeys,
182
- onItemToggle: _cache[0] || (_cache[0] = $event => (_ctx.$emit('item-toggle', $event))),
183
- exact: $props.exact
184
- }, null, 8, ["model", "template", "expandedKeys", "exact"]))
185
- : createCommentVNode("", true)
186
- ], 512), [
187
- [vShow, $options.isActive(item)]
188
- ])
189
- ]),
190
- _: 2
191
- }, 1024)
192
- ], 6))
193
- : createCommentVNode("", true),
194
- ($options.visible(item) && item.separator)
195
- ? (openBlock(), createElementBlock("li", {
196
- key: 'separator' + i.toString(),
197
- class: normalizeClass(['p-menu-separator', item.class]),
198
- style: normalizeStyle(item.style)
199
- }, null, 6))
200
- : createCommentVNode("", true)
201
- ], 64))
202
- }), 128))
203
- ]))
1172
+ return (openBlock(), createBlock(_component_PanelMenuSub, {
1173
+ id: $props.panelId + '_list',
1174
+ class: "p-panelmenu-root-list",
1175
+ role: "tree",
1176
+ tabindex: -1,
1177
+ "aria-activedescendant": $data.focused ? $options.focusedItemId : undefined,
1178
+ panelId: $props.panelId,
1179
+ focusedItemId: $data.focused ? $options.focusedItemId : undefined,
1180
+ items: $options.processedItems,
1181
+ template: $props.template,
1182
+ activeItemPath: $data.activeItemPath,
1183
+ exact: $props.exact,
1184
+ onFocus: $options.onFocus,
1185
+ onBlur: $options.onBlur,
1186
+ onKeydown: $options.onKeyDown,
1187
+ onItemToggle: $options.onItemToggle
1188
+ }, null, 8, ["id", "aria-activedescendant", "panelId", "focusedItemId", "items", "template", "activeItemPath", "exact", "onFocus", "onBlur", "onKeydown", "onItemToggle"]))
204
1189
  }
205
1190
 
206
1191
  script$1.render = render$1;
207
1192
 
208
1193
  var script = {
209
1194
  name: 'PanelMenu',
210
- emits: ['update:expandedKeys'],
1195
+ emits: ['update:expandedKeys', 'panel-open', 'panel-close'],
211
1196
  props: {
212
1197
  model: {
213
1198
  type: Array,
214
1199
  default: null
215
1200
  },
216
1201
  expandedKeys: {
217
- type: null,
1202
+ type: Object,
218
1203
  default: null
219
1204
  },
220
1205
  exact: {
221
1206
  type: Boolean,
222
1207
  default: true
1208
+ },
1209
+ tabindex: {
1210
+ type: Number,
1211
+ default: 0
223
1212
  }
224
1213
  },
225
1214
  data() {
@@ -228,204 +1217,309 @@ var script = {
228
1217
  };
229
1218
  },
230
1219
  methods: {
231
- onItemClick(event, item, navigate) {
232
- if (this.isActive(item) && this.activeItem === null) {
233
- this.activeItem = item;
234
- }
235
-
236
- if (this.disabled(item)) {
1220
+ getItemProp(item, name) {
1221
+ return item ? ObjectUtils.getItemValue(item[name]) : undefined;
1222
+ },
1223
+ getItemLabel(item) {
1224
+ return this.getItemProp(item, 'label');
1225
+ },
1226
+ isItemActive(item) {
1227
+ return this.expandedKeys ? this.expandedKeys[this.getItemProp(item, 'key')] : item === this.activeItem;
1228
+ },
1229
+ isItemVisible(item) {
1230
+ return this.getItemProp(item, 'visible') !== false;
1231
+ },
1232
+ isItemDisabled(item) {
1233
+ return this.getItemProp(item, 'disabled');
1234
+ },
1235
+ getPanelId(index) {
1236
+ return `${this.id}_${index}`;
1237
+ },
1238
+ getPanelKey(index) {
1239
+ return this.getPanelId(index);
1240
+ },
1241
+ getHeaderId(index) {
1242
+ return `${this.getPanelId(index)}_header`;
1243
+ },
1244
+ getContentId(index) {
1245
+ return `${this.getPanelId(index)}_content`;
1246
+ },
1247
+ onHeaderClick(event, item) {
1248
+ if (this.isItemDisabled(item)) {
237
1249
  event.preventDefault();
238
1250
 
239
1251
  return;
240
1252
  }
241
1253
 
242
1254
  if (item.command) {
243
- item.command({
244
- originalEvent: event,
245
- item: item
246
- });
1255
+ item.command({ originalEvent: event, item });
247
1256
  }
248
1257
 
249
- if (this.activeItem && this.activeItem === item) this.activeItem = null;
250
- else this.activeItem = item;
1258
+ this.changeActiveItem(event, item);
1259
+ DomHandler$1.focus(event.currentTarget);
1260
+ },
1261
+ onHeaderKeyDown(event, item) {
1262
+ switch (event.code) {
1263
+ case 'ArrowDown':
1264
+ this.onHeaderArrowDownKey(event);
1265
+ break;
1266
+
1267
+ case 'ArrowUp':
1268
+ this.onHeaderArrowUpKey(event);
1269
+ break;
1270
+
1271
+ case 'Home':
1272
+ this.onHeaderHomeKey(event);
1273
+ break;
251
1274
 
252
- this.updateExpandedKeys({ item: item, expanded: this.activeItem != null });
1275
+ case 'End':
1276
+ this.onHeaderEndKey(event);
1277
+ break;
253
1278
 
254
- if (item.to && navigate) {
255
- navigate(event);
1279
+ case 'Enter':
1280
+ case 'Space':
1281
+ this.onHeaderEnterKey(event, item);
1282
+ break;
256
1283
  }
257
1284
  },
258
- onItemKeydown(event, item) {
259
- if (event.which === 13) {
260
- this.onItemClick(event, item);
1285
+ onHeaderArrowDownKey(event) {
1286
+ const rootList = DomHandler$1.hasClass(event.currentTarget, 'p-highlight') ? DomHandler$1.findSingle(event.currentTarget.nextElementSibling, '.p-panelmenu-root-list') : null;
1287
+
1288
+ rootList ? DomHandler$1.focus(rootList) : this.updateFocusedHeader({ originalEvent: event, focusOnNext: true });
1289
+ event.preventDefault();
1290
+ },
1291
+ onHeaderArrowUpKey(event) {
1292
+ const prevHeader = this.findPrevHeader(event.currentTarget.parentElement) || this.findLastHeader();
1293
+ const rootList = DomHandler$1.hasClass(prevHeader, 'p-highlight') ? DomHandler$1.findSingle(prevHeader.nextElementSibling, '.p-panelmenu-root-list') : null;
1294
+
1295
+ rootList ? DomHandler$1.focus(rootList) : this.updateFocusedHeader({ originalEvent: event, focusOnNext: false });
1296
+ event.preventDefault();
1297
+ },
1298
+ onHeaderHomeKey(event) {
1299
+ this.changeFocusedHeader(event, this.findFirstHeader());
1300
+ event.preventDefault();
1301
+ },
1302
+ onHeaderEndKey(event) {
1303
+ this.changeFocusedHeader(event, this.findLastHeader());
1304
+ event.preventDefault();
1305
+ },
1306
+ onHeaderEnterKey(event, item) {
1307
+ const headerAction = DomHandler$1.findSingle(event.currentTarget, '.p-panelmenu-header-action');
1308
+
1309
+ headerAction ? headerAction.click() : this.onHeaderClick(event, item);
1310
+ event.preventDefault();
1311
+ },
1312
+ onHeaderActionClick(event, navigate) {
1313
+ navigate && navigate(event);
1314
+ },
1315
+ findNextHeader(panelElement, selfCheck = false) {
1316
+ const nextPanelElement = selfCheck ? panelElement : panelElement.nextElementSibling;
1317
+ const headerElement = DomHandler$1.findSingle(nextPanelElement, '.p-panelmenu-header');
1318
+
1319
+ return headerElement ? (DomHandler$1.hasClass(headerElement, 'p-disabled') ? this.findNextHeader(headerElement.parentElement) : headerElement) : null;
1320
+ },
1321
+ findPrevHeader(panelElement, selfCheck = false) {
1322
+ const prevPanelElement = selfCheck ? panelElement : panelElement.previousElementSibling;
1323
+ const headerElement = DomHandler$1.findSingle(prevPanelElement, '.p-panelmenu-header');
1324
+
1325
+ return headerElement ? (DomHandler$1.hasClass(headerElement, 'p-disabled') ? this.findPrevHeader(headerElement.parentElement) : headerElement) : null;
1326
+ },
1327
+ findFirstHeader() {
1328
+ return this.findNextHeader(this.$el.firstElementChild, true);
1329
+ },
1330
+ findLastHeader() {
1331
+ return this.findPrevHeader(this.$el.lastElementChild, true);
1332
+ },
1333
+ updateFocusedHeader(event) {
1334
+ const { originalEvent, focusOnNext, selfCheck } = event;
1335
+ const panelElement = originalEvent.currentTarget.closest('.p-panelmenu-panel');
1336
+ const header = selfCheck ? DomHandler$1.findSingle(panelElement, '.p-panelmenu-header') : focusOnNext ? this.findNextHeader(panelElement) : this.findPrevHeader(panelElement);
1337
+
1338
+ header ? this.changeFocusedHeader(originalEvent, header) : focusOnNext ? this.onHeaderHomeKey(originalEvent) : this.onHeaderEndKey(originalEvent);
1339
+ },
1340
+ changeActiveItem(event, item, selfActive = false) {
1341
+ if (!this.isItemDisabled(item)) {
1342
+ this.activeItem = selfActive ? item : this.activeItem && this.activeItem === item ? null : item;
1343
+
1344
+ const active = this.isItemActive(item);
1345
+ const eventName = active ? 'panel-open' : 'panel-close';
1346
+
1347
+ this.changeExpandedKeys({ item, expanded: !active });
1348
+ this.$emit(eventName, { originalEvent: event, item });
261
1349
  }
262
1350
  },
263
- updateExpandedKeys(event) {
1351
+ changeExpandedKeys({ item, expanded = false }) {
264
1352
  if (this.expandedKeys) {
265
- let item = event.item;
266
1353
  let _keys = { ...this.expandedKeys };
267
1354
 
268
- if (event.expanded) _keys[item.key] = true;
1355
+ if (expanded) _keys[item.key] = true;
269
1356
  else delete _keys[item.key];
270
1357
 
271
1358
  this.$emit('update:expandedKeys', _keys);
272
1359
  }
273
1360
  },
274
- getPanelClass(item) {
275
- return ['p-panelmenu-panel', item.class];
1361
+ changeFocusedHeader(event, element) {
1362
+ element && DomHandler$1.focus(element);
276
1363
  },
277
- getPanelToggleIcon(item) {
278
- const active = this.isActive(item);
279
-
280
- return ['p-panelmenu-icon pi', { 'pi-chevron-right': !active, ' pi-chevron-down': active }];
1364
+ getPanelClass(item) {
1365
+ return ['p-panelmenu-panel', this.getItemProp(item, 'class')];
281
1366
  },
282
- getPanelIcon(item) {
283
- return ['p-menuitem-icon', item.icon];
1367
+ getHeaderClass(item) {
1368
+ return [
1369
+ 'p-panelmenu-header',
1370
+ this.getItemProp(item, 'headerClass'),
1371
+ {
1372
+ 'p-highlight': this.isItemActive(item),
1373
+ 'p-disabled': this.isItemDisabled(item)
1374
+ }
1375
+ ];
284
1376
  },
285
- getHeaderLinkClass(item, routerProps) {
1377
+ getHeaderActionClass(item, routerProps) {
286
1378
  return [
287
- 'p-panelmenu-header-link',
1379
+ 'p-panelmenu-header-action',
288
1380
  {
289
1381
  'router-link-active': routerProps && routerProps.isActive,
290
1382
  'router-link-active-exact': this.exact && routerProps && routerProps.isExactActive
291
1383
  }
292
1384
  ];
293
1385
  },
294
- isActive(item) {
295
- return this.expandedKeys ? this.expandedKeys[item.key] : item === this.activeItem;
296
- },
297
- getHeaderClass(item) {
298
- return ['p-component p-panelmenu-header', { 'p-highlight': this.isActive(item), 'p-disabled': this.disabled(item) }];
299
- },
300
- visible(item) {
301
- return typeof item.visible === 'function' ? item.visible() : item.visible !== false;
1386
+ getHeaderIconClass(item) {
1387
+ return ['p-menuitem-icon', this.getItemProp(item, 'icon')];
302
1388
  },
303
- disabled(item) {
304
- return typeof item.disabled === 'function' ? item.disabled() : item.disabled;
305
- },
306
- label(item) {
307
- return typeof item.label === 'function' ? item.label() : item.label;
1389
+ getHeaderToggleIconClass(item) {
1390
+ return ['p-submenu-icon', this.isItemActive(item) ? 'pi pi-chevron-down' : 'pi pi-chevron-right'];
308
1391
  }
309
1392
  },
310
1393
  computed: {
311
- ariaId() {
312
- return UniqueComponentId();
1394
+ id() {
1395
+ return this.$attrs.id || UniqueComponentId();
313
1396
  }
314
1397
  },
315
1398
  components: {
316
- PanelMenuSub: script$1
1399
+ PanelMenuList: script$1
317
1400
  }
318
1401
  };
319
1402
 
320
- const _hoisted_1 = { class: "p-panelmenu p-component" };
321
- const _hoisted_2 = ["href", "onClick"];
322
- const _hoisted_3 = { class: "p-menuitem-text" };
323
- const _hoisted_4 = ["id", "href", "onClick", "onKeydown", "tabindex", "aria-expanded", "aria-controls"];
1403
+ const _hoisted_1 = ["id"];
1404
+ const _hoisted_2 = ["id", "tabindex", "aria-label", "aria-expanded", "aria-controls", "aria-disabled", "onClick", "onKeydown"];
1405
+ const _hoisted_3 = { class: "p-panelmenu-header-content" };
1406
+ const _hoisted_4 = ["href", "onClick"];
324
1407
  const _hoisted_5 = { class: "p-menuitem-text" };
325
- const _hoisted_6 = ["id", "aria-labelledby"];
326
- const _hoisted_7 = {
1408
+ const _hoisted_6 = ["href"];
1409
+ const _hoisted_7 = { class: "p-menuitem-text" };
1410
+ const _hoisted_8 = ["id", "aria-labelledby"];
1411
+ const _hoisted_9 = {
327
1412
  key: 0,
328
1413
  class: "p-panelmenu-content"
329
1414
  };
330
1415
 
331
1416
  function render(_ctx, _cache, $props, $setup, $data, $options) {
332
1417
  const _component_router_link = resolveComponent("router-link");
333
- const _component_PanelMenuSub = resolveComponent("PanelMenuSub");
1418
+ const _component_PanelMenuList = resolveComponent("PanelMenuList");
334
1419
 
335
- return (openBlock(), createElementBlock("div", _hoisted_1, [
1420
+ return (openBlock(), createElementBlock("div", {
1421
+ id: $options.id,
1422
+ class: "p-panelmenu p-component"
1423
+ }, [
336
1424
  (openBlock(true), createElementBlock(Fragment, null, renderList($props.model, (item, index) => {
337
1425
  return (openBlock(), createElementBlock(Fragment, {
338
- key: $options.label(item) + '_' + index
1426
+ key: $options.getPanelKey(index)
339
1427
  }, [
340
- ($options.visible(item))
1428
+ ($options.isItemVisible(item))
341
1429
  ? (openBlock(), createElementBlock("div", {
342
1430
  key: 0,
343
- class: normalizeClass($options.getPanelClass(item)),
344
- style: normalizeStyle(item.style)
1431
+ style: normalizeStyle($options.getItemProp(item, 'style')),
1432
+ class: normalizeClass($options.getPanelClass(item))
345
1433
  }, [
346
1434
  createElementVNode("div", {
1435
+ id: $options.getHeaderId(index),
347
1436
  class: normalizeClass($options.getHeaderClass(item)),
348
- style: normalizeStyle(item.style)
1437
+ tabindex: $options.isItemDisabled(item) ? -1 : $props.tabindex,
1438
+ role: "button",
1439
+ "aria-label": $options.getItemLabel(item),
1440
+ "aria-expanded": $options.isItemActive(item),
1441
+ "aria-controls": $options.getContentId(index),
1442
+ "aria-disabled": $options.isItemDisabled(item),
1443
+ onClick: $event => ($options.onHeaderClick($event, item)),
1444
+ onKeydown: $event => ($options.onHeaderKeyDown($event, item))
349
1445
  }, [
350
- (!_ctx.$slots.item)
351
- ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
352
- (item.to && !$options.disabled(item))
353
- ? (openBlock(), createBlock(_component_router_link, {
354
- key: 0,
355
- to: item.to,
356
- custom: ""
357
- }, {
358
- default: withCtx(({ navigate, href, isActive, isExactActive }) => [
359
- createElementVNode("a", {
360
- href: href,
361
- class: normalizeClass($options.getHeaderLinkClass(item, { isActive, isExactActive })),
362
- onClick: $event => ($options.onItemClick($event, item, navigate)),
363
- role: "treeitem"
364
- }, [
365
- (item.icon)
366
- ? (openBlock(), createElementBlock("span", {
367
- key: 0,
368
- class: normalizeClass($options.getPanelIcon(item))
369
- }, null, 2))
370
- : createCommentVNode("", true),
371
- createElementVNode("span", _hoisted_3, toDisplayString($options.label(item)), 1)
372
- ], 10, _hoisted_2)
373
- ]),
374
- _: 2
375
- }, 1032, ["to"]))
376
- : (openBlock(), createElementBlock("a", {
377
- key: 1,
378
- id: $options.ariaId + '_header_' + index,
379
- href: item.url,
380
- class: normalizeClass($options.getHeaderLinkClass(item)),
381
- onClick: $event => ($options.onItemClick($event, item)),
382
- onKeydown: $event => ($options.onItemKeydown($event, item)),
383
- tabindex: $options.disabled(item) ? null : '0',
384
- "aria-expanded": $options.isActive(item),
385
- "aria-controls": $options.ariaId + '_content_' + index
386
- }, [
387
- (item.items)
388
- ? (openBlock(), createElementBlock("span", {
389
- key: 0,
390
- class: normalizeClass($options.getPanelToggleIcon(item))
391
- }, null, 2))
392
- : createCommentVNode("", true),
393
- (item.icon)
394
- ? (openBlock(), createElementBlock("span", {
395
- key: 1,
396
- class: normalizeClass($options.getPanelIcon(item))
397
- }, null, 2))
398
- : createCommentVNode("", true),
399
- createElementVNode("span", _hoisted_5, toDisplayString($options.label(item)), 1)
400
- ], 42, _hoisted_4))
401
- ], 64))
402
- : (openBlock(), createBlock(resolveDynamicComponent(_ctx.$slots.item), {
403
- key: 1,
404
- item: item
405
- }, null, 8, ["item"]))
406
- ], 6),
1446
+ createElementVNode("div", _hoisted_3, [
1447
+ (!_ctx.$slots.item)
1448
+ ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
1449
+ ($options.getItemProp(item, 'to') && !$options.isItemDisabled(item))
1450
+ ? (openBlock(), createBlock(_component_router_link, {
1451
+ key: 0,
1452
+ to: $options.getItemProp(item, 'to'),
1453
+ custom: ""
1454
+ }, {
1455
+ default: withCtx(({ navigate, href, isActive, isExactActive }) => [
1456
+ createElementVNode("a", {
1457
+ href: href,
1458
+ class: normalizeClass($options.getHeaderActionClass(item, { isActive, isExactActive })),
1459
+ tabindex: -1,
1460
+ onClick: $event => ($options.onHeaderActionClick($event, navigate))
1461
+ }, [
1462
+ ($options.getItemProp(item, 'icon'))
1463
+ ? (openBlock(), createElementBlock("span", {
1464
+ key: 0,
1465
+ class: normalizeClass($options.getHeaderIconClass(item))
1466
+ }, null, 2))
1467
+ : createCommentVNode("", true),
1468
+ createElementVNode("span", _hoisted_5, toDisplayString($options.getItemLabel(item)), 1)
1469
+ ], 10, _hoisted_4)
1470
+ ]),
1471
+ _: 2
1472
+ }, 1032, ["to"]))
1473
+ : (openBlock(), createElementBlock("a", {
1474
+ key: 1,
1475
+ href: $options.getItemProp(item, 'url'),
1476
+ class: normalizeClass($options.getHeaderActionClass(item)),
1477
+ tabindex: -1
1478
+ }, [
1479
+ ($options.getItemProp(item, 'items'))
1480
+ ? (openBlock(), createElementBlock("span", {
1481
+ key: 0,
1482
+ class: normalizeClass($options.getHeaderToggleIconClass(item))
1483
+ }, null, 2))
1484
+ : createCommentVNode("", true),
1485
+ ($options.getItemProp(item, 'icon'))
1486
+ ? (openBlock(), createElementBlock("span", {
1487
+ key: 1,
1488
+ class: normalizeClass($options.getHeaderIconClass(item))
1489
+ }, null, 2))
1490
+ : createCommentVNode("", true),
1491
+ createElementVNode("span", _hoisted_7, toDisplayString($options.getItemLabel(item)), 1)
1492
+ ], 10, _hoisted_6))
1493
+ ], 64))
1494
+ : (openBlock(), createBlock(resolveDynamicComponent(_ctx.$slots.item), {
1495
+ key: 1,
1496
+ item: item
1497
+ }, null, 8, ["item"]))
1498
+ ])
1499
+ ], 42, _hoisted_2),
407
1500
  createVNode(Transition, { name: "p-toggleable-content" }, {
408
1501
  default: withCtx(() => [
409
1502
  withDirectives(createElementVNode("div", {
410
- id: $options.ariaId + '_content_' + index,
1503
+ id: $options.getContentId(index),
411
1504
  class: "p-toggleable-content",
412
1505
  role: "region",
413
- "aria-labelledby": $options.ariaId + '_header_' + index
1506
+ "aria-labelledby": $options.getHeaderId(index)
414
1507
  }, [
415
- (item.items)
416
- ? (openBlock(), createElementBlock("div", _hoisted_7, [
417
- createVNode(_component_PanelMenuSub, {
418
- model: item.items,
419
- class: "p-panelmenu-root-submenu",
1508
+ ($options.getItemProp(item, 'items'))
1509
+ ? (openBlock(), createElementBlock("div", _hoisted_9, [
1510
+ createVNode(_component_PanelMenuList, {
1511
+ panelId: $options.getPanelId(index),
1512
+ items: $options.getItemProp(item, 'items'),
420
1513
  template: _ctx.$slots.item,
421
1514
  expandedKeys: $props.expandedKeys,
422
- onItemToggle: $options.updateExpandedKeys,
1515
+ onItemToggle: $options.changeExpandedKeys,
1516
+ onHeaderFocus: $options.updateFocusedHeader,
423
1517
  exact: $props.exact
424
- }, null, 8, ["model", "template", "expandedKeys", "onItemToggle", "exact"])
1518
+ }, null, 8, ["panelId", "items", "template", "expandedKeys", "onItemToggle", "onHeaderFocus", "exact"])
425
1519
  ]))
426
1520
  : createCommentVNode("", true)
427
- ], 8, _hoisted_6), [
428
- [vShow, $options.isActive(item)]
1521
+ ], 8, _hoisted_8), [
1522
+ [vShow, $options.isItemActive(item)]
429
1523
  ])
430
1524
  ]),
431
1525
  _: 2
@@ -434,7 +1528,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
434
1528
  : createCommentVNode("", true)
435
1529
  ], 64))
436
1530
  }), 128))
437
- ]))
1531
+ ], 8, _hoisted_1))
438
1532
  }
439
1533
 
440
1534
  function styleInject(css, ref) {
@@ -464,7 +1558,7 @@ function styleInject(css, ref) {
464
1558
  }
465
1559
  }
466
1560
 
467
- var css_248z = "\n.p-panelmenu .p-panelmenu-header-link {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n cursor: pointer;\n position: relative;\n text-decoration: none;\n}\n.p-panelmenu .p-panelmenu-header-link:focus {\n z-index: 1;\n}\n.p-panelmenu .p-submenu-list {\n margin: 0;\n padding: 0;\n list-style: none;\n}\n.p-panelmenu .p-menuitem-link {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n cursor: pointer;\n text-decoration: none;\n}\n.p-panelmenu .p-menuitem-text {\n line-height: 1;\n}\n";
1561
+ var css_248z = "\n.p-panelmenu .p-panelmenu-header-action {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n cursor: pointer;\n position: relative;\n text-decoration: none;\n}\n.p-panelmenu .p-panelmenu-header-action:focus {\n z-index: 1;\n}\n.p-panelmenu .p-submenu-list {\n margin: 0;\n padding: 0;\n list-style: none;\n}\n.p-panelmenu .p-menuitem-link {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n cursor: pointer;\n text-decoration: none;\n position: relative;\n overflow: hidden;\n}\n.p-panelmenu .p-menuitem-text {\n line-height: 1;\n}\n";
468
1562
  styleInject(css_248z);
469
1563
 
470
1564
  script.render = render;