diff --git a/README.md b/README.md index 7fbe4cc..dc2d9bc 100644 --- a/README.md +++ b/README.md @@ -56,13 +56,13 @@ docs coming soon, in the meantime, 'View Source' is your friend ;)! #### Include -You've got 5 different options to include this in your build depending on your setup. +You've got 4 different options to include this in your build depending on your setup. - `./release/dataTable.js` - A standalone file that was compiled with Babel (UMD) - `./release/dataTable.min.js` - A minified standalone file that was compiled with Babel (UMD) - `./release/dataTable.cjs.js` - A standalone file that was compiled with Babel (CommonJS) - `./release/dataTable.es6.js` - Raw ES6 Version. - + All distributions include babel helpers, so they do not have to be included separately. There is also the CSS too: diff --git a/bower.json b/bower.json index 679a219..a039bb0 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "angular-data-table", - "version": "0.7.0", + "version": "0.7.1", "homepage": "https://github.com/Swimlane/angular-data-table", "author": { "name": "Swimlane", diff --git a/config.js b/config.js index 961df0f..a60c69a 100644 --- a/config.js +++ b/config.js @@ -14,23 +14,72 @@ System.config({ }, map: { - "angular": "npm:angular@1.4.0", - "babel": "npm:babel-core@5.8.22", - "babel-runtime": "npm:babel-runtime@5.8.20", - "core-js": "npm:core-js@1.1.1", - "github:jspm/nodelibs-process@0.1.1": { - "process": "npm:process@0.10.1" + "angular": "npm:angular@1.5.0", + "babel": "npm:babel-core@5.8.38", + "babel-runtime": "npm:babel-runtime@5.8.38", + "core-js": "npm:core-js@1.2.7", + "lodash-es": "npm:lodash-es@4.16.4", + "github:jspm/nodelibs-assert@0.1.0": { + "assert": "npm:assert@1.4.1" }, - "npm:angular@1.4.0": { - "process": "github:jspm/nodelibs-process@0.1.1" + "github:jspm/nodelibs-buffer@0.1.0": { + "buffer": "npm:buffer@3.6.0" }, - "npm:babel-runtime@5.8.20": { - "process": "github:jspm/nodelibs-process@0.1.1" + "github:jspm/nodelibs-path@0.1.0": { + "path-browserify": "npm:path-browserify@0.0.0" }, - "npm:core-js@1.1.1": { + "github:jspm/nodelibs-process@0.1.2": { + "process": "npm:process@0.11.9" + }, + "github:jspm/nodelibs-util@0.1.0": { + "util": "npm:util@0.10.3" + }, + "github:jspm/nodelibs-vm@0.1.0": { + "vm-browserify": "npm:vm-browserify@0.0.4" + }, + "npm:angular@1.5.0": { + "process": "github:jspm/nodelibs-process@0.1.2" + }, + "npm:assert@1.4.1": { + "assert": "github:jspm/nodelibs-assert@0.1.0", + "buffer": "github:jspm/nodelibs-buffer@0.1.0", + "process": "github:jspm/nodelibs-process@0.1.2", + "util": "npm:util@0.10.3" + }, + "npm:babel-runtime@5.8.38": { + "process": "github:jspm/nodelibs-process@0.1.2" + }, + "npm:buffer@3.6.0": { + "base64-js": "npm:base64-js@0.0.8", + "child_process": "github:jspm/nodelibs-child_process@0.1.0", + "fs": "github:jspm/nodelibs-fs@0.1.2", + "ieee754": "npm:ieee754@1.1.8", + "isarray": "npm:isarray@1.0.0", + "process": "github:jspm/nodelibs-process@0.1.2" + }, + "npm:core-js@1.2.7": { "fs": "github:jspm/nodelibs-fs@0.1.2", - "process": "github:jspm/nodelibs-process@0.1.1", - "systemjs-json": "github:systemjs/plugin-json@0.1.0" + "path": "github:jspm/nodelibs-path@0.1.0", + "process": "github:jspm/nodelibs-process@0.1.2", + "systemjs-json": "github:systemjs/plugin-json@0.1.2" + }, + "npm:inherits@2.0.1": { + "util": "github:jspm/nodelibs-util@0.1.0" + }, + "npm:path-browserify@0.0.0": { + "process": "github:jspm/nodelibs-process@0.1.2" + }, + "npm:process@0.11.9": { + "assert": "github:jspm/nodelibs-assert@0.1.0", + "fs": "github:jspm/nodelibs-fs@0.1.2", + "vm": "github:jspm/nodelibs-vm@0.1.0" + }, + "npm:util@0.10.3": { + "inherits": "npm:inherits@2.0.1", + "process": "github:jspm/nodelibs-process@0.1.2" + }, + "npm:vm-browserify@0.0.4": { + "indexof": "npm:indexof@0.0.1" } } }); diff --git a/package.json b/package.json index 36f2548..e088ea5 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "angular-data-table", "title": "AngularJS Data-Table", "description": "A feature-rich but lightweight ES6 AngularJS Data Table crafted for large data sets!", - "version": "0.7.0", + "version": "0.7.1", "repository": { "type": "git", "url": "git@github.com:Swimlane/angular-data-table.git", @@ -21,10 +21,16 @@ "url": "http://opensource.org/licenses/mit-license.php" } ], + "scripts": { + "start": "node ./node_modules/gulp/bin/gulp.js watch serve", + "release": "node ./node_modules/gulp/bin/gulp.js release" + }, + "peerDependencies": { + "angular": "1.5.x" + }, "devDependencies": { - "angular": "^1.4.4", - "angular-mocks": "^1.4.3", - "babelify": "7.3.0", + "angular": "^1.5.0", + "angular-mocks": "^1.5.0", "babel-core": "^6.9.0", "babel-eslint": "^6.0.2", "babel-plugin-external-helpers": "^6.5.0", @@ -33,6 +39,7 @@ "babel-plugin-transform-es2015-modules-umd": "^6.8.0", "babel-preset-es2015": "^6.9.0", "babel-preset-stage-0": "^6.5.0", + "babelify": "7.3.0", "browser-sync": "^2.7.2", "chai-as-promised": "^5.3.0", "del": "^1.2.0", @@ -68,12 +75,12 @@ }, "jspm": { "dependencies": { - "angular": "npm:angular@^1.4.0" + "angular": "npm:angular@^1.5.0" }, "devDependencies": { - "babel": "npm:babel-core@^5.8.22", - "babel-runtime": "npm:babel-runtime@^5.6.4", - "core-js": "npm:core-js@^1.1.1" + "babel": "npm:babel-core@^5.8.24", + "babel-runtime": "npm:babel-runtime@^5.8.24", + "core-js": "npm:core-js@^1.1.4" } }, "babel": { diff --git a/release/dataTable.cjs.js b/release/dataTable.cjs.js index cb34ff8..0b7d82c 100644 --- a/release/dataTable.cjs.js +++ b/release/dataTable.cjs.js @@ -1,6 +1,6 @@ /** * angular-data-table - A feature-rich but lightweight ES6 AngularJS Data Table crafted for large data sets! - * @version v0.7.0 + * @version v0.7.1 * @link http://swimlane.com/ * @license */ @@ -957,7 +957,7 @@ var BodyController = function () { }, { key: "calculateDepth", value: function calculateDepth(row) { - var depth = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; + var depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var parentProp = this.treeColumn ? this.treeColumn.relationProp : this.groupColumn.prop; var prop = this.treeColumn.prop; @@ -1304,8 +1304,19 @@ function NextSortDirection(sortType, currentSort) { } var HeaderCellController = function () { - function HeaderCellController() { + HeaderCellController.$inject = ["$scope"]; + function HeaderCellController($scope) { _classCallCheck(this, HeaderCellController); + + this.$scope = $scope; + + if (this.$scope.$parent.$parent.$parent.$parent.dt) { + this.dt = this.$scope.$parent.$parent.$parent.$parent.dt; + } + + if (this.column.headerCheckbox) { + this.column.headerCheckboxCallback = this.rowSelected; + } } _createClass(HeaderCellController, [{ @@ -1365,9 +1376,14 @@ var HeaderCellController = function () { }); } }, { - key: "onCheckboxChange", - value: function onCheckboxChange() { - this.onCheckboxChanged(); + key: "rowSelected", + value: function rowSelected(dt) { + this.allRowsSelected = dt.selected && dt.rows.length === dt.selected.length; + } + }, { + key: "checkboxChangeCallback", + value: function checkboxChangeCallback() { + return this.isAllRowsSelected = this.column.allRowsSelected ? this.dt.selectAllRows() : this.dt.deselectAllRows(); } }]); @@ -1383,14 +1399,13 @@ function HeaderCellDirective($compile) { bindToController: { options: '=', column: '=', - onCheckboxChange: '&', onSort: '&', sortType: '=', onResize: '&', selected: '=' }, replace: true, - template: "
\n
\n \n \n \n \n
\n
", + template: "
\n
\n \n \n \n \n
\n
", compile: function compile() { return { pre: function pre($scope, $elm, $attrs, ctrl) { @@ -1476,11 +1491,6 @@ var HeaderController = function () { return styles; } - }, { - key: "onCheckboxChanged", - value: function onCheckboxChanged() { - this.onCheckboxChange(); - } }, { key: "onResized", value: function onResized(column, width) { @@ -1504,11 +1514,12 @@ function HeaderDirective($timeout) { options: '=', columns: '=', columnWidths: '=', + selectedRows: '=?', + allRows: '=', onSort: '&', - onResize: '&', - onCheckboxChange: '&' + onResize: '&' }, - template: "\n
\n\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
", + template: "\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
", replace: true, link: function link($scope, $elm, $attrs, ctrl) { @@ -2057,12 +2068,13 @@ var TableDefaults = { }; var DataTableController = function () { - DataTableController.$inject = ["$scope", "$filter", "$log", "$transclude"]; - function DataTableController($scope, $filter, $log, $transclude) { + DataTableController.$inject = ["$scope", "$filter", "$log", "$transclude", "$window"]; + function DataTableController($scope, $filter, $log, $transclude, $window) { var _this6 = this; _classCallCheck(this, DataTableController); + $window.dt = this; Object.assign(this, { $scope: $scope, $filter: $filter, @@ -2108,6 +2120,14 @@ var DataTableController = function () { if (this.options.selectable && this.options.multiSelect) { this.selected = this.selected || []; + + this.$scope.$watch('dt.selected', function (newVal, oldVal) { + angular.forEach(_this7.options.columns, function (column) { + if (column.headerCheckbox && angular.isFunction(column.headerCheckboxCallback)) { + column.headerCheckboxCallback(_this7); + } + }); + }, true); } } }, { @@ -2241,24 +2261,27 @@ var DataTableController = function () { this.options.internal.setYOffset(offsetY); } }, { - key: "onHeaderCheckboxChange", - value: function onHeaderCheckboxChange() { - if (this.rows) { - var matches = this.selected.length === this.rows.length; - this.selected.splice(0, this.selected.length); + key: "selectAllRows", + value: function selectAllRows() { + var _selected; - if (!matches) { - var _selected; + this.selected.splice(0, this.selected.length); - (_selected = this.selected).push.apply(_selected, _toConsumableArray(this.rows)); - } - } + (_selected = this.selected).push.apply(_selected, _toConsumableArray(this.rows)); + + return this.isAllRowsSelected(); + } + }, { + key: "deselectAllRows", + value: function deselectAllRows() { + this.selected.splice(0, this.selected.length); + + return this.isAllRowsSelected(); } }, { key: "isAllRowsSelected", value: function isAllRowsSelected() { - if (this.rows) return false; - return this.selected.length === this.rows.length; + return !this.rows || !this.selected ? false : this.selected.length === this.rows.length; } }, { key: "onResized", @@ -2331,7 +2354,7 @@ function DataTableDirective($window, $timeout, $parse) { id = ObjectId(); DataTableService.saveColumns(id, columns); - return "
\n \n \n \n \n \n \n
"; + return "
\n \n \n \n \n \n \n
"; }, compile: function compile(tElem, tAttrs) { return { diff --git a/release/dataTable.es6.js b/release/dataTable.es6.js index 3a3f3b9..be35fbf 100644 --- a/release/dataTable.es6.js +++ b/release/dataTable.es6.js @@ -1632,6 +1632,17 @@ function NextSortDirection(sortType, currentSort) { } class HeaderCellController{ + constructor($scope){ + this.$scope = $scope; + + if (this.$scope.$parent.$parent.$parent.$parent.dt) { + this.dt = this.$scope.$parent.$parent.$parent.$parent.dt; + } + + if (this.column.headerCheckbox) { + this.column.headerCheckboxCallback = this.rowSelected; + } + } /** * Calculates the styles for the header cell directive * @return {styles} @@ -1701,13 +1712,18 @@ class HeaderCellController{ }); } + rowSelected(dt){ + this.allRowsSelected = (dt.selected) && (dt.rows.length === dt.selected.length); + } + /** - * Invoked when the header cell directive checkbox was changed + * Invoked when the header cell directive checkbox is changed */ - onCheckboxChange(){ - this.onCheckboxChanged(); + checkboxChangeCallback(){ + return this.isAllRowsSelected = this.column.allRowsSelected ? + this.dt.selectAllRows() : + this.dt.deselectAllRows(); } - } function HeaderCellDirective($compile){ @@ -1719,7 +1735,6 @@ function HeaderCellDirective($compile){ bindToController: { options: '=', column: '=', - onCheckboxChange: '&', onSort: '&', sortType: '=', onResize: '&', @@ -1739,8 +1754,8 @@ function HeaderCellDirective($compile){ max-width="hcell.column.maxWidth"> @@ -1779,7 +1794,6 @@ function HeaderCellDirective($compile){ } class HeaderController { - /** * Returns the styles for the header directive. * @param {object} scope @@ -1849,14 +1863,6 @@ class HeaderController { return styles; } - /** - * Invoked when the header cell directive's checkbox has changed. - * @param {scope} - */ - onCheckboxChanged(){ - this.onCheckboxChange(); - } - /** * Occurs when a header cell directive triggered a resize * @param {object} scope @@ -1869,7 +1875,6 @@ class HeaderController { width: width }); } - } function HeaderDirective($timeout){ @@ -1882,13 +1887,13 @@ function HeaderDirective($timeout){ options: '=', columns: '=', columnWidths: '=', + selectedRows: '=?', + allRows: '=', onSort: '&', - onResize: '&', - onCheckboxChange: '&' + onResize: '&' }, template: `
-
@@ -2640,7 +2644,7 @@ class DataTableController { * @param {filter} */ /*@ngInject*/ - constructor($scope, $filter, $log, $transclude){ + constructor($scope, $filter, $log, $transclude, $window){$window.dt = this; Object.assign(this, { $scope: $scope, $filter: $filter, @@ -2688,6 +2692,14 @@ class DataTableController { if(this.options.selectable && this.options.multiSelect){ this.selected = this.selected || []; + + this.$scope.$watch('dt.selected', (newVal, oldVal) => { + angular.forEach(this.options.columns, (column) => { + if (column.headerCheckbox && angular.isFunction(column.headerCheckboxCallback)) { + column.headerCheckboxCallback(this); + } + }); + }, true); } } @@ -2857,18 +2869,18 @@ class DataTableController { this.options.internal.setYOffset(offsetY); } - /** - * Invoked when the header checkbox directive has changed. - */ - onHeaderCheckboxChange(){ - if(this.rows){ - var matches = this.selected.length === this.rows.length; - this.selected.splice(0, this.selected.length); + selectAllRows(){ + this.selected.splice(0, this.selected.length); - if(!matches){ - this.selected.push(...this.rows); - } - } + this.selected.push(...this.rows); + + return this.isAllRowsSelected(); + } + + deselectAllRows(){ + this.selected.splice(0, this.selected.length); + + return this.isAllRowsSelected(); } /** @@ -2876,8 +2888,7 @@ class DataTableController { * @return {Boolean} if all selected */ isAllRowsSelected(){ - if(this.rows) return false; - return this.selected.length === this.rows.length; + return (!this.rows || !this.selected) ? false : this.selected.length === this.rows.length; } /** @@ -2933,7 +2944,6 @@ class DataTableController { row: row }); } - } function DataTableDirective($window, $timeout, $parse){ @@ -2965,12 +2975,12 @@ function DataTableDirective($window, $timeout, $parse){ return `
1 && arguments[1] !== undefined ? arguments[1] : 0; var parentProp = this.treeColumn ? this.treeColumn.relationProp : this.groupColumn.prop; var prop = this.treeColumn.prop; @@ -1345,8 +1345,19 @@ } var HeaderCellController = function () { - function HeaderCellController() { + HeaderCellController.$inject = ["$scope"]; + function HeaderCellController($scope) { _classCallCheck(this, HeaderCellController); + + this.$scope = $scope; + + if (this.$scope.$parent.$parent.$parent.$parent.dt) { + this.dt = this.$scope.$parent.$parent.$parent.$parent.dt; + } + + if (this.column.headerCheckbox) { + this.column.headerCheckboxCallback = this.rowSelected; + } } _createClass(HeaderCellController, [{ @@ -1406,9 +1417,14 @@ }); } }, { - key: "onCheckboxChange", - value: function onCheckboxChange() { - this.onCheckboxChanged(); + key: "rowSelected", + value: function rowSelected(dt) { + this.allRowsSelected = dt.selected && dt.rows.length === dt.selected.length; + } + }, { + key: "checkboxChangeCallback", + value: function checkboxChangeCallback() { + return this.isAllRowsSelected = this.column.allRowsSelected ? this.dt.selectAllRows() : this.dt.deselectAllRows(); } }]); @@ -1424,14 +1440,13 @@ bindToController: { options: '=', column: '=', - onCheckboxChange: '&', onSort: '&', sortType: '=', onResize: '&', selected: '=' }, replace: true, - template: "
\n
\n \n \n \n \n
\n
", + template: "
\n
\n \n \n \n \n
\n
", compile: function compile() { return { pre: function pre($scope, $elm, $attrs, ctrl) { @@ -1517,11 +1532,6 @@ return styles; } - }, { - key: "onCheckboxChanged", - value: function onCheckboxChanged() { - this.onCheckboxChange(); - } }, { key: "onResized", value: function onResized(column, width) { @@ -1545,11 +1555,12 @@ options: '=', columns: '=', columnWidths: '=', + selectedRows: '=?', + allRows: '=', onSort: '&', - onResize: '&', - onCheckboxChange: '&' + onResize: '&' }, - template: "\n
\n\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
", + template: "\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
", replace: true, link: function link($scope, $elm, $attrs, ctrl) { @@ -2098,12 +2109,13 @@ }; var DataTableController = function () { - DataTableController.$inject = ["$scope", "$filter", "$log", "$transclude"]; - function DataTableController($scope, $filter, $log, $transclude) { + DataTableController.$inject = ["$scope", "$filter", "$log", "$transclude", "$window"]; + function DataTableController($scope, $filter, $log, $transclude, $window) { var _this6 = this; _classCallCheck(this, DataTableController); + $window.dt = this; Object.assign(this, { $scope: $scope, $filter: $filter, @@ -2149,6 +2161,14 @@ if (this.options.selectable && this.options.multiSelect) { this.selected = this.selected || []; + + this.$scope.$watch('dt.selected', function (newVal, oldVal) { + angular.forEach(_this7.options.columns, function (column) { + if (column.headerCheckbox && angular.isFunction(column.headerCheckboxCallback)) { + column.headerCheckboxCallback(_this7); + } + }); + }, true); } } }, { @@ -2282,24 +2302,27 @@ this.options.internal.setYOffset(offsetY); } }, { - key: "onHeaderCheckboxChange", - value: function onHeaderCheckboxChange() { - if (this.rows) { - var matches = this.selected.length === this.rows.length; - this.selected.splice(0, this.selected.length); + key: "selectAllRows", + value: function selectAllRows() { + var _selected; - if (!matches) { - var _selected; + this.selected.splice(0, this.selected.length); - (_selected = this.selected).push.apply(_selected, _toConsumableArray(this.rows)); - } - } + (_selected = this.selected).push.apply(_selected, _toConsumableArray(this.rows)); + + return this.isAllRowsSelected(); + } + }, { + key: "deselectAllRows", + value: function deselectAllRows() { + this.selected.splice(0, this.selected.length); + + return this.isAllRowsSelected(); } }, { key: "isAllRowsSelected", value: function isAllRowsSelected() { - if (this.rows) return false; - return this.selected.length === this.rows.length; + return !this.rows || !this.selected ? false : this.selected.length === this.rows.length; } }, { key: "onResized", @@ -2372,7 +2395,7 @@ id = ObjectId(); DataTableService.saveColumns(id, columns); - return "
\n \n \n \n \n \n \n
"; + return "
\n \n \n \n \n \n \n
"; }, compile: function compile(tElem, tAttrs) { return { diff --git a/release/dataTable.min.js b/release/dataTable.min.js index a01c68b..2bd7b19 100644 --- a/release/dataTable.min.js +++ b/release/dataTable.min.js @@ -1,8 +1,8 @@ /** * angular-data-table - A feature-rich but lightweight ES6 AngularJS Data Table crafted for large data sets! - * @version v0.7.0 + * @version v0.7.1 * @link http://swimlane.com/ * @license */ -!function(e,t){if("function"==typeof define&&define.amd)define("DataTable",["exports"],t);else if("undefined"!=typeof exports)t(exports);else{var n={exports:{}};t(n.exports),e.DataTable=n.exports}}(this,function(e){"use strict";function t(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t\n
    \n
  • \n \n
  • \n
  • \n \n
  • \n
  • \n {{pg.text}}\n
  • \n
  • \n \n
  • \n
  • \n \n
  • \n
\n
',replace:!0}}function i(){return{restrict:"E",controller:B,controllerAs:"footer",scope:!0,bindToController:{paging:"=",onPage:"&"},template:'',replace:!0}}function r(e,t,n,o){return{restrict:"E",controller:G,scope:!0,controllerAs:"cell",bindToController:{options:"=",value:"=",selected:"=",column:"=",row:"=",expanded:"=",hasChildren:"=",onTreeToggle:"&",onCheckboxChange:"&"},template:'
\n \n \n \n
',replace:!0,compile:function(){return{pre:function(e,n,o,i){function r(){s=i.options.$outer.$new(!1),s.getValue=i.getValue}var s,l=angular.element(n[0].querySelector(".dt-cell-content"));(i.column.template||i.column.cellRenderer)&&r(),e.$watch("cell.row",function(){if(s&&(s.$destroy(),r(),s.$cell=i.value,s.$row=i.row,s.$column=i.column,s.$$watchers=null),i.column.template){l.empty();var e=angular.element(""+i.column.template.trim()+"");l.append(t(e)(s))}else if(i.column.cellRenderer){l.empty();var e=angular.element(i.column.cellRenderer(s,l));l.append(t(e)(s))}else l[0].innerHTML=i.getValue()},!0)}}}}}function s(e){return e=e.replace(/[^a-zA-Z0-9 ]/g," "),e=e.replace(/([a-z](?=[A-Z]))/g,"$1 "),e=e.replace(/([^a-zA-Z0-9 ])|^[0-9]+/g,"").trim().toLowerCase(),e=e.replace(/([ 0-9]+)([a-zA-Z])/g,function(e,t,n){return t.trim()+n.toUpperCase()})}function l(e){var t=s(e);return D[t]||(void 0!==H[M.css+e]?D[t]=M.css+e:void 0!==H[e]&&(D[t]=e)),D[t]}function a(e,t,n){V?!I&&j?(e[N]="translate3d("+t+"px, "+n+"px, 0)",e[O]="hidden"):e[s(N)]="translate("+t+"px, "+n+"px)":(e.top=n+"px",e.left=t+"px")}function c(){return{restrict:"E",controller:F,controllerAs:"group",bindToController:{row:"=",onGroupToggle:"&",expanded:"=",options:"="},scope:!0,replace:!0,template:'\n
\n \n \n \n \n
',link:function(e,t,n,o){a(t[0].style,0,o.row.$$index*o.options.rowHeight),o.options.internal.styleTranslator.register(e.$index,t)}}}function d(e,t){if(!e||!t)return e;var n=e,o=t.split(".");if(o.length)for(var i=0,r=o.length;r>i;i++)n=n[o[i]];return n}function u(){return{restrict:"E",controller:U,controllerAs:"rowCtrl",scope:!0,bindToController:{row:"=",columns:"=",columnWidths:"=",expanded:"=",selected:"=",hasChildren:"=",options:"=",onCheckboxChange:"&",onTreeToggle:"&"},link:function(e,t,n,o){o.row&&a(t[0].style,0,o.row.$$index*o.options.rowHeight),o.options.internal.styleTranslator.register(e.$index,t)},template:'\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
',replace:!0}}function h(){return{controller:q,restrict:"A",require:"^dtBody",controllerAs:"selCtrl"}}function p(e,t){return{restrict:"E",require:"^dtBody",transclude:!0,replace:!0,template:'
',link:function(e,t,n,o){function i(){o.options.internal.offsetY=l,o.options.internal.offsetX=a,o.updatePage(),o.options.scrollbarV&&o.getRows(),o.options.$outer.$digest(),s=!1}function r(){s||(Y(i),s=!0)}var s=!1,l=0,a=0,c=t.parent();o.options.internal.styleTranslator=new Z(o.options.rowHeight),o.options.internal.setYOffset=function(e){c[0].scrollTop=e},c.on("scroll",function(e){l=this.scrollTop,a=this.scrollLeft,r()}),e.$on("$destroy",function(){c.off("scroll")}),e.scrollerStyles=function(){return o.options.scrollbarV?{height:o.count*o.options.rowHeight+"px"}:void 0}}}}function g(e){return{restrict:"E",controller:_,controllerAs:"body",bindToController:{columns:"=",columnWidths:"=",rows:"=",options:"=",selected:"=?",expanded:"=?",onPage:"&",onTreeToggle:"&",onSelect:"&",onRowClick:"&",onRowDblClick:"&"},scope:!0,template:'\n
\n
\n
\n
\n
\n
\n \n \n \n \n \n \n
\n
\n
\n
\n
'}}function f(e,t){return"single"===e?"asc"===t?"desc":"asc":t?"asc"===t?"desc":void 0:"asc"}function m(e){return{restrict:"E",controller:K,controllerAs:"hcell",scope:!0,bindToController:{options:"=",column:"=",onCheckboxChange:"&",onSort:"&",sortType:"=",onResize:"&",selected:"="},replace:!0,template:'
\n
\n \n \n \n \n
\n
',compile:function(){return{pre:function(t,n,o,i){var r=n[0].querySelector(".dt-header-cell-label"),s=void 0;if((i.column.headerTemplate||i.column.headerRenderer)&&(s=i.options.$outer.$new(!1),s.$header=i.column.name,s.$index=t.$index),i.column.headerTemplate){var l=angular.element(""+i.column.headerTemplate.trim()+"");angular.element(r).append(e(l)(s))}else if(i.column.headerRenderer){var a=angular.element(i.column.headerRenderer(n));angular.element(r).append(e(a)(s)[0])}else{var c=i.column.name;void 0!==c&&null!==c||(c=""),r.textContent=c}}}}}}function v(e){return{restrict:"E",controller:J,controllerAs:"header",scope:!0,bindToController:{options:"=",columns:"=",columnWidths:"=",onSort:"&",onResize:"&",onCheckboxChange:"&"},template:'\n
\n\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
',replace:!0,link:function(t,n,o,i){t.columnsResorted=function(t,n){var o=r(n),s=angular.element(t.currentTarget),l=-1;angular.forEach(s.children(),function(e,t){n===angular.element(e).attr("data-id")&&(l=t)}),e(function(){angular.forEach(i.columns,function(e){var t=e.indexOf(o);if(t>-1){var n=e[l],r=i.options.columns.indexOf(n),s=i.options.columns.indexOf(o);return i.options.columns.splice(s,1),i.options.columns.splice(r,0,o),!1}})})};var r=function(e){var t=i.columns.left.concat(i.columns.center).concat(i.columns.right);return t.find(function(t){return t.$id===e})}}}}function w(e){return{restrict:"A",scope:{isSortable:"=sortable",onSortableSort:"&"},link:function(e,t,n){function o(e,t){if(e.parentNode==t.parentNode)for(var n=e;n;n=n.previousSibling)if(n===t)return!0;return!1}function i(e){var t=e.target;o(l,t)?t.parentNode.insertBefore(l,t):t.nextSibling&&t.hasAttribute("draggable")&&t.parentNode.insertBefore(l,t.nextSibling.nextSibling)}function r(n){n.preventDefault(),l.classList.remove("dt-clone"),t.off("dragend",r),t.off("dragenter",i),a!==l.nextSibling&&e.onSortableSort({event:n,columnId:angular.element(l).attr("data-id")})}function s(n){return e.isSortable?(n=n.originalEvent||n,l=n.target,a=l.nextSibling,l.classList.add("dt-clone"),n.dataTransfer.effectAllowed="move",n.dataTransfer.setData("Text",l.textContent),t.on("dragenter",i),void t.on("dragend",r)):!1}var l,a;t[0];t.on("dragstart",s),e.$on("$destroy",function(){t.off("dragstart",s)})}}}function y(e,t){return{restrict:"A",scope:{isResizable:"=resizable",minWidth:"=",maxWidth:"=",onResize:"&"},link:function(n,o,i){function r(e){e=e.originalEvent||e;var t=c[0].clientWidth,o=e.movementX||e.mozMovementX||e.screenX-l,i=t+(o||0);l=e.screenX,(!n.minWidth||i>=n.minWidth)&&(!n.maxWidth||i<=n.maxWidth)&&c.css({width:i+"px"})}function s(){n.onResize&&t(function(){var e=c[0].clientWidth;e'),c=o.parent();a.on("mousedown",function(t){return o[0].classList.contains("resizable")?(t.stopPropagation(),t.preventDefault(),e.on("mousemove",r),void e.on("mouseup",s)):!1}),o.append(a)}}}function b(e,t,n){var o,i,r,s=null,l=0;n||(n={});var a=function(){l=n.leading===!1?0:new Date,s=null,r=e.apply(o,i)};return function(){var c=new Date;l||n.leading!==!1||(l=c);var d=t-(c-l);return o=this,i=arguments,0>=d?(clearTimeout(s),s=null,l=c,r=e.apply(o,i)):s||n.trailing===!1||(s=setTimeout(a,d)),r}}function C(){var e=document.createElement("div");e.style.visibility="hidden",e.style.width="100px",e.style.msOverflowStyle="scrollbar",document.body.appendChild(e);var t=e.offsetWidth;e.style.overflow="scroll";var n=document.createElement("div");n.style.width="100%",e.appendChild(n);var o=n.offsetWidth;return e.parentNode.removeChild(e),t-o}function x(){var e=((new Date).getTime()/1e3|0).toString(16);return e+"xxxxxxxxxxxxxxxx".replace(/[x]/g,function(){return(16*Math.random()|0).toString(16)}).toLowerCase()}function k(e,t,n){angular.forEach(e,function(e){e.forEach(function(e){e.canAutoResize?e.width=0:(t-=e.width,n-=e.flexGrow)})});var o={},i=t,r=function(){var t=i/n;i=0,angular.forEach(e,function(e){e.forEach(function(e,n){if(e.canAutoResize&&!o[n]){var r=e.width+e.flexGrow*t;void 0!==e.minWidth&&rn;n++){var i=e[n];i.frozenLeft?t.left.push(i):i.frozenRight?t.right.push(i):t.center.push(i)}return t}function R(e){var t=0,n=!0,o=!1,i=void 0;try{for(var r,s=e[Symbol.iterator]();!(n=(r=s.next()).done);n=!0){var l=r.value;t+=l.flexGrow||0}}catch(a){o=!0,i=a}finally{try{!n&&s["return"]&&s["return"]()}finally{if(o)throw i}}return t}function T(e,t){var n=0;return e.forEach(function(e){var o=t&&e[t];n+=o?e[t]:e.width}),n}function P(e,t){var n=T(e),o=R(e),i=$(e);n!==t&&k(i,t,o)}function S(e,t,n){var o=0,i=n>-1?e.slice(n,e.length).filter(function(e){return e.canAutoResize}):e.filter(function(e){return e.canAutoResize});e.forEach(function(e){o+=e.canAutoResize?e.$$oldWidth||e.width:e.width});var r=t-o,s=r/i.length,l=o>t;i.forEach(function(e){if(l)e.width=e.$$oldWidth||e.width;else{e.$$oldWidth||(e.$$oldWidth=e.width);var t=e.$$oldWidth+s;e.minWith&&te.maxWidth?e.width=e.maxWidth:e.width=t}})}function z(e,t){return{left:T(e.left),center:T(e.center),right:T(e.right),total:T(t)}}function W(e,t,n){return{restrict:"E",replace:!0,controller:ne,scope:!0,bindToController:{options:"=",rows:"=",selected:"=?",expanded:"=?",onSelect:"&",onSort:"&",onTreeToggle:"&",onPage:"&",onRowClick:"&",onRowDblClick:"&",onColumnResize:"&"},controllerAs:"dt",template:function(e){var t=e[0].getElementsByTagName("column"),n=x();return Q.saveColumns(n,t),'
\n \n \n \n \n \n \n
'},compile:function(o,i){return{pre:function(o,i,r,s){function l(){var e=i[0].getBoundingClientRect();if(s.options.internal.innerWidth=Math.floor(e.width),s.options.scrollbarV){var t=e.height;s.options.headerHeight&&(t-=s.options.headerHeight),s.options.footerHeight&&(t-=s.options.footerHeight),s.options.internal.bodyHeight=t,s.calculatePageSize()}s.adjustColumns()}Q.buildColumns(o,n);var a=i.attr("data-column-id"),c=Q.columns[a];c&&(s.options.columns=c),s.transposeColumnDefaults(),s.options.internal.scrollBarWidth=C(),e.addEventListener("resize",b(function(){t(l)}));var d=function u(){var e=i[0].getBoundingClientRect(),n=e.width&&e.height;n?l():t(u,100)};d(),i.addClass("dt-loaded"),o.$on("$destroy",function(){angular.element(e).off("resize")})}}}}}W.$inject=["$window","$timeout","$parse"],y.$inject=["$document","$timeout"],w.$inject=["$timeout"],v.$inject=["$timeout"],m.$inject=["$compile"],g.$inject=["$timeout"],p.$inject=["$timeout","$rootScope"],r.$inject=["$rootScope","$compile","$log","$timeout"],Object.defineProperty(e,"__esModule",{value:!0});var E=function(){function e(e,t){for(var n=0;nn;n++)if(i(this[n],n,this)===!0)return"find"===e?this[n]:n;return"find"!==e?-1:void 0})}for(var t in{find:1,findIndex:1})e(t)}();var A=function(){function e(t){var o=this;n(this,e),t.$watch("pager.count",function(e){o.calcTotalPages(o.size,o.count),o.getPages(o.page||1)}),t.$watch("pager.size",function(e){o.calcTotalPages(o.size,o.count),o.getPages(o.page||1)}),t.$watch("pager.page",function(e){0!==e&&e<=o.totalPages&&o.getPages(e)}),this.getPages(this.page||1)}return e.$inject=["$scope"],E(e,[{key:"calcTotalPages",value:function(e,t){var t=1>e?1:Math.ceil(t/e);this.totalPages=Math.max(t||0,1)}},{key:"selectPage",value:function(e){e>0&&e<=this.totalPages&&(this.page=e,this.onPage({page:e}))}},{key:"prevPage",value:function(){this.page>1&&this.selectPage(--this.page)}},{key:"nextPage",value:function(){this.selectPage(++this.page)}},{key:"canPrevious",value:function(){return this.page>1}},{key:"canNext",value:function(){return this.page=s;s++)t.push({number:s,text:s,active:s===e});this.pages=t}}]),e}(),B=function(){function e(t){var o=this;n(this,e),this.page=this.paging.offset+1,t.$watch("footer.paging.offset",function(e){o.offsetChanged(e)})}return e.$inject=["$scope"],E(e,[{key:"offsetChanged",value:function(e){this.page=e+1}},{key:"onPaged",value:function(e){this.paging.offset=e-1,this.onPage({offset:this.paging.offset,size:this.paging.size})}}]),e}(),G=function(){function e(){n(this,e)}return E(e,[{key:"styles",value:function(){return{width:this.column.width+"px","min-width":this.column.width+"px"}}},{key:"cellClass",value:function(){var e={"dt-tree-col":this.column.isTreeColumn};return this.column.className&&(e[this.column.className]=!0),e}},{key:"treeClass",value:function(){return{"dt-tree-toggle":!0,"icon-right":!this.expanded,"icon-down":this.expanded}}},{key:"onTreeToggled",value:function(e){e.stopPropagation(),this.expanded=!this.expanded,this.onTreeToggle({cell:{value:this.value,column:this.column,expanded:this.expanded}})}},{key:"onCheckboxChanged",value:function(e){e.stopPropagation(),this.onCheckboxChange({$event:e})}},{key:"getValue",value:function(){var e=this.column.cellDataGetter?this.column.cellDataGetter(this.value):this.value;return void 0!==e&&null!==e||(e=""),e}}]),e}(),D={},H=document.createElement("div").style,M=function(){var e=window.getComputedStyle(document.documentElement,""),t=(Array.prototype.slice.call(e).join("").match(/-(moz|webkit|ms)-/)||""===e.OLink&&["","o"])[1],n="WebKit|Moz|MS|O".match(new RegExp("("+t+")","i"))[1];return{dom:n,lowercase:t,css:"-"+t+"-",js:t[0].toUpperCase()+t.substr(1)}}(),N=l("transform"),O=l("backfaceVisibility"),V=!!l("transform"),j=!!l("perspective"),L=window.navigator.userAgent,I=/Safari\//.test(L)&&!/Chrome\//.test(L),F=function(){function e(){n(this,e)}return E(e,[{key:"onGroupToggled",value:function(e){e.stopPropagation(),this.onGroupToggle({group:this.row})}},{key:"treeClass",value:function(){return{"dt-tree-toggle":!0,"icon-right":!this.expanded,"icon-down":this.expanded}}}]),e}(),U=function(){function e(){n(this,e)}return E(e,[{key:"getValue",value:function(e){return e.prop?d(this.row,e.prop):""}},{key:"onTreeToggled",value:function(e){this.onTreeToggle({cell:e,row:this.row})}},{key:"stylesByGroup",value:function(e){var t={width:this.columnWidths[e]+"px"};if("left"===e)a(t,this.options.internal.offsetX,0);else if("right"===e){var n=-1*(this.columnWidths.total-this.options.internal.innerWidth-this.options.internal.offsetX+this.options.internal.scrollBarWidth);a(t,n,0)}return t}},{key:"onCheckboxChanged",value:function(e){this.onCheckboxChange({$event:e,row:this.row})}}]),e}(),X={BACKSPACE:8,TAB:9,RETURN:13,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46,COMMA:188,PERIOD:190,A:65,Z:90,ZERO:48,NUMPAD_0:96,NUMPAD_9:105},q=function(){function e(t){n(this,e),this.body=t.body,this.options=t.body.options,this.selected=t.body.selected}return e.$inject=["$scope"],E(e,[{key:"keyDown",value:function(e,t,n){if(X[e.keyCode]&&e.preventDefault(),e.keyCode===X.DOWN){var o=e.target.nextElementSibling;o&&o.focus()}else if(e.keyCode===X.UP){var i=e.target.previousElementSibling;i&&i.focus()}else e.keyCode===X.RETURN&&this.selectRow(t,n)}},{key:"rowClicked",value:function(e,t,n){this.options.checkboxSelection||this.selectRow(e,t,n),this.body.onRowClick({row:n})}},{key:"rowDblClicked",value:function(e,t,n){this.options.checkboxSelection||(e.preventDefault(),this.selectRow(e,t,n)),this.body.onRowDblClick({row:n})}},{key:"onCheckboxChange",value:function(e,t,n){this.selectRow(e,t,n)}},{key:"selectRow",value:function(e,t,n){if(this.options.selectable)if(this.options.multiSelect){var o=(e.ctrlKey||e.metaKey,e.shiftKey);if(o)this.selectRowsBetween(t,n);else{var i=this.selected.indexOf(n);i>-1?this.selected.splice(i,1):(this.options.multiSelectOnShift&&1===this.selected.length&&this.selected.splice(0,1),this.selected.push(n),this.body.onSelect({rows:[n]}))}this.prevIndex=t}else this.selected=n,this.body.onSelect({rows:[n]})}},{key:"selectRowsBetween",value:function(e){for(var t=eo;o++){var r=this.body.rows[o],s=o>=this.prevIndex&&e>=o,l=o<=this.prevIndex&&o>=e,a={};if(a=t?{start:e,end:this.prevIndex-e}:{start:this.prevIndex,end:e+1},t&&l||!t&&s){var c=this.selected.indexOf(r);if(t&&c>-1){this.selected.splice(c,1);continue}o>=a.start&&ot)&&(i.getRows(),r=!0)}),t.$watch("body.options.paging.count",function(e){i.count=e,i.updatePage()}),t.$watch("body.options.paging.offset",function(e){i.options.paging.size&&i.onPage({offset:e,size:i.options.paging.size})})}}return e.$inject=["$scope","$timeout"],E(e,[{key:"rowsUpdated",value:function(e,n){if(e)if(this.options.paging.externalPaging||(this.options.paging.count=e.length),this.count=this.options.paging.count,(this.treeColumn||this.groupColumn)&&this.buildRowsByGroup(),this.options.scrollbarV){var o=e&&n&&(e.length===n.length||e.lengtho?Math.floor(o):o>n?Math.ceil(o):e,isNaN(o)||(this.options.paging.offset=o)}},{key:"calculateDepth",value:function(e){var t=arguments.length<=1||void 0===arguments[1]?0:arguments[1],n=this.treeColumn?this.treeColumn.relationProp:this.groupColumn.prop,o=this.treeColumn.prop;if(!e[n])return t;if(e.$$depth)return e.$$depth+t;var i=this.index[e[n]];if(i)return t+=1,this.calculateDepth(i,t);for(var r=0,s=this.rows.length;s>r;r++){var l=this.rows[r];if(l[o]==e[n])return t+=1,this.calculateDepth(l,t)}return t}},{key:"buildRowsByGroup",value:function(){this.index={},this.rowsByGroup={};for(var e=this.treeColumn?this.treeColumn.relationProp:this.groupColumn.prop,t=0,n=this.rows.length;n>t;t++){var o=this.rows[t],i=o[e];if(i&&(this.rowsByGroup[i]?this.rowsByGroup[i].push(o):this.rowsByGroup[i]=[o]),this.treeColumn){var r=this.treeColumn.prop;if(this.index[o[r]]=o,void 0===o[e])o.$$depth=0;else{var s=this.index[o[e]];if(void 0===s)for(var l=0;n>l;l++)if(this.rows[l][r]==i){s=this.rows[l]; -break}void 0===s.$$depth&&(s.$$depth=this.calculateDepth(s)),o.$$depth=s.$$depth+1,s.$$children?s.$$children.push(o[r]):s.$$children=[o[r]]}}}}},{key:"buildGroups",value:function(){var e=this,n=[];return angular.forEach(this.rowsByGroup,function(o,i){n.push({name:i,group:!0}),e.expanded[i]&&n.push.apply(n,t(o))}),n}},{key:"isSelected",value:function(e){var t=!1;return this.options.selectable&&(t=this.options.multiSelect?this.selected.indexOf(e)>-1:this.selected===e),t}},{key:"buildTree",value:function(){function e(t,o,i){t.forEach(function(t){var r=t[n.treeColumn.relationProp],s=t[n.treeColumn.prop],l=n.rowsByGroup[s],a=n.expanded[s];(i>0||!r)&&(o.push(t),l&&l.length>0&&a&&e(l,o,i+1))})}var t=[],n=this;return e(this.rows,t,0),t}},{key:"getRows",value:function(e){if((this.treeColumn||this.groupColumn)&&!this.rowsByGroup)return!1;var t;this.treeColumn?(t=this.treeTemp||[],!e&&this.treeTemp||(this.treeTemp=t=this.buildTree(),this.count=t.length,this.tempRows.splice(0,this.tempRows.length))):this.groupColumn?(t=this.groupsTemp||[],!e&&this.groupsTemp||(this.groupsTemp=t=this.buildGroups(),this.count=t.length)):(t=this.rows,e===!0&&this.tempRows.splice(0,this.tempRows.length));var n=0,o=this.getFirstLastIndexes(),i=o.first;for(this.tempRows.splice(0,o.last-o.first);ie;e++){var n=this.options.columns[e];n.$id=x(),angular.forEach(ee,function(e,t){n.hasOwnProperty(t)||(n[t]=e)}),n.name&&!n.prop&&(n.prop=s(n.name)),this.options.columns[e]=n}}},{key:"calculateColumns",value:function(){var e=this.options.columns;this.columnsByPin=$(e),this.columnWidths=z(this.columnsByPin,e)}},{key:"tableCss",value:function(){return{fixed:this.options.scrollbarV,selectable:this.options.selectable,checkboxable:this.options.checkboxSelection}}},{key:"adjustColumns",value:function(e){var t=this.options.internal.innerWidth-this.options.internal.scrollBarWidth;"force"===this.options.columnMode?S(this.options.columns,t,e):"flex"===this.options.columnMode&&P(this.options.columns,t)}},{key:"calculatePageSize",value:function(){this.options.paging.size=Math.ceil(this.options.internal.bodyHeight/this.options.rowHeight)+1}},{key:"onSorted",value:function(){if(this.rows){var e=this.options.columns.filter(function(e){return e.sort}).sort(function(e,t){if(e.sortPriority&&t.sortPriority){if(e.sortPriority>t.sortPriority)return 1;if(e.sortPriorityo;o++){var r=e[o];if(r.comparator!==!1){var s="asc"===r.sort?"":"-";void 0!==r.sortBy?n.push(s+r.sortBy):n.push(s+r.prop)}}if(n.length){var l,a=this.$filter("orderBy")(this.rows,n);this.rows.splice(0,this.rows.length),(l=this.rows).push.apply(l,t(a))}}this.options.internal.setYOffset(0)}}},{key:"onTreeToggled",value:function(e,t){this.onTreeToggle({row:e,cell:t})}},{key:"onBodyPage",value:function(e,t){this.onPage({offset:e,size:t})}},{key:"onFooterPage",value:function(e,t){var n=this.options.rowHeight*t,o=n*e;this.options.internal.setYOffset(o)}},{key:"onHeaderCheckboxChange",value:function(){if(this.rows){var e=this.selected.length===this.rows.length;if(this.selected.splice(0,this.selected.length),!e){var n;(n=this.selected).push.apply(n,t(this.rows))}}}},{key:"isAllRowsSelected",value:function(){return this.rows?!1:this.selected.length===this.rows.length}},{key:"onResized",value:function(e,t){var n=this.options.columns.indexOf(e);if(n>-1){var e=this.options.columns[n];e.width=t,e.canAutoResize=!1,this.adjustColumns(n),this.calculateColumns()}this.onColumnResize&&this.onColumnResize({column:e,width:t})}},{key:"onSelected",value:function(e){this.onSelect({rows:e})}},{key:"onRowClicked",value:function(e){this.onRowClick({row:e})}},{key:"onRowDblClicked",value:function(e){this.onRowDblClick({row:e})}}]),e}(),oe=angular.module("data-table",[]).directive("dtable",W).directive("resizable",y).directive("sortable",w).directive("dtHeader",v).directive("dtHeaderCell",m).directive("dtBody",g).directive("dtScroller",p).directive("dtSeletion",h).directive("dtRow",u).directive("dtGroupRow",c).directive("dtCell",r).directive("dtFooter",i).directive("dtPager",o);e["default"]=oe}); \ No newline at end of file +!function(e,t){if("function"==typeof define&&define.amd)define("DataTable",["exports"],t);else if("undefined"!=typeof exports)t(exports);else{var n={exports:{}};t(n.exports),e.DataTable=n.exports}}(this,function(e){"use strict";function t(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t\n
    \n
  • \n \n
  • \n
  • \n \n
  • \n
  • \n {{pg.text}}\n
  • \n
  • \n \n
  • \n
  • \n \n
  • \n
\n
',replace:!0}}function i(){return{restrict:"E",controller:B,controllerAs:"footer",scope:!0,bindToController:{paging:"=",onPage:"&"},template:'',replace:!0}}function r(e,t,n,o){return{restrict:"E",controller:G,scope:!0,controllerAs:"cell",bindToController:{options:"=",value:"=",selected:"=",column:"=",row:"=",expanded:"=",hasChildren:"=",onTreeToggle:"&",onCheckboxChange:"&"},template:'
\n \n \n \n
',replace:!0,compile:function(){return{pre:function(e,n,o,i){function r(){s=i.options.$outer.$new(!1),s.getValue=i.getValue}var s,l=angular.element(n[0].querySelector(".dt-cell-content"));(i.column.template||i.column.cellRenderer)&&r(),e.$watch("cell.row",function(){if(s&&(s.$destroy(),r(),s.$cell=i.value,s.$row=i.row,s.$column=i.column,s.$$watchers=null),i.column.template){l.empty();var e=angular.element(""+i.column.template.trim()+"");l.append(t(e)(s))}else if(i.column.cellRenderer){l.empty();var e=angular.element(i.column.cellRenderer(s,l));l.append(t(e)(s))}else l[0].innerHTML=i.getValue()},!0)}}}}}function s(e){return e=e.replace(/[^a-zA-Z0-9 ]/g," "),e=e.replace(/([a-z](?=[A-Z]))/g,"$1 "),e=e.replace(/([^a-zA-Z0-9 ])|^[0-9]+/g,"").trim().toLowerCase(),e=e.replace(/([ 0-9]+)([a-zA-Z])/g,function(e,t,n){return t.trim()+n.toUpperCase()})}function l(e){var t=s(e);return D[t]||(void 0!==H[M.css+e]?D[t]=M.css+e:void 0!==H[e]&&(D[t]=e)),D[t]}function a(e,t,n){V?!I&&j?(e[N]="translate3d("+t+"px, "+n+"px, 0)",e[O]="hidden"):e[s(N)]="translate("+t+"px, "+n+"px)":(e.top=n+"px",e.left=t+"px")}function c(){return{restrict:"E",controller:F,controllerAs:"group",bindToController:{row:"=",onGroupToggle:"&",expanded:"=",options:"="},scope:!0,replace:!0,template:'\n
\n \n \n \n \n
',link:function(e,t,n,o){a(t[0].style,0,o.row.$$index*o.options.rowHeight),o.options.internal.styleTranslator.register(e.$index,t)}}}function d(e,t){if(!e||!t)return e;var n=e,o=t.split(".");if(o.length)for(var i=0,r=o.length;i\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
',replace:!0}}function h(){return{controller:q,restrict:"A",require:"^dtBody",controllerAs:"selCtrl"}}function p(e,t){return{restrict:"E",require:"^dtBody",transclude:!0,replace:!0,template:'
',link:function(e,t,n,o){function i(){o.options.internal.offsetY=l,o.options.internal.offsetX=a,o.updatePage(),o.options.scrollbarV&&o.getRows(),o.options.$outer.$digest(),s=!1}function r(){s||(Y(i),s=!0)}var s=!1,l=0,a=0,c=t.parent();o.options.internal.styleTranslator=new Z(o.options.rowHeight),o.options.internal.setYOffset=function(e){c[0].scrollTop=e},c.on("scroll",function(e){l=this.scrollTop,a=this.scrollLeft,r()}),e.$on("$destroy",function(){c.off("scroll")}),e.scrollerStyles=function(){if(o.options.scrollbarV)return{height:o.count*o.options.rowHeight+"px"}}}}}function g(e){return{restrict:"E",controller:_,controllerAs:"body",bindToController:{columns:"=",columnWidths:"=",rows:"=",options:"=",selected:"=?",expanded:"=?",onPage:"&",onTreeToggle:"&",onSelect:"&",onRowClick:"&",onRowDblClick:"&"},scope:!0,template:'\n
\n
\n
\n
\n
\n
\n \n \n \n \n \n \n
\n
\n
\n
\n
'}}function f(e,t){return"single"===e?"asc"===t?"desc":"asc":t?"asc"===t?"desc":void 0:"asc"}function m(e){return{restrict:"E",controller:K,controllerAs:"hcell",scope:!0,bindToController:{options:"=",column:"=",onSort:"&",sortType:"=",onResize:"&",selected:"="},replace:!0,template:'
\n
\n \n \n \n \n
\n
',compile:function(){return{pre:function(t,n,o,i){var r=n[0].querySelector(".dt-header-cell-label"),s=void 0;if((i.column.headerTemplate||i.column.headerRenderer)&&(s=i.options.$outer.$new(!1),s.$header=i.column.name,s.$index=t.$index),i.column.headerTemplate){var l=angular.element(""+i.column.headerTemplate.trim()+"");angular.element(r).append(e(l)(s))}else if(i.column.headerRenderer){var a=angular.element(i.column.headerRenderer(n));angular.element(r).append(e(a)(s)[0])}else{var c=i.column.name;void 0!==c&&null!==c||(c=""),r.textContent=c}}}}}}function v(e){return{restrict:"E",controller:J,controllerAs:"header",scope:!0,bindToController:{options:"=",columns:"=",columnWidths:"=",selectedRows:"=?",allRows:"=",onSort:"&",onResize:"&"},template:'\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
',replace:!0,link:function(t,n,o,i){t.columnsResorted=function(t,n){var o=r(n),s=angular.element(t.currentTarget),l=-1;angular.forEach(s.children(),function(e,t){n===angular.element(e).attr("data-id")&&(l=t)}),e(function(){angular.forEach(i.columns,function(e){var t=e.indexOf(o);if(t>-1){var n=e[l],r=i.options.columns.indexOf(n),s=i.options.columns.indexOf(o);return i.options.columns.splice(s,1),i.options.columns.splice(r,0,o),!1}})})};var r=function(e){var t=i.columns.left.concat(i.columns.center).concat(i.columns.right);return t.find(function(t){return t.$id===e})}}}}function w(e){return{restrict:"A",scope:{isSortable:"=sortable",onSortableSort:"&"},link:function(e,t,n){function o(e,t){if(e.parentNode==t.parentNode)for(var n=e;n;n=n.previousSibling)if(n===t)return!0;return!1}function i(e){var t=e.target;o(l,t)?t.parentNode.insertBefore(l,t):t.nextSibling&&t.hasAttribute("draggable")&&t.parentNode.insertBefore(l,t.nextSibling.nextSibling)}function r(n){n.preventDefault(),l.classList.remove("dt-clone"),t.off("dragend",r),t.off("dragenter",i),a!==l.nextSibling&&e.onSortableSort({event:n,columnId:angular.element(l).attr("data-id")})}function s(n){return!!e.isSortable&&(n=n.originalEvent||n,l=n.target,a=l.nextSibling,l.classList.add("dt-clone"),n.dataTransfer.effectAllowed="move",n.dataTransfer.setData("Text",l.textContent),t.on("dragenter",i),void t.on("dragend",r))}var l,a;t[0];t.on("dragstart",s),e.$on("$destroy",function(){t.off("dragstart",s)})}}}function y(e,t){return{restrict:"A",scope:{isResizable:"=resizable",minWidth:"=",maxWidth:"=",onResize:"&"},link:function(n,o,i){function r(e){e=e.originalEvent||e;var t=c[0].clientWidth,o=e.movementX||e.mozMovementX||e.screenX-l,i=t+(o||0);l=e.screenX,(!n.minWidth||i>=n.minWidth)&&(!n.maxWidth||i<=n.maxWidth)&&c.css({width:i+"px"})}function s(){n.onResize&&t(function(){var e=c[0].clientWidth;e
'),c=o.parent();a.on("mousedown",function(t){return!!o[0].classList.contains("resizable")&&(t.stopPropagation(),t.preventDefault(),e.on("mousemove",r),void e.on("mouseup",s))}),o.append(a)}}}function b(e,t,n){var o,i,r,s=null,l=0;n||(n={});var a=function(){l=n.leading===!1?0:new Date,s=null,r=e.apply(o,i)};return function(){var c=new Date;l||n.leading!==!1||(l=c);var d=t-(c-l);return o=this,i=arguments,d<=0?(clearTimeout(s),s=null,l=c,r=e.apply(o,i)):s||n.trailing===!1||(s=setTimeout(a,d)),r}}function C(){var e=document.createElement("div");e.style.visibility="hidden",e.style.width="100px",e.style.msOverflowStyle="scrollbar",document.body.appendChild(e);var t=e.offsetWidth;e.style.overflow="scroll";var n=document.createElement("div");n.style.width="100%",e.appendChild(n);var o=n.offsetWidth;return e.parentNode.removeChild(e),t-o}function x(){var e=((new Date).getTime()/1e3|0).toString(16);return e+"xxxxxxxxxxxxxxxx".replace(/[x]/g,function(){return(16*Math.random()|0).toString(16)}).toLowerCase()}function k(e,t,n){angular.forEach(e,function(e){e.forEach(function(e){e.canAutoResize?e.width=0:(t-=e.width,n-=e.flexGrow)})});var o={},i=t,r=function(){var t=i/n;i=0,angular.forEach(e,function(e){e.forEach(function(e,n){if(e.canAutoResize&&!o[n]){var r=e.width+e.flexGrow*t;void 0!==e.minWidth&&r-1?e.slice(n,e.length).filter(function(e){return e.canAutoResize}):e.filter(function(e){return e.canAutoResize});e.forEach(function(e){o+=e.canAutoResize?e.$$oldWidth||e.width:e.width});var r=t-o,s=r/i.length,l=o>t;i.forEach(function(e){if(l)e.width=e.$$oldWidth||e.width;else{e.$$oldWidth||(e.$$oldWidth=e.width);var t=e.$$oldWidth+s;e.minWith&&te.maxWidth?e.width=e.maxWidth:e.width=t}})}function z(e,t){return{left:T(e.left),center:T(e.center),right:T(e.right),total:T(t)}}function E(e,t,n){return{restrict:"E",replace:!0,controller:ne,scope:!0,bindToController:{options:"=",rows:"=",selected:"=?",expanded:"=?",onSelect:"&",onSort:"&",onTreeToggle:"&",onPage:"&",onRowClick:"&",onRowDblClick:"&",onColumnResize:"&"},controllerAs:"dt",template:function(e){var t=e[0].getElementsByTagName("column"),n=x();return Q.saveColumns(n,t),'
\n \n \n \n \n \n \n
'},compile:function(o,i){return{pre:function(o,i,r,s){function l(){var e=i[0].getBoundingClientRect();if(s.options.internal.innerWidth=Math.floor(e.width),s.options.scrollbarV){var t=e.height;s.options.headerHeight&&(t-=s.options.headerHeight),s.options.footerHeight&&(t-=s.options.footerHeight),s.options.internal.bodyHeight=t,s.calculatePageSize()}s.adjustColumns()}Q.buildColumns(o,n);var a=i.attr("data-column-id"),c=Q.columns[a];c&&(s.options.columns=c),s.transposeColumnDefaults(),s.options.internal.scrollBarWidth=C(),e.addEventListener("resize",b(function(){t(l)}));var d=function u(){var e=i[0].getBoundingClientRect(),n=e.width&&e.height;n?l():t(u,100)};d(),i.addClass("dt-loaded"),o.$on("$destroy",function(){angular.element(e).off("resize")})}}}}}E.$inject=["$window","$timeout","$parse"],y.$inject=["$document","$timeout"],w.$inject=["$timeout"],v.$inject=["$timeout"],m.$inject=["$compile"],g.$inject=["$timeout"],p.$inject=["$timeout","$rootScope"],r.$inject=["$rootScope","$compile","$log","$timeout"],Object.defineProperty(e,"__esModule",{value:!0});var W=function(){function e(e,t){for(var n=0;n0&&e<=this.totalPages&&(this.page=e,this.onPage({page:e}))}},{key:"prevPage",value:function(){this.page>1&&this.selectPage(--this.page)}},{key:"nextPage",value:function(){this.selectPage(++this.page)}},{key:"canPrevious",value:function(){return this.page>1}},{key:"canNext",value:function(){return this.page-1?this.selected.splice(i,1):(this.options.multiSelectOnShift&&1===this.selected.length&&this.selected.splice(0,1),this.selected.push(n),this.body.onSelect({rows:[n]}))}this.prevIndex=t}else this.selected=n,this.body.onSelect({rows:[n]})}},{key:"selectRowsBetween",value:function(e){for(var t=e=this.prevIndex&&o<=e,l=o<=this.prevIndex&&o>=e,a={};if(a=t?{start:e,end:this.prevIndex-e}:{start:this.prevIndex,end:e+1},t&&l||!t&&s){var c=this.selected.indexOf(r);if(t&&c>-1){this.selected.splice(c,1);continue}o>=a.start&&ot)&&(i.getRows(),r=!0)}),t.$watch("body.options.paging.count",function(e){i.count=e,i.updatePage()}),t.$watch("body.options.paging.offset",function(e){i.options.paging.size&&i.onPage({offset:e,size:i.options.paging.size})})}}return e.$inject=["$scope","$timeout"],W(e,[{key:"rowsUpdated",value:function(e,n){if(e)if(this.options.paging.externalPaging||(this.options.paging.count=e.length),this.count=this.options.paging.count,(this.treeColumn||this.groupColumn)&&this.buildRowsByGroup(),this.options.scrollbarV){var o=e&&n&&(e.length===n.length||e.lengthn?Math.ceil(o):e,isNaN(o)||(this.options.paging.offset=o)}},{key:"calculateDepth",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=this.treeColumn?this.treeColumn.relationProp:this.groupColumn.prop,o=this.treeColumn.prop;if(!e[n])return t;if(e.$$depth)return e.$$depth+t;var i=this.index[e[n]];if(i)return t+=1,this.calculateDepth(i,t);for(var r=0,s=this.rows.length;r-1:this.selected===e),t}},{key:"buildTree",value:function(){function e(t,o,i){t.forEach(function(t){var r=t[n.treeColumn.relationProp],s=t[n.treeColumn.prop],l=n.rowsByGroup[s],a=n.expanded[s];(i>0||!r)&&(o.push(t),l&&l.length>0&&a&&e(l,o,i+1))})}var t=[],n=this;return e(this.rows,t,0),t}},{key:"getRows",value:function(e){if((this.treeColumn||this.groupColumn)&&!this.rowsByGroup)return!1;var t;this.treeColumn?(t=this.treeTemp||[],!e&&this.treeTemp||(this.treeTemp=t=this.buildTree(),this.count=t.length,this.tempRows.splice(0,this.tempRows.length))):this.groupColumn?(t=this.groupsTemp||[],!e&&this.groupsTemp||(this.groupsTemp=t=this.buildGroups(),this.count=t.length)):(t=this.rows,e===!0&&this.tempRows.splice(0,this.tempRows.length));var n=0,o=this.getFirstLastIndexes(),i=o.first;for(this.tempRows.splice(0,o.last-o.first);it.sortPriority)return 1;if(e.sortPriority-1){var e=this.options.columns[n];e.width=t,e.canAutoResize=!1,this.adjustColumns(n),this.calculateColumns()}this.onColumnResize&&this.onColumnResize({column:e,width:t})}},{key:"onSelected",value:function(e){this.onSelect({rows:e})}},{key:"onRowClicked",value:function(e){this.onRowClick({row:e})}},{key:"onRowDblClicked",value:function(e){this.onRowDblClick({row:e})}}]),e}(),oe=angular.module("data-table",[]).directive("dtable",E).directive("resizable",y).directive("sortable",w).directive("dtHeader",v).directive("dtHeaderCell",m).directive("dtBody",g).directive("dtScroller",p).directive("dtSeletion",h).directive("dtRow",u).directive("dtGroupRow",c).directive("dtCell",r).directive("dtFooter",i).directive("dtPager",o);e["default"]=oe}); \ No newline at end of file diff --git a/src/components/DataTableController.js b/src/components/DataTableController.js index 94b1d37..64296c5 100644 --- a/src/components/DataTableController.js +++ b/src/components/DataTableController.js @@ -11,7 +11,7 @@ export class DataTableController { * @param {filter} */ /*@ngInject*/ - constructor($scope, $filter, $log, $transclude){ + constructor($scope, $filter, $log, $transclude, $window){$window.dt = this; Object.assign(this, { $scope: $scope, $filter: $filter, @@ -59,6 +59,14 @@ export class DataTableController { if(this.options.selectable && this.options.multiSelect){ this.selected = this.selected || []; + + this.$scope.$watch('dt.selected', (newVal, oldVal) => { + angular.forEach(this.options.columns, (column) => { + if (column.headerCheckbox && angular.isFunction(column.headerCheckboxCallback)) { + column.headerCheckboxCallback(this); + } + }); + }, true); } } @@ -228,18 +236,18 @@ export class DataTableController { this.options.internal.setYOffset(offsetY); } - /** - * Invoked when the header checkbox directive has changed. - */ - onHeaderCheckboxChange(){ - if(this.rows){ - var matches = this.selected.length === this.rows.length; - this.selected.splice(0, this.selected.length); + selectAllRows(){ + this.selected.splice(0, this.selected.length); - if(!matches){ - this.selected.push(...this.rows); - } - } + this.selected.push(...this.rows); + + return this.isAllRowsSelected(); + } + + deselectAllRows(){ + this.selected.splice(0, this.selected.length); + + return this.isAllRowsSelected(); } /** @@ -247,8 +255,7 @@ export class DataTableController { * @return {Boolean} if all selected */ isAllRowsSelected(){ - if(this.rows) return false; - return this.selected.length === this.rows.length; + return (!this.rows || !this.selected) ? false : this.selected.length === this.rows.length; } /** @@ -304,5 +311,4 @@ export class DataTableController { row: row }); } - } diff --git a/src/components/DataTableDirective.js b/src/components/DataTableDirective.js index 521c303..3511de1 100644 --- a/src/components/DataTableDirective.js +++ b/src/components/DataTableDirective.js @@ -33,12 +33,12 @@ export function DataTableDirective($window, $timeout, $parse){ return `
diff --git a/src/components/header/HeaderController.js b/src/components/header/HeaderController.js index 36ea34b..a73e4a8 100644 --- a/src/components/header/HeaderController.js +++ b/src/components/header/HeaderController.js @@ -1,7 +1,6 @@ import { TranslateXY } from '../../utils/translate'; export class HeaderController { - /** * Returns the styles for the header directive. * @param {object} scope @@ -71,14 +70,6 @@ export class HeaderController { return styles; } - /** - * Invoked when the header cell directive's checkbox has changed. - * @param {scope} - */ - onCheckboxChanged(){ - this.onCheckboxChange(); - } - /** * Occurs when a header cell directive triggered a resize * @param {object} scope @@ -91,5 +82,4 @@ export class HeaderController { width: width }); } - }; diff --git a/src/components/header/HeaderDirective.js b/src/components/header/HeaderDirective.js index c7ea0ab..ac28eb9 100644 --- a/src/components/header/HeaderDirective.js +++ b/src/components/header/HeaderDirective.js @@ -11,13 +11,13 @@ export function HeaderDirective($timeout){ options: '=', columns: '=', columnWidths: '=', + selectedRows: '=?', + allRows: '=', onSort: '&', - onResize: '&', - onCheckboxChange: '&' + onResize: '&' }, template: `
-