var MenuItem = wp.media.view.MenuItem, PriorityList = wp.media.view.PriorityList, Menu; /** * wp.media.view.Menu * * @memberOf wp.media.view * * @class * @augments wp.media.view.PriorityList * @augments wp.media.View * @augments wp.Backbone.View * @augments Backbone.View */ Menu = PriorityList.extend(/** @lends wp.media.view.Menu.prototype */{ tagName: 'div', className: 'media-menu', property: 'state', ItemView: MenuItem, region: 'menu', attributes: { role: 'tablist', 'aria-orientation': 'horizontal' }, initialize: function() { this._views = {}; this.set( _.extend( {}, this._views, this.options.views ), { silent: true }); delete this.options.views; if ( ! this.options.silent ) { this.render(); } // Initialize the Focus Manager. this.focusManager = new wp.media.view.FocusManager( { el: this.el, mode: 'tabsNavigation' } ); // The menu is always rendered and can be visible or hidden on some frames. this.isVisible = true; }, /** * @param {Object} options * @param {string} id * @return {wp.media.View} */ toView: function( options, id ) { options = options || {}; options[ this.property ] = options[ this.property ] || id; return new this.ItemView( options ).render(); }, ready: function() { /** * call 'ready' directly on the parent class */ PriorityList.prototype.ready.apply( this, arguments ); this.visibility(); // Set up aria tabs initial attributes. this.focusManager.setupAriaTabs(); }, set: function() { /** * call 'set' directly on the parent class */ PriorityList.prototype.set.apply( this, arguments ); this.visibility(); }, unset: function() { /** * call 'unset' directly on the parent class */ PriorityList.prototype.unset.apply( this, arguments ); this.visibility(); }, visibility: function() { var region = this.region, view = this.controller[ region ].get(), views = this.views.get(), hide = ! views || views.length < 2; if ( this === view ) { // Flag this menu as hidden or visible. this.isVisible = ! hide; // Set or remove a CSS class to hide the menu. this.controller.$el.toggleClass( 'hide-' + region, hide ); } }, /** * @param {string} id */ select: function( id ) { var view = this.get( id ); if ( ! view ) { return; } this.deselect(); view.$el.addClass('active'); // Set up again the aria tabs initial attributes after the menu updates. this.focusManager.setupAriaTabs(); }, deselect: function() { this.$el.children().removeClass('active'); }, hide: function( id ) { var view = this.get( id ); if ( ! view ) { return; } view.$el.addClass('hidden'); }, show: function( id ) { var view = this.get( id ); if ( ! view ) { return; } view.$el.removeClass('hidden'); } }); module.exports = Menu;