diff --git a/dist/dataGrid.js b/dist/dataGrid.js index d7ddb3f..2c58765 100644 --- a/dist/dataGrid.js +++ b/dist/dataGrid.js @@ -36,15 +36,16 @@ $scope.sortOptions = $scope._gridOptions.sort ? angular.copy($scope._gridOptions.sort) : {}; $scope.customFilters = $scope._gridOptions.customFilters ? angular.copy($scope._gridOptions.customFilters) : {}; $scope.urlSync = $scope._gridOptions.urlSync; + $scope.allFilters = []; + $scope.dropDownFilters = []; + $scope.$watchCollection('_gridOptions.data', function (newValue) { if (newValue && newValue.length > -1) { $scope.sortCache = {}; $scope.filtered = $scope._gridOptions.data.slice(); - $scope.filters.forEach(function (filter) { - if (filter.filterType === 'select') { - $scope[filter.model + 'Options'] = generateOptions($scope.filtered, filter.filterBy); - } + $scope.dropDownFilters.forEach(function (filter) { + $scope[filter.model + 'Options'] = generateOptions($scope.filtered, filter.filterBy); }); if ($scope.urlSync) { @@ -116,7 +117,7 @@ } //custom filters - $scope.filters.forEach(function (filter) { + $scope.allFilters.forEach(function (filter) { var urlName = filter.model, value = filter.isInScope ? $scope.$eval(urlName) : $scope.$parent.$eval(urlName); @@ -160,7 +161,7 @@ }); //custom filters - $scope.filters.forEach(function (filter) { + $scope.allFilters.forEach(function (filter) { var urlName = filter.model, value = customParams[urlName]; @@ -246,35 +247,41 @@ //TO REMOVE ? $scope._time = {}; - if ($scope.sortOptions.predicate && $scope.sortCache && $scope.sortCache.predicate === $scope.sortOptions.predicate - && $scope.sortCache.direction === $scope.sortOptions.direction) { + applyDropDownFilters(); + + /* if grid already sorted we need to use sort cache instead of the whole data array */ + if (isGridSorted()) { $scope.filtered = $scope.sortCache.data.slice(); sorted = true; - } else { - $scope.filtered = $scope._gridOptions.data.slice(); } $scope._time.copy = Date.now() - time; var time2 = Date.now(); - applyCustomFilters(); + filterData($scope.textAndDateFilters); $scope._time.filters = Date.now() - time2; var time3 = Date.now(); if ($scope.sortOptions.predicate && !sorted) { $scope.filtered = $filter('orderBy')($scope.filtered, $scope.sortOptions.predicate, $scope.sortOptions.direction === 'desc'); - $scope.sortCache = { - data: $scope.filtered.slice(), - predicate: $scope.sortOptions.predicate, - direction: $scope.sortOptions.direction - } + generateSortCache(); } $scope._time.sort = Date.now() - time3; $scope._time.all = Date.now() - time; $scope.paginationOptions.totalItems = $scope.filtered.length; } - function applyCustomFilters() { - $scope.filters.forEach(function (filter) { + function applyDropDownFilters() { + $scope.filtered = $scope._gridOptions.data.slice(); + filterData($scope.dropDownFilters); + /* needed to check if grid already sorted, restore sort and update sortCache */ + if (isGridSorted()) { + $scope.filtered = $filter('orderBy')($scope.filtered, $scope.sortOptions.predicate, $scope.sortOptions.direction === 'desc'); + generateSortCache(); + } + } + + function filterData(filters) { + filters.forEach(function (filter) { var predicate = filter.filterBy, urlName = filter.model, value = filter.isInScope ? $scope.$eval(urlName) : $scope.$parent.$eval(urlName), @@ -289,6 +296,19 @@ } }); } + + function isGridSorted() { + return $scope.sortOptions.predicate && $scope.sortCache && $scope.sortCache.predicate === $scope.sortOptions.predicate + && $scope.sortCache.direction === $scope.sortOptions.direction; + } + + function generateSortCache() { + $scope.sortCache = { + data: $scope.filtered.slice(), + predicate: $scope.sortOptions.predicate, + direction: $scope.sortOptions.direction + } + } }]) .directive('gridItem', ['$compile', function ($compile) { return { @@ -315,7 +335,9 @@ scope: true, controller: 'gridController', link: function ($scope, $element, attrs) { - var filters = [], + var allFilters = [], + textAndDateFilters = [], + dropDownFilters = [], directiveElement = $element.parent(), gridId = attrs.id, serverPagination = attrs.serverPagination === 'true'; @@ -362,16 +384,37 @@ //$compile(element)($scope); } //$compile(element)($scope); - filters.push({ + + allFilters.push({ model: urlName, isInScope: isInScope, filterBy: predicate, filterType: filterType, disableUrl: disableUrl }); + + if (filterType === 'select') { + dropDownFilters.push({ + model: urlName, + isInScope: isInScope, + filterBy: predicate, + filterType: filterType, + disableUrl: disableUrl + }); + } else { + textAndDateFilters.push({ + model: urlName, + isInScope: isInScope, + filterBy: predicate, + filterType: filterType, + disableUrl: disableUrl + }); + } }); - $scope.filters = filters; + $scope.allFilters = allFilters; + $scope.textAndDateFilters = textAndDateFilters; + $scope.dropDownFilters = dropDownFilters; } } }]) diff --git a/dist/dataGrid.min.js b/dist/dataGrid.min.js index a3a012d..0aa7d9d 100644 --- a/dist/dataGrid.min.js +++ b/dist/dataGrid.min.js @@ -1 +1 @@ -!function(){"use strict";function t(t,e){var i=[];if(t)return t.forEach(function(t){~i.indexOf(t[e])||i.push(t[e])}),i.map(function(t){return{text:t,value:t}})}angular.module("dataGrid",[]).filter("startFrom",function(){return function(t,e){return t?(e=+e,t.slice(e)):[]}}).controller("gridController",["$scope","$rootScope","$element","$filter","$location","filtersFactory",function(e,i,r,n,a,o){function s(){(e.urlSync||e.serverPagination)&&(e.serverPagination&&(clearTimeout(e.getDataTimeout),e.getDataTimeout=setTimeout(p,e.getDataDelay)),e.filtered&&l())}function c(t){var i,r=!1;i="page="+e.paginationOptions.currentPage,e.paginationOptions.itemsPerPage!==e.defaultsPaginationOptions.itemsPerPage&&(i+="&itemsPerPage="+e.paginationOptions.itemsPerPage),e.sortOptions.predicate&&(i+="&sort="+encodeURIComponent(e.sortOptions.predicate+"-"+e.sortOptions.direction)),e.filters.forEach(function(t){var n=t.model,a=t.isInScope?e.$eval(n):e.$parent.$eval(n);if(t.disableUrl)return void(r=!0);if(a){var o;if(a instanceof Date){if(isNaN(a.getTime()))return;o=a.getFullYear()+"-",o+=a.getMonth()<9?"0"+(a.getMonth()+1)+"-":a.getMonth()+1+"-",o+=a.getDate()<10?"0"+a.getDate():a.getDate(),a=o}i+="&"+encodeURIComponent(n)+"="+encodeURIComponent(a)}}),r&&d(),a.search(i),t&&e.$apply()}function l(){var t=a.search(),i={};if(Object.keys(t).forEach(function(e){"page"!==e&&"sort"!==e&&"itemsPerPage"!==e&&(i[e]=t[e])}),e.filters.forEach(function(t){var r=t.model,n=i[r];if(!t.disableUrl){if(~t.filterType.toLowerCase().indexOf("date"))return e.$parent.__evaltmp=n?new Date(n):null,void e.$parent.$eval(r+"=__evaltmp");"select"!==t.filterType||n||(n=""),n&&(t.isInScope?(e.__evaltmp=n,e.$eval(r+"=__evaltmp")):(e.$parent.__evaltmp=n,e.$parent.$eval(r+"=__evaltmp")))}}),e.paginationOptions.itemsPerPage=e.defaultsPaginationOptions.itemsPerPage,e.paginationOptions.currentPage=e.defaultsPaginationOptions.currentPage,t.itemsPerPage&&(e.paginationOptions.itemsPerPage=t.itemsPerPage),t.page&&(!e.serverPagination&&(t.page-1)*e.paginationOptions.itemsPerPage>e.filtered.length?e.paginationOptions.currentPage=1:e.paginationOptions.currentPage=t.page),t.sort){var r=t.sort.split("-");e.sortOptions.predicate=decodeURIComponent(r[0]),e.sortOptions.direction=decodeURIComponent(r[1])}e.serverPagination||d()}function p(){var t="",i=a.search();Object.keys(i).forEach(function(e){t+=e+"="+i[e]+"&"}),t=t.slice(0,-1),!t&&e.sortOptions.predicate?e.sort(e.sortOptions.predicate,!0):e._gridOptions.getData("?"+t,function(t,i){e.filtered=t,e.paginationOptions.totalItems=i})}function d(){var t=Date.now(),i=!1;e._time={},e.sortOptions.predicate&&e.sortCache&&e.sortCache.predicate===e.sortOptions.predicate&&e.sortCache.direction===e.sortOptions.direction?(e.filtered=e.sortCache.data.slice(),i=!0):e.filtered=e._gridOptions.data.slice(),e._time.copy=Date.now()-t;var r=Date.now();g(),e._time.filters=Date.now()-r;var a=Date.now();e.sortOptions.predicate&&!i&&(e.filtered=n("orderBy")(e.filtered,e.sortOptions.predicate,"desc"===e.sortOptions.direction),e.sortCache={data:e.filtered.slice(),predicate:e.sortOptions.predicate,direction:e.sortOptions.direction}),e._time.sort=Date.now()-a,e._time.all=Date.now()-t,e.paginationOptions.totalItems=e.filtered.length}function g(){e.filters.forEach(function(t){var i=t.filterBy,r=t.model,n=t.isInScope?e.$eval(r):e.$parent.$eval(r),a=t.filterType;if(e.customFilters[r])e.filtered=e.customFilters[r](e.filtered,n,i);else if(n&&a){var s=o.getFilterByType(a);s&&(e.filtered=s(e.filtered,n,i))}})}e._gridOptions=e.$eval(r.attr("grid-options")),e._gridActions=e.$eval(r.attr("grid-actions")),e.serverPagination="true"===r.attr("server-pagination"),e.getDataDelay=r.attr("get-delay")||350,e._gridActions||(e.$parent.$eval(r.attr("grid-actions")+"= {}"),e._gridActions=e.$parent.$eval(r.attr("grid-actions"))),e._gridOptions.grid=e,e.filtered=e._gridOptions.data.slice(),e.paginationOptions=e._gridOptions.pagination?angular.copy(e._gridOptions.pagination):{},e.defaultsPaginationOptions={itemsPerPage:e.paginationOptions.itemsPerPage,currentPage:e.paginationOptions.currentPage||1},e.paginationOptions=angular.copy(e.defaultsPaginationOptions),e.sortOptions=e._gridOptions.sort?angular.copy(e._gridOptions.sort):{},e.customFilters=e._gridOptions.customFilters?angular.copy(e._gridOptions.customFilters):{},e.urlSync=e._gridOptions.urlSync,e.$watchCollection("_gridOptions.data",function(i){i&&i.length>-1&&(e.sortCache={},e.filtered=e._gridOptions.data.slice(),e.filters.forEach(function(i){"select"===i.filterType&&(e[i.model+"Options"]=t(e.filtered,i.filterBy))}),e.urlSync?l():d())}),e.sort=function(t,i){if(!i){var r=e.sortOptions.predicate===t&&"desc"===e.sortOptions.direction?"asc":"desc";e.sortOptions.direction=r,e.sortOptions.predicate=t}e.paginationOptions.currentPage=1,e.reloadGrid(i)},e.filter=function(){e.paginationOptions.currentPage=1,e.reloadGrid()},e.$on("$locationChangeSuccess",function(){s()}),e.$on("$stateChangeSuccess",function(t,e){s()}),e.reloadGrid=function(t){e.urlSync||e.serverPagination?c(t):d(),i.$broadcast("gridReloaded")},e._gridActions.refresh=e.reloadGrid,e._gridActions.filter=e.filter,e._gridActions.sort=e.sort}]).directive("gridItem",["$compile",function(t){return{restrict:"EA",terminal:!0,scope:!1,link:function(e,i,r,n,a){e.serverPagination?i.attr("ng-repeat","item in filtered"):i.attr("ng-repeat","item in filtered | startFrom:(paginationOptions.currentPage-1)*paginationOptions.itemsPerPage | limitTo:paginationOptions.itemsPerPage track by $index"),i.removeAttr("grid-item");var o=i[0].outerHTML;i.replaceWith(t(o)(e))}}}]).directive("gridData",["$compile","$animate",function(e){return{restrict:"EA",scope:!0,controller:"gridController",link:function(i,r,n){var a=[],o=r.parent(),s=n.id,c="true"===n.serverPagination;i.serverPagination=c,angular.forEach(angular.element(o[0].querySelectorAll("[sortable]")),function(t){var r=angular.element(t),n=r.attr("sortable");r.attr("ng-class","{'sort-ascent' : sortOptions.predicate ==='"+n+"' && sortOptions.direction === 'asc', 'sort-descent' : sortOptions.predicate === '"+n+"' && sortOptions.direction === 'desc'}"),r.attr("ng-click","sort('"+n+"')"),e(r)(i)}),angular.forEach(document.querySelectorAll("[filter-by]"),function(e){var n=angular.element(e),o=n.attr("filter-by"),c=document.querySelectorAll("[grid-data]")[0],l=c.querySelectorAll('[filter-by="'+o+'"]').length>0,p=n.attr("filter-type")||"",d=n.attr("ng-model"),g=n.attr("disable-url");s&&n.attr("grid-id")&&s!=n.attr("grid-id")||("select"!==p||(i[d+"Options"]=t(i.$eval(r.attr("grid-options")+".data"),o)),!~p.indexOf("date")||n.attr("ng-focus")||n.attr("ng-blur")||(n.attr("ng-focus","filter('{"+d+" : this."+d+"}')"),n.attr("ng-blur","filter('{"+d+" : this."+d+"}')")),d||(d=o,n.attr("ng-model",o),n.attr("ng-change","filter()")),a.push({model:d,isInScope:l,filterBy:o,filterType:p,disableUrl:g}))}),i.filters=a}}}]).factory("filtersFactory",function(){function t(t,e,i){return t.filter(function(t){return!e||!t[i]||t[i]===e})}function e(t,e,i){return t.filter(function(t){return e&&t[i]?~(t[i]+"").toLowerCase().indexOf((e+"").toLowerCase()):!!t[i]})}function i(t,e,i){return e=new Date(e).getTime(),t.filter(function(t){return!e||!t[i]||t[i]<=e+86399999})}function r(t,e,i){return e=new Date(e).getTime(),t.filter(function(t){return!e||!t[i]||t[i]>=e})}return{getFilterByType:function(n){switch(n){case"select":return t;case"text":return e;case"dateTo":return i;case"dateFrom":return r;default:return null}}}})}(); \ No newline at end of file +!function(){"use strict";function t(t,e){var i=[];if(t)return t.forEach(function(t){~i.indexOf(t[e])||i.push(t[e])}),i.map(function(t){return{text:t,value:t}})}angular.module("dataGrid",[]).filter("startFrom",function(){return function(t,e){return t?(e=+e,t.slice(e)):[]}}).controller("gridController",["$scope","$rootScope","$element","$filter","$location","filtersFactory",function(e,i,r,n,o,a){function s(){(e.urlSync||e.serverPagination)&&(e.serverPagination&&(clearTimeout(e.getDataTimeout),e.getDataTimeout=setTimeout(p,e.getDataDelay)),e.filtered&&c())}function l(t){var i,r=!1;i="page="+e.paginationOptions.currentPage,e.paginationOptions.itemsPerPage!==e.defaultsPaginationOptions.itemsPerPage&&(i+="&itemsPerPage="+e.paginationOptions.itemsPerPage),e.sortOptions.predicate&&(i+="&sort="+encodeURIComponent(e.sortOptions.predicate+"-"+e.sortOptions.direction)),e.allFilters.forEach(function(t){var n=t.model,o=t.isInScope?e.$eval(n):e.$parent.$eval(n);if(t.disableUrl)return void(r=!0);if(o){var a;if(o instanceof Date){if(isNaN(o.getTime()))return;a=o.getFullYear()+"-",a+=o.getMonth()<9?"0"+(o.getMonth()+1)+"-":o.getMonth()+1+"-",a+=o.getDate()<10?"0"+o.getDate():o.getDate(),o=a}i+="&"+encodeURIComponent(n)+"="+encodeURIComponent(o)}}),r&&d(),o.search(i),t&&e.$apply()}function c(){var t=o.search(),i={};if(Object.keys(t).forEach(function(e){"page"!==e&&"sort"!==e&&"itemsPerPage"!==e&&(i[e]=t[e])}),e.allFilters.forEach(function(t){var r=t.model,n=i[r];if(!t.disableUrl){if(~t.filterType.toLowerCase().indexOf("date"))return e.$parent.__evaltmp=n?new Date(n):null,void e.$parent.$eval(r+"=__evaltmp");"select"!==t.filterType||n||(n=""),n&&(t.isInScope?(e.__evaltmp=n,e.$eval(r+"=__evaltmp")):(e.$parent.__evaltmp=n,e.$parent.$eval(r+"=__evaltmp")))}}),e.paginationOptions.itemsPerPage=e.defaultsPaginationOptions.itemsPerPage,e.paginationOptions.currentPage=e.defaultsPaginationOptions.currentPage,t.itemsPerPage&&(e.paginationOptions.itemsPerPage=t.itemsPerPage),t.page&&(!e.serverPagination&&(t.page-1)*e.paginationOptions.itemsPerPage>e.filtered.length?e.paginationOptions.currentPage=1:e.paginationOptions.currentPage=t.page),t.sort){var r=t.sort.split("-");e.sortOptions.predicate=decodeURIComponent(r[0]),e.sortOptions.direction=decodeURIComponent(r[1])}e.serverPagination||d()}function p(){var t="",i=o.search();Object.keys(i).forEach(function(e){t+=e+"="+i[e]+"&"}),t=t.slice(0,-1),!t&&e.sortOptions.predicate?e.sort(e.sortOptions.predicate,!0):e._gridOptions.getData("?"+t,function(t,i){e.filtered=t,e.paginationOptions.totalItems=i})}function d(){var t=Date.now(),i=!1;e._time={},g(),f()&&(e.filtered=e.sortCache.data.slice(),i=!0),e._time.copy=Date.now()-t;var r=Date.now();u(e.textAndDateFilters),e._time.filters=Date.now()-r;var o=Date.now();e.sortOptions.predicate&&!i&&(e.filtered=n("orderBy")(e.filtered,e.sortOptions.predicate,"desc"===e.sortOptions.direction),m()),e._time.sort=Date.now()-o,e._time.all=Date.now()-t,e.paginationOptions.totalItems=e.filtered.length}function g(){e.filtered=e._gridOptions.data.slice(),u(e.dropDownFilters),f()&&(e.filtered=n("orderBy")(e.filtered,e.sortOptions.predicate,"desc"===e.sortOptions.direction),m())}function u(t){t.forEach(function(t){var i=t.filterBy,r=t.model,n=t.isInScope?e.$eval(r):e.$parent.$eval(r),o=t.filterType;if(e.customFilters[r])e.filtered=e.customFilters[r](e.filtered,n,i);else if(n&&o){var s=a.getFilterByType(o);s&&(e.filtered=s(e.filtered,n,i))}})}function f(){return e.sortOptions.predicate&&e.sortCache&&e.sortCache.predicate===e.sortOptions.predicate&&e.sortCache.direction===e.sortOptions.direction}function m(){e.sortCache={data:e.filtered.slice(),predicate:e.sortOptions.predicate,direction:e.sortOptions.direction}}e._gridOptions=e.$eval(r.attr("grid-options")),e._gridActions=e.$eval(r.attr("grid-actions")),e.serverPagination="true"===r.attr("server-pagination"),e.getDataDelay=r.attr("get-delay")||350,e._gridActions||(e.$parent.$eval(r.attr("grid-actions")+"= {}"),e._gridActions=e.$parent.$eval(r.attr("grid-actions"))),e._gridOptions.grid=e,e.filtered=e._gridOptions.data.slice(),e.paginationOptions=e._gridOptions.pagination?angular.copy(e._gridOptions.pagination):{},e.defaultsPaginationOptions={itemsPerPage:e.paginationOptions.itemsPerPage,currentPage:e.paginationOptions.currentPage||1},e.paginationOptions=angular.copy(e.defaultsPaginationOptions),e.sortOptions=e._gridOptions.sort?angular.copy(e._gridOptions.sort):{},e.customFilters=e._gridOptions.customFilters?angular.copy(e._gridOptions.customFilters):{},e.urlSync=e._gridOptions.urlSync,e.allFilters=[],e.dropDownFilters=[],e.$watchCollection("_gridOptions.data",function(i){i&&i.length>-1&&(e.sortCache={},e.filtered=e._gridOptions.data.slice(),e.dropDownFilters.forEach(function(i){e[i.model+"Options"]=t(e.filtered,i.filterBy)}),e.urlSync?c():d())}),e.sort=function(t,i){if(!i){var r=e.sortOptions.predicate===t&&"desc"===e.sortOptions.direction?"asc":"desc";e.sortOptions.direction=r,e.sortOptions.predicate=t}e.paginationOptions.currentPage=1,e.reloadGrid(i)},e.filter=function(){e.paginationOptions.currentPage=1,e.reloadGrid()},e.$on("$locationChangeSuccess",function(){s()}),e.$on("$stateChangeSuccess",function(t,e){s()}),e.reloadGrid=function(t){e.urlSync||e.serverPagination?l(t):d(),i.$broadcast("gridReloaded")},e._gridActions.refresh=e.reloadGrid,e._gridActions.filter=e.filter,e._gridActions.sort=e.sort}]).directive("gridItem",["$compile",function(t){return{restrict:"EA",terminal:!0,scope:!1,link:function(e,i,r,n,o){e.serverPagination?i.attr("ng-repeat","item in filtered"):i.attr("ng-repeat","item in filtered | startFrom:(paginationOptions.currentPage-1)*paginationOptions.itemsPerPage | limitTo:paginationOptions.itemsPerPage track by $index"),i.removeAttr("grid-item");var a=i[0].outerHTML;i.replaceWith(t(a)(e))}}}]).directive("gridData",["$compile","$animate",function(e){return{restrict:"EA",scope:!0,controller:"gridController",link:function(i,r,n){var o=[],a=[],s=[],l=r.parent(),c=n.id,p="true"===n.serverPagination;i.serverPagination=p,angular.forEach(angular.element(l[0].querySelectorAll("[sortable]")),function(t){var r=angular.element(t),n=r.attr("sortable");r.attr("ng-class","{'sort-ascent' : sortOptions.predicate ==='"+n+"' && sortOptions.direction === 'asc', 'sort-descent' : sortOptions.predicate === '"+n+"' && sortOptions.direction === 'desc'}"),r.attr("ng-click","sort('"+n+"')"),e(r)(i)}),angular.forEach(document.querySelectorAll("[filter-by]"),function(e){var n=angular.element(e),l=n.attr("filter-by"),p=document.querySelectorAll("[grid-data]")[0],d=p.querySelectorAll('[filter-by="'+l+'"]').length>0,g=n.attr("filter-type")||"",u=n.attr("ng-model"),f=n.attr("disable-url");c&&n.attr("grid-id")&&c!=n.attr("grid-id")||("select"!==g||(i[u+"Options"]=t(i.$eval(r.attr("grid-options")+".data"),l)),!~g.indexOf("date")||n.attr("ng-focus")||n.attr("ng-blur")||(n.attr("ng-focus","filter('{"+u+" : this."+u+"}')"),n.attr("ng-blur","filter('{"+u+" : this."+u+"}')")),u||(u=l,n.attr("ng-model",l),n.attr("ng-change","filter()")),o.push({model:u,isInScope:d,filterBy:l,filterType:g,disableUrl:f}),"select"===g?s.push({model:u,isInScope:d,filterBy:l,filterType:g,disableUrl:f}):a.push({model:u,isInScope:d,filterBy:l,filterType:g,disableUrl:f}))}),i.allFilters=o,i.textAndDateFilters=a,i.dropDownFilters=s}}}]).factory("filtersFactory",function(){function t(t,e,i){return t.filter(function(t){return!e||!t[i]||t[i]===e})}function e(t,e,i){return t.filter(function(t){return e&&t[i]?~(t[i]+"").toLowerCase().indexOf((e+"").toLowerCase()):!!t[i]})}function i(t,e,i){return e=new Date(e).getTime(),t.filter(function(t){return!e||!t[i]||t[i]<=e+86399999})}function r(t,e,i){return e=new Date(e).getTime(),t.filter(function(t){return!e||!t[i]||t[i]>=e})}return{getFilterByType:function(n){switch(n){case"select":return t;case"text":return e;case"dateTo":return i;case"dateFrom":return r;default:return null}}}})}(); \ No newline at end of file diff --git a/src/js/dataGrid.js b/src/js/dataGrid.js index d7ddb3f..2c58765 100644 --- a/src/js/dataGrid.js +++ b/src/js/dataGrid.js @@ -36,15 +36,16 @@ $scope.sortOptions = $scope._gridOptions.sort ? angular.copy($scope._gridOptions.sort) : {}; $scope.customFilters = $scope._gridOptions.customFilters ? angular.copy($scope._gridOptions.customFilters) : {}; $scope.urlSync = $scope._gridOptions.urlSync; + $scope.allFilters = []; + $scope.dropDownFilters = []; + $scope.$watchCollection('_gridOptions.data', function (newValue) { if (newValue && newValue.length > -1) { $scope.sortCache = {}; $scope.filtered = $scope._gridOptions.data.slice(); - $scope.filters.forEach(function (filter) { - if (filter.filterType === 'select') { - $scope[filter.model + 'Options'] = generateOptions($scope.filtered, filter.filterBy); - } + $scope.dropDownFilters.forEach(function (filter) { + $scope[filter.model + 'Options'] = generateOptions($scope.filtered, filter.filterBy); }); if ($scope.urlSync) { @@ -116,7 +117,7 @@ } //custom filters - $scope.filters.forEach(function (filter) { + $scope.allFilters.forEach(function (filter) { var urlName = filter.model, value = filter.isInScope ? $scope.$eval(urlName) : $scope.$parent.$eval(urlName); @@ -160,7 +161,7 @@ }); //custom filters - $scope.filters.forEach(function (filter) { + $scope.allFilters.forEach(function (filter) { var urlName = filter.model, value = customParams[urlName]; @@ -246,35 +247,41 @@ //TO REMOVE ? $scope._time = {}; - if ($scope.sortOptions.predicate && $scope.sortCache && $scope.sortCache.predicate === $scope.sortOptions.predicate - && $scope.sortCache.direction === $scope.sortOptions.direction) { + applyDropDownFilters(); + + /* if grid already sorted we need to use sort cache instead of the whole data array */ + if (isGridSorted()) { $scope.filtered = $scope.sortCache.data.slice(); sorted = true; - } else { - $scope.filtered = $scope._gridOptions.data.slice(); } $scope._time.copy = Date.now() - time; var time2 = Date.now(); - applyCustomFilters(); + filterData($scope.textAndDateFilters); $scope._time.filters = Date.now() - time2; var time3 = Date.now(); if ($scope.sortOptions.predicate && !sorted) { $scope.filtered = $filter('orderBy')($scope.filtered, $scope.sortOptions.predicate, $scope.sortOptions.direction === 'desc'); - $scope.sortCache = { - data: $scope.filtered.slice(), - predicate: $scope.sortOptions.predicate, - direction: $scope.sortOptions.direction - } + generateSortCache(); } $scope._time.sort = Date.now() - time3; $scope._time.all = Date.now() - time; $scope.paginationOptions.totalItems = $scope.filtered.length; } - function applyCustomFilters() { - $scope.filters.forEach(function (filter) { + function applyDropDownFilters() { + $scope.filtered = $scope._gridOptions.data.slice(); + filterData($scope.dropDownFilters); + /* needed to check if grid already sorted, restore sort and update sortCache */ + if (isGridSorted()) { + $scope.filtered = $filter('orderBy')($scope.filtered, $scope.sortOptions.predicate, $scope.sortOptions.direction === 'desc'); + generateSortCache(); + } + } + + function filterData(filters) { + filters.forEach(function (filter) { var predicate = filter.filterBy, urlName = filter.model, value = filter.isInScope ? $scope.$eval(urlName) : $scope.$parent.$eval(urlName), @@ -289,6 +296,19 @@ } }); } + + function isGridSorted() { + return $scope.sortOptions.predicate && $scope.sortCache && $scope.sortCache.predicate === $scope.sortOptions.predicate + && $scope.sortCache.direction === $scope.sortOptions.direction; + } + + function generateSortCache() { + $scope.sortCache = { + data: $scope.filtered.slice(), + predicate: $scope.sortOptions.predicate, + direction: $scope.sortOptions.direction + } + } }]) .directive('gridItem', ['$compile', function ($compile) { return { @@ -315,7 +335,9 @@ scope: true, controller: 'gridController', link: function ($scope, $element, attrs) { - var filters = [], + var allFilters = [], + textAndDateFilters = [], + dropDownFilters = [], directiveElement = $element.parent(), gridId = attrs.id, serverPagination = attrs.serverPagination === 'true'; @@ -362,16 +384,37 @@ //$compile(element)($scope); } //$compile(element)($scope); - filters.push({ + + allFilters.push({ model: urlName, isInScope: isInScope, filterBy: predicate, filterType: filterType, disableUrl: disableUrl }); + + if (filterType === 'select') { + dropDownFilters.push({ + model: urlName, + isInScope: isInScope, + filterBy: predicate, + filterType: filterType, + disableUrl: disableUrl + }); + } else { + textAndDateFilters.push({ + model: urlName, + isInScope: isInScope, + filterBy: predicate, + filterType: filterType, + disableUrl: disableUrl + }); + } }); - $scope.filters = filters; + $scope.allFilters = allFilters; + $scope.textAndDateFilters = textAndDateFilters; + $scope.dropDownFilters = dropDownFilters; } } }])