Files
aportil/themes/sources/dhtmlxGrid/codebase/ext/dhtmlxgrid_json.js

451 lines
11 KiB
JavaScript

/*
Product Name: dhtmlxSuite
Version: 5.2.0
Edition: Professional
License: content of this file is covered by DHTMLX Commercial or Enterprise license. Usage without proper license is prohibited. To obtain it contact sales@dhtmlx.com
Copyright UAB Dinamenta http://www.dhtmlx.com
*/
dhtmlXGridObject.prototype._process_json_row=function(r, data){
r._attrs=data;
for (var j = 0; j < r.childNodes.length; j++)r.childNodes[j]._attrs={
};
if (data.userdata)
for (var a in data.userdata)
this.setUserData(r.idd,a,data.userdata[a]);
data = this._c_order?this._swapColumns(data.data):data.data;
for (var i=0; i<data.length; i++)
if (typeof data[i] == "object" && data[i] != null){
r.childNodes[i]._attrs=data[i];
if (data[i].type) r.childNodes[i]._cellType=data[i].type;
data[i]=data[i].value;
}
this._fillRow(r, data);
return r;
};
dhtmlXGridObject.prototype._process_js_row=function(r, data){
r._attrs=data;
for (var j = 0; j < r.childNodes.length; j++)
r.childNodes[j]._attrs={};
if (data.userdata)
for (var a in data.userdata)
this.setUserData(r.idd,a,data.userdata[a]);
var arr = [];
for (var i=0; i<this.columnIds.length; i++){
arr[i] = data[this.columnIds[i]];
if (typeof arr[i] == "object" && arr[i] != null){
r.childNodes[i]._attrs=arr[i];
if (arr[i].type) r.childNodes[i]._cellType=arr[i].type;
arr[i]=arr[i].value;
}
if (!arr[i] && arr[i]!==0)
arr[i]="";
}
this._fillRow(r, arr);
return r;
};
dhtmlXGridObject.prototype.updateFromJSON = function(url, insert_new, del_missed, afterCall){
if (typeof insert_new == "undefined")
insert_new=true;
this._refresh_mode=[
true,
insert_new,
del_missed
];
this.load(url,afterCall,"json");
},
dhtmlXGridObject.prototype._refreshFromJSON = function(data){
if (this._f_rowsBuffer) this.filterBy(0,"");
reset = false;
if (window.eXcell_tree){
eXcell_tree.prototype.setValueX=eXcell_tree.prototype.setValue;
eXcell_tree.prototype.setValue=function(content){
var r=this.grid._h2.get[this.cell.parentNode.idd]
if (r && this.cell.parentNode.valTag){
this.setLabel(content);
} else
this.setValueX(content);
};
}
var tree = this.cellType._dhx_find("tree");
var pid = data.parent||0;
var del = {
};
if (this._refresh_mode[2]){
if (tree != -1)
this._h2.forEachChild(pid, function(obj){
del[obj.id]=true;
}, this);
else
this.forEachRow(function(id){
del[id]=true;
});
}
var rows = data.rows;
for (var i = 0; i < rows.length; i++){
var row = rows[i];
var id = row.id;
del[id]=false;
if (this.rowsAr[id] && this.rowsAr[id].tagName!="TR"){
if (this._h2)
this._h2.get[id].buff.data=row;
else
this.rowsBuffer[this.getRowIndex(id)].data=row;
this.rowsAr[id]=row;
} else if (this.rowsAr[id]){
this._process_json_row(this.rowsAr[id], row, -1);
this._postRowProcessing(this.rowsAr[id],true)
} else if (this._refresh_mode[1]){
var dadd={
idd: id,
data: row,
_parser: this._process_json_row,
_locator: this._get_json_data
};
var render_index = this.rowsBuffer.length;
if (this._refresh_mode[1]=="top"){
this.rowsBuffer.unshift(dadd);
render_index = 0;
} else
this.rowsBuffer.push(dadd);
if (this._h2){
reset=true;
(this._h2.add(id,pid)).buff=this.rowsBuffer[this.rowsBuffer.length-1];
}
this.rowsAr[id]=row;
row=this.render_row(render_index);
this._insertRowAt(row,render_index?-1:0)
}
}
if (this._refresh_mode[2])
for (id in del){
if (del[id]&&this.rowsAr[id])
this.deleteRow(id);
}
this._refresh_mode=null;
if (window.eXcell_tree)
eXcell_tree.prototype.setValue=eXcell_tree.prototype.setValueX;
if (reset) this._renderSort();
if (this._f_rowsBuffer) {
this._f_rowsBuffer = null;
this.filterByAll();
}
},
dhtmlXGridObject.prototype._process_js=function(data){
return this._process_json(data, "js");
}
dhtmlXGridObject.prototype._parseOptionsJson=function(json){
if (json.coll_options){
for (var key in json.coll_options){
var data = json.coll_options[key];
var ind = this.getColIndexById(key);
var combo;
if (this.cellType[ind] == "combo"){
var combo = this.getColumnCombo(ind);
combo.addOption(data);
}
else if (this.cellType[ind].indexOf("co")==0){
var combo=this.getCombo(ind);
for (var i=0; i<data.length; i++)
combo.put(data[i].value, data[i].label);
}
if (this._con_f_used && this._con_f_used[ind]){
var values = [];
for (var i=0; i<data.length; i++)
values.push(data[i].label || data[i].value);
this._con_f_used[ind]=values;
}
}
this._colls_loaded=true;
}
}
dhtmlXGridObject.prototype._parseHeadJson=function(json){
if (!json.head || !json.head.length) return;
var headCol = json.head;
var settings = json.settings;
var awidthmet = "setInitWidths";
var split = false;
if (settings && settings.colwidth == "%")
awidthmet="setInitWidthsP";
if (settings && settings.splitat == "%")
split=settings.splitat;
//drop existing grid here, to prevent loss of initialization parameters
if (this.hdr.rows.length > 0)
this.clearAll(true);
var sets = [
[],
[],
[],
[],
[],
[],
[],[],[]
];
var attrs = ["value", "width", "type", "align", "sort", "color", "format", "hidden", "id"];
var calls = ["", awidthmet, "setColTypes", "setColAlign", "setColSorting",
"setColumnColor", "", "", "setColumnIds"];
for (var i = 0; i < headCol.length; i++)
for (var j = 0; j < attrs.length; j++)
sets[j].push(headCol[i][attrs[j]]);
this.setHeader(sets[0]);
for (var i = 0; i < calls.length; i++)
if (calls[i])
this[calls[i]](sets[i].join(this.delim));
for (var i = 0; i < headCol.length; i++){
var options = headCol[i].options
if (headCol[i].options){
if (this.cellType[i] == "clist"){
this.registerCList(i, options);
} else {
var combo = this.getCombo(i);
for (var j = 0; j < options.length; j++)
combo.put(options[j].id, options[j].value);
}
} else {
if (sets[6][i])
if ((this.cellType[i].toLowerCase().indexOf("calendar")!=-1)||(this.fldSort[i] == "date"))
this.setDateFormat(sets[6][i]);
else
this.setNumberFormat(sets[6][i], i);
}
}
this.init();
var param=sets[7].join(this.delim);
//preserving state of hidden columns, if not specified directly
if (this.setColHidden && param.replace(/,/g,"")!="")
this.setColHidden(param);
if ((split)&&(this.splitAt))
this.splitAt(split);
};
dhtmlXGridObject.prototype._process_json=function(data, mode){
this._parsing=true;
try {
var data = data.responseText || data;
if (typeof data == "string"){
eval("dhtmlx.temp="+data+";");
data = dhtmlx.temp;
}
} catch(e){
dhx4.callEvent("onLoadXMLError", ["Incorrect JSON",
(data.xmlDoc||data),
this
]);
data = {rows:[]};
}
if (this._refresh_mode) return this._refreshFromJSON(data);
if (data.head)
this._parseHeadJson(data);
this._parseOptionsJson(data);
var cr = parseInt(data.pos||0);
var total = parseInt(data.total_count||0);
var reset = false;
if (total){
if (!this.rowsBuffer[total-1]){
if (this.rowsBuffer.length)
reset=true;
this.rowsBuffer[total-1]=null;
}
if (total<this.rowsBuffer.length){
this.rowsBuffer.splice(total, this.rowsBuffer.length - total);
reset = true;
}
}
var userdata = mode === "js" ? data.userdata : data;
for (var key in userdata){
if (mode === "js" || key!="rows")
this.setUserData("",key, userdata[key]);
}
if (mode == "js" && data.collections){
for (var colkey in data.collections){
var index = this.getColIndexById(colkey);
var colrecs = data.collections[colkey];
if (index !== window.undefined){
if (this.cellType[index] == "clist"){
colplaindata=[];
for (var j=0; j<colrecs.length; j++)
colplaindata.push(colrecs[j].label);
this.registerCList(index, colplaindata);
} else {
var combo = this.getCombo(index);
for (var j = 0; j < colrecs.length; j++)
combo.put(colrecs[j].value, colrecs[j].label);
}
}
}
}
if (this.isTreeGrid())
return this._process_tree_json(data, null, null, mode);
if (mode == "js"){
if (data.data)
data = data.data;
for (var i = 0; i < data.length; i++){
if (this.rowsBuffer[i+cr])
continue;
var row = data[i];
var id = row.id||(i+cr);
this.rowsBuffer[i+cr]={
idd: id,
data: row,
_parser: this._process_js_row,
_locator: this._get_js_data
};
this.rowsAr[id]=data[i];
}
} else {
for (var i = 0; i < data.rows.length; i++){
if (this.rowsBuffer[i+cr])
continue;
var id = data.rows[i].id;
this.rowsBuffer[i+cr]={
idd: id,
data: data.rows[i],
_parser: this._process_json_row,
_locator: this._get_json_data
};
this.rowsAr[id]=data.rows[i];
}
}
this.callEvent("onDataReady", []);
if (reset && this._srnd){
var h = this.objBox.scrollTop;
this._reset_view();
this.objBox.scrollTop = h;
} else {
this.render_dataset();
}
this._parsing=false;
}
dhtmlXGridObject.prototype._get_json_data=function(data, ind){
var obj = data.data[ind];
if (typeof obj == "object"){
return obj?obj.value:"";
} else
return obj;
};
dhtmlXGridObject.prototype._process_tree_json=function(data,top,pid,mode){
this._parsing=true;
var main=false;
if (!top){
this.render_row=this.render_row_tree;
main=true;
top=data;
pid=top.parent||0;
if (pid=="0") pid=0;
if (!this._h2) this._h2=this._createHierarchy();
if (this._fake) this._fake._h2=this._h2;
}
if (mode == "js"){
if (top.data && !pid)
data = top.data;
if (top.rows)
top = top.rows;
for (var i = 0; i < top.length; i++){
var id = top[i].id;
var row=this._h2.add(id,pid);
row.buff={ idd:id, data:top[i], _parser: this._process_js_row, _locator:this._get_js_data };
if (top[i].open)
row.state="minus";
this.rowsAr[id]=row.buff;
this._process_tree_json(top[i],top[i],id,mode);
}
} else {
if (top.rows) {
for (var i = 0; i < top.rows.length; i++){
var id = top.rows[i].id;
var row=this._h2.add(id,pid);
row.buff={ idd:id, data:top.rows[i], _parser: this._process_json_row, _locator:this._get_json_data };
if (top.rows[i].open)
row.state="minus";
this.rowsAr[id]=row.buff;
this._process_tree_json(top.rows[i],top.rows[i],id,mode);
}
}
}
if (main){
if (pid!=0) this._h2.change(pid,"state","minus")
this._updateTGRState(this._h2.get[pid]);
this._h2_to_buff();
this.callEvent("onDataReady", []);
if (pid!=0 && (this._srnd || this.pagingOn))
this._renderSort();
else
this.render_dataset();
if (this._slowParse===false){
this.forEachRow(function(id){
this.render_row_tree(0,id)
})
}
this._parsing=false;
if (pid!=0 && !this._srnd)
this.callEvent("onOpenEnd",[pid,1]);
}
}