primevue 2.7.0 → 2.8.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 (387) hide show
  1. package/accordiontab/accordiontab.common.js +22 -0
  2. package/accordiontab/accordiontab.umd.js +22 -0
  3. package/accordiontab/accordiontab.umd.min.js +1 -1
  4. package/api/Api.d.ts +296 -0
  5. package/api/Api.js +47 -0
  6. package/api/FilterMatchMode.js +26 -0
  7. package/api/FilterOperator.js +12 -0
  8. package/api/FilterService.js +260 -0
  9. package/api/PrimeIcons.js +246 -0
  10. package/api/ToastSeverity.js +14 -0
  11. package/api/api.common.js +4889 -0
  12. package/api/api.umd.js +4899 -0
  13. package/api/api.umd.min.js +1 -0
  14. package/api/demo.html +8 -0
  15. package/api/filtermatchmode.common.js +186 -0
  16. package/api/filtermatchmode.umd.js +196 -0
  17. package/api/filtermatchmode.umd.min.js +1 -0
  18. package/api/filteroperator.common.js +172 -0
  19. package/api/filteroperator.umd.js +182 -0
  20. package/api/filteroperator.umd.min.js +1 -0
  21. package/{utils/filterutils.common.js → api/filterservice.common.js} +207 -110
  22. package/{utils/filterutils.umd.js → api/filterservice.umd.js} +209 -112
  23. package/api/filterservice.umd.min.js +1 -0
  24. package/api/index.d.ts +1 -0
  25. package/api/index.js +2 -0
  26. package/api/primeicons.common.js +406 -0
  27. package/api/primeicons.umd.js +416 -0
  28. package/api/primeicons.umd.min.js +1 -0
  29. package/api/toastseverity.common.js +174 -0
  30. package/api/toastseverity.umd.js +184 -0
  31. package/api/toastseverity.umd.min.js +1 -0
  32. package/autocomplete/autocomplete.common.js +45 -21
  33. package/autocomplete/autocomplete.umd.js +45 -21
  34. package/autocomplete/autocomplete.umd.min.js +1 -1
  35. package/badgedirective/badgedirective.common.js +22 -0
  36. package/badgedirective/badgedirective.umd.js +22 -0
  37. package/badgedirective/badgedirective.umd.min.js +1 -1
  38. package/blockui/blockui.common.js +22 -0
  39. package/blockui/blockui.umd.js +22 -0
  40. package/blockui/blockui.umd.min.js +1 -1
  41. package/button/button.common.js +22 -0
  42. package/button/button.umd.js +22 -0
  43. package/button/button.umd.min.js +1 -1
  44. package/calendar/Calendar.vue +23 -6
  45. package/calendar/calendar.common.js +71 -37
  46. package/calendar/calendar.umd.js +71 -37
  47. package/calendar/calendar.umd.min.js +1 -1
  48. package/carousel/carousel.common.js +22 -0
  49. package/carousel/carousel.umd.js +22 -0
  50. package/carousel/carousel.umd.min.js +1 -1
  51. package/cascadeselect/cascadeselect.common.js +42 -17
  52. package/cascadeselect/cascadeselect.umd.js +42 -17
  53. package/cascadeselect/cascadeselect.umd.min.js +1 -1
  54. package/cascadeselect/cascadeselectsub.common.js +42 -17
  55. package/cascadeselect/cascadeselectsub.umd.js +42 -17
  56. package/cascadeselect/cascadeselectsub.umd.min.js +1 -1
  57. package/cascadeselect/demo.html +4 -3
  58. package/chart/Chart.vue +16 -5
  59. package/chart/chart.common.js +18 -6
  60. package/chart/chart.umd.js +18 -6
  61. package/chart/chart.umd.min.js +1 -1
  62. package/checkbox/checkbox.common.js +25 -17
  63. package/checkbox/checkbox.umd.js +25 -17
  64. package/checkbox/checkbox.umd.min.js +1 -1
  65. package/colorpicker/colorpicker.common.js +22 -0
  66. package/colorpicker/colorpicker.umd.js +22 -0
  67. package/colorpicker/colorpicker.umd.min.js +1 -1
  68. package/column/Column.vue +72 -12
  69. package/column/column.common.js +71 -11
  70. package/column/column.umd.js +71 -11
  71. package/column/column.umd.min.js +1 -1
  72. package/config/PrimeVue.d.ts +24 -2
  73. package/config/PrimeVue.js +34 -4
  74. package/config/primevue.common.js +3584 -133
  75. package/config/primevue.umd.js +3584 -133
  76. package/config/primevue.umd.min.js +1 -1
  77. package/confirmationeventbus/confirmationeventbus.common.js +0 -4
  78. package/confirmationeventbus/confirmationeventbus.umd.js +0 -4
  79. package/confirmationeventbus/confirmationeventbus.umd.min.js +1 -1
  80. package/confirmationservice/confirmationservice.common.js +0 -4
  81. package/confirmationservice/confirmationservice.umd.js +0 -4
  82. package/confirmationservice/confirmationservice.umd.min.js +1 -1
  83. package/confirmdialog/confirmdialog.common.js +24 -7
  84. package/confirmdialog/confirmdialog.umd.js +24 -7
  85. package/confirmdialog/confirmdialog.umd.min.js +1 -1
  86. package/confirmpopup/confirmpopup.common.js +22 -4
  87. package/confirmpopup/confirmpopup.umd.js +22 -4
  88. package/confirmpopup/confirmpopup.umd.min.js +1 -1
  89. package/contextmenu/contextmenu.common.js +22 -0
  90. package/contextmenu/contextmenu.umd.js +22 -0
  91. package/contextmenu/contextmenu.umd.min.js +1 -1
  92. package/contextmenu/contextmenusub.common.js +22 -0
  93. package/contextmenu/contextmenusub.umd.js +22 -0
  94. package/contextmenu/contextmenusub.umd.min.js +1 -1
  95. package/datatable/BodyCell.vue +116 -36
  96. package/datatable/ColumnFilter.vue +558 -0
  97. package/datatable/ColumnSlot.vue +21 -1
  98. package/datatable/DataTable.d.ts +34 -8
  99. package/datatable/DataTable.vue +569 -379
  100. package/datatable/FooterCell.vue +82 -0
  101. package/datatable/HeaderCell.vue +246 -0
  102. package/datatable/TableBody.vue +79 -19
  103. package/datatable/TableFooter.vue +34 -18
  104. package/datatable/TableHeader.vue +79 -134
  105. package/datatable/bodycell.common.js +570 -56
  106. package/datatable/bodycell.umd.js +570 -56
  107. package/datatable/bodycell.umd.min.js +1 -1
  108. package/datatable/columnfilter.common.js +7610 -0
  109. package/datatable/columnfilter.umd.js +7620 -0
  110. package/datatable/columnfilter.umd.min.js +1 -0
  111. package/datatable/columnslot.common.js +21 -1
  112. package/datatable/columnslot.umd.js +21 -1
  113. package/datatable/columnslot.umd.min.js +1 -1
  114. package/datatable/datatable.common.js +2777 -1703
  115. package/datatable/datatable.umd.js +2777 -1703
  116. package/datatable/datatable.umd.min.js +1 -1
  117. package/datatable/demo.html +3 -3
  118. package/datatable/{scrollableview.common.js → footercell.common.js} +1861 -411
  119. package/datatable/{scrollableview.umd.js → footercell.umd.js} +1863 -413
  120. package/datatable/footercell.umd.min.js +1 -0
  121. package/datatable/headercell.common.js +8058 -0
  122. package/datatable/headercell.umd.js +8068 -0
  123. package/datatable/headercell.umd.min.js +1 -0
  124. package/datatable/tablebody.common.js +1054 -478
  125. package/datatable/tablebody.umd.js +1054 -478
  126. package/datatable/tablebody.umd.min.js +1 -1
  127. package/datatable/tablefooter.common.js +3785 -105
  128. package/datatable/tablefooter.umd.js +3785 -105
  129. package/datatable/tablefooter.umd.min.js +1 -1
  130. package/datatable/tableheader.common.js +6629 -2139
  131. package/datatable/tableheader.umd.js +6629 -2139
  132. package/datatable/tableheader.umd.min.js +1 -1
  133. package/datatable/tableloadingbody.common.js +21 -1
  134. package/datatable/tableloadingbody.umd.js +21 -1
  135. package/datatable/tableloadingbody.umd.min.js +1 -1
  136. package/dataview/dataview.common.js +53 -30
  137. package/dataview/dataview.umd.js +53 -30
  138. package/dataview/dataview.umd.min.js +1 -1
  139. package/dialog/dialog.common.js +24 -6
  140. package/dialog/dialog.umd.js +24 -6
  141. package/dialog/dialog.umd.min.js +1 -1
  142. package/dropdown/Dropdown.vue +2 -0
  143. package/dropdown/dropdown.common.js +45 -20
  144. package/dropdown/dropdown.umd.js +45 -20
  145. package/dropdown/dropdown.umd.min.js +1 -1
  146. package/fieldset/fieldset.common.js +22 -0
  147. package/fieldset/fieldset.umd.js +22 -0
  148. package/fieldset/fieldset.umd.min.js +1 -1
  149. package/fileupload/fileupload.common.js +22 -0
  150. package/fileupload/fileupload.umd.js +22 -0
  151. package/fileupload/fileupload.umd.min.js +1 -1
  152. package/fullcalendar/fullcalendar.common.js +5 -9
  153. package/fullcalendar/fullcalendar.umd.js +5 -9
  154. package/fullcalendar/fullcalendar.umd.min.js +2 -2
  155. package/galleria/galleria.common.js +22 -4
  156. package/galleria/galleria.umd.js +22 -4
  157. package/galleria/galleria.umd.min.js +1 -1
  158. package/galleria/galleriacontent.common.js +22 -0
  159. package/galleria/galleriacontent.umd.js +22 -0
  160. package/galleria/galleriacontent.umd.min.js +1 -1
  161. package/galleria/galleriaitem.common.js +22 -0
  162. package/galleria/galleriaitem.umd.js +22 -0
  163. package/galleria/galleriaitem.umd.min.js +1 -1
  164. package/galleria/galleriathumbnails.common.js +22 -0
  165. package/galleria/galleriathumbnails.umd.js +22 -0
  166. package/galleria/galleriathumbnails.umd.min.js +1 -1
  167. package/imagepreview/imagepreview.common.js +22 -0
  168. package/imagepreview/imagepreview.umd.js +22 -0
  169. package/imagepreview/imagepreview.umd.min.js +1 -1
  170. package/inplace/inplace.common.js +22 -0
  171. package/inplace/inplace.umd.js +22 -0
  172. package/inplace/inplace.umd.min.js +1 -1
  173. package/inputmask/inputmask.common.js +24 -6
  174. package/inputmask/inputmask.umd.js +24 -6
  175. package/inputmask/inputmask.umd.min.js +1 -1
  176. package/inputnumber/inputnumber.common.js +26 -9
  177. package/inputnumber/inputnumber.umd.js +26 -9
  178. package/inputnumber/inputnumber.umd.min.js +1 -1
  179. package/inputtext/inputtext.common.js +2 -6
  180. package/inputtext/inputtext.umd.js +2 -6
  181. package/inputtext/inputtext.umd.min.js +1 -1
  182. package/listbox/listbox.common.js +42 -17
  183. package/listbox/listbox.umd.js +42 -17
  184. package/listbox/listbox.umd.min.js +1 -1
  185. package/megamenu/megamenu.common.js +22 -0
  186. package/megamenu/megamenu.umd.js +22 -0
  187. package/megamenu/megamenu.umd.min.js +1 -1
  188. package/menu/menu.common.js +22 -0
  189. package/menu/menu.umd.js +22 -0
  190. package/menu/menu.umd.min.js +1 -1
  191. package/menu/menuitem.common.js +22 -0
  192. package/menu/menuitem.umd.js +22 -0
  193. package/menu/menuitem.umd.min.js +1 -1
  194. package/menubar/menubar.common.js +22 -0
  195. package/menubar/menubar.umd.js +22 -0
  196. package/menubar/menubar.umd.min.js +1 -1
  197. package/menubar/menubarsub.common.js +22 -0
  198. package/menubar/menubarsub.umd.js +22 -0
  199. package/menubar/menubarsub.umd.min.js +1 -1
  200. package/message/message.common.js +22 -0
  201. package/message/message.umd.js +22 -0
  202. package/message/message.umd.min.js +1 -1
  203. package/multiselect/multiselect.common.js +42 -17
  204. package/multiselect/multiselect.umd.js +42 -17
  205. package/multiselect/multiselect.umd.min.js +1 -1
  206. package/orderlist/orderlist.common.js +42 -17
  207. package/orderlist/orderlist.umd.js +42 -17
  208. package/orderlist/orderlist.umd.min.js +1 -1
  209. package/organizationchart/organizationchart.common.js +24 -6
  210. package/organizationchart/organizationchart.umd.js +24 -6
  211. package/organizationchart/organizationchart.umd.min.js +1 -1
  212. package/organizationchart/organizationchartnode.common.js +22 -0
  213. package/organizationchart/organizationchartnode.umd.js +22 -0
  214. package/organizationchart/organizationchartnode.umd.min.js +1 -1
  215. package/overlayeventbus/OverlayEventBus.js +14 -0
  216. package/overlayeventbus/demo.html +8 -0
  217. package/overlayeventbus/index.d.ts +1 -0
  218. package/overlayeventbus/index.js +2 -0
  219. package/overlayeventbus/overlayeventbus.common.js +1773 -0
  220. package/overlayeventbus/overlayeventbus.umd.js +1783 -0
  221. package/overlayeventbus/overlayeventbus.umd.min.js +1 -0
  222. package/overlaypanel/overlaypanel.common.js +22 -0
  223. package/overlaypanel/overlaypanel.umd.js +22 -0
  224. package/overlaypanel/overlaypanel.umd.min.js +1 -1
  225. package/package.json +1 -1
  226. package/paginator/firstpagelink.common.js +22 -0
  227. package/paginator/firstpagelink.umd.js +22 -0
  228. package/paginator/firstpagelink.umd.min.js +1 -1
  229. package/paginator/jumptopagedropdown.common.js +49 -24
  230. package/paginator/jumptopagedropdown.umd.js +49 -24
  231. package/paginator/jumptopagedropdown.umd.min.js +1 -1
  232. package/paginator/jumptopageinput.common.js +26 -9
  233. package/paginator/jumptopageinput.umd.js +26 -9
  234. package/paginator/jumptopageinput.umd.min.js +1 -1
  235. package/paginator/lastpagelink.common.js +22 -0
  236. package/paginator/lastpagelink.umd.js +22 -0
  237. package/paginator/lastpagelink.umd.min.js +1 -1
  238. package/paginator/nextpagelink.common.js +22 -0
  239. package/paginator/nextpagelink.umd.js +22 -0
  240. package/paginator/nextpagelink.umd.min.js +1 -1
  241. package/paginator/pagelinks.common.js +22 -0
  242. package/paginator/pagelinks.umd.js +22 -0
  243. package/paginator/pagelinks.umd.min.js +1 -1
  244. package/paginator/paginator.common.js +53 -30
  245. package/paginator/paginator.umd.js +53 -30
  246. package/paginator/paginator.umd.min.js +1 -1
  247. package/paginator/prevpagelink.common.js +22 -0
  248. package/paginator/prevpagelink.umd.js +22 -0
  249. package/paginator/prevpagelink.umd.min.js +1 -1
  250. package/paginator/rowsperpagedropdown.common.js +49 -24
  251. package/paginator/rowsperpagedropdown.umd.js +49 -24
  252. package/paginator/rowsperpagedropdown.umd.min.js +1 -1
  253. package/panel/panel.common.js +22 -0
  254. package/panel/panel.umd.js +22 -0
  255. package/panel/panel.umd.min.js +1 -1
  256. package/password/password.common.js +24 -6
  257. package/password/password.umd.js +24 -6
  258. package/password/password.umd.min.js +1 -1
  259. package/picklist/PickList.vue +0 -3
  260. package/picklist/picklist.common.js +44 -22
  261. package/picklist/picklist.umd.js +44 -22
  262. package/picklist/picklist.umd.min.js +1 -1
  263. package/radiobutton/radiobutton.common.js +25 -17
  264. package/radiobutton/radiobutton.umd.js +25 -17
  265. package/radiobutton/radiobutton.umd.min.js +1 -1
  266. package/ripple/ripple.common.js +22 -0
  267. package/ripple/ripple.umd.js +22 -0
  268. package/ripple/ripple.umd.min.js +1 -1
  269. package/scrollpanel/scrollpanel.common.js +22 -0
  270. package/scrollpanel/scrollpanel.umd.js +22 -0
  271. package/scrollpanel/scrollpanel.umd.min.js +1 -1
  272. package/scrolltop/scrolltop.common.js +22 -0
  273. package/scrolltop/scrolltop.umd.js +22 -0
  274. package/scrolltop/scrolltop.umd.min.js +1 -1
  275. package/selectbutton/selectbutton.common.js +42 -17
  276. package/selectbutton/selectbutton.umd.js +42 -17
  277. package/selectbutton/selectbutton.umd.min.js +1 -1
  278. package/sidebar/sidebar.common.js +22 -0
  279. package/sidebar/sidebar.umd.js +22 -0
  280. package/sidebar/sidebar.umd.min.js +1 -1
  281. package/slider/Slider.vue +20 -12
  282. package/slider/slider.common.js +36 -9
  283. package/slider/slider.umd.js +36 -9
  284. package/slider/slider.umd.min.js +1 -1
  285. package/speeddial/speeddial.common.js +24 -6
  286. package/speeddial/speeddial.umd.js +24 -6
  287. package/speeddial/speeddial.umd.min.js +1 -1
  288. package/splitbutton/splitbutton.common.js +22 -0
  289. package/splitbutton/splitbutton.umd.js +22 -0
  290. package/splitbutton/splitbutton.umd.min.js +1 -1
  291. package/splitter/splitter.common.js +22 -0
  292. package/splitter/splitter.umd.js +22 -0
  293. package/splitter/splitter.umd.min.js +1 -1
  294. package/styleclass/styleclass.common.js +22 -0
  295. package/styleclass/styleclass.umd.js +22 -0
  296. package/styleclass/styleclass.umd.min.js +1 -1
  297. package/tabmenu/tabmenu.common.js +22 -0
  298. package/tabmenu/tabmenu.umd.js +22 -0
  299. package/tabmenu/tabmenu.umd.min.js +1 -1
  300. package/tabview/tabview.common.js +42 -17
  301. package/tabview/tabview.umd.js +42 -17
  302. package/tabview/tabview.umd.min.js +1 -1
  303. package/textarea/textarea.common.js +2 -6
  304. package/textarea/textarea.umd.js +2 -6
  305. package/textarea/textarea.umd.min.js +1 -1
  306. package/tieredmenu/demo.html +3 -4
  307. package/tieredmenu/tieredmenu.common.js +22 -0
  308. package/tieredmenu/tieredmenu.umd.js +22 -0
  309. package/tieredmenu/tieredmenu.umd.min.js +1 -1
  310. package/tieredmenu/tieredmenusub.common.js +22 -0
  311. package/tieredmenu/tieredmenusub.umd.js +22 -0
  312. package/tieredmenu/tieredmenusub.umd.min.js +1 -1
  313. package/timeline/timeline.common.js +25 -17
  314. package/timeline/timeline.umd.js +25 -17
  315. package/timeline/timeline.umd.min.js +1 -1
  316. package/toast/toast.common.js +22 -0
  317. package/toast/toast.umd.js +22 -0
  318. package/toast/toast.umd.min.js +1 -1
  319. package/toast/toastmessage.common.js +22 -0
  320. package/toast/toastmessage.umd.js +22 -0
  321. package/toast/toastmessage.umd.min.js +1 -1
  322. package/togglebutton/togglebutton.common.js +22 -0
  323. package/togglebutton/togglebutton.umd.js +22 -0
  324. package/togglebutton/togglebutton.umd.min.js +1 -1
  325. package/tooltip/Tooltip.js +1 -1
  326. package/tooltip/tooltip.common.js +29 -17
  327. package/tooltip/tooltip.umd.js +29 -17
  328. package/tooltip/tooltip.umd.min.js +1 -1
  329. package/tree/tree.common.js +46 -23
  330. package/tree/tree.umd.js +46 -23
  331. package/tree/tree.umd.min.js +1 -1
  332. package/tree/treenode.common.js +24 -6
  333. package/tree/treenode.umd.js +24 -6
  334. package/tree/treenode.umd.min.js +1 -1
  335. package/treetable/BodyCell.vue +162 -0
  336. package/treetable/FooterCell.vue +81 -0
  337. package/treetable/HeaderCell.vue +183 -0
  338. package/treetable/TreeTable.vue +85 -108
  339. package/treetable/bodycell.common.js +5596 -0
  340. package/treetable/bodycell.umd.js +5606 -0
  341. package/treetable/bodycell.umd.min.js +1 -0
  342. package/treetable/demo.html +3 -3
  343. package/treetable/footercell.common.js +5300 -0
  344. package/treetable/footercell.umd.js +5310 -0
  345. package/treetable/footercell.umd.min.js +1 -0
  346. package/treetable/headercell.common.js +5529 -0
  347. package/treetable/headercell.umd.js +5539 -0
  348. package/treetable/headercell.umd.min.js +1 -0
  349. package/treetable/treetable.common.js +917 -481
  350. package/treetable/treetable.umd.js +917 -481
  351. package/treetable/treetable.umd.min.js +1 -1
  352. package/treetable/treetablerow.common.js +44 -20
  353. package/treetable/treetablerow.umd.js +44 -20
  354. package/treetable/treetablerow.umd.min.js +1 -1
  355. package/treetable/treetablerowloader.common.js +46 -23
  356. package/treetable/treetablerowloader.umd.js +46 -23
  357. package/treetable/treetablerowloader.umd.min.js +1 -1
  358. package/utils/ConnectedOverlayScrollHandler.js +1 -1
  359. package/utils/DomHandler.js +18 -1
  360. package/utils/ObjectUtils.js +15 -2
  361. package/utils/Utils.d.ts +73 -0
  362. package/utils/Utils.js +47 -0
  363. package/utils/connectedoverlayscrollhandler.common.js +22 -0
  364. package/utils/connectedoverlayscrollhandler.umd.js +22 -0
  365. package/utils/connectedoverlayscrollhandler.umd.min.js +1 -1
  366. package/utils/demo.html +3 -3
  367. package/utils/domhandler.common.js +22 -0
  368. package/utils/domhandler.umd.js +22 -0
  369. package/utils/domhandler.umd.min.js +1 -1
  370. package/utils/eventbus.common.js +0 -4
  371. package/utils/eventbus.umd.js +0 -4
  372. package/utils/eventbus.umd.min.js +1 -1
  373. package/utils/index.d.ts +1 -0
  374. package/utils/index.js +2 -0
  375. package/utils/objectutils.common.js +25 -17
  376. package/utils/objectutils.umd.js +25 -17
  377. package/utils/objectutils.umd.min.js +1 -1
  378. package/utils/utils.common.js +5481 -0
  379. package/utils/utils.umd.js +5491 -0
  380. package/utils/utils.umd.min.js +1 -0
  381. package/vetur-attributes.json +4 -0
  382. package/vetur-tags.json +1 -0
  383. package/web-types.json +24 -1
  384. package/datatable/ScrollableView.vue +0 -223
  385. package/datatable/scrollableview.umd.min.js +0 -1
  386. package/utils/FilterUtils.js +0 -176
  387. package/utils/filterutils.umd.min.js +0 -1
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div :class="containerClass">
2
+ <div :class="containerClass" data-scrollselectors=".p-datatable-wrapper">
3
3
  <slot></slot>
