primeng 4.2.1 → 4.3.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 (213) hide show
  1. package/.travis.yml +20 -0
  2. package/README.md +5 -0
  3. package/components/autocomplete/autocomplete.d.ts +1 -1
  4. package/components/autocomplete/autocomplete.js +17 -11
  5. package/components/autocomplete/autocomplete.js.map +1 -1
  6. package/components/autocomplete/autocomplete.metadata.json +1 -1
  7. package/components/blockui/blockui.d.ts +2 -0
  8. package/components/blockui/blockui.js +13 -1
  9. package/components/blockui/blockui.js.map +1 -1
  10. package/components/blockui/blockui.metadata.json +1 -1
  11. package/components/breadcrumb/breadcrumb.js +1 -1
  12. package/components/breadcrumb/breadcrumb.js.map +1 -1
  13. package/components/breadcrumb/breadcrumb.metadata.json +1 -1
  14. package/components/calendar/calendar.d.ts +6 -0
  15. package/components/calendar/calendar.js +167 -58
  16. package/components/calendar/calendar.js.map +1 -1
  17. package/components/calendar/calendar.metadata.json +1 -1
  18. package/components/carousel/carousel.js +4 -2
  19. package/components/carousel/carousel.js.map +1 -1
  20. package/components/checkbox/checkbox.d.ts +2 -1
  21. package/components/checkbox/checkbox.js +7 -0
  22. package/components/checkbox/checkbox.js.map +1 -1
  23. package/components/checkbox/checkbox.metadata.json +1 -1
  24. package/components/chips/chips.d.ts +5 -2
  25. package/components/chips/chips.js +24 -4
  26. package/components/chips/chips.js.map +1 -1
  27. package/components/chips/chips.metadata.json +1 -1
  28. package/components/colorpicker/colorpicker.js +5 -5
  29. package/components/colorpicker/colorpicker.js.map +1 -1
  30. package/components/common/menuitem.d.ts +4 -1
  31. package/components/common/shared.d.ts +11 -0
  32. package/components/common/shared.js +46 -1
  33. package/components/common/shared.js.map +1 -1
  34. package/components/common/shared.metadata.json +1 -1
  35. package/components/confirmdialog/confirmdialog.d.ts +5 -2
  36. package/components/confirmdialog/confirmdialog.js +34 -18
  37. package/components/confirmdialog/confirmdialog.js.map +1 -1
  38. package/components/confirmdialog/confirmdialog.metadata.json +1 -1
  39. package/components/contextmenu/contextmenu.js +1 -1
  40. package/components/contextmenu/contextmenu.js.map +1 -1
  41. package/components/contextmenu/contextmenu.metadata.json +1 -1
  42. package/components/datalist/datalist.js +1 -1
  43. package/components/datalist/datalist.js.map +1 -1
  44. package/components/datalist/datalist.metadata.json +1 -1
  45. package/components/datatable/datatable.d.ts +25 -7
  46. package/components/datatable/datatable.js +222 -104
  47. package/components/datatable/datatable.js.map +1 -1
  48. package/components/datatable/datatable.metadata.json +1 -1
  49. package/components/dialog/dialog.d.ts +16 -8
  50. package/components/dialog/dialog.js +86 -38
  51. package/components/dialog/dialog.js.map +1 -1
  52. package/components/dialog/dialog.metadata.json +1 -1
  53. package/components/dropdown/dropdown.d.ts +8 -4
  54. package/components/dropdown/dropdown.js +24 -2
  55. package/components/dropdown/dropdown.js.map +1 -1
  56. package/components/dropdown/dropdown.metadata.json +1 -1
  57. package/components/editor/editor.d.ts +2 -1
  58. package/components/editor/editor.js +21 -4
  59. package/components/editor/editor.js.map +1 -1
  60. package/components/editor/editor.metadata.json +1 -1
  61. package/components/growl/growl.d.ts +2 -2
  62. package/components/growl/growl.js +20 -10
  63. package/components/growl/growl.js.map +1 -1
  64. package/components/growl/growl.metadata.json +1 -1
  65. package/components/inputswitch/inputswitch.js +1 -1
  66. package/components/inputswitch/inputswitch.js.map +1 -1
  67. package/components/lightbox/lightbox.js +1 -1
  68. package/components/lightbox/lightbox.js.map +1 -1
  69. package/components/lightbox/lightbox.metadata.json +1 -1
  70. package/components/listbox/listbox.d.ts +12 -4
  71. package/components/listbox/listbox.js +73 -39
  72. package/components/listbox/listbox.js.map +1 -1
  73. package/components/listbox/listbox.metadata.json +1 -1
  74. package/components/megamenu/megamenu.js +1 -1
  75. package/components/megamenu/megamenu.js.map +1 -1
  76. package/components/megamenu/megamenu.metadata.json +1 -1
  77. package/components/menu/menu.js +1 -1
  78. package/components/menu/menu.js.map +1 -1
  79. package/components/menu/menu.metadata.json +1 -1
  80. package/components/menubar/menubar.js +1 -1
  81. package/components/menubar/menubar.js.map +1 -1
  82. package/components/menubar/menubar.metadata.json +1 -1
  83. package/components/message/message.d.ts +7 -0
  84. package/components/message/message.js +77 -0
  85. package/components/message/message.js.map +1 -0
  86. package/components/message/message.metadata.json +1 -0
  87. package/components/messages/messages.js +3 -3
  88. package/components/messages/messages.js.map +1 -1
  89. package/components/messages/messages.metadata.json +1 -1
  90. package/components/multiselect/multiselect.d.ts +15 -10
  91. package/components/multiselect/multiselect.js +73 -27
  92. package/components/multiselect/multiselect.js.map +1 -1
  93. package/components/multiselect/multiselect.metadata.json +1 -1
  94. package/components/orderlist/orderlist.js +10 -6
  95. package/components/orderlist/orderlist.js.map +1 -1
  96. package/components/orderlist/orderlist.metadata.json +1 -1
  97. package/components/overlaypanel/overlaypanel.d.ts +10 -5
  98. package/components/overlaypanel/overlaypanel.js +61 -40
  99. package/components/overlaypanel/overlaypanel.js.map +1 -1
  100. package/components/overlaypanel/overlaypanel.metadata.json +1 -1
  101. package/components/paginator/paginator.d.ts +4 -1
  102. package/components/paginator/paginator.js +27 -8
  103. package/components/paginator/paginator.js.map +1 -1
  104. package/components/paginator/paginator.metadata.json +1 -1
  105. package/components/panel/panel.d.ts +1 -0
  106. package/components/panel/panel.js +6 -1
  107. package/components/panel/panel.js.map +1 -1
  108. package/components/panel/panel.metadata.json +1 -1
  109. package/components/panelmenu/panelmenu.d.ts +2 -0
  110. package/components/panelmenu/panelmenu.js +25 -3
  111. package/components/panelmenu/panelmenu.js.map +1 -1
  112. package/components/panelmenu/panelmenu.metadata.json +1 -1
  113. package/components/picklist/picklist.d.ts +5 -2
  114. package/components/picklist/picklist.js +39 -7
  115. package/components/picklist/picklist.js.map +1 -1
  116. package/components/picklist/picklist.metadata.json +1 -1
  117. package/components/progressbar/progressbar.d.ts +3 -0
  118. package/components/progressbar/progressbar.js +14 -1
  119. package/components/progressbar/progressbar.js.map +1 -1
  120. package/components/progressbar/progressbar.metadata.json +1 -1
  121. package/components/progressspinner/progressspinner.d.ts +9 -0
  122. package/components/progressspinner/progressspinner.js +62 -0
  123. package/components/progressspinner/progressspinner.js.map +1 -0
  124. package/components/progressspinner/progressspinner.metadata.json +1 -0
  125. package/components/rating/rating.d.ts +6 -0
  126. package/components/rating/rating.js +28 -1
  127. package/components/rating/rating.js.map +1 -1
  128. package/components/rating/rating.metadata.json +1 -1
  129. package/components/schedule/schedule.d.ts +1 -0
  130. package/components/schedule/schedule.js +5 -0
  131. package/components/schedule/schedule.js.map +1 -1
  132. package/components/schedule/schedule.metadata.json +1 -1
  133. package/components/selectbutton/selectbutton.d.ts +6 -1
  134. package/components/selectbutton/selectbutton.js +26 -7
  135. package/components/selectbutton/selectbutton.js.map +1 -1
  136. package/components/selectbutton/selectbutton.metadata.json +1 -1
  137. package/components/sidebar/sidebar.d.ts +38 -0
  138. package/components/sidebar/sidebar.js +214 -0
  139. package/components/sidebar/sidebar.js.map +1 -0
  140. package/components/sidebar/sidebar.metadata.json +1 -0
  141. package/components/slidemenu/slidemenu.js +1 -1
  142. package/components/slidemenu/slidemenu.js.map +1 -1
  143. package/components/slidemenu/slidemenu.metadata.json +1 -1
  144. package/components/slider/slider.js +18 -16
  145. package/components/slider/slider.js.map +1 -1
  146. package/components/spinner/spinner.d.ts +4 -3
  147. package/components/spinner/spinner.js +12 -7
  148. package/components/spinner/spinner.js.map +1 -1
  149. package/components/spinner/spinner.metadata.json +1 -1
  150. package/components/splitbutton/splitbutton.js +1 -1
  151. package/components/splitbutton/splitbutton.js.map +1 -1
  152. package/components/splitbutton/splitbutton.metadata.json +1 -1
  153. package/components/steps/steps.js +1 -1
  154. package/components/steps/steps.js.map +1 -1
  155. package/components/steps/steps.metadata.json +1 -1
  156. package/components/tabmenu/tabmenu.d.ts +0 -1
  157. package/components/tabmenu/tabmenu.js +1 -6
  158. package/components/tabmenu/tabmenu.js.map +1 -1
  159. package/components/tabmenu/tabmenu.metadata.json +1 -1
  160. package/components/tieredmenu/tieredmenu.js +5 -3
  161. package/components/tieredmenu/tieredmenu.js.map +1 -1
  162. package/components/tieredmenu/tieredmenu.metadata.json +1 -1
  163. package/components/tooltip/tooltip.d.ts +1 -0
  164. package/components/tooltip/tooltip.js +11 -0
  165. package/components/tooltip/tooltip.js.map +1 -1
  166. package/components/tooltip/tooltip.metadata.json +1 -1
  167. package/components/treetable/treetable.js +2 -2
  168. package/components/treetable/treetable.js.map +1 -1
  169. package/components/treetable/treetable.metadata.json +1 -1
  170. package/components/utils/objectutils.d.ts +2 -0
  171. package/components/utils/objectutils.js +11 -0
  172. package/components/utils/objectutils.js.map +1 -1
  173. package/components/utils/objectutils.metadata.json +1 -1
  174. package/package-lock.json +14366 -0
  175. package/package.json +34 -34
  176. package/primeng.d.ts +3 -0
  177. package/primeng.js +3 -0
  178. package/resources/primeng.css +342 -40
  179. package/resources/primeng.min.css +1 -1
  180. package/resources/themes/_theme.scss +93 -83
  181. package/resources/themes/cruze/theme.css +12 -3
  182. package/resources/themes/cruze/theme.css.map +7 -0
  183. package/resources/themes/cupertino/theme.css +12 -3
  184. package/resources/themes/cupertino/theme.css.map +7 -0
  185. package/resources/themes/darkness/theme.css +12 -3
  186. package/resources/themes/darkness/theme.css.map +7 -0
  187. package/resources/themes/flick/theme.css +12 -3
  188. package/resources/themes/flick/theme.css.map +7 -0
  189. package/resources/themes/home/theme.css +12 -3
  190. package/resources/themes/home/theme.css.map +7 -0
  191. package/resources/themes/kasper/theme.css +12 -3
  192. package/resources/themes/kasper/theme.css.map +7 -0
  193. package/resources/themes/lightness/theme.css +12 -3
  194. package/resources/themes/lightness/theme.css.map +7 -0
  195. package/resources/themes/ludvig/theme.css +12 -3
  196. package/resources/themes/ludvig/theme.css.map +7 -0
  197. package/resources/themes/omega/theme.css +20 -9
  198. package/resources/themes/omega/theme.css.map +1 -1
  199. package/resources/themes/omega/theme.scss +21 -6
  200. package/resources/themes/pepper-grinder/theme.css +12 -3
  201. package/resources/themes/pepper-grinder/theme.css.map +7 -0
  202. package/resources/themes/redmond/theme.css +12 -3
  203. package/resources/themes/redmond/theme.css.map +7 -0
  204. package/resources/themes/rocket/theme.css +12 -3
  205. package/resources/themes/rocket/theme.css.map +7 -0
  206. package/resources/themes/south-street/theme.css +12 -3
  207. package/resources/themes/south-street/theme.css.map +7 -0
  208. package/resources/themes/start/theme.css +12 -3
  209. package/resources/themes/start/theme.css.map +7 -0
  210. package/resources/themes/trontastic/theme.css +12 -3
  211. package/resources/themes/trontastic/theme.css.map +7 -0
  212. package/resources/themes/voclain/theme.css +12 -3
  213. package/resources/themes/voclain/theme.css.map +7 -0
@@ -70,7 +70,7 @@ __decorate([
70
70
  DTCheckbox = __decorate([
71
71
  core_1.Component({
72
72
  selector: 'p-dtCheckbox',
73
- template: "\n <div class=\"ui-chkbox ui-widget\">\n <div class=\"ui-helper-hidden-accessible\">\n <input type=\"checkbox\" [checked]=\"checked\">\n </div>\n <div class=\"ui-chkbox-box ui-widget ui-corner-all ui-state-default\" (click)=\"handleClick($event)\"\n (mouseover)=\"hover=true\" (mouseout)=\"hover=false\" \n [ngClass]=\"{'ui-state-hover':hover&&!disabled,'ui-state-active':checked&&!disabled,'ui-state-disabled':disabled}\">\n <span class=\"ui-chkbox-icon ui-clickable\" [ngClass]=\"{'fa fa-check':checked}\"></span>\n </div>\n </div>\n "
73
+ template: "\n <div class=\"ui-chkbox ui-widget\">\n <div class=\"ui-helper-hidden-accessible\">\n <input type=\"checkbox\" [checked]=\"checked\">\n </div>\n <div class=\"ui-chkbox-box ui-widget ui-corner-all ui-state-default\" (click)=\"handleClick($event)\"\n (mouseover)=\"hover=true\" (mouseout)=\"hover=false\"\n [ngClass]=\"{'ui-state-hover':hover&&!disabled,'ui-state-active':checked&&!disabled,'ui-state-disabled':disabled}\">\n <span class=\"ui-chkbox-icon ui-clickable\" [ngClass]=\"{'fa fa-check':checked}\"></span>\n </div>\n </div>\n "
74
74
  })
75
75
  ], DTCheckbox);
76
76
  exports.DTCheckbox = DTCheckbox;
@@ -122,7 +122,7 @@ __decorate([
122
122
  ColumnHeaders = __decorate([
123
123
  core_1.Component({
124
124
  selector: '[pColumnHeaders]',
125
- template: "\n <ng-template ngFor let-col [ngForOf]=\"columns\" let-lastCol=\"last\">\n <th #headerCell [attr.id]=\"col.colId\" [ngStyle]=\"col.style\" [class]=\"col.styleClass\" (click)=\"dt.sort($event,col)\" [attr.colspan]=\"col.colspan\" [attr.rowspan]=\"col.rowspan\"\n [ngClass]=\"{'ui-state-default ui-unselectable-text':true, 'ui-sortable-column': col.sortable, 'ui-state-active': dt.isSorted(col), 'ui-resizable-column': dt.resizableColumns, 'ui-selection-column':col.selectionMode,\n 'ui-helper-hidden': col.hidden}\" \n (dragstart)=\"dt.onColumnDragStart($event)\" (dragleave)=\"dt.onColumnDragleave($event)\" (drop)=\"dt.onColumnDrop($event)\" (mousedown)=\"dt.onHeaderMousedown($event,headerCell)\"\n [attr.tabindex]=\"col.sortable ? tabindex : null\" (keydown)=\"dt.onHeaderKeydown($event,col)\">\n <span class=\"ui-column-resizer ui-clickable\" *ngIf=\"dt.resizableColumns && ((dt.columnResizeMode == 'fit' && !lastCol) || dt.columnResizeMode == 'expand')\" (mousedown)=\"dt.initColumnResize($event)\"></span>\n <span class=\"ui-column-title\" *ngIf=\"!col.selectionMode&&!col.headerTemplate\">{{col.header}}</span>\n <span class=\"ui-column-title\" *ngIf=\"col.headerTemplate\">\n <p-columnHeaderTemplateLoader [column]=\"col\"></p-columnHeaderTemplateLoader>\n </span>\n <span class=\"ui-sortable-column-icon fa fa-fw fa-sort\" *ngIf=\"col.sortable\"\n [ngClass]=\"{'fa-sort-desc': (dt.getSortOrder(col) == -1),'fa-sort-asc': (dt.getSortOrder(col) == 1)}\"></span>\n <input [attr.type]=\"col.filterType\" class=\"ui-column-filter ui-inputtext ui-widget ui-state-default ui-corner-all\" [attr.maxlength]=\"col.filterMaxlength\" [attr.placeholder]=\"col.filterPlaceholder\" *ngIf=\"col.filter&&!col.filterTemplate\" [value]=\"dt.filters[col.filterField||col.field] ? dt.filters[col.filterField||col.field].value : ''\" \n (click)=\"dt.onFilterInputClick($event)\" (input)=\"dt.onFilterKeyup($event.target.value, col.filterField||col.field, col.filterMatchMode)\"/>\n <p-columnFilterTemplateLoader [column]=\"col\" *ngIf=\"col.filterTemplate\"></p-columnFilterTemplateLoader>\n <p-dtCheckbox *ngIf=\"col.selectionMode=='multiple'\" (onChange)=\"dt.toggleRowsWithCheckbox($event)\" [checked]=\"dt.allSelected\" [disabled]=\"dt.isEmpty()\"></p-dtCheckbox>\n </th>\n </ng-template>\n "
125
+ template: "\n <ng-template ngFor let-col [ngForOf]=\"columns\" let-lastCol=\"last\">\n <th #headerCell [attr.id]=\"col.colId\" [ngStyle]=\"col.headerStyle||col.style\" [class]=\"col.headerStyleClass||col.styleClass\" (click)=\"dt.sort($event,col)\" [attr.colspan]=\"col.colspan\" [attr.rowspan]=\"col.rowspan\"\n [ngClass]=\"{'ui-state-default ui-unselectable-text':true, 'ui-sortable-column': col.sortable, 'ui-state-active': dt.isSorted(col), 'ui-resizable-column': dt.resizableColumns, 'ui-selection-column':col.selectionMode,\n 'ui-helper-hidden': col.hidden}\"\n (dragstart)=\"dt.onColumnDragStart($event)\" (dragleave)=\"dt.onColumnDragleave($event)\" (drop)=\"dt.onColumnDrop($event)\" (mousedown)=\"dt.onHeaderMousedown($event,headerCell)\"\n [attr.tabindex]=\"col.sortable ? tabindex : null\" (keydown)=\"dt.onHeaderKeydown($event,col)\"\n [attr.scope]=\"col.scope||(col.colspan ? 'colgroup' : 'col')\">\n <span class=\"ui-column-resizer ui-clickable\" *ngIf=\"dt.resizableColumns && ((dt.columnResizeMode == 'fit' && !lastCol) || dt.columnResizeMode == 'expand')\" (mousedown)=\"dt.initColumnResize($event)\"></span>\n <span class=\"ui-column-title\" *ngIf=\"!col.selectionMode&&!col.headerTemplate\">{{col.header}}</span>\n <span class=\"ui-column-title\" *ngIf=\"col.headerTemplate\">\n <p-columnHeaderTemplateLoader [column]=\"col\"></p-columnHeaderTemplateLoader>\n </span>\n <span class=\"ui-sortable-column-icon fa fa-fw fa-sort\" *ngIf=\"col.sortable\"\n [ngClass]=\"{'fa-sort-desc': (dt.getSortOrder(col) == -1),'fa-sort-asc': (dt.getSortOrder(col) == 1)}\"></span>\n <input [attr.type]=\"col.filterType\" class=\"ui-column-filter ui-inputtext ui-widget ui-state-default ui-corner-all\" [attr.maxlength]=\"col.filterMaxlength\" [attr.placeholder]=\"col.filterPlaceholder\" *ngIf=\"col.filter&&!col.filterTemplate\" [value]=\"dt.filters[col.filterField||col.field] ? dt.filters[col.filterField||col.field].value : ''\"\n (click)=\"dt.onFilterInputClick($event)\" (input)=\"dt.onFilterKeyup($event.target.value, col.filterField||col.field, col.filterMatchMode)\"/>\n <p-columnFilterTemplateLoader [column]=\"col\" *ngIf=\"col.filter&&col.filterTemplate\"></p-columnFilterTemplateLoader>\n <p-dtCheckbox *ngIf=\"col.selectionMode=='multiple' && dt.showHeaderCheckbox === true\" (onChange)=\"dt.toggleRowsWithCheckbox($event)\" [checked]=\"dt.allSelected\" [disabled]=\"dt.isEmpty()\"></p-dtCheckbox>\n </th>\n </ng-template>\n "
126
126
  }),
127
127
  __param(0, core_1.Inject(core_1.forwardRef(function () { return DataTable; }))),
128
128
  __metadata("design:paramtypes", [DataTable])
@@ -141,7 +141,7 @@ __decorate([
141
141
  ColumnFooters = __decorate([
142
142
  core_1.Component({
143
143
  selector: '[pColumnFooters]',
144
- template: "\n <td *ngFor=\"let col of columns\" [ngStyle]=\"col.style\" [class]=\"col.styleClass\"\n [attr.colspan]=\"col.colspan\" [attr.rowspan]=\"col.rowspan\"\n [ngClass]=\"{'ui-state-default':true, 'ui-helper-hidden': col.hidden}\">\n <span class=\"ui-column-footer\" *ngIf=\"!col.footerTemplate\">{{col.footer}}</span>\n <span class=\"ui-column-footer\" *ngIf=\"col.footerTemplate\">\n <p-columnFooterTemplateLoader [column]=\"col\"></p-columnFooterTemplateLoader>\n </span>\n </td>\n "
144
+ template: "\n <td *ngFor=\"let col of columns\" [ngStyle]=\"col.footerStyle||col.style\" [class]=\"col.footerStyleClass||col.styleClass\"\n [attr.colspan]=\"col.colspan\" [attr.rowspan]=\"col.rowspan\"\n [ngClass]=\"{'ui-state-default':true, 'ui-helper-hidden': col.hidden}\">\n <span class=\"ui-column-footer\" *ngIf=\"!col.footerTemplate\">{{col.footer}}</span>\n <span class=\"ui-column-footer\" *ngIf=\"col.footerTemplate\">\n <p-columnFooterTemplateLoader [column]=\"col\"></p-columnFooterTemplateLoader>\n </span>\n </td>\n "
145
145
  }),
146
146
  __param(0, core_1.Inject(core_1.forwardRef(function () { return DataTable; }))),
147
147
  __metadata("design:paramtypes", [DataTable])
@@ -167,7 +167,7 @@ __decorate([
167
167
  TableBody = __decorate([
168
168
  core_1.Component({
169
169
  selector: '[pTableBody]',
170
- template: "\n <ng-template ngFor let-rowData [ngForOf]=\"data\" let-even=\"even\" let-odd=\"odd\" let-rowIndex=\"index\" [ngForTrackBy]=\"dt.rowTrackBy\">\n <tr #rowGroupElement class=\"ui-widget-header ui-rowgroup-header\" \n *ngIf=\"dt.rowGroupMode=='subheader' && (rowIndex === 0||(dt.resolveFieldData(rowData,dt.groupField) !== dt.resolveFieldData(dt.dataToRender[rowIndex - 1], dt.groupField)))\"\n (click)=\"dt.onRowGroupClick($event)\" [ngStyle]=\"{'cursor': dt.sortableRowGroup ? 'pointer' : 'auto'}\">\n <td [attr.colspan]=\"dt.visibleColumns().length\">\n <a href=\"#\" *ngIf=\"dt.expandableRowGroups\" (click)=\"dt.toggleRowGroup($event,rowData)\">\n <span class=\"fa fa-fw\" [ngClass]=\"dt.isRowGroupExpanded(rowData) ? dt.expandedIcon : dt.collapsedIcon\"></span>\n </a>\n <span class=\"ui-rowgroup-header-name\">\n <p-templateLoader [template]=\"dt.rowGroupHeaderTemplate\" [data]=\"rowData\"></p-templateLoader>\n </span>\n </td>\n </tr>\n <tr #rowElement *ngIf=\"!dt.expandableRowGroups||dt.isRowGroupExpanded(rowData)\"\n (click)=\"dt.handleRowClick($event, rowData, rowIndex)\" (dblclick)=\"dt.rowDblclick($event,rowData)\" (contextmenu)=\"dt.onRowRightClick($event,rowData)\" (touchend)=\"dt.handleRowTouchEnd($event)\"\n [ngClass]=\"[even&&dt.rowGroupMode!='rowspan'? 'ui-datatable-even':'',\n odd&&dt.rowGroupMode!='rowspan'?'ui-datatable-odd':'',\n dt.isSelected(rowData)? 'ui-state-highlight': '', \n dt.getRowStyleClass(rowData,rowIndex)]\">\n <ng-template ngFor let-col [ngForOf]=\"columns\" let-colIndex=\"index\">\n <td #cell *ngIf=\"!dt.rowGroupMode || (dt.rowGroupMode == 'subheader') ||\n (dt.rowGroupMode=='rowspan' && ((dt.sortField==col.field && dt.rowGroupMetadata[dt.resolveFieldData(rowData,dt.sortField)].index == rowIndex) || (dt.sortField!=col.field)))\"\n [ngStyle]=\"col.style\" [class]=\"col.styleClass\" (click)=\"dt.switchCellToEditMode(cell,col,rowData)\"\n [ngClass]=\"{'ui-editable-column':col.editable,'ui-selection-column':col.selectionMode, 'ui-helper-hidden': col.hidden}\"\n [attr.rowspan]=\"(dt.rowGroupMode=='rowspan' && dt.sortField == col.field && dt.rowGroupMetadata[dt.resolveFieldData(rowData,dt.sortField)].index == rowIndex) ? dt.rowGroupMetadata[dt.resolveFieldData(rowData,dt.sortField)].size : null\">\n <span class=\"ui-column-title\" *ngIf=\"dt.responsive\">{{col.header}}</span>\n <span class=\"ui-cell-data\" *ngIf=\"!col.bodyTemplate && !col.expander && !col.selectionMode\">{{dt.resolveFieldData(rowData,col.field)}}</span>\n <span class=\"ui-cell-data\" *ngIf=\"col.bodyTemplate\">\n <p-columnBodyTemplateLoader [column]=\"col\" [rowData]=\"rowData\" [rowIndex]=\"rowIndex + dt.first\"></p-columnBodyTemplateLoader>\n </span>\n <div class=\"ui-cell-editor\" *ngIf=\"col.editable\">\n <input *ngIf=\"!col.editorTemplate\" type=\"text\" [(ngModel)]=\"rowData[col.field]\" required=\"true\"\n (keydown)=\"dt.onCellEditorKeydown($event, col, rowData, rowIndex)\" class=\"ui-inputtext ui-widget ui-state-default ui-corner-all\"/>\n <a *ngIf=\"col.editorTemplate\" class=\"ui-cell-editor-proxy-focus\" href=\"#\" (focus)=\"dt.onCustomEditorFocusPrev($event, colIndex)\"></a>\n <p-columnEditorTemplateLoader *ngIf=\"col.editorTemplate\" [column]=\"col\" [rowData]=\"rowData\" [rowIndex]=\"rowIndex\"></p-columnEditorTemplateLoader>\n <a *ngIf=\"col.editorTemplate\" class=\"ui-cell-editor-proxy-focus\" href=\"#\" (focus)=\"dt.onCustomEditorFocusNext($event, colIndex)\"></a>\n </div>\n <a href=\"#\" *ngIf=\"col.expander\" (click)=\"dt.toggleRow(rowData,$event)\">\n <span class=\"ui-row-toggler fa fa-fw ui-clickable\" [ngClass]=\"dt.isRowExpanded(rowData) ? dt.expandedIcon : dt.collapsedIcon\"></span>\n </a>\n <p-dtRadioButton *ngIf=\"col.selectionMode=='single'\" (onClick)=\"dt.selectRowWithRadio($event, rowData)\" [checked]=\"dt.isSelected(rowData)\"></p-dtRadioButton>\n <p-dtCheckbox *ngIf=\"col.selectionMode=='multiple'\" (onChange)=\"dt.toggleRowWithCheckbox($event,rowData)\" [checked]=\"dt.isSelected(rowData)\"></p-dtCheckbox>\n </td>\n </ng-template>\n </tr>\n <tr class=\"ui-widget-header\" *ngIf=\"dt.rowGroupFooterTemplate && dt.rowGroupMode=='subheader' && ((rowIndex === dt.dataToRender.length - 1)||(dt.resolveFieldData(rowData,dt.groupField) !== dt.resolveFieldData(dt.dataToRender[rowIndex + 1],dt.groupField))) && (!dt.expandableRowGroups || dt.isRowGroupExpanded(rowData))\">\n <p-templateLoader class=\"ui-helper-hidden\" [data]=\"rowData\" [template]=\"dt.rowGroupFooterTemplate\"></p-templateLoader>\n </tr>\n <tr *ngIf=\"dt.expandableRows && dt.isRowExpanded(rowData)\">\n <td [attr.colspan]=\"dt.visibleColumns().length\">\n <p-rowExpansionLoader [rowData]=\"rowData\" [rowIndex]=\"rowIndex\" [template]=\"dt.rowExpansionTemplate\"></p-rowExpansionLoader>\n </td>\n </tr>\n </ng-template>\n\n <tr *ngIf=\"dt.isEmpty()\" class=\"ui-widget-content ui-datatable-emptymessage-row\">\n <td [attr.colspan]=\"dt.visibleColumns().length\" class=\"ui-datatable-emptymessage\">\n <span *ngIf=\"!dt.emptyMessageTemplate\">{{dt.emptyMessage}}</span>\n <p-templateLoader [template]=\"dt.emptyMessageTemplate\"></p-templateLoader>\n </td>\n </tr>\n "
170
+ template: "\n <ng-template ngFor let-rowData [ngForOf]=\"data\" let-even=\"even\" let-odd=\"odd\" let-rowIndex=\"index\" [ngForTrackBy]=\"dt.rowTrackBy\">\n <tr #rowGroupElement class=\"ui-widget-header ui-rowgroup-header\"\n *ngIf=\"dt.rowGroupMode=='subheader' && (rowIndex === 0||(dt.resolveFieldData(rowData,dt.groupField) !== dt.resolveFieldData(dt.dataToRender[rowIndex - 1], dt.groupField)))\"\n (click)=\"dt.onRowGroupClick($event)\" [ngStyle]=\"{'cursor': dt.sortableRowGroup ? 'pointer' : 'auto'}\">\n <td [attr.colspan]=\"dt.visibleColumns().length\">\n <a href=\"#\" *ngIf=\"dt.expandableRowGroups\" (click)=\"dt.toggleRowGroup($event,rowData)\">\n <span class=\"fa fa-fw\" [ngClass]=\"dt.isRowGroupExpanded(rowData) ? dt.expandedIcon : dt.collapsedIcon\"></span>\n </a>\n <span class=\"ui-rowgroup-header-name\">\n <p-templateLoader [template]=\"dt.rowGroupHeaderTemplate\" [data]=\"rowData\"></p-templateLoader>\n </span>\n </td>\n </tr>\n <tr #rowElement *ngIf=\"!dt.expandableRowGroups||dt.isRowGroupExpanded(rowData)\"\n (click)=\"dt.handleRowClick($event, rowData, rowIndex)\" (dblclick)=\"dt.rowDblclick($event,rowData)\" (contextmenu)=\"dt.onRowRightClick($event,rowData)\" (touchend)=\"dt.handleRowTouchEnd($event)\"\n [ngClass]=\"[even&&dt.rowGroupMode!='rowspan'? 'ui-datatable-even':'',\n odd&&dt.rowGroupMode!='rowspan'?'ui-datatable-odd':'',\n dt.isSelected(rowData)? 'ui-state-highlight': '',\n dt.isRowExpanded(rowData) ? 'ui-expanded-row': '',\n dt.getRowStyleClass(rowData,rowIndex)]\">\n <ng-template ngFor let-col [ngForOf]=\"columns\" let-colIndex=\"index\">\n <td #cell *ngIf=\"!dt.rowGroupMode || (dt.rowGroupMode == 'subheader') ||\n (dt.rowGroupMode=='rowspan' && ((dt.sortField==col.field && dt.rowGroupMetadata[dt.resolveFieldData(rowData,dt.sortField)].index == rowIndex) || (dt.sortField!=col.field)))\"\n [ngStyle]=\"col.bodyStyle||col.style\" [class]=\"col.bodyStyleClass||col.styleClass\" (click)=\"dt.switchCellToEditMode(cell,col,rowData)\"\n [ngClass]=\"{'ui-editable-column':col.editable,'ui-selection-column':col.selectionMode, 'ui-helper-hidden': col.hidden}\"\n [attr.rowspan]=\"(dt.rowGroupMode=='rowspan' && dt.sortField == col.field && dt.rowGroupMetadata[dt.resolveFieldData(rowData,dt.sortField)].index == rowIndex) ? dt.rowGroupMetadata[dt.resolveFieldData(rowData,dt.sortField)].size : null\">\n <span class=\"ui-column-title\" *ngIf=\"dt.responsive\">{{col.header}}</span>\n <span class=\"ui-cell-data\" *ngIf=\"!col.bodyTemplate && !col.expander && !col.selectionMode\">{{dt.resolveFieldData(rowData,col.field)}}</span>\n <span class=\"ui-cell-data\" *ngIf=\"col.bodyTemplate\">\n <p-columnBodyTemplateLoader [column]=\"col\" [rowData]=\"rowData\" [rowIndex]=\"rowIndex + dt.first\"></p-columnBodyTemplateLoader>\n </span>\n <div class=\"ui-cell-editor\" *ngIf=\"col.editable\">\n <input *ngIf=\"!col.editorTemplate\" type=\"text\" [(ngModel)]=\"rowData[col.field]\"\n (keydown)=\"dt.onCellEditorKeydown($event, col, rowData, rowIndex)\" (blur)=\"dt.onCellEditorBlur($event, col, rowData, rowIndex)\"\n (input)=\"dt.onCellEditorInput($event, col, rowData, rowIndex)\" (change)=\"dt.onCellEditorChange($event, col, rowData, rowIndex)\"\n class=\"ui-inputtext ui-widget ui-state-default ui-corner-all\"/>\n <a *ngIf=\"col.editorTemplate\" class=\"ui-cell-editor-proxy-focus\" href=\"#\" (focus)=\"dt.onCustomEditorFocusPrev($event, colIndex)\"></a>\n <p-columnEditorTemplateLoader *ngIf=\"col.editorTemplate\" [column]=\"col\" [rowData]=\"rowData\" [rowIndex]=\"rowIndex\"></p-columnEditorTemplateLoader>\n <a *ngIf=\"col.editorTemplate\" class=\"ui-cell-editor-proxy-focus\" href=\"#\" (focus)=\"dt.onCustomEditorFocusNext($event, colIndex)\"></a>\n </div>\n <a href=\"#\" *ngIf=\"col.expander\" (click)=\"dt.toggleRow(rowData,$event)\">\n <span class=\"ui-row-toggler fa fa-fw ui-clickable\" [ngClass]=\"dt.isRowExpanded(rowData) ? dt.expandedIcon : dt.collapsedIcon\"></span>\n </a>\n <p-dtRadioButton *ngIf=\"col.selectionMode=='single'\" (onClick)=\"dt.selectRowWithRadio($event, rowData)\" [checked]=\"dt.isSelected(rowData)\"></p-dtRadioButton>\n <p-dtCheckbox *ngIf=\"col.selectionMode=='multiple'\" (onChange)=\"dt.toggleRowWithCheckbox($event,rowData)\" [checked]=\"dt.isSelected(rowData)\"></p-dtCheckbox>\n </td>\n </ng-template>\n </tr>\n <tr *ngIf=\"dt.expandableRows && dt.isRowExpanded(rowData)\" class=\"ui-expanded-row-content\">\n <td [attr.colspan]=\"dt.visibleColumns().length\">\n <p-rowExpansionLoader [rowData]=\"rowData\" [rowIndex]=\"rowIndex\" [template]=\"dt.rowExpansionTemplate\"></p-rowExpansionLoader>\n </td>\n </tr>\n <tr class=\"ui-widget-header ui-rowgroup-footer\" *ngIf=\"dt.rowGroupFooterTemplate && dt.rowGroupMode=='subheader' && ((rowIndex === dt.dataToRender.length - 1)||(dt.resolveFieldData(rowData,dt.groupField) !== dt.resolveFieldData(dt.dataToRender[rowIndex + 1],dt.groupField))) && (!dt.expandableRowGroups || dt.isRowGroupExpanded(rowData))\">\n <p-templateLoader class=\"ui-helper-hidden\" [data]=\"rowData\" [template]=\"dt.rowGroupFooterTemplate\"></p-templateLoader>\n </tr>\n </ng-template>\n\n <tr *ngIf=\"dt.isEmpty()\" class=\"ui-widget-content ui-datatable-emptymessage-row\" [style.visibility]=\"dt.loading ? 'hidden' : 'visible'\">\n <td [attr.colspan]=\"dt.visibleColumns().length\" class=\"ui-datatable-emptymessage\">\n <span *ngIf=\"!dt.emptyMessageTemplate\">{{dt.emptyMessage}}</span>\n <p-templateLoader [template]=\"dt.emptyMessageTemplate\"></p-templateLoader>\n </td>\n </tr>\n "
171
171
  }),
172
172
  __param(0, core_1.Inject(core_1.forwardRef(function () { return DataTable; }))),
173
173
  __metadata("design:paramtypes", [DataTable])
@@ -210,18 +210,22 @@ var ScrollableView = (function () {
210
210
  this.scrollTableWrapper = this.scrollTableWrapperViewChild.nativeElement;
211
211
  this.scrollFooter = this.scrollFooterViewChild ? this.scrollFooterViewChild.nativeElement : null;
212
212
  this.scrollFooterBox = this.scrollFooterBoxViewChild ? this.scrollFooterBoxViewChild.nativeElement : null;
213
+ this.setScrollHeight();
213
214
  if (!this.frozen) {
214
215
  this.zone.runOutsideAngular(function () {
215
216
  _this.scrollHeader.addEventListener('scroll', _this.onHeaderScroll.bind(_this));
216
217
  _this.scrollBody.addEventListener('scroll', _this.onBodyScroll.bind(_this));
217
218
  });
218
219
  }
219
- if (!this.frozen)
220
+ if (!this.frozen) {
220
221
  this.alignScrollBar();
221
- else
222
+ }
223
+ else {
222
224
  this.scrollBody.style.paddingBottom = this.domHandler.calculateScrollbarWidth() + 'px';
225
+ }
223
226
  };
224
227
  ScrollableView.prototype.onBodyScroll = function (event) {
228
+ var _this = this;
225
229
  var frozenView = this.el.nativeElement.previousElementSibling;
226
230
  if (frozenView) {
227
231
  var frozenScrollBody = this.domHandler.findSingle(frozenView, '.ui-datatable-scrollable-body');
@@ -236,15 +240,35 @@ var ScrollableView = (function () {
236
240
  if (this.virtualScroll) {
237
241
  var viewport = this.domHandler.getOuterHeight(this.scrollBody);
238
242
  var tableHeight = this.domHandler.getOuterHeight(this.scrollTable);
239
- var pageHeight = this.rowHeight * this.dt.rows;
243
+ var pageHeight_1 = this.rowHeight * this.dt.rows;
240
244
  var virtualTableHeight = this.domHandler.getOuterHeight(this.scrollTableWrapper);
241
- var pageCount = (virtualTableHeight / pageHeight) || 1;
245
+ var pageCount = (virtualTableHeight / pageHeight_1) || 1;
242
246
  if (this.scrollBody.scrollTop + viewport > parseFloat(this.scrollTable.style.top) + tableHeight || this.scrollBody.scrollTop < parseFloat(this.scrollTable.style.top)) {
243
- var page = Math.floor((this.scrollBody.scrollTop * pageCount) / (this.scrollBody.scrollHeight)) + 1;
247
+ var page_1 = Math.floor((this.scrollBody.scrollTop * pageCount) / (this.scrollBody.scrollHeight)) + 1;
244
248
  this.onVirtualScroll.emit({
245
- page: page
249
+ page: page_1,
250
+ callback: function () {
251
+ _this.scrollTable.style.top = ((page_1 - 1) * pageHeight_1) + 'px';
252
+ }
246
253
  });
247
- this.scrollTable.style.top = ((page - 1) * pageHeight) + 'px';
254
+ }
255
+ }
256
+ };
257
+ ScrollableView.prototype.setScrollHeight = function () {
258
+ if (this.dt.scrollHeight) {
259
+ if (this.dt.scrollHeight.indexOf('%') !== -1) {
260
+ this.scrollBody.style.visibility = 'hidden';
261
+ this.scrollBody.style.height = '100px'; //temporary height to calculate static height
262
+ var containerHeight = this.domHandler.getOuterHeight(this.dt.el.nativeElement.children[0]);
263
+ var relativeHeight = this.domHandler.getOuterHeight(this.dt.el.nativeElement.parentElement) * parseInt(this.dt.scrollHeight) / 100;
264
+ var staticHeight = containerHeight - 100; //total height of headers, footers, paginators
265
+ var scrollBodyHeight = (relativeHeight - staticHeight);
266
+ this.scrollBody.style.height = 'auto';
267
+ this.scrollBody.style.maxHeight = scrollBodyHeight + 'px';
268
+ this.scrollBody.style.visibility = 'visible';
269
+ }
270
+ else {
271
+ this.scrollBody.style.maxHeight = this.dt.scrollHeight;
248
272
  }
249
273
  }
250
274
  };
@@ -271,6 +295,14 @@ __decorate([
271
295
  core_1.Input("pScrollableView"),
272
296
  __metadata("design:type", Array)
273
297
  ], ScrollableView.prototype, "columns", void 0);
298
+ __decorate([
299
+ core_1.Input(),
300
+ __metadata("design:type", shared_2.HeaderColumnGroup)
301
+ ], ScrollableView.prototype, "headerColumnGroup", void 0);
302
+ __decorate([
303
+ core_1.Input(),
304
+ __metadata("design:type", shared_2.HeaderColumnGroup)
305
+ ], ScrollableView.prototype, "footerColumnGroup", void 0);
274
306
  __decorate([
275
307
  core_1.ViewChild('scrollHeader'),
276
308
  __metadata("design:type", core_1.ElementRef)
@@ -318,7 +350,7 @@ __decorate([
318
350
  ScrollableView = __decorate([
319
351
  core_1.Component({
320
352
  selector: '[pScrollableView]',
321
- template: "\n <div #scrollHeader class=\"ui-widget-header ui-datatable-scrollable-header\" [ngStyle]=\"{'width': width}\">\n <div #scrollHeaderBox class=\"ui-datatable-scrollable-header-box\">\n <table [ngClass]=\"dt.tableStyleClass\" [ngStyle]=\"dt.tableStyle\">\n <thead class=\"ui-datatable-thead\">\n <tr *ngIf=\"!dt.headerColumnGroup\" class=\"ui-state-default\" [pColumnHeaders]=\"columns\"></tr>\n <ng-template [ngIf]=\"dt.headerColumnGroup\">\n <tr *ngFor=\"let headerRow of dt.headerColumnGroup.rows\" class=\"ui-state-default\" [pColumnHeaders]=\"headerRow.columns\"></tr>\n </ng-template>\n </thead>\n <tbody *ngIf=\"dt.frozenValue\" [ngClass]=\"{'ui-datatable-data ui-widget-content': true, 'ui-datatable-hoverable-rows': (dt.rowHover||dt.selectionMode)}\" [pTableBody]=\"columns\" [data]=\"dt.frozenValue\"></tbody>\n </table>\n </div>\n </div>\n <div #scrollBody class=\"ui-datatable-scrollable-body\" [ngStyle]=\"{'width': width,'max-height':dt.scrollHeight}\">\n <div #scrollTableWrapper class=\"ui-datatable-scrollable-table-wrapper\" style=\"position:relative\">\n <table #scrollTable [class]=\"dt.tableStyleClass\" [ngStyle]=\"dt.tableStyle\" [ngClass]=\"{'ui-datatable-virtual-table':virtualScroll}\" style=\"top:0px\">\n <colgroup class=\"ui-datatable-scrollable-colgroup\">\n <col *ngFor=\"let col of columns\" [ngStyle]=\"col.style\" [ngClass]=\"{'ui-helper-hidden': col.hidden}\"/>\n </colgroup>\n <tbody [ngClass]=\"{'ui-datatable-data ui-widget-content': true, 'ui-datatable-hoverable-rows': (dt.rowHover||dt.selectionMode)}\" [pTableBody]=\"columns\" [data]=\"dt.dataToRender\"></tbody>\n </table>\n </div>\n </div>\n <div #scrollFooter class=\"ui-widget-header ui-datatable-scrollable-footer\" [ngStyle]=\"{'width': width}\" *ngIf=\"dt.hasFooter()\">\n <div #scrollFooterBox class=\"ui-datatable-scrollable-footer-box\">\n <table [ngClass]=\"dt.tableStyleClass\" [ngStyle]=\"dt.tableStyle\">\n <tfoot class=\"ui-datatable-tfoot\">\n <tr *ngIf=\"!dt.footerColumnGroup\" [pColumnFooters]=\"columns\" class=\"ui-state-default\"></tr>\n <ng-template [ngIf]=\"dt.footerColumnGroup\">\n <tr *ngFor=\"let footerRow of dt.footerColumnGroup.rows\" class=\"ui-state-default\" [pColumnFooters]=\"footerRow.columns\"></tr>\n </ng-template>\n </tfoot>\n </table>\n </div>\n </div>\n "
353
+ template: "\n <div #scrollHeader class=\"ui-widget-header ui-datatable-scrollable-header\" [ngStyle]=\"{'width': width}\">\n <div #scrollHeaderBox class=\"ui-datatable-scrollable-header-box\">\n <table [ngClass]=\"dt.tableStyleClass\" [ngStyle]=\"dt.tableStyle\">\n <thead class=\"ui-datatable-thead\">\n <tr *ngIf=\"!headerColumnGroup\" class=\"ui-state-default\" [pColumnHeaders]=\"columns\"></tr>\n <ng-template [ngIf]=\"headerColumnGroup\">\n <tr *ngFor=\"let headerRow of headerColumnGroup.rows\" class=\"ui-state-default\" [pColumnHeaders]=\"headerRow.columns\"></tr>\n </ng-template>\n </thead>\n <tbody *ngIf=\"dt.frozenValue\" [ngClass]=\"{'ui-datatable-data ui-widget-content': true, 'ui-datatable-hoverable-rows': (dt.rowHover||dt.selectionMode)}\" [pTableBody]=\"columns\" [data]=\"dt.frozenValue\"></tbody>\n </table>\n </div>\n </div>\n <div #scrollBody class=\"ui-datatable-scrollable-body\" [ngStyle]=\"{'width': width}\">\n <div #scrollTableWrapper class=\"ui-datatable-scrollable-table-wrapper\" style=\"position:relative\">\n <table #scrollTable [class]=\"dt.tableStyleClass\" [ngStyle]=\"dt.tableStyle\" [ngClass]=\"{'ui-datatable-virtual-table':virtualScroll}\" style=\"top:0px\">\n <colgroup class=\"ui-datatable-scrollable-colgroup\">\n <col *ngFor=\"let col of columns\" [ngStyle]=\"col.headerStyle||col.style\" [ngClass]=\"{'ui-helper-hidden': col.hidden}\"/>\n </colgroup>\n <tbody [ngClass]=\"{'ui-datatable-data ui-widget-content': true, 'ui-datatable-hoverable-rows': (dt.rowHover||dt.selectionMode)}\" [pTableBody]=\"columns\" [data]=\"dt.dataToRender\"></tbody>\n </table>\n </div>\n </div>\n <div #scrollFooter class=\"ui-widget-header ui-datatable-scrollable-footer\" [ngStyle]=\"{'width': width}\" *ngIf=\"dt.hasFooter()\">\n <div #scrollFooterBox class=\"ui-datatable-scrollable-footer-box\">\n <table [ngClass]=\"dt.tableStyleClass\" [ngStyle]=\"dt.tableStyle\">\n <tfoot class=\"ui-datatable-tfoot\">\n <tr *ngIf=\"!footerColumnGroup\" [pColumnFooters]=\"columns\" class=\"ui-state-default\"></tr>\n <ng-template [ngIf]=\"footerColumnGroup\">\n <tr *ngFor=\"let footerRow of footerColumnGroup.rows\" class=\"ui-state-default\" [pColumnFooters]=\"footerRow.columns\"></tr>\n </ng-template>\n </tfoot>\n </table>\n </div>\n </div>\n "
322
354
  }),
323
355
  __param(0, core_1.Inject(core_1.forwardRef(function () { return DataTable; }))),
324
356
  __metadata("design:paramtypes", [DataTable, domhandler_1.DomHandler, core_1.ElementRef, core_1.Renderer2, core_1.NgZone])
@@ -335,6 +367,7 @@ var DataTable = (function () {
335
367
  this.zone = zone;
336
368
  this.pageLinks = 5;
337
369
  this.selectionChange = new core_1.EventEmitter();
370
+ this.showHeaderCheckbox = true;
338
371
  this.onRowClick = new core_1.EventEmitter();
339
372
  this.onRowSelect = new core_1.EventEmitter();
340
373
  this.onRowUnselect = new core_1.EventEmitter();
@@ -347,7 +380,6 @@ var DataTable = (function () {
347
380
  this.onColResize = new core_1.EventEmitter();
348
381
  this.onColReorder = new core_1.EventEmitter();
349
382
  this.sortMode = 'single';
350
- this.sortOrder = 1;
351
383
  this.defaultSortOrder = 1;
352
384
  this.csvSeparator = ',';
353
385
  this.exportFilename = 'download';
@@ -372,8 +404,8 @@ var DataTable = (function () {
372
404
  this.sortableRowGroup = true;
373
405
  this.filters = {};
374
406
  this.loadingIcon = 'fa-circle-o-notch';
375
- this.enableLoader = true;
376
407
  this.virtualScrollDelay = 500;
408
+ this.rowGroupExpandMode = 'multiple';
377
409
  this.valueChange = new core_1.EventEmitter();
378
410
  this.firstChange = new core_1.EventEmitter();
379
411
  this.onRowExpand = new core_1.EventEmitter();
@@ -383,6 +415,7 @@ var DataTable = (function () {
383
415
  this.page = 0;
384
416
  this.columnsChanged = false;
385
417
  this._first = 0;
418
+ this._sortOrder = 1;
386
419
  this.filterConstraints = {
387
420
  startsWith: function (value, filter) {
388
421
  if (filter === undefined || filter === null || filter.trim() === '') {
@@ -455,6 +488,7 @@ var DataTable = (function () {
455
488
  DataTable.prototype.ngAfterContentInit = function () {
456
489
  var _this = this;
457
490
  this.initColumns();
491
+ this.initColumnGroups();
458
492
  this.columnsSubscription = this.cols.changes.subscribe(function (_) {
459
493
  _this.initColumns();
460
494
  _this.changeDetector.markForCheck();
@@ -510,6 +544,45 @@ var DataTable = (function () {
510
544
  this.virtualScrollableTableWrapper = this.domHandler.findSingle(this.el.nativeElement, 'div.ui-datatable-scrollable-table-wrapper');
511
545
  this.initialized = true;
512
546
  };
547
+ Object.defineProperty(DataTable.prototype, "multiSortMeta", {
548
+ get: function () {
549
+ return this._multiSortMeta;
550
+ },
551
+ set: function (val) {
552
+ this._multiSortMeta = val;
553
+ if (this.sortMode === 'multiple') {
554
+ this.sortMultiple();
555
+ }
556
+ },
557
+ enumerable: true,
558
+ configurable: true
559
+ });
560
+ Object.defineProperty(DataTable.prototype, "sortField", {
561
+ get: function () {
562
+ return this._sortField;
563
+ },
564
+ set: function (val) {
565
+ this._sortField = val;
566
+ if (this.sortMode === 'single') {
567
+ this.sortSingle();
568
+ }
569
+ },
570
+ enumerable: true,
571
+ configurable: true
572
+ });
573
+ Object.defineProperty(DataTable.prototype, "sortOrder", {
574
+ get: function () {
575
+ return this._sortOrder;
576
+ },
577
+ set: function (val) {
578
+ this._sortOrder = val;
579
+ if (this.sortMode === 'single') {
580
+ this.sortSingle();
581
+ }
582
+ },
583
+ enumerable: true,
584
+ configurable: true
585
+ });
513
586
  Object.defineProperty(DataTable.prototype, "value", {
514
587
  get: function () {
515
588
  return this._value;
@@ -561,9 +634,14 @@ var DataTable = (function () {
561
634
  if (this.dataKey && !this.preventSelectionKeysPropagation) {
562
635
  this.selectionKeys = {};
563
636
  if (this._selection) {
564
- for (var _i = 0, _a = this._selection; _i < _a.length; _i++) {
565
- var data = _a[_i];
566
- this.selectionKeys[String(this.objectUtils.resolveFieldData(data, this.dataKey))] = 1;
637
+ if (Array.isArray(this._selection)) {
638
+ for (var _i = 0, _a = this._selection; _i < _a.length; _i++) {
639
+ var data = _a[_i];
640
+ this.selectionKeys[String(this.objectUtils.resolveFieldData(data, this.dataKey))] = 1;
641
+ }
642
+ }
643
+ else {
644
+ this.selectionKeys[String(this.objectUtils.resolveFieldData(this._selection, this.dataKey))] = 1;
567
645
  }
568
646
  }
569
647
  }
@@ -582,12 +660,12 @@ var DataTable = (function () {
582
660
  };
583
661
  DataTable.prototype.handleDataChange = function () {
584
662
  var _this = this;
585
- if (this.lazy && this.enableLoader) {
586
- this.loading = false;
587
- }
588
663
  if (this.paginator) {
589
664
  this.updatePaginator();
590
665
  }
666
+ if (this.virtualScroll && this.virtualScrollCallback) {
667
+ this.virtualScrollCallback();
668
+ }
591
669
  if (!this.lazy) {
592
670
  if (this.hasFilter()) {
593
671
  this._filter();
@@ -608,42 +686,41 @@ var DataTable = (function () {
608
686
  this.updateDataToRender(this.filteredValue || this.value);
609
687
  };
610
688
  DataTable.prototype.initColumns = function () {
611
- var _this = this;
612
689
  this.columns = this.cols.toArray();
613
- if (this.scrollable) {
614
- this.scrollableColumns = [];
615
- this.frozenColumns = [];
616
- this.cols.forEach(function (col) {
617
- if (col.frozen) {
618
- _this.frozenColumns.push(col);
619
- }
620
- else {
621
- _this.scrollableColumns.push(col);
622
- }
623
- });
624
- }
690
+ this.initScrollableColumns();
625
691
  this.columnsChanged = true;
626
692
  };
627
- DataTable.prototype.resolveFieldData = function (data, field) {
628
- if (data && field) {
629
- if (field.indexOf('.') == -1) {
630
- return data[field];
631
- }
632
- else {
633
- var fields = field.split('.');
634
- var value = data;
635
- for (var i = 0, len = fields.length; i < len; ++i) {
636
- if (value == null) {
637
- return null;
638
- }
639
- value = value[fields[i]];
640
- }
641
- return value;
642
- }
693
+ DataTable.prototype.initScrollableColumns = function () {
694
+ this.scrollableColumns = [];
695
+ this.frozenColumns = [];
696
+ for (var _i = 0, _a = this.columns; _i < _a.length; _i++) {
697
+ var col = _a[_i];
698
+ if (col.frozen)
699
+ this.frozenColumns.push(col);
700
+ else
701
+ this.scrollableColumns.push(col);
643
702
  }
644
- else {
645
- return null;
703
+ };
704
+ DataTable.prototype.initColumnGroups = function () {
705
+ var headerColumnsGroups = this.headerColumnGroups.toArray();
706
+ var footerColumnsGroups = this.footerColumnGroups.toArray();
707
+ for (var _i = 0, headerColumnsGroups_1 = headerColumnsGroups; _i < headerColumnsGroups_1.length; _i++) {
708
+ var columnGroup = headerColumnsGroups_1[_i];
709
+ if (columnGroup.frozen)
710
+ this.frozenHeaderColumnGroup = columnGroup;
711
+ else
712
+ this.scrollableHeaderColumnGroup = columnGroup;
646
713
  }
714
+ for (var _a = 0, footerColumnsGroups_1 = footerColumnsGroups; _a < footerColumnsGroups_1.length; _a++) {
715
+ var columnGroup = footerColumnsGroups_1[_a];
716
+ if (columnGroup.frozen)
717
+ this.frozenFooterColumnGroup = columnGroup;
718
+ else
719
+ this.scrollableFooterColumnGroup = columnGroup;
720
+ }
721
+ };
722
+ DataTable.prototype.resolveFieldData = function (data, field) {
723
+ return this.objectUtils.resolveFieldData(data, field);
647
724
  };
648
725
  DataTable.prototype.updateRowGroupMetadata = function () {
649
726
  this.rowGroupMetadata = {};
@@ -717,6 +794,7 @@ var DataTable = (function () {
717
794
  DataTable.prototype.onVirtualScroll = function (event) {
718
795
  var _this = this;
719
796
  this._first = (event.page - 1) * this.rows;
797
+ this.virtualScrollCallback = event.callback;
720
798
  this.zone.run(function () {
721
799
  if (_this.virtualScrollTimer) {
722
800
  clearTimeout(_this.virtualScrollTimer);
@@ -755,13 +833,13 @@ var DataTable = (function () {
755
833
  this.preventSortPropagation = true;
756
834
  }
757
835
  var columnSortField = column.sortField || column.field;
758
- this.sortOrder = (this.sortField === columnSortField) ? this.sortOrder * -1 : this.defaultSortOrder;
759
- this.sortField = columnSortField;
836
+ this._sortOrder = (this.sortField === columnSortField) ? this.sortOrder * -1 : this.defaultSortOrder;
837
+ this._sortField = columnSortField;
760
838
  this.sortColumn = column;
761
839
  var metaKey = event.metaKey || event.ctrlKey;
762
840
  if (this.sortMode == 'multiple') {
763
841
  if (!this.multiSortMeta || !metaKey) {
764
- this.multiSortMeta = [];
842
+ this._multiSortMeta = [];
765
843
  }
766
844
  this.addSortMeta({ field: this.sortField, order: this.sortOrder });
767
845
  }
@@ -908,11 +986,11 @@ var DataTable = (function () {
908
986
  var targetNode = event.target.nodeName;
909
987
  if ((targetNode == 'TD' || (targetNode == 'SPAN' && !this.domHandler.hasClass(event.target, 'ui-clickable')))) {
910
988
  if (this.sortField != this.groupField) {
911
- this.sortField = this.groupField;
989
+ this._sortField = this.groupField;
912
990
  this.sortSingle();
913
991
  }
914
992
  else {
915
- this.sortOrder = -1 * this.sortOrder;
993
+ this._sortOrder = -1 * this.sortOrder;
916
994
  this.sortSingle();
917
995
  }
918
996
  }
@@ -1061,6 +1139,7 @@ var DataTable = (function () {
1061
1139
  if (selected) {
1062
1140
  var selectionIndex_2 = this.findIndexInSelection(rowData);
1063
1141
  this._selection = this.selection.filter(function (val, i) { return i != selectionIndex_2; });
1142
+ this.selectionChange.emit(this.selection);
1064
1143
  this.onRowUnselect.emit({ originalEvent: event, data: rowData, type: 'row' });
1065
1144
  if (dataKeyValue) {
1066
1145
  delete this.selectionKeys[dataKeyValue];
@@ -1068,13 +1147,13 @@ var DataTable = (function () {
1068
1147
  }
1069
1148
  else {
1070
1149
  this._selection = (this.selection || []).concat([rowData]);
1150
+ this.selectionChange.emit(this.selection);
1071
1151
  this.onRowSelect.emit({ originalEvent: event, data: rowData, type: 'row' });
1072
1152
  if (dataKeyValue) {
1073
1153
  this.selectionKeys[dataKeyValue] = 1;
1074
1154
  }
1075
1155
  }
1076
1156
  }
1077
- this.selectionChange.emit(this.selection);
1078
1157
  }
1079
1158
  }
1080
1159
  this.preventSelectionKeysPropagation = true;
@@ -1108,6 +1187,7 @@ var DataTable = (function () {
1108
1187
  var dataKeyValue = this.dataKey ? String(this.resolveFieldData(rowData, this.dataKey)) : null;
1109
1188
  if (selectionIndex != -1) {
1110
1189
  this._selection = this.selection.filter(function (val, i) { return i != selectionIndex; });
1190
+ this.selectionChange.emit(this.selection);
1111
1191
  this.onRowUnselect.emit({ originalEvent: event, data: rowData, type: 'checkbox' });
1112
1192
  if (dataKeyValue) {
1113
1193
  delete this.selectionKeys[dataKeyValue];
@@ -1115,12 +1195,12 @@ var DataTable = (function () {
1115
1195
  }
1116
1196
  else {
1117
1197
  this._selection = this.selection.concat([rowData]);
1198
+ this.selectionChange.emit(this.selection);
1118
1199
  this.onRowSelect.emit({ originalEvent: event, data: rowData, type: 'checkbox' });
1119
1200
  if (dataKeyValue) {
1120
1201
  this.selectionKeys[dataKeyValue] = 1;
1121
1202
  }
1122
1203
  }
1123
- this.selectionChange.emit(this.selection);
1124
1204
  this.preventSelectionKeysPropagation = true;
1125
1205
  this.preventRowClickPropagation = true;
1126
1206
  };
@@ -1148,12 +1228,12 @@ var DataTable = (function () {
1148
1228
  }
1149
1229
  if (this.dataKey) {
1150
1230
  this.selectionKeys[String(this.resolveFieldData(rowData, this.dataKey))] = 1;
1231
+ this.preventSelectionKeysPropagation = true;
1151
1232
  }
1152
1233
  }
1153
1234
  this.contextMenu.show(event);
1154
1235
  this.onContextMenuSelect.emit({ originalEvent: event, data: rowData });
1155
1236
  }
1156
- this.preventSelectionKeysPropagation = true;
1157
1237
  };
1158
1238
  DataTable.prototype.rowDblclick = function (event, rowData) {
1159
1239
  this.onRowDblclick.emit({ originalEvent: event, data: rowData });
@@ -1250,6 +1330,9 @@ var DataTable = (function () {
1250
1330
  this.onLazyLoad.emit(this.createLazyLoadMetadata());
1251
1331
  }
1252
1332
  else {
1333
+ if (!this.value || !this.columns) {
1334
+ return;
1335
+ }
1253
1336
  this.filteredValue = [];
1254
1337
  for (var i = 0; i < this.value.length; i++) {
1255
1338
  var localMatch = true;
@@ -1268,7 +1351,7 @@ var DataTable = (function () {
1268
1351
  }
1269
1352
  }
1270
1353
  //global
1271
- if (this.globalFilter && !globalMatch) {
1354
+ if (!col.excludeGlobalFilter && this.globalFilter && !globalMatch) {
1272
1355
  globalMatch = this.filterConstraints['contains'](this.resolveFieldData(this.value[i], col.filterField || col.field), this.globalFilter.value);
1273
1356
  }
1274
1357
  }
@@ -1357,22 +1440,18 @@ var DataTable = (function () {
1357
1440
  };
1358
1441
  DataTable.prototype.onCellEditorKeydown = function (event, column, rowData, rowIndex) {
1359
1442
  if (this.editable) {
1360
- this.onEdit.emit({ originalEvent: event, column: column, data: rowData, index: rowIndex });
1361
1443
  //enter
1362
1444
  if (event.keyCode == 13) {
1363
- this.onEditComplete.emit({ column: column, data: rowData, index: rowIndex });
1364
- this.domHandler.invokeElementMethod(event.target, 'blur');
1365
- this.switchCellToViewMode(event.target);
1366
- event.preventDefault();
1445
+ if (this.domHandler.find(this.editingCell, '.ng-invalid.ng-dirty').length == 0) {
1446
+ this.switchCellToViewMode(event.target);
1447
+ event.preventDefault();
1448
+ }
1367
1449
  }
1368
1450
  else if (event.keyCode == 27) {
1369
- this.onEditCancel.emit({ column: column, data: rowData, index: rowIndex });
1370
- this.domHandler.invokeElementMethod(event.target, 'blur');
1371
1451
  this.switchCellToViewMode(event.target);
1372
1452
  event.preventDefault();
1373
1453
  }
1374
1454
  else if (event.keyCode == 9) {
1375
- this.onEditComplete.emit({ column: column, data: rowData, index: rowIndex });
1376
1455
  if (event.shiftKey)
1377
1456
  this.moveToPreviousCell(event);
1378
1457
  else
@@ -1380,6 +1459,25 @@ var DataTable = (function () {
1380
1459
  }
1381
1460
  }
1382
1461
  };
1462
+ DataTable.prototype.onCellEditorInput = function (event, column, rowData, rowIndex) {
1463
+ if (this.editable) {
1464
+ this.onEdit.emit({ originalEvent: event, column: column, data: rowData, index: rowIndex });
1465
+ }
1466
+ };
1467
+ DataTable.prototype.onCellEditorChange = function (event, column, rowData, rowIndex) {
1468
+ if (this.editable) {
1469
+ this.editChanged = true;
1470
+ this.onEditComplete.emit({ column: column, data: rowData, index: rowIndex });
1471
+ }
1472
+ };
1473
+ DataTable.prototype.onCellEditorBlur = function (event, column, rowData, rowIndex) {
1474
+ if (this.editable) {
1475
+ if (this.editChanged)
1476
+ this.editChanged = false;
1477
+ else
1478
+ this.onEditCancel.emit({ column: column, data: rowData, index: rowIndex });
1479
+ }
1480
+ };
1383
1481
  DataTable.prototype.moveToPreviousCell = function (event) {
1384
1482
  var currentCell = this.findCell(event.target);
1385
1483
  var row = currentCell.parentElement;
@@ -1630,6 +1728,9 @@ var DataTable = (function () {
1630
1728
  }
1631
1729
  if (allowDrop) {
1632
1730
  this.objectUtils.reorderArray(this.columns, dragIndex, dropIndex);
1731
+ if (this.scrollable) {
1732
+ this.initScrollableColumns();
1733
+ }
1633
1734
  this.onColReorder.emit({
1634
1735
  dragIndex: dragIndex,
1635
1736
  dropIndex: dropIndex,
@@ -1664,7 +1765,7 @@ var DataTable = (function () {
1664
1765
  }
1665
1766
  };
1666
1767
  DataTable.prototype.hasFooter = function () {
1667
- if (this.footerColumnGroup) {
1768
+ if (this.footerColumnGroups.first) {
1668
1769
  return true;
1669
1770
  }
1670
1771
  else {
@@ -1682,9 +1783,6 @@ var DataTable = (function () {
1682
1783
  return !this.dataToRender || (this.dataToRender.length == 0);
1683
1784
  };
1684
1785
  DataTable.prototype.createLazyLoadMetadata = function () {
1685
- if (this.enableLoader) {
1686
- this.loading = true;
1687
- }
1688
1786
  return {
1689
1787
  first: this.first,
1690
1788
  rows: this.virtualScroll ? this.rows * 2 : this.rows,
@@ -1754,6 +1852,9 @@ var DataTable = (function () {
1754
1852
  return this.findExpandedRowGroupIndex(row) != -1;
1755
1853
  };
1756
1854
  DataTable.prototype.toggleRowGroup = function (event, row) {
1855
+ if (!this.expandedRowsGroups) {
1856
+ this.expandedRowsGroups = [];
1857
+ }
1757
1858
  this.rowGroupToggleClick = true;
1758
1859
  var index = this.findExpandedRowGroupIndex(row);
1759
1860
  var rowGroupField = this.resolveFieldData(row, this.groupField);
@@ -1765,7 +1866,9 @@ var DataTable = (function () {
1765
1866
  });
1766
1867
  }
1767
1868
  else {
1768
- this.expandedRowsGroups = this.expandedRowsGroups || [];
1869
+ if (this.rowGroupExpandMode === 'single') {
1870
+ this.expandedRowsGroups = [];
1871
+ }
1769
1872
  this.expandedRowsGroups.push(rowGroupField);
1770
1873
  this.onRowGroupExpand.emit({
1771
1874
  originalEvent: event,
@@ -1775,8 +1878,8 @@ var DataTable = (function () {
1775
1878
  event.preventDefault();
1776
1879
  };
1777
1880
  DataTable.prototype.reset = function () {
1778
- this.sortField = null;
1779
- this.sortOrder = 1;
1881
+ this._sortField = null;
1882
+ this._sortOrder = 1;
1780
1883
  this.filteredValue = null;
1781
1884
  this.filters = {};
1782
1885
  this._first = 0;
@@ -1787,25 +1890,30 @@ var DataTable = (function () {
1787
1890
  else
1788
1891
  this.updateDataToRender(this.value);
1789
1892
  };
1790
- DataTable.prototype.exportCSV = function () {
1893
+ DataTable.prototype.exportCSV = function (options) {
1791
1894
  var _this = this;
1792
1895
  var data = this.filteredValue || this.value;
1793
1896
  var csv = '\ufeff';
1897
+ if (options && options.selectionOnly) {
1898
+ data = this.selection || [];
1899
+ }
1794
1900
  //headers
1795
1901
  for (var i = 0; i < this.columns.length; i++) {
1796
- if (this.columns[i].field) {
1797
- csv += '"' + (this.columns[i].header || this.columns[i].field) + '"';
1902
+ var column = this.columns[i];
1903
+ if (column.exportable && column.field) {
1904
+ csv += '"' + (column.header || column.field) + '"';
1798
1905
  if (i < (this.columns.length - 1)) {
1799
1906
  csv += this.csvSeparator;
1800
1907
  }
1801
1908
  }
1802
1909
  }
1803
- //body
1910
+ //body
1804
1911
  data.forEach(function (record, i) {
1805
1912
  csv += '\n';
1806
1913
  for (var i_1 = 0; i_1 < _this.columns.length; i_1++) {
1807
- if (_this.columns[i_1].field) {
1808
- csv += '"' + _this.resolveFieldData(record, _this.columns[i_1].field) + '"';
1914
+ var column = _this.columns[i_1];
1915
+ if (column.exportable && column.field) {
1916
+ csv += '"' + _this.resolveFieldData(record, column.field) + '"';
1809
1917
  if (i_1 < (_this.columns.length - 1)) {
1810
1918
  csv += _this.csvSeparator;
1811
1919
  }
@@ -1888,6 +1996,9 @@ var DataTable = (function () {
1888
1996
  if (this.columnsSubscription) {
1889
1997
  this.columnsSubscription.unsubscribe();
1890
1998
  }
1999
+ if (this.virtualScrollCallback) {
2000
+ this.virtualScrollCallback = null;
2001
+ }
1891
2002
  };
1892
2003
  return DataTable;
1893
2004
  }());
@@ -1927,6 +2038,10 @@ __decorate([
1927
2038
  core_1.Input(),
1928
2039
  __metadata("design:type", Boolean)
1929
2040
  ], DataTable.prototype, "editable", void 0);
2041
+ __decorate([
2042
+ core_1.Input(),
2043
+ __metadata("design:type", Boolean)
2044
+ ], DataTable.prototype, "showHeaderCheckbox", void 0);
1930
2045
  __decorate([
1931
2046
  core_1.Output(),
1932
2047
  __metadata("design:type", core_1.EventEmitter)
@@ -2035,14 +2150,6 @@ __decorate([
2035
2150
  core_1.Input(),
2036
2151
  __metadata("design:type", String)
2037
2152
  ], DataTable.prototype, "sortMode", void 0);
2038
- __decorate([
2039
- core_1.Input(),
2040
- __metadata("design:type", String)
2041
- ], DataTable.prototype, "sortField", void 0);
2042
- __decorate([
2043
- core_1.Input(),
2044
- __metadata("design:type", Number)
2045
- ], DataTable.prototype, "sortOrder", void 0);
2046
2153
  __decorate([
2047
2154
  core_1.Input(),
2048
2155
  __metadata("design:type", Number)
@@ -2051,10 +2158,6 @@ __decorate([
2051
2158
  core_1.Input(),
2052
2159
  __metadata("design:type", String)
2053
2160
  ], DataTable.prototype, "groupField", void 0);
2054
- __decorate([
2055
- core_1.Input(),
2056
- __metadata("design:type", Array)
2057
- ], DataTable.prototype, "multiSortMeta", void 0);
2058
2161
  __decorate([
2059
2162
  core_1.Input(),
2060
2163
  __metadata("design:type", Object)
@@ -2207,14 +2310,14 @@ __decorate([
2207
2310
  core_1.Input(),
2208
2311
  __metadata("design:type", String)
2209
2312
  ], DataTable.prototype, "loadingIcon", void 0);
2210
- __decorate([
2211
- core_1.Input(),
2212
- __metadata("design:type", Boolean)
2213
- ], DataTable.prototype, "enableLoader", void 0);
2214
2313
  __decorate([
2215
2314
  core_1.Input(),
2216
2315
  __metadata("design:type", Number)
2217
2316
  ], DataTable.prototype, "virtualScrollDelay", void 0);
2317
+ __decorate([
2318
+ core_1.Input(),
2319
+ __metadata("design:type", String)
2320
+ ], DataTable.prototype, "rowGroupExpandMode", void 0);
2218
2321
  __decorate([
2219
2322
  core_1.Output(),
2220
2323
  __metadata("design:type", core_1.EventEmitter)
@@ -2248,13 +2351,28 @@ __decorate([
2248
2351
  __metadata("design:type", core_1.QueryList)
2249
2352
  ], DataTable.prototype, "cols", void 0);
2250
2353
  __decorate([
2251
- core_1.ContentChild(shared_2.HeaderColumnGroup),
2252
- __metadata("design:type", shared_2.HeaderColumnGroup)
2253
- ], DataTable.prototype, "headerColumnGroup", void 0);
2354
+ core_1.ContentChildren(shared_2.HeaderColumnGroup),
2355
+ __metadata("design:type", core_1.QueryList)
2356
+ ], DataTable.prototype, "headerColumnGroups", void 0);
2357
+ __decorate([
2358
+ core_1.ContentChildren(shared_2.FooterColumnGroup),
2359
+ __metadata("design:type", core_1.QueryList)
2360
+ ], DataTable.prototype, "footerColumnGroups", void 0);
2361
+ __decorate([
2362
+ core_1.Input(),
2363
+ __metadata("design:type", Array),
2364
+ __metadata("design:paramtypes", [Array])
2365
+ ], DataTable.prototype, "multiSortMeta", null);
2366
+ __decorate([
2367
+ core_1.Input(),
2368
+ __metadata("design:type", String),
2369
+ __metadata("design:paramtypes", [String])
2370
+ ], DataTable.prototype, "sortField", null);
2254
2371
  __decorate([
2255
- core_1.ContentChild(shared_2.FooterColumnGroup),
2256
- __metadata("design:type", shared_2.FooterColumnGroup)
2257
- ], DataTable.prototype, "footerColumnGroup", void 0);
2372
+ core_1.Input(),
2373
+ __metadata("design:type", Number),
2374
+ __metadata("design:paramtypes", [Number])
2375
+ ], DataTable.prototype, "sortOrder", null);
2258
2376
  __decorate([
2259
2377
  core_1.Input(),
2260
2378
  __metadata("design:type", Array),
@@ -2278,7 +2396,7 @@ __decorate([
2278
2396
  DataTable = __decorate([
2279
2397
  core_1.Component({
2280
2398
  selector: 'p-dataTable',
2281
- template: "\n <div [ngStyle]=\"style\" [class]=\"styleClass\" [style.width]=\"containerWidth\"\n [ngClass]=\"{'ui-datatable ui-widget':true,'ui-datatable-reflow':responsive,'ui-datatable-stacked':stacked,'ui-datatable-resizable':resizableColumns,'ui-datatable-scrollable':scrollable}\">\n <div class=\"ui-datatable-loading ui-widget-overlay\" *ngIf=\"loading\"></div>\n <div class=\"ui-datatable-loading-content\" *ngIf=\"loading\">\n <i [class]=\"'fa fa-spin fa-2x ' + loadingIcon\"></i>\n </div>\n <div class=\"ui-datatable-header ui-widget-header\" *ngIf=\"header\">\n <ng-content select=\"p-header\"></ng-content>\n </div>\n <p-paginator [rows]=\"rows\" [first]=\"first\" [totalRecords]=\"totalRecords\" [pageLinkSize]=\"pageLinks\" styleClass=\"ui-paginator-top\" [alwaysShow]=\"alwaysShowPaginator\"\n (onPageChange)=\"onPageChange($event)\" [rowsPerPageOptions]=\"rowsPerPageOptions\" *ngIf=\"paginator && paginatorPosition =='top' || paginatorPosition =='both'\"></p-paginator>\n <div class=\"ui-datatable-tablewrapper\" *ngIf=\"!scrollable\">\n <table [ngClass]=\"tableStyleClass\" [ngStyle]=\"tableStyle\">\n <thead class=\"ui-datatable-thead\">\n <tr *ngIf=\"!headerColumnGroup\" class=\"ui-state-default\" [pColumnHeaders]=\"columns\"></tr>\n <ng-template [ngIf]=\"headerColumnGroup\">\n <tr *ngFor=\"let headerRow of headerColumnGroup.rows\" class=\"ui-state-default\" [pColumnHeaders]=\"headerRow.columns\"></tr>\n </ng-template>\n </thead>\n <tfoot *ngIf=\"hasFooter()\" class=\"ui-datatable-tfoot\">\n <tr *ngIf=\"!footerColumnGroup\" class=\"ui-state-default\" [pColumnFooters]=\"columns\"></tr>\n <ng-template [ngIf]=\"footerColumnGroup\">\n <tr *ngFor=\"let footerRow of footerColumnGroup.rows\" class=\"ui-state-default\" [pColumnFooters]=\"footerRow.columns\"></tr>\n </ng-template>\n </tfoot>\n <tbody [ngClass]=\"{'ui-datatable-data ui-widget-content': true, 'ui-datatable-hoverable-rows': (rowHover||selectionMode)}\" [pTableBody]=\"columns\" [data]=\"dataToRender\"></tbody>\n </table>\n </div>\n \n <ng-template [ngIf]=\"scrollable\">\n <div class=\"ui-datatable-scrollable-wrapper ui-helper-clearfix\" [ngClass]=\"{'max-height':scrollHeight}\">\n <div *ngIf=\"hasFrozenColumns()\" [pScrollableView]=\"frozenColumns\" frozen=\"true\" \n [ngStyle]=\"{'width':this.frozenWidth}\" class=\"ui-datatable-scrollable-view ui-datatable-frozen-view\"></div>\n <div [pScrollableView]=\"scrollableColumns\" [ngStyle]=\"{'width':this.unfrozenWidth, 'left': this.frozenWidth}\"\n class=\"ui-datatable-scrollable-view\" [virtualScroll]=\"virtualScroll\" (onVirtualScroll)=\"onVirtualScroll($event)\"\n [ngClass]=\"{'ui-datatable-unfrozen-view': hasFrozenColumns()}\"></div>\n </div>\n </ng-template>\n \n <p-paginator [rows]=\"rows\" [first]=\"first\" [totalRecords]=\"totalRecords\" [pageLinkSize]=\"pageLinks\" styleClass=\"ui-paginator-bottom\" [alwaysShow]=\"alwaysShowPaginator\"\n (onPageChange)=\"onPageChange($event)\" [rowsPerPageOptions]=\"rowsPerPageOptions\" *ngIf=\"paginator && paginatorPosition =='bottom' || paginatorPosition =='both'\"></p-paginator>\n <div class=\"ui-datatable-footer ui-widget-header\" *ngIf=\"footer\">\n <ng-content select=\"p-footer\"></ng-content>\n </div>\n \n <div class=\"ui-column-resizer-helper ui-state-highlight\" style=\"display:none\"></div>\n <span class=\"fa fa-arrow-down ui-datatable-reorder-indicator-up\" style=\"position: absolute; display: none;\"></span>\n <span class=\"fa fa-arrow-up ui-datatable-reorder-indicator-down\" style=\"position: absolute; display: none;\"></span>\n </div>\n ",
2399
+ template: "\n <div [ngStyle]=\"style\" [class]=\"styleClass\" [style.width]=\"containerWidth\"\n [ngClass]=\"{'ui-datatable ui-widget':true,'ui-datatable-reflow':responsive,'ui-datatable-stacked':stacked,'ui-datatable-resizable':resizableColumns,'ui-datatable-scrollable':scrollable}\">\n <div class=\"ui-datatable-loading ui-widget-overlay\" *ngIf=\"loading\"></div>\n <div class=\"ui-datatable-loading-content\" *ngIf=\"loading\">\n <i [class]=\"'fa fa-spin fa-2x ' + loadingIcon\"></i>\n </div>\n <div class=\"ui-datatable-header ui-widget-header\" *ngIf=\"header\">\n <ng-content select=\"p-header\"></ng-content>\n </div>\n <p-paginator [rows]=\"rows\" [first]=\"first\" [totalRecords]=\"totalRecords\" [pageLinkSize]=\"pageLinks\" styleClass=\"ui-paginator-top\" [alwaysShow]=\"alwaysShowPaginator\"\n (onPageChange)=\"onPageChange($event)\" [rowsPerPageOptions]=\"rowsPerPageOptions\" *ngIf=\"paginator && (paginatorPosition === 'top' || paginatorPosition =='both')\"></p-paginator>\n <div class=\"ui-datatable-tablewrapper\" *ngIf=\"!scrollable\">\n <table [ngClass]=\"tableStyleClass\" [ngStyle]=\"tableStyle\">\n <thead class=\"ui-datatable-thead\">\n <tr *ngIf=\"!headerColumnGroups.first\" class=\"ui-state-default\" [pColumnHeaders]=\"columns\"></tr>\n <ng-template [ngIf]=\"headerColumnGroups.first\">\n <tr *ngFor=\"let headerRow of headerColumnGroups.first.rows\" class=\"ui-state-default\" [pColumnHeaders]=\"headerRow.columns\"></tr>\n </ng-template>\n </thead>\n <tfoot *ngIf=\"hasFooter()\" class=\"ui-datatable-tfoot\">\n <tr *ngIf=\"!footerColumnGroups.first\" class=\"ui-state-default\" [pColumnFooters]=\"columns\"></tr>\n <ng-template [ngIf]=\"footerColumnGroups.first\">\n <tr *ngFor=\"let footerRow of footerColumnGroups.first.rows\" class=\"ui-state-default\" [pColumnFooters]=\"footerRow.columns\"></tr>\n </ng-template>\n </tfoot>\n <tbody [ngClass]=\"{'ui-datatable-data ui-widget-content': true, 'ui-datatable-hoverable-rows': (rowHover||selectionMode)}\" [pTableBody]=\"columns\" [data]=\"dataToRender\"></tbody>\n </table>\n </div>\n \n <ng-template [ngIf]=\"scrollable\">\n <div class=\"ui-datatable-scrollable-wrapper ui-helper-clearfix\">\n <div *ngIf=\"hasFrozenColumns()\" [pScrollableView]=\"frozenColumns\" frozen=\"true\"\n [headerColumnGroup]=\"frozenHeaderColumnGroup\" [footerColumnGroup]=\"frozenFooterColumnGroup\"\n [ngStyle]=\"{'width':this.frozenWidth}\" class=\"ui-datatable-scrollable-view ui-datatable-frozen-view\"></div>\n <div [pScrollableView]=\"scrollableColumns\" [ngStyle]=\"{'width':this.unfrozenWidth, 'left': this.frozenWidth}\"\n [headerColumnGroup]=\"scrollableHeaderColumnGroup\" [footerColumnGroup]=\"scrollableFooterColumnGroup\"\n class=\"ui-datatable-scrollable-view\" [virtualScroll]=\"virtualScroll\" (onVirtualScroll)=\"onVirtualScroll($event)\"\n [ngClass]=\"{'ui-datatable-unfrozen-view': hasFrozenColumns()}\"></div>\n </div>\n </ng-template>\n \n <p-paginator [rows]=\"rows\" [first]=\"first\" [totalRecords]=\"totalRecords\" [pageLinkSize]=\"pageLinks\" styleClass=\"ui-paginator-bottom\" [alwaysShow]=\"alwaysShowPaginator\"\n (onPageChange)=\"onPageChange($event)\" [rowsPerPageOptions]=\"rowsPerPageOptions\" *ngIf=\"paginator && (paginatorPosition === 'bottom' || paginatorPosition =='both')\"></p-paginator>\n <div class=\"ui-datatable-footer ui-widget-header\" *ngIf=\"footer\">\n <ng-content select=\"p-footer\"></ng-content>\n </div>\n \n <div class=\"ui-column-resizer-helper ui-state-highlight\" style=\"display:none\"></div>\n <span class=\"fa fa-arrow-down ui-datatable-reorder-indicator-up\" style=\"position: absolute; display: none;\"></span>\n <span class=\"fa fa-arrow-up ui-datatable-reorder-indicator-down\" style=\"position: absolute; display: none;\"></span>\n </div>\n ",
2282
2400
  providers: [domhandler_1.DomHandler, objectutils_1.ObjectUtils]
2283
2401
  }),
2284
2402
  __metadata("design:paramtypes", [core_1.ElementRef, domhandler_1.DomHandler, core_1.IterableDiffers,