| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837 | <!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-Labelable'>/**</span> * A mixin which allows a component to be configured and decorated with a label and/or error message as is * common for form fields. This is used by e.g. Ext.form.field.Base and Ext.form.FieldContainer * to let them be managed by the Field layout. * * NOTE: This mixin is mainly for internal library use and most users should not need to use it directly. It * is more likely you will want to use one of the component classes that import this mixin, such as * Ext.form.field.Base or Ext.form.FieldContainer. * * Use of this mixin does not make a component a field in the logical sense, meaning it does not provide any * logic or state related to values or validation; that is handled by the related Ext.form.field.Field * mixin. These two mixins may be used separately (for example Ext.form.FieldContainer is Labelable but not a * Field), or in combination (for example Ext.form.field.Base implements both and has logic for connecting the * two.) * * Component classes which use this mixin should use the Field layout * or a derivation thereof to properly size and position the label and message according to the component config. * They must also call the {@link #initLabelable} method during component initialization to ensure the mixin gets * set up correctly. * * @docauthor Jason Johnston <jason@sencha.com> */Ext.define("Ext.form.Labelable", {    requires: ['Ext.XTemplate'],    autoEl: {        tag: 'table',        cellpadding: 0    },    childEls: [<span id='Ext-form-Labelable-property-labelCell'>        /**</span>         * @property {Ext.Element} labelCell         * The `<TD>` Element which contains the label Element for this component. Only available after the component has been rendered.         */        'labelCell',<span id='Ext-form-Labelable-property-labelEl'>        /**</span>         * @property {Ext.Element} labelEl         * The label Element for this component. Only available after the component has been rendered.         */        'labelEl',<span id='Ext-form-Labelable-property-bodyEl'>        /**</span>         * @property {Ext.Element} bodyEl         * The div Element wrapping the component's contents. Only available after the component has been rendered.         */        'bodyEl',        // private - the TD which contains the msgTarget: 'side' error icon        'sideErrorCell',<span id='Ext-form-Labelable-property-errorEl'>        /**</span>         * @property {Ext.Element} errorEl         * The div Element that will contain the component's error message(s). Note that depending on the configured         * {@link #msgTarget}, this element may be hidden in favor of some other form of presentation, but will always         * be present in the DOM for use by assistive technologies.         */        'errorEl',        'inputRow',        'bottomPlaceHolder'    ],<span id='Ext-form-Labelable-cfg-labelableRenderTpl'>    /**</span>     * @cfg {String/String[]/Ext.XTemplate} labelableRenderTpl     * The rendering template for the field decorations. Component classes using this mixin     * should include logic to use this as their {@link Ext.AbstractComponent#renderTpl renderTpl},     * and implement the {@link #getSubTplMarkup} method to generate the field body content.     *     * The structure of a field is a table as follows:     *      * If `labelAlign: 'left', `msgTarget: 'side'`     *      *      +----------------------+----------------------+-------------+     *      | Label:               | InputField           | sideErrorEl |     *      +----------------------+----------------------+-------------+     *     * If `labelAlign: 'left', `msgTarget: 'under'`     *      *      +----------------------+------------------------------------+     *      | Label:               | InputField      (colspan=2)        |     *      |                      | underErrorEl                       |     *      +----------------------+------------------------------------+     *     * If `labelAlign: 'top', `msgTarget: 'side'`     *     *      +---------------------------------------------+-------------+     *      | label                                       |             |     *      | InputField                                  | sideErrorEl |     *      +---------------------------------------------+-------------+     *     * If `labelAlign: 'top', `msgTarget: 'under'`     *      *      +-----------------------------------------------------------+     *      | label                                                     |     *      | InputField                      (colspan=2)               |     *      | underErrorEl                                              |     *      +-----------------------------------------------------------+     *     * The total columns always the same for fields with each setting of {@link #labelAlign} because when     * rendered into a {@link Ext.layout.container.Form} layout, just the `TR` of the table     * will be placed into the form's main `TABLE`, and the columns of all the siblings     * must match so that they all line up. In a {@link Ext.layout.container.Form} layout, different     * settings of {@link #labelAlign} are not supported because of the incompatible column structure.     *     * When the triggerCell or side error cell are hidden or shown, the input cell's colspan     * is recalculated to maintain the correct 3 visible column count.     * @private     */    labelableRenderTpl: [        // body row. If a heighted Field (eg TextArea, HtmlEditor, this must greedily consume height.        '<tr id="{id}-inputRow" <tpl if="inFormLayout">id="{id}"</tpl>>',            // Label cell            '<tpl if="labelOnLeft">',                '<td id="{id}-labelCell" style="{labelCellStyle}" {labelCellAttrs}>',                    '{beforeLabelTpl}',                    '<label id="{id}-labelEl" {labelAttrTpl}<tpl if="inputId"> for="{inputId}"</tpl> class="{labelCls}"',                        '<tpl if="labelStyle"> style="{labelStyle}"</tpl>>',                        '{beforeLabelTextTpl}',                        '<tpl if="fieldLabel">{fieldLabel}{labelSeparator}</tpl>',                        '{afterLabelTextTpl}',                    '</label>',                    '{afterLabelTpl}',                '</td>',            '</tpl>',            // Body of the input. That will be an input element, or, from a TriggerField, a table containing an input cell and trigger cell(s)            '<td class="{baseBodyCls} {fieldBodyCls}" id="{id}-bodyEl" colspan="{bodyColspan}" role="presentation">',                '{beforeBodyEl}',                // Label just sits on top of the input field if labelAlign === 'top'                '<tpl if="labelAlign==\'top\'">',                    '{beforeLabelTpl}',                    '<div id="{id}-labelCell" style="{labelCellStyle}">',                        '<label id="{id}-labelEl" {labelAttrTpl}<tpl if="inputId"> for="{inputId}"</tpl> class="{labelCls}"',                            '<tpl if="labelStyle"> style="{labelStyle}"</tpl>>',                            '{beforeLabelTextTpl}',                            '<tpl if="fieldLabel">{fieldLabel}{labelSeparator}</tpl>',                            '{afterLabelTextTpl}',                        '</label>',                    '</div>',                    '{afterLabelTpl}',                '</tpl>',                '{beforeSubTpl}',                '{[values.$comp.getSubTplMarkup()]}',                '{afterSubTpl}',            // Final TD. It's a side error element unless there's a floating external one            '<tpl if="msgTarget===\'side\'">',                '{afterBodyEl}',                '</td>',                '<td id="{id}-sideErrorCell" vAlign="{[values.labelAlign===\'top\' && !values.hideLabel ? \'bottom\' : \'middle\']}" style="{[values.autoFitErrors ? \'display:none\' : \'\']}" width="{errorIconWidth}">',                    '<div id="{id}-errorEl" class="{errorMsgCls}" style="display:none;width:{errorIconWidth}px"></div>',                '</td>',            '<tpl elseif="msgTarget==\'under\'">',                '<div id="{id}-errorEl" class="{errorMsgClass}" colspan="2" style="display:none"></div>',                '{afterBodyEl}',                '</td>',            '</tpl>',        '</tr>',        {            disableFormats: true        }    ],<span id='Ext-form-Labelable-cfg-activeErrorsTpl'>    /**</span>     * @cfg {String/String[]/Ext.XTemplate} activeErrorsTpl     * The template used to format the Array of error messages passed to {@link #setActiveErrors} into a single HTML     * string. By default this renders each message as an item in an unordered list.     */    activeErrorsTpl: [        '<tpl if="errors && errors.length">',            '<ul><tpl for="errors"><li>{.}</li></tpl></ul>',        '</tpl>'    ],<span id='Ext-form-Labelable-property-isFieldLabelable'>    /**</span>     * @property {Boolean} isFieldLabelable     * Flag denoting that this object is labelable as a field. Always true.     */    isFieldLabelable: true,<span id='Ext-form-Labelable-cfg-formItemCls'>    /**</span>     * @cfg {String} formItemCls     * A CSS class to be applied to the outermost element to denote that it is participating in the form field layout.     */    formItemCls: Ext.baseCSSPrefix + 'form-item',<span id='Ext-form-Labelable-cfg-labelCls'>    /**</span>     * @cfg {String} labelCls     * The CSS class to be applied to the label element. This (single) CSS class is used to formulate the renderSelector     * and drives the field layout where it is concatenated with a hyphen ('-') and {@link #labelAlign}. To add     * additional classes, use {@link #labelClsExtra}.     */    labelCls: Ext.baseCSSPrefix + 'form-item-label',<span id='Ext-form-Labelable-cfg-labelClsExtra'>    /**</span>     * @cfg {String} labelClsExtra     * An optional string of one or more additional CSS classes to add to the label element. Defaults to empty.     */<span id='Ext-form-Labelable-cfg-errorMsgCls'>    /**</span>     * @cfg {String} errorMsgCls     * The CSS class to be applied to the error message element.     */    errorMsgCls: Ext.baseCSSPrefix + 'form-error-msg',<span id='Ext-form-Labelable-cfg-baseBodyCls'>    /**</span>     * @cfg {String} baseBodyCls     * The CSS class to be applied to the body content element.     */    baseBodyCls: Ext.baseCSSPrefix + 'form-item-body',<span id='Ext-form-Labelable-cfg-fieldBodyCls'>    /**</span>     * @cfg {String} fieldBodyCls     * An extra CSS class to be applied to the body content element in addition to {@link #baseBodyCls}.     */    fieldBodyCls: '',<span id='Ext-form-Labelable-cfg-clearCls'>    /**</span>     * @cfg {String} clearCls     * The CSS class to be applied to the special clearing div rendered directly after the field contents wrapper to     * provide field clearing.     */    clearCls: Ext.baseCSSPrefix + 'clear',<span id='Ext-form-Labelable-cfg-invalidCls'>    /**</span>     * @cfg {String} invalidCls     * The CSS class to use when marking the component invalid.     */    invalidCls : Ext.baseCSSPrefix + 'form-invalid',<span id='Ext-form-Labelable-cfg-fieldLabel'>    /**</span>     * @cfg {String} fieldLabel     * The label for the field. It gets appended with the {@link #labelSeparator}, and its position and sizing is     * determined by the {@link #labelAlign}, {@link #labelWidth}, and {@link #labelPad} configs.     */    fieldLabel: undefined,<span id='Ext-form-Labelable-cfg-labelAlign'>    /**</span>     * @cfg {String} labelAlign     * Controls the position and alignment of the {@link #fieldLabel}. Valid values are:     *     *   - "left" (the default) - The label is positioned to the left of the field, with its text aligned to the left.     *     Its width is determined by the {@link #labelWidth} config.     *   - "top" - The label is positioned above the field.     *   - "right" - The label is positioned to the left of the field, with its text aligned to the right.     *     Its width is determined by the {@link #labelWidth} config.     */    labelAlign : 'left',<span id='Ext-form-Labelable-cfg-labelWidth'>    /**</span>     * @cfg {Number} labelWidth     * The width of the {@link #fieldLabel} in pixels. Only applicable if the {@link #labelAlign} is set to "left" or     * "right".     */    labelWidth: 100,<span id='Ext-form-Labelable-cfg-labelPad'>    /**</span>     * @cfg {Number} labelPad     * The amount of space in pixels between the {@link #fieldLabel} and the input field.     */    labelPad : 5,    //<locale><span id='Ext-form-Labelable-cfg-labelSeparator'>    /**</span>     * @cfg {String} labelSeparator     * Character(s) to be inserted at the end of the {@link #fieldLabel label text}.     *     * Set to empty string to hide the separator completely.     */    labelSeparator : ':',    //</locale><span id='Ext-form-Labelable-cfg-labelStyle'>    /**</span>     * @cfg {String} labelStyle     * A CSS style specification string to apply directly to this field's label.     */<span id='Ext-form-Labelable-cfg-hideLabel'>    /**</span>     * @cfg {Boolean} hideLabel     * Set to true to completely hide the label element ({@link #fieldLabel} and {@link #labelSeparator}). Also see     * {@link #hideEmptyLabel}, which controls whether space will be reserved for an empty fieldLabel.     */    hideLabel: false,<span id='Ext-form-Labelable-cfg-hideEmptyLabel'>    /**</span>     * @cfg {Boolean} hideEmptyLabel     * When set to true, the label element ({@link #fieldLabel} and {@link #labelSeparator}) will be automatically     * hidden if the {@link #fieldLabel} is empty. Setting this to false will cause the empty label element to be     * rendered and space to be reserved for it; this is useful if you want a field without a label to line up with     * other labeled fields in the same form.     *     * If you wish to unconditionall hide the label even if a non-empty fieldLabel is configured, then set the     * {@link #hideLabel} config to true.     */    hideEmptyLabel: true,<span id='Ext-form-Labelable-cfg-preventMark'>    /**</span>     * @cfg {Boolean} preventMark     * true to disable displaying any {@link #setActiveError error message} set on this object.     */    preventMark: false,<span id='Ext-form-Labelable-cfg-autoFitErrors'>    /**</span>     * @cfg {Boolean} autoFitErrors     * Whether to adjust the component's body area to make room for 'side' or 'under' {@link #msgTarget error messages}.     */    autoFitErrors: true,<span id='Ext-form-Labelable-cfg-msgTarget'>    /**</span>     * @cfg {String} msgTarget     * The location where the error message text should display. Must be one of the following values:     *     *   - `qtip` Display a quick tip containing the message when the user hovers over the field.     *     This is the default.     *     *     **{@link Ext.tip.QuickTipManager#init} must have been called for this setting to work.**     *     *   - `title` Display the message in a default browser title attribute popup.     *   - `under` Add a block div beneath the field containing the error message.     *   - `side` Add an error icon to the right of the field, displaying the message in a popup on hover.     *   - `none` Don't display any error message. This might be useful if you are implementing custom error display.     *   - `[element id]` Add the error message directly to the innerHTML of the specified element.     */    msgTarget: 'qtip',<span id='Ext-form-Labelable-cfg-activeError'>    /**</span>     * @cfg {String} activeError     * If specified, then the component will be displayed with this value as its active error when first rendered. Use     * {@link #setActiveError} or {@link #unsetActiveError} to change it after component creation.     */<span id='Ext-form-Labelable-property-noWrap'>    /**</span>     * @private     * Tells the layout system that the height can be measured immediately because the width does not need setting.     */    noWrap: true,    labelableInsertions: [<span id='Ext-form-Labelable-cfg-beforeBodyEl'>        /**</span>         * @cfg {String/Array/Ext.XTemplate} beforeBodyEl         * An optional string or `XTemplate` configuration to insert in the field markup         * at the beginning of the input containing element. If an `XTemplate` is used, the component's {@link Ext.AbstractComponent#renderData render data}         * serves as the context.         */        'beforeBodyEl',<span id='Ext-form-Labelable-cfg-afterBodyEl'>        /**</span>         * @cfg {String/Array/Ext.XTemplate} afterBodyEl         * An optional string or `XTemplate` configuration to insert in the field markup         * at the end of the input containing element. If an `XTemplate` is used, the component's {@link Ext.AbstractComponent#renderData render data}         * serves as the context.         */        'afterBodyEl',<span id='Ext-form-Labelable-cfg-beforeLabelTpl'>        /**</span>         * @cfg {String/Array/Ext.XTemplate} beforeLabelTpl         * An optional string or `XTemplate` configuration to insert in the field markup         * before the label element. If an `XTemplate` is used, the component's {@link Ext.AbstractComponent#renderData render data}         * serves as the context.         */        'beforeLabelTpl',<span id='Ext-form-Labelable-cfg-afterLabelTpl'>        /**</span>         * @cfg {String/Array/Ext.XTemplate} afterLabelTpl         * An optional string or `XTemplate` configuration to insert in the field markup         * after the label element. If an `XTemplate` is used, the component's {@link Ext.AbstractComponent#renderData render data}         * serves as the context.         */        'afterLabelTpl',<span id='Ext-form-Labelable-cfg-beforeSubTpl'>        /**</span>         * @cfg {String/Array/Ext.XTemplate} beforeSubTpl         * An optional string or `XTemplate` configuration to insert in the field markup         * before the {@link #getSubTplMarkup subTpl markup}. If an `XTemplate` is used, the         * component's {@link Ext.AbstractComponent#renderData render data} serves as the context.         */        'beforeSubTpl',<span id='Ext-form-Labelable-cfg-afterSubTpl'>        /**</span>         * @cfg {String/Array/Ext.XTemplate} afterSubTpl         * An optional string or `XTemplate` configuration to insert in the field markup         * after the {@link #getSubTplMarkup subTpl markup}. If an `XTemplate` is used, the         * component's {@link Ext.AbstractComponent#renderData render data} serves as the context.         */        'afterSubTpl',<span id='Ext-form-Labelable-cfg-beforeLabelTextTpl'>        /**</span>         * @cfg {String/Array/Ext.XTemplate} beforeLabelTextTpl         * An optional string or `XTemplate` configuration to insert in the field markup         * before the label text. If an `XTemplate` is used, the component's {@link Ext.AbstractComponent#renderData render data}         * serves as the context.         */        'beforeLabelTextTpl',<span id='Ext-form-Labelable-cfg-afterLabelTextTpl'>        /**</span>         * @cfg {String/Array/Ext.XTemplate} afterLabelTextTpl         * An optional string or `XTemplate` configuration to insert in the field markup         * after the label text. If an `XTemplate` is used, the component's {@link Ext.AbstractComponent#renderData render data}         * serves as the context.         */        'afterLabelTextTpl',<span id='Ext-form-Labelable-cfg-labelAttrTpl'>        /**</span>         * @cfg {String/Array/Ext.XTemplate} labelAttrTpl         * An optional string or `XTemplate` configuration to insert in the field markup         * inside the label element (as attributes). If an `XTemplate` is used, the component's         * {@link Ext.AbstractComponent#renderData render data} serves as the context.         */        'labelAttrTpl'    ],    // This is an array to avoid a split on every call to Ext.copyTo    labelableRenderProps: [ 'allowBlank', 'id', 'labelAlign', 'fieldBodyCls', 'baseBodyCls',                            'clearCls', 'labelSeparator', 'msgTarget' ],<span id='Ext-form-Labelable-method-initLabelable'>    /**</span>     * Performs initialization of this mixin. Component classes using this mixin should call this method during their     * own initialization.     */    initLabelable: function() {        var me = this,            padding = me.padding;        // This Component is rendered as a table. Padding doesn't work on tables        // Before padding can be applied to the encapsulating table element, copy the padding into        // an extraMargins property which is to be added to all computed margins post render :(        if (padding) {            me.padding = undefined;            me.extraMargins = Ext.Element.parseBox(padding);        }        me.addCls(me.formItemCls);                // Prevent first render of active error, at Field render time from signalling a change from undefined to "        me.lastActiveError = '';        me.addEvents(<span id='Ext-form-Labelable-event-errorchange'>            /**</span>             * @event errorchange             * Fires when the active error message is changed via {@link #setActiveError}.             * @param {Ext.form.Labelable} this             * @param {String} error The active error message             */            'errorchange'        );    },<span id='Ext-form-Labelable-method-trimLabelSeparator'>    /**</span>     * Returns the trimmed label by slicing off the label separator character. Can be overridden.     * @return {String} The trimmed field label, or empty string if not defined     */    trimLabelSeparator: function() {        var me = this,            separator = me.labelSeparator,            label = me.fieldLabel || '',            lastChar = label.substr(label.length - 1);        // if the last char is the same as the label separator then slice it off otherwise just return label value        return lastChar === separator ? label.slice(0, -1) : label;    },<span id='Ext-form-Labelable-method-getFieldLabel'>    /**</span>     * Returns the label for the field. Defaults to simply returning the {@link #fieldLabel} config. Can be overridden     * to provide a custom generated label.     * @template     * @return {String} The configured field label, or empty string if not defined     */    getFieldLabel: function() {        return this.trimLabelSeparator();    },    <span id='Ext-form-Labelable-method-setFieldLabel'>    /**</span>     * Set the label of this field.     * @param {String} label The new label. The {@link #labelSeparator} will be automatically appended to the label     * string.     */    setFieldLabel: function(label){        label = label || '';                var me = this,            separator = me.labelSeparator,            labelEl = me.labelEl;                me.fieldLabel = label;        if (me.rendered) {            if (Ext.isEmpty(label) && me.hideEmptyLabel) {                labelEl.parent().setDisplayed('none');            } else {                if (separator) {                    label = me.trimLabelSeparator() + separator;                }                labelEl.update(label);                labelEl.parent().setDisplayed('');            }            me.updateLayout();        }    },    getInsertionRenderData: function (data, names) {        var i = names.length,            name, value;        while (i--) {            name = names[i];            value = this[name];            if (value) {                if (typeof value != 'string') {                    if (!value.isTemplate) {                        value = Ext.XTemplate.getTpl(this, name);                    }                    value = value.apply(data);                }            }            data[name] = value || '';        }        return data;    },<span id='Ext-form-Labelable-method-getLabelableRenderData'>    /**</span>     * Generates the arguments for the field decorations {@link #labelableRenderTpl rendering template}.     * @return {Object} The template arguments     * @protected     */    getLabelableRenderData: function() {        var me = this,            data,            tempEl,            topLabel = me.labelAlign === 'top';        if (!Ext.form.Labelable.errorIconWidth) {            Ext.form.Labelable.errorIconWidth = (tempEl = Ext.resetElement.createChild({style: 'position:absolute', cls: Ext.baseCSSPrefix + 'form-invalid-icon'})).getWidth();            tempEl.remove();        }        data = Ext.copyTo({            inFormLayout   : me.ownerLayout && me.ownerLayout.type === 'form',            inputId        : me.getInputId(),            labelOnLeft    : !topLabel,            hideLabel      : !me.hasVisibleLabel(),            fieldLabel     : me.getFieldLabel(),            labelCellStyle : me.getLabelCellStyle(),            labelCellAttrs : me.getLabelCellAttrs(),            labelCls       : me.getLabelCls(),            labelStyle     : me.getLabelStyle(),            bodyColspan    : me.getBodyColspan(),            externalError  : !me.autoFitErrors,            errorMsgCls    : me.getErrorMsgCls(),            errorIconWidth : Ext.form.Labelable.errorIconWidth        },        me, me.labelableRenderProps, true);        me.getInsertionRenderData(data, me.labelableInsertions);        return data;    },        beforeLabelableRender: function() {        var me = this;        if (me.ownerLayout) {            me.addCls(Ext.baseCSSPrefix + me.ownerLayout.type + '-form-item');        }    },    onLabelableRender: function() {        var me = this,            margins,            side,            style = {};        if (me.extraMargins) {            margins = me.el.getMargin();            for (side in margins) {                if (margins.hasOwnProperty(side)) {                    style['margin-' + side] = (margins[side] + me.extraMargins[side]) + 'px';                }            }            me.el.setStyle(style);        }    },    <span id='Ext-form-Labelable-method-hasVisibleLabel'>    /**</span>     * Checks if the field has a visible label     * @return {Boolean} True if the field has a visible label     */    hasVisibleLabel: function(){        if (this.hideLabel) {            return false;        }        return !(this.hideEmptyLabel && !this.getFieldLabel());    },    <span id='Ext-form-Labelable-method-getBodyColspan'>    /**</span>     * @private     * Calculates the colspan value for the body cell - the cell which contains the input field.     *     * The field table structure contains 4 columns:     */    getBodyColspan: function() {        var me = this,            result;        if (me.msgTarget === 'side' && (!me.autoFitErrors || me.hasActiveError())) {            result = 1;        } else {            result = 2;        }        if (me.labelAlign !== 'top' && !me.hasVisibleLabel()) {            result++;        }        return result;    },        getLabelCls: function() {        var labelCls = this.labelCls,            labelClsExtra = this.labelClsExtra;        if (this.labelAlign === 'top') {            labelCls += '-top';        }        return labelClsExtra ? labelCls + ' ' + labelClsExtra : labelCls;    },    getLabelCellStyle: function() {        var me = this,            hideLabelCell = me.hideLabel || (!me.fieldLabel && me.hideEmptyLabel);        return hideLabelCell ? 'display:none;' : '';    },        getErrorMsgCls: function() {        var me = this,            hideLabelCell = (me.hideLabel || (!me.fieldLabel && me.hideEmptyLabel));                return me.errorMsgCls + (!hideLabelCell && me.labelAlign === 'top' ? ' ' + Ext.baseCSSPrefix + 'lbl-top-err-icon' : '');    },    getLabelCellAttrs: function() {        var me = this,            labelAlign = me.labelAlign,            result = '';        if (labelAlign !== 'top') {            result = 'valign="top" halign="' + labelAlign + '" width="' + (me.labelWidth + me.labelPad) + '"';        }        return result + ' class="' + Ext.baseCSSPrefix + 'field-label-cell"';    },    <span id='Ext-form-Labelable-method-getLabelStyle'>    /**</span>     * Gets any label styling for the labelEl     * @private     * @return {String} The label styling     */    getLabelStyle: function(){        var me = this,            labelPad = me.labelPad,            labelStyle = '';        // Calculate label styles up front rather than in the Field layout for speed; this        // is safe because label alignment/width/pad are not expected to change.        if (me.labelAlign !== 'top') {            if (me.labelWidth) {                labelStyle = 'width:' + me.labelWidth + 'px;';            }            labelStyle += 'margin-right:' + labelPad + 'px;';        }                return labelStyle + (me.labelStyle || '');    },<span id='Ext-form-Labelable-method-getSubTplMarkup'>    /**</span>     * Gets the markup to be inserted into the outer template's bodyEl. Defaults to empty string, should be implemented     * by classes including this mixin as needed.     * @return {String} The markup to be inserted     * @protected     */    getSubTplMarkup: function() {        return '';    },<span id='Ext-form-Labelable-method-getInputId'>    /**</span>     * Get the input id, if any, for this component. This is used as the "for" attribute on the label element.     * Implementing subclasses may also use this as e.g. the id for their own input element.     * @return {String} The input id     */    getInputId: function() {        return '';    },<span id='Ext-form-Labelable-method-getActiveError'>    /**</span>     * Gets the active error message for this component, if any. This does not trigger validation on its own, it merely     * returns any message that the component may already hold.     * @return {String} The active error message on the component; if there is no error, an empty string is returned.     */    getActiveError : function() {        return this.activeError || '';    },<span id='Ext-form-Labelable-method-hasActiveError'>    /**</span>     * Tells whether the field currently has an active error message. This does not trigger validation on its own, it     * merely looks for any message that the component may already hold.     * @return {Boolean}     */    hasActiveError: function() {        return !!this.getActiveError();    },<span id='Ext-form-Labelable-method-setActiveError'>    /**</span>     * Sets the active error message to the given string. This replaces the entire error message contents with the given     * string. Also see {@link #setActiveErrors} which accepts an Array of messages and formats them according to the     * {@link #activeErrorsTpl}. Note that this only updates the error message element's text and attributes, you'll     * have to call doComponentLayout to actually update the field's layout to match. If the field extends {@link     * Ext.form.field.Base} you should call {@link Ext.form.field.Base#markInvalid markInvalid} instead.     * @param {String} msg The error message     */    setActiveError: function(msg) {        this.setActiveErrors(msg);    },<span id='Ext-form-Labelable-method-getActiveErrors'>    /**</span>     * Gets an Array of any active error messages currently applied to the field. This does not trigger validation on     * its own, it merely returns any messages that the component may already hold.     * @return {String[]} The active error messages on the component; if there are no errors, an empty Array is     * returned.     */    getActiveErrors: function() {        return this.activeErrors || [];    },<span id='Ext-form-Labelable-method-setActiveErrors'>    /**</span>     * Set the active error message to an Array of error messages. The messages are formatted into a single message     * string using the {@link #activeErrorsTpl}. Also see {@link #setActiveError} which allows setting the entire error     * contents with a single string. Note that this only updates the error message element's text and attributes,     * you'll have to call doComponentLayout to actually update the field's layout to match. If the field extends     * {@link Ext.form.field.Base} you should call {@link Ext.form.field.Base#markInvalid markInvalid} instead.     * @param {String[]} errors The error messages     */    setActiveErrors: function(errors) {        errors = Ext.Array.from(errors);        this.activeError = errors[0];        this.activeErrors = errors;        this.activeError = this.getTpl('activeErrorsTpl').apply({errors: errors});        this.renderActiveError();    },<span id='Ext-form-Labelable-method-unsetActiveError'>    /**</span>     * Clears the active error message(s). Note that this only clears the error message element's text and attributes,     * you'll have to call doComponentLayout to actually update the field's layout to match. If the field extends {@link     * Ext.form.field.Base} you should call {@link Ext.form.field.Base#clearInvalid clearInvalid} instead.     */    unsetActiveError: function() {        delete this.activeError;        delete this.activeErrors;        this.renderActiveError();    },<span id='Ext-form-Labelable-method-renderActiveError'>    /**</span>     * @private     * Updates the rendered DOM to match the current activeError. This only updates the content and     * attributes, you'll have to call doComponentLayout to actually update the display.     */    renderActiveError: function() {        var me = this,            activeError = me.getActiveError(),            hasError = !!activeError;        if (activeError !== me.lastActiveError) {            me.fireEvent('errorchange', me, activeError);            me.lastActiveError = activeError;        }        if (me.rendered && !me.isDestroyed && !me.preventMark) {            // Add/remove invalid class            me.el[hasError ? 'addCls' : 'removeCls'](me.invalidCls);            // Update the aria-invalid attribute            me.getActionEl().dom.setAttribute('aria-invalid', hasError);            // Update the errorEl (There will only be one if msgTarget is 'side' or 'under') with the error message text            if (me.errorEl) {                me.errorEl.dom.innerHTML = activeError;            }        }    },<span id='Ext-form-Labelable-method-setFieldDefaults'>    /**</span>     * Applies a set of default configuration values to this Labelable instance. For each of the properties in the given     * object, check if this component hasOwnProperty that config; if not then it's inheriting a default value from its     * prototype and we should apply the default value.     * @param {Object} defaults The defaults to apply to the object.     */    setFieldDefaults: function(defaults) {        var me = this,            val, key;        for (key in defaults) {            if (defaults.hasOwnProperty(key)) {                val = defaults[key];                if (!me.hasOwnProperty(key)) {                    me[key] = val;                }            }        }    }});</pre></body></html>
 |