From ef68436ac04da078ffdcacd7e1f785473a303d45 Mon Sep 17 00:00:00 2001 From: Giulio Cesare Solaroli Date: Sun, 02 Oct 2011 23:56:18 +0000 Subject: First version of the newly restructured repository --- (limited to 'frontend/beta/js/YUI-extensions/grid/editor/NumberEditor.js') diff --git a/frontend/beta/js/YUI-extensions/grid/editor/NumberEditor.js b/frontend/beta/js/YUI-extensions/grid/editor/NumberEditor.js new file mode 100644 index 0000000..f74d3d9 --- a/dev/null +++ b/frontend/beta/js/YUI-extensions/grid/editor/NumberEditor.js @@ -0,0 +1,166 @@ +/** + * @class YAHOO.ext.grid.NumberEditor + * @extends YAHOO.ext.grid.CellEditor +Provides a masked editor for numeric values. Invalid keys are ignored. It supports the following configuration options: + +For more information on using this editor, see this blog post. +* @constructor +* Create a new NumberEditor +* @param {Object} config + */ +YAHOO.ext.grid.NumberEditor = function(config){ + var element = document.createElement('input'); + element.type = 'text'; + element.className = 'ygrid-editor ygrid-num-editor'; + element.setAttribute('autocomplete', 'off'); + document.body.appendChild(element); + YAHOO.ext.grid.NumberEditor.superclass.constructor.call(this, element); + YAHOO.ext.util.Config.apply(this, config); +}; +YAHOO.extendX(YAHOO.ext.grid.NumberEditor, YAHOO.ext.grid.CellEditor); + +YAHOO.ext.grid.NumberEditor.prototype.initEvents = function(){ + var stopOnEnter = function(e){ + if(e.browserEvent.keyCode == e.RETURN){ + this.stopEditing(true); + }else if(e.browserEvent.keyCode == e.ESC){ + this.setValue(this.originalValue); + this.stopEditing(true); + } + }; + + var allowed = "0123456789"; + if(this.allowDecimals){ + allowed += this.decimalSeparator; + } + if(this.allowNegative){ + allowed += '-'; + } + var keyPress = function(e){ + var c = e.getCharCode(); + if(c != e.BACKSPACE && allowed.indexOf(String.fromCharCode(c)) === -1){ + e.stopEvent(); + } + }; + this.element.mon('keydown', stopOnEnter, this, true); + var vtask = new YAHOO.ext.util.DelayedTask(this.validate, this); + this.element.mon('keyup', vtask.delay.createDelegate(vtask, [this.validationDelay])); + this.element.mon('keypress', keyPress, this, true); + this.element.on('blur', this.stopEditing, this, true); +}; + +YAHOO.ext.grid.NumberEditor.prototype.validate = function(){ + var dom = this.element.dom; + var value = dom.value; + if(value.length < 1){ // if it's blank + if(this.allowBlank){ + dom.title = ''; + this.element.removeClass('ygrid-editor-invalid'); + return true; + }else{ + dom.title = this.blankText; + this.element.addClass('ygrid-editor-invalid'); + return false; + } + } + if(value.search(/\d+/) === -1){ + dom.title = this.nanText.replace('%0', value); + this.element.addClass('ygrid-editor-invalid'); + return false; + } + var num = this.parseValue(value); + if(num < this.minValue){ + dom.title = this.minText.replace('%0', this.minValue); + this.element.addClass('ygrid-editor-invalid'); + return false; + } + if(num > this.maxValue){ + dom.title = this.maxText.replace('%0', this.maxValue); + this.element.addClass('ygrid-editor-invalid'); + return false; + } + var msg = this.validator(value); + if(msg !== true){ + dom.title = msg; + this.element.addClass('ygrid-editor-invalid'); + return false; + } + dom.title = ''; + this.element.removeClass('ygrid-editor-invalid'); + return true; +}; + +YAHOO.ext.grid.NumberEditor.prototype.show = function(){ + this.element.dom.title = ''; + YAHOO.ext.grid.NumberEditor.superclass.show.call(this); + if(this.selectOnFocus){ + try{ + this.element.dom.select(); + }catch(e){} + } + this.validate(this.element.dom.value); +}; + +YAHOO.ext.grid.NumberEditor.prototype.getValue = function(){ + if(!this.validate()){ + return this.originalValue; + }else{ + var value = this.element.dom.value; + if(value.length < 1){ + return value; + } else{ + return this.fixPrecision(this.parseValue(value)); + } + } +}; +YAHOO.ext.grid.NumberEditor.prototype.parseValue = function(value){ + return parseFloat(new String(value).replace(this.decimalSeparator, '.')); +}; + +YAHOO.ext.grid.NumberEditor.prototype.fixPrecision = function(value){ + if(!this.allowDecimals || this.decimalPrecision == -1 || isNaN(value) || value == 0 || !value){ + return value; + } + // this should work but doesn't due to precision error in JS + // var scale = Math.pow(10, this.decimalPrecision); + // var fixed = this.decimalPrecisionFcn(value * scale); + // return fixed / scale; + // + // so here's our workaround: + var scale = Math.pow(10, this.decimalPrecision+1); + var fixed = this.decimalPrecisionFcn(value * scale); + fixed = this.decimalPrecisionFcn(fixed/10); + return fixed / (scale/10); +}; + +YAHOO.ext.grid.NumberEditor.prototype.allowBlank = true; +YAHOO.ext.grid.NumberEditor.prototype.allowDecimals = true; +YAHOO.ext.grid.NumberEditor.prototype.decimalSeparator = '.'; +YAHOO.ext.grid.NumberEditor.prototype.decimalPrecision = 2; +YAHOO.ext.grid.NumberEditor.prototype.decimalPrecisionFcn = Math.floor; +YAHOO.ext.grid.NumberEditor.prototype.allowNegative = true; +YAHOO.ext.grid.NumberEditor.prototype.selectOnFocus = true; +YAHOO.ext.grid.NumberEditor.prototype.minValue = Number.NEGATIVE_INFINITY; +YAHOO.ext.grid.NumberEditor.prototype.maxValue = Number.MAX_VALUE; +YAHOO.ext.grid.NumberEditor.prototype.minText = 'The minimum value for this field is %0'; +YAHOO.ext.grid.NumberEditor.prototype.maxText = 'The maximum value for this field is %0'; +YAHOO.ext.grid.NumberEditor.prototype.blankText = 'This field cannot be blank'; +YAHOO.ext.grid.NumberEditor.prototype.nanText = '%0 is not a valid number'; +YAHOO.ext.grid.NumberEditor.prototype.validationDelay = 100; +YAHOO.ext.grid.NumberEditor.prototype.validator = function(){return true;}; -- cgit v0.9.0.2