/**
* @class Ext.ux.ColorField
* @extends Ext.form.TriggerField
* Provides a color input field with a {@link Ext.ColorPalette} dropdown.
* @constructor
* Create a new ColorField
*
Example:
*
var color_field = new Ext.ux.ColorField({
fieldLabel: 'Color',
id: 'color',
width: 175,
allowBlank: false
});
* @param {Object} config
*/
Ext.ux.ColorField = Ext.extend(Ext.form.TriggerField, {
/**
* @cfg {String} invalidText
* The error to display when the color in the field is invalid (defaults to
* '{value} is not a valid color - it must be in the format {format}').
*/
invalidText : "'{0}' is not a valid color - it must be in a the hex format (# followed by 3 or 6 letters/numbers 0-9 A-F)",
/**
* @cfg {String} triggerClass
* An additional CSS class used to style the trigger button. The trigger will always get the
* class 'x-form-trigger' and triggerClass will be appended if specified (defaults to 'x-form-color-trigger'
* which displays a color wheel icon).
*/
triggerClass : 'x-form-color-trigger',
/**
* @cfg {String/Object} autoCreate
* A DomHelper element spec, or true for a default element spec (defaults to
* {tag: "input", type: "text", size: "10", autocomplete: "off"})
*/
// private
defaultAutoCreate : {tag: "input", type: "text", size: "10", maxlength: "7", autocomplete: "off"},
// Limit input to hex values
maskRe: /[#a-f0-9]/i,
// private
validateValue : function(value){
if(!Ext.ux.ColorField.superclass.validateValue.call(this, value)){
return false;
}
if(value.length < 1){ // if it's blank and textfield didn't flag it then it's valid
this.setColor('');
return true;
}
var parseOK = this.parseColor(value);
if(!value || (parseOK == false)){
this.markInvalid(String.format(this.invalidText,value));
return false;
}
this.setColor(value);
return true;
},
/**
* Sets the current color and changes the background.
* Does *not* change the value of the field.
* @param {String} hex The color value.
*/
setColor : function(color) {
if (color=='' || color==undefined)
{
if (this.emptyText!='' && this.parseColor(this.emptyText))
color=this.emptyText;
else
color='transparent';
}
if (this.trigger)
this.trigger.setStyle( {
'background-color': color
});
else
{
this.on('render',function(){this.setColor(color)},this);
}
},
// private
// Provides logic to override the default TriggerField.validateBlur which just returns true
validateBlur : function(){
return !this.menu || !this.menu.isVisible();
},
/**
* Returns the current value of the color field
* @return {String} value The color value
*/
getValue : function(){
return Ext.ux.ColorField.superclass.getValue.call(this) || "";
},
/**
* Sets the value of the color field. You can pass a string that can be parsed into a valid HTML color
*
colorField.setValue('#FFFFFF');
* @param {String} color The color string
*/
setValue : function(color){
Ext.ux.ColorField.superclass.setValue.call(this, this.formatColor(color));
this.setColor( this.formatColor(color));
},
// private
parseColor : function(value){
return (!value || (value.substring(0,1) != '#')) ?
false : (value.length==4 || value.length==7 );
},
// private
formatColor : function(value){
if (!value || this.parseColor(value))
return value;
if (value.length==3 || value.length==6) {
return '#' + value;
}
return '';
},
// private
menuListeners : {
select: function(e, c){
this.setValue(c);
},
show : function(){ // retain focus styling
this.onFocus();
},
hide : function(){
this.focus.defer(10, this);
var ml = this.menuListeners;
this.menu.un("select", ml.select, this);
this.menu.un("show", ml.show, this);
this.menu.un("hide", ml.hide, this);
}
},
// private
// Implements the default empty TriggerField.onTriggerClick function to display the ColorPalette
onTriggerClick : function(){
if(this.disabled){
return;
}
if(this.menu == null){
this.menu = new Ext.menu.ColorMenu();
}
this.menu.on(Ext.apply({}, this.menuListeners, {
scope:this
}));
this.menu.show(this.el, "tl-bl?");
}
});
Ext.reg('colorfield',Ext.ux.ColorField);