3 * jqGrid extension for form editing Grid Data
\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 searchGrid : function ( p ) {
\r
19 closeicon: 'ico-close.gif',
\r
21 sField:'searchField',
\r
22 sValue:'searchString',
\r
23 sOper: 'searchOper',
\r
26 beforeShowSearch: null,
\r
27 afterShowSearch : null,
\r
28 onInitializeSearch: null,
\r
30 // if you want to change or remove the order change it in sopt
\r
31 // ['bw','eq','ne','lt','le','gt','ge','ew','cn']
\r
33 }, $.jgrid.search, p || {});
\r
34 return this.each(function(){
\r
36 if( !$t.grid ) { return; }
\r
37 if(!p.imgpath) { p.imgpath= $t.p.imgpath; }
\r
38 var gID = $("table:first",$t.grid.bDiv).attr("id");
\r
39 var IDs = { themodal:'srchmod'+gID,modalhead:'srchhead'+gID,modalcontent:'srchcnt'+gID };
\r
40 if ( $("#"+IDs.themodal).html() != null ) {
\r
41 if( $.isFunction('beforeShowSearch') ) { beforeShowSearch($("#srchcnt"+gID)); }
\r
42 viewModal("#"+IDs.themodal,{modal: p.modal});
\r
43 if( $.isFunction('afterShowSearch') ) { afterShowSearch($("#srchcnt"+gID)); }
\r
45 var cM = $t.p.colModel;
\r
46 var cNames = "<select id='snames' class='search'>";
\r
48 for(var i=0; i< cM.length;i++) {
\r
50 hc = (cM[i].hidden===true) ? true : false;
\r
51 sf = (cM[i].search===false) ? false: true;
\r
52 if( nm !== 'cb' && nm !== 'subgrid' && sf && !hc ) { // add here condition for searchable
\r
53 var sname = (cM[i].index) ? cM[i].index : nm;
\r
54 cNames += "<option value='"+sname+"'>"+$t.p.colNames[i]+"</option>";
\r
57 cNames += "</select>";
\r
58 var getopt = p.sopt || ['bw','eq','ne','lt','le','gt','ge','ew','cn'];
\r
59 var sOpt = "<select id='sopt' class='search'>";
\r
60 for(var i = 0; i<getopt.length;i++) {
\r
61 sOpt += getopt[i]=='eq' ? "<option value='eq'>"+p.odata[0]+"</option>" : "";
\r
62 sOpt += getopt[i]=='ne' ? "<option value='ne'>"+p.odata[1]+"</option>" : "";
\r
63 sOpt += getopt[i]=='lt' ? "<option value='lt'>"+p.odata[2]+"</option>" : "";
\r
64 sOpt += getopt[i]=='le' ? "<option value='le'>"+p.odata[3]+"</option>" : "";
\r
65 sOpt += getopt[i]=='gt' ? "<option value='gt'>"+p.odata[4]+"</option>" : "";
\r
66 sOpt += getopt[i]=='ge' ? "<option value='ge'>"+p.odata[5]+"</option>" : "";
\r
67 sOpt += getopt[i]=='bw' ? "<option value='bw'>"+p.odata[6]+"</option>" : "";
\r
68 sOpt += getopt[i]=='ew' ? "<option value='ew'>"+p.odata[7]+"</option>" : "";
\r
69 sOpt += getopt[i]=='cn' ? "<option value='cn'>"+p.odata[8]+"</option>" : "";
\r
71 sOpt += "</select>";
\r
72 // field and buttons
\r
73 var sField = "<input id='sval' class='search' type='text' size='20' maxlength='100'/>";
\r
74 var bSearch = "<input id='sbut' class='buttonsearch' type='button' value='"+p.Find+"'/>";
\r
75 var bReset = "<input id='sreset' class='buttonsearch' type='button' value='"+p.Reset+"'/>";
\r
76 var cnt = $("<table width='100%'><tbody><tr style='display:none' id='srcherr'><td colspan='5'></td></tr><tr><td>"+cNames+"</td><td>"+sOpt+"</td><td>"+sField+"</td><td>"+bSearch+"</td><td>"+bReset+"</td></tr></tbody></table>");
\r
77 createModal(IDs,cnt,p,$t.grid.hDiv,$t.grid.hDiv);
\r
78 if ( $.isFunction('onInitializeSearch') ) { onInitializeSearch( $("#srchcnt"+gID) ); };
\r
79 if ( $.isFunction('beforeShowSearch') ) { beforeShowSearch($("#srchcnt"+gID)); };
\r
80 viewModal("#"+IDs.themodal,{modal:p.modal});
\r
81 if($.isFunction('afterShowSearch')) { afterShowSearch($("#srchcnt"+gID)); }
\r
82 if(p.drag) { DnRModal("#"+IDs.themodal,"#"+IDs.modalhead+" td.modaltext"); }
\r
83 $("#sbut","#"+IDs.themodal).click(function(){
\r
84 if( $("#sval","#"+IDs.themodal).val() !="" ) {
\r
85 var es=[true,"",""];
\r
86 $("#srcherr >td","#srchcnt"+gID).html("").hide();
\r
87 $t.p.searchdata[p.sField] = $("option[@selected]","#snames").val();
\r
88 $t.p.searchdata[p.sOper] = $("option[@selected]","#sopt").val();
\r
89 $t.p.searchdata[p.sValue] = $("#sval","#"+IDs.modalcontent).val();
\r
91 for(var i=0; i< cM.length;i++) {
\r
92 var sname = (cM[i].index) ? cM[i].index : nm;
\r
93 if (sname == $t.p.searchdata[p.sField]) {
\r
97 es = checkValues($t.p.searchdata[p.sValue],i,$t);
\r
100 $t.p.search = true; // initialize the search
\r
101 // construct array of data which is passed in populate() see jqGrid
\r
102 if(p.dirty) { $(".no-dirty-cell",$t.p.pager).addClass("dirty-cell"); }
\r
104 $($t).trigger("reloadGrid");
\r
106 $("#srcherr >td","#srchcnt"+gID).html(es[1]).show();
\r
110 $("#sreset","#"+IDs.themodal).click(function(){
\r
112 $("#srcherr >td","#srchcnt"+gID).html("").hide();
\r
113 $t.p.search = false;
\r
114 $t.p.searchdata = {};
\r
116 $("#sval","#"+IDs.themodal).val("");
\r
117 if(p.dirty) { $(".no-dirty-cell",$t.p.pager).removeClass("dirty-cell"); }
\r
118 $($t).trigger("reloadGrid");
\r
124 editGridRow : function(rowid, p){
\r
132 closeicon: 'ico-close.gif',
\r
136 closeAfterAdd : false,
\r
137 clearAfterAdd : true,
\r
138 closeAfterEdit : false,
\r
139 reloadAfterSubmit : true,
\r
140 onInitializeForm: null, // only once
\r
141 beforeInitData: null,
\r
142 beforeShowForm: null,
\r
143 afterShowForm: null,
\r
144 beforeSubmit: null,
\r
146 onclickSubmit: null,
\r
148 }, $.jgrid.edit, p || {});
\r
149 return this.each(function(){
\r
151 if (!$t.grid || !rowid) { return; }
\r
152 if(!p.imgpath) { p.imgpath= $t.p.imgpath; }
\r
153 // I hate to rewrite code, but ...
\r
154 var gID = $("table:first",$t.grid.bDiv).attr("id");
\r
155 var IDs = {themodal:'editmod'+gID,modalhead:'edithd'+gID,modalcontent:'editcnt'+gID};
\r
156 var onBeforeShow = typeof p.beforeShowForm === 'function' ? true: false;
\r
157 var onAfterShow = typeof p.afterShowForm === 'function' ? true: false;
\r
158 var onBeforeInit = typeof p.beforeInitData === 'function' ? true: false;
\r
159 if (rowid=="new") {
\r
161 p.caption=p.addCaption;
\r
163 p.caption=p.editCaption;
\r
165 var frmgr = "FrmGrid_"+gID;
\r
166 var frmtb = "TblGrid_"+gID;
\r
167 if ( $("#"+IDs.themodal).html() != null ) {
\r
168 $(".modaltext","#"+IDs.modalhead).html(p.caption);
\r
169 $("#FormError","#"+frmtb).hide();
\r
170 if(onBeforeInit) { p.beforeInitData($("#"+frmgr)); }
\r
171 fillData(rowid,$t);
\r
172 if(rowid=="_empty") { $("#pData, #nData","#"+frmtb).hide(); } else { $("#pData, #nData","#"+frmtb).show(); }
\r
173 if(onBeforeShow) { p.beforeShowForm($("#"+frmgr)); }
\r
174 viewModal("#"+IDs.themodal,{modal:p.modal});
\r
175 if(onAfterShow) { p.afterShowForm($("#"+frmgr)); }
\r
177 var frm = $("<form name='FormPost' id='"+frmgr+"' class='FormGrid'></form>");
\r
178 var tbl =$("<table id='"+frmtb+"' class='EditTable' cellspacing='0' cellpading='0' border='0'><tbody></tbody></table>");
\r
179 $(frm).append(tbl);
\r
180 $(tbl).append("<tr id='FormError' style='display:none'><td colspan='2'>"+" "+"</td></tr>");
\r
182 // use carefull only to change here colproperties.
\r
183 if(onBeforeInit) { p.beforeInitData($("#"+frmgr)); }
\r
184 var valref = createData(rowid,$t,tbl);
\r
185 // buttons at footer
\r
186 var imp = $t.p.imgpath;
\r
187 var bP ="<img id='pData' src='"+imp+$t.p.previmg+"'/>";
\r
188 var bN ="<img id='nData' src='"+imp+$t.p.nextimg+"'/>";
\r
189 var bS ="<input id='sData' type='button' class='EditButton' value='"+p.bSubmit+"'/>";
\r
190 var bC ="<input id='cData' type='button' class='EditButton' value='"+p.bCancel+"'/>";
\r
191 $(tbl).append("<tr id='Act_Buttons'><td class='navButton'>"+bP+" "+bN+"</td><td class='EditButton'>"+bS+" "+bC+"</td></tr>");
\r
192 // beforeinitdata after creation of the form
\r
193 createModal(IDs,frm,p,$t.grid.hDiv,$t.grid.hDiv);
\r
194 // here initform - only once
\r
195 if(typeof p.onInitializeForm === 'function') { p.onInitializeForm($("#"+frmgr)); }
\r
196 if( p.drag ) { DnRModal("#"+IDs.themodal,"#"+IDs.modalhead+" td.modaltext"); }
\r
197 if(rowid=="_empty") { $("#pData,#nData","#"+frmtb).hide(); } else { $("#pData,#nData","#"+frmtb).show(); }
\r
198 if(onBeforeShow) { p.beforeShowForm($("#"+frmgr)); }
\r
199 viewModal("#"+IDs.themodal,{modal:p.modal});
\r
200 if(onAfterShow) { p.afterShowForm($("#"+frmgr)); }
\r
201 $("#sData", "#"+frmtb).click(function(e){
\r
202 var postdata = {}, ret=[true,"",""], extpost={};
\r
203 $("#FormError","#"+frmtb).hide();
\r
204 // all depend on ret array
\r
206 //ret[1] - msg if not succes
\r
207 //ret[2] - the id that will be set if reload after submit false
\r
209 $(".FormElement", "#"+frmtb).each(function(i){
\r
211 switch ($(this).get(0).type) {
\r
213 if($(this).attr("checked")) {
\r
214 postdata[this.name]= $(this).val();
\r
216 postdata[this.name]= "";
\r
217 extpost[this.name] = $(this).attr("offval");
\r
221 postdata[this.name]= $("option:selected",this).val();
\r
222 extpost[this.name]= $("option:selected",this).text();
\r
224 case "select-multiple":
\r
225 postdata[this.name]= $(this).val();
\r
226 var selectedText = [];
\r
227 $("option:selected",this).each(
\r
228 function(i,selected){
\r
229 selectedText[i] = $(selected).text();
\r
232 extpost[this.name]= selectedText.join(",");
\r
237 postdata[this.name] = $(this).val();
\r
238 ret = checkValues($(this).val(),valref[i],$t);
\r
239 if(ret[0] === false) { suc=false; }
\r
243 if(!suc) { return false; }
\r
245 if(j==0) { ret[0] = false; ret[1] = $.jgrid.errors.norecords; }
\r
246 if( typeof p.onclickSubmit === 'function' ) { p.editData = p.onclickSubmit(p) || {}; }
\r
248 if( typeof p.beforeSubmit === 'function') { ret = p.beforeSubmit(postdata,$("#"+frmgr)); }
\r
250 var gurl = p.url ? p.url : $t.p.editurl;
\r
252 if(!gurl) { ret[0]=false; ret[1] += " "+$.jgrid.errors.nourl; }
\r
254 if(ret[0] === false) {
\r
255 $("#FormError>td","#"+frmtb).html(ret[1]);
\r
256 $("#FormError","#"+frmtb).show();
\r
258 if(!p.processing) {
\r
259 p.processing = true;
\r
260 $("div.loading","#"+IDs.themodal).fadeIn("fast");
\r
261 $(this).attr("disabled",true);
\r
262 // we add to pos data array the action - the name is oper
\r
263 postdata.oper = postdata.id == "_empty" ? "add" : "edit";
\r
264 postdata = $.extend(postdata,p.editData);
\r
269 complete:function(data,Status){
\r
270 if(Status != "success") {
\r
272 ret[1] = Status+" Status: "+data.statusText +" Error code: "+data.status;
\r
274 // data is posted successful
\r
275 // execute aftersubmit with the returned data from server
\r
276 if( typeof p.afterSubmit === 'function' ) {
\r
277 ret = p.afterSubmit(data,postdata);
\r
280 if(ret[0] === false) {
\r
281 $("#FormError>td","#"+frmtb).html(ret[1]);
\r
282 $("#FormError","#"+frmtb).show();
\r
284 postdata = $.extend(postdata,extpost);
\r
285 // the action is add
\r
286 if(postdata.id=="_empty" ) {
\r
288 // user not set the id ret[2]
\r
289 if(!ret[2]) { ret[2] = parseInt($($t).getGridParam('records'))+1; }
\r
290 postdata.id = ret[2];
\r
291 if(p.closeAfterAdd) {
\r
292 if(p.reloadAfterSubmit) { $($t).trigger("reloadGrid"); }
\r
293 else { $($t).addRowData(ret[2],postdata,"first"); }
\r
294 $("#"+IDs.themodal).jqmHide();
\r
295 } else if (p.clearAfterAdd) {
\r
296 if(p.reloadAfterSubmit) { $($t).trigger("reloadGrid"); }
\r
297 else { $($t).addRowData(ret[2],postdata,"first"); }
\r
298 $(".FormElement", "#"+frmtb).each(function(i){
\r
299 switch ($(this).get(0).type) {
\r
301 $(this).attr("checked",0);
\r
304 case "select-multiple":
\r
305 $("option",this).attr("selected","");
\r
310 if(this.name =='id') { $(this).val("_empty"); }
\r
311 else { $(this).val(""); }
\r
316 if(p.reloadAfterSubmit) { $($t).trigger("reloadGrid"); }
\r
317 else { $($t).addRowData(ret[2],postdata,"first"); }
\r
320 // the action is update
\r
321 if(p.reloadAfterSubmit) {
\r
322 $($t).trigger("reloadGrid");
\r
323 if( !p.closeAfterEdit ) { $($t).setSelection(postdata.id); }
\r
325 if($t.p.treeGrid === true) {
\r
326 $($t).setTreeRow(postdata.id,postdata);
\r
328 $($t).setRowData(postdata.id,postdata);
\r
331 if(p.closeAfterEdit) { $("#"+IDs.themodal).jqmHide(); }
\r
334 p.processing=false;
\r
335 $("#sData", "#"+frmtb).attr("disabled",false);
\r
336 $("div.loading","#"+IDs.themodal).fadeOut("fast");
\r
341 e.stopPropagation();
\r
343 $("#cData", "#"+frmtb).click(function(e){
\r
344 $("#"+IDs.themodal).jqmHide();
\r
345 e.stopPropagation();
\r
347 $("#nData", "#"+frmtb).click(function(e){
\r
348 $("#FormError","#"+frmtb).hide();
\r
349 var npos = getCurrPos();
\r
350 npos[0] = parseInt(npos[0]);
\r
351 if(npos[0] != -1 && npos[1][npos[0]+1]) {
\r
352 fillData(npos[1][npos[0]+1],$t);
\r
353 $($t).setSelection(npos[1][npos[0]+1]);
\r
354 updateNav(npos[0]+1,npos[1].length-1);
\r
358 $("#pData", "#"+frmtb).click(function(e){
\r
359 $("#FormError","#"+frmtb).hide();
\r
360 var ppos = getCurrPos();
\r
361 if(ppos[0] != -1 && ppos[1][ppos[0]-1]) {
\r
362 fillData(ppos[1][ppos[0]-1],$t);
\r
363 $($t).setSelection(ppos[1][ppos[0]-1]);
\r
364 updateNav(ppos[0]-1,ppos[1].length-1);
\r
369 var posInit =getCurrPos();
\r
370 updateNav(posInit[0],posInit[1].length-1);
\r
371 function updateNav(cr,totr,rid){
\r
372 var imp = $t.p.imgpath;
\r
373 if (cr==0) { $("#pData","#"+frmtb).attr("src",imp+"off-"+$t.p.previmg); } else { $("#pData","#"+frmtb).attr("src",imp+$t.p.previmg); }
\r
374 if (cr==totr) { $("#nData","#"+frmtb).attr("src",imp+"off-"+$t.p.nextimg); } else { $("#nData","#"+frmtb).attr("src",imp+$t.p.nextimg); }
\r
376 function getCurrPos() {
\r
377 var rowsInGrid = $($t).getDataIDs();
\r
378 var selrow = $("#id_g","#"+frmtb).val();
\r
379 var pos = $.inArray(selrow,rowsInGrid);
\r
380 return [pos,rowsInGrid];
\r
382 function createData(rowid,obj,tb){
\r
383 var nm, hc,trdata, tdl, tde, cnt=0,tmp, dc,elc, retpos=[];
\r
384 $('#'+rowid+' td',obj.grid.bDiv).each( function(i) {
\r
385 nm = obj.p.colModel[i].name;
\r
386 // hidden fields are included in the form
\r
387 if(obj.p.colModel[i].editrules && obj.p.colModel[i].editrules.edithidden == true) {
\r
390 hc = obj.p.colModel[i].hidden === true ? true : false;
\r
392 dc = hc ? "style='display:none'" : "";
\r
393 if ( nm !== 'cb' && nm !== 'subgrid' && obj.p.colModel[i].editable===true) {
\r
394 if(nm == obj.p.ExpandColumn && obj.p.treeGrid === true) {
\r
395 tmp = $(this).text();
\r
397 tmp = $(this).html().replace(/\ \;/ig,'');
\r
399 var opt = $.extend(obj.p.colModel[i].editoptions || {} ,{id:nm,name:nm});
\r
400 if(!obj.p.colModel[i].edittype) obj.p.colModel[i].edittype = "text";
\r
401 elc = createEl(obj.p.colModel[i].edittype,opt,tmp);
\r
402 $(elc).addClass("FormElement");
\r
403 trdata = $("<tr "+dc+"></tr>").addClass("FormData");
\r
404 tdl = $("<td></td>").addClass("CaptionTD");
\r
405 tde = $("<td></td>").addClass("DataTD");
\r
406 $(tdl).html(obj.p.colNames[i]+": ");
\r
407 $(tde).append(elc);
\r
408 trdata.append(tdl);
\r
409 trdata.append(tde);
\r
410 if(tb) { $(tb).append(trdata); }
\r
411 else { $(trdata).insertBefore("#Act_Buttons"); }
\r
417 var idrow = $("<tr class='FormData' style='display:none'><td class='CaptionTD'>"+" "+"</td><td class='DataTD'><input class='FormElement' id='id_g' type='text' name='id' value='"+rowid+"'/></td></tr>");
\r
418 if(tb) { $(tb).append(idrow); }
\r
419 else { $(idrow).insertBefore("#Act_Buttons"); }
\r
423 function fillData(rowid,obj){
\r
424 var nm, hc,cnt=0,tmp;
\r
425 $('#'+rowid+' td',obj.grid.bDiv).each( function(i) {
\r
426 nm = obj.p.colModel[i].name;
\r
427 // hidden fields are included in the form
\r
428 if(obj.p.colModel[i].editrules && obj.p.colModel[i].editrules.edithidden === true) {
\r
431 hc = obj.p.colModel[i].hidden === true ? true : false;
\r
433 if ( nm !== 'cb' && nm !== 'subgrid' && obj.p.colModel[i].editable===true) {
\r
434 if(nm == obj.p.ExpandColumn && obj.p.treeGrid === true) {
\r
435 tmp = $(this).text();
\r
437 tmp = $(this).html().replace(/\ \;/ig,'');
\r
439 switch (obj.p.colModel[i].edittype) {
\r
443 $("#"+nm,"#"+frmtb).val(tmp);
\r
446 $("#"+nm+" option","#"+frmtb).each(function(j){
\r
447 if (!obj.p.colModel[i].editoptions.multiple && tmp == $(this).text() ){
\r
448 this.selected= true;
\r
449 } else if (obj.p.colModel[i].editoptions.multiple){
\r
450 if( $.inArray($(this).text(), tmp.split(",") ) > -1 ){
\r
451 this.selected = true;
\r
453 this.selected = false;
\r
456 this.selected = false;
\r
461 if(tmp==$("#"+nm,"#"+frmtb).val()) {
\r
462 $("#"+nm,"#"+frmtb).attr("checked",true);
\r
463 $("#"+nm,"#"+frmtb).attr("defaultChecked",true); //ie
\r
465 $("#"+nm,"#"+frmtb).attr("checked",false);
\r
466 $("#"+nm,"#"+frmtb).attr("defaultChecked",""); //ie
\r
470 if (hc) { $("#"+nm,"#"+frmtb).parents("tr:first").hide(); }
\r
474 if(cnt>0) { $("#id_g","#"+frmtb).val(rowid); }
\r
475 else { $("#id_g","#"+frmtb).val(""); }
\r
480 delGridRow : function(rowids,p) {
\r
488 closeicon: 'ico-close.gif',
\r
492 reloadAfterSubmit: true,
\r
493 beforeShowForm: null,
\r
494 afterShowForm: null,
\r
495 beforeSubmit: null,
\r
496 onclickSubmit: null,
\r
498 onclickSubmit: null,
\r
500 }, $.jgrid.del, p ||{});
\r
501 return this.each(function(){
\r
503 if (!$t.grid ) { return; }
\r
504 if(!rowids) { return; }
\r
505 if(!p.imgpath) { p.imgpath= $t.p.imgpath; }
\r
506 var onBeforeShow = typeof p.beforeShowForm === 'function' ? true: false;
\r
507 var onAfterShow = typeof p.afterShowForm === 'function' ? true: false;
\r
508 if (isArray(rowids)) { rowids = rowids.join(); }
\r
509 var gID = $("table:first",$t.grid.bDiv).attr("id");
\r
510 var IDs = {themodal:'delmod'+gID,modalhead:'delhd'+gID,modalcontent:'delcnt'+gID};
\r
511 var dtbl = "DelTbl_"+gID;
\r
512 if ( $("#"+IDs.themodal).html() != null ) {
\r
513 $("#DelData>td","#"+dtbl).text(rowids);
\r
514 $("#DelError","#"+dtbl).hide();
\r
515 if(onBeforeShow) { p.beforeShowForm($("#"+dtbl)); }
\r
516 viewModal("#"+IDs.themodal,{modal:p.modal});
\r
517 if(onAfterShow) { p.afterShowForm($("#"+dtbl)); }
\r
519 var tbl =$("<table id='"+dtbl+"' class='DelTable'><tbody></tbody></table>");
\r
521 $(tbl).append("<tr id='DelError' style='display:none'><td >"+" "+"</td></tr>");
\r
522 $(tbl).append("<tr id='DelData' style='display:none'><td >"+rowids+"</td></tr>");
\r
523 $(tbl).append("<tr><td >"+p.msg+"</td></tr>");
\r
524 // buttons at footer
\r
525 var bS ="<input id='dData' type='button' value='"+p.bSubmit+"'/>";
\r
526 var bC ="<input id='eData' type='button' value='"+p.bCancel+"'/>";
\r
527 $(tbl).append("<tr><td class='DelButton'>"+bS+" "+bC+"</td></tr>");
\r
528 createModal(IDs,tbl,p,$t.grid.hDiv,$t.grid.hDiv);
\r
529 if( p.drag) { DnRModal("#"+IDs.themodal,"#"+IDs.modalhead+" td.modaltext"); }
\r
530 $("#dData","#"+dtbl).click(function(e){
\r
532 var postdata = $("#DelData>td","#"+dtbl).text(); //the pair is name=val1,val2,...
\r
533 if( typeof p.onclickSubmit === 'function' ) { p.delData = p.onclickSubmit(p) || {}; }
\r
534 if( typeof p.beforeSubmit === 'function' ) { ret = p.beforeSubmit(postdata); }
\r
535 var gurl = p.url ? p.url : $t.p.editurl;
\r
536 if(!gurl) { ret[0]=false;ret[1] += " "+$.jgrid.errors.nourl;}
\r
537 if(ret[0] === false) {
\r
538 $("#DelError>td","#"+dtbl).html(ret[1]);
\r
539 $("#DelError","#"+dtbl).show();
\r
541 if(!p.processing) {
\r
542 p.processing = true;
\r
543 $("div.loading","#"+IDs.themodal).fadeIn("fast");
\r
544 $(this).attr("disabled",true);
\r
545 var postd = $.extend({oper:"del", id:postdata},p.delData);
\r
550 complete:function(data,Status){
\r
551 if(Status != "success") {
\r
553 ret[1] = Status+" Status: "+data.statusText +" Error code: "+data.status;
\r
555 // data is posted successful
\r
556 // execute aftersubmit with the returned data from server
\r
557 if( typeof p.afterSubmit === 'function' ) {
\r
558 ret = p.afterSubmit(data,postdata);
\r
561 if(ret[0] === false) {
\r
562 $("#DelError>td","#"+dtbl).html(ret[1]);
\r
563 $("#DelError","#"+dtbl).show();
\r
565 if(p.reloadAfterSubmit) {
\r
566 if($t.p.treeGrid) {
\r
567 $($t).setGridParam({treeANode:0,datatype:$t.p.treedatatype});
\r
569 $($t).trigger("reloadGrid");
\r
572 toarr = postdata.split(",");
\r
573 if($t.p.treeGrid===true){
\r
574 try {$($t).delTreeNode(toarr[0])} catch(e){}
\r
576 for(var i=0;i<toarr.length;i++) {
\r
577 $($t).delRowData(toarr[i]);
\r
580 $t.p.selrow = null;
\r
581 $t.p.selarrrow = [];
\r
584 p.processing=false;
\r
585 $("#dData", "#"+dtbl).attr("disabled",false);
\r
586 $("div.loading","#"+IDs.themodal).fadeOut("fast");
\r
587 if(ret[0]) { $("#"+IDs.themodal).jqmHide(); }
\r
594 $("#eData", "#"+dtbl).click(function(e){
\r
595 $("#"+IDs.themodal).jqmHide();
\r
598 if(onBeforeShow) { p.beforeShowForm($("#"+dtbl)); }
\r
599 viewModal("#"+IDs.themodal,{modal:p.modal});
\r
600 if(onAfterShow) { p.afterShowForm($("#"+dtbl)); }
\r
604 navGrid : function (elem, o, pEdit,pAdd,pDel,pSearch) {
\r
607 editicon: "row_edit.gif",
\r
610 addicon:"row_add.gif",
\r
613 delicon:"row_delete.gif",
\r
616 searchicon:"find.gif",
\r
619 refreshicon:"refresh.gif",
\r
620 refreshstate: 'firstpage',
\r
623 closeicon: "ico-close.gif"
\r
624 }, $.jgrid.nav, o ||{});
\r
625 return this.each(function() {
\r
626 var alertIDs = {themodal:'alertmod',modalhead:'alerthd',modalcontent:'alertcnt'};
\r
628 if(!$t.grid) { return; }
\r
629 if ($("#"+alertIDs.themodal).html() == null) {
\r
632 if (typeof window.innerWidth != 'undefined') {
\r
633 vwidth = window.innerWidth,
\r
634 vheight = window.innerHeight
\r
635 } else if (typeof document.documentElement != 'undefined' && typeof document.documentElement.clientWidth != 'undefined' && document.documentElement.clientWidth != 0) {
\r
636 vwidth = document.documentElement.clientWidth,
\r
637 vheight = document.documentElement.clientHeight
\r
642 createModal(alertIDs,"<div>"+o.alerttext+"</div>",{imgpath:$t.p.imgpath,closeicon:o.closeicon,caption:o.alertcap,top:vheight/2-25,left:vwidth/2-100,width:200,height:50},$t.grid.hDiv,$t.grid.hDiv,true);
\r
643 DnRModal("#"+alertIDs.themodal,"#"+alertIDs.modalhead);
\r
645 var navTbl = $("<table cellspacing='0' cellpadding='0' border='0' class='navtable'><tbody></tbody></table>").height(20);
\r
646 var trd = document.createElement("tr");
\r
647 $(trd).addClass("nav-row");
\r
648 var imp = $t.p.imgpath;
\r
651 tbd = document.createElement("td");
\r
652 $(tbd).append(" ").css({border:"none",padding:"0px"});
\r
653 trd.appendChild(tbd);
\r
654 tbd = document.createElement("td");
\r
655 tbd.title = o.edittitle || "";
\r
656 $(tbd).append("<table cellspacing='0' cellpadding='0' border='0' class='tbutton'><tr><td><img src='"+imp+o.editicon+"'/></td><td valign='center'>"+o.edittext+" </td></tr></table>")
\r
657 .css("cursor","pointer")
\r
658 .addClass("nav-button")
\r
660 var sr = $($t).getGridParam('selrow');
\r
661 if (sr) { $($t).editGridRow(sr,pEdit || {}); }
\r
662 else { viewModal("#"+alertIDs.themodal); }
\r
665 .hover( function () {
\r
666 $(this).addClass("nav-hover");
\r
669 $(this).removeClass("nav-hover");
\r
672 trd.appendChild(tbd);
\r
676 tbd = document.createElement("td");
\r
677 $(tbd).append(" ").css({border:"none",padding:"0px"});
\r
678 trd.appendChild(tbd);
\r
679 tbd = document.createElement("td");
\r
680 tbd.title = o.addtitle || "";
\r
681 $(tbd).append("<table cellspacing='0' cellpadding='0' border='0' class='tbutton'><tr><td><img src='"+imp+o.addicon+"'/></td><td>"+o.addtext+" </td></tr></table>")
\r
682 .css("cursor","pointer")
\r
683 .addClass("nav-button")
\r
685 if (typeof o.addfunc == 'function') {
\r
688 $($t).editGridRow("new",pAdd || {});
\r
694 $(this).addClass("nav-hover");
\r
697 $(this).removeClass("nav-hover");
\r
700 trd.appendChild(tbd);
\r
704 tbd = document.createElement("td");
\r
705 $(tbd).append(" ").css({border:"none",padding:"0px"});
\r
706 trd.appendChild(tbd);
\r
707 tbd = document.createElement("td");
\r
708 tbd.title = o.deltitle || "";
\r
709 $(tbd).append("<table cellspacing='0' cellpadding='0' border='0' class='tbutton'><tr><td><img src='"+imp+o.delicon+"'/></td><td>"+o.deltext+" </td></tr></table>")
\r
710 .css("cursor","pointer")
\r
711 .addClass("nav-button")
\r
714 if($t.p.multiselect) {
\r
715 dr = $($t).getGridParam('selarrrow');
\r
716 if(dr.length==0) { dr = null; }
\r
718 dr = $($t).getGridParam('selrow');
\r
720 if (dr) { $($t).delGridRow(dr,pDel || {}); }
\r
721 else { viewModal("#"+alertIDs.themodal); }
\r
726 $(this).addClass("nav-hover");
\r
729 $(this).removeClass("nav-hover");
\r
732 trd.appendChild(tbd);
\r
736 tbd = document.createElement("td");
\r
737 $(tbd).append(" ").css({border:"none",padding:"0px"});
\r
738 trd.appendChild(tbd);
\r
739 tbd = document.createElement("td");
\r
740 if( $(elem)[0] == $t.p.pager[0] ) { pSearch = $.extend(pSearch,{dirty:true}); }
\r
741 tbd.title = o.searchtitle || "";
\r
742 $(tbd).append("<table cellspacing='0' cellpadding='0' border='0' class='tbutton'><tr><td class='no-dirty-cell'><img src='"+imp+o.searchicon+"'/></td><td>"+o.searchtext+" </td></tr></table>")
\r
743 .css({cursor:"pointer"})
\r
744 .addClass("nav-button")
\r
746 $($t).searchGrid(pSearch || {});
\r
751 $(this).addClass("nav-hover");
\r
754 $(this).removeClass("nav-hover");
\r
757 trd.appendChild(tbd);
\r
761 tbd = document.createElement("td");
\r
762 $(tbd).append(" ").css({border:"none",padding:"0px"});
\r
763 trd.appendChild(tbd);
\r
764 tbd = document.createElement("td");
\r
765 tbd.title = o.refreshtitle || "";
\r
766 var dirtycell = ($(elem)[0] == $t.p.pager[0] ) ? true : false;
\r
767 $(tbd).append("<table cellspacing='0' cellpadding='0' border='0' class='tbutton'><tr><td><img src='"+imp+o.refreshicon+"'/></td><td>"+o.refreshtext+" </td></tr></table>")
\r
768 .css("cursor","pointer")
\r
769 .addClass("nav-button")
\r
771 $t.p.search = false;
\r
772 switch (o.refreshstate) {
\r
775 $($t).trigger("reloadGrid");
\r
778 var sr = $t.p.multiselect===true ? selarrrow : $t.p.selrow;
\r
779 $($t).setGridParam({gridComplete: function() {
\r
780 if($t.p.multiselect===true) {
\r
782 for(var i=0;i<sr.length;i++){
\r
783 $($t).setSelection(sr[i]);
\r
788 $($t).setSelection(sr);
\r
792 $($t).trigger("reloadGrid");
\r
795 if (dirtycell) { $(".no-dirty-cell",$t.p.pager).removeClass("dirty-cell"); }
\r
797 var gID = $("table:first",$t.grid.bDiv).attr("id");
\r
798 $("#sval",'#srchcnt'+gID).val("");
\r
804 $(this).addClass("nav-hover");
\r
807 $(this).removeClass("nav-hover");
\r
810 trd.appendChild(tbd);
\r
813 if(o.position=="left") {
\r
814 $(navTbl).append(trd).addClass("nav-table-left");
\r
816 $(navTbl).append(trd).addClass("nav-table-right");
\r
818 $(elem).prepend(navTbl);
\r
821 navButtonAdd : function (elem, p) {
\r
823 caption : "newButton",
\r
826 onClickButton: null,
\r
829 return this.each(function() {
\r
830 if( !this.grid) { return; }
\r
831 if( elem.indexOf("#") != 0) { elem = "#"+elem; }
\r
832 var findnav = $(".navtable",elem)[0];
\r
835 var tbd1 = document.createElement("td");
\r
836 $(tbd1).append(" ").css({border:"none",padding:"0px"});
\r
837 var trd = $("tr:eq(0)",findnav)[0];
\r
838 if( p.position !='first' ) {
\r
839 trd.appendChild(tbd1);
\r
841 tbd = document.createElement("td");
\r
842 tbd.title = p.title;
\r
843 var im = (p.buttonimg) ? "<img src='"+p.buttonimg+"'/>" : " ";
\r
844 $(tbd).append("<table cellspacing='0' cellpadding='0' border='0' class='tbutton'><tr><td>"+im+"</td><td>"+p.caption+" </td></tr></table>")
\r
845 .css("cursor","pointer")
\r
846 .addClass("nav-button")
\r
847 .click(function(e){
\r
848 if (typeof p.onClickButton == 'function') { p.onClickButton(); }
\r
849 e.stopPropagation();
\r
854 $(this).addClass("nav-hover");
\r
857 $(this).removeClass("nav-hover");
\r
860 if(p.position != 'first') {
\r
861 trd.appendChild(tbd);
\r
863 $(trd).prepend(tbd);
\r
864 $(trd).prepend(tbd1);
\r
866 tbd=null;tbd1=null;
\r
870 GridToForm : function( rowid, formid ) {
\r
871 return this.each(function(){
\r
873 if (!$t.grid) { return; }
\r
874 var rowdata = $($t).getRowData(rowid);
\r
876 for(var i in rowdata) {
\r
877 if ( $("[name="+i+"]",formid).is("input:radio") ) {
\r
878 $("[name="+i+"]",formid).each( function() {
\r
879 if( $(this).val() == rowdata[i] ) {
\r
880 $(this).attr("checked","checked");
\r
882 $(this).attr("checked","");
\r
886 // this is very slow on big table and form.
\r
887 $("[name="+i+"]",formid).val(rowdata[i]);
\r
893 FormToGrid : function(rowid, formid){
\r
894 return this.each(function() {
\r
896 if(!$t.grid) { return; }
\r
897 var fields = $(formid).serializeArray();
\r
899 $.each(fields, function(i, field){
\r
900 griddata[field.name] = field.value;
\r
902 $($t).setRowData(rowid,griddata);
\r