2024-02-01 17:54:04 +08:00
|
|
|
var bricks = window.bricks || {};
|
|
|
|
bricks.BufferedDataLoader = class {
|
2023-09-14 10:28:07 +08:00
|
|
|
/*
|
|
|
|
{
|
|
|
|
url:
|
|
|
|
method:
|
|
|
|
params:
|
|
|
|
buffer_pages:
|
|
|
|
pagerows:
|
|
|
|
}
|
|
|
|
usage:
|
|
|
|
var p = Paging({...});
|
|
|
|
p.loadData(); // return page(1) data
|
|
|
|
p.getPage(5); // return page(5) data
|
|
|
|
p.nextPage()
|
|
|
|
p.previousPage()
|
|
|
|
*/
|
|
|
|
constructor(w, opts){
|
|
|
|
this.widget = w;
|
|
|
|
this.url = opts.url;
|
|
|
|
this.loading = false
|
|
|
|
this.method = opts.method || 'GET';
|
|
|
|
this.params = opts.params || {};
|
|
|
|
this.buffer_pages = opts.buffer_pages || 5;
|
|
|
|
this.pagerows = opts.pagerows || 60;
|
|
|
|
this.initial();
|
|
|
|
}
|
|
|
|
initial(){
|
|
|
|
this.cur_page = -1;
|
|
|
|
this.buffer = {};
|
|
|
|
this.buffered_pages = 0;
|
|
|
|
this.total_record = -1;
|
|
|
|
this.cur_params = {};
|
|
|
|
}
|
|
|
|
async loadData(params){
|
|
|
|
this.initial();
|
|
|
|
this.widget.clear_data();
|
|
|
|
this.buffer = {};
|
|
|
|
if (!params) params = {};
|
|
|
|
var p = objcopy(this.params);
|
2024-02-21 23:00:49 +08:00
|
|
|
bricks.extend(p, params);
|
2023-09-14 10:28:07 +08:00
|
|
|
p.rows = this.pagerows;
|
|
|
|
this.cur_params = p;
|
|
|
|
this.cur_page = 1;
|
|
|
|
return this.loadPage();
|
|
|
|
}
|
|
|
|
|
|
|
|
async loadPage(page){
|
|
|
|
if (this.loading) return;
|
|
|
|
this.loading = true;
|
|
|
|
if (this.buffered_pages >= this.buffer_pages){
|
|
|
|
this.widget.del_old_rows(this.pagerows, this.direction);
|
|
|
|
this.buffered_pages -= 1;
|
|
|
|
}
|
|
|
|
var params = objcopy(this.cur_params);
|
|
|
|
params.page = this.cur_page;
|
|
|
|
params.rows = this.pagerows;
|
2024-07-11 17:28:14 +08:00
|
|
|
var jc = new bricks.HttpJson();
|
|
|
|
var d = await jc.httpcall(this.url, {
|
2023-09-14 10:28:07 +08:00
|
|
|
method:this.method,
|
|
|
|
params:params});
|
|
|
|
this.total_records = d.total;
|
|
|
|
d.page = this.cur_page;
|
|
|
|
d.total_page = this.total_records / this.pagerows;
|
|
|
|
if (d.total_page * this.pagerows < this.total_record){
|
|
|
|
d.total_page += 1;
|
|
|
|
}
|
|
|
|
this.total_page = d.total_page;
|
|
|
|
this.widget.add_rows(d.rows, this.direction);
|
|
|
|
this.buffered_pages += 1;
|
|
|
|
this.loading = false;
|
|
|
|
return d;
|
|
|
|
}
|
|
|
|
|
|
|
|
async nextPage(){
|
|
|
|
if (this.loading) return;
|
|
|
|
if (this.cur_page >= this.total_page){
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
this.direction = 'down';
|
|
|
|
this.cur_page += 1;
|
|
|
|
return await this.loadPage();
|
|
|
|
}
|
|
|
|
async previousPage(){
|
|
|
|
if (this.loading) return;
|
|
|
|
if (this.cur_page <= 1){
|
|
|
|
return
|
|
|
|
}
|
|
|
|
this.direction = 'up';
|
|
|
|
this.cur_page -= 1;
|
|
|
|
return await this.loadPage();
|
|
|
|
}
|
|
|
|
}
|