123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467 |
- /*
- **
- * formatter for values but most of the values if for jqGrid
- * Some of this was inspired and based on how YUI does the table datagrid but in jQuery fashion
- * we are trying to keep it as light as possible
- * Joshua Burnett josh@9ci.com
- * http://www.greenbill.com
- *
- * Changes from Tony Tomov tony@trirand.com
- * 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
- *
- **/
- /*jshint eqeqeq:false */
- /*global jQuery */
- (function($) {
- "use strict";
- $.fmatter = {};
- //opts can be id:row id for the row, rowdata:the data for the row, colmodel:the column model for this column
- //example {id:1234,}
- $.extend($.fmatter,{
- isBoolean : function(o) {
- return typeof o === 'boolean';
- },
- isObject : function(o) {
- return (o && (typeof o === 'object' || $.isFunction(o))) || false;
- },
- isString : function(o) {
- return typeof o === 'string';
- },
- isNumber : function(o) {
- return typeof o === 'number' && isFinite(o);
- },
- isValue : function (o) {
- return (this.isObject(o) || this.isString(o) || this.isNumber(o) || this.isBoolean(o));
- },
- isEmpty : function(o) {
- if(!this.isString(o) && this.isValue(o)) {
- return false;
- }
- if (!this.isValue(o)){
- return true;
- }
- o = $.trim(o).replace(/\ \;/ig,'').replace(/\ \;/ig,'');
- return o==="";
- }
- });
- $.fn.fmatter = function(formatType, cellval, opts, rwd, act) {
- // build main options before element iteration
- var v=cellval;
- opts = $.extend({}, $.jgrid.formatter, opts);
- try {
- v = $.fn.fmatter[formatType].call(this, cellval, opts, rwd, act);
- } catch(fe){}
- return v;
- };
- $.fmatter.util = {
- // Taken from YAHOO utils
- NumberFormat : function(nData,opts) {
- if(!$.fmatter.isNumber(nData)) {
- nData *= 1;
- }
- if($.fmatter.isNumber(nData)) {
- var bNegative = (nData < 0);
- var sOutput = String(nData);
- var sDecimalSeparator = opts.decimalSeparator || ".";
- var nDotIndex;
- if($.fmatter.isNumber(opts.decimalPlaces)) {
- // Round to the correct decimal place
- var nDecimalPlaces = opts.decimalPlaces;
- var nDecimal = Math.pow(10, nDecimalPlaces);
- sOutput = String(Math.round(nData*nDecimal)/nDecimal);
- nDotIndex = sOutput.lastIndexOf(".");
- if(nDecimalPlaces > 0) {
- // Add the decimal separator
- if(nDotIndex < 0) {
- sOutput += sDecimalSeparator;
- nDotIndex = sOutput.length-1;
- }
- // Replace the "."
- else if(sDecimalSeparator !== "."){
- sOutput = sOutput.replace(".",sDecimalSeparator);
- }
- // Add missing zeros
- while((sOutput.length - 1 - nDotIndex) < nDecimalPlaces) {
- sOutput += "0";
- }
- }
- }
- if(opts.thousandsSeparator) {
- var sThousandsSeparator = opts.thousandsSeparator;
- nDotIndex = sOutput.lastIndexOf(sDecimalSeparator);
- nDotIndex = (nDotIndex > -1) ? nDotIndex : sOutput.length;
- var sNewOutput = sOutput.substring(nDotIndex);
- var nCount = -1, i;
- for (i=nDotIndex; i>0; i--) {
- nCount++;
- if ((nCount%3 === 0) && (i !== nDotIndex) && (!bNegative || (i > 1))) {
- sNewOutput = sThousandsSeparator + sNewOutput;
- }
- sNewOutput = sOutput.charAt(i-1) + sNewOutput;
- }
- sOutput = sNewOutput;
- }
- // Prepend prefix
- sOutput = (opts.prefix) ? opts.prefix + sOutput : sOutput;
- // Append suffix
- sOutput = (opts.suffix) ? sOutput + opts.suffix : sOutput;
- return sOutput;
-
- }
- return nData;
- }
- };
- $.fn.fmatter.defaultFormat = function(cellval, opts) {
- return ($.fmatter.isValue(cellval) && cellval!=="" ) ? cellval : opts.defaultValue || " ";
- };
- $.fn.fmatter.email = function(cellval, opts) {
- if(!$.fmatter.isEmpty(cellval)) {
- return "<a href=\"mailto:" + cellval + "\">" + cellval + "</a>";
- }
- return $.fn.fmatter.defaultFormat(cellval,opts );
- };
- $.fn.fmatter.checkbox =function(cval, opts) {
- var op = $.extend({},opts.checkbox), ds;
- if(opts.colModel !== undefined && opts.colModel.formatoptions !== undefined) {
- op = $.extend({},op,opts.colModel.formatoptions);
- }
- if(op.disabled===true) {ds = "disabled=\"disabled\"";} else {ds="";}
- if($.fmatter.isEmpty(cval) || cval === undefined ) {cval = $.fn.fmatter.defaultFormat(cval,op);}
- cval=String(cval);
- cval=(cval+"").toLowerCase();
- var bchk = cval.search(/(false|f|0|no|n|off|undefined)/i)<0 ? " checked='checked' " : "";
- return "<input type=\"checkbox\" " + bchk + " value=\""+ cval+"\" offval=\"no\" "+ds+ "/>";
- };
- $.fn.fmatter.link = function(cellval, opts) {
- var op = {target:opts.target};
- var target = "";
- if(opts.colModel !== undefined && opts.colModel.formatoptions !== undefined) {
- op = $.extend({},op,opts.colModel.formatoptions);
- }
- if(op.target) {target = 'target=' + op.target;}
- if(!$.fmatter.isEmpty(cellval)) {
- return "<a "+target+" href=\"" + cellval + "\">" + cellval + "</a>";
- }
- return $.fn.fmatter.defaultFormat(cellval,opts);
- };
- $.fn.fmatter.showlink = function(cellval, opts) {
- var op = {baseLinkUrl: opts.baseLinkUrl,showAction:opts.showAction, addParam: opts.addParam || "", target: opts.target, idName: opts.idName},
- target = "", idUrl;
- if(opts.colModel !== undefined && opts.colModel.formatoptions !== undefined) {
- op = $.extend({},op,opts.colModel.formatoptions);
- }
- if(op.target) {target = 'target=' + op.target;}
- idUrl = op.baseLinkUrl+op.showAction + '?'+ op.idName+'='+opts.rowId+op.addParam;
- if($.fmatter.isString(cellval) || $.fmatter.isNumber(cellval)) { //add this one even if its blank string
- return "<a "+target+" href=\"" + idUrl + "\">" + cellval + "</a>";
- }
- return $.fn.fmatter.defaultFormat(cellval,opts);
- };
- $.fn.fmatter.integer = function(cellval, opts) {
- var op = $.extend({},opts.integer);
- if(opts.colModel !== undefined && opts.colModel.formatoptions !== undefined) {
- op = $.extend({},op,opts.colModel.formatoptions);
- }
- if($.fmatter.isEmpty(cellval)) {
- return op.defaultValue;
- }
- return $.fmatter.util.NumberFormat(cellval,op);
- };
- $.fn.fmatter.number = function (cellval, opts) {
- var op = $.extend({},opts.number);
- if(opts.colModel !== undefined && opts.colModel.formatoptions !== undefined) {
- op = $.extend({},op,opts.colModel.formatoptions);
- }
- if($.fmatter.isEmpty(cellval)) {
- return op.defaultValue;
- }
- return $.fmatter.util.NumberFormat(cellval,op);
- };
- $.fn.fmatter.currency = function (cellval, opts) {
- var op = $.extend({},opts.currency);
- if(opts.colModel !== undefined && opts.colModel.formatoptions !== undefined) {
- op = $.extend({},op,opts.colModel.formatoptions);
- }
- if($.fmatter.isEmpty(cellval)) {
- return op.defaultValue;
- }
- return $.fmatter.util.NumberFormat(cellval,op);
- };
- $.fn.fmatter.date = function (cellval, opts, rwd, act) {
- var op = $.extend({},opts.date);
- if(opts.colModel !== undefined && opts.colModel.formatoptions !== undefined) {
- op = $.extend({},op,opts.colModel.formatoptions);
- }
- if(!op.reformatAfterEdit && act === 'edit'){
- return $.fn.fmatter.defaultFormat(cellval, opts);
- }
- if(!$.fmatter.isEmpty(cellval)) {
- return $.jgrid.parseDate(op.srcformat,cellval,op.newformat,op);
- }
- return $.fn.fmatter.defaultFormat(cellval, opts);
- };
- $.fn.fmatter.select = function (cellval,opts) {
- // jqGrid specific
- cellval = String(cellval);
- var oSelect = false, ret=[], sep, delim;
- if(opts.colModel.formatoptions !== undefined){
- oSelect= opts.colModel.formatoptions.value;
- sep = opts.colModel.formatoptions.separator === undefined ? ":" : opts.colModel.formatoptions.separator;
- delim = opts.colModel.formatoptions.delimiter === undefined ? ";" : opts.colModel.formatoptions.delimiter;
- } else if(opts.colModel.editoptions !== undefined){
- oSelect= opts.colModel.editoptions.value;
- sep = opts.colModel.editoptions.separator === undefined ? ":" : opts.colModel.editoptions.separator;
- delim = opts.colModel.editoptions.delimiter === undefined ? ";" : opts.colModel.editoptions.delimiter;
- }
- if (oSelect) {
- var msl = (opts.colModel.editoptions != null && opts.colModel.editoptions.multiple === true) === true ? true : false,
- scell = [], sv;
- if(msl) {scell = cellval.split(",");scell = $.map(scell,function(n){return $.trim(n);});}
- if ($.fmatter.isString(oSelect)) {
- // mybe here we can use some caching with care ????
- var so = oSelect.split(delim), j=0, i;
- for(i=0; i<so.length;i++){
- sv = so[i].split(sep);
- if(sv.length > 2 ) {
- sv[1] = $.map(sv,function(n,i){if(i>0) {return n;}}).join(sep);
- }
- if(msl) {
- if($.inArray(sv[0],scell)>-1) {
- ret[j] = sv[1];
- j++;
- }
- } else if($.trim(sv[0]) === $.trim(cellval)) {
- ret[0] = sv[1];
- break;
- }
- }
- } else if($.fmatter.isObject(oSelect)) {
- // this is quicker
- if(msl) {
- ret = $.map(scell, function(n){
- return oSelect[n];
- });
- } else {
- ret[0] = oSelect[cellval] || "";
- }
- }
- }
- cellval = ret.join(", ");
- return cellval === "" ? $.fn.fmatter.defaultFormat(cellval,opts) : cellval;
- };
- $.fn.fmatter.rowactions = function(act) {
- var $tr = $(this).closest("tr.jqgrow"),
- rid = $tr.attr("id"),
- $id = $(this).closest("table.ui-jqgrid-btable").attr('id').replace(/_frozen([^_]*)$/,'$1'),
- $grid = $("#"+$id),
- $t = $grid[0],
- p = $t.p,
- cm = p.colModel[$.jgrid.getCellIndex(this)],
- $actionsDiv = cm.frozen ? $("tr#"+rid+" td:eq("+$.jgrid.getCellIndex(this)+") > div",$grid) :$(this).parent(),
- op = {
- extraparam: {}
- },
- saverow = function(rowid, res) {
- if($.isFunction(op.afterSave)) { op.afterSave.call($t, rowid, res); }
- $actionsDiv.find("div.ui-inline-edit,div.ui-inline-del").show();
- $actionsDiv.find("div.ui-inline-save,div.ui-inline-cancel").hide();
- },
- restorerow = function(rowid) {
- if($.isFunction(op.afterRestore)) { op.afterRestore.call($t, rowid); }
- $actionsDiv.find("div.ui-inline-edit,div.ui-inline-del").show();
- $actionsDiv.find("div.ui-inline-save,div.ui-inline-cancel").hide();
- };
- if (cm.formatoptions !== undefined) {
- op = $.extend(op,cm.formatoptions);
- }
- if (p.editOptions !== undefined) {
- op.editOptions = p.editOptions;
- }
- if (p.delOptions !== undefined) {
- op.delOptions = p.delOptions;
- }
- if ($tr.hasClass("jqgrid-new-row")){
- op.extraparam[p.prmNames.oper] = p.prmNames.addoper;
- }
- var actop = {
- keys: op.keys,
- oneditfunc: op.onEdit,
- successfunc: op.onSuccess,
- url: op.url,
- extraparam: op.extraparam,
- aftersavefunc: saverow,
- errorfunc: op.onError,
- afterrestorefunc: restorerow,
- restoreAfterError: op.restoreAfterError,
- mtype: op.mtype
- };
- switch(act)
- {
- case 'edit':
- $grid.jqGrid('editRow', rid, actop);
- $actionsDiv.find("div.ui-inline-edit,div.ui-inline-del").hide();
- $actionsDiv.find("div.ui-inline-save,div.ui-inline-cancel").show();
- $grid.triggerHandler("jqGridAfterGridComplete");
- break;
- case 'save':
- if ($grid.jqGrid('saveRow', rid, actop)) {
- $actionsDiv.find("div.ui-inline-edit,div.ui-inline-del").show();
- $actionsDiv.find("div.ui-inline-save,div.ui-inline-cancel").hide();
- $grid.triggerHandler("jqGridAfterGridComplete");
- }
- break;
- case 'cancel' :
- $grid.jqGrid('restoreRow', rid, restorerow);
- $actionsDiv.find("div.ui-inline-edit,div.ui-inline-del").show();
- $actionsDiv.find("div.ui-inline-save,div.ui-inline-cancel").hide();
- $grid.triggerHandler("jqGridAfterGridComplete");
- break;
- case 'del':
- $grid.jqGrid('delGridRow', rid, op.delOptions);
- break;
- case 'formedit':
- $grid.jqGrid('setSelection', rid);
- $grid.jqGrid('editGridRow', rid, op.editOptions);
- break;
- }
- };
- $.fn.fmatter.actions = function(cellval,opts) {
- var op={keys:false, editbutton:true, delbutton:true, editformbutton: false},
- rowid=opts.rowId, str="",ocl;
- if(opts.colModel.formatoptions !== undefined) {
- op = $.extend(op,opts.colModel.formatoptions);
- }
- if(rowid === undefined || $.fmatter.isEmpty(rowid)) {return "";}
- if(op.editformbutton){
- ocl = "id='jEditButton_"+rowid+"' onclick=jQuery.fn.fmatter.rowactions.call(this,'formedit'); onmouseover=jQuery(this).addClass('ui-state-hover'); onmouseout=jQuery(this).removeClass('ui-state-hover'); ";
- str += "<div title='"+$.jgrid.nav.edittitle+"' style='float:left;cursor:pointer;' class='ui-pg-div ui-inline-edit' "+ocl+"><span class='ui-icon ui-icon-pencil'></span></div>";
- } else if(op.editbutton){
- ocl = "id='jEditButton_"+rowid+"' onclick=jQuery.fn.fmatter.rowactions.call(this,'edit'); onmouseover=jQuery(this).addClass('ui-state-hover'); onmouseout=jQuery(this).removeClass('ui-state-hover') ";
- str += "<div title='"+$.jgrid.nav.edittitle+"' style='float:left;cursor:pointer;' class='ui-pg-div ui-inline-edit' "+ocl+"><span class='ui-icon ui-icon-pencil'></span></div>";
- }
- if(op.delbutton) {
- ocl = "id='jDeleteButton_"+rowid+"' onclick=jQuery.fn.fmatter.rowactions.call(this,'del'); onmouseover=jQuery(this).addClass('ui-state-hover'); onmouseout=jQuery(this).removeClass('ui-state-hover'); ";
- str += "<div title='"+$.jgrid.nav.deltitle+"' style='float:left;margin-left:5px;' class='ui-pg-div ui-inline-del' "+ocl+"><span class='ui-icon ui-icon-trash'></span></div>";
- }
- ocl = "id='jSaveButton_"+rowid+"' onclick=jQuery.fn.fmatter.rowactions.call(this,'save'); onmouseover=jQuery(this).addClass('ui-state-hover'); onmouseout=jQuery(this).removeClass('ui-state-hover'); ";
- str += "<div title='"+$.jgrid.edit.bSubmit+"' style='float:left;display:none' class='ui-pg-div ui-inline-save' "+ocl+"><span class='ui-icon ui-icon-disk'></span></div>";
- ocl = "id='jCancelButton_"+rowid+"' onclick=jQuery.fn.fmatter.rowactions.call(this,'cancel'); onmouseover=jQuery(this).addClass('ui-state-hover'); onmouseout=jQuery(this).removeClass('ui-state-hover'); ";
- str += "<div title='"+$.jgrid.edit.bCancel+"' style='float:left;display:none;margin-left:5px;' class='ui-pg-div ui-inline-cancel' "+ocl+"><span class='ui-icon ui-icon-cancel'></span></div>";
- return "<div style='margin-left:8px;'>" + str + "</div>";
- };
- $.unformat = function (cellval,options,pos,cnt) {
- // specific for jqGrid only
- var ret, formatType = options.colModel.formatter,
- op =options.colModel.formatoptions || {}, sep,
- re = /([\.\*\_\'\(\)\{\}\+\?\\])/g,
- unformatFunc = options.colModel.unformat||($.fn.fmatter[formatType] && $.fn.fmatter[formatType].unformat);
- if(unformatFunc !== undefined && $.isFunction(unformatFunc) ) {
- ret = unformatFunc.call(this, $(cellval).text(), options, cellval);
- } else if(formatType !== undefined && $.fmatter.isString(formatType) ) {
- var opts = $.jgrid.formatter || {}, stripTag;
- switch(formatType) {
- case 'integer' :
- op = $.extend({},opts.integer,op);
- sep = op.thousandsSeparator.replace(re,"\\$1");
- stripTag = new RegExp(sep, "g");
- ret = $(cellval).text().replace(stripTag,'');
- break;
- case 'number' :
- op = $.extend({},opts.number,op);
- sep = op.thousandsSeparator.replace(re,"\\$1");
- stripTag = new RegExp(sep, "g");
- ret = $(cellval).text().replace(stripTag,"").replace(op.decimalSeparator,'.');
- break;
- case 'currency':
- op = $.extend({},opts.currency,op);
- sep = op.thousandsSeparator.replace(re,"\\$1");
- stripTag = new RegExp(sep, "g");
- ret = $(cellval).text();
- if (op.prefix && op.prefix.length) {
- ret = ret.substr(op.prefix.length);
- }
- if (op.suffix && op.suffix.length) {
- ret = ret.substr(0, ret.length - op.suffix.length);
- }
- ret = ret.replace(stripTag,'').replace(op.decimalSeparator,'.');
- break;
- case 'checkbox':
- var cbv = (options.colModel.editoptions) ? options.colModel.editoptions.value.split(":") : ["Yes","No"];
- ret = $('input',cellval).is(":checked") ? cbv[0] : cbv[1];
- break;
- case 'select' :
- ret = $.unformat.select(cellval,options,pos,cnt);
- break;
- case 'actions':
- return "";
- default:
- ret= $(cellval).text();
- }
- }
- return ret !== undefined ? ret : cnt===true ? $(cellval).text() : $.jgrid.htmlDecode($(cellval).html());
- };
- $.unformat.select = function (cellval,options,pos,cnt) {
- // Spacial case when we have local data and perform a sort
- // cnt is set to true only in sortDataArray
- var ret = [];
- var cell = $(cellval).text();
- if(cnt===true) {return cell;}
- var op = $.extend({}, options.colModel.formatoptions !== undefined ? options.colModel.formatoptions: options.colModel.editoptions),
- sep = op.separator === undefined ? ":" : op.separator,
- delim = op.delimiter === undefined ? ";" : op.delimiter;
-
- if(op.value){
- var oSelect = op.value,
- msl = op.multiple === true ? true : false,
- scell = [], sv;
- if(msl) {scell = cell.split(",");scell = $.map(scell,function(n){return $.trim(n);});}
- if ($.fmatter.isString(oSelect)) {
- var so = oSelect.split(delim), j=0, i;
- for(i=0; i<so.length;i++){
- sv = so[i].split(sep);
- if(sv.length > 2 ) {
- sv[1] = $.map(sv,function(n,i){if(i>0) {return n;}}).join(sep);
- }
- if(msl) {
- if($.inArray(sv[1],scell)>-1) {
- ret[j] = sv[0];
- j++;
- }
- } else if($.trim(sv[1]) === $.trim(cell)) {
- ret[0] = sv[0];
- break;
- }
- }
- } else if($.fmatter.isObject(oSelect) || $.isArray(oSelect) ){
- if(!msl) {scell[0] = cell;}
- ret = $.map(scell, function(n){
- var rv;
- $.each(oSelect, function(i,val){
- if (val === n) {
- rv = i;
- return false;
- }
- });
- if( rv !== undefined ) {return rv;}
- });
- }
- return ret.join(", ");
- }
- return cell || "";
- };
- $.unformat.date = function (cellval, opts) {
- var op = $.jgrid.formatter.date || {};
- if(opts.formatoptions !== undefined) {
- op = $.extend({},op,opts.formatoptions);
- }
- if(!$.fmatter.isEmpty(cellval)) {
- return $.jgrid.parseDate(op.newformat,cellval,op.srcformat,op);
- }
- return $.fn.fmatter.defaultFormat(cellval, opts);
- };
- })(jQuery);
|