3 * jqGrid extension for custom methods
\r
4 * Tony Tomov tony@trirand.com
\r
5 * http://trirand.com/blog/
\r
6 * Dual licensed under the MIT and GPL licenses:
\r
7 * http://www.opensource.org/licenses/mit-license.php
\r
8 * http://www.gnu.org/licenses/gpl.html
\r
11 getColProp : function(colname){
\r
12 var ret ={}, $t = this[0];
\r
13 if ( !$t.grid ) { return; }
\r
14 var cM = $t.p.colModel;
\r
15 for ( var i =0;i<cM.length;i++ ) {
\r
16 if ( cM[i].name == colname ) {
\r
23 setColProp : function(colname, obj){
\r
24 //do not set width will not work
\r
25 return this.each(function(){
\r
28 var cM = this.p.colModel;
\r
29 for ( var i =0;i<cM.length;i++ ) {
\r
30 if ( cM[i].name == colname ) {
\r
31 $.extend(this.p.colModel[i],obj);
\r
39 sortGrid : function(colname,reload){
\r
40 return this.each(function(){
\r
42 if ( !$t.grid ) { return;}
\r
43 if ( !colname ) { colname = $t.p.sortname; }
\r
44 for ( var i=0;i<$t.p.colModel.length;i++ ) {
\r
45 if ( $t.p.colModel[i].index == colname || $t.p.colModel[i].name==colname ) {
\r
51 var sort = $t.p.colModel[idx].sortable;
\r
52 if ( typeof sort !== 'boolean' ) { sort = true; }
\r
53 if ( typeof reload !=='boolean' ) { reload = false; }
\r
54 if ( sort ) { $t.sortData(colname, idx, reload); }
\r
58 GridDestroy : function () {
\r
59 return this.each(function(){
\r
61 if ( this.p.pager ) {
\r
62 $(this.p.pager).remove();
\r
64 $("#lui_"+this.id).remove();
\r
65 $(this.grid.bDiv).remove();
\r
66 $(this.grid.hDiv).remove();
\r
67 $(this.grid.cDiv).remove();
\r
68 if(this.p.toolbar[0]) { $(this.grid.uDiv).remove(); }
\r
74 GridUnload : function(){
\r
75 return this.each(function(){
\r
76 if ( !this.grid ) {return;}
\r
77 var defgrid = {id: $(this).attr('id'),cl: $(this).attr('class')};
\r
79 $(this.p.pager).empty();
\r
81 var newtable = document.createElement('table');
\r
82 $(newtable).attr({id:defgrid['id']});
\r
83 newtable.className = defgrid['cl'];
\r
84 $("#lui_"+this.id).remove();
\r
85 if(this.p.toolbar[0]) { $(this.grid.uDiv).remove(); }
\r
86 $(this.grid.cDiv).remove();
\r
87 $(this.grid.bDiv).remove();
\r
88 $(this.grid.hDiv).before(newtable).remove();
\r
93 filterGrid : function(gridid,p){
\r
97 gridToolbar : false,
\r
98 filterModel: [], // label/name/stype/defval/surl/sopt
\r
99 formtype : "horizontal", // horizontal/vertical
\r
100 autosearch: true, // if set to false a serch button should be enabled.
\r
101 formclass: "filterform",
\r
102 tableclass: "filtertable",
\r
103 buttonclass: "filterbutton",
\r
104 searchButton: "Search",
\r
105 clearButton: "Clear",
\r
106 enableSearch : false,
\r
107 enableClear: false,
\r
108 beforeSearch: null,
\r
115 return this.each(function(){
\r
118 if(this.p.filterModel.length == 0 && this.p.gridModel===false) { alert("No filter is set"); return;}
\r
119 if( !gridid) {alert("No target grid is set!"); return;}
\r
120 this.p.gridid = gridid.indexOf("#") != -1 ? gridid : "#"+gridid;
\r
121 var gcolMod = $(this.p.gridid).getGridParam('colModel');
\r
123 if( this.p.gridModel === true) {
\r
124 var thegrid = $(this.p.gridid)[0];
\r
125 // we should use the options search, edittype, editoptions
\r
126 // additionally surl and defval can be added in grid colModel
\r
127 $.each(gcolMod, function (i,n) {
\r
129 if(!this.search) {this.search = true;}
\r
130 if( this.search === true && !this.hidden) {
\r
131 if(self.p.gridNames===true) {
\r
132 tmpFil.label = thegrid.p.colNames[i];
\r
136 tmpFil.name = this.name;
\r
137 tmpFil.index = this.index || this.name;
\r
138 // we support only text and selects, so all other to text
\r
139 tmpFil.stype = this.edittype || 'text';
\r
140 if(tmpFil.stype != 'select' || tmpFil.stype != 'select') {
\r
141 tmpFil.stype = 'text';
\r
143 tmpFil.defval = this.defval || '';
\r
144 tmpFil.surl = this.surl || '';
\r
145 tmpFil.sopt = this.editoptions || {};
\r
146 tmpFil.width = this.width;
\r
147 self.p.filterModel.push(tmpFil);
\r
151 $.each(self.p.filterModel,function(i,n) {
\r
152 for(var j=0;j<gcolMod.length;j++) {
\r
153 if(this.name == gcolMod[j].name) {
\r
154 this.index = gcolMod[j].index || this.name;
\r
159 this.index = this.name;
\r
164 alert("Could not get grid colModel"); return;
\r
166 var triggerSearch = function() {
\r
167 var sdata={}, j=0, v;
\r
168 var gr = $(self.p.gridid)[0];
\r
169 if($.isFunction(self.p.beforeSearch)){self.p.beforeSearch();}
\r
170 $.each(self.p.filterModel,function(i,n){
\r
171 switch (this.stype) {
\r
173 v = $("select[@name="+this.name+"]",self).val();
\r
175 sdata[this.index] = v;
\r
176 if(self.p.marksearched){
\r
177 $("#jqgh_"+this.name,gr.grid.hDiv).addClass("dirty-cell");
\r
181 if(self.p.marksearched){
\r
182 $("#jqgh_"+this.name,gr.grid.hDiv).removeClass("dirty-cell");
\r
184 // remove from postdata
\r
186 delete gr.p.postData[this.index];
\r
191 v = $("input[@name="+this.name+"]",self).val();
\r
193 sdata[this.index] = v;
\r
194 if(self.p.marksearched){
\r
195 $("#jqgh_"+this.name,gr.grid.hDiv).addClass("dirty-cell");
\r
199 if(self.p.marksearched){
\r
200 $("#jqgh_"+this.name,gr.grid.hDiv).removeClass("dirty-cell");
\r
202 // remove from postdata
\r
204 delete gr.p.postData[this.index];
\r
209 var sd = j>0 ? true : false;
\r
210 gr.p.postData = $.extend(gr.p.postData,sdata);
\r
213 saveurl = $(gr).getGridParam('url');
\r
214 $(gr).setGridParam({url:self.p.url});
\r
216 $(gr).setGridParam({search:sd,page:1}).trigger("reloadGrid");
\r
217 if(saveurl) {$(gr).setGridParam({url:saveurl});}
\r
218 if($.isFunction(self.p.afterSearch)){self.p.afterSearch();}
\r
220 var clearSearch = function(){
\r
221 var sdata={}, v, j=0;
\r
222 var gr = $(self.p.gridid)[0];
\r
223 if($.isFunction(self.p.beforeClear)){self.p.beforeClear();}
\r
224 $.each(self.p.filterModel,function(i,n){
\r
225 v = (this.defval) ? this.defval : "";
\r
226 if(!this.stype){this.stype=='text';}
\r
227 switch (this.stype) {
\r
229 $("select[@name="+this.name+"]",self).val(v);
\r
231 sdata[this.index] = v;
\r
232 if(self.p.marksearched){
\r
233 $("#jqgh_"+this.name,gr.grid.hDiv).addClass("dirty-cell");
\r
237 if(self.p.marksearched){
\r
238 $("#jqgh_"+this.name,gr.grid.hDiv).removeClass("dirty-cell");
\r
240 // remove from postdata
\r
242 delete gr.p.postData[this.index];
\r
247 $("input[@name="+this.name+"]",self).val(v);
\r
249 sdata[this.index] = v;
\r
250 if(self.p.marksearched){
\r
251 $("#jqgh_"+this.name,gr.grid.hDiv).addClass("dirty-cell");
\r
255 if(self.p.marksearched){
\r
256 $("#jqgh_"+this.name,gr.grid.hDiv).removeClass("dirty-cell");
\r
258 // remove from postdata
\r
260 delete gr.p.postData[this.index];
\r
265 var sd = j>0 ? true : false;
\r
266 gr.p.postData = $.extend(gr.p.postData,sdata);
\r
269 saveurl = $(gr).getGridParam('url');
\r
270 $(gr).setGridParam({url:self.p.url});
\r
272 $(gr).setGridParam({search:sd,page:1}).trigger("reloadGrid");
\r
273 if(saveurl) {$(gr).setGridParam({url:saveurl});}
\r
274 if($.isFunction(self.p.afterClear)){self.p.afterClear();}
\r
276 var formFill = function(){
\r
277 var tr = document.createElement("tr");
\r
278 var tr1, sb, cb,tl,td, td1;
\r
279 if(self.p.formtype=='horizontal'){
\r
282 $.each(self.p.filterModel,function(i,n){
\r
283 tl = document.createElement("td");
\r
284 $(tl).append("<label for='"+this.name+"'>"+this.label+"</label>");
\r
285 td = document.createElement("td");
\r
287 if(!this.stype) { this.stype='text';}
\r
288 switch (this.stype)
\r
292 // data returned should have already constructed html select
\r
293 $(td).load(this.surl,function(){
\r
294 if($t.defval) $("select",this).val($t.defval);
\r
295 $("select",this).attr({name:$t.name, id: "sg_"+$t.name});
\r
296 if($t.sopt) $("select",this).attr($t.sopt);
\r
297 if(self.p.gridToolbar===true && $t.width) {
\r
298 $("select",this).width($t.width);
\r
300 if(self.p.autosearch===true){
\r
301 $("select",this).change(function(e){
\r
308 // sopt to construct the values
\r
309 if($t.sopt.value) {
\r
310 var so = $t.sopt.value.split(";"), sv, ov;
\r
311 try {delete $t.sopt['value'];} catch (e) {}
\r
312 var elem = document.createElement("select");
\r
313 $(elem).attr({name:$t.name, id: "sg_"+$t.name}).attr($t.sopt);
\r
314 for(var k=0; k<so.length;k++){
\r
315 sv = so[k].split(":");
\r
316 ov = document.createElement("option");
\r
317 ov.value = sv[0]; ov.innerHTML = sv[1];
\r
318 if (sv[1]==$t.defval) ov.selected ="selected";
\r
319 elem.appendChild(ov);
\r
321 if(self.p.gridToolbar===true && $t.width) {
\r
322 $(elem).width($t.width);
\r
324 $(td).append(elem);
\r
325 if(self.p.autosearch===true){
\r
326 $(elem).change(function(e){
\r
335 var df = this.defval ? this.defval: "";
\r
336 $(td).append("<input type='text' name='"+this.name+"' id='sg_"+this.name+"' value='"+df+"'/>");
\r
337 if($t.sopt) $("input",td).attr($t.sopt);
\r
338 if(self.p.gridToolbar===true && $t.width) {
\r
339 if($.browser.msie) {
\r
340 $("input",td).width($t.width-4);
\r
342 $("input",td).width($t.width-2);
\r
345 if(self.p.autosearch===true){
\r
346 $("input",td).keypress(function(e){
\r
347 var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0;
\r
357 if(self.p.formtype=='horizontal'){
\r
358 if(self.p.grodToolbar===true && self.p.gridNames===false) {
\r
361 $(tr).append(tl).append(td);
\r
365 tr1 = document.createElement("tr");
\r
366 $(tr1).append(tl).append(td);
\r
367 $(tbl).append(tr1);
\r
370 td = document.createElement("td");
\r
371 if(self.p.enableSearch === true){
\r
372 sb = "<input type='button' id='sButton' class='"+self.p.buttonclass+"' value='"+self.p.searchButton+"'/>";
\r
374 $("input#sButton",td).click(function(){
\r
379 if(self.p.enableClear === true) {
\r
380 cb = "<input type='button' id='cButton' class='"+self.p.buttonclass+"' value='"+self.p.clearButton+"'/>";
\r
382 $("input#cButton",td).click(function(){
\r
387 if(self.p.enableClear === true || self.p.enableSearch === true) {
\r
388 if(self.p.formtype=='horizontal') {
\r
391 tr1 = document.createElement("tr");
\r
392 $(tr1).append("<td> </td>").append(td);
\r
393 $(tbl).append(tr1);
\r
397 var frm = $("<form name='SearchForm' style=display:inline;' class='"+this.p.formclass+"'></form>");
\r
398 var tbl =$("<table class='"+this.p.tableclass+"' cellspacing='0' cellpading='0' border='0'><tbody></tbody></table>");
\r
399 $(frm).append(tbl);
\r
401 $(this).append(frm);
\r
402 this.triggerSearch = function () {triggerSearch();};
\r
403 this.clearSearch = function () {clearSearch();};
\r