I have few questions regarding server side filtering and grouping.Actually I would like to achieve grouping functionality using DevEX Data Grid,I am able to sort the data using $scope.model.foundset.sort(" dp0","asc ") but now as I know servoy provides this capablity of applying sort directly to database so I would like to know if its possible for us to create same functionality that would directly help us to fire the sql query for grouping from the angular component itself.Please find below example for sample code for sorting.
- Code: Select all
controller: function($scope, $element, $attrs) {
$scope.data=[];
$scope.isRefreshed=false;
$scope.isFirstTime=true;
$scope.isSortingFirstTime=true;
$scope.isSortingChanged=false;
$scope.isGroupByFirstTime=true;
$scope.prevSort='';
var startIndex='';
var endIndex='';
var groupByKey='';
var data=new DevExpress.data.CustomStore({
load:function(loadOptions){
var fs = $scope.model.foundset;
var deferred = new $.Deferred();
if(loadOptions.sort){
var sqlSortDirection = "asc";
var columnName=loadOptions.sort[0].selector;
if(loadOptions.sort[0].desc==false){
sqlSortDirection="asc";
}
else{
sqlSortDirection="desc";
}
fs.sortColumns=columnName+ " " +sqlSortDirection;
if($scope.prevSort!=fs.sortColumns){
$scope.isSortingChanged=true;
}
if($scope.isSortingFirstTime||$scope.isSortingChanged){
$scope.grid.beginCustomLoading();
fs.sort([{ name: columnName, direction: sqlSortDirection }]);
$scope.prevSort=fs.sortColumns;
fs.loadExtraRecordsAsync(0).then(function(){
var aa=fs.viewPort.rows;
deferred.resolve(fs.viewPort.rows);
// alert("Rows after sorting :"+fs.viewPort.rows.length);
$scope.isSortingFirstTime=false;
$scope.isSortingChanged=false;
$scope.grid.endCustomLoading();
return deferred.promise();
});
}
else{
if(loadOptions.skip==fs.viewPort.size-50){
startIndex=fs.viewPort.size;
$scope.data=[];
fs.sort([{ name: columnName, direction: sqlSortDirection }]);
fs.loadExtraRecordsAsync(100).then(function(){
endIndex =fs.viewPort.size;
for(var i=startIndex;i<endIndex;i++){
$scope.data.push(fs.viewPort.rows[i]);
}
deferred.resolve($scope.data);
alert("Rows after sorting :"+fs.viewPort.rows.length);
$scope.isSortingFirstTime=false;
return deferred.promise();
});
}
}
return deferred.promise();
}
else [color=#FF0000]if(loadOptions.group){
if($scope.isGroupByFirstTime){
groupByKey=loadOptions.group[0].selector;
loadOptions.group[0].isExpanded=true;
$scope.data = DevExpress.data.query(fs.viewPort.rows)
.groupBy(groupByKey)
.toArray();
$scope.isGroupByFirstTime=false;
}
deferred.resolve($scope.data);
return deferred.promise(); [/color]
}
else
{
startIndex=fs.viewPort.size;
if($scope.isFirstTime){
$scope.data=$scope.data.concat(fs.viewPort.rows);
}
else{
$scope.data=[];
}
if(!$scope.isRefreshed){
return fs.loadExtraRecordsAsync(100).then(function(){
endIndex =fs.viewPort.size;
for(var i=startIndex;i<endIndex;i++){
$scope.data.push(fs.viewPort.rows[i]);
}
if(loadOptions.group){
groupByKey=loadOptions.group[0].selector;
loadOptions.group[0].isExpanded=true;
$scope.data = DevExpress.data.query(fs.viewPort.rows)
.groupBy(groupByKey)
.toArray();
}
deferred.resolve($scope.data);
$scope.isFirstTime=false;
alert("Rows:"+fs.viewPort.rows.length);
return deferred.promise();
});
};
}
}
});}
In the above highlighted part we are trying to group at client side but now similar to sorting we would like to achieve that for grouping.We donot want to use handler to pass the parameter to the form.js and manage database call as it would make it less resuable,also the foundset returned from loadAllRecords() and that of $scope.model.foundset.viewPort.rows would be quite different thus it would be difficult to manage.