Blame view

sources/apps/files/js/navigation.js 2.7 KB
6d9380f96   Cédric Dupont   Update sources OC...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
  /*
   * Copyright (c) 2014
   *
   * @author Vincent Petry
   * @copyright 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() {
  
  	var Navigation = function($el) {
  		this.initialize($el);
  	};
  
  	Navigation.prototype = {
  
  		/**
  		 * Currently selected item in the list
  		 */
  		_activeItem: null,
  
  		/**
  		 * Currently selected container
  		 */
  		$currentContent: null,
  
  		/**
  		 * Initializes the navigation from the given container
  		 * @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);
  			return false;
  		}
  	};
  
  	OCA.Files.Navigation = Navigation;
  
  })();