owncloud/core

View on GitHub
apps/files/js/navigation.js

Summary

Maintainability
A
0 mins
Test Coverage
/*
 * Copyright (c) 2014
 *
 * @author Vincent Petry
 * @copyright Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>
 *
 * This file is licensed under the Affero General Public License version 3
 * or later.
 *
 * See the COPYING-README file.
 *
 */

(function() {

    /**
     * @class OCA.Files.Navigation
     * @classdesc Navigation control for the files app sidebar.
     *
     * @param $el element containing the navigation
     */
    var Navigation = function($el) {
        this.initialize($el);
    };

    /**
     * @memberof OCA.Files
     */
    Navigation.prototype = {

        /**
         * Currently selected item in the list
         */
        _activeItem: null,

        /**
         * Currently selected container
         */
        $currentContent: null,

        /**
         * Initializes the navigation from the given container
         *
         * @private
         * @param $el element containing the navigation
         */
        initialize: function($el) {
            this.$el = $el;
            this._activeItem = null;
            this.$currentContent = null;
            this._setupEvents();
        },

        /**
         * Setup UI events
         */
        _setupEvents: function() {
            this.$el.on('click', 'li a', _.bind(this._onClickItem, this));
        },

        /**
         * Returns the container of the currently active app.
         *
         * @return app container
         */
        getActiveContainer: function() {
            return this.$currentContent;
        },

        /**
         * Returns the currently active item
         * 
         * @return item ID
         */
        getActiveItem: function() {
            return this._activeItem;
        },

        /**
         * Switch the currently selected item, mark it as selected and
         * make the content container visible, if any.
         *
         * @param string itemId id of the navigation item to select
         * @param array options "silent" to not trigger event
         */
        setActiveItem: function(itemId, options) {
            var oldItemId = this._activeItem;
            if (itemId === this._activeItem) {
                if (!options || !options.silent) {
                    this.$el.trigger(
                        new $.Event('itemChanged', {itemId: itemId, previousItemId: oldItemId})
                    );
                }
                return;
            }
            this.$el.find('li').removeClass('active');
            if (this.$currentContent) {
                this.$currentContent.addClass('hidden');
                this.$currentContent.trigger(jQuery.Event('hide'));
            }
            this._activeItem = itemId;
            this.$el.find('li[data-id=' + itemId + ']').addClass('active');
            this.$currentContent = $('#app-content-' + itemId);
            this.$currentContent.removeClass('hidden');
            if (!options || !options.silent) {
                this.$currentContent.trigger(jQuery.Event('show'));
                this.$el.trigger(
                    new $.Event('itemChanged', {itemId: itemId, previousItemId: oldItemId})
                );
            }
        },

        /**
         * Returns whether a given item exists
         */
        itemExists: function(itemId) {
            return this.$el.find('li[data-id=' + itemId + ']').length;
        },

        /**
         * Event handler for when clicking on an item.
         */
        _onClickItem: function(ev) {
            var $target = $(ev.target);
            var itemId = $target.closest('li').attr('data-id');
            this.setActiveItem(itemId);
            ev.preventDefault();
        }
    };

    OCA.Files.Navigation = Navigation;

})();