4
4
  <div class="p-datatable-loading-overlay p-component-overlay" v-if="loading">
5
5
  <i :class="loadingIconClass"></i>
@@ -16,101 +16,37 @@
16
16
  <slot name="paginatorend"></slot>
17
17
  </template>
18
18
  </DTPaginator>
19
- <div class="p-datatable-wrapper" v-if="!scrollable">
20
- <table ref="table" role="grid">
19
+ <div class="p-datatable-wrapper" :style="{maxHeight: scrollHeight}">
20
+ <table ref="table" role="table" :class="[tableClass, 'p-datatable-table']" :style="tableStyle">
21
21
  <DTTableHeader :columnGroup="headerColumnGroup" :columns="columns" :rowGroupMode="rowGroupMode"
22
- :groupRowsBy="groupRowsBy" :resizableColumns="resizableColumns" :allRowsSelected="allRowsSelected" :empty="empty"
23
- :sortMode="sortMode" :sortField="d_sortField" :sortOrder="d_sortOrder" :multiSortMeta="d_multiSortMeta"
24
- @column-click="onColumnHeaderClick($event)" @column-mousedown="onColumnHeaderMouseDown($event)"
22
+ :groupRowsBy="groupRowsBy" :groupRowSortField="groupRowSortField" :resizableColumns="resizableColumns" :allRowsSelected="allRowsSelected" :empty="empty"
23
+ :sortMode="sortMode" :sortField="d_sortField" :sortOrder="d_sortOrder" :multiSortMeta="d_multiSortMeta" :filters="d_filters" :filtersStore="filters" :filterDisplay="filterDisplay"
24
+ @column-click="onColumnHeaderClick($event)" @column-mousedown="onColumnHeaderMouseDown($event)" @filter-change="onFilterChange" @filter-apply="onFilterApply"
25
25
  @column-dragstart="onColumnHeaderDragStart($event)" @column-dragover="onColumnHeaderDragOver($event)" @column-dragleave="onColumnHeaderDragLeave($event)" @column-drop="onColumnHeaderDrop($event)"
