2015-07-15 10:06:13 +00:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2015
|
|
|
|
*
|
|
|
|
* This file is licensed under the Affero General Public License version 3
|
|
|
|
* or later.
|
|
|
|
*
|
|
|
|
* See the COPYING-README file.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
(function() {
|
|
|
|
|
|
|
|
var TEMPLATE =
|
|
|
|
'<div>' +
|
|
|
|
' <div class="detailFileInfoContainer">' +
|
|
|
|
' </div>' +
|
2015-07-29 15:36:07 +00:00
|
|
|
' <div>' +
|
|
|
|
' <ul class="tabHeaders">' +
|
2015-07-15 14:09:00 +00:00
|
|
|
' </ul>' +
|
2015-07-29 15:36:07 +00:00
|
|
|
' <div class="tabsContainer">' +
|
|
|
|
' </div>' +
|
2015-07-15 10:06:13 +00:00
|
|
|
' </div>' +
|
2015-07-15 15:05:25 +00:00
|
|
|
' <a class="close icon-close" href="#" alt="{{closeLabel}}"></a>' +
|
2015-07-15 10:06:13 +00:00
|
|
|
'</div>';
|
|
|
|
|
|
|
|
var TEMPLATE_TAB_HEADER =
|
2015-07-29 15:36:07 +00:00
|
|
|
'<li class="tabHeader {{#if selected}}selected{{/if}}" data-tabid="{{tabId}}" data-tabindex="{{tabIndex}}"><a href="#">{{label}}</a></li>';
|
2015-07-15 10:06:13 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @class OCA.Files.DetailsView
|
|
|
|
* @classdesc
|
|
|
|
*
|
|
|
|
* The details view show details about a selected file.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
var DetailsView = function() {
|
|
|
|
this.initialize();
|
|
|
|
};
|
2015-07-15 14:09:00 +00:00
|
|
|
|
2015-07-15 10:06:13 +00:00
|
|
|
/**
|
|
|
|
* @memberof OCA.Files
|
|
|
|
*/
|
|
|
|
DetailsView.prototype = {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* jQuery element
|
|
|
|
*/
|
|
|
|
$el: null,
|
|
|
|
|
|
|
|
_template: null,
|
|
|
|
_templateTabHeader: null,
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Currently displayed file info
|
|
|
|
*
|
|
|
|
* @type OCA.Files.FileInfo
|
|
|
|
*/
|
|
|
|
_fileInfo: null,
|
|
|
|
|
|
|
|
/**
|
|
|
|
* List of detail tab views
|
|
|
|
*
|
|
|
|
* @type Array<OCA.Files.DetailTabView>
|
|
|
|
*/
|
|
|
|
_tabViews: [],
|
|
|
|
|
|
|
|
/**
|
|
|
|
* List of detail file info views
|
|
|
|
*
|
|
|
|
* @type Array<OCA.Files.DetailFileInfoView>
|
|
|
|
*/
|
|
|
|
_detailFileInfoViews: [],
|
|
|
|
|
2015-07-29 15:36:07 +00:00
|
|
|
/**
|
|
|
|
* Id of the currently selected tab
|
|
|
|
*
|
|
|
|
* @type string
|
|
|
|
*/
|
|
|
|
_currentTabId: null,
|
|
|
|
|
2015-07-15 10:06:13 +00:00
|
|
|
/**
|
|
|
|
* Initialize the details view
|
|
|
|
*/
|
|
|
|
initialize: function() {
|
2015-07-24 21:07:09 +00:00
|
|
|
this.$el = $('<div id="app-sidebar"></div>');
|
2015-07-15 10:06:13 +00:00
|
|
|
this.fileInfo = null;
|
|
|
|
this._tabViews = [];
|
|
|
|
this._detailFileInfoViews = [];
|
2015-07-15 15:05:25 +00:00
|
|
|
|
|
|
|
this.$el.on('click', 'a.close', function(event) {
|
2015-07-24 21:07:09 +00:00
|
|
|
OC.Apps.hideAppSidebar();
|
2015-07-15 15:05:25 +00:00
|
|
|
event.preventDefault();
|
|
|
|
});
|
2015-07-16 10:21:40 +00:00
|
|
|
|
2015-07-29 15:36:07 +00:00
|
|
|
this.$el.on('click', '.tabHeaders .tabHeader', _.bind(this._onClickTab, this));
|
|
|
|
|
2015-07-16 10:49:34 +00:00
|
|
|
// uncomment to add some dummy tabs for testing
|
2015-07-29 15:36:07 +00:00
|
|
|
//this._addTestTabs();
|
2015-07-15 10:06:13 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Destroy / uninitialize this instance.
|
|
|
|
*/
|
|
|
|
destroy: function() {
|
|
|
|
if (this.$el) {
|
|
|
|
this.$el.remove();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
2015-07-29 15:36:07 +00:00
|
|
|
_onClickTab: function(e) {
|
|
|
|
var $target = $(e.target);
|
|
|
|
if (!$target.hasClass('tabHeader')) {
|
|
|
|
$target = $target.closest('.tabHeader');
|
|
|
|
}
|
|
|
|
var tabIndex = $target.attr('data-tabindex');
|
|
|
|
var targetTab;
|
|
|
|
if (_.isUndefined(tabIndex)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
this.$el.find('.tabsContainer .tab').addClass('hidden');
|
|
|
|
targetTab = this._tabViews[tabIndex];
|
|
|
|
targetTab.$el.removeClass('hidden');
|
|
|
|
|
|
|
|
this.$el.find('.tabHeaders li').removeClass('selected');
|
|
|
|
$target.addClass('selected');
|
|
|
|
|
|
|
|
e.preventDefault();
|
|
|
|
},
|
|
|
|
|
2015-07-16 10:21:40 +00:00
|
|
|
_addTestTabs: function() {
|
|
|
|
for (var j = 0; j < 2; j++) {
|
|
|
|
var testView = new OCA.Files.DetailTabView('testtab' + j);
|
|
|
|
testView.index = j;
|
|
|
|
testView.getLabel = function() { return 'Test tab ' + this.index; };
|
|
|
|
testView.render = function() {
|
|
|
|
this.$el.empty();
|
|
|
|
for (var i = 0; i < 100; i++) {
|
|
|
|
this.$el.append('<div>Test tab ' + this.index + ' row ' + i + '</div>');
|
|
|
|
}
|
|
|
|
};
|
|
|
|
this._tabViews.push(testView);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
2015-07-15 10:06:13 +00:00
|
|
|
/**
|
|
|
|
* Renders this details view
|
|
|
|
*/
|
|
|
|
render: function() {
|
2015-07-15 14:09:00 +00:00
|
|
|
var self = this;
|
2015-07-15 10:06:13 +00:00
|
|
|
this.$el.empty();
|
|
|
|
|
|
|
|
if (!this._template) {
|
|
|
|
this._template = Handlebars.compile(TEMPLATE);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!this._templateTabHeader) {
|
|
|
|
this._templateTabHeader = Handlebars.compile(TEMPLATE_TAB_HEADER);
|
|
|
|
}
|
|
|
|
|
2015-07-15 15:05:25 +00:00
|
|
|
var $el = $(this._template({
|
|
|
|
closeLabel: t('files', 'Close')
|
|
|
|
}));
|
2015-07-15 14:09:00 +00:00
|
|
|
var $tabsContainer = $el.find('.tabsContainer');
|
2015-07-29 15:36:07 +00:00
|
|
|
var $tabHeadsContainer = $el.find('.tabHeaders');
|
2015-07-15 10:06:13 +00:00
|
|
|
var $detailsContainer = $el.find('.detailFileInfoContainer');
|
|
|
|
|
|
|
|
// render details
|
|
|
|
_.each(this._detailFileInfoViews, function(detailView) {
|
2015-07-20 12:42:10 +00:00
|
|
|
$detailsContainer.append(detailView.get$());
|
2015-07-15 10:06:13 +00:00
|
|
|
});
|
|
|
|
|
2015-07-15 14:09:00 +00:00
|
|
|
if (this._tabViews.length > 0) {
|
2015-07-29 15:36:07 +00:00
|
|
|
if (!this._currentTab) {
|
|
|
|
this._currentTab = this._tabViews[0].getId();
|
|
|
|
}
|
|
|
|
|
2015-07-15 14:09:00 +00:00
|
|
|
// render tabs
|
2015-07-29 15:36:07 +00:00
|
|
|
_.each(this._tabViews, function(tabView, i) {
|
2015-07-15 14:09:00 +00:00
|
|
|
// hidden by default
|
2015-07-29 15:36:07 +00:00
|
|
|
var $el = tabView.get$();
|
|
|
|
var isCurrent = (tabView.getId() === self._currentTab);
|
|
|
|
if (!isCurrent) {
|
|
|
|
$el.addClass('hidden');
|
|
|
|
}
|
|
|
|
$tabsContainer.append($el);
|
2015-07-15 14:09:00 +00:00
|
|
|
|
|
|
|
$tabHeadsContainer.append(self._templateTabHeader({
|
|
|
|
tabId: tabView.getId(),
|
2015-07-29 15:36:07 +00:00
|
|
|
tabIndex: i,
|
|
|
|
label: tabView.getLabel(),
|
|
|
|
selected: isCurrent
|
2015-07-15 14:09:00 +00:00
|
|
|
}));
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: select current tab
|
2015-07-15 10:06:13 +00:00
|
|
|
|
|
|
|
this.$el.append($el);
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets the file info to be displayed in the view
|
|
|
|
*
|
|
|
|
* @param {OCA.Files.FileInfo} fileInfo file info to set
|
|
|
|
*/
|
|
|
|
setFileInfo: function(fileInfo) {
|
|
|
|
this._fileInfo = fileInfo;
|
|
|
|
|
2015-07-15 15:05:25 +00:00
|
|
|
this.render();
|
|
|
|
|
2015-07-15 10:06:13 +00:00
|
|
|
// notify all panels
|
2015-07-15 14:09:00 +00:00
|
|
|
_.each(this._tabViews, function(tabView) {
|
2015-07-15 10:06:13 +00:00
|
|
|
tabView.setFileInfo(fileInfo);
|
|
|
|
});
|
|
|
|
_.each(this._detailFileInfoViews, function(detailView) {
|
|
|
|
detailView.setFileInfo(fileInfo);
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the file info.
|
|
|
|
*
|
|
|
|
* @return {OCA.Files.FileInfo} file info
|
|
|
|
*/
|
|
|
|
getFileInfo: function() {
|
|
|
|
return this._fileInfo;
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Adds a tab in the tab view
|
|
|
|
*
|
|
|
|
* @param {OCA.Files.DetailTabView} tab view
|
|
|
|
*/
|
|
|
|
addTabView: function(tabView) {
|
|
|
|
this._tabViews.push(tabView);
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Adds a detail view for file info.
|
|
|
|
*
|
|
|
|
* @param {OCA.Files.DetailFileInfoView} detail view
|
|
|
|
*/
|
|
|
|
addDetailView: function(detailView) {
|
|
|
|
this._detailFileInfoViews.push(detailView);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
OCA.Files.DetailsView = DetailsView;
|
|
|
|
})();
|
|
|
|
|