API Docs for: 1.0.0
Show:

File: Resources/public/js/views/ez-usermenuview.js

/*
 * Copyright (C) eZ Systems AS. All rights reserved.
 * For full copyright and license information view LICENSE file distributed with this source code.
 */
YUI.add('ez-usermenuview', function (Y) {
    'use strict';
    /**
     * Provides the User Menu View class
     *
     * @module ez-usermenuview
     */
    Y.namespace('eZ');

    var CLASS_HIDDEN = 'is-user-menu-hidden';

    /**
     * The User Menu view
     *
     * @namespace eZ
     * @class UserMenuView
     * @constructor
     * @extends eZ.View
     */
    Y.eZ.UserMenuView = Y.Base.create('userMenuView', Y.eZ.View, [], {
        initializer: function () {
            this.containerTemplate = '<ul class="ez-view-usermenuview ' + CLASS_HIDDEN + '"/>';

            this.on('displayedChange', this._uiToggleUserMenu);
            this.on('activeChange', this._setActiveViews);
        },

        /**
         * Renders the user menu view
         *
         * @method render
         * @return {eZ.UserMenuView} the view itself
         */
        render: function () {
            this._renderMenuItems();

            return this;
        },

        /**
         * Toggles the displayed value.
         *
         * @method toggleDisplayed
         * @public
         */
        toggleDisplayed: function () {
            this._set('displayed', !this.get('displayed'));
        },

        /**
         * Hides the user menu.
         *
         * @method hide
         * @public
         */
        hide: function () {
            this._set('displayed', false);
        },

        /**
         * Toggles the visibility of a user menu.
         *
         * @method _uiToggleUserMenu
         * @protected
         * @param event {Object} event facade
         */
        _uiToggleUserMenu: function (event) {
            var userMenu = this.get('container');

            if (event.newVal) {
                userMenu.removeClass(CLASS_HIDDEN);
            } else {
                userMenu.addClass(CLASS_HIDDEN);
            }
        },

        /**
         * Sets active flag to the item view
         *
         * @method _setActiveViews
         * @protected
         * @param event {Object} event facade
         */
        _setActiveViews: function (event) {
            var items = this.get('items');

            items.forEach(function (item) {
                item.set('active', event.newVal);
            });
        },

        /**
         * Renders menu items views
         *
         * @method _renderMenuItems
         * @protected
         */
        _renderMenuItems: function () {
            var menuItemsContainer = this.get('container'),
                items = this.get('items');

            items.sort(function (a, b) {
                return b.get('priority') - a.get('priority');
            });

            items.forEach(Y.bind(function (item) {
                menuItemsContainer.append(item.render().get('container'));
            }, this));
        },

        /**
         * Adds item to the menu and fire event when it's done
         *
         * @method addMenuItem
         * @public
         * @param view {Object}
         */
        addMenuItem: function (view) {
            var items = this.get('items');

            items.push(view);

            view.addTarget(this);

            /**
             * Fired when the view is added to the user menu
             *
             * @event addedToUserMenu
             * @param userMenu {Object} the user menu view
             */
            view.fire('addedToUserMenu', {
                userMenu: this,
            });
        },
    }, {
        ATTRS: {
            /**
             * Contains the views for the user menu items
             *
             * @attribute items
             * @type {Array}
             */
            items: {
                valueFn: function () {
                    return [
                        new Y.eZ.UserMenuItemFireEventView({
                            bubbleTargets: this,
                            title: Y.eZ.trans('logout', {}, 'navigationhub'),
                            eventName: 'logOut',
                        }),
                    ];
                }
            },

            /**
             * Whether the user menu is displayed or not
             *
             * @attribute displayed
             * @type Boolean
             * @default false
             * @readOnly
             */
            displayed: {
                value: false,
                readOnly: true
            }
        }
    });
});