440 lines
14 KiB
JavaScript
440 lines
14 KiB
JavaScript
(function($){
|
|
/**
|
|
* jqGrid extension for custom methods
|
|
* Tony Tomov tony@trirand.com
|
|
* http://trirand.com/blog/
|
|
* Dual licensed under the MIT and GPL licenses:
|
|
* http://www.opensource.org/licenses/mit-license.php
|
|
* http://www.gnu.org/licenses/gpl-2.0.html
|
|
**/
|
|
/*global jQuery, $ */
|
|
|
|
$.jgrid.extend({
|
|
getColProp : function(colname){
|
|
var ret ={}, $t = this[0];
|
|
if ( !$t.grid ) { return false; }
|
|
var cM = $t.p.colModel;
|
|
for ( var i =0;i<cM.length;i++ ) {
|
|
if ( cM[i].name == colname ) {
|
|
ret = cM[i];
|
|
break;
|
|
}
|
|
}
|
|
return ret;
|
|
},
|
|
setColProp : function(colname, obj){
|
|
//do not set width will not work
|
|
return this.each(function(){
|
|
if ( this.grid ) {
|
|
if ( obj ) {
|
|
var cM = this.p.colModel;
|
|
for ( var i =0;i<cM.length;i++ ) {
|
|
if ( cM[i].name == colname ) {
|
|
$.extend(this.p.colModel[i],obj);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
},
|
|
sortGrid : function(colname,reload, sor){
|
|
return this.each(function(){
|
|
var $t=this,idx=-1;
|
|
if ( !$t.grid ) { return;}
|
|
if ( !colname ) { colname = $t.p.sortname; }
|
|
for ( var i=0;i<$t.p.colModel.length;i++ ) {
|
|
if ( $t.p.colModel[i].index == colname || $t.p.colModel[i].name==colname ) {
|
|
idx = i;
|
|
break;
|
|
}
|
|
}
|
|
if ( idx!=-1 ){
|
|
var sort = $t.p.colModel[idx].sortable;
|
|
if ( typeof sort !== 'boolean' ) { sort = true; }
|
|
if ( typeof reload !=='boolean' ) { reload = false; }
|
|
if ( sort ) { $t.sortData("jqgh_"+colname, idx, reload, sor); }
|
|
}
|
|
});
|
|
},
|
|
GridDestroy : function () {
|
|
return this.each(function(){
|
|
if ( this.grid ) {
|
|
if ( this.p.pager ) { // if not part of grid
|
|
$(this.p.pager).remove();
|
|
}
|
|
var gid = this.id;
|
|
try {
|
|
$("#gbox_"+gid).remove();
|
|
} catch (_) {}
|
|
}
|
|
});
|
|
},
|
|
GridUnload : function(){
|
|
return this.each(function(){
|
|
if ( !this.grid ) {return;}
|
|
var defgrid = {id: $(this).attr('id'),cl: $(this).attr('class')};
|
|
if (this.p.pager) {
|
|
$(this.p.pager).empty().removeClass("ui-state-default ui-jqgrid-pager corner-bottom");
|
|
}
|
|
var newtable = document.createElement('table');
|
|
$(newtable).attr({id:defgrid.id});
|
|
newtable.className = defgrid.cl;
|
|
var gid = this.id;
|
|
$(newtable).removeClass("ui-jqgrid-btable");
|
|
if( $(this.p.pager).parents("#gbox_"+gid).length === 1 ) {
|
|
$(newtable).insertBefore("#gbox_"+gid).show();
|
|
$(this.p.pager).insertBefore("#gbox_"+gid);
|
|
} else {
|
|
$(newtable).insertBefore("#gbox_"+gid).show();
|
|
}
|
|
$("#gbox_"+gid).remove();
|
|
});
|
|
},
|
|
setGridState : function(state) {
|
|
return this.each(function(){
|
|
if ( !this.grid ) {return;}
|
|
var $t = this;
|
|
if(state == 'hidden'){
|
|
$(".ui-jqgrid-bdiv, .ui-jqgrid-hdiv","#gview_"+$t.p.id).slideUp("fast");
|
|
if($t.p.pager) {$($t.p.pager).slideUp("fast");}
|
|
if($t.p.toppager) {$($t.p.toppager).slideUp("fast");}
|
|
if($t.p.toolbar[0]===true) {
|
|
if( $t.p.toolbar[1]=='both') {
|
|
$($t.grid.ubDiv).slideUp("fast");
|
|
}
|
|
$($t.grid.uDiv).slideUp("fast");
|
|
}
|
|
if($t.p.footerrow) { $(".ui-jqgrid-sdiv","#gbox_"+$t.p.id).slideUp("fast"); }
|
|
$(".ui-jqgrid-titlebar-close span",$t.grid.cDiv).removeClass("ui-icon-circle-triangle-n").addClass("ui-icon-circle-triangle-s");
|
|
$t.p.gridstate = 'hidden';
|
|
} else if(state=='visible') {
|
|
$(".ui-jqgrid-hdiv, .ui-jqgrid-bdiv","#gview_"+$t.p.id).slideDown("fast");
|
|
if($t.p.pager) {$($t.p.pager).slideDown("fast");}
|
|
if($t.p.toppager) {$($t.p.toppager).slideDown("fast");}
|
|
if($t.p.toolbar[0]===true) {
|
|
if( $t.p.toolbar[1]=='both') {
|
|
$($t.grid.ubDiv).slideDown("fast");
|
|
}
|
|
$($t.grid.uDiv).slideDown("fast");
|
|
}
|
|
if($t.p.footerrow) { $(".ui-jqgrid-sdiv","#gbox_"+$t.p.id).slideDown("fast"); }
|
|
$(".ui-jqgrid-titlebar-close span",$t.grid.cDiv).removeClass("ui-icon-circle-triangle-s").addClass("ui-icon-circle-triangle-n");
|
|
$t.p.gridstate = 'visible';
|
|
}
|
|
|
|
});
|
|
},
|
|
filterToolbar : function(p){
|
|
p = $.extend({
|
|
autosearch: true,
|
|
searchOnEnter : true,
|
|
beforeSearch: null,
|
|
afterSearch: null,
|
|
beforeClear: null,
|
|
afterClear: null,
|
|
searchurl : '',
|
|
stringResult: false,
|
|
groupOp: 'AND',
|
|
defaultSearch : "bw"
|
|
},p || {});
|
|
return this.each(function(){
|
|
var $t = this;
|
|
if(this.ftoolbar) { return; }
|
|
var triggerToolbar = function() {
|
|
var sdata={}, j=0, v, nm, sopt={},so;
|
|
$.each($t.p.colModel,function(i,n){
|
|
nm = this.index || this.name;
|
|
switch (this.stype) {
|
|
case 'select' :
|
|
so = (this.searchoptions && this.searchoptions.sopt) ? this.searchoptions.sopt[0] : 'eq';
|
|
v = $("select[name="+nm+"]",$t.grid.hDiv).val();
|
|
if(v) {
|
|
sdata[nm] = v;
|
|
sopt[nm] = so;
|
|
j++;
|
|
} else {
|
|
try {
|
|
delete $t.p.postData[nm];
|
|
} catch (e) {}
|
|
}
|
|
break;
|
|
case 'text':
|
|
so = (this.searchoptions && this.searchoptions.sopt) ? this.searchoptions.sopt[0] : p.defaultSearch;
|
|
v = $("input[name="+nm+"]",$t.grid.hDiv).val();
|
|
if(v) {
|
|
sdata[nm] = v;
|
|
sopt[nm] = so;
|
|
j++;
|
|
} else {
|
|
try {
|
|
delete $t.p.postData[nm];
|
|
} catch (z) {}
|
|
}
|
|
break;
|
|
}
|
|
});
|
|
var sd = j>0 ? true : false;
|
|
if(p.stringResult === true || $t.p.datatype == "local") {
|
|
var ruleGroup = "{\"groupOp\":\"" + p.groupOp + "\",\"rules\":[";
|
|
var gi=0;
|
|
$.each(sdata,function(i,n){
|
|
if (gi > 0) {ruleGroup += ",";}
|
|
ruleGroup += "{\"field\":\"" + i + "\",";
|
|
ruleGroup += "\"op\":\"" + sopt[i] + "\",";
|
|
n+="";
|
|
ruleGroup += "\"data\":\"" + n.replace(/\\/g,'\\\\').replace(/\"/g,'\\"') + "\"}";
|
|
gi++;
|
|
});
|
|
ruleGroup += "]}";
|
|
$.extend($t.p.postData,{filters:ruleGroup});
|
|
$.each(['searchField', 'searchString', 'searchOper'], function(i, n){
|
|
if($t.p.postData.hasOwnProperty(n)) { delete $t.p.postData[n];}
|
|
});
|
|
} else {
|
|
$.extend($t.p.postData,sdata);
|
|
}
|
|
var saveurl;
|
|
if($t.p.searchurl) {
|
|
saveurl = $t.p.url;
|
|
$($t).jqGrid("setGridParam",{url:$t.p.searchurl});
|
|
}
|
|
var bsr = false;
|
|
if($.isFunction(p.beforeSearch)){bsr = p.beforeSearch.call($t);}
|
|
if(!bsr) { $($t).jqGrid("setGridParam",{search:sd}).trigger("reloadGrid",[{page:1}]); }
|
|
if(saveurl) {$($t).jqGrid("setGridParam",{url:saveurl});}
|
|
if($.isFunction(p.afterSearch)){p.afterSearch();}
|
|
};
|
|
var clearToolbar = function(trigger){
|
|
var sdata={}, v, j=0, nm;
|
|
trigger = (typeof trigger != 'boolean') ? true : trigger;
|
|
$.each($t.p.colModel,function(i,n){
|
|
v = (this.searchoptions && this.searchoptions.defaultValue) ? this.searchoptions.defaultValue : "";
|
|
nm = this.index || this.name;
|
|
switch (this.stype) {
|
|
case 'select' :
|
|
var v1;
|
|
$("select[name="+nm+"] option",$t.grid.hDiv).each(function (i){
|
|
if(i===0) { this.selected = true; }
|
|
if ($(this).text() == v) {
|
|
this.selected = true;
|
|
v1 = $(this).val();
|
|
return false;
|
|
}
|
|
});
|
|
if (v1) {
|
|
// post the key and not the text
|
|
sdata[nm] = v1;
|
|
j++;
|
|
} else {
|
|
try {
|
|
delete $t.p.postData[nm];
|
|
} catch(e) {}
|
|
}
|
|
break;
|
|
case 'text':
|
|
$("input[name="+nm+"]",$t.grid.hDiv).val(v);
|
|
if(v) {
|
|
sdata[nm] = v;
|
|
j++;
|
|
} else {
|
|
try {
|
|
delete $t.p.postData[nm];
|
|
} catch (y){}
|
|
}
|
|
break;
|
|
}
|
|
});
|
|
var sd = j>0 ? true : false;
|
|
if(p.stringResult === true || $t.p.datatype == "local") {
|
|
var ruleGroup = "{\"groupOp\":\"" + p.groupOp + "\",\"rules\":[";
|
|
var gi=0;
|
|
$.each(sdata,function(i,n){
|
|
if (gi > 0) {ruleGroup += ",";}
|
|
ruleGroup += "{\"field\":\"" + i + "\",";
|
|
ruleGroup += "\"op\":\"" + "eq" + "\",";
|
|
n+="";
|
|
ruleGroup += "\"data\":\"" + n.replace(/\\/g,'\\\\').replace(/\"/g,'\\"') + "\"}";
|
|
gi++;
|
|
});
|
|
ruleGroup += "]}";
|
|
$.extend($t.p.postData,{filters:ruleGroup});
|
|
$.each(['searchField', 'searchString', 'searchOper'], function(i, n){
|
|
if($t.p.postData.hasOwnProperty(n)) { delete $t.p.postData[n];}
|
|
});
|
|
} else {
|
|
$.extend($t.p.postData,sdata);
|
|
}
|
|
var saveurl;
|
|
if($t.p.searchurl) {
|
|
saveurl = $t.p.url;
|
|
$($t).jqGrid("setGridParam",{url:$t.p.searchurl});
|
|
}
|
|
var bcv = false;
|
|
if($.isFunction(p.beforeClear)){bcv = p.beforeClear.call($t);}
|
|
if(!bcv) {
|
|
if(trigger) {
|
|
$($t).jqGrid("setGridParam",{search:sd}).trigger("reloadGrid",[{page:1}]);
|
|
}
|
|
}
|
|
if(saveurl) {$($t).jqGrid("setGridParam",{url:saveurl});}
|
|
if($.isFunction(p.afterClear)){p.afterClear();}
|
|
};
|
|
var toggleToolbar = function(){
|
|
var trow = $("tr.ui-search-toolbar",$t.grid.hDiv);
|
|
if(trow.css("display")=='none') { trow.show(); }
|
|
else { trow.hide(); }
|
|
};
|
|
// create the row
|
|
function bindEvents(selector, events) {
|
|
var jElem = $(selector);
|
|
if (jElem[0]) {
|
|
jQuery.each(events, function() {
|
|
if (this.data !== undefined) {
|
|
jElem.bind(this.type, this.data, this.fn);
|
|
} else {
|
|
jElem.bind(this.type, this.fn);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
var tr = $("<tr class='ui-search-toolbar' role='rowheader'></tr>");
|
|
var timeoutHnd;
|
|
$.each($t.p.colModel,function(i,n){
|
|
var cm=this, thd , th, soptions,surl,self;
|
|
th = $("<th role='columnheader' class='ui-state-default ui-th-column ui-th-"+$t.p.direction+"'></th>");
|
|
thd = $("<div style='width:100%;position:relative;height:100%;padding-right:0.3em;'></div>");
|
|
if(this.hidden===true) { $(th).css("display","none");}
|
|
this.search = this.search === false ? false : true;
|
|
if(typeof this.stype == 'undefined' ) {this.stype='text';}
|
|
soptions = $.extend({},this.searchoptions || {});
|
|
if(this.search){
|
|
switch (this.stype)
|
|
{
|
|
case "select":
|
|
surl = this.surl || soptions.dataUrl;
|
|
if(surl) {
|
|
// data returned should have already constructed html select
|
|
// primitive jQuery load
|
|
self = thd;
|
|
$.ajax($.extend({
|
|
url: surl,
|
|
dataType: "html",
|
|
complete: function(res,status) {
|
|
if(soptions.buildSelect !== undefined) {
|
|
var d = soptions.buildSelect(res);
|
|
if (d) { $(self).append(d); }
|
|
} else {
|
|
$(self).append(res.responseText);
|
|
}
|
|
if(soptions.defaultValue) { $("select",self).val(soptions.defaultValue); }
|
|
$("select",self).attr({name:cm.index || cm.name, id: "gs_"+cm.name});
|
|
if(soptions.attr) {$("select",self).attr(soptions.attr);}
|
|
$("select",self).css({width: "100%"});
|
|
// preserve autoserch
|
|
if(soptions.dataInit !== undefined) { soptions.dataInit($("select",self)[0]); }
|
|
if(soptions.dataEvents !== undefined) { bindEvents($("select",self)[0],soptions.dataEvents); }
|
|
if(p.autosearch===true){
|
|
$("select",self).change(function(e){
|
|
triggerToolbar();
|
|
return false;
|
|
});
|
|
}
|
|
res=null;
|
|
}
|
|
}, $.jgrid.ajaxOptions, $t.p.ajaxSelectOptions || {} ));
|
|
} else {
|
|
var oSv;
|
|
if(cm.searchoptions && cm.searchoptions.value) {
|
|
oSv = cm.searchoptions.value;
|
|
} else if(cm.editoptions && cm.editoptions.value) {
|
|
oSv = cm.editoptions.value;
|
|
}
|
|
if (oSv) {
|
|
var elem = document.createElement("select");
|
|
elem.style.width = "100%";
|
|
$(elem).attr({name:cm.index || cm.name, id: "gs_"+cm.name});
|
|
var so, sv, ov;
|
|
if(typeof oSv === "string") {
|
|
so = oSv.split(";");
|
|
for(var k=0; k<so.length;k++){
|
|
sv = so[k].split(":");
|
|
ov = document.createElement("option");
|
|
ov.value = sv[0]; ov.innerHTML = sv[1];
|
|
elem.appendChild(ov);
|
|
}
|
|
} else if(typeof oSv === "object" ) {
|
|
for ( var key in oSv) {
|
|
if(oSv.hasOwnProperty(key)) {
|
|
ov = document.createElement("option");
|
|
ov.value = key; ov.innerHTML = oSv[key];
|
|
elem.appendChild(ov);
|
|
}
|
|
}
|
|
}
|
|
if(soptions.defaultValue) { $(elem).val(soptions.defaultValue); }
|
|
if(soptions.attr) {$(elem).attr(soptions.attr);}
|
|
if(soptions.dataInit !== undefined) { soptions.dataInit(elem); }
|
|
if(soptions.dataEvents !== undefined) { bindEvents(elem, soptions.dataEvents); }
|
|
$(thd).append(elem);
|
|
if(p.autosearch===true){
|
|
$(elem).change(function(e){
|
|
triggerToolbar();
|
|
return false;
|
|
});
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case 'text':
|
|
var df = soptions.defaultValue ? soptions.defaultValue: "";
|
|
$(thd).append("<input type='text' style='width:95%;padding:0px;' name='"+(cm.index || cm.name)+"' id='gs_"+cm.name+"' value='"+df+"'/>");
|
|
if(soptions.attr) {$("input",thd).attr(soptions.attr);}
|
|
if(soptions.dataInit !== undefined) { soptions.dataInit($("input",thd)[0]); }
|
|
if(soptions.dataEvents !== undefined) { bindEvents($("input",thd)[0], soptions.dataEvents); }
|
|
if(p.autosearch===true){
|
|
if(p.searchOnEnter) {
|
|
$("input",thd).keypress(function(e){
|
|
var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0;
|
|
if(key == 13){
|
|
triggerToolbar();
|
|
return false;
|
|
}
|
|
return this;
|
|
});
|
|
} else {
|
|
$("input",thd).keydown(function(e){
|
|
var key = e.which;
|
|
switch (key) {
|
|
case 13:
|
|
return false;
|
|
case 9 :
|
|
case 16:
|
|
case 37:
|
|
case 38:
|
|
case 39:
|
|
case 40:
|
|
case 27:
|
|
break;
|
|
default :
|
|
if(timeoutHnd) { clearTimeout(timeoutHnd); }
|
|
timeoutHnd = setTimeout(function(){triggerToolbar();},500);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
$(th).append(thd);
|
|
$(tr).append(th);
|
|
});
|
|
$("table thead",$t.grid.hDiv).append(tr);
|
|
this.ftoolbar = true;
|
|
this.triggerToolbar = triggerToolbar;
|
|
this.clearToolbar = clearToolbar;
|
|
this.toggleToolbar = toggleToolbar;
|
|
});
|
|
}
|
|
});
|
|
})(jQuery); |