X-Git-Url: http://git.ithinksw.org/extjs.git/blobdiff_plain/2e847cf21b8ab9d15fa167b315ca5b2fa92638fc..0494b8d9b9bb03ab6c22b34dae81261e3cd7e3e6:/src/widgets/form/CheckboxGroup.js diff --git a/src/widgets/form/CheckboxGroup.js b/src/widgets/form/CheckboxGroup.js index 291c72d4..fb5338cd 100644 --- a/src/widgets/form/CheckboxGroup.js +++ b/src/widgets/form/CheckboxGroup.js @@ -1,8 +1,8 @@ /*! - * Ext JS Library 3.1.1 - * Copyright(c) 2006-2010 Ext JS, LLC - * licensing@extjs.com - * http://www.extjs.com/license + * Ext JS Library 3.3.1 + * Copyright(c) 2006-2010 Sencha Inc. + * licensing@sencha.com + * http://www.sencha.com/license */ /** * @class Ext.form.CheckboxGroup @@ -147,7 +147,7 @@ Ext.form.CheckboxGroup = Ext.extend(Ext.form.Field, { var cc = Ext.apply({items:[]}, colCfg); cc[this.columns[i] <= 1 ? 'columnWidth' : 'width'] = this.columns[i]; if(this.defaults){ - cc.defaults = Ext.apply(cc.defaults || {}, this.defaults) + cc.defaults = Ext.apply(cc.defaults || {}, this.defaults); } cols.push(cc); }; @@ -236,22 +236,28 @@ Ext.form.CheckboxGroup = Ext.extend(Ext.form.Field, { }); this.fireEvent('change', this, arr); }, - - // private - validateValue : function(value){ - if(!this.allowBlank){ + + /** + * Runs CheckboxGroup's validations and returns an array of any errors. The only error by default + * is if allowBlank is set to true and no items are checked. + * @return {Array} Array of all validation errors + */ + getErrors: function() { + var errors = Ext.form.CheckboxGroup.superclass.getErrors.apply(this, arguments); + + if (!this.allowBlank) { var blank = true; + this.eachItem(function(f){ - if(f.checked){ + if (f.checked) { return (blank = false); } }); - if(blank){ - this.markInvalid(this.blankText); - return false; - } + + if (blank) errors.push(this.blankText); } - return true; + + return errors; }, // private @@ -262,15 +268,27 @@ Ext.form.CheckboxGroup = Ext.extend(Ext.form.Field, { } var dirty = false; + this.eachItem(function(item){ if(item.isDirty()){ dirty = true; return false; } }); + return dirty; }, + // private + setReadOnly : function(readOnly){ + if(this.rendered){ + this.eachItem(function(item){ + item.setReadOnly(readOnly); + }); + } + this.readOnly = readOnly; + }, + // private onDisable : function(){ this.eachItem(function(item){ @@ -285,14 +303,6 @@ Ext.form.CheckboxGroup = Ext.extend(Ext.form.Field, { }); }, - // private - doLayout: function(){ - if(this.rendered){ - this.panel.forceLayout = this.ownerCt.forceLayout; - this.panel.doLayout(); - } - }, - // private onResize : function(w, h){ this.panel.setSize(w, h); @@ -301,11 +311,26 @@ Ext.form.CheckboxGroup = Ext.extend(Ext.form.Field, { // inherit docs from Field reset : function(){ - this.eachItem(function(c){ - if(c.reset){ - c.reset(); - } - }); + if (this.originalValue) { + // Clear all items + this.eachItem(function(c){ + if(c.setValue){ + c.setValue(false); + c.originalValue = c.getValue(); + } + }); + // Set items stored in originalValue, ugly - set a flag to reset the originalValue + // during the horrible onSetValue. This will allow trackResetOnLoad to function. + this.resetOriginal = true; + this.setValue(this.originalValue); + delete this.resetOriginal; + } else { + this.eachItem(function(c){ + if(c.reset){ + c.reset(); + } + }); + } // Defer the clearInvalid so if BaseForm's collection is being iterated it will be called AFTER it is complete. // Important because reset is being called on both the group and the individual items. (function() { @@ -344,14 +369,33 @@ myCheckboxGroup.setValue('cb-col-1,cb-col-3'); return this; }, + /** + * @private + * Sets the values of one or more of the items within the CheckboxGroup + * @param {String|Array|Object} id Can take multiple forms. Can be optionally: + * + * @param {String} value The value to set the field to if the first argument was a string + */ onSetValue: function(id, value){ if(arguments.length == 1){ if(Ext.isArray(id)){ - // an array of boolean values Ext.each(id, function(val, idx){ - var item = this.items.itemAt(idx); - if(item){ - item.setValue(val); + if (Ext.isObject(val) && val.setValue){ // array of checkbox components to be checked + val.setValue(true); + if (this.resetOriginal === true) { + val.originalValue = val.getValue(); + } + } else { // an array of boolean values + var item = this.items.itemAt(idx); + if(item){ + item.setValue(val); + } } }, this); }else if(Ext.isObject(id)){ @@ -376,6 +420,9 @@ myCheckboxGroup.setValue('cb-col-1,cb-col-3'); // private beforeDestroy: function(){ Ext.destroy(this.panel); + if (!this.rendered) { + Ext.destroy(this.items); + } Ext.form.CheckboxGroup.superclass.beforeDestroy.call(this); }, @@ -415,10 +462,15 @@ myCheckboxGroup.setValue('cb-col-1,cb-col-3'); return out; }, - // private - eachItem: function(fn){ + /** + * @private + * Convenience function which passes the given function to every item in the composite + * @param {Function} fn The function to call + * @param {Object} scope Optional scope object + */ + eachItem: function(fn, scope) { if(this.items && this.items.each){ - this.items.each(fn, this); + this.items.each(fn, scope || this); } },