123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496 |
- /*jshint eqeqeq:false */
- /*global jQuery */
- (function($){
- /*
- **
- * jqGrid extension for cellediting Grid Data
- * 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
- **/
- /**
- * all events and options here are aded anonynous and not in the base grid
- * since the array is to big. Here is the order of execution.
- * From this point we use jQuery isFunction
- * formatCell
- * beforeEditCell,
- * onSelectCell (used only for noneditable cels)
- * afterEditCell,
- * beforeSaveCell, (called before validation of values if any)
- * beforeSubmitCell (if cellsubmit remote (ajax))
- * afterSubmitCell(if cellsubmit remote (ajax)),
- * afterSaveCell,
- * errorCell,
- * serializeCellData - new
- * Options
- * cellsubmit (remote,clientArray) (added in grid options)
- * cellurl
- * ajaxCellOptions
- * */
- "use strict";
- $.jgrid.extend({
- editCell : function (iRow,iCol, ed){
- return this.each(function (){
- var $t = this, nm, tmp,cc, cm;
- if (!$t.grid || $t.p.cellEdit !== true) {return;}
- iCol = parseInt(iCol,10);
- // select the row that can be used for other methods
- $t.p.selrow = $t.rows[iRow].id;
- if (!$t.p.knv) {$($t).jqGrid("GridNav");}
- // check to see if we have already edited cell
- if ($t.p.savedRow.length>0) {
- // prevent second click on that field and enable selects
- if (ed===true ) {
- if(iRow == $t.p.iRow && iCol == $t.p.iCol){
- return;
- }
- }
- // save the cell
- $($t).jqGrid("saveCell",$t.p.savedRow[0].id,$t.p.savedRow[0].ic);
- } else {
- window.setTimeout(function () { $("#"+$.jgrid.jqID($t.p.knv)).attr("tabindex","-1").focus();},1);
- }
- cm = $t.p.colModel[iCol];
- nm = cm.name;
- if (nm==='subgrid' || nm==='cb' || nm==='rn') {return;}
- cc = $("td:eq("+iCol+")",$t.rows[iRow]);
- if (cm.editable===true && ed===true && !cc.hasClass("not-editable-cell")) {
- if(parseInt($t.p.iCol,10)>=0 && parseInt($t.p.iRow,10)>=0) {
- $("td:eq("+$t.p.iCol+")",$t.rows[$t.p.iRow]).removeClass("edit-cell ui-state-highlight");
- $($t.rows[$t.p.iRow]).removeClass("selected-row ui-state-hover");
- }
- $(cc).addClass("edit-cell ui-state-highlight");
- $($t.rows[iRow]).addClass("selected-row ui-state-hover");
- try {
- tmp = $.unformat.call($t,cc,{rowId: $t.rows[iRow].id, colModel:cm},iCol);
- } catch (_) {
- tmp = ( cm.edittype && cm.edittype === 'textarea' ) ? $(cc).text() : $(cc).html();
- }
- if($t.p.autoencode) { tmp = $.jgrid.htmlDecode(tmp); }
- if (!cm.edittype) {cm.edittype = "text";}
- $t.p.savedRow.push({id:iRow,ic:iCol,name:nm,v:tmp});
- if(tmp === " " || tmp === " " || (tmp.length===1 && tmp.charCodeAt(0)===160) ) {tmp='';}
- if($.isFunction($t.p.formatCell)) {
- var tmp2 = $t.p.formatCell.call($t, $t.rows[iRow].id,nm,tmp,iRow,iCol);
- if(tmp2 !== undefined ) {tmp = tmp2;}
- }
- $($t).triggerHandler("jqGridBeforeEditCell", [$t.rows[iRow].id, nm, tmp, iRow, iCol]);
- if ($.isFunction($t.p.beforeEditCell)) {
- $t.p.beforeEditCell.call($t, $t.rows[iRow].id,nm,tmp,iRow,iCol);
- }
- var opt = $.extend({}, cm.editoptions || {} ,{id:iRow+"_"+nm,name:nm,rowId: $t.rows[iRow].id});
- var elc = $.jgrid.createEl.call($t,cm.edittype,opt,tmp,true,$.extend({},$.jgrid.ajaxOptions,$t.p.ajaxSelectOptions || {}));
- $(cc).html("").append(elc).attr("tabindex","0");
- $.jgrid.bindEv.call($t, elc, opt);
- window.setTimeout(function () { $(elc).focus();},1);
- $("input, select, textarea",cc).bind("keydown",function(e) {
- if (e.keyCode === 27) {
- if($("input.hasDatepicker",cc).length >0) {
- if( $(".ui-datepicker").is(":hidden") ) { $($t).jqGrid("restoreCell",iRow,iCol); }
- else { $("input.hasDatepicker",cc).datepicker('hide'); }
- } else {
- $($t).jqGrid("restoreCell",iRow,iCol);
- }
- } //ESC
- if (e.keyCode === 13 && !e.shiftKey) {
- $($t).jqGrid("saveCell",iRow,iCol);
- // Prevent default action
- return false;
- } //Enter
- if (e.keyCode === 9) {
- if(!$t.grid.hDiv.loading ) {
- if (e.shiftKey) {$($t).jqGrid("prevCell",iRow,iCol);} //Shift TAb
- else {$($t).jqGrid("nextCell",iRow,iCol);} //Tab
- } else {
- return false;
- }
- }
- e.stopPropagation();
- });
- $($t).triggerHandler("jqGridAfterEditCell", [$t.rows[iRow].id, nm, tmp, iRow, iCol]);
- if ($.isFunction($t.p.afterEditCell)) {
- $t.p.afterEditCell.call($t, $t.rows[iRow].id,nm,tmp,iRow,iCol);
- }
- } else {
- if (parseInt($t.p.iCol,10)>=0 && parseInt($t.p.iRow,10)>=0) {
- $("td:eq("+$t.p.iCol+")",$t.rows[$t.p.iRow]).removeClass("edit-cell ui-state-highlight");
- $($t.rows[$t.p.iRow]).removeClass("selected-row ui-state-hover");
- }
- cc.addClass("edit-cell ui-state-highlight");
- $($t.rows[iRow]).addClass("selected-row ui-state-hover");
- tmp = cc.html().replace(/\ \;/ig,'');
- $($t).triggerHandler("jqGridSelectCell", [$t.rows[iRow].id, nm, tmp, iRow, iCol]);
- if ($.isFunction($t.p.onSelectCell)) {
- $t.p.onSelectCell.call($t, $t.rows[iRow].id,nm,tmp,iRow,iCol);
- }
- }
- $t.p.iCol = iCol; $t.p.iRow = iRow;
- });
- },
- saveCell : function (iRow, iCol){
- return this.each(function(){
- var $t= this, fr;
- if (!$t.grid || $t.p.cellEdit !== true) {return;}
- if ( $t.p.savedRow.length >= 1) {fr = 0;} else {fr=null;}
- if(fr !== null) {
- var cc = $("td:eq("+iCol+")",$t.rows[iRow]),v,v2,
- cm = $t.p.colModel[iCol], nm = cm.name, nmjq = $.jgrid.jqID(nm) ;
- switch (cm.edittype) {
- case "select":
- if(!cm.editoptions.multiple) {
- v = $("#"+iRow+"_"+nmjq+" option:selected",$t.rows[iRow]).val();
- v2 = $("#"+iRow+"_"+nmjq+" option:selected",$t.rows[iRow]).text();
- } else {
- var sel = $("#"+iRow+"_"+nmjq,$t.rows[iRow]), selectedText = [];
- v = $(sel).val();
- if(v) { v.join(",");} else { v=""; }
- $("option:selected",sel).each(
- function(i,selected){
- selectedText[i] = $(selected).text();
- }
- );
- v2 = selectedText.join(",");
- }
- if(cm.formatter) { v2 = v; }
- break;
- case "checkbox":
- var cbv = ["Yes","No"];
- if(cm.editoptions){
- cbv = cm.editoptions.value.split(":");
- }
- v = $("#"+iRow+"_"+nmjq,$t.rows[iRow]).is(":checked") ? cbv[0] : cbv[1];
- v2=v;
- break;
- case "password":
- case "text":
- case "textarea":
- case "button" :
- v = $("#"+iRow+"_"+nmjq,$t.rows[iRow]).val();
- v2=v;
- break;
- case 'custom' :
- try {
- if(cm.editoptions && $.isFunction(cm.editoptions.custom_value)) {
- v = cm.editoptions.custom_value.call($t, $(".customelement",cc),'get');
- if (v===undefined) { throw "e2";} else { v2=v; }
- } else { throw "e1"; }
- } catch (e) {
- if (e==="e1") { $.jgrid.info_dialog($.jgrid.errors.errcap,"function 'custom_value' "+$.jgrid.edit.msg.nodefined,$.jgrid.edit.bClose); }
- if (e==="e2") { $.jgrid.info_dialog($.jgrid.errors.errcap,"function 'custom_value' "+$.jgrid.edit.msg.novalue,$.jgrid.edit.bClose); }
- else {$.jgrid.info_dialog($.jgrid.errors.errcap,e.message,$.jgrid.edit.bClose); }
- }
- break;
- }
- // The common approach is if nothing changed do not do anything
- if (v2 !== $t.p.savedRow[fr].v){
- var vvv = $($t).triggerHandler("jqGridBeforeSaveCell", [$t.rows[iRow].id, nm, v, iRow, iCol]);
- if (vvv) {v = vvv; v2=vvv;}
- if ($.isFunction($t.p.beforeSaveCell)) {
- var vv = $t.p.beforeSaveCell.call($t, $t.rows[iRow].id,nm, v, iRow,iCol);
- if (vv) {v = vv; v2=vv;}
- }
- var cv = $.jgrid.checkValues.call($t,v,iCol);
- if(cv[0] === true) {
- var addpost = $($t).triggerHandler("jqGridBeforeSubmitCell", [$t.rows[iRow].id, nm, v, iRow, iCol]) || {};
- if ($.isFunction($t.p.beforeSubmitCell)) {
- addpost = $t.p.beforeSubmitCell.call($t, $t.rows[iRow].id,nm, v, iRow,iCol);
- if (!addpost) {addpost={};}
- }
- if( $("input.hasDatepicker",cc).length >0) { $("input.hasDatepicker",cc).datepicker('hide'); }
- if ($t.p.cellsubmit === 'remote') {
- if ($t.p.cellurl) {
- var postdata = {};
- if($t.p.autoencode) { v = $.jgrid.htmlEncode(v); }
- postdata[nm] = v;
- var idname,oper, opers;
- opers = $t.p.prmNames;
- idname = opers.id;
- oper = opers.oper;
- postdata[idname] = $.jgrid.stripPref($t.p.idPrefix, $t.rows[iRow].id);
- postdata[oper] = opers.editoper;
- postdata = $.extend(addpost,postdata);
- $($t).jqGrid("progressBar", {method:"show", loadtype : $t.p.loadui, htmlcontent: $.jgrid.defaults.savetext || "Saving..." });
- $t.grid.hDiv.loading = true;
- $.ajax( $.extend( {
- url: $t.p.cellurl,
- data :$.isFunction($t.p.serializeCellData) ? $t.p.serializeCellData.call($t, postdata) : postdata,
- type: "POST",
- complete: function (result, stat) {
- $($t).jqGrid("progressBar", {method:"hide", loadtype : $t.p.loadui });
- $t.grid.hDiv.loading = false;
- if (stat === 'success') {
- var ret = $($t).triggerHandler("jqGridAfterSubmitCell", [$t, result, postdata.id, nm, v, iRow, iCol]) || [true, ''];
- if (ret[0] === true && $.isFunction($t.p.afterSubmitCell)) {
- ret = $t.p.afterSubmitCell.call($t, result,postdata.id,nm,v,iRow,iCol);
- }
- if(ret[0] === true){
- $(cc).empty();
- $($t).jqGrid("setCell",$t.rows[iRow].id, iCol, v2, false, false, true);
- $(cc).addClass("dirty-cell");
- $($t.rows[iRow]).addClass("edited");
- $($t).triggerHandler("jqGridAfterSaveCell", [$t.rows[iRow].id, nm, v, iRow, iCol]);
- if ($.isFunction($t.p.afterSaveCell)) {
- $t.p.afterSaveCell.call($t, $t.rows[iRow].id,nm, v, iRow,iCol);
- }
- $t.p.savedRow.splice(0,1);
- } else {
- $.jgrid.info_dialog($.jgrid.errors.errcap,ret[1],$.jgrid.edit.bClose);
- $($t).jqGrid("restoreCell",iRow,iCol);
- }
- }
- },
- error:function(res,stat,err) {
- $("#lui_"+$.jgrid.jqID($t.p.id)).hide();
- $t.grid.hDiv.loading = false;
- $($t).triggerHandler("jqGridErrorCell", [res, stat, err]);
- if ($.isFunction($t.p.errorCell)) {
- $t.p.errorCell.call($t, res,stat,err);
- $($t).jqGrid("restoreCell",iRow,iCol);
- } else {
- $.jgrid.info_dialog($.jgrid.errors.errcap,res.status+" : "+res.statusText+"<br/>"+stat,$.jgrid.edit.bClose);
- $($t).jqGrid("restoreCell",iRow,iCol);
- }
- }
- }, $.jgrid.ajaxOptions, $t.p.ajaxCellOptions || {}));
- } else {
- try {
- $.jgrid.info_dialog($.jgrid.errors.errcap,$.jgrid.errors.nourl,$.jgrid.edit.bClose);
- $($t).jqGrid("restoreCell",iRow,iCol);
- } catch (e) {}
- }
- }
- if ($t.p.cellsubmit === 'clientArray') {
- $(cc).empty();
- $($t).jqGrid("setCell",$t.rows[iRow].id,iCol, v2, false, false, true);
- $(cc).addClass("dirty-cell");
- $($t.rows[iRow]).addClass("edited");
- $($t).triggerHandler("jqGridAfterSaveCell", [$t.rows[iRow].id, nm, v, iRow, iCol]);
- if ($.isFunction($t.p.afterSaveCell)) {
- $t.p.afterSaveCell.call($t, $t.rows[iRow].id,nm, v, iRow,iCol);
- }
- $t.p.savedRow.splice(0,1);
- }
- } else {
- try {
- window.setTimeout(function(){$.jgrid.info_dialog($.jgrid.errors.errcap,v+" "+cv[1],$.jgrid.edit.bClose);},100);
- $($t).jqGrid("restoreCell",iRow,iCol);
- } catch (e) {}
- }
- } else {
- $($t).jqGrid("restoreCell",iRow,iCol);
- }
- }
- window.setTimeout(function () { $("#"+$.jgrid.jqID($t.p.knv)).attr("tabindex","-1").focus();},0);
- });
- },
- restoreCell : function(iRow, iCol) {
- return this.each(function(){
- var $t= this, fr;
- if (!$t.grid || $t.p.cellEdit !== true ) {return;}
- if ( $t.p.savedRow.length >= 1) {fr = 0;} else {fr=null;}
- if(fr !== null) {
- var cc = $("td:eq("+iCol+")",$t.rows[iRow]);
- // datepicker fix
- if($.isFunction($.fn.datepicker)) {
- try {
- $("input.hasDatepicker",cc).datepicker('hide');
- } catch (e) {}
- }
- $(cc).empty().attr("tabindex","-1");
- $($t).jqGrid("setCell",$t.rows[iRow].id, iCol, $t.p.savedRow[fr].v, false, false, true);
- $($t).triggerHandler("jqGridAfterRestoreCell", [$t.rows[iRow].id, $t.p.savedRow[fr].v, iRow, iCol]);
- if ($.isFunction($t.p.afterRestoreCell)) {
- $t.p.afterRestoreCell.call($t, $t.rows[iRow].id, $t.p.savedRow[fr].v, iRow, iCol);
- }
- $t.p.savedRow.splice(0,1);
- }
- window.setTimeout(function () { $("#"+$t.p.knv).attr("tabindex","-1").focus();},0);
- });
- },
- nextCell : function (iRow,iCol) {
- return this.each(function (){
- var $t = this, nCol=false, i;
- if (!$t.grid || $t.p.cellEdit !== true) {return;}
- // try to find next editable cell
- for (i=iCol+1; i<$t.p.colModel.length; i++) {
- if ( $t.p.colModel[i].editable ===true) {
- nCol = i; break;
- }
- }
- if(nCol !== false) {
- $($t).jqGrid("editCell",iRow,nCol,true);
- } else {
- if ($t.p.savedRow.length >0) {
- $($t).jqGrid("saveCell",iRow,iCol);
- }
- }
- });
- },
- prevCell : function (iRow,iCol) {
- return this.each(function (){
- var $t = this, nCol=false, i;
- if (!$t.grid || $t.p.cellEdit !== true) {return;}
- // try to find next editable cell
- for (i=iCol-1; i>=0; i--) {
- if ( $t.p.colModel[i].editable ===true) {
- nCol = i; break;
- }
- }
- if(nCol !== false) {
- $($t).jqGrid("editCell",iRow,nCol,true);
- } else {
- if ($t.p.savedRow.length >0) {
- $($t).jqGrid("saveCell",iRow,iCol);
- }
- }
- });
- },
- GridNav : function() {
- return this.each(function () {
- var $t = this;
- if (!$t.grid || $t.p.cellEdit !== true ) {return;}
- // trick to process keydown on non input elements
- $t.p.knv = $t.p.id + "_kn";
- var selection = $("<div style='position:fixed;top:0px;width:1px;height:1px;' tabindex='0'><div tabindex='-1' style='width:1px;height:1px;' id='"+$t.p.knv+"'></div></div>"),
- i, kdir;
- function scrollGrid(iR, iC, tp){
- if (tp.substr(0,1)==='v') {
- var ch = $($t.grid.bDiv)[0].clientHeight,
- st = $($t.grid.bDiv)[0].scrollTop,
- nROT = $t.rows[iR].offsetTop+$t.rows[iR].clientHeight,
- pROT = $t.rows[iR].offsetTop;
- if(tp === 'vd') {
- if(nROT >= ch) {
- $($t.grid.bDiv)[0].scrollTop = $($t.grid.bDiv)[0].scrollTop + $t.rows[iR].clientHeight;
- }
- }
- if(tp === 'vu'){
- if (pROT < st ) {
- $($t.grid.bDiv)[0].scrollTop = $($t.grid.bDiv)[0].scrollTop - $t.rows[iR].clientHeight;
- }
- }
- }
- if(tp==='h') {
- var cw = $($t.grid.bDiv)[0].clientWidth,
- sl = $($t.grid.bDiv)[0].scrollLeft,
- nCOL = $t.rows[iR].cells[iC].offsetLeft+$t.rows[iR].cells[iC].clientWidth,
- pCOL = $t.rows[iR].cells[iC].offsetLeft;
- if(nCOL >= cw+parseInt(sl,10)) {
- $($t.grid.bDiv)[0].scrollLeft = $($t.grid.bDiv)[0].scrollLeft + $t.rows[iR].cells[iC].clientWidth;
- } else if (pCOL < sl) {
- $($t.grid.bDiv)[0].scrollLeft = $($t.grid.bDiv)[0].scrollLeft - $t.rows[iR].cells[iC].clientWidth;
- }
- }
- }
- function findNextVisible(iC,act){
- var ind, i;
- if(act === 'lft') {
- ind = iC+1;
- for (i=iC;i>=0;i--){
- if ($t.p.colModel[i].hidden !== true) {
- ind = i;
- break;
- }
- }
- }
- if(act === 'rgt') {
- ind = iC-1;
- for (i=iC; i<$t.p.colModel.length;i++){
- if ($t.p.colModel[i].hidden !== true) {
- ind = i;
- break;
- }
- }
- }
- return ind;
- }
- $(selection).insertBefore($t.grid.cDiv);
- $("#"+$t.p.knv)
- .focus()
- .keydown(function (e){
- kdir = e.keyCode;
- if($t.p.direction === "rtl") {
- if(kdir===37) { kdir = 39;}
- else if (kdir===39) { kdir = 37; }
- }
- switch (kdir) {
- case 38:
- if ($t.p.iRow-1 >0 ) {
- scrollGrid($t.p.iRow-1,$t.p.iCol,'vu');
- $($t).jqGrid("editCell",$t.p.iRow-1,$t.p.iCol,false);
- }
- break;
- case 40 :
- if ($t.p.iRow+1 <= $t.rows.length-1) {
- scrollGrid($t.p.iRow+1,$t.p.iCol,'vd');
- $($t).jqGrid("editCell",$t.p.iRow+1,$t.p.iCol,false);
- }
- break;
- case 37 :
- if ($t.p.iCol -1 >= 0) {
- i = findNextVisible($t.p.iCol-1,'lft');
- scrollGrid($t.p.iRow, i,'h');
- $($t).jqGrid("editCell",$t.p.iRow, i,false);
- }
- break;
- case 39 :
- if ($t.p.iCol +1 <= $t.p.colModel.length-1) {
- i = findNextVisible($t.p.iCol+1,'rgt');
- scrollGrid($t.p.iRow,i,'h');
- $($t).jqGrid("editCell",$t.p.iRow,i,false);
- }
- break;
- case 13:
- if (parseInt($t.p.iCol,10)>=0 && parseInt($t.p.iRow,10)>=0) {
- $($t).jqGrid("editCell",$t.p.iRow,$t.p.iCol,true);
- }
- break;
- default :
- return true;
- }
- return false;
- });
- });
- },
- getChangedCells : function (mthd) {
- var ret=[];
- if (!mthd) {mthd='all';}
- this.each(function(){
- var $t= this,nm;
- if (!$t.grid || $t.p.cellEdit !== true ) {return;}
- $($t.rows).each(function(j){
- var res = {};
- if ($(this).hasClass("edited")) {
- $('td',this).each( function(i) {
- nm = $t.p.colModel[i].name;
- if ( nm !== 'cb' && nm !== 'subgrid') {
- if (mthd==='dirty') {
- if ($(this).hasClass('dirty-cell')) {
- try {
- res[nm] = $.unformat.call($t,this,{rowId:$t.rows[j].id, colModel:$t.p.colModel[i]},i);
- } catch (e){
- res[nm] = $.jgrid.htmlDecode($(this).html());
- }
- }
- } else {
- try {
- res[nm] = $.unformat.call($t,this,{rowId:$t.rows[j].id,colModel:$t.p.colModel[i]},i);
- } catch (e) {
- res[nm] = $.jgrid.htmlDecode($(this).html());
- }
- }
- }
- });
- res.id = this.id;
- ret.push(res);
- }
- });
- });
- return ret;
- }
- /// end cell editing
- });
- })(jQuery);
|