@swimlane/ngx-datatable 11.1.7 → 11.3.2

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 (100) hide show
  1. package/assets/app.css +5 -6
  2. package/config/deploy.js +2 -2
  3. package/config/karma.conf.js +5 -0
  4. package/config/webpack.dev.js +1 -1
  5. package/package.json +8 -7
  6. package/release/assets/app.css +5 -6
  7. package/release/components/body/body-group-header.directive.d.ts +4 -5
  8. package/release/components/body/body-group-header.directive.js +4 -5
  9. package/release/components/body/body-group-header.directive.js.map +1 -1
  10. package/release/components/body/body-row.component.js +3 -2
  11. package/release/components/body/body-row.component.js.map +1 -1
  12. package/release/components/body/body-row.component.metadata.json +1 -1
  13. package/release/components/body/body.component.d.ts +4 -1
  14. package/release/components/body/body.component.js +22 -7
  15. package/release/components/body/body.component.js.map +1 -1
  16. package/release/components/body/body.component.metadata.json +1 -1
  17. package/release/components/body/index.d.ts +1 -0
  18. package/release/components/body/index.js +1 -0
  19. package/release/components/body/index.js.map +1 -1
  20. package/release/components/body/index.metadata.json +1 -1
  21. package/release/components/body/summary/index.d.ts +1 -0
  22. package/release/components/body/summary/index.js +7 -0
  23. package/release/components/body/summary/index.js.map +1 -0
  24. package/release/components/body/summary/index.metadata.json +1 -0
  25. package/release/components/body/summary/summary-row.component.d.ts +19 -0
  26. package/release/components/body/summary/summary-row.component.js +85 -0
  27. package/release/components/body/summary/summary-row.component.js.map +1 -0
  28. package/release/components/body/summary/summary-row.component.metadata.json +1 -0
  29. package/release/components/columns/column.directive.d.ts +2 -0
  30. package/release/components/columns/column.directive.js +8 -0
  31. package/release/components/columns/column.directive.js.map +1 -1
  32. package/release/components/columns/column.directive.metadata.json +1 -1
  33. package/release/components/datatable.component.css +7 -2
  34. package/release/components/datatable.component.d.ts +14 -1
  35. package/release/components/datatable.component.js +34 -7
  36. package/release/components/datatable.component.js.map +1 -1
  37. package/release/components/datatable.component.metadata.json +1 -1
  38. package/release/components/footer/pager.component.js +1 -1
  39. package/release/components/footer/pager.component.js.map +1 -1
  40. package/release/components/footer/pager.component.metadata.json +1 -1
  41. package/release/components/header/header-cell.component.js +2 -1
  42. package/release/components/header/header-cell.component.js.map +1 -1
  43. package/release/components/header/header-cell.component.metadata.json +1 -1
  44. package/release/components/header/header.component.js +1 -0
  45. package/release/components/header/header.component.js.map +1 -1
  46. package/release/datatable.module.js +2 -1
  47. package/release/datatable.module.js.map +1 -1
  48. package/release/datatable.module.metadata.json +1 -1
  49. package/release/directives/resizeable.directive.js +5 -2
  50. package/release/directives/resizeable.directive.js.map +1 -1
  51. package/release/events.js +3 -3
  52. package/release/events.js.map +1 -1
  53. package/release/events.metadata.json +1 -1
  54. package/release/index.css +8 -3
  55. package/release/index.js +201 -42
  56. package/release/index.min.js +1 -1
  57. package/release/index.min.js.map +1 -1
  58. package/release/themes/bootstrap.css +2 -0
  59. package/release/themes/dark.css +6 -0
  60. package/release/themes/material.css +6 -0
  61. package/release/types/table-column.type.d.ts +14 -0
  62. package/release/utils/column-helper.js +6 -0
  63. package/release/utils/column-helper.js.map +1 -1
  64. package/release/utils/column.d.ts +0 -4
  65. package/release/utils/column.js +0 -10
  66. package/release/utils/column.js.map +1 -1
  67. package/release/utils/column.metadata.json +1 -1
  68. package/release/utils/math.js +1 -1
  69. package/release/utils/math.js.map +1 -1
  70. package/src/components/body/body-group-header.directive.ts +5 -6
  71. package/src/components/body/body-row.component.ts +8 -7
  72. package/src/components/body/body.component.spec.ts +8 -7
  73. package/src/components/body/body.component.ts +27 -6
  74. package/src/components/body/index.ts +1 -0
  75. package/src/components/body/summary/index.ts +1 -0
  76. package/src/components/body/summary/summary-row.component.spec.ts +131 -0
  77. package/src/components/body/summary/summary-row.component.ts +74 -0
  78. package/src/components/columns/column.directive.ts +4 -2
  79. package/src/components/datatable.component.scss +14 -1
  80. package/src/components/datatable.component.spec.ts +55 -7
  81. package/src/components/datatable.component.ts +31 -9
  82. package/src/components/footer/footer.component.spec.ts +329 -47
  83. package/src/components/footer/pager.component.ts +10 -0
  84. package/src/components/header/header-cell.component.ts +2 -1
  85. package/src/components/header/header.component.ts +1 -0
  86. package/src/datatable.module.ts +8 -6
  87. package/src/directives/resizeable.directive.ts +4 -2
  88. package/src/events.ts +3 -3
  89. package/src/themes/bootstrap.scss +10 -1
  90. package/src/themes/dark.scss +14 -0
  91. package/src/themes/material.scss +20 -5
  92. package/src/types/table-column.type.ts +43 -28
  93. package/src/utils/column-helper.ts +9 -1
  94. package/src/utils/column-prop-getters.spec.ts +44 -0
  95. package/src/utils/column.ts +0 -12
  96. package/src/utils/math.ts +1 -1
  97. package/test/index.ts +1 -0
  98. package/test/jasmine-matchers.d.ts +12 -0
  99. package/test/jasmine-matchers.ts +70 -0
  100. package/tslint.json +1 -1
