blob: b497a799f252abfabe118d9648a561182db78943 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
define(function(require) {
'use strict';
var Backbone = require('backbone');
var XAGlobals = require('utils/XAGlobals');
var XAUtils = require('utils/XAUtils');
require('backbone-pageable');
var XABaseCollection = Backbone.PageableCollection.extend(
/** @lends XABaseCollection.prototype */
{
/**
* XABaseCollection's initialize function
* @augments Backbone.PageableCollection
* @constructs
*/
initialize : function() {
},
bindErrorEvents :function(){
this.bind("error", XAUtils.defaultErrorHandler);
},
/**
* state required for the PageableCollection
*/
state : {
firstPage: 0,
pageSize : XAGlobals.settings.PAGE_SIZE,
order : 1
},
mode : 'server',
/**
* queryParams required for the PageableCollection
* Server sends us this :
* pageSize: "2"
* resultSize: "2"
* startIndex: "0"
* totalCount: "15"
*/
queryParams: {
pageSize : 'pageSize',
sortKey : 'sortBy',
order : 'sortType',
totalRecords: 'totalCount',
startIndex : function(){
return this.state.currentPage * this.state.pageSize;
}
},
/**
* override the parseState of PageableCollection for our use
*/
parseState: function (resp, queryParams, state, options) {
if(!this.modelAttrName){
throw new Error("this.modelAttrName not defined for " + this);
}
var serverState = _.omit(resp,this.modelAttrName);
var newState = _.clone(state);
_.each(_.pairs(_.omit(queryParams, "directions")), function (kvp) {
var k = kvp[0], v = kvp[1];
var serverVal = serverState[v];
if (!_.isUndefined(serverVal) && !_.isNull(serverVal)){
if((k == 'pageSize') || (k == 'totalRecords')){
newState[k] = parseInt(serverState[v],10);
} else {
newState[k] = serverState[v];
}
}
});
if (serverState.sortType) {
newState.order = _.invert(queryParams.directions)[serverState.sortType] * 1;
}
var startIndex = parseInt(serverState.startIndex,10);
var totalCount = parseInt(serverState.totalCount,10);
var pageSize = parseInt(serverState.pageSize,10);
newState.pageSize = pageSize ? pageSize : state.pageSize;
newState.currentPage = startIndex === 0 ? 0 : Math.ceil(startIndex / newState.pageSize);
newState.startIndex = startIndex;
//newState.totalPages = totalCount === 0 ? 0 : Math.ceil(totalCount / serverState.pageSize);
return newState;
},
/**
* override the parseRecords of PageableCollection for our use
*/
parseRecords : function(resp, options){
if(!this.modelAttrName){
throw new Error("this.modelAttrName not defined for " + this);
}
return resp[this.modelAttrName];
}
}, {
//static functions
/**
* function to get table cols for backgrid, this function assumes that the
* collection has a static tableCols member.
*/
getTableCols : function(cols, collection){
var retCols = _.map(cols, function(v, k, l){
var defaults = collection.constructor.tableCols[k];
if(! defaults){
//console.log("Error!! " + k + " not found in collection: " , collection);
defaults = {};
}
return _.extend({ 'name' : k }, defaults, v );
});
return retCols;
},
nonCrudOperation : function(url, requestMethod, options){
return Backbone.sync.call(this, null, this, _.extend({
url: url,
type: requestMethod
}, options));
}
});
return XABaseCollection;
});