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