26
26
  @column-resizestart="onColumnResizeStart($event)" @checkbox-change="toggleRowsWithCheckbox($event)" />
27
+ <DTTableBody v-if="frozenValue" :value="frozenValue" :frozenRow="true" class="p-datatable-frozen-tbody" :columns="columns" :dataKey="dataKey" :selection="selection" :selectionKeys="d_selectionKeys" :selectionMode="selectionMode" :contextMenu="contextMenu" :contextMenuSelection="contextMenuSelection"
28
+ :rowGroupMode="rowGroupMode" :groupRowsBy="groupRowsBy" :expandableRowGroups="expandableRowGroups" :rowClass="rowClass" :rowStyle="rowStyle" :editMode="editMode" :compareSelectionBy="compareSelectionBy" :scrollable="scrollable"
29
+ :expandedRowIcon="expandedRowIcon" :collapsedRowIcon="collapsedRowIcon" :expandedRows="expandedRows" :expandedRowKeys="d_expandedRowKeys" :expandedRowGroups="expandedRowGroups"
30
+ :editingRows="editingRows" :editingRowKeys="d_editingRowKeys" :templates="$scopedSlots" :loading="loading" :responsiveLayout="responsiveLayout"
31
+ @rowgroup-toggle="toggleRowGroup" @row-click="onRowClick($event)" @row-dblclick="onRowDblClick($event)" @row-rightclick="onRowRightClick($event)" @row-touchend="onRowTouchEnd" @row-keydown="onRowKeyDown"
32
+ @row-mousedown="onRowMouseDown" @row-dragstart="onRowDragStart($event)" @row-dragover="onRowDragOver($event)" @row-dragleave="onRowDragLeave($event)" @row-dragend="onRowDragEnd($event)" @row-drop="onRowDrop($event)"
33
+ @row-toggle="toggleRow($event)" @radio-change="toggleRowWithRadio($event)" @checkbox-change="toggleRowWithCheckbox($event)"
34
+ @cell-edit-init="onCellEditInit($event)" @cell-edit-complete="onCellEditComplete($event)" @cell-edit-cancel="onCellEditCancel($event)"
35
+ @row-edit-init="onRowEditInit($event)" @row-edit-save="onRowEditSave($event)" @row-edit-cancel="onRowEditCancel($event)"
36
+ :editingMeta="d_editingMeta" @editing-meta-change="onEditingMetaChange" />
27
37
  <DTTableBody :value="dataToRender" :columns="columns" :empty="empty" :dataKey="dataKey" :selection="selection" :selectionKeys="d_selectionKeys" :selectionMode="selectionMode" :contextMenu="contextMenu" :contextMenuSelection="contextMenuSelection"
28
- :rowGroupMode="rowGroupMode" :groupRowsBy="groupRowsBy" :expandableRowGroups="expandableRowGroups" :rowClass="rowClass" :rowStyle="rowStyle" :editMode="editMode" :compareSelectionBy="compareSelectionBy"
38
+ :rowGroupMode="rowGroupMode" :groupRowsBy="groupRowsBy" :expandableRowGroups="expandableRowGroups" :rowClass="rowClass" :rowStyle="rowStyle" :editMode="editMode" :compareSelectionBy="compareSelectionBy" :scrollable="scrollable"
29
39
  :expandedRowIcon="expandedRowIcon" :collapsedRowIcon="collapsedRowIcon" :expandedRows="expandedRows" :expandedRowKeys="d_expandedRowKeys" :expandedRowGroups="expandedRowGroups"
30
- :editingRows="editingRows" :editingRowKeys="d_editingRowKeys" :templates="$scopedSlots" :loading="loading"
40
+ :editingRows="editingRows" :editingRowKeys="d_editingRowKeys" :templates="$scopedSlots" :loading="loading" :responsiveLayout="responsiveLayout"
31
41
  @rowgroup-toggle="toggleRowGroup" @row-click="onRowClick($event)" @row-dblclick="onRowDblClick($event)" @row-rightclick="onRowRightClick($event)" @row-touchend="onRowTouchEnd" @row-keydown="onRowKeyDown"
32
42
  @row-mousedown="onRowMouseDown" @row-dragstart="onRowDragStart($event)" @row-dragover="onRowDragOver($event)" @row-dragleave="onRowDragLeave($event)" @row-dragend="onRowDragEnd($event)" @row-drop="onRowDrop($event)"
33
43
  @row-toggle="toggleRow($event)" @radio-change="toggleRowWithRadio($event)" @checkbox-change="toggleRowWithCheckbox($event)"
34
44
  @cell-edit-init="onCellEditInit($event)" @cell-edit-complete="onCellEditComplete($event)" @cell-edit-cancel="onCellEditCancel($event)"
35
- @row-edit-init="onRowEditInit($event)" @row-edit-save="onRowEditSave($event)" @row-edit-cancel="onRowEditCancel($event)"/>
45
+ @row-edit-init="onRowEditInit($event)" @row-edit-save="onRowEditSave($event)" @row-edit-cancel="onRowEditCancel($event)"
46
+ :editingMeta="d_editingMeta" @editing-meta-change="onEditingMetaChange" />
36
47
  <DTTableFooter :columnGroup="footerColumnGroup" :columns="columns" />
37
48
  </table>
38
49
  </div>
39
- <div class="p-datatable-scrollable-wrapper" v-else>
40
- <DTScrollableView v-if="hasFrozenColumns" :scrollHeight="scrollHeight" :columns="frozenColumns" :frozenWidth="frozenWidth" :frozen="true"
41
- :rowGroupMode="rowGroupMode" :groupRowsBy="groupRowsBy">
42
- <template #header>
43
- <DTTableHeader :columnGroup="frozenHeaderColumnGroup" :columns="frozenColumns" :rowGroupMode="rowGroupMode"
44
- :groupRowsBy="groupRowsBy" :resizableColumns="resizableColumns" :allRowsSelected="allRowsSelected" :empty="empty"
45
- :sortMode="sortMode" :sortField="d_sortField" :sortOrder="d_sortOrder" :multiSortMeta="d_multiSortMeta"
46
- @column-click="onColumnHeaderClick($event)" @column-mousedown="onColumnHeaderMouseDown($event)"
47
- @column-dragstart="onColumnHeaderDragStart($event)" @column-dragover="onColumnHeaderDragOver($event)" @column-dragleave="onColumnHeaderDragLeave($event)" @column-drop="onColumnHeaderDrop($event)"
48
- @column-resizestart="onColumnResizeStart($event)" @checkbox-change="toggleRowsWithCheckbox($event)" />
49
- </template>
50
- <template #body>
51
- <DTTableBody :value="dataToRender" :columns="frozenColumns" :empty="empty" :dataKey="dataKey" :selection="selection" :selectionKeys="d_selectionKeys" :selectionMode="selectionMode" :contextMenu="contextMenu" :contextMenuSelection="contextMenuSelection"
52
- :rowGroupMode="rowGroupMode" :groupRowsBy="groupRowsBy" :expandableRowGroups="expandableRowGroups" :rowClass="rowClass" :rowStyle="rowStyle" :editMode="editMode" :compareSelectionBy="compareSelectionBy"
53
- :expandedRowIcon="expandedRowIcon" :collapsedRowIcon="collapsedRowIcon" :expandedRows="expandedRows" :expandedRowKeys="d_expandedRowKeys" :expandedRowGroups="expandedRowGroups"
54
- :editingRows="editingRows" :editingRowKeys="d_editingRowKeys" :templates="$scopedSlots" :loading="loading"
55
- @rowgroup-toggle="toggleRowGroup" @row-click="onRowClick($event)" @row-rightclick="onRowRightClick($event)" @row-touchend="onRowTouchEnd" @row-keydown="onRowKeyDown"
56
- @row-mousedown="onRowMouseDown" @row-dragstart="onRowDragStart($event)" @row-dragover="onRowDragOver($event)" @row-dragleave="onRowDragLeave($event)" @row-dragend="onRowDragEnd($event)" @row-drop="onRowDrop($event)"
57
- @row-toggle="toggleRow($event)" @radio-change="toggleRowWithRadio($event)" @checkbox-change="toggleRowWithCheckbox($event)"
58
- @cell-edit-init="onCellEditInit($event)" @cell-edit-complete="onCellEditComplete($event)" @cell-edit-cancel="onCellEditCancel($event)"
59
- @row-edit-init="onRowEditInit($event)" @row-edit-save="onRowEditSave($event)" @row-edit-cancel="onRowEditCancel($event)"/>
60
- </template>
61
- <template #frozenbody>
62
- <DTTableBody v-if="frozenValue" :value="frozenValue" :columns="frozenColumns" :dataKey="dataKey" :selection="selection" :selectionKeys="d_selectionKeys" :selectionMode="selectionMode" :contextMenu="contextMenu" :contextMenuSelection="contextMenuSelection"
63
- :rowGroupMode="rowGroupMode" :groupRowsBy="groupRowsBy" :expandableRowGroups="expandableRowGroups" :rowClass="rowClass" :rowStyle="rowStyle" :editMode="editMode" :compareSelectionBy="compareSelectionBy"
64
- :expandedRowIcon="expandedRowIcon" :collapsedRowIcon="collapsedRowIcon" :expandedRows="expandedRows" :expandedRowKeys="d_expandedRowKeys" :expandedRowGroups="expandedRowGroups"
65
- :editingRows="editingRows" :editingRowKeys="d_editingRowKeys" :templates="$scopedSlots" :loading="loading"
66
- @rowgroup-toggle="toggleRowGroup" @row-click="onRowClick($event)" @row-rightclick="onRowRightClick($event)" @row-touchend="onRowTouchEnd" @row-keydown="onRowKeyDown"
67
- @row-mousedown="onRowMouseDown" @row-dragstart="onRowDragStart($event)" @row-dragover="onRowDragOver($event)" @row-dragleave="onRowDragLeave($event)" @row-dragend="onRowDragEnd($event)" @row-drop="onRowDrop($event)"
68
- @row-toggle="toggleRow($event)" @radio-change="toggleRowWithRadio($event)" @checkbox-change="toggleRowWithCheckbox($event)"
69
- @cell-edit-init="onCellEditInit($event)" @cell-edit-complete="onCellEditComplete($event)" @cell-edit-cancel="onCellEditCancel($event)"
70
- @row-edit-init="onRowEditInit($event)" @row-edit-save="onRowEditSave($event)" @row-edit-cancel="onRowEditCancel($event)"/>
71
- </template>
72
- <template #footer>
73
- <DTTableFooter :columnGroup="frozenFooterColumnGroup" :columns="frozenColumns" />
74
- </template>
75
- </DTScrollableView>
76
- <DTScrollableView :scrollHeight="scrollHeight" :columns="scrollableColumns" :frozenWidth="frozenWidth" :rows="rows"
77
- :virtualScroll="virtualScroll" :virtualRowHeight="virtualRowHeight" :totalRecords="totalRecordsLength" @virtual-scroll="onVirtualScroll"
78
- :rowGroupMode="rowGroupMode" :groupRowsBy="groupRowsBy">
79
- <template #header>
80
- <DTTableHeader :columnGroup="headerColumnGroup" :columns="scrollableColumns" :rowGroupMode="rowGroupMode"
81
- :groupRowsBy="groupRowsBy" :resizableColumns="resizableColumns" :allRowsSelected="allRowsSelected" :empty="empty"
82
- :sortMode="sortMode" :sortField="d_sortField" :sortOrder="d_sortOrder" :multiSortMeta="d_multiSortMeta"
83
- @column-click="onColumnHeaderClick($event)" @column-mousedown="onColumnHeaderMouseDown($event)"
84
- @column-dragstart="onColumnHeaderDragStart($event)" @column-dragover="onColumnHeaderDragOver($event)" @column-dragleave="onColumnHeaderDragLeave($event)" @column-drop="onColumnHeaderDrop($event)"
85
- @column-resizestart="onColumnResizeStart($event)" @checkbox-change="toggleRowsWithCheckbox($event)" />
86
- </template>
87
- <template #body>
88
- <DTTableBody :value="dataToRender" :columns="scrollableColumns" :empty="empty" :dataKey="dataKey" :selection="selection" :selectionKeys="d_selectionKeys" :selectionMode="selectionMode" :contextMenu="contextMenu" :contextMenuSelection="contextMenuSelection"
89
- :rowGroupMode="rowGroupMode" :groupRowsBy="groupRowsBy" :expandableRowGroups="expandableRowGroups" :rowClass="rowClass" :rowStyle="rowStyle" :editMode="editMode" :compareSelectionBy="compareSelectionBy"
90
- :expandedRowIcon="expandedRowIcon" :collapsedRowIcon="collapsedRowIcon" :expandedRows="expandedRows" :expandedRowKeys="d_expandedRowKeys" :expandedRowGroups="expandedRowGroups"
91
- :editingRows="editingRows" :editingRowKeys="d_editingRowKeys" :templates="$scopedSlots" :loading="loading"
92
- @rowgroup-toggle="toggleRowGroup" @row-click="onRowClick($event)" @row-rightclick="onRowRightClick($event)" @row-touchend="onRowTouchEnd" @row-keydown="onRowKeyDown"
93
- @row-mousedown="onRowMouseDown" @row-dragstart="onRowDragStart($event)" @row-dragover="onRowDragOver($event)" @row-dragleave="onRowDragLeave($event)" @row-dragend="onRowDragEnd($event)" @row-drop="onRowDrop($event)"
94
- @row-toggle="toggleRow($event)" @radio-change="toggleRowWithRadio($event)" @checkbox-change="toggleRowWithCheckbox($event)"
95
- @cell-edit-init="onCellEditInit($event)" @cell-edit-complete="onCellEditComplete($event)" @cell-edit-cancel="onCellEditCancel($event)"
96
- @row-edit-init="onRowEditInit($event)" @row-edit-save="onRowEditSave($event)" @row-edit-cancel="onRowEditCancel($event)"/>
97
- </template>
98
- <template #frozenbody>
99
- <DTTableBody v-if="frozenValue" :value="frozenValue" :columns="scrollableColumns" :dataKey="dataKey" :selection="selection" :selectionKeys="d_selectionKeys" :selectionMode="selectionMode" :contextMenu="contextMenu" :contextMenuSelection="contextMenuSelection"
100
- :rowGroupMode="rowGroupMode" :groupRowsBy="groupRowsBy" :expandableRowGroups="expandableRowGroups" :rowClass="rowClass" :rowStyle="rowStyle" :editMode="editMode" :compareSelectionBy="compareSelectionBy"
101
- :expandedRowIcon="expandedRowIcon" :collapsedRowIcon="collapsedRowIcon" :expandedRows="expandedRows" :expandedRowKeys="d_expandedRowKeys" :expandedRowGroups="expandedRowGroups"
102
- :editingRows="editingRows" :editingRowKeys="d_editingRowKeys" :templates="$scopedSlots" :loading="loading"
103
- @rowgroup-toggle="toggleRowGroup" @row-click="onRowClick($event)" @row-rightclick="onRowRightClick($event)" @row-touchend="onRowTouchEnd" @row-keydown="onRowKeyDown"
104
- @row-mousedown="onRowMouseDown" @row-dragstart="onRowDragStart($event)" @row-dragover="onRowDragOver($event)" @row-dragleave="onRowDragLeave($event)" @row-dragend="onRowDragEnd($event)" @row-drop="onRowDrop($event)"
105
- @row-toggle="toggleRow($event)" @radio-change="toggleRowWithRadio($event)" @checkbox-change="toggleRowWithCheckbox($event)"
106
- @cell-edit-init="onCellEditInit($event)" @cell-edit-complete="onCellEditComplete($event)" @cell-edit-cancel="onCellEditCancel($event)"
107
- @row-edit-init="onRowEditInit($event)" @row-edit-save="onRowEditSave($event)" @row-edit-cancel="onRowEditCancel($event)"/>
108
- </template>
109
- <template #footer>
110
- <DTTableFooter :columnGroup="footerColumnGroup" :columns="scrollableColumns" />
111
- </template>
112
- </DTScrollableView>
113
- </div>
114
50
  <DTPaginator v-if="paginatorBottom" :rows="d_rows" :first="lazy ? 0 : d_first" :totalRecords="totalRecordsLength" :pageLinkSize="pageLinkSize" :template="paginatorTemplate" :rowsPerPageOptions="rowsPerPageOptions"
