$.extend($.fn.datagrid.defaults, {
rowHeight: null,
onBeforeFetch: function(page){},
onFetch: function(page, rows){}
});
var bufferview = $.extend({}, $.fn.datagrid.defaults.view, {
render: function(target, container, frozen){
var state = $.data(target, 'datagrid');
var opts = state.options;
var rows = this.rows || [];
if (!rows.length) {
return;
}
var fields = $(target).datagrid('getColumnFields', frozen);
if (frozen){
if (!(opts.rownumbers || (opts.frozenColumns && opts.frozenColumns.length))){
return;
}
}
var index = parseInt(opts.finder.getTr(target,'','last',(frozen?1:2)).attr('datagrid-row-index'))+1 || 0;
var table = ['
'];
for(var i=0; i');
table.push(this.renderRow.call(this, target, fields, frozen, index, rows[i]));
table.push('');
index++;
}
table.push('
');
$(container).append(table.join(''));
},
onBeforeRender: function(target){
var state = $.data(target, 'datagrid');
var opts = state.options;
var dc = state.dc;
var view = this;
this.renderedCount = 0;
this.rows = [];
dc.body1.add(dc.body2).empty();
init();
function init(){
opts.rowHeight = $(target).datagrid('getRowHeight');
// erase the onLoadSuccess event, make sure it can't be triggered
state.onLoadSuccess = opts.onLoadSuccess;
opts.onLoadSuccess = function(){};
setTimeout(function(){
dc.body2.unbind('.datagrid').bind('scroll.datagrid', function(e){
if (state.onLoadSuccess){
opts.onLoadSuccess = state.onLoadSuccess; // restore the onLoadSuccess event
state.onLoadSuccess = undefined;
}
if (view.scrollTimer){
clearTimeout(view.scrollTimer);
}
view.scrollTimer = setTimeout(function(){
scrolling.call(view);
}, 50);
});
dc.body2.triggerHandler('scroll.datagrid');
}, 0);
}
function scrolling(){
if (getDataHeight() < dc.body2.height() && view.renderedCount < state.data.total){
this.getRows.call(this, target, function(rows){
this.rows = rows;
this.populate.call(this, target);
dc.body2.triggerHandler('scroll.datagrid');
});
} else if (dc.body2.scrollTop() >= getDataHeight() - dc.body2.height()){
this.getRows.call(this, target, function(rows){
this.rows = rows;
this.populate.call(this, target);
});
}
}
function getDataHeight(){
// var h = 0;
// dc.body2.children('table.datagrid-btable').each(function(){
// h += $(this).outerHeight();
// });
// if (!h){
// h = view.renderedCount * opts.rowHeight;
// }
// return h;
return view.renderedCount * opts.rowHeight;
}
},
getRows: function(target, callback){
var state = $.data(target, 'datagrid');
var opts = state.options;
var page = Math.floor(this.renderedCount/opts.pageSize) + 1;
if (this.renderedCount >= state.data.total){return;}
if (opts.onBeforeFetch.call(target, page) == false){return}
// var rows = state.data.rows.slice(this.renderedCount, this.renderedCount+opts.pageSize);
var index = (page-1)*opts.pageSize;
var rows = state.data.rows.slice(index, index+opts.pageSize);
if (rows.length){
opts.onFetch.call(target, page, rows);
callback.call(this, rows);
} else {
var param = $.extend({}, opts.queryParams, {
page: Math.floor(this.renderedCount/opts.pageSize)+1,
rows: opts.pageSize
});
if (opts.sortName){
$.extend(param, {
sort: opts.sortName,
order: opts.sortOrder
});
}
if (opts.onBeforeLoad.call(target, param) == false){return;}
$(target).datagrid('loading');
var result = opts.loader.call(target, param, function(data){
$(target).datagrid('loaded');
var data = opts.loadFilter.call(target, data);
opts.onFetch.call(target, page, data.rows);
if (data.rows && data.rows.length){
state.data.rows = state.data.rows.concat(data.rows);
callback.call(opts.view, data.rows);
} else {
opts.onLoadSuccess.call(target, data);
}
}, function(){
$(target).datagrid('loaded');
opts.onLoadError.apply(target, arguments);
});
if (result == false){
$(target).datagrid('loaded');
if (!state.data.rows.length){
opts.onFetch.call(target, page, state.data.rows);
opts.onLoadSuccess.call(target, state.data);
}
}
}
},
populate: function(target){
var state = $.data(target, 'datagrid');
var opts = state.options;
var dc = state.dc;
if (this.rows.length){
this.renderedCount += this.rows.length;
this.render.call(this, target, dc.body2, false);
this.render.call(this, target, dc.body1, true);
opts.onLoadSuccess.call(target, {
total: state.data.total,
rows: this.rows
});
// for(var i=this.renderedCount-this.rows.length; i').appendTo('body');
var rowHeight = d.find('tr').outerHeight();
d.remove();
opts.rowHeight = rowHeight;
}
return opts.rowHeight;
}
});