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