115
51
  :currentPageReportTemplate="currentPageReportTemplate" class="p-paginator-bottom" @page="onPage($event)" :alwaysShow="alwaysShowPaginator">
116
52
  <template #start v-if="$scopedSlots.paginatorstart">
@@ -131,10 +67,12 @@
131
67
 
132
68
  <script>
133
69
  import ObjectUtils from '../utils/ObjectUtils';
134
- import FilterUtils from '../utils/FilterUtils';
135
70
  import DomHandler from '../utils/DomHandler';
136
- import Paginator from '../paginator/Paginator';
137
- import ScrollableView from './ScrollableView.vue';
71
+ import UniqueComponentId from '../utils/UniqueComponentId';
72
+ import FilterMatchMode from '../api/FilterMatchMode';
73
+ import FilterOperator from '../api/FilterOperator';
74
+ import FilterService from '../api/FilterService';
75
+ import Paginator from '../paginator/Paginator.vue';
138
76
  import TableHeader from './TableHeader.vue';
139
77
  import TableBody from './TableBody.vue';
140
78
  import TableFooter from './TableFooter.vue';
@@ -229,6 +167,14 @@ export default {
229
167
  type: Object,
230
168
  default: null
231
169
  },
170
+ filterDisplay: {
171
+ type: String,
172
+ default: null
173
+ },
174
+ globalFilterFields: {
175
+ type: Array,
176
+ default: null
177
+ },
232
178
  filterLocale: {
233
179
  type: String,
234
180
  default: undefined
@@ -269,6 +215,10 @@ export default {
269
215
  type: String,
270
216
  default: 'download'
271
217
  },
218
+ exportFunction: {
219
+ type: Function,
220
+ default: null
221
+ },
272
222
  autoLayout: {
273
223
  type: Boolean,
274
224
  default: false
@@ -341,6 +291,10 @@ export default {
341
291
  type: Boolean,
342
292
  default: false
343
293
  },
294
+ scrollDirection: {
295
+ type: String,
296
+ default: "vertical"
297
+ },
344
298
  scrollHeight: {
345
299
  type: String,
346
300
  default: null
@@ -349,21 +303,29 @@ export default {
349
303
  type: Array,
350
304
  default: null
351
305
  },
352
- frozenWidth: {
306
+ responsiveLayout: {
353
307
  type: String,
354
- default: null
308
+ default: 'stack'
309
+ },
310
+ breakpoint: {
311
+ type: String,
312
+ default: '960px'
355
313
  },
356
- virtualScroll: {
314
+ showGridlines: {
357
315
  type: Boolean,
358
316
  default: false
359
317
  },
360
- virtualRowHeight: {
361
- type: Number,
362
- default: 28
318
+ stripedRows: {
319
+ type: Boolean,
320
+ default: false
363
321
  },
364
- virtualScrollDelay: {
365
- type: Number,
366
- default: 150
322
+ tableStyle: {
323
+ type: null,
324
+ default: null
325
+ },
326
+ tableClass: {
327
+ type: String,
328
+ default: null
367
329
  }
368
330
  },
369
331
  data() {
@@ -374,10 +336,13 @@ export default {
374
336
  d_sortField: this.sortField,
375
337
  d_sortOrder: this.sortOrder,
376
338
  d_multiSortMeta: this.multiSortMeta ? [...this.multiSortMeta] : [],
339
+ d_groupRowsSortMeta: null,
377
340
  d_selectionKeys: null,
378
341
  d_expandedRowKeys: null,
379
342
  d_columnOrder: null,
380
- d_editingRowKeys: null
343
+ d_editingRowKeys: null,
344
+ d_editingMeta: {},
345
+ d_filters: this.cloneFilters(this.filters)
381
346
  };
382
347
  },
383
348
  rowTouched: false,
@@ -397,7 +362,6 @@ export default {
397
362
  columnWidthsState: null,
398
363
  tableWidthState: null,
399
364
  columnWidthsRestored: false,
400
- virtualScrollTimer: null,
401
365
  watch: {
402
366
  first(newValue) {
403
367
  this.d_first = newValue;
@@ -414,9 +378,12 @@ export default {
414
378
  multiSortMeta(newValue) {
415
379
  this.d_multiSortMeta = newValue;
416
380
  },
417
- selection(newValue) {
418
- if (this.dataKey) {
419
- this.updateSelectionKeys(newValue);
381
+ selection: {
382
+ immediate: true,
383
+ handler(newValue) {
384
+ if (this.dataKey) {
385
+ this.updateSelectionKeys(newValue);
386
+ }
420
387
  }
421
388
  },
422
389
  expandedRows(newValue) {
@@ -428,6 +395,12 @@ export default {
428
395
  if (this.dataKey) {
429
396
  this.updateEditingRowKeys(newValue);
430
397
  }
398
+ },
399
+ filters: {
400
+ deep: true,
401
+ handler: function(newValue) {
402
+ this.d_filters = this.cloneFilters(newValue);
403
+ }
431
404
  }
432
405
  },
433
406
  beforeMount() {
@@ -448,25 +421,41 @@ export default {
448
421
  this.d_columnOrder = columnOrder;
449
422
  }
450
423
 
451
- if (this.resizableColumns && !this.columnWidthsRestored) {
424
+ this.$el.setAttribute(this.attributeSelector, '');
425
+
426
+ if (this.responsiveLayout === 'stack' && !this.scrollable) {
427
+ this.createResponsiveStyle();
428
+ }
429
+
430
+ if (this.isStateful() && this.resizableColumns) {
452
431
  this.restoreColumnWidths();
453
432
  }
433
+
434
+ if (this.editMode === 'row' && this.dataKey && !this.d_editingRowKeys) {
435
+ this.updateEditingRowKeys(this.editingRows);
436
+ }
454
437
  },
455
- beforeDestroy() {
438
+ beforeUnmount() {
456
439
  this.unbindColumnResizeEvents();
440
+ this.destroyStyleElement();
441
+ this.destroyResponsiveStyle();
457
442
  },
458
443
  updated() {
459
444
  if (this.isStateful()) {
460
445
  this.saveState();
446
+ }
461
447
 
462
- if (this.resizableColumns && !this.columnWidthsRestored) {
463
- this.restoreColumnWidths();
464
- this.columnWidthsRestored = true;
465
- }
448
+ if (this.editMode === 'row' && this.dataKey && !this.d_editingRowKeys) {
449
+ this.updateEditingRowKeys(this.editingRows);
466
450
  }
467
451
  },
468
452
  methods: {
453
+ columnProp(col, prop) {
454
+ return ObjectUtils.getVNodeProp(col, prop);
455
+ },
469
456
  onPage(event) {
457
+ this.clearEditingMetaData();
458
+
470
459
  this.d_first = event.first;
471
460
  this.d_rows = event.rows;
472
461
 
@@ -477,14 +466,15 @@ export default {
477
466
  this.$emit('update:first', this.d_first);
478
467
  this.$emit('update:rows', this.d_rows);
479
468
  this.$emit('page', pageEvent);
469
+ this.$emit('value-change', this.processedData);
480
470
  },
481
471
  onColumnHeaderClick(e) {
482
472
  const event = e.originalEvent;
483
473
  const column = e.column;
484
474
 
485
- if (column.sortable) {
475
+ if (this.columnProp(column, 'sortable')) {
486
476
  const targetNode = event.target;
487
- const columnField = column.sortField || column.field;
477
+ const columnField = this.columnProp(column, 'sortField') || this.columnProp(column, 'field');
488
478
 
489
479
  if (DomHandler.hasClass(targetNode, 'p-sortable-column') || DomHandler.hasClass(targetNode, 'p-column-title')
490
480
  || DomHandler.hasClass(targetNode, 'p-sortable-column-icon') || DomHandler.hasClass(targetNode.parentElement, 'p-sortable-column-icon')) {
@@ -520,10 +510,22 @@ export default {
520
510
  }
521
511
 
522
512
  this.$emit('sort', this.createLazyLoadEvent(event));
513
+ this.$emit('value-change', this.processedData);
523
514
  }
524
515
  }
525
516
  },
526
517
  sortSingle(value) {
518
+ this.clearEditingMetaData();
519
+
520
+ if (this.groupRowsBy && this.groupRowsBy === this.sortField) {
521
+ this.d_multiSortMeta = [
522
+ {field: this.sortField, order: this.sortOrder || this.defaultSortOrder},
523
+ {field: this.d_sortField, order: this.d_sortOrder}
524
+ ];
525
+
526
+ return this.sortMultiple(value);
527
+ }
528
+
527
529
  let data = [...value];
528
530
 
529
531
  data.sort((data1, data2) => {
@@ -549,6 +551,17 @@ export default {
549
551
  return data;
550
552
  },
551
553
  sortMultiple(value) {
554
+ this.clearEditingMetaData();
555
+
556
+ if (this.groupRowsBy && (this.d_groupRowsSortMeta || (this.d_multiSortMeta.length && this.groupRowsBy === this.d_multiSortMeta[0].field))) {
557
+ const firstSortMeta = this.d_multiSortMeta[0];
558
+ !this.d_groupRowsSortMeta && (this.d_groupRowsSortMeta = firstSortMeta);
559
+
560
+ if (firstSortMeta.field !== this.d_groupRowsSortMeta.field) {
561
+ this.d_multiSortMeta = [this.d_groupRowsSortMeta, ...this.d_multiSortMeta];
562
+ }
563
+ }
564
+
552
565
  let data = [...value];
553
566
 
554
567
  data.sort((data1, data2) => {
@@ -593,55 +606,92 @@ export default {
593
606
  this.d_multiSortMeta = [...this.d_multiSortMeta];
594
607
  },
595
608
  filter(data) {
609
+ if (!data) {
610
+ return;
611
+ }
612
+
613
+ this.clearEditingMetaData();
614
+
615
+ let globalFilterFieldsArray;
616
+ if (this.filters['global']) {
617
+ globalFilterFieldsArray = this.globalFilterFields|| this.columns.map(col => this.columnProp(col, 'filterField') || this.columnProp(col, 'field'));
618
+ }
619
+
596
620
  let filteredValue = [];
597
621
 
598
- for(let i = 0; i < data.length; i++) {
622
+ for (let i = 0; i < data.length; i++) {
599
623
  let localMatch = true;
600
624
  let globalMatch = false;
625
+ let localFiltered = false;
626
+
627
+ for (let prop in this.filters) {
628
+ if (Object.prototype.hasOwnProperty.call(this.filters, prop) && prop !== 'global') {
629
+ localFiltered = true;
630
+ let filterField = prop;
631
+ let filterMeta = this.filters[filterField];
601
632
 
602
- for(let j = 0; j < this.columns.length; j++) {
603
- let col = this.columns[j];
604
- let columnField = col.filterField || col.field;
605
-
606
- //local
607
- if (Object.prototype.hasOwnProperty.call(this.filters, columnField)) {
608
- let filterValue = this.filters[columnField];
609
- let dataFieldValue = ObjectUtils.resolveFieldData(data[i], columnField);
610
- let filterConstraint = col.filterMatchMode === 'custom' ? col.filterFunction : FilterUtils[col.filterMatchMode];
611
- if (!filterConstraint(dataFieldValue, filterValue, this.filterLocale)) {
612
- localMatch = false;
633
+ if (filterMeta.operator) {
634
+ for (let filterConstraint of filterMeta.constraints) {
635
+ localMatch = this.executeLocalFilter(filterField, data[i], filterConstraint);
636
+
637
+ if ((filterMeta.operator === FilterOperator.OR && localMatch) || (filterMeta.operator === FilterOperator.AND && !localMatch)) {
638
+ break;
639
+ }
640
+ }
641
+ }
642
+ else {
643
+ localMatch = this.executeLocalFilter(filterField, data[i], filterMeta);
613
644
  }
614
645
 
615
646
  if (!localMatch) {
616
647
  break;
617
648
  }
618
649
  }
650
+ }
651
+
652
+ if (this.filters['global'] && !globalMatch && globalFilterFieldsArray) {
653
+ for(let j = 0; j < globalFilterFieldsArray.length; j++) {
654
+ let globalFilterField = globalFilterFieldsArray[j];
655
+ globalMatch = FilterService.filters[this.filters['global'].matchMode || FilterMatchMode.CONTAINS](ObjectUtils.resolveFieldData(data[i], globalFilterField), this.filters['global'].value, this.filterLocale);
619
656
 
620
- if (!col.excludeGlobalFilter && this.hasGlobalFilter() && !globalMatch) {
621
- globalMatch = FilterUtils.contains(ObjectUtils.resolveFieldData(data[i], columnField), this.filters['global'], this.filterLocale);
657
+ if (globalMatch) {
658
+ break;
659
+ }
622
660
  }
623
661
  }
624
662
 
625
- let matches = localMatch;
626
- if(this.hasGlobalFilter()) {
627
- matches = localMatch && globalMatch;
663
+ let matches;
664
+ if (this.filters['global']) {
665
+ matches = localFiltered ? (localFiltered && localMatch && globalMatch) : globalMatch;
666
+ }
667
+ else {
668
+ matches = localFiltered && localMatch;
628
669
  }
629
670
 
630
- if(matches) {
671
+ if (matches) {
631
672
  filteredValue.push(data[i]);
632
673
  }
633
674
  }
634
675
 
635
- if (filteredValue.length === data.length) {
676
+ if (filteredValue.length === this.value.length) {
636
677
  filteredValue = data;
637
678
  }
638
679
 
639
680
  let filterEvent = this.createLazyLoadEvent();
640
681
  filterEvent.filteredValue = filteredValue;
641
682
  this.$emit('filter', filterEvent);
683
+ this.$emit('value-change', filteredValue);
642
684
 
643
685
  return filteredValue;
644
686
  },
687
+ executeLocalFilter(field, rowData, filterMeta) {
688
+ let filterValue = filterMeta.value;
689
+ let filterMatchMode = filterMeta.matchMode || FilterMatchMode.STARTS_WITH;
690
+ let dataFieldValue = ObjectUtils.resolveFieldData(rowData, field);
691
+ let filterConstraint = FilterService.filters[filterMatchMode];
692
+
693
+ return filterConstraint(dataFieldValue, filterValue, this.filterLocale);
694
+ },
645
695
  onRowClick(e) {
646
696
  const event = e.originalEvent;
647
697
  if (DomHandler.isClickable(event.target)) {
@@ -652,7 +702,7 @@ export default {
652
702
 
653
703
  if (this.selectionMode) {
654
704
  const rowData = e.data;
655
- const rowIndex = e.index + this.d_first;
705
+ const rowIndex = this.d_first + e.index;
656
706
 
657
707
  if (this.isMultipleSelectionMode() && event.shiftKey && this.anchorRowIndex != null) {
658
708
  DomHandler.clearSelection();
@@ -728,6 +778,7 @@ export default {
728
778
  if (DomHandler.isClickable(event.target)) {
729
779
  return;
730
780
  }
781
+
731
782
  this.$emit('row-dblclick', e);
732
783
  },
733
784
  onRowRightClick(event) {
@@ -835,7 +886,7 @@ export default {
835
886
  toggleRowsWithCheckbox(event) {
836
887
  const processedData = this.processedData;
837
888
  const checked = this.allRowsSelected;
838
- const _selection = checked ? [] : (processedData ? [...processedData] : [...this.value]);
889
+ const _selection = checked ? [] : (this.frozenValue ? [...this.frozenValue, ...processedData]: processedData);
839
890
  this.$emit('update:selection', _selection);
840
891
 
841
892
  if (checked)
@@ -938,13 +989,11 @@ export default {
938
989
  }
939
990
 
940
991
  const value = this.processedData;
941
- let _selection = [...this.selection];
992
+ let _selection = [];
942
993
  for(let i = rangeStart; i <= rangeEnd; i++) {
943
994
  let rangeRowData = value[i];
944
- if (!_selection.includes(rangeRowData)) {
945
- _selection.push(rangeRowData);
946
- this.$emit('row-select', {originalEvent: event, data: rangeRowData, type: 'row'});
947
- }
995
+ _selection.push(rangeRowData);
996
+ this.$emit('row-select', {originalEvent: event, data: rangeRowData, type: 'row'});
948
997
  }
949
998
 
950
999
  this.$emit('update:selection', _selection);
@@ -953,19 +1002,23 @@ export default {
953
1002
  let data = this.processedData;
954
1003
  let csv = '\ufeff';
955
1004
 
956
- if (options && options.selectionOnly) {
1005
+ if (options && options.selectionOnly)
957
1006
  data = this.selection || [];
958
- }
1007
+ else if (this.frozenValue)
1008
+ data = data ? [...this.frozenValue, ...data] : this.frozenValue;
959
1009
 
960
1010
  //headers
1011
+ let headerInitiated = false;
961
1012
  for (let i = 0; i < this.columns.length; i++) {
962
1013
  let column = this.columns[i];
963
- if (column.exportable !== false && column.field) {
964
- csv += '"' + (column.header || column.field) + '"';
965
1014
 
966
- if (i < (this.columns.length - 1)) {
1015
+ if (this.columnProp(column, 'exportable') !== false && this.columnProp(column, 'field')) {
1016
+ if (headerInitiated)
967
1017
  csv += this.csvSeparator;
968
- }
1018
+ else
1019
+ headerInitiated = true;
1020
+
1021
+ csv += '"' + (this.columnProp(column, 'header') || this.columnProp(column, 'field')) + '"';
969
1022
  }
970
1023
  }
971
1024
 
@@ -973,16 +1026,22 @@ export default {
973
1026
  if (data) {
974
1027
  data.forEach(record => {
975
1028
  csv += '\n';
1029
+ let rowInitiated = false;
976
1030
  for (let i = 0; i < this.columns.length; i++) {
977
1031
  let column = this.columns[i];
978
- if (column.exportable !== false && column.field) {
979
- let cellData = ObjectUtils.resolveFieldData(record, column.field);
1032
+ if (this.columnProp(column, 'exportable') !== false && this.columnProp(column, 'field')) {
1033
+ if (rowInitiated)
1034
+ csv += this.csvSeparator;
1035
+ else
1036
+ rowInitiated = true;
1037
+
1038
+ let cellData = ObjectUtils.resolveFieldData(record, this.columnProp(column, 'field'));
980
1039
 
981
1040
  if (cellData != null) {
982
1041
  if (this.exportFunction) {
983
1042
  cellData = this.exportFunction({
984
1043
  data: cellData,
985
- field: column.field
1044
+ field: this.columnProp(column, 'field')
986
1045
  });
987
1046
  }
988
1047
  else
@@ -991,12 +1050,7 @@ export default {
991
1050
  else
992
1051
  cellData = '';
993
1052
 
994
-
995
1053
  csv += '"' + cellData + '"';
996
-
997
- if (i < (this.columns.length - 1)) {
998
- csv += this.csvSeparator;
999
- }
1000
1054
  }
1001
1055
  }
1002
1056
  });
@@ -1058,33 +1112,26 @@ export default {
1058
1112
  let nextColumnWidth = nextColumn.offsetWidth - delta;
1059
1113
 
1060
1114
  if (newColumnWidth > 15 && nextColumnWidth > 15) {
1061
- if(this.scrollable) {
1062
- const scrollableView = this.findParentScrollableView(this.resizeColumnElement);
1063
- const scrollableBodyTable = DomHandler.findSingle(scrollableView, 'table.p-datatable-scrollable-body-table');
1064
- const scrollableHeaderTable = DomHandler.findSingle(scrollableView, 'table.p-datatable-scrollable-header-table');
1065
- const scrollableFooterTable = DomHandler.findSingle(scrollableView, 'table.p-datatable-scrollable-footer-table');
1066
- const resizeColumnIndex = DomHandler.index(this.resizeColumnElement);
1067
-
1068
- this.resizeColGroup(scrollableHeaderTable, resizeColumnIndex, newColumnWidth, nextColumnWidth);
1069
- this.resizeColGroup(scrollableBodyTable, resizeColumnIndex, newColumnWidth, nextColumnWidth);
1070
- this.resizeColGroup(scrollableFooterTable, resizeColumnIndex, newColumnWidth, nextColumnWidth);
1071
- }
1072
- else {
1115
+ if (!this.scrollable) {
1073
1116
  this.resizeColumnElement.style.width = newColumnWidth + 'px';
1074
1117
  if(nextColumn) {
1075
1118
  nextColumn.style.width = nextColumnWidth + 'px';
1076
1119
  }
1077
1120
  }
1121
+ else {
1122
+ this.resizeTableCells(newColumnWidth, nextColumnWidth);
1123
+ }
1078
1124
  }
1079
1125
  }
1080
1126
  else if (this.columnResizeMode === 'expand') {
1081
- if (this.scrollable) {
1082
- this.resizeScrollableTable(this.resizeColumnElement, newColumnWidth, delta);
1083
- }
1084
- else {
1085
- this.$refs.table.style.width = this.$refs.table.offsetWidth + delta + 'px';
1127
+ const tableWidth = this.$refs.table.offsetWidth + delta + 'px';
1128
+ this.$refs.table.style.width = tableWidth;
1129
+ this.$refs.table.style.minWidth = tableWidth;
1130
+
1131
+ if (!this.scrollable)
1086
1132
  this.resizeColumnElement.style.width = newColumnWidth + 'px';
1087
- }
1133
+ else
1134
+ this.resizeTableCells(newColumnWidth);
1088
1135
  }
1089
1136
 
1090
1137
  this.$emit('column-resize-end', {
@@ -1103,23 +1150,29 @@ export default {
1103
1150
  this.saveState();
1104
1151
  }
1105
1152
  },
1106
- resizeColGroup(table, resizeColumnIndex, newColumnWidth, nextColumnWidth) {
1107
- if(table) {
1108
- let colGroup = table.children[0].nodeName === 'COLGROUP' ? table.children[0] : null;
1153
+ resizeTableCells(newColumnWidth, nextColumnWidth) {
1154
+ let colIndex = DomHandler.index(this.resizeColumnElement);
1155
+ let widths = [];
1156
+ let headers = DomHandler.find(this.$refs.table, '.p-datatable-thead > tr > th');
1157
+ headers.forEach(header => widths.push(DomHandler.getOuterWidth(header)));
1109
1158
 
1110
- if(colGroup) {
1111
- let col = colGroup.children[resizeColumnIndex];
1112
- let nextCol = col.nextElementSibling;
1113
- col.style.width = newColumnWidth + 'px';
1159
+ this.destroyStyleElement();
1160
+ this.createStyleElement();
1114
1161
 
1115
- if (nextCol && nextColumnWidth) {
1116
- nextCol.style.width = nextColumnWidth + 'px';
1162
+ let innerHTML = '';
1163
+ widths.forEach((width,index) => {
1164
+ let colWidth = index === colIndex ? newColumnWidth : (nextColumnWidth && index === colIndex + 1) ? nextColumnWidth : width;
1165
+ innerHTML += `
1166
+ .p-datatable[${this.attributeSelector}] .p-datatable-thead > tr > th:nth-child(${index+1}) {
1167
+ flex: 0 0 ${colWidth}px !important;
1117
1168
  }
1118
- }
1119
- else {
1120
- throw new Error("Scrollable tables require a colgroup to support resizable columns");
1121
- }
1122
- }
1169
+
1170
+ .p-datatable[${this.attributeSelector}] .p-datatable-tbody > tr > td:nth-child(${index+1}) {
1171
+ flex: 0 0 ${colWidth}px !important;
1172
+ }
1173
+ `
1174
+ });
1175
+ this.styleElement.innerHTML = innerHTML;
1123
1176
  },
1124
1177
  bindColumnResizeEvents() {
1125
1178
  if (!this.documentColumnResizeListener) {
@@ -1148,14 +1201,14 @@ export default {
1148
1201
 
1149
1202
  if (this.documentColumnResizeEndListener) {
1150
1203
  document.removeEventListener('document', this.documentColumnResizeEndListener);
1151
- this.documentColumnResizeEndListener = null;
1204
+ this.documentColumnResizeEndListener = null;
1152
1205
  }
1153
1206
  },
1154
1207
  onColumnHeaderMouseDown(e) {
1155
1208
  const event = e.originalEvent;
1156
1209
  const column = e.column;
1157
1210
 
1158
- if (this.reorderableColumns && column.reorderableColumn) {
1211
+ if (this.reorderableColumns && this.columnProp(column, 'reorderableColumn') !== false) {
1159
1212
  if (event.target.nodeName === 'INPUT' || event.target.nodeName === 'TEXTAREA' || DomHandler.hasClass(event.target, 'p-column-resizer'))
1160
1213
  event.currentTarget.draggable = false;
1161
1214
  else
@@ -1222,7 +1275,8 @@ export default {
1222
1275
  }
1223
1276
 
1224
1277
  if (allowDrop) {
1225
- ObjectUtils.reorderArray(this.d_columnOrder, dragIndex, dropIndex);
1278
+ ObjectUtils.reorderArray(this.columns, dragIndex, dropIndex);
1279
+ this.updateReorderableColumns();
1226
1280
 
1227
1281
  this.$emit('column-reorder', {
1228
1282
  originalEvent: event,
@@ -1251,63 +1305,18 @@ export default {
1251
1305
  return parent;
1252
1306
  }
1253
1307
  },
1254
- findParentScrollableView(column) {
1255
- if (column) {
1256
- let parent = column.parentElement;
1257
- while (parent && !DomHandler.hasClass(parent, 'p-datatable-scrollable-view')) {
1258
- parent = parent.parentElement;
1259
- }
1260
-
1261
- return parent;
1262
- }
1263
- else {
1264
- return null;
1265
- }
1266
- },
1267
1308
  findColumnByKey(columns, key) {
1268
- if(columns && columns.length) {
1269
- for(let i = 0; i < columns.length; i++) {
1270
- let child = columns[i];
1271
- if(child.columnKey === key || child.field === key) {
1272
- return child;
1309
+ if (columns && columns.length) {
1310
+ for (let i = 0; i < columns.length; i++) {
1311
+ let column = columns[i];
1312
+ if (this.columnProp(column, 'columnKey') === key || this.columnProp(column, 'field') === key) {
1313
+ return column;
1273
1314
  }
1274
1315
  }
1275
1316
  }
1276
1317
 
1277
1318
  return null;
1278
1319
  },
1279
- resizeScrollableTable(column, newColumnWidth, delta) {
1280
- const scrollableView = column ? this.findParentScrollableView(column) : this.$el;
1281
- const scrollableBody = DomHandler.findSingle(scrollableView, '.p-datatable-scrollable-body');
1282
- const scrollableHeader = DomHandler.findSingle(scrollableView, '.p-datatable-scrollable-header');
1283
- const scrollableFooter = DomHandler.findSingle(scrollableView, '.p-datatable-scrollable-footer');
1284
- const scrollableBodyTable = DomHandler.findSingle(scrollableBody, 'table.p-datatable-scrollable-body-table');
1285
- const scrollableHeaderTable = DomHandler.findSingle(scrollableHeader, 'table.p-datatable-scrollable-header-table');
1286
- const scrollableFooterTable = DomHandler.findSingle(scrollableFooter, 'table.p-datatable-scrollable-footer-table');
1287
-
1288
- const scrollableBodyTableWidth = column ? scrollableBodyTable.offsetWidth + delta : newColumnWidth;
1289
- const scrollableHeaderTableWidth = column ? scrollableHeaderTable.offsetWidth + delta : newColumnWidth;
1290
- const isContainerInViewport = this.$el.offsetWidth >= parseFloat(scrollableBodyTableWidth);
1291
-
1292
- let setWidth = (container, table, width, isContainerInViewport) => {
1293
- if (container && table) {
1294
- container.style.width = isContainerInViewport ? width + DomHandler.calculateScrollbarWidth(scrollableBody) + 'px' : 'auto'
1295
- table.style.width = width + 'px';
1296
- }
1297
- };
1298
-
1299
- setWidth(scrollableBody, scrollableBodyTable, scrollableBodyTableWidth, isContainerInViewport);
1300
- setWidth(scrollableHeader, scrollableHeaderTable, scrollableHeaderTableWidth, isContainerInViewport);
1301
- setWidth(scrollableFooter, scrollableFooterTable, scrollableHeaderTableWidth, isContainerInViewport);
1302
-
1303
- if (column) {
1304
- let resizeColumnIndex = DomHandler.index(column);
1305
-
1306
- this.resizeColGroup(scrollableHeaderTable, resizeColumnIndex, newColumnWidth, null);
1307
- this.resizeColGroup(scrollableBodyTable, resizeColumnIndex, newColumnWidth, null);
1308
- this.resizeColGroup(scrollableFooterTable, resizeColumnIndex, newColumnWidth, null);
1309
- }
1310
- },
1311
1320
  onRowMouseDown(event) {
1312
1321
  if (DomHandler.hasClass(event.target, 'p-datatable-reorderablerow-handle'))
1313
1322
  event.currentTarget.draggable = true;
@@ -1474,7 +1483,7 @@ export default {
1474
1483
  state.multiSortMeta = this.d_multiSortMeta;
1475
1484
  }
1476
1485
 
1477
- if (this.hasFilters()) {
1486
+ if (this.hasFilters) {
1478
1487
  state.filters = this.filters;
1479
1488
  }
1480
1489
 
@@ -1506,12 +1515,20 @@ export default {
1506
1515
 
1507
1516
  this.$emit('state-save', state);
1508
1517
  },
1509
- restoreState() {
1518
+ restoreState() {debugger;
1510
1519
  const storage = this.getStorage();
1511
1520
  const stateString = storage.getItem(this.stateKey);
1521
+ const dateFormat = /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z/;
1522
+ const reviver = function(key, value) {
1523
+ if (typeof value === "string" && dateFormat.test(value)) {
1524
+ return new Date(value);
1525
+ }
1526
+
1527
+ return value;
1528
+ }
1512
1529
 
1513
1530
  if (stateString) {
1514
- let restoredState = JSON.parse(stateString);
1531
+ let restoredState = JSON.parse(stateString, reviver);
1515
1532
 
1516
1533
  if (this.paginator) {
1517
1534
  this.d_first = restoredState.first;
@@ -1564,8 +1581,7 @@ export default {
1564
1581
  state.columnWidths = widths.join(',');
1565
1582
 
1566
1583
  if (this.columnResizeMode === 'expand') {
1567
- state.tableWidth = this.scrollable ? DomHandler.findSingle(this.$el, '.p-datatable-scrollable-header-table').style.width :
1568
- DomHandler.getOuterWidth(this.$refs.table) + 'px';
1584
+ state.tableWidth = DomHandler.getOuterWidth(this.$refs.table) + 'px';
1569
1585
  }
1570
1586
  },
1571
1587
  restoreColumnWidths() {
@@ -1573,28 +1589,32 @@ export default {
1573
1589
  let widths = this.columnWidthsState.split(',');
1574
1590
 
1575
1591
  if (this.columnResizeMode === 'expand' && this.tableWidthState) {
1576
- if (this.scrollable) {
1577
- this.resizeScrollableTable(null, this.tableWidthState, 0);
1578
- }
1579
- else {
1580
- this.$refs.table.style.width = this.tableWidthState;
1581
- this.$el.style.width = this.tableWidthState;
1582
- }
1592
+ this.$refs.table.style.width = this.tableWidthState;
1593
+ this.$refs.table.style.minWidth = this.tableWidthState;
1594
+ this.$el.style.width = this.tableWidthState;
1583
1595
  }
1584
1596
 
1585
- if (this.scrollable) {
1586
- let headerCols = DomHandler.find(this.$el, '.p-datatable-scrollable-header-table > colgroup > col');
1587
- let bodyCols = DomHandler.find(this.$el, '.p-datatable-scrollable-body-table > colgroup > col');
1597
+ this.createStyleElement();
1598
+
1599
+ if (this.scrollable && widths && widths.length > 0) {
1600
+ let innerHTML = '';
1601
+ widths.forEach((width,index) => {
1602
+ innerHTML += `
1603
+ .p-datatable[${this.attributeSelector}] .p-datatable-thead > tr > th:nth-child(${index+1}) {
1604
+ flex: 0 0 ${width}px;
1605
+ }
1606
+
1607
+ .p-datatable[${this.attributeSelector}] .p-datatable-tbody > tr > td:nth-child(${index+1}) {
1608
+ flex: 0 0 ${width}px;
1609
+ }
1610
+ `
1611
+ });
1588
1612
 
1589
- headerCols.forEach((col, index) => col.style.width = widths[index] + 'px');
1590
- bodyCols.forEach((col, index) => col.style.width = widths[index] + 'px');
1613
+ this.styleElement.innerHTML = innerHTML;
1591
1614
  }
1592
1615
  else {
1593
- let headers = DomHandler.find(this.$refs.table, '.p-datatable-thead > tr > th');
1594
- headers.forEach((header, index) => header.style.width = widths[index] + 'px');
1616
+ DomHandler.find(this.$refs.table, '.p-datatable-thead > tr > th').forEach((header, index) => header.style.width = widths[index] + 'px');
1595
1617
  }
1596
-
1597
-
1598
1618
  }
1599
1619
  },
1600
1620
  onCellEditInit(event) {
@@ -1624,29 +1644,25 @@ export default {
1624
1644
  this.$emit('update:editingRows', _editingRows);
1625
1645
  this.$emit('row-edit-cancel', event);
1626
1646
  },
1627
- onVirtualScroll(event) {
1628
- if(this.virtualScrollTimer) {
1629
- clearTimeout(this.virtualScrollTimer);
1630
- }
1647
+ onEditingMetaChange(event) {
1648
+ let { data, field, index, editing } = event;
1649
+ let meta = this.d_editingMeta[index];
1631
1650
 
1632
- this.virtualScrollTimer = setTimeout(() => {
1633
- this.$emit('virtual-scroll', {
1634
- first: (event.page - 1) * this.rows,
1635
- rows: this.rows * 2
1636
- });
1637
- }, this.virtualScrollDelay);
1651
+ if (editing) {
1652
+ !meta && (meta = this.d_editingMeta[index] = { data: { ...data }, fields: [] });
1653
+ meta['fields'].push(field);
1654
+ }
1655
+ else if (meta) {
1656
+ const fields = meta['fields'].filter(f => f !== field);
1657
+ !fields.length ? (delete this.d_editingMeta[index]) : (meta['fields'] = fields);
1658
+ }
1638
1659
  },
1639
- createLazyLoadEvent(event) {
1640
- let filterMatchModes;
1641
- if (this.hasFilters()) {
1642
- filterMatchModes = {};
1643
- this.columns.forEach(col => {
1644
- if (col.field) {
1645
- filterMatchModes[col.field] = col.filterMatchMode;
1646
- }
1647
- });
1660
+ clearEditingMetaData() {
1661
+ if (this.editMode) {
1662
+ this.d_editingMeta = {};
1648
1663
  }
1649
-
1664
+ },
1665
+ createLazyLoadEvent(event) {
1650
1666
  return {
1651
1667
  originalEvent: event,
1652
1668
  first: this.d_first,
@@ -1654,16 +1670,113 @@ export default {
1654
1670
  sortField: this.d_sortField,
1655
1671
  sortOrder: this.d_sortOrder,
1656
1672
  multiSortMeta: this.d_multiSortMeta,
1657
- filters: this.filters,
1658
- filterMatchModes: filterMatchModes
1673
+ filters: this.d_filters
1659
1674
  };
1660
1675
  },
1661
- hasFilters() {
1662
- return this.filters && Object.keys(this.filters).length > 0 && this.filters.constructor === Object;
1663
- },
1664
1676
  hasGlobalFilter() {
1665
1677
  return this.filters && Object.prototype.hasOwnProperty.call(this.filters, 'global');
1666
1678
  },
1679
+ getChildren() {
1680
+ return this.$scopedSlots.default ? this.$scopedSlots.default() : null;
1681
+ },
1682
+ onFilterChange(filters) {
1683
+ this.d_filters = filters;
1684
+ },
1685
+ onFilterApply() {
1686
+ this.d_first = 0;
1687
+ this.$emit('update:first', this.d_first);
1688
+ this.$emit('update:filters', this.d_filters);
1689
+
1690
+ if (this.lazy) {
1691
+ this.$emit('filter', this.createLazyLoadEvent());
1692
+ }
1693
+ },
1694
+ cloneFilters() {
1695
+ let cloned = {};
1696
+ if (this.filters) {
1697
+ Object.entries(this.filters).forEach(([prop,value]) => {
1698
+ cloned[prop] = value.operator ? {operator: value.operator, constraints: value.constraints.map(constraint => {return {...constraint}})} : {...value};
1699
+ });
1700
+ }
1701
+
1702
+ return cloned;
1703
+ },
1704
+ updateReorderableColumns() {
1705
+ let columnOrder = [];
1706
+ this.columns.forEach(col => columnOrder.push(this.columnProp(col, 'columnKey')||this.columnProp(col, 'field')));
1707
+ this.d_columnOrder = columnOrder;
1708
+ },
1709
+ createStyleElement() {
1710
+ this.styleElement = document.createElement('style');
1711
+ this.styleElement.type = 'text/css';
1712
+ document.head.appendChild(this.styleElement);
1713
+ },
1714
+ createResponsiveStyle() {
1715
+ if (!this.responsiveStyleElement) {
1716
+ this.responsiveStyleElement = document.createElement('style');
1717
+ this.responsiveStyleElement.type = 'text/css';
1718
+ document.head.appendChild(this.responsiveStyleElement);
1719
+
1720
+ let innerHTML = `
1721
+ @media screen and (max-width: ${this.breakpoint}) {
1722
+ .p-datatable[${this.attributeSelector}] .p-datatable-thead > tr > th,
1723
+ .p-datatable[${this.attributeSelector}] .p-datatable-tfoot > tr > td {
1724
+ display: none !important;
1725
+ }
1726
+
1727
+ .p-datatable[${this.attributeSelector}] .p-datatable-tbody > tr > td {
1728
+ display: flex;
1729
+ width: 100% !important;
1730
+ align-items: center;
1731
+ justify-content: space-between;
1732
+ }
1733
+
1734
+ .p-datatable[${this.attributeSelector}] .p-datatable-tbody > tr > td:not(:last-child) {
1735
+ border: 0 none;
1736
+ }
1737
+
1738
+ .p-datatable[${this.attributeSelector}].p-datatable-gridlines .p-datatable-tbody > tr > td:last-child {
1739
+ border-top: 0;
1740
+ border-right: 0;
1741
+ border-left: 0;
1742
+ }
1743
+
1744
+ .p-datatable[${this.attributeSelector}] .p-datatable-tbody > tr > td > .p-column-title {
1745
+ display: block;
1746
+ }
1747
+ }
1748
+ `;
1749
+
1750
+ this.responsiveStyleElement.innerHTML = innerHTML;
1751
+ }
1752
+ },
1753
+ destroyResponsiveStyle() {
1754
+ if (this.responsiveStyleElement) {
1755
+ document.head.removeChild(this.responsiveStyleElement);
1756
+ this.responsiveStyleElement = null;
1757
+ }
1758
+ },
1759
+ destroyStyleElement() {
1760
+ if (this.styleElement) {
1761
+ document.head.removeChild(this.styleElement);
1762
+ this.styleElement = null;
1763
+ }
1764
+ },
1765
+ recursiveGetChildren(children, results) {
1766
+ if (!results) {
1767
+ results = [];
1768
+ }
1769
+ if (children && children.length) {
1770
+ children.forEach((child) => {
1771
+ if (child.children instanceof Array) {
1772
+ results.concat(this.recursiveGetChildren(child.children, results));
1773
+ } else if (child.type.name == 'Column') {
1774
+ results.push(child);
1775
+ }
1776
+ });
1777
+ }
1778
+ return results;
1779
+ },
1667
1780
  },
1668
1781
  computed: {
1669
1782
  containerClass() {
@@ -1674,8 +1787,16 @@ export default {
1674
1787
  'p-datatable-resizable': this.resizableColumns,
1675
1788
  'p-datatable-resizable-fit': this.resizableColumns && this.columnResizeMode === 'fit',
1676
1789
  'p-datatable-scrollable': this.scrollable,
1677
- 'p-datatable-virtual-scrollable': this.virtualScroll,
1678
- 'p-datatable-flex-scrollable': (this.scrollable && this.scrollHeight === 'flex')
1790
+ 'p-datatable-scrollable-vertical': this.scrollable && this.scrollDirection === 'vertical',
1791
+ 'p-datatable-scrollable-horizontal': this.scrollable && this.scrollDirection === 'horizontal',
1792
+ 'p-datatable-scrollable-both': this.scrollable && this.scrollDirection === 'both',
1793
+ 'p-datatable-flex-scrollable': (this.scrollable && this.scrollHeight === 'flex'),
1794
+ 'p-datatable-responsive-stack': this.responsiveLayout === 'stack',
1795
+ 'p-datatable-responsive-scroll': this.responsiveLayout === 'scroll',
1796
+ 'p-datatable-striped': this.stripedRows,
1797
+ 'p-datatable-gridlines': this.showGridlines,
1798
+ 'p-datatable-grouped-header': this.headerColumnGroup != null,
1799
+ 'p-datatable-grouped-footer': this.footerColumnGroup != null
1679
1800
  }
1680
1801
  ];
1681
1802
  },
@@ -1701,84 +1822,37 @@ export default {
1701
1822
  }
1702
1823
  return columns;
1703
1824
  },
1704
- frozenColumns() {
1705
- let frozenColumns = [];
1706
-
1707
- for(let col of this.columns) {
1708
- if(col.frozen) {
1709
- frozenColumns = frozenColumns||[];
1710
- frozenColumns.push(col);
1711
- }
1712
- }
1713
-
1714
- return frozenColumns;
1715
- },
1716
- scrollableColumns() {
1717
- let scrollableColumns = [];
1718
-
1719
- for(let col of this.columns) {
1720
- if(!col.frozen) {
1721
- scrollableColumns = scrollableColumns||[];
1722
- scrollableColumns.push(col);
1723
- }
1724
- }
1725
-
1726
- return scrollableColumns;
1727
- },
1728
- hasFrozenColumns() {
1729
- return this.frozenColumns.length > 0;
1730
- },
1731
1825
  headerColumnGroup() {
1732
1826
  if (this.allChildren) {
1733
1827
  for (let child of this.allChildren) {
1734
- if (child.$vnode.tag.indexOf('columngroup') !== -1 && child.type === 'header') {
1735
- return child;
1736
- }
1737
- }
1738
- }
1739
-
1740
- return null;
1741
- },
1742
- frozenHeaderColumnGroup() {
1743
- if (this.allChildren) {
1744
- for (let child of this.allChildren) {
1745
- if (child.$vnode.tag.indexOf('columngroup') !== -1 && child.type === 'frozenheader') {
1828
+ if (child.$vnode.tag.indexOf('columngroup') !== -1 && this.columnProp(child, 'type') === 'header') {
1746
1829
  return child;
1747
1830
  }
1748
1831
  }
1749
1832
  }
1750
-
1751
1833
  return null;
1752
1834
  },
1753
1835
  footerColumnGroup() {
1754
1836
  if (this.allChildren) {
1755
1837
  for (let child of this.allChildren) {
1756
- if (child.$vnode.tag.indexOf('columngroup') !== -1 && child.type === 'footer') {
1838
+ if (child.$vnode.tag.indexOf('columngroup') !== -1 && this.columnProp(child, 'type') === 'footer') {
1757
1839
  return child;
1758
1840
  }
1759
1841
  }
1760
1842
  }
1761
-
1762
1843
  return null;
1763
1844
  },
1764
- frozenFooterColumnGroup() {
1765
- if (this.allChildren) {
1766
- for (let child of this.allChildren) {
1767
- if (child.$vnode.tag.indexOf('columngroup') !== -1 && child.type === 'frozenfooter') {
1768
- return child;
1769
- }
1770
- }
1771
- }
1772
-
1773
- return null;
1845
+ hasFilters() {
1846
+ return this.filters && Object.keys(this.filters).length > 0 && this.filters.constructor === Object;
1774
1847
  },
1775
1848
  processedData() {
1776
- if (this.lazy) {
1777
- return this.value;
1778
- }
1779
- else {
1780
- if (this.value && this.value.length) {
1781
- let data = this.value;
1849
+ let data = this.value || [];
1850
+
1851
+ if (!this.lazy) {
1852
+ if (data && data.length) {
1853
+ if (this.hasFilters) {
1854
+ data = this.filter(data);
1855
+ }
1782
1856
 
1783
1857
  if (this.sorted) {
1784
1858
  if(this.sortMode === 'single')
@@ -1786,17 +1860,10 @@ export default {
1786
1860
  else if(this.sortMode === 'multiple')
1787
1861
  data = this.sortMultiple(data);
1788
1862
  }
1789
-
1790
- if (this.hasFilters()) {
1791
- data = this.filter(data);
1792
- }
1793
-
1794
- return data;
1795
- }
1796
- else {
1797
- return null;
1798
1863
  }
1799
1864
  }
1865
+
1866
+ return data;
1800
1867
  },
1801
1868
  dataToRender() {
1802
1869
  const data = this.processedData;
@@ -1835,13 +1902,19 @@ export default {
1835
1902
  return ['p-datatable-loading-icon pi-spin', this.loadingIcon];
1836
1903
  },
1837
1904
  allRowsSelected() {
1838
- const val = this.processedData;
1839
- return (val && val.length > 0 && this.selection && this.selection.length > 0 && this.selection.length === val.length);
1905
+ const val = this.frozenValue ? [...this.frozenValue, ...this.processedData]: this.processedData;
1906
+ const length = this.lazy ? this.totalRecords : (val ? val.length : 0);
1907
+ return (val && length > 0 && this.selection && this.selection.length > 0 && this.selection.length === length);
1908
+ },
1909
+ attributeSelector() {
1910
+ return UniqueComponentId();
1911
+ },
1912
+ groupRowSortField() {
1913
+ return this.sortMode === 'single' ? this.sortField : (this.d_groupRowsSortMeta ? this.d_groupRowsSortMeta.field : null);
1840
1914
  }
1841
1915
  },
1842
1916
  components: {
1843
1917
  'DTPaginator': Paginator,
1844
- 'DTScrollableView': ScrollableView,
1845
1918
  'DTTableHeader': TableHeader,
1846
1919
  'DTTableBody': TableBody,
1847
1920
  'DTTableFooter': TableFooter,
@@ -1856,7 +1929,7 @@ export default {
1856
1929
 
1857
1930
  .p-datatable table {
1858
1931
  border-collapse: collapse;
1859
- width: 100%;
1932
+ min-width: 100%;
1860
1933
  table-layout: fixed;
1861
1934
  }
1862
1935
 
@@ -1877,10 +1950,11 @@ export default {
1877
1950
  justify-content: center;
1878
1951
  }
1879
1952
 
1880
- .p-datatable-auto-layout > .p-datatable-wrapper {
1953
+ .p-datatable-responsive-scroll > .p-datatable-wrapper {
1881
1954
  overflow-x: auto;
1882
1955
  }
1883
1956
 
1957
+ .p-datatable-responsive-scroll > .p-datatable-wrapper > table,
1884
1958
  .p-datatable-auto-layout > .p-datatable-wrapper > table {
1885
1959
  table-layout: auto;
1886
1960
  }
@@ -1890,60 +1964,102 @@ export default {
1890
1964
  }
1891
1965
 
1892
1966
  /* Scrollable */
1893
- .p-datatable-scrollable-wrapper {
1967
+ .p-datatable-scrollable .p-datatable-wrapper {
1894
1968
  position: relative;
1969
+ overflow: auto;
1895
1970
  }
1896
1971
 
1897
- .p-datatable-scrollable-header,
1898
- .p-datatable-scrollable-footer {
1899
- overflow: hidden;
1972
+ .p-datatable-scrollable .p-datatable-thead,
1973
+ .p-datatable-scrollable .p-datatable-tbody,
1974
+ .p-datatable-scrollable .p-datatable-tfoot {
1975
+ display: block;
1900
1976
  }
1901
1977
 
1902
- .p-datatable-scrollable-body {
1903
- overflow: auto;
1904
- position: relative;
1978
+ .p-datatable-scrollable .p-datatable-thead > tr,
1979
+ .p-datatable-scrollable .p-datatable-tbody > tr,
1980
+ .p-datatable-scrollable .p-datatable-tfoot > tr {
1981
+ display: flex;
1982
+ flex-wrap: nowrap;
1983
+ width: 100%;
1984
+ }
1985
+
1986
+ .p-datatable-scrollable .p-datatable-thead > tr > th,
1987
+ .p-datatable-scrollable .p-datatable-tbody > tr > td,
1988
+ .p-datatable-scrollable .p-datatable-tfoot > tr > td {
1989
+ display: flex;
1990
+ flex: 1 1 0;
1991
+ align-items: center;
1905
1992
  }
1906
1993
 
1907
- .p-datatable-scrollable-body > table > .p-datatable-tbody > tr:first-child > td {
1908
- border-top: 0 none;
1994
+ .p-datatable-scrollable .p-datatable-thead {
1995
+ position: sticky;
1996
+ top: 0;
1997
+ z-index: 1;
1909
1998
  }
1910
1999
 
1911
- .p-datatable-virtual-table {
1912
- position: absolute;
2000
+ .p-datatable-scrollable .p-datatable-frozen-tbody {
2001
+ position: sticky;
2002
+ z-index: 1;
1913
2003
  }
1914
2004
 
1915
- /* Frozen Columns */
1916
- .p-datatable-frozen-view .p-datatable-scrollable-body {
1917
- overflow: hidden;
2005
+ .p-datatable-scrollable .p-datatable-tfoot {
2006
+ position: sticky;
2007
+ bottom: 0;
2008
+ z-index: 1;
1918
2009
  }
1919
2010
 
1920
- .p-datatable-frozen-view > .p-datatable-scrollable-body > table > .p-datatable-tbody > tr > td:last-child {
1921
- border-right: 0 none;
2011
+ .p-datatable-scrollable .p-frozen-column {
2012
+ position: sticky;
2013
+ background: inherit;
1922
2014
  }
1923
2015
 
1924
- .p-datatable-unfrozen-view {
1925
- position: absolute;
1926
- top: 0;
2016
+ .p-datatable-scrollable th.p-frozen-column {
2017
+ z-index: 1;
2018
+ }
2019
+
2020
+ .p-datatable-scrollable-both .p-datatable-thead > tr > th,
2021
+ .p-datatable-scrollable-both .p-datatable-tbody > tr > td,
2022
+ .p-datatable-scrollable-both .p-datatable-tfoot > tr > td,
2023
+ .p-datatable-scrollable-horizontal .p-datatable-thead > tr > th
2024
+ .p-datatable-scrollable-horizontal .p-datatable-tbody > tr > td,
2025
+ .p-datatable-scrollable-horizontal .p-datatable-tfoot > tr > td {
2026
+ flex: 0 0 auto;
1927
2027
  }
1928
2028
 
1929
- /* Flex Scrollable */
1930
2029
  .p-datatable-flex-scrollable {
1931
2030
  display: flex;
1932
2031
  flex-direction: column;
1933
- flex: 1;
1934
2032
  height: 100%;
1935
2033
  }
1936
2034
 
1937
- .p-datatable-flex-scrollable .p-datatable-scrollable-wrapper,
1938
- .p-datatable-flex-scrollable .p-datatable-scrollable-view {
2035
+ .p-datatable-flex-scrollable .p-datatable-wrapper {
1939
2036
  display: flex;
1940
2037
  flex-direction: column;
1941
2038
  flex: 1;
1942
2039
  height: 100%;
1943
2040
  }
1944
2041
 
1945
- .p-datatable-flex-scrollable .p-datatable-scrollable-body {
1946
- flex: 1;
2042
+ .p-datatable-scrollable .p-rowgroup-header {
2043
+ position: sticky;
2044
+ z-index: 1;
2045
+ }
2046
+
2047
+ .p-datatable-scrollable.p-datatable-grouped-header .p-datatable-thead,
2048
+ .p-datatable-scrollable.p-datatable-grouped-footer .p-datatable-tfoot {
2049
+ display: table;
2050
+ border-collapse: collapse;
2051
+ width: 100%;
2052
+ table-layout: fixed;
2053
+ }
2054
+
2055
+ .p-datatable-scrollable.p-datatable-grouped-header .p-datatable-thead > tr,
2056
+ .p-datatable-scrollable.p-datatable-grouped-footer .p-datatable-tfoot > tr {
2057
+ display: table-row;
2058
+ }
2059
+
2060
+ .p-datatable-scrollable.p-datatable-grouped-header .p-datatable-thead > tr > th,
2061
+ .p-datatable-scrollable.p-datatable-grouped-footer .p-datatable-tfoot > tr > td {
2062
+ display: table-cell;
1947
2063
  }
1948
2064
 
1949
2065
  /* Resizable */
@@ -1980,6 +2096,11 @@ export default {
1980
2096
  border: 1px solid transparent;
1981
2097
  }
1982
2098
 
2099
+ .p-datatable .p-column-header-content {
2100
+ display: flex;
2101
+ align-items: center;
2102
+ }
2103
+
1983
2104
  .p-datatable .p-column-resizer-helper {
1984
2105
  width: 1px;
1985
2106
  position: absolute;
@@ -2021,4 +2142,73 @@ export default {
2021
2142
  justify-content: center;
2022
2143
  z-index: 2;
2023
2144
  }
2145
+
2146
+ /* Filter */
2147
+ .p-column-filter-row {
2148
+ display: flex;
2149
+ align-items: center;
2150
+ width: 100%;
2151
+ }
2152
+
2153
+ .p-column-filter-menu {
2154
+ display: inline-flex;
2155
+ margin-left: auto;
2156
+ }
2157
+
2158
+ .p-column-filter-row .p-column-filter-element {
2159
+ flex: 1 1 auto;
2160
+ width: 1%;
2161
+ }
2162
+
2163
+ .p-column-filter-menu-button,
2164
+ .p-column-filter-clear-button {
2165
+ display: inline-flex;
2166
+ justify-content: center;
2167
+ align-items: center;
2168
+ cursor: pointer;
2169
+ text-decoration: none;
2170
+ overflow: hidden;
2171
+ position: relative;
2172
+ }
2173
+
2174
+ .p-column-filter-overlay {
2175
+ position: absolute;
2176
+ top: 0;
2177
+ left: 0;
2178
+ }
2179
+
2180
+ .p-column-filter-row-items {
2181
+ margin: 0;
2182
+ padding: 0;
2183
+ list-style: none;
2184
+ }
2185
+
2186
+ .p-column-filter-row-item {
2187
+ cursor: pointer;
2188
+ }
2189
+
2190
+ .p-column-filter-add-button,
2191
+ .p-column-filter-remove-button {
2192
+ justify-content: center;
2193
+ }
2194
+
2195
+ .p-column-filter-add-button .p-button-label,
2196
+ .p-column-filter-remove-button .p-button-label {
2197
+ flex-grow: 0;
2198
+ }
2199
+
2200
+ .p-column-filter-buttonbar {
2201
+ display: flex;
2202
+ align-items: center;
2203
+ justify-content: space-between;
2204
+ }
2205
+
2206
+ .p-column-filter-buttonbar .p-button:not(.p-button-icon-only) {
2207
+ width: auto;
2208
+ }
2209
+
2210
+ /* Responsive */
2211
+ .p-datatable .p-datatable-tbody > tr > td > .p-column-title {
2212
+ display: none;
2213
+ }
2024
2214
  </style>