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>
|