/**
* The Widget Toolbars Utility
*
* @module aui-widget-toolbars
*/
var StdMod = A.WidgetStdMod;
/**
* A base class for Widget Toolbars.
*
* @class A.WidgetToolbars
* @constructor
*/
var WidgetToolbars = function() {};
/**
* Static property used to define the default attribute configuration.
*
* @property ATTRS
* @type Object
* @static
*/
WidgetToolbars.ATTRS = {
/**
* Collection of `A.Toolbar` instances.
*
* @attribute toolbars
* @default {}
* @type Object
*/
toolbars: {},
/**
* Collection of toolbar's header, body, and footer positions.
*
* @attribute toolbarPosition
* @type Object
*/
toolbarPosition: {
value: {
body: StdMod.AFTER,
footer: StdMod.AFTER,
header: StdMod.BEFORE
}
},
/**
* Collection of toolbar's header, body, and footer CSS classes.
*
* @attribute toolbarCssClass
* @type Object
*/
toolbarCssClass: {
value: {
body: '',
footer: '',
header: ''
}
}
};
WidgetToolbars.prototype = {
toolbars: null,
/**
* Construction logic executed during WidgetToolbars instantiation.
* Lifecycle.
*
* @method initializer
* @protected
*/
initializer: function() {
var instance = this;
instance.toolbars = {};
A.after(instance._syncUIToolbars, instance, 'syncUI');
instance.after('toolbarsChange', instance._afterToolbarsChange);
},
/**
* Includes a `A.Toolbar` instance into the widget.
*
* @method addToolbar
* @param toolbar
* @param section
* @return {A.Toolbar}
*/
addToolbar: function(toolbar, section) {
var instance = this;
section = instance.getToolbarSection(section);
instance.removeToolbar(section);
if (!A.instanceOf(toolbar, A.Toolbar)) {
toolbar = new A.Toolbar({
cssClass: this.get('toolbarCssClass.' + section) || '',
children: toolbar,
render: instance.getStdModNode(section, true)
});
}
toolbar.addTarget(instance);
instance.toolbars[section] = toolbar;
instance.setStdModContent(
section,
toolbar.get('boundingBox'),
instance.get('toolbarPosition.' + section));
instance._syncPrimaryButtonUI();
return toolbar;
},
/**
* Gets the `A.Toolbar` instance based on its section.
*
* @method getToolbar
* @param section
* @return {A.Toolbar}
*/
getToolbar: function(section) {
var instance = this;
return instance.toolbars[instance.getToolbarSection(section)];
},
/**
* Gets the toolbar's section. If no argument is passed, returns the
* `StdMod.FOOTER`.
*
* @method getToolbarSection
* @param section
* @return {String}
*
*/
getToolbarSection: function(section) {
return section || StdMod.FOOTER;
},
/**
* Destroys the `A.Toolbar` instance based on its section.
*
* @method removeToolbar
* @param section
*/
removeToolbar: function(section) {
var instance = this,
toolbar = instance.toolbars[instance.getToolbarSection(section)];
if (toolbar) {
toolbar.destroy();
}
return toolbar;
},
/**
* Sync the primary button on the UI.
*
* @method _syncPrimaryButtonUI
* @protected
*/
_syncPrimaryButtonUI: function() {
var instance = this,
primaryButtonNode = instance.get('boundingBox').one(
'.' + A.ButtonCore.CLASS_NAMES.PRIMARY);
if (primaryButtonNode) {
// TODO: Check double focus workaround
primaryButtonNode.focus().focus();
}
},
/**
* Sync `A.Toolbar` instances on the UI.
*
* @method _syncUIToolbars
* @protected
*/
_syncUIToolbars: function() {
var instance = this;
instance._uiSetToolbars(this.get('toolbars'));
},
/**
* Set `A.Toolbar` instances.
*
* @method _uiSetToolbars
* @protected
*/
_uiSetToolbars: function(val) {
var instance = this;
A.each(val, A.bind(instance.addToolbar, instance));
}
};
A.WidgetToolbars = WidgetToolbars;