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',
combineLabels: false,
labelConnector: ', ',
combineErrors: false,
maskOnDisable: false,
fieldSubTpl: '{%this.renderContainer(out,values)%}',
initComponent: function() {
var me = this;
me.initLabelable();
me.initFieldAncestor();
me.callParent();
},
beforeRender: function(){
this.callParent(arguments);
this.beforeLabelableRender(arguments);
},
onLabelableAdded: function(labelable) {
var me = this;
me.mixins.fieldAncestor.onLabelableAdded.call(this, labelable);
me.updateLabel();
},
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());
},
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;
},
updateLabel: function() {
var me = this,
label = me.labelEl;
if (label) {
me.setFieldLabel(me.getFieldLabel());
}
},
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();
}
}
},
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();
}
});