package/release/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * angular2-data-table v"11.1.7" (https://github.com/swimlane/angular2-data-table)
2
+ * angular2-data-table v"11.3.2" (https://github.com/swimlane/angular2-data-table)
3
3
  * Copyright 2016
4
4
  * Licensed under MIT
5
5
  */
@@ -88,7 +88,7 @@ exports = module.exports = __webpack_require__("./node_modules/css-loader/lib/cs
88
88
 
89
89
 
90
90
  // module
91
- exports.push([module.i, ".ngx-datatable {\n display: block;\n overflow: hidden;\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n position: relative;\n -webkit-transform: translate3d(0, 0, 0);\n /**\n * Vertical Scrolling Adjustments\n */\n /**\n * Horizontal Scrolling Adjustments\n */\n /**\n * Fixed Header Height Adjustments\n */\n /**\n * Fixed row height adjustments\n */\n /**\n * Shared Styles\n */\n /**\n * Header Styles\n */\n /**\n * Body Styles\n */\n /**\n * Footer Styles\n */ }\n .ngx-datatable [hidden] {\n display: none !important; }\n .ngx-datatable *, .ngx-datatable *:before, .ngx-datatable *:after {\n -webkit-box-sizing: border-box;\n box-sizing: border-box; }\n .ngx-datatable.scroll-vertical .datatable-body {\n overflow-y: auto; }\n .ngx-datatable.scroll-vertical .datatable-body .datatable-row-wrapper {\n position: absolute; }\n .ngx-datatable.scroll-horz .datatable-body {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch; }\n .ngx-datatable.fixed-header .datatable-header .datatable-header-inner {\n white-space: nowrap; }\n .ngx-datatable.fixed-header .datatable-header .datatable-header-inner .datatable-header-cell {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis; }\n .ngx-datatable.fixed-row .datatable-scroll {\n white-space: nowrap; }\n .ngx-datatable.fixed-row .datatable-scroll .datatable-body-row {\n white-space: nowrap; }\n .ngx-datatable.fixed-row .datatable-scroll .datatable-body-row .datatable-body-cell {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis; }\n .ngx-datatable.fixed-row .datatable-scroll .datatable-body-row .datatable-body-group-cell {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis; }\n .ngx-datatable .datatable-body-row,\n .ngx-datatable .datatable-row-center,\n .ngx-datatable .datatable-header-inner {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-orient: horizontal;\n -webkit-box-direction: normal;\n -ms-flex-direction: row;\n flex-direction: row;\n -ms-flex-flow: row;\n -o-flex-flow: row;\n flex-flow: row; }\n .ngx-datatable .datatable-body-cell,\n .ngx-datatable .datatable-header-cell {\n overflow-x: hidden;\n vertical-align: top;\n display: inline-block;\n line-height: 1.625; }\n .ngx-datatable .datatable-body-cell:focus,\n .ngx-datatable .datatable-header-cell:focus {\n outline: none; }\n .ngx-datatable .datatable-row-left,\n .ngx-datatable .datatable-row-right {\n z-index: 9; }\n .ngx-datatable .datatable-row-left,\n .ngx-datatable .datatable-row-center,\n .ngx-datatable .datatable-row-group,\n .ngx-datatable .datatable-row-right {\n position: relative; }\n .ngx-datatable .datatable-header {\n display: block;\n overflow: hidden; }\n .ngx-datatable .datatable-header .datatable-header-inner {\n -webkit-box-align: stretch;\n -ms-flex-align: stretch;\n align-items: stretch;\n -webkit-align-items: stretch; }\n .ngx-datatable .datatable-header .datatable-header-cell {\n position: relative;\n display: inline-block; }\n .ngx-datatable .datatable-header .datatable-header-cell.sortable .datatable-header-cell-wrapper {\n cursor: pointer; }\n .ngx-datatable .datatable-header .datatable-header-cell.longpress .datatable-header-cell-wrapper {\n cursor: move; }\n .ngx-datatable .datatable-header .datatable-header-cell .sort-btn {\n line-height: 100%;\n vertical-align: middle;\n display: inline-block;\n cursor: pointer; }\n .ngx-datatable .datatable-header .datatable-header-cell .resize-handle {\n display: inline-block;\n position: absolute;\n right: 0;\n top: 0;\n bottom: 0;\n width: 5px;\n padding: 0 4px;\n visibility: hidden;\n cursor: ew-resize; }\n .ngx-datatable .datatable-header .datatable-header-cell.resizeable:hover .resize-handle {\n visibility: visible; }\n .ngx-datatable .datatable-body {\n position: relative;\n z-index: 10;\n display: block; }\n .ngx-datatable .datatable-body .datatable-scroll {\n display: inline-block; }\n .ngx-datatable .datatable-body .datatable-row-detail {\n overflow-y: hidden; }\n .ngx-datatable .datatable-body .datatable-row-wrapper {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-orient: vertical;\n -webkit-box-direction: normal;\n -ms-flex-direction: column;\n flex-direction: column; }\n .ngx-datatable .datatable-body .datatable-body-row {\n outline: none; }\n .ngx-datatable .datatable-body .datatable-body-row > div {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex; }\n .ngx-datatable .datatable-footer {\n display: block;\n width: 100%; }\n .ngx-datatable .datatable-footer .datatable-footer-inner {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n width: 100%; }\n .ngx-datatable .datatable-footer .selected-count .page-count {\n -webkit-box-flex: 1;\n -ms-flex: 1 1 40%;\n flex: 1 1 40%; }\n .ngx-datatable .datatable-footer .selected-count .datatable-pager {\n -webkit-box-flex: 1;\n -ms-flex: 1 1 60%;\n flex: 1 1 60%; }\n .ngx-datatable .datatable-footer .page-count {\n -webkit-box-flex: 1;\n -ms-flex: 1 1 20%;\n flex: 1 1 20%; }\n .ngx-datatable .datatable-footer .datatable-pager {\n -webkit-box-flex: 1;\n -ms-flex: 1 1 80%;\n flex: 1 1 80%;\n text-align: right; }\n .ngx-datatable .datatable-footer .datatable-pager .pager,\n .ngx-datatable .datatable-footer .datatable-pager .pager li {\n padding: 0;\n margin: 0;\n display: inline-block;\n list-style: none; }\n .ngx-datatable .datatable-footer .datatable-pager .pager li, .ngx-datatable .datatable-footer .datatable-pager .pager li a {\n outline: none; }\n .ngx-datatable .datatable-footer .datatable-pager .pager li a {\n cursor: pointer;\n display: inline-block; }\n .ngx-datatable .datatable-footer .datatable-pager .pager li.disabled a {\n cursor: not-allowed; }\n", ""]);
91
+ exports.push([module.i, ".ngx-datatable {\n display: block;\n overflow: hidden;\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n position: relative;\n -webkit-transform: translate3d(0, 0, 0);\n /**\n * Vertical Scrolling Adjustments\n */\n /**\n * Horizontal Scrolling Adjustments\n */\n /**\n * Fixed Header Height Adjustments\n */\n /**\n * Fixed row height adjustments\n */\n /**\n * Shared Styles\n */\n /**\n * Header Styles\n */\n /**\n * Body Styles\n */\n /**\n * Footer Styles\n */ }\n .ngx-datatable [hidden] {\n display: none !important; }\n .ngx-datatable *, .ngx-datatable *:before, .ngx-datatable *:after {\n -webkit-box-sizing: border-box;\n box-sizing: border-box; }\n .ngx-datatable.scroll-vertical .datatable-body {\n overflow-y: auto; }\n .ngx-datatable.scroll-vertical .datatable-body .datatable-row-wrapper {\n position: absolute; }\n .ngx-datatable.scroll-horz .datatable-body {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch; }\n .ngx-datatable.fixed-header .datatable-header .datatable-header-inner {\n white-space: nowrap; }\n .ngx-datatable.fixed-header .datatable-header .datatable-header-inner .datatable-header-cell {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis; }\n .ngx-datatable.fixed-row .datatable-scroll {\n white-space: nowrap; }\n .ngx-datatable.fixed-row .datatable-scroll .datatable-body-row {\n white-space: nowrap; }\n .ngx-datatable.fixed-row .datatable-scroll .datatable-body-row .datatable-body-cell {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis; }\n .ngx-datatable.fixed-row .datatable-scroll .datatable-body-row .datatable-body-group-cell {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis; }\n .ngx-datatable .datatable-body-row,\n .ngx-datatable .datatable-row-center,\n .ngx-datatable .datatable-header-inner {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-orient: horizontal;\n -webkit-box-direction: normal;\n -ms-flex-direction: row;\n flex-direction: row;\n -ms-flex-flow: row;\n -o-flex-flow: row;\n flex-flow: row; }\n .ngx-datatable .datatable-body-cell,\n .ngx-datatable .datatable-header-cell {\n overflow-x: hidden;\n vertical-align: top;\n display: inline-block;\n line-height: 1.625; }\n .ngx-datatable .datatable-body-cell:focus,\n .ngx-datatable .datatable-header-cell:focus {\n outline: none; }\n .ngx-datatable .datatable-row-left,\n .ngx-datatable .datatable-row-right {\n z-index: 9; }\n .ngx-datatable .datatable-row-left,\n .ngx-datatable .datatable-row-center,\n .ngx-datatable .datatable-row-group,\n .ngx-datatable .datatable-row-right {\n position: relative; }\n .ngx-datatable .datatable-header {\n display: block;\n overflow: hidden; }\n .ngx-datatable .datatable-header .datatable-header-inner {\n -webkit-box-align: stretch;\n -ms-flex-align: stretch;\n align-items: stretch;\n -webkit-align-items: stretch; }\n .ngx-datatable .datatable-header .datatable-header-cell {\n position: relative;\n display: inline-block; }\n .ngx-datatable .datatable-header .datatable-header-cell.sortable .datatable-header-cell-wrapper {\n cursor: pointer; }\n .ngx-datatable .datatable-header .datatable-header-cell.longpress .datatable-header-cell-wrapper {\n cursor: move; }\n .ngx-datatable .datatable-header .datatable-header-cell .sort-btn {\n line-height: 100%;\n vertical-align: middle;\n display: inline-block;\n cursor: pointer; }\n .ngx-datatable .datatable-header .datatable-header-cell .resize-handle, .ngx-datatable .datatable-header .datatable-header-cell .resize-handle--not-resizable {\n display: inline-block;\n position: absolute;\n right: 0;\n top: 0;\n bottom: 0;\n width: 5px;\n padding: 0 4px;\n visibility: hidden; }\n .ngx-datatable .datatable-header .datatable-header-cell .resize-handle {\n cursor: ew-resize; }\n .ngx-datatable .datatable-header .datatable-header-cell.resizeable:hover .resize-handle {\n visibility: visible; }\n .ngx-datatable .datatable-header .datatable-header-cell:hover .resize-handle--not-resizable {\n visibility: visible; }\n .ngx-datatable .datatable-header .datatable-header-cell .datatable-header-cell-template-wrap {\n height: inherit; }\n .ngx-datatable .datatable-body {\n position: relative;\n z-index: 10;\n display: block; }\n .ngx-datatable .datatable-body .datatable-scroll {\n display: inline-block; }\n .ngx-datatable .datatable-body .datatable-row-detail {\n overflow-y: hidden; }\n .ngx-datatable .datatable-body .datatable-row-wrapper {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-orient: vertical;\n -webkit-box-direction: normal;\n -ms-flex-direction: column;\n flex-direction: column; }\n .ngx-datatable .datatable-body .datatable-body-row {\n outline: none; }\n .ngx-datatable .datatable-body .datatable-body-row > div {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex; }\n .ngx-datatable .datatable-footer {\n display: block;\n width: 100%; }\n .ngx-datatable .datatable-footer .datatable-footer-inner {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n width: 100%; }\n .ngx-datatable .datatable-footer .selected-count .page-count {\n -webkit-box-flex: 1;\n -ms-flex: 1 1 40%;\n flex: 1 1 40%; }\n .ngx-datatable .datatable-footer .selected-count .datatable-pager {\n -webkit-box-flex: 1;\n -ms-flex: 1 1 60%;\n flex: 1 1 60%; }\n .ngx-datatable .datatable-footer .page-count {\n -webkit-box-flex: 1;\n -ms-flex: 1 1 20%;\n flex: 1 1 20%; }\n .ngx-datatable .datatable-footer .datatable-pager {\n -webkit-box-flex: 1;\n -ms-flex: 1 1 80%;\n flex: 1 1 80%;\n text-align: right; }\n .ngx-datatable .datatable-footer .datatable-pager .pager,\n .ngx-datatable .datatable-footer .datatable-pager .pager li {\n padding: 0;\n margin: 0;\n display: inline-block;\n list-style: none; }\n .ngx-datatable .datatable-footer .datatable-pager .pager li, .ngx-datatable .datatable-footer .datatable-pager .pager li a {\n outline: none; }\n .ngx-datatable .datatable-footer .datatable-pager .pager li a {\n cursor: pointer;\n display: inline-block; }\n .ngx-datatable .datatable-footer .datatable-pager .pager li.disabled a {\n cursor: not-allowed; }\n", ""]);
92
92
 
93
93
  // exports
94
94
 
@@ -678,12 +678,11 @@ var body_group_header_template_directive_1 = __webpack_require__("./src/componen
678
678
  var DatatableGroupHeaderDirective = /** @class */ (function () {
679
679
  function DatatableGroupHeaderDirective() {
680
680
  /**
681
- * The detail row height is required especially
682
- * when virtual scroll is enabled.
681
+ * Row height is required when virtual scroll is enabled.
683
682
  */
684
683
  this.rowHeight = 0;
685
684
  /**
686
- * Group visbility was toggled.
685
+ * Track toggling of group visibility
687
686
  */
688
687
  this.toggle = new core_1.EventEmitter();
689
688
  }
@@ -697,7 +696,7 @@ var DatatableGroupHeaderDirective = /** @class */ (function () {
697
696
  });
698
697
  };
699
698
  /**
700
- * API method to expand all groups.
699
+ * Expand all groups
701
700
  */
702
701
  DatatableGroupHeaderDirective.prototype.expandAllGroups = function () {
703
702
  this.toggle.emit({
@@ -706,7 +705,7 @@ var DatatableGroupHeaderDirective = /** @class */ (function () {
706
705
  });
707
706
  };
708
707
  /**
709
- * API method to collapse all groups.
708
+ * Collapse all groups
710
709
  */
711
710
  DatatableGroupHeaderDirective.prototype.collapseAllGroups = function () {
712
711
  this.toggle.emit({
@@ -924,6 +923,7 @@ var DataTableBodyRowComponent = /** @class */ (function () {
924
923
  set: function (val) {
925
924
  this._columns = val;
926
925
  this.recalculateColumns(val);
926
+ this.buildStylesByGroup();
927
927
  },
928
928
  enumerable: true,
929
929
  configurable: true
@@ -1059,7 +1059,7 @@ var DataTableBodyRowComponent = /** @class */ (function () {
1059
1059
  if (val === void 0) { val = this.columns; }
1060
1060
  this._columns = val;
1061
1061
  var colsByPin = utils_1.columnsByPin(this._columns);
1062
- this._columnsByPin = utils_1.allColumnsByPinArr(this._columns);
1062
+ this._columnsByPin = utils_1.columnsByPinArr(this._columns);
1063
1063
  this._columnGroupWidths = utils_1.columnGroupWidths(colsByPin, this._columns);
1064
1064
  };
1065
1065
  __decorate([
@@ -1140,7 +1140,7 @@ var DataTableBodyRowComponent = /** @class */ (function () {
1140
1140
  core_1.Component({
1141
1141
  selector: 'datatable-body-row',
1142
1142
  changeDetection: core_1.ChangeDetectionStrategy.OnPush,
1143
- template: "\n <div\n *ngFor=\"let colGroup of _columnsByPin; let i = index; trackBy: trackByGroups\"\n class=\"datatable-row-{{colGroup.type}} datatable-row-group\"\n [ngStyle]=\"_groupStyles[colGroup.type]\">\n <datatable-body-cell\n *ngFor=\"let column of colGroup.columns; let ii = index; trackBy: columnTrackingFn\"\n tabindex=\"-1\"\n [row]=\"row\"\n [group]=\"group\"\n [expanded]=\"expanded\"\n [isSelected]=\"isSelected\"\n [rowIndex]=\"rowIndex\"\n [column]=\"column\"\n [rowHeight]=\"rowHeight\"\n [displayCheck]=\"displayCheck\"\n (activate)=\"onActivate($event, ii)\">\n </datatable-body-cell>\n </div> \n "
1143
+ template: "\n <div\n *ngFor=\"let colGroup of _columnsByPin; let i = index; trackBy: trackByGroups\"\n class=\"datatable-row-{{colGroup.type}} datatable-row-group\"\n [ngStyle]=\"_groupStyles[colGroup.type]\">\n <datatable-body-cell\n *ngFor=\"let column of colGroup.columns; let ii = index; trackBy: columnTrackingFn\"\n tabindex=\"-1\"\n [row]=\"row\"\n [group]=\"group\"\n [expanded]=\"expanded\"\n [isSelected]=\"isSelected\"\n [rowIndex]=\"rowIndex\"\n [column]=\"column\"\n [rowHeight]=\"rowHeight\"\n [displayCheck]=\"displayCheck\"\n (activate)=\"onActivate($event, ii)\">\n </datatable-body-cell>\n </div>\n "
1144
1144
  }),
1145
1145
  __param(1, core_1.SkipSelf()),
1146
1146
  __metadata("design:paramtypes", [core_1.KeyValueDiffers,
@@ -1316,7 +1316,7 @@ var DataTableBodyComponent = /** @class */ (function () {
1316
1316
  * calculate scroll height automatically (as height will be undefined).
1317
1317
  */
1318
1318
  get: function () {
1319
- if (this.scrollbarV) {
1319
+ if (this.scrollbarV && this.rowCount) {
1320
1320
  return this.rowHeightsCache.query(this.rowCount - 1);
1321
1321
  }
1322
1322
  // avoid TS7030: Not all code paths return a value.
@@ -1466,12 +1466,15 @@ var DataTableBodyComponent = /** @class */ (function () {
1466
1466
  * Get the row height
1467
1467
  */
1468
1468
  DataTableBodyComponent.prototype.getRowHeight = function (row) {
1469
- var rowHeight = this.rowHeight;
1469
+ var height;
1470
1470
  // if its a function return it
1471
1471
  if (typeof this.rowHeight === 'function') {
1472
- rowHeight = this.rowHeight(row);
1472
+ height = this.rowHeight(row);
1473
1473
  }
1474
- return rowHeight;
1474
+ else {
1475
+ height = this.rowHeight;
1476
+ }
1477
+ return height;
1475
1478
  };
1476
1479
  /**
1477
1480
  * @param group the group with all rows
@@ -1567,7 +1570,7 @@ var DataTableBodyComponent = /** @class */ (function () {
1567
1570
  // If virtual rows are not needed
1568
1571
  // We render all in one go
1569
1572
  first = 0;
1570
- last = this.rowCount - 1;
1573
+ last = this.rowCount;
1571
1574
  }
1572
1575
  }
1573
1576
  else {
@@ -1738,7 +1741,7 @@ var DataTableBodyComponent = /** @class */ (function () {
1738
1741
  ], DataTableBodyComponent.prototype, "externalPaging", void 0);
1739
1742
  __decorate([
1740
1743
  core_1.Input(),
1741
- __metadata("design:type", Number)
1744
+ __metadata("design:type", Object)
1742
1745
  ], DataTableBodyComponent.prototype, "rowHeight", void 0);
1743
1746
  __decorate([
1744
1747
  core_1.Input(),
@@ -1804,6 +1807,18 @@ var DataTableBodyComponent = /** @class */ (function () {
1804
1807
  core_1.Input(),
1805
1808
  __metadata("design:type", Boolean)
1806
1809
  ], DataTableBodyComponent.prototype, "virtualization", void 0);
1810
+ __decorate([
1811
+ core_1.Input(),
1812
+ __metadata("design:type", Boolean)
1813
+ ], DataTableBodyComponent.prototype, "summaryRow", void 0);
1814
+ __decorate([
1815
+ core_1.Input(),
1816
+ __metadata("design:type", String)
1817
+ ], DataTableBodyComponent.prototype, "summaryPosition", void 0);
1818
+ __decorate([
1819
+ core_1.Input(),
1820
+ __metadata("design:type", Number)
1821
+ ], DataTableBodyComponent.prototype, "summaryHeight", void 0);
1807
1822
  __decorate([
1808
1823
  core_1.Input(),
1809
1824
  __metadata("design:type", Number),
@@ -1871,7 +1886,7 @@ var DataTableBodyComponent = /** @class */ (function () {
1871
1886
  DataTableBodyComponent = __decorate([
1872
1887
  core_1.Component({
1873
1888
  selector: 'datatable-body',
1874
- template: "\n <datatable-selection\n #selector\n [selected]=\"selected\"\n [rows]=\"rows\"\n [selectCheck]=\"selectCheck\"\n [selectEnabled]=\"selectEnabled\"\n [selectionType]=\"selectionType\"\n [rowIdentity]=\"rowIdentity\"\n (select)=\"select.emit($event)\"\n (activate)=\"activate.emit($event)\">\n <datatable-progress\n *ngIf=\"loadingIndicator\">\n </datatable-progress>\n <datatable-scroller\n *ngIf=\"rows?.length\"\n [scrollbarV]=\"scrollbarV\"\n [scrollbarH]=\"scrollbarH\"\n [scrollHeight]=\"scrollHeight\"\n [scrollWidth]=\"columnGroupWidths?.total\"\n (scroll)=\"onBodyScroll($event)\">\n <datatable-row-wrapper\n [groupedRows]=\"groupedRows\"\n *ngFor=\"let group of temp; let i = index; trackBy: rowTrackingFn;\"\n [innerWidth]=\"innerWidth\"\n [ngStyle]=\"getRowsStyles(group)\"\n [rowDetail]=\"rowDetail\"\n [groupHeader]=\"groupHeader\"\n [offsetX]=\"offsetX\"\n [detailRowHeight]=\"getDetailRowHeight(group[i],i)\"\n [row]=\"group\"\n [expanded]=\"getRowExpanded(group)\"\n [rowIndex]=\"getRowIndex(group[i])\"\n (rowContextmenu)=\"rowContextmenu.emit($event)\">\n <datatable-body-row\n *ngIf=\"!groupedRows; else groupedRowsTemplate\"\n tabindex=\"-1\"\n [isSelected]=\"selector.getRowSelected(group)\"\n [innerWidth]=\"innerWidth\"\n [offsetX]=\"offsetX\"\n [columns]=\"columns\"\n [rowHeight]=\"getRowHeight(group)\"\n [row]=\"group\"\n [rowIndex]=\"getRowIndex(group)\"\n [expanded]=\"getRowExpanded(group)\"\n [rowClass]=\"rowClass\"\n [displayCheck]=\"displayCheck\"\n (activate)=\"selector.onActivate($event, indexes.first + i)\">\n </datatable-body-row>\n <ng-template #groupedRowsTemplate>\n <datatable-body-row\n *ngFor=\"let row of group.value; let i = index; trackBy: rowTrackingFn;\"\n tabindex=\"-1\"\n [isSelected]=\"selector.getRowSelected(row)\"\n [innerWidth]=\"innerWidth\"\n [offsetX]=\"offsetX\"\n [columns]=\"columns\"\n [rowHeight]=\"getRowHeight(row)\"\n [row]=\"row\"\n [group]=\"group.value\"\n [rowIndex]=\"getRowIndex(row)\"\n [expanded]=\"getRowExpanded(row)\"\n [rowClass]=\"rowClass\"\n (activate)=\"selector.onActivate($event, i)\">\n </datatable-body-row>\n </ng-template>\n </datatable-row-wrapper>\n </datatable-scroller>\n <div\n class=\"empty-row\"\n *ngIf=\"!rows?.length && !loadingIndicator\"\n [innerHTML]=\"emptyMessage\">\n </div>\n </datatable-selection>\n ",
1889
+ template: "\n <datatable-selection\n #selector\n [selected]=\"selected\"\n [rows]=\"rows\"\n [selectCheck]=\"selectCheck\"\n [selectEnabled]=\"selectEnabled\"\n [selectionType]=\"selectionType\"\n [rowIdentity]=\"rowIdentity\"\n (select)=\"select.emit($event)\"\n (activate)=\"activate.emit($event)\">\n <datatable-progress\n *ngIf=\"loadingIndicator\">\n </datatable-progress>\n <datatable-scroller\n *ngIf=\"rows?.length\"\n [scrollbarV]=\"scrollbarV\"\n [scrollbarH]=\"scrollbarH\"\n [scrollHeight]=\"scrollHeight\"\n [scrollWidth]=\"columnGroupWidths?.total\"\n (scroll)=\"onBodyScroll($event)\">\n <datatable-summary-row\n *ngIf=\"summaryRow && summaryPosition === 'top'\"\n [rowHeight]=\"summaryHeight\"\n [offsetX]=\"offsetX\"\n [innerWidth]=\"innerWidth\"\n [rows]=\"rows\"\n [columns]=\"columns\">\n </datatable-summary-row>\n <datatable-row-wrapper\n [groupedRows]=\"groupedRows\"\n *ngFor=\"let group of temp; let i = index; trackBy: rowTrackingFn;\"\n [innerWidth]=\"innerWidth\"\n [ngStyle]=\"getRowsStyles(group)\"\n [rowDetail]=\"rowDetail\"\n [groupHeader]=\"groupHeader\"\n [offsetX]=\"offsetX\"\n [detailRowHeight]=\"getDetailRowHeight(group[i],i)\"\n [row]=\"group\"\n [expanded]=\"getRowExpanded(group)\"\n [rowIndex]=\"getRowIndex(group[i])\"\n (rowContextmenu)=\"rowContextmenu.emit($event)\">\n <datatable-body-row\n *ngIf=\"!groupedRows; else groupedRowsTemplate\"\n tabindex=\"-1\"\n [isSelected]=\"selector.getRowSelected(group)\"\n [innerWidth]=\"innerWidth\"\n [offsetX]=\"offsetX\"\n [columns]=\"columns\"\n [rowHeight]=\"getRowHeight(group)\"\n [row]=\"group\"\n [rowIndex]=\"getRowIndex(group)\"\n [expanded]=\"getRowExpanded(group)\"\n [rowClass]=\"rowClass\"\n [displayCheck]=\"displayCheck\"\n (activate)=\"selector.onActivate($event, indexes.first + i)\">\n </datatable-body-row>\n <ng-template #groupedRowsTemplate>\n <datatable-body-row\n *ngFor=\"let row of group.value; let i = index; trackBy: rowTrackingFn;\"\n tabindex=\"-1\"\n [isSelected]=\"selector.getRowSelected(row)\"\n [innerWidth]=\"innerWidth\"\n [offsetX]=\"offsetX\"\n [columns]=\"columns\"\n [rowHeight]=\"getRowHeight(row)\"\n [row]=\"row\"\n [group]=\"group.value\"\n [rowIndex]=\"getRowIndex(row)\"\n [expanded]=\"getRowExpanded(row)\"\n [rowClass]=\"rowClass\"\n (activate)=\"selector.onActivate($event, i)\">\n </datatable-body-row>\n </ng-template>\n </datatable-row-wrapper>\n <datatable-summary-row\n *ngIf=\"summaryRow && summaryPosition === 'bottom'\"\n [rowHeight]=\"summaryHeight\"\n [offsetX]=\"offsetX\"\n [innerWidth]=\"innerWidth\"\n [rows]=\"rows\"\n [columns]=\"columns\">\n </datatable-summary-row>\n </datatable-scroller>\n <div\n class=\"empty-row\"\n *ngIf=\"!rows?.length && !loadingIndicator\"\n [innerHTML]=\"emptyMessage\">\n </div>\n </datatable-selection>\n ",
1875
1890
  changeDetection: core_1.ChangeDetectionStrategy.OnPush,
1876
1891
  host: {
1877
1892
  class: 'datatable-body'
@@ -1904,6 +1919,7 @@ __export(__webpack_require__("./src/components/body/body-row-wrapper.component.t
1904
1919
  __export(__webpack_require__("./src/components/body/selection.component.ts"));
1905
1920
  __export(__webpack_require__("./src/components/body/body-group-header.directive.ts"));
1906
1921
  __export(__webpack_require__("./src/components/body/body-group-header-template.directive.ts"));
1922
+ __export(__webpack_require__("./src/components/body/summary/index.ts"));
1907
1923
 
1908
1924
 
1909
1925
  /***/ }),
@@ -2238,6 +2254,112 @@ var DataTableSelectionComponent = /** @class */ (function () {
2238
2254
  exports.DataTableSelectionComponent = DataTableSelectionComponent;
2239
2255
 
2240
2256
 
2257
+ /***/ }),
2258
+
2259
+ /***/ "./src/components/body/summary/index.ts":
2260
+ /***/ (function(module, exports, __webpack_require__) {
2261
+
2262
+ "use strict";
2263
+
2264
+ function __export(m) {
2265
+ for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
2266
+ }
2267
+ Object.defineProperty(exports, "__esModule", { value: true });
2268
+ __export(__webpack_require__("./src/components/body/summary/summary-row.component.ts"));
2269
+
2270
+
2271
+ /***/ }),
2272
+
2273
+ /***/ "./src/components/body/summary/summary-row.component.ts":
2274
+ /***/ (function(module, exports, __webpack_require__) {
2275
+
2276
+ "use strict";
2277
+
2278
+ var __assign = (this && this.__assign) || Object.assign || function(t) {
2279
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
2280
+ s = arguments[i];
2281
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
2282
+ t[p] = s[p];
2283
+ }
2284
+ return t;
2285
+ };
2286
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2287
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
2288
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
2289
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
2290
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
2291
+ };
2292
+ var __metadata = (this && this.__metadata) || function (k, v) {
2293
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
2294
+ };
2295
+ Object.defineProperty(exports, "__esModule", { value: true });
2296
+ var core_1 = __webpack_require__("@angular/core");
2297
+ function defaultSumFunc(cells) {
2298
+ return cells
2299
+ .filter(function (cell) { return !!cell; })
2300
+ .reduce(function (res, cell) { return res + cell; });
2301
+ }
2302
+ var DataTableSummaryRowComponent = /** @class */ (function () {
2303
+ function DataTableSummaryRowComponent() {
2304
+ this.summaryRow = {};
2305
+ }
2306
+ DataTableSummaryRowComponent.prototype.ngOnChanges = function () {
2307
+ if (!this.columns || !this.rows) {
2308
+ return;
2309
+ }
2310
+ this.updateInternalColumns();
2311
+ this.updateValues();
2312
+ };
2313
+ DataTableSummaryRowComponent.prototype.updateInternalColumns = function () {
2314
+ this._internalColumns = this.columns.map(function (col) { return (__assign({}, col, { cellTemplate: col.summaryTemplate })); });
2315
+ };
2316
+ DataTableSummaryRowComponent.prototype.updateValues = function () {
2317
+ var _this = this;
2318
+ this.summaryRow = {};
2319
+ this.columns
2320
+ .filter(function (col) { return !col.summaryTemplate; })
2321
+ .forEach(function (col) {
2322
+ var cellsFromSingleColumn = _this.rows.map(function (row) { return row[col.prop]; });
2323
+ var sumFunc = col.summaryFunc || defaultSumFunc;
2324
+ _this.summaryRow[col.prop] = col.pipe ?
2325
+ col.pipe.transform(sumFunc(cellsFromSingleColumn)) :
2326
+ sumFunc(cellsFromSingleColumn);
2327
+ });
2328
+ };
2329
+ __decorate([
2330
+ core_1.Input(),
2331
+ __metadata("design:type", Array)
2332
+ ], DataTableSummaryRowComponent.prototype, "rows", void 0);
2333
+ __decorate([
2334
+ core_1.Input(),
2335
+ __metadata("design:type", Array)
2336
+ ], DataTableSummaryRowComponent.prototype, "columns", void 0);
2337
+ __decorate([
2338
+ core_1.Input(),
2339
+ __metadata("design:type", Number)
2340
+ ], DataTableSummaryRowComponent.prototype, "rowHeight", void 0);
2341
+ __decorate([
2342
+ core_1.Input(),
2343
+ __metadata("design:type", Number)
2344
+ ], DataTableSummaryRowComponent.prototype, "offsetX", void 0);
2345
+ __decorate([
2346
+ core_1.Input(),
2347
+ __metadata("design:type", Number)
2348
+ ], DataTableSummaryRowComponent.prototype, "innerWidth", void 0);
2349
+ DataTableSummaryRowComponent = __decorate([
2350
+ core_1.Component({
2351
+ selector: 'datatable-summary-row',
2352
+ template: "\n <datatable-body-row\n *ngIf=\"summaryRow && _internalColumns\"\n tabindex=\"-1\"\n [innerWidth]=\"innerWidth\"\n [offsetX]=\"offsetX\"\n [columns]=\"_internalColumns\"\n [rowHeight]=\"rowHeight\"\n [row]=\"summaryRow\"\n [rowIndex]=\"-1\">\n </datatable-body-row>\n ",
2353
+ host: {
2354
+ class: 'datatable-summary-row'
2355
+ }
2356
+ })
2357
+ ], DataTableSummaryRowComponent);
2358
+ return DataTableSummaryRowComponent;
2359
+ }());
2360
+ exports.DataTableSummaryRowComponent = DataTableSummaryRowComponent;
2361
+
2362
+
2241
2363
  /***/ }),
2242
2364
 
2243
2365
  /***/ "./src/components/columns/column-cell.directive.ts":
@@ -2395,6 +2517,14 @@ var DataTableColumnDirective = /** @class */ (function () {
2395
2517
  core_1.Input(),
2396
2518
  __metadata("design:type", Object)
2397
2519
  ], DataTableColumnDirective.prototype, "cellClass", void 0);
2520
+ __decorate([
2521
+ core_1.Input(),
2522
+ __metadata("design:type", Function)
2523
+ ], DataTableColumnDirective.prototype, "summaryFunc", void 0);
2524
+ __decorate([
2525
+ core_1.Input(),
2526
+ __metadata("design:type", core_1.TemplateRef)
2527
+ ], DataTableColumnDirective.prototype, "summaryTemplate", void 0);
2398
2528
  __decorate([
2399
2529
  core_1.Input(),
2400
2530
  core_1.ContentChild(column_cell_directive_1.DataTableColumnCellDirective, { read: core_1.TemplateRef }),
@@ -2603,6 +2733,18 @@ var DatatableComponent = /** @class */ (function () {
2603
2733
  * A flag for row virtualization on / off
2604
2734
  */
2605
2735
  this.virtualization = true;
2736
+ /**
2737
+ * A flag for switching summary row on / off
2738
+ */
2739
+ this.summaryRow = false;
2740
+ /**
2741
+ * A height of summary row
2742
+ */
2743
+ this.summaryHeight = this.rowHeight;
2744
+ /**
2745
+ * A property holds a summary row position: top/bottom
2746
+ */
2747
+ this.summaryPosition = 'top';
2606
2748
  /**
2607
2749
  * Body was scrolled typically in a `scrollbarV:true` scenario.
2608
2750
  */
@@ -2662,7 +2804,7 @@ var DatatableComponent = /** @class */ (function () {
2662
2804
  }
2663
2805
  // auto sort on new updates
2664
2806
  if (!this.externalSorting) {
2665
- this._internalRows = utils_1.sortRows(this._internalRows, this._internalColumns, this.sorts);
2807
+ this.sortInternalRows();
2666
2808
  }
2667
2809
  // recalculate sizes/etc
2668
2810
  this.recalculate();
@@ -2926,7 +3068,7 @@ var DatatableComponent = /** @class */ (function () {
2926
3068
  DatatableComponent.prototype.ngAfterViewInit = function () {
2927
3069
  var _this = this;
2928
3070
  if (!this.externalSorting) {
2929
- this._internalRows = utils_1.sortRows(this._internalRows, this._internalColumns, this.sorts);
3071
+ this.sortInternalRows();
2930
3072
  }
2931
3073
  // this has to be done to prevent the change detection
2932
3074
  // tree from freaking out because we are readjusting
@@ -2966,6 +3108,7 @@ var DatatableComponent = /** @class */ (function () {
2966
3108
  this._internalColumns = utils_1.translateTemplates(arr);
2967
3109
  utils_1.setColumnDefaults(this._internalColumns);
2968
3110
  this.recalculateColumns();
3111
+ this.sortInternalRows();
2969
3112
  this.cd.markForCheck();
2970
3113
  }
2971
3114
  }
@@ -3002,7 +3145,7 @@ var DatatableComponent = /** @class */ (function () {
3002
3145
  DatatableComponent.prototype.ngDoCheck = function () {
3003
3146
  if (this.rowDiffer.diff(this.rows)) {
3004
3147
  if (!this.externalSorting) {
3005
- this._internalRows = utils_1.sortRows(this._internalRows, this._internalColumns, this.sorts);
3148
+ this.sortInternalRows();
3006
3149
  }
3007
3150
  else {
3008
3151
  this._internalRows = this.rows.slice();
@@ -3230,14 +3373,13 @@ var DatatableComponent = /** @class */ (function () {
3230
3373
  selected: this.selected
3231
3374
  });
3232
3375
  }
3233
- var sorts = event.sorts;
3376
+ this.sorts = event.sorts;
3234
3377
  // this could be optimized better since it will resort
3235
3378
  // the rows again on the 'push' detection...
3236
3379
  if (this.externalSorting === false) {
3237
3380
  // don't use normal setter so we don't resort
3238
- this._internalRows = utils_1.sortRows(this._internalRows, this._internalColumns, sorts);
3381
+ this.sortInternalRows();
3239
3382
  }
3240
- this.sorts = sorts;
3241
3383
  // Always go to first page when sorting to see the newly sorted data
3242
3384
  this.offset = 0;
3243
3385
  this.bodyComponent.updateOffsetY(this.offset);
@@ -3280,6 +3422,9 @@ var DatatableComponent = /** @class */ (function () {
3280
3422
  DatatableComponent.prototype.onBodySelect = function (event) {
3281
3423
  this.select.emit(event);
3282
3424
  };
3425
+ DatatableComponent.prototype.sortInternalRows = function () {
3426
+ this._internalRows = utils_1.sortRows(this._internalRows, this._internalColumns, this.sorts);
3427
+ };
3283
3428
  __decorate([
3284
3429
  core_1.Input(),
3285
3430
  __metadata("design:type", Object),
@@ -3410,6 +3555,18 @@ var DatatableComponent = /** @class */ (function () {
3410
3555
  core_1.Input(),
3411
3556
  __metadata("design:type", Boolean)
3412
3557
  ], DatatableComponent.prototype, "virtualization", void 0);
3558
+ __decorate([
3559
+ core_1.Input(),
3560
+ __metadata("design:type", Boolean)
3561
+ ], DatatableComponent.prototype, "summaryRow", void 0);
3562
+ __decorate([
3563
+ core_1.Input(),
3564
+ __metadata("design:type", Number)
3565
+ ], DatatableComponent.prototype, "summaryHeight", void 0);
3566
+ __decorate([
3567
+ core_1.Input(),
3568
+ __metadata("design:type", String)
3569
+ ], DatatableComponent.prototype, "summaryPosition", void 0);
3413
3570
  __decorate([
3414
3571
  core_1.Output(),
3415
3572
  __metadata("design:type", core_1.EventEmitter)
@@ -3527,7 +3684,7 @@ var DatatableComponent = /** @class */ (function () {
3527
3684
  DatatableComponent = __decorate([
3528
3685
  core_1.Component({
3529
3686
  selector: 'ngx-datatable',
3530
- template: "\n <div\n visibilityObserver\n (visible)=\"recalculate()\">\n <datatable-header\n *ngIf=\"headerHeight\"\n [sorts]=\"sorts\"\n [sortType]=\"sortType\"\n [scrollbarH]=\"scrollbarH\"\n [innerWidth]=\"_innerWidth\"\n [offsetX]=\"_offsetX | async\"\n [dealsWithGroup]=\"groupedRows\"\n [columns]=\"_internalColumns\"\n [headerHeight]=\"headerHeight\"\n [reorderable]=\"reorderable\"\n [sortAscendingIcon]=\"cssClasses.sortAscending\"\n [sortDescendingIcon]=\"cssClasses.sortDescending\"\n [allRowsSelected]=\"allRowsSelected\"\n [selectionType]=\"selectionType\"\n (sort)=\"onColumnSort($event)\"\n (resize)=\"onColumnResize($event)\"\n (reorder)=\"onColumnReorder($event)\"\n (select)=\"onHeaderSelect($event)\"\n (columnContextmenu)=\"onColumnContextmenu($event)\">\n </datatable-header>\n <datatable-body\n [groupRowsBy]=\"groupRowsBy\"\n [groupedRows]=\"groupedRows\"\n [rows]=\"_internalRows\"\n [groupExpansionDefault]=\"groupExpansionDefault\"\n [scrollbarV]=\"scrollbarV\"\n [scrollbarH]=\"scrollbarH\"\n [virtualization]=\"virtualization\"\n [loadingIndicator]=\"loadingIndicator\"\n [externalPaging]=\"externalPaging\"\n [rowHeight]=\"rowHeight\"\n [rowCount]=\"rowCount\"\n [offset]=\"offset\"\n [trackByProp]=\"trackByProp\"\n [columns]=\"_internalColumns\"\n [pageSize]=\"pageSize\"\n [offsetX]=\"_offsetX | async\"\n [rowDetail]=\"rowDetail\"\n [groupHeader]=\"groupHeader\"\n [selected]=\"selected\"\n [innerWidth]=\"_innerWidth\"\n [bodyHeight]=\"bodyHeight\"\n [selectionType]=\"selectionType\"\n [emptyMessage]=\"messages.emptyMessage\"\n [rowIdentity]=\"rowIdentity\"\n [rowClass]=\"rowClass\"\n [selectCheck]=\"selectCheck\"\n [displayCheck]=\"displayCheck\"\n (page)=\"onBodyPage($event)\"\n (activate)=\"activate.emit($event)\"\n (rowContextmenu)=\"onRowContextmenu($event)\"\n (select)=\"onBodySelect($event)\"\n (scroll)=\"onBodyScroll($event)\">\n </datatable-body>\n <datatable-footer\n *ngIf=\"footerHeight\"\n [rowCount]=\"rowCount\"\n [pageSize]=\"pageSize\"\n [offset]=\"offset\"\n [footerHeight]=\"footerHeight\"\n [footerTemplate]=\"footer\"\n [totalMessage]=\"messages.totalMessage\"\n [pagerLeftArrowIcon]=\"cssClasses.pagerLeftArrow\"\n [pagerRightArrowIcon]=\"cssClasses.pagerRightArrow\"\n [pagerPreviousIcon]=\"cssClasses.pagerPrevious\"\n [selectedCount]=\"selected.length\"\n [selectedMessage]=\"!!selectionType && messages.selectedMessage\"\n [pagerNextIcon]=\"cssClasses.pagerNext\"\n (page)=\"onFooterPage($event)\">\n </datatable-footer>\n </div>\n ",
3687
+ template: "\n <div\n visibilityObserver\n (visible)=\"recalculate()\">\n <datatable-header\n *ngIf=\"headerHeight\"\n [sorts]=\"sorts\"\n [sortType]=\"sortType\"\n [scrollbarH]=\"scrollbarH\"\n [innerWidth]=\"_innerWidth\"\n [offsetX]=\"_offsetX | async\"\n [dealsWithGroup]=\"groupedRows\"\n [columns]=\"_internalColumns\"\n [headerHeight]=\"headerHeight\"\n [reorderable]=\"reorderable\"\n [sortAscendingIcon]=\"cssClasses.sortAscending\"\n [sortDescendingIcon]=\"cssClasses.sortDescending\"\n [allRowsSelected]=\"allRowsSelected\"\n [selectionType]=\"selectionType\"\n (sort)=\"onColumnSort($event)\"\n (resize)=\"onColumnResize($event)\"\n (reorder)=\"onColumnReorder($event)\"\n (select)=\"onHeaderSelect($event)\"\n (columnContextmenu)=\"onColumnContextmenu($event)\">\n </datatable-header>\n <datatable-body\n [groupRowsBy]=\"groupRowsBy\"\n [groupedRows]=\"groupedRows\"\n [rows]=\"_internalRows\"\n [groupExpansionDefault]=\"groupExpansionDefault\"\n [scrollbarV]=\"scrollbarV\"\n [scrollbarH]=\"scrollbarH\"\n [virtualization]=\"virtualization\"\n [loadingIndicator]=\"loadingIndicator\"\n [externalPaging]=\"externalPaging\"\n [rowHeight]=\"rowHeight\"\n [rowCount]=\"rowCount\"\n [offset]=\"offset\"\n [trackByProp]=\"trackByProp\"\n [columns]=\"_internalColumns\"\n [pageSize]=\"pageSize\"\n [offsetX]=\"_offsetX | async\"\n [rowDetail]=\"rowDetail\"\n [groupHeader]=\"groupHeader\"\n [selected]=\"selected\"\n [innerWidth]=\"_innerWidth\"\n [bodyHeight]=\"bodyHeight\"\n [selectionType]=\"selectionType\"\n [emptyMessage]=\"messages.emptyMessage\"\n [rowIdentity]=\"rowIdentity\"\n [rowClass]=\"rowClass\"\n [selectCheck]=\"selectCheck\"\n [displayCheck]=\"displayCheck\"\n [summaryRow]=\"summaryRow\"\n [summaryHeight]=\"summaryHeight\"\n [summaryPosition]=\"summaryPosition\"\n (page)=\"onBodyPage($event)\"\n (activate)=\"activate.emit($event)\"\n (rowContextmenu)=\"onRowContextmenu($event)\"\n (select)=\"onBodySelect($event)\"\n (scroll)=\"onBodyScroll($event)\">\n </datatable-body>\n <datatable-footer\n *ngIf=\"footerHeight\"\n [rowCount]=\"rowCount\"\n [pageSize]=\"pageSize\"\n [offset]=\"offset\"\n [footerHeight]=\"footerHeight\"\n [footerTemplate]=\"footer\"\n [totalMessage]=\"messages.totalMessage\"\n [pagerLeftArrowIcon]=\"cssClasses.pagerLeftArrow\"\n [pagerRightArrowIcon]=\"cssClasses.pagerRightArrow\"\n [pagerPreviousIcon]=\"cssClasses.pagerPrevious\"\n [selectedCount]=\"selected.length\"\n [selectedMessage]=\"!!selectionType && messages.selectedMessage\"\n [pagerNextIcon]=\"cssClasses.pagerNext\"\n (page)=\"onFooterPage($event)\">\n </datatable-footer>\n </div>\n ",
3531
3688
  changeDetection: core_1.ChangeDetectionStrategy.OnPush,
3532
3689
  encapsulation: core_1.ViewEncapsulation.None,
3533
3690
  styles: [__webpack_require__("./src/components/datatable.component.scss")],
@@ -3914,7 +4071,7 @@ var DataTablePagerComponent = /** @class */ (function () {
3914
4071
  DataTablePagerComponent = __decorate([
3915
4072
  core_1.Component({
3916
4073
  selector: 'datatable-pager',
3917
- template: "\n <ul class=\"pager\">\n <li [class.disabled]=\"!canPrevious()\">\n <a\n href=\"javascript:void(0)\"\n (click)=\"selectPage(1)\">\n <i class=\"{{pagerPreviousIcon}}\"></i>\n </a>\n </li>\n <li [class.disabled]=\"!canPrevious()\">\n <a\n href=\"javascript:void(0)\"\n (click)=\"prevPage()\">\n <i class=\"{{pagerLeftArrowIcon}}\"></i>\n </a>\n </li>\n <li\n class=\"pages\"\n *ngFor=\"let pg of pages\"\n [class.active]=\"pg.number === page\">\n <a\n href=\"javascript:void(0)\"\n (click)=\"selectPage(pg.number)\">\n {{pg.text}}\n </a>\n </li>\n <li [class.disabled]=\"!canNext()\">\n <a\n href=\"javascript:void(0)\"\n (click)=\"nextPage()\">\n <i class=\"{{pagerRightArrowIcon}}\"></i>\n </a>\n </li>\n <li [class.disabled]=\"!canNext()\">\n <a\n href=\"javascript:void(0)\"\n (click)=\"selectPage(totalPages)\">\n <i class=\"{{pagerNextIcon}}\"></i>\n </a>\n </li>\n </ul>\n ",
4074
+ template: "\n <ul class=\"pager\">\n <li [class.disabled]=\"!canPrevious()\">\n <a\n role=\"button\"\n aria-label=\"go to first page\"\n href=\"javascript:void(0)\"\n (click)=\"selectPage(1)\">\n <i class=\"{{pagerPreviousIcon}}\"></i>\n </a>\n </li>\n <li [class.disabled]=\"!canPrevious()\">\n <a\n role=\"button\"\n aria-label=\"go to previous page\"\n href=\"javascript:void(0)\"\n (click)=\"prevPage()\">\n <i class=\"{{pagerLeftArrowIcon}}\"></i>\n </a>\n </li>\n <li\n role=\"button\"\n [attr.aria-label]=\"'page ' + pg.number\"\n class=\"pages\"\n *ngFor=\"let pg of pages\"\n [class.active]=\"pg.number === page\">\n <a\n href=\"javascript:void(0)\"\n (click)=\"selectPage(pg.number)\">\n {{pg.text}}\n </a>\n </li>\n <li [class.disabled]=\"!canNext()\">\n <a\n role=\"button\"\n aria-label=\"go to next page\"\n href=\"javascript:void(0)\"\n (click)=\"nextPage()\">\n <i class=\"{{pagerRightArrowIcon}}\"></i>\n </a>\n </li>\n <li [class.disabled]=\"!canNext()\">\n <a\n role=\"button\"\n aria-label=\"go to last page\"\n href=\"javascript:void(0)\"\n (click)=\"selectPage(totalPages)\">\n <i class=\"{{pagerNextIcon}}\"></i>\n </a>\n </li>\n </ul>\n ",
3918
4075
  host: {
3919
4076
  class: 'datatable-pager'
3920
4077
  },
@@ -3993,6 +4150,7 @@ var DataTableHeaderCellComponent = /** @class */ (function () {
3993
4150
  set: function (val) {
3994
4151
  this._sorts = val;
3995
4152
  this.sortDir = this.calcSortDir(val);
4153
+ this.cellContext.sortDir = this.sortDir;
3996
4154
  this.sortClass = this.calcSortClass(this.sortDir);
3997
4155
  this.cd.markForCheck();
3998
4156
  },
@@ -4190,7 +4348,7 @@ var DataTableHeaderCellComponent = /** @class */ (function () {
4190
4348
  DataTableHeaderCellComponent = __decorate([
4191
4349
  core_1.Component({
4192
4350
  selector: 'datatable-header-cell',
4193
- template: "\n <div>\n <label\n *ngIf=\"isCheckboxable\"\n class=\"datatable-checkbox\">\n <input\n type=\"checkbox\"\n [checked]=\"allRowsSelected\"\n (change)=\"select.emit(!allRowsSelected)\"\n />\n </label>\n <span\n *ngIf=\"!column.headerTemplate\"\n class=\"datatable-header-cell-wrapper\">\n <span\n class=\"datatable-header-cell-label draggable\"\n (click)=\"onSort()\"\n [innerHTML]=\"name\">\n </span>\n </span>\n <ng-template\n *ngIf=\"column.headerTemplate\"\n [ngTemplateOutlet]=\"column.headerTemplate\"\n [ngTemplateOutletContext]=\"cellContext\">\n </ng-template>\n <span\n (click)=\"onSort()\"\n [class]=\"sortClass\">\n </span>\n </div>\n ",
4351
+ template: "\n <div class=\"datatable-header-cell-template-wrap\">\n <label\n *ngIf=\"isCheckboxable\"\n class=\"datatable-checkbox\">\n <input\n type=\"checkbox\"\n [checked]=\"allRowsSelected\"\n (change)=\"select.emit(!allRowsSelected)\"\n />\n </label>\n <span\n *ngIf=\"!column.headerTemplate\"\n class=\"datatable-header-cell-wrapper\">\n <span\n class=\"datatable-header-cell-label draggable\"\n (click)=\"onSort()\"\n [innerHTML]=\"name\">\n </span>\n </span>\n <ng-template\n *ngIf=\"column.headerTemplate\"\n [ngTemplateOutlet]=\"column.headerTemplate\"\n [ngTemplateOutletContext]=\"cellContext\">\n </ng-template>\n <span\n (click)=\"onSort()\"\n [class]=\"sortClass\">\n </span>\n </div>\n ",
4194
4352
  host: {
4195
4353
  class: 'datatable-header-cell'
4196
4354
  },
@@ -4284,6 +4442,7 @@ var DataTableHeaderComponent = /** @class */ (function () {
4284
4442
  var colsByPin = utils_1.columnsByPin(val);
4285
4443
  this._columnsByPin = utils_1.columnsByPinArr(val);
4286
4444
  this._columnGroupWidths = utils_1.columnGroupWidths(colsByPin, val);
4445
+ this.setStylesByGroup();
4287
4446
  },
4288
4447
  enumerable: true,
4289
4448
  configurable: true
@@ -4724,7 +4883,8 @@ var NgxDatatableModule = /** @class */ (function () {
4724
4883
  components_1.DataTableColumnHeaderDirective,
4725
4884
  components_1.DataTableColumnCellDirective,
4726
4885
  components_1.DatatableFooterDirective,
4727
- components_1.DatatableGroupHeaderTemplateDirective
4886
+ components_1.DatatableGroupHeaderTemplateDirective,
4887
+ components_1.DataTableSummaryRowComponent,
4728
4888
  ],
4729
4889
  exports: [
4730
4890
  components_1.DatatableComponent,
@@ -5238,11 +5398,14 @@ var ResizeableDirective = /** @class */ (function () {
5238
5398
  }
5239
5399
  ResizeableDirective.prototype.ngAfterViewInit = function () {
5240
5400
  var renderer2 = this.renderer;
5401
+ var node = renderer2.createElement('span');
5241
5402
  if (this.resizeEnabled) {
5242
- var node = renderer2.createElement('span');
5243
5403
  renderer2.addClass(node, 'resize-handle');
5244
- renderer2.appendChild(this.element, node);
5245
5404
  }
5405
+ else {
5406
+ renderer2.addClass(node, 'resize-handle--not-resizable');
5407
+ }
5408
+ renderer2.appendChild(this.element, node);
5246
5409
  };
5247
5410
  ResizeableDirective.prototype.ngOnDestroy = function () {
5248
5411
  this._destroySubscription();
@@ -5416,9 +5579,9 @@ exports.VisibilityDirective = VisibilityDirective;
5416
5579
  /* WEBPACK VAR INJECTION */(function(global) {
5417
5580
  Object.defineProperty(exports, "__esModule", { value: true });
5418
5581
  /* tslint:disable:variable-name */
5419
- exports.MouseEvent = global.MouseEvent;
5420
- exports.KeyboardEvent = global.KeyboardEvent;
5421
- exports.Event = global.Event;
5582
+ exports.MouseEvent = (window || global).MouseEvent;
5583
+ exports.KeyboardEvent = (window || global).KeyboardEvent;
5584
+ exports.Event = (window || global).Event;
5422
5585
 
5423
5586
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__("./node_modules/webpack/buildin/global.js")))
5424
5587
 
@@ -5772,6 +5935,12 @@ function translateTemplates(templates) {
5772
5935
  if (temp.cellTemplate) {
5773
5936
  col.cellTemplate = temp.cellTemplate;
5774
5937
  }
5938
+ if (temp.summaryFunc) {
5939
+ col.summaryFunc = temp.summaryFunc;
5940
+ }
5941
+ if (temp.summaryTemplate) {
5942
+ col.summaryTemplate = temp.summaryTemplate;
5943
+ }
5775
5944
  result.push(col);
5776
5945
  }
5777
5946
  return result;
@@ -5967,16 +6136,6 @@ function columnsByPinArr(val) {
5967
6136
  return colsByPinArr;
5968
6137
  }
5969
6138
  exports.columnsByPinArr = columnsByPinArr;
5970
- function allColumnsByPinArr(val) {
5971
- var colsByPinArr = [];
5972
- var colsByPin = columnsByPin(val);
5973
- var colsTest = [];
5974
- colsByPinArr.push({ type: 'left', columns: colsByPin['left'] });
5975
- colsByPinArr.push({ type: 'center', columns: colsByPin['center'] });
5976
- colsByPinArr.push({ type: 'right', columns: colsByPin['right'] });
5977
- return colsByPinArr;
5978
- }
5979
- exports.allColumnsByPinArr = allColumnsByPinArr;
5980
6139
 
5981
6140
 
5982
6141
  /***/ }),
@@ -6135,7 +6294,7 @@ function scaleColumns(colsByGroup, maxWidth, totalFlexGrow) {
6135
6294
  var column = _a[_i];
6136
6295
  if (!column.canAutoResize) {
6137
6296
  maxWidth -= column.width;
6138
- totalFlexGrow -= column.flexGrow;
6297
+ totalFlexGrow -= column.flexGrow ? column.flexGrow : 0;
6139
6298
  }
6140
6299
  else {
6141
6300
  column.width = 0;