12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061 |
- /**
- * 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
- * Changed by Oleg Kiriljuk, oleg.kiriljuk@ok-soft-gmbh.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 */
- /*jslint
- browser, devel, for, multivar, this, white
- */
- /*global jQuery, define, exports, module, require */
- (function (factory) {
- "use strict";
- if (typeof define === "function" && define.amd) {
- // AMD. Register as an anonymous module.
- //console.log("jquery.fmatter AMD");
- define([
- "jquery",
- "./grid.base"
- ], function ($) {
- //console.log("jquery.fmatter AMD: define callback");
- return factory($);
- });
- } else if (typeof module === "object" && module.exports) {
- // Node/CommonJS
- //console.log("jquery.fmatter CommonJS");
- module.exports = function (root, $) {
- //console.log("jquery.fmatter CommonJS: in module.exports");
- if (!root) {
- root = window;
- }
- //console.log("jquery.fmatter CommonJS: before require('jquery')");
- if ($ === undefined) {
- // require("jquery") returns a factory that requires window to
- // build a jQuery instance, we normalize how we use modules
- // that require this pattern but the window provided is a noop
- // if it's defined (how jquery works)
- $ = typeof window !== "undefined" ?
- require("jquery") :
- require("jquery")(root);
- }
- //console.log("jquery.fmatter CommonJS: before require('./grid.base')");
- require("./grid.base");
- //console.log("jquery.fmatter CommonJS: before factory");
- factory($);
- return $;
- };
- } else {
- // Browser globals
- //console.log("jquery.fmatter Browser: before factory");
- factory(jQuery);
- }
- }(function ($) {
- "use strict";
- $.jgrid = $.jgrid || {};
- var jgrid = $.jgrid, getGridRes = jgrid.getMethod("getGridRes"), base = $.fn.jqGrid;
- // begin module jquery.fmatter
- $.fmatter = $.fmatter || {};
- var fmatter = $.fmatter,
- getOptionByName = function (colModel, name) {
- var option = colModel.formatoptions || {};
- if (option.hasOwnProperty(name)) {
- return option[name];
- } else {
- return (colModel.editoptions || {})[name];
- }
- },
- encodeAttr = function (v) {
- return String(v).replace(/\'/g, "'");
- },
- parseCheckboxOptions = function (options) {
- var colModel = options.colModel || options.cm, checked, unchecked,
- title = colModel.title !== false ?
- " title='" + encodeAttr(options.colName || colModel.name) + "'" :
- "",
- getOption = function (name) {
- return getOptionByName(colModel, name);
- },
- checkedClasses = getOption("checkedClass"),
- uncheckedClasses = getOption("uncheckedClass"),
- value = getOption("value"),
- yes = typeof value === "string" ? (value.split(":")[0] || "Yes") : "Yes",
- no = typeof value === "string" ? (value.split(":")[1] || "No") : "No",
- buildCheckbox = function (classes) {
- return "<i class='" + encodeAttr(classes) + "'" + title + "></i>";
- },
- disabled = getOption("disabled");
- if (disabled === undefined) {
- disabled = jgrid.formatter.checkbox.disabled;
- }
- var checkedIcon = base.getIconRes.call(this, "checkbox.checked"),
- checkedIconClasses = base.getIconRes.call(this, "checkbox.checkedClasses"),
- uncheckedIcon = base.getIconRes.call(this, "checkbox.unchecked");
- if (disabled === true && (checkedClasses || uncheckedClasses || checkedIcon || uncheckedIcon)) {
- checked = buildCheckbox(checkedClasses || checkedIcon);
- unchecked = buildCheckbox(uncheckedClasses || uncheckedIcon);
- checkedClasses = checkedIconClasses ? checkedIconClasses : checkedClasses || checkedIcon;
- } else {
- checkedClasses = "";
- title += disabled === true ? " disabled='disabled'" : "";
- checked = "<input type='checkbox' checked='checked'" + title + " />";
- unchecked = "<input type='checkbox'" + title + " />";
- }
- return {
- checkedClasses: checkedClasses,
- checked: checked,
- unchecked: unchecked,
- yes: yes,
- no: no
- };
- },
- // http://jsperf.com/regex-vs-indexof-vs-in/12
- /*yesObject = Object.create(null, {
- 1: { value: 1 },
- x: { value: 1 },
- "true": { value: 1 },
- yes: { value: 1 },
- on: { value: 1 }
- }),
- noObject = Object.create(null, {
- 0: { value: 1 },
- "false": { value: 1 },
- no: { value: 1 },
- off: { value: 1 }
- });*/
- // one can use typeof Object.create != "function" and use either
- // Object.create or simple object firm, but the performance differences
- // are so low, that the compatibility to IE8 is more important
- yesObject = { 1: 1, x: 1, "true": 1, yes: 1, y: 1, on: 1 },
- noObject = { 0: 1, "false": 1, no: 1, n: 1, off: 1 };
- $.extend(true, jgrid, {
- formatter: { // setting common formatter settings, which are independent from the language and locale
- date: {
- parseRe: /[#%\\\/:_;.,\t\s\-]/,
- masks: {
- ISO8601Long: "Y-m-d H:i:s",
- ISO8601Short: "Y-m-d",
- SortableDateTime: "Y-m-d\\TH:i:s",
- UniversalSortableDateTime: "Y-m-d H:i:sO"
- },
- reformatAfterEdit: true,
- userLocalTime: false
- },
- baseLinkUrl: "",
- showAction: "",
- target: "",
- checkbox: { disabled: true, defaultValue: false },
- idName: "id"
- },
- cmTemplate: {
- integerStr: {
- formatter: "integer", align: "right", sorttype: "integer",
- searchoptions: { sopt: ["eq", "ne", "lt", "le", "gt", "ge"] }
- },
- integer: {
- formatter: "integer", align: "right", sorttype: "integer",
- convertOnSave: function (options) {
- var nData = options.newValue;
- return isNaN(nData) ? nData : parseInt(nData, 10);
- },
- searchoptions: { sopt: ["eq", "ne", "lt", "le", "gt", "ge"] }
- },
- numberStr: {
- formatter: "number", align: "right", sorttype: "number",
- searchoptions: { sopt: ["eq", "ne", "lt", "le", "gt", "ge"] }
- },
- number: {
- formatter: "number", align: "right", sorttype: "number",
- convertOnSave: function (options) {
- var nData = options.newValue;
- return isNaN(nData) ? nData : parseFloat(nData);
- },
- searchoptions: { sopt: ["eq", "ne", "lt", "le", "gt", "ge"] }
- },
- booleanCheckbox: {
- align: "center", formatter: "checkbox", sorttype: "boolean",
- edittype: "checkbox", editoptions: { value: "true:false", defaultValue: "false" },
- convertOnSave: function (options) {
- var newValue = options.newValue,
- checkboxOptions = parseCheckboxOptions.call(this, options),
- lowerCaseNewData = String(newValue).toLowerCase();
- if (yesObject[lowerCaseNewData] || lowerCaseNewData === checkboxOptions.yes.toLowerCase()) {
- newValue = true;
- } else if (noObject[lowerCaseNewData] || lowerCaseNewData === checkboxOptions.no.toLowerCase()) {
- newValue = false;
- }
- return newValue;
- },
- stype: "checkbox", searchoptions: { sopt: ["eq"], value: "true:false" }
- },
- // TODO: add cmTemplate for currency and date
- actions: function () {
- var p = this.p;
- return {
- formatter: "actions",
- width: (p != null && (base.isInCommonIconClass.call(this, "fa") || base.isInCommonIconClass.call(this, "glyphicon")) ?
- ($(this).jqGrid("isBootstrapGuiStyle") ? 45 : 39) : 40) + (jgrid.cellWidth() ? 5 : 0),
- align: "center",
- label: "",
- autoResizable: false,
- title: false,
- frozen: true,
- fixed: true,
- hidedlg: true,
- resizable: false,
- sortable: false,
- search: false,
- editable: false,
- viewable: false
- };
- }
- }
- });
- jgrid.cmTemplate.booleanCheckboxFa = jgrid.cmTemplate.booleanCheckbox;
- //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, {
- // one can consider to use $.type instead of some functions below (see http://api.jquery.com/jQuery.type/)
- isObject: function (o) {
- return (o && (typeof o === "object" || $.isFunction(o))) || false;
- },
- isNumber: function (o) {
- // probably Number.isFinite can be used instead.
- return typeof o === "number" && isFinite(o); // return false for +infinity, -infinity, or NaN
- },
- isValue: function (o) {
- return (this.isObject(o) || typeof o === "string" || this.isNumber(o) || typeof o === "boolean");
- },
- isEmpty: function (o) {
- if (typeof o !== "string" && this.isValue(o)) {
- return false;
- }
- if (!this.isValue(o)) {
- return true;
- }
- o = $.trim(o).replace(/ /ig, "").replace(/ /ig, "");
- return o === "";
- },
- NumberFormat: function (nData, opts) {
- var isNumber = fmatter.isNumber;
- if (!isNumber(nData)) {
- nData *= 1;
- }
- if (isNumber(nData)) {
- var bNegative = (nData < 0);
- var sOutput = String(nData);
- var sDecimalSeparator = opts.decimalSeparator || ".";
- var nDotIndex;
- if (isNumber(opts.decimalPlaces)) {
- // Round to the correct decimal place
- var nDecimalPlaces = opts.decimalPlaces;
- // we use rounding described in http://www.jacklmoore.com/notes/rounding-in-javascript/
- sOutput = String(Number(Math.round(nData + "e" + nDecimalPlaces) + "e-" + nDecimalPlaces));
- nDotIndex = sOutput.lastIndexOf(".");
- if (nDecimalPlaces > 0) {
- // Add the decimal separator
- if (nDotIndex < 0) {
- sOutput += sDecimalSeparator;
- nDotIndex = sOutput.length - 1;
- } else if (sDecimalSeparator !== ".") { // Replace the "."
- 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;
- // we cut the part after the point for integer numbers
- // it will prevent storing/restoring of wrong numbers during inline editing
- var sNewOutput = opts.decimalSeparator === undefined ? "" : 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;
- }
- return sOutput;
- }
- return nData;
- }
- });
- var $FnFmatter = function (formatType, cellval, opts, rwd, act) {
- // build main options before element iteration
- var v = cellval;
- opts = $.extend({}, getGridRes.call($(this), "formatter"), opts);
- try {
- v = $.fn.fmatter[formatType].call(this, cellval, opts, rwd, act);
- } catch (ignore) { }
- return v;
- };
- $.fn.fmatter = $FnFmatter;
- $FnFmatter.getCellBuilder = function (formatType, opts, act) {
- var cellBuilder = $.fn.fmatter[formatType] != null ? $.fn.fmatter[formatType].getCellBuilder : null;
- return $.isFunction(cellBuilder) ?
- cellBuilder.call(this, $.extend({}, getGridRes.call($(this), "formatter"), opts), act) :
- null;
- };
- $FnFmatter.defaultFormat = function (cellval, opts) {
- return (fmatter.isValue(cellval) && cellval !== "") ? cellval : opts.defaultValue || " ";
- };
- var defaultFormat = $FnFmatter.defaultFormat,
- formatCheckboxValue = function (cellValue, checkboxOptions, colModel) {
- if (cellValue === undefined || fmatter.isEmpty(cellValue)) {
- var defaultValue = getOptionByName(colModel, "defaultValue");
- if (defaultValue === undefined) {
- defaultValue = checkboxOptions.no;
- }
- cellValue = defaultValue;
- }
- // see http://jsperf.com/regex-vs-indexof-vs-in/12
- cellValue = String(cellValue).toLowerCase();
- return yesObject[cellValue] || cellValue === checkboxOptions.yes.toLowerCase() ?
- checkboxOptions.checked :
- checkboxOptions.unchecked;
- };
- $FnFmatter.email = function (cellval, opts) {
- if (!fmatter.isEmpty(cellval)) {
- return "<a href='mailto:" + encodeAttr(cellval) + "'>" + cellval + "</a>";
- }
- return defaultFormat(cellval, opts);
- };
- $FnFmatter.checkbox = function (cellValue, options) {
- var checkboxOptions = parseCheckboxOptions.call(this, options);
- return formatCheckboxValue(cellValue, checkboxOptions, options.colModel);
- };
- $FnFmatter.checkbox.getCellBuilder = function (options) {
- var checkboxOptions, colModel = options.colModel;
- options.colName = options.colName || this.p.colNames[options.pos];
- checkboxOptions = parseCheckboxOptions.call(this, options);
- return function (cellValue) {
- return formatCheckboxValue(cellValue, checkboxOptions, colModel);
- };
- };
- $FnFmatter.checkbox.unformat = function (cellValue, options, elem) {
- var checkboxOptions = parseCheckboxOptions.call(this, options),
- $elem = $(elem);
- return (checkboxOptions.checkedClasses ?
- jgrid.hasAllClasses($elem.children("i,svg"), checkboxOptions.checkedClasses) :
- $elem.children("input").is(":checked")) ?
- checkboxOptions.yes :
- checkboxOptions.no;
- };
- $FnFmatter.checkboxFontAwesome4 = $FnFmatter.checkbox;
- $FnFmatter.checkboxFontAwesome4.getCellBuilder = $FnFmatter.checkbox.getCellBuilder;
- $FnFmatter.checkboxFontAwesome4.unformat = $FnFmatter.checkbox.unformat;
- $FnFmatter.link = function (cellval, opts) {
- var colModel = opts.colModel, target = "", op = { target: opts.target };
- if (colModel != null) {
- op = $.extend({}, op, colModel.formatoptions || {});
- }
- if (op.target) { target = "target=" + op.target; }
- if (!fmatter.isEmpty(cellval)) {
- return "<a " + target + " href='" + encodeAttr(cellval) + "'>" + cellval + "</a>";
- }
- return defaultFormat(cellval, op);
- };
- $FnFmatter.showlink = function (cellval, opts, rowData) {
- var self = this, colModel = opts.colModel,
- op = {
- baseLinkUrl: opts.baseLinkUrl,
- showAction: opts.showAction,
- addParam: opts.addParam || "",
- target: opts.target,
- idName: opts.idName,
- hrefDefaultValue: "#"
- },
- target = "",
- idUrl,
- idParam,
- addParam,
- getOptionValue = function (option) {
- return $.isFunction(option) ?
- option.call(self, {
- cellValue: cellval,
- rowid: opts.rowId,
- rowData: rowData,
- options: op
- }) :
- option || "";
- };
- if (colModel != null) {
- op = $.extend({}, op, colModel.formatoptions || {});
- }
- if (op.target) {
- target = "target=" + getOptionValue(op.target);
- }
- idUrl = getOptionValue(op.baseLinkUrl) + getOptionValue(op.showAction);
- idParam = op.idName ? encodeURIComponent(getOptionValue(op.idName)) + "=" + encodeURIComponent(getOptionValue(op.rowId) || opts.rowId) : "";
- addParam = getOptionValue(op.addParam);
- if (typeof addParam === "object" && addParam !== null) {
- // add "&" only in case of usage object for of addParam
- addParam = (idParam !== "" ? "&" : "") + $.param(addParam);
- }
- idUrl += !idParam && !addParam ? "" : "?" + idParam + addParam;
- if (idUrl === "") {
- idUrl = getOptionValue(op.hrefDefaultValue);
- }
- if (typeof cellval === "string" || fmatter.isNumber(cellval) || $.isFunction(op.cellValue)) {
- //add this one even if cellval is blank string
- return "<a " + target + " href='" + encodeAttr(idUrl) + "'>" +
- ($.isFunction(op.cellValue) ? getOptionValue(op.cellValue) : cellval) +
- "</a>";
- }
- // the code below will be called typically for undefined cellval or
- // if cellval have null value or some other unclear value like an object
- // and no cellValue callback function are defined "to decode" the value
- return defaultFormat(cellval, op);
- };
- $FnFmatter.showlink.getCellBuilder = function (opts1) {
- var op = {
- baseLinkUrl: opts1.baseLinkUrl,
- showAction: opts1.showAction,
- addParam: opts1.addParam || "",
- target: opts1.target,
- idName: opts1.idName,
- hrefDefaultValue: "#"
- },
- colModel = opts1.colModel;
- if (colModel != null) {
- op = $.extend({}, op, colModel.formatoptions || {});
- }
- return function (cellval, opts, rowData) {
- var self = this, rowid = opts.rowId, target = "", idUrl, idParam, addParam,
- getOptionValue = function (option) {
- return $.isFunction(option) ?
- option.call(self, {
- cellValue: cellval,
- rowid: rowid,
- rowData: rowData,
- options: op
- }) :
- option || "";
- };
- if (op.target) {
- target = "target=" + getOptionValue(op.target);
- }
- idUrl = getOptionValue(op.baseLinkUrl) + getOptionValue(op.showAction);
- idParam = op.idName ? encodeURIComponent(getOptionValue(op.idName)) + "=" + encodeURIComponent(getOptionValue(rowid) || opts.rowId) : "";
- addParam = getOptionValue(op.addParam);
- if (typeof addParam === "object" && addParam !== null) {
- // add "&" only in case of usage object for of addParam
- addParam = (idParam !== "" ? "&" : "") + $.param(addParam);
- }
- idUrl += !idParam && !addParam ? "" : "?" + idParam + addParam;
- if (idUrl === "") {
- idUrl = getOptionValue(op.hrefDefaultValue);
- }
- if (typeof cellval === "string" || fmatter.isNumber(cellval) || $.isFunction(op.cellValue)) {
- //add this one even if cellval is blank string
- return "<a " + target + " href='" + encodeAttr(idUrl) + "'>" +
- ($.isFunction(op.cellValue) ? getOptionValue(op.cellValue) : cellval) +
- "</a>";
- }
- // the code below will be called typically for undefined cellval or
- // if cellval have null value or some other unclear value like an object
- // and no cellValue callback function are defined "to decode" the value
- return defaultFormat(cellval, op);
- };
- };
- $FnFmatter.showlink.pageFinalization = function (iCol) {
- var $self = $(this), p = this.p, cm = p.colModel[iCol],
- wrapperClassName = p.autoResizing.wrapperClassName,
- iRow, rows = this.rows, nRows = rows.length, row, td,
- onClick = function (e) {
- var $td = $(this).closest("tr.jqgrow>td"), $tr = $td.parent(), iCol = $td[0].cellIndex, cm = p.colModel[iCol];
- if ($tr.length > 0) {
- return cm.formatoptions.onClick.call($self[0], {
- iCol: iCol,
- iRow: $tr[0].rowIndex,
- rowid: $tr.attr("id"),
- cm: cm,
- cmName: cm.name,
- cellValue: $(this).text(),
- a: this,
- event: e
- });
- }
- };
- if (cm.formatoptions != null && $.isFunction(cm.formatoptions.onClick)) {
- for (iRow = 0; iRow < nRows; iRow++) {
- row = rows[iRow];
- if ($(row).hasClass("jqgrow")) {
- td = row.cells[iCol];
- if (cm.autoResizable && td != null && $(td.firstChild).hasClass(wrapperClassName)) {
- td = td.firstChild;
- }
- if (td != null) {
- $(td.firstChild).on("click", onClick);
- }
- }
- }
- }
- };
- var insertPrefixAndSuffix = function (sOutput, opts) {
- // Prepend prefix
- sOutput = (opts.prefix) ? opts.prefix + sOutput : sOutput;
- // Append suffix
- return (opts.suffix) ? sOutput + opts.suffix : sOutput;
- },
- numberHelper = function (cellval, opts, formatType) {
- var colModel = opts.colModel, op = $.extend({}, opts[formatType]);
- if (colModel != null) {
- op = $.extend({}, op, colModel.formatoptions || {});
- }
- if (fmatter.isEmpty(cellval)) {
- return insertPrefixAndSuffix(op.defaultValue, op);
- }
- return insertPrefixAndSuffix(fmatter.NumberFormat(cellval, op), op);
- };
- $FnFmatter.integer = function (cellval, opts) {
- return numberHelper(cellval, opts, "integer");
- };
- $FnFmatter.number = function (cellval, opts) {
- return numberHelper(cellval, opts, "number");
- };
- $FnFmatter.currency = function (cellval, opts) {
- return numberHelper(cellval, opts, "currency");
- };
- var numberCellBuilder = function (opts, formatType) {
- var colModel = opts.colModel, op = $.extend({}, opts[formatType]);
- if (colModel != null) {
- op = $.extend({}, op, colModel.formatoptions || {});
- }
- var numberFormat = fmatter.NumberFormat,
- defaultValue = op.defaultValue ? insertPrefixAndSuffix(op.defaultValue, op) : "";
- return function (cellValue) {
- if (fmatter.isEmpty(cellValue)) { return defaultValue; }
- return insertPrefixAndSuffix(numberFormat(cellValue, op), op);
- };
- };
- $FnFmatter.integer.getCellBuilder = function (options) {
- return numberCellBuilder(options, "integer");
- };
- $FnFmatter.number.getCellBuilder = function (options) {
- return numberCellBuilder(options, "number");
- };
- $FnFmatter.currency.getCellBuilder = function (options) {
- return numberCellBuilder(options, "currency");
- };
- $FnFmatter.date = function (cellval, opts, rwd, act) {
- var colModel = opts.colModel, op = $.extend({}, opts.date);
- if (colModel != null) {
- op = $.extend({}, op, colModel.formatoptions || {});
- }
- if (!op.reformatAfterEdit && act === "edit") {
- return defaultFormat(cellval, op);
- }
- if (!fmatter.isEmpty(cellval)) {
- return jgrid.parseDate.call(this, op.srcformat, cellval, op.newformat, op);
- }
- return defaultFormat(cellval, op);
- };
- $FnFmatter.date.getCellBuilder = function (opts, act) {
- var op = $.extend({}, opts.date);
- if (opts.colModel != null) {
- op = $.extend({}, op, opts.colModel.formatoptions || {});
- }
- var parseDate = jgrid.parseDate,
- srcformat = op.srcformat, newformat = op.newformat;
- if (!op.reformatAfterEdit && act === "edit") {
- return function (cellValue) {
- return defaultFormat(cellValue, op);
- };
- }
- return function (cellValue) {
- return fmatter.isEmpty(cellValue) ?
- defaultFormat(cellValue, op) :
- parseDate.call(this, srcformat, cellValue, newformat, op);
- };
- };
- $FnFmatter.select = function (cellval, opts) {
- var ret = [], colModel = opts.colModel, defaultValue,
- op = $.extend({}, colModel.editoptions || {}, colModel.formatoptions || {}),
- oSelect = typeof op.value === "function" ? op.value() : op.value, sep = op.separator || ":", delim = op.delimiter || ";";
- if (oSelect) {
- var msl = op.multiple === true ? true : false, scell = [], sv,
- mapFunc = function (n, j) { if (j > 0) { return n; } };
- if (msl) {
- scell = $.map(String(cellval).split(","), function (n) { return $.trim(n); });
- }
- if (typeof oSelect === "string") {
- // maybe here we can use some caching with care ????
- var so = oSelect.split(delim), i, v;
- for (i = 0; i < so.length; i++) {
- sv = so[i].split(sep);
- if (sv.length > 2) {
- sv[1] = $.map(sv, mapFunc).join(sep);
- }
- v = $.trim(sv[0]);
- if (op.defaultValue === v) {
- defaultValue = sv[1];
- }
- if (msl) {
- if ($.inArray(v, scell) > -1) {
- ret.push(sv[1]);
- }
- } else if (v === $.trim(cellval)) {
- ret = [sv[1]];
- break;
- }
- }
- } else if (fmatter.isObject(oSelect)) {
- defaultValue = oSelect[op.defaultValue];
- if (msl) {
- ret = $.map(scell, function (n) {
- return oSelect[n];
- });
- } else {
- ret = [oSelect[cellval] === undefined ? "" : oSelect[cellval]];
- }
- }
- }
- cellval = ret.join(", ");
- return cellval !== "" ? cellval :
- (op.defaultValue !== undefined ? defaultValue : defaultFormat(cellval, op));
- };
- $FnFmatter.select.getCellBuilder = function (opts) {
- // jqGrid specific
- var colModel = opts.colModel, $fnDefaultFormat = $FnFmatter.defaultFormat,
- op = $.extend({}, colModel.editoptions || {}, colModel.formatoptions || {}),
- oSelect = typeof op.value === "function" ? op.value() : op.value, sep = op.separator || ":", delim = op.delimiter || ";",
- defaultValue, defaultValueDefined = op.defaultValue !== undefined,
- isMultiple = op.multiple === true ? true : false, sv, so, i, nOpts, selOptions = {},
- mapFunc = function (n, j) { if (j > 0) { return n; } };
- if (typeof oSelect === "string") {
- // maybe here we can use some caching with care ????
- so = oSelect.split(delim);
- nOpts = so.length;
- for (i = nOpts - 1; i >= 0; i--) {
- sv = so[i].split(sep);
- if (sv.length > 2) {
- sv[1] = $.map(sv, mapFunc).join(sep);
- }
- selOptions[$.trim(sv[0])] = sv[1];
- }
- } else if (fmatter.isObject(oSelect)) {
- selOptions = oSelect;
- } else {
- return function (cellValue) {
- return cellValue ? String(cellValue) : $fnDefaultFormat(cellValue, op);
- };
- }
- if (defaultValueDefined) {
- defaultValue = selOptions[op.defaultValue];
- }
- return isMultiple ?
- function (cellValue) {
- var ret = [], iOpt,
- splitedCell = $.map(String(cellValue).split(","), function (n) { return $.trim(n); });
- for (iOpt = 0; iOpt < splitedCell.length; iOpt++) {
- cellValue = splitedCell[iOpt];
- if (selOptions.hasOwnProperty(cellValue)) {
- ret.push(selOptions[cellValue]);
- }
- }
- cellValue = ret.join(", ");
- return cellValue !== "" ? cellValue :
- (defaultValueDefined ? defaultValue : $fnDefaultFormat(cellValue, op));
- } :
- function (cellValue) {
- var ret = selOptions[String(cellValue)];
- return ret !== "" && ret !== undefined ? ret :
- (defaultValueDefined ? defaultValue : $fnDefaultFormat(cellValue, op));
- };
- };
- $FnFmatter.rowactions = function (e, act) {
- var $td = $(this).closest("tr.jqgrow>td"), $tr = $td.parent(), rid = $tr.attr("id"),
- $id = $(this).closest("table.ui-jqgrid-btable").attr("id").replace(/_frozen([^_]*)$/, "$1"),
- $grid = $("#" + jgrid.jqID($id)), $t = $grid[0], p = $t.p, i, n, customAction, actop,
- relativeTop = jgrid.getRelativeRect.call($t, $tr).top,
- cm = p.colModel[$td[0].cellIndex],
- op = $.extend(true, { extraparam: {} }, jgrid.actionsNav || {}, p.actionsNavOptions || {}, cm.formatoptions || {});
- if (p.editOptions !== undefined) {
- op.editOptions = $.extend(true, 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;
- }
- actop = {
- keys: op.keys,
- oneditfunc: op.onEdit,
- successfunc: op.onSuccess,
- url: op.url,
- extraparam: op.extraparam,
- aftersavefunc: op.afterSave,
- errorfunc: op.onError,
- afterrestorefunc: op.afterRestore,
- restoreAfterError: op.restoreAfterError,
- mtype: op.mtype
- };
- if ((!p.multiselect && rid !== p.selrow) || (p.multiselect && $.inArray(rid, p.selarrrow) < 0)) {
- $grid.jqGrid("setSelection", rid, true, e);
- } else {
- jgrid.fullBoolFeedback.call($t, "onSelectRow", "jqGridSelectRow", rid, true, e);
- }
- switch (act) {
- case "edit":
- $grid.jqGrid("editRow", rid, actop);
- break;
- case "save":
- $grid.jqGrid("saveRow", rid, actop);
- break;
- case "cancel":
- $grid.jqGrid("restoreRow", rid, op.afterRestore);
- break;
- case "del":
- op.delOptions = op.delOptions || {};
- if (op.delOptions.top === undefined) {
- op.delOptions.top = relativeTop;
- }
- $grid.jqGrid("delGridRow", rid, op.delOptions);
- break;
- case "formedit":
- op.editOptions = op.editOptions || {};
- if (op.editOptions.top === undefined) {
- op.editOptions.top = relativeTop;
- op.editOptions.recreateForm = true;
- }
- $grid.jqGrid("editGridRow", rid, op.editOptions);
- break;
- default:
- if (op.custom != null && op.custom.length > 0) {
- n = op.custom.length;
- for (i = 0; i < n; i++) {
- customAction = op.custom[i];
- if (customAction.action === act && $.isFunction(customAction.onClick)) {
- customAction.onClick.call($t, { rowid: rid, event: e, action: act, options: customAction });
- }
- }
- }
- }
- if (e.stopPropagation) {
- e.stopPropagation();
- }
- return false; // prevent other processing of the click on the row
- };
- $FnFmatter.actions = function (cellval, opts, rwd, act) {
- var rowid = opts.rowId, str = "", $t = this, $self = $($t), i, info, customAction, displayMask = {},
- edit = getGridRes.call($self, "edit") || {},
- op = $.extend({
- editbutton: true,
- delbutton: true,
- editformbutton: false,
- commonIconClass: "ui-icon",
- editicon: "ui-icon-pencil",
- delicon: "ui-icon-trash",
- saveicon: "ui-icon-disk",
- cancelicon: "ui-icon-cancel",
- savetitle: edit.bSubmit || "",
- canceltitle: edit.bCancel || ""
- },
- getGridRes.call($self, "nav") || {},
- jgrid.nav || {},
- $t.p.navOptions || {},
- getGridRes.call($self, "actionsNav") || {},
- jgrid.actionsNav || {},
- $t.p.actionsNavOptions || {},
- (opts.colModel || {}).formatoptions || {}),
- cssIconClass = function (name) {
- return jgrid.mergeCssClasses(op.commonIconClass, op[name + "icon"]);
- },
- buttonInfos = [
- { action: "edit", actionName: "formedit", display: op.editformbutton },
- { action: "edit", display: !op.editformbutton && op.editbutton },
- { action: "del", idPrefix: "Delete", display: op.delbutton },
- { action: "save", display: op.editformbutton || op.editbutton, hidden: true },
- { action: "cancel", display: op.editformbutton || op.editbutton, hidden: true }
- ],
- actionButton = function (options) {
- var action = options.action, actionName = options.actionName || action,
- idPrefix = options.idPrefix !== undefined ? options.idPrefix : (action.charAt(0).toUpperCase() + action.substring(1));
- return "<div title='" + encodeAttr(op[action + "title"]) +
- (options.hidden ? "' style='display:none;" : "") +
- "' class='" + encodeAttr($self.jqGrid("getGuiStyles", "actionsButton", "ui-pg-div ui-inline-" + action)) + "' " +
- (idPrefix !== null ? "id='j" + encodeAttr(idPrefix + "Button_" + rowid) : "") +
- "' data-jqactionname=\"" + actionName + "\" " +
- (options.noHovering ? "" : "' data-jqhovering=\"1\" ") +
- "><span class='" +
- encodeAttr(cssIconClass(action)) + "'></span></div>";
- },
- n = op.custom != null ? op.custom.length - 1 : -1;
- if (rowid === undefined || fmatter.isEmpty(rowid)) { return ""; }
- if ($.isFunction(op.isDisplayButtons)) {
- try {
- displayMask = op.isDisplayButtons.call(this, op, rwd, act) || {};
- } catch (ignore) {}
- }
- while (n >= 0) {
- customAction = op.custom[n--];
- buttonInfos[customAction.position === "first" ? "unshift" : "push"](customAction);
- }
- for (i = 0, n = buttonInfos.length; i < n; i++) {
- info = $.extend({}, buttonInfos[i], displayMask[buttonInfos[i].action] || {});
- if (info.display !== false) {
- str += actionButton(info);
- }
- }
- return "<div class='" + encodeAttr($self.jqGrid("getGuiStyles", "actionsDiv", "ui-jqgrid-actions")) + "'>" + str + "</div>";
- };
- $FnFmatter.actions.pageFinalization = function (iCol) {
- var $self = $(this), p = this.p, cm = p.colModel[iCol],
- wrapperClassName = p.autoResizing.wrapperClassName,
- hoverClass = $self.jqGrid("getGuiStyles", "states.hover"),
- iRow, rows = this.rows, fbRows = this.grid.fbRows, nRows = rows.length, row,
- showHideEditDelete = (function (cmName) {
- return function (show, tr) {
- var maxfrozen = 0, $actionsDiv, colModel = p.colModel, len = colModel.length, i, iCol = p.iColByName[cmName];
- for (i = 0; i < len; i++) {
- // from left, no breaking frozen
- if (colModel[i].frozen !== true) {
- break;
- }
- maxfrozen = i;
- }
- if (tr != null && tr.cells != null) {
- $actionsDiv = $(tr.cells[iCol]).children(".ui-jqgrid-actions");
- if (colModel[iCol].frozen && p.frozenColumns && iCol <= maxfrozen) {
- // uses the corresponding tr from frozen div with the same rowIndex ADDITIONALLY
- // to the standard action div
- $actionsDiv = $actionsDiv
- .add($($self[0].grid.fbRows[tr.rowIndex].cells[iCol])
- .children(".ui-jqgrid-actions"));
- }
- if (show) {
- $actionsDiv.find(">.ui-inline-edit,>.ui-inline-del").show();
- $actionsDiv.find(">.ui-inline-save,>.ui-inline-cancel").hide();
- } else {
- $actionsDiv.find(">.ui-inline-edit,>.ui-inline-del").hide();
- $actionsDiv.find(">.ui-inline-save,>.ui-inline-cancel").show();
- }
- }
- };
- })(cm.name),
- showEditDelete = function (e, rowid) {
- var tr = $self.jqGrid("getGridRowById", rowid);
- showHideEditDelete(true, tr);
- return false;
- },
- hideEditDelete = function (e, rowid) {
- var tr = $self.jqGrid("getGridRowById", rowid);
- showHideEditDelete(false, tr);
- return false;
- },
- onMouseOver = function (e) {
- if ($(e.target).closest("div.ui-pg-div").data("jqhovering") === 1) {
- $(this).addClass(hoverClass);
- }
- },
- onMouseOut = function (e) {
- if ($(e.target).closest("div.ui-pg-div").data("jqhovering") === 1) {
- $(this).removeClass(hoverClass);
- }
- },
- onClick = function (e) {
- return $FnFmatter.rowactions.call(this, e, $(e.target).closest("div.ui-pg-div").data("jqactionname"));
- },
- bindEvents = function (td, autoResizable) {
- if (autoResizable && td != null && $(td.firstChild).hasClass(wrapperClassName)) {
- td = td.firstChild;
- }
- if (td != null) {
- $(td.firstChild).on("click", onClick);
- $(td.firstChild).children("div.ui-pg-div")
- .on("mouseover", onMouseOver)
- .on("mouseout", onMouseOut);
- }
- },
- bindRowEvents = (function (cmName) {
- return function (e, options) {
- var iColToBind = p.iColByName[cmName]; // it could be changed index because of reordering of columns
- bindEvents(options.tr.cells[iColToBind], p.colModel[iColToBind].autoResizable);
- };
- })(cm.name);
- if (cm.formatoptions == null || !cm.formatoptions.editformbutton) {
- // we use unbind to be sure that we don't register the same events multiple times
- $self.off("jqGridInlineAfterRestoreRow.jqGridFormatter jqGridInlineAfterSaveRow.jqGridFormatter", showEditDelete);
- $self.on("jqGridInlineAfterRestoreRow.jqGridFormatter jqGridInlineAfterSaveRow.jqGridFormatter", showEditDelete);
- $self.off("jqGridInlineEditRow.jqGridFormatter", hideEditDelete);
- $self.on("jqGridInlineEditRow.jqGridFormatter", hideEditDelete);
- $self.off("jqGridAfterAddRow.jqGridFormatter", bindRowEvents);
- $self.on("jqGridAfterAddRow.jqGridFormatter", bindRowEvents);
- }
- for (iRow = 0; iRow < nRows; iRow++) {
- row = rows[iRow];
- if ($(row).hasClass("jqgrow")) {
- bindEvents(row.cells[iCol], cm.autoResizable);
- if (fbRows != null && fbRows[iRow] != null) {
- bindEvents(fbRows[iRow].cells[iCol], cm.autoResizable);
- }
- }
- }
- };
- $.unformat = function (cellval, options, pos, cnt) {
- // specific for jqGrid only
- var ret, colModel = options.colModel, formatType = colModel.formatter, p = this.p,
- op = colModel.formatoptions || {},// sep,
- //re = /([\.\*\_\'\(\)\{\}\+\?\\])/g,
- unformatFunc = colModel.unformat || ($FnFmatter[formatType] && $FnFmatter[formatType].unformat);
- if (cellval instanceof jQuery && cellval.length > 0) {
- cellval = cellval[0];
- }
- if (p.treeGrid && cellval != null && $(cellval.firstChild).hasClass("tree-wrap") && ($(cellval.lastChild).hasClass("cell-wrapper") || $(cellval.lastChild).hasClass("cell-wrapperleaf"))) {
- cellval = cellval.lastChild;
- }
- if (colModel.autoResizable && cellval != null && $(cellval.firstChild).hasClass(p.autoResizing.wrapperClassName)) {
- cellval = cellval.firstChild;
- }
- if (unformatFunc !== undefined && $.isFunction(unformatFunc)) {
- ret = unformatFunc.call(this, $(cellval).text(), options, cellval);
- } else if (formatType !== undefined && typeof formatType === "string") {
- //var opts = $.extend(true, {}, getRes(locales[p.locale], "formatter"), jgrid.formatter || {}), stripTag;
- var $self = $(this), //stripTag, //opts = getGridRes.call($self, "formatter"),
- getFormaterOption = function (formatterName, optionName) {
- return op[optionName] !== undefined ?
- op[optionName] :
- getGridRes.call($self, "formatter." + formatterName + "." + optionName);
- },
- cutThousandsSeparator = function (formatterName, val) {
- var separator = getFormaterOption(formatterName, "thousandsSeparator")
- .replace(/([\.\*\_\'\(\)\{\}\+\?\\])/g, "\\$1");
- return val.replace(new RegExp(separator, "g"), "");
- };
- switch (formatType) {
- case "integer":
- ret = cutThousandsSeparator("integer", $(cellval).text());
- break;
- case "number":
- ret = cutThousandsSeparator("number", $(cellval).text())
- .replace(getFormaterOption("number", "decimalSeparator"), ".");
- break;
- case "currency":
- ret = $(cellval).text();
- var prefix = getFormaterOption("currency", "prefix"),
- suffix = getFormaterOption("currency", "suffix");
- if (prefix && prefix.length) {
- ret = ret.substr(prefix.length);
- }
- if (suffix && suffix.length) {
- ret = ret.substr(0, ret.length - suffix.length);
- }
- ret = cutThousandsSeparator("number", ret)
- .replace(getFormaterOption("number", "decimalSeparator"), ".");
- break;
- case "checkbox":
- ret = $FnFmatter.checkbox.unformat(cellval, options, cellval);
- break;
- case "select":
- ret = $.unformat.select(cellval, options, pos, cnt);
- break;
- case "actions":
- return "";
- default:
- ret = $(cellval).text();
- }
- }
- ret = ret !== undefined ? ret : cnt === true ? $(cellval).text() : jgrid.htmlDecode($(cellval).html());
- return ret;
- };
- $.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 = [], cell = $(cellval).text(), colModel = options.colModel;
- if (cnt === true) { return cell; }
- var op = $.extend({}, colModel.editoptions || {}, colModel.formatoptions || {}),
- sep = op.separator === undefined ? ":" : op.separator,
- delim = op.delimiter === undefined ? ";" : op.delimiter;
- if (op.value) {
- var oSelect = typeof op.value === "function" ? op.value() : op.value,
- msl = op.multiple === true ? true : false,
- scell = [], sv, mapFunc = function (n, k) { if (k > 0) { return n; } };
- if (msl) { scell = cell.split(","); scell = $.map(scell, function (n) { return $.trim(n); }); }
- if (typeof oSelect === "string") {
- 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, mapFunc).join(sep);
- }
- if (msl) {
- if ($.inArray($.trim(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 (k, val) {
- if (val === n) {
- rv = k;
- return false;
- }
- });
- if (rv !== undefined) { return rv; }
- });
- }
- return ret.join(", ");
- }
- return cell || "";
- };
- $.unformat.date = function (cellval, opts) {
- // TODO
- var op = $.extend(true, {},
- getGridRes.call($(this), "formatter.date"),
- jgrid.formatter.date || {},
- opts.formatoptions || {});
- return !fmatter.isEmpty(cellval) ?
- jgrid.parseDate.call(this, op.newformat, cellval, op.srcformat, op) :
- "";
- };
- // end module jquery.fmatter
- }));
|