| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314 | <!DOCTYPE html><html><head>  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  <title>The source code</title>  <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />  <script type="text/javascript" src="../resources/prettify/prettify.js"></script>  <style type="text/css">    .highlight { display: block; background-color: #ddd; }  </style>  <script type="text/javascript">    function highlight() {      document.getElementById(location.hash.replace(/#/, "")).className = "highlight";    }  </script></head><body onload="prettyPrint(); highlight();">  <pre class="prettyprint lang-js"><span id='Ext-form-FieldContainer'>/**</span> * FieldContainer is a derivation of {@link Ext.container.Container Container} that implements the * {@link Ext.form.Labelable Labelable} mixin. This allows it to be configured so that it is rendered with * a {@link #fieldLabel field label} and optional {@link #msgTarget error message} around its sub-items. * This is useful for arranging a group of fields or other components within a single item in a form, so * that it lines up nicely with other fields. A common use is for grouping a set of related fields under * a single label in a form. *  * The container's configured {@link #cfg-items} will be layed out within the field body area according to the * configured {@link #layout} type. The default layout is `'autocontainer'`. *  * Like regular fields, FieldContainer can inherit its decoration configuration from the * {@link Ext.form.Panel#fieldDefaults fieldDefaults} of an enclosing FormPanel. In addition, * FieldContainer itself can pass {@link #fieldDefaults} to any {@link Ext.form.Labelable fields} * it may itself contain. *  * If you are grouping a set of {@link Ext.form.field.Checkbox Checkbox} or {@link Ext.form.field.Radio Radio} * fields in a single labeled container, consider using a {@link Ext.form.CheckboxGroup} * or {@link Ext.form.RadioGroup} instead as they are specialized for handling those types. * * # Example *  *     @example *     Ext.create('Ext.form.Panel', { *         title: 'FieldContainer Example', *         width: 550, *         bodyPadding: 10, *  *         items: [{ *             xtype: 'fieldcontainer', *             fieldLabel: 'Last Three Jobs', *             labelWidth: 100, *  *             // The body area will contain three text fields, arranged *             // horizontally, separated by draggable splitters. *             layout: 'hbox', *             items: [{ *                 xtype: 'textfield', *                 flex: 1 *             }, { *                 xtype: 'splitter' *             }, { *                 xtype: 'textfield', *                 flex: 1 *             }, { *                 xtype: 'splitter' *             }, { *                 xtype: 'textfield', *                 flex: 1 *             }] *         }], *         renderTo: Ext.getBody() *     }); *  * # Usage of fieldDefaults * *     @example *     Ext.create('Ext.form.Panel', { *         title: 'FieldContainer Example', *         width: 350, *         bodyPadding: 10, *  *         items: [{ *             xtype: 'fieldcontainer', *             fieldLabel: 'Your Name', *             labelWidth: 75, *             defaultType: 'textfield', *  *             // Arrange fields vertically, stretched to full width *             layout: 'anchor', *             defaults: { *                 layout: '100%' *             }, *  *             // These config values will be applied to both sub-fields, except *             // for Last Name which will use its own msgTarget. *             fieldDefaults: { *                 msgTarget: 'under', *                 labelAlign: 'top' *             }, *  *             items: [{ *                 fieldLabel: 'First Name', *                 name: 'firstName' *             }, { *                 fieldLabel: 'Last Name', *                 name: 'lastName', *                 msgTarget: 'under' *             }] *         }], *         renderTo: Ext.getBody() *     }); *  * @docauthor Jason Johnston <jason@sencha.com> */Ext.define('Ext.form.FieldContainer', {    extend: 'Ext.container.Container',    mixins: {        labelable: 'Ext.form.Labelable',        fieldAncestor: 'Ext.form.FieldAncestor'    },    requires: 'Ext.layout.component.field.FieldContainer',    alias: 'widget.fieldcontainer',    componentLayout: 'fieldcontainer',        componentCls: Ext.baseCSSPrefix + 'form-fieldcontainer',<span id='Ext-form-FieldContainer-cfg-combineLabels'>    /**</span>     * @cfg {Boolean} combineLabels     * If set to true, and there is no defined {@link #fieldLabel}, the field container will automatically     * generate its label by combining the labels of all the fields it contains. Defaults to false.     */    combineLabels: false,    //<locale><span id='Ext-form-FieldContainer-cfg-labelConnector'>    /**</span>     * @cfg {String} labelConnector     * The string to use when joining the labels of individual sub-fields, when {@link #combineLabels} is     * set to true. Defaults to ', '.     */    labelConnector: ', ',    //</locale><span id='Ext-form-FieldContainer-cfg-combineErrors'>    /**</span>     * @cfg {Boolean} combineErrors     * If set to true, the field container will automatically combine and display the validation errors from     * all the fields it contains as a single error on the container, according to the configured     * {@link #msgTarget}. Defaults to false.     */    combineErrors: false,    maskOnDisable: false,    fieldSubTpl: '{%this.renderContainer(out,values)%}',    initComponent: function() {        var me = this;        // Init mixins        me.initLabelable();        me.initFieldAncestor();        me.callParent();    },    beforeRender: function(){        this.callParent(arguments);        this.beforeLabelableRender(arguments);    },<span id='Ext-form-FieldContainer-method-onLabelableAdded'>    /**</span>     * @protected Called when a {@link Ext.form.Labelable} instance is added to the container's subtree.     * @param {Ext.form.Labelable} labelable The instance that was added     */    onLabelableAdded: function(labelable) {        var me = this;        me.mixins.fieldAncestor.onLabelableAdded.call(this, labelable);        me.updateLabel();    },<span id='Ext-form-FieldContainer-method-onLabelableRemoved'>    /**</span>     * @protected Called when a {@link Ext.form.Labelable} instance is removed from the container's subtree.     * @param {Ext.form.Labelable} labelable The instance that was removed     */    onLabelableRemoved: function(labelable) {        var me = this;        me.mixins.fieldAncestor.onLabelableRemoved.call(this, labelable);        me.updateLabel();    },    initRenderTpl: function() {        var me = this;        if (!me.hasOwnProperty('renderTpl')) {            me.renderTpl = me.getTpl('labelableRenderTpl');        }        return me.callParent();    },    initRenderData: function() {        return Ext.applyIf(this.callParent(), this.getLabelableRenderData());    },<span id='Ext-form-FieldContainer-method-getFieldLabel'>    /**</span>     * Returns the combined field label if {@link #combineLabels} is set to true and if there is no     * set {@link #fieldLabel}. Otherwise returns the fieldLabel like normal. You can also override     * this method to provide a custom generated label.     * @template     * @return {String} The label, or empty string if none.     */    getFieldLabel: function() {        var label = this.fieldLabel || '';        if (!label && this.combineLabels) {            label = Ext.Array.map(this.query('[isFieldLabelable]'), function(field) {                return field.getFieldLabel();            }).join(this.labelConnector);        }        return label;    },    getSubTplData: function() {        var ret = this.initRenderData();        Ext.apply(ret, this.subTplData);        return ret;    },    getSubTplMarkup: function() {        var me = this,            tpl = me.getTpl('fieldSubTpl'),            html;        if (!tpl.renderContent) {            me.setupRenderTpl(tpl);        }        html = tpl.apply(me.getSubTplData());        return html;    },<span id='Ext-form-FieldContainer-method-updateLabel'>    /**</span>     * @private Updates the content of the labelEl if it is rendered     */    updateLabel: function() {        var me = this,            label = me.labelEl;        if (label) {            me.setFieldLabel(me.getFieldLabel());        }    },<span id='Ext-form-FieldContainer-method-onFieldErrorChange'>    /**</span>     * @private Fired when the error message of any field within the container changes, and updates the     * combined error message to match.     */    onFieldErrorChange: function(field, activeError) {        if (this.combineErrors) {            var me = this,                oldError = me.getActiveError(),                invalidFields = Ext.Array.filter(me.query('[isFormField]'), function(field) {                    return field.hasActiveError();                }),                newErrors = me.getCombinedErrors(invalidFields);            if (newErrors) {                me.setActiveErrors(newErrors);            } else {                me.unsetActiveError();            }            if (oldError !== me.getActiveError()) {                me.doComponentLayout();            }        }    },<span id='Ext-form-FieldContainer-method-getCombinedErrors'>    /**</span>     * Takes an Array of invalid {@link Ext.form.field.Field} objects and builds a combined list of error     * messages from them. Defaults to prepending each message by the field name and a colon. This     * can be overridden to provide custom combined error message handling, for instance changing     * the format of each message or sorting the array (it is sorted in order of appearance by default).     * @param {Ext.form.field.Field[]} invalidFields An Array of the sub-fields which are currently invalid.     * @return {String[]} The combined list of error messages     */    getCombinedErrors: function(invalidFields) {        var errors = [],            f,            fLen   = invalidFields.length,            field,            activeErrors, a, aLen,            error, label;        for (f = 0; f < fLen; f++) {            field = invalidFields[f];            activeErrors = field.getActiveErrors();            aLen         = activeErrors.length;            for (a = 0; a < aLen; a++) {                error = activeErrors[a];                label = field.getFieldLabel();                errors.push((label ? label + ': ' : '') + error);            }        }        return errors;    },    getTargetEl: function() {        return this.bodyEl || this.callParent();    }});</pre></body></html>
 |