1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-15 06:44:16 +00:00

Add hl-item-view and dropdown

This commit is contained in:
Daniel Pan
2016-03-21 21:29:14 +08:00
parent 6483dc2a39
commit 6254417be8
6 changed files with 156 additions and 47 deletions

View File

@@ -1377,9 +1377,13 @@
<td><%- device_name %></td> <td><%- device_name %></td>
<td><%- last_login_ip %></td> <td><%- last_login_ip %></td>
<td><time title='<%- time %>'><%- time_from_now %></time></td> <td><time title='<%- time %>'><%- time_from_now %></time></td>
<td class="popover-container"> <td class="popover-container js-dropdown">
<span class="js-toggle-repos cspt"><%- synced_repos_length %><% if (synced_repos.length > 0) { %> <span class="dir-icon icon-caret-down"></span><% } %></span> <% if (synced_repos.length > 0) { %>
<div class="lib-list device-libs-popover popover hide"> <span class="js-toggle-repos js-dropdown-toggle cspt"><%- synced_repos_length %> <span class="dir-icon icon-caret-down"></span></span>
<% } else { %>
<span class="cspt">0</span>
<% } %>
<div class="lib-list device-libs-popover popover js-dropdown-content hide">
<div class="popover-con"> <div class="popover-con">
<ul> <ul>
<% for (var i = 0, len = synced_repos_length; i < len; i++) { %> <% for (var i = 0, len = synced_repos_length; i < len; i++) { %>

View File

@@ -263,6 +263,10 @@ app["pageOptions"] = {
file_audit_enabled: {% if file_audit_enabled %} true {% else %} false {% endif %}, file_audit_enabled: {% if file_audit_enabled %} true {% else %} false {% endif %},
cur_note: {% if request.cur_note %} {'id': '{{ request.cur_note.id }}'} {% else %} null {% endif %} cur_note: {% if request.cur_note %} {'id': '{{ request.cur_note.id }}'} {% else %} null {% endif %}
}; };
app.ui = {
currentDropdown: null,
currentHighlightedItem: null
};
</script> </script>
{% if debug %} {% if debug %}
<script data-main="{% static "scripts/main.js" %}" src="{% static "scripts/lib/require.js" %}"></script> <script data-main="{% static "scripts/main.js" %}" src="{% static "scripts/lib/require.js" %}"></script>

View File

@@ -3,23 +3,23 @@ define([
'underscore', 'underscore',
'backbone', 'backbone',
'common', 'common',
'moment' 'moment',
], function($, _, Backbone, Common, Moment) { 'app/views/widgets/hl-item-view',
'app/views/widgets/dropdown'
], function($, _, Backbone, Common, Moment, HLItemView, DropdownView) {
'use strict'; 'use strict';
var DeviceView = Backbone.View.extend({ var DeviceView = HLItemView.extend({
tagName: 'tr', tagName: 'tr',
template: _.template($('#device-item-tmpl').html()), template: _.template($('#device-item-tmpl').html()),
events: { events: {
'mouseenter': 'highlight', 'click .unlink-device': 'unlinkDevice'
'mouseleave': 'rmHighlight',
'click .unlink-device': 'unlinkDevice',
'click .js-toggle-repos': 'toggleSyncedRepos'
}, },
initialize: function() { initialize: function() {
HLItemView.prototype.initialize.call(this);
}, },
render: function() { render: function() {
@@ -48,23 +48,13 @@ define([
this.$el.html(this.template(data)); this.$el.html(this.template(data));
new DropdownView({
el: this.$('.js-dropdown')
});
return this; return this;
}, },
highlight: function() {
if ($('.device-libs-popover:visible').length) {
return;
}
this.$el.addClass('hl').find('.op-icon').removeClass('vh');
},
rmHighlight: function() {
if ($('.device-libs-popover:visible').length) {
return;
}
this.$el.removeClass('hl').find('.op-icon').addClass('vh');
},
_hidePopover: function(e) { _hidePopover: function(e) {
var view = e.data.view; var view = e.data.view;
var target = e.target || event.srcElement; var target = e.target || event.srcElement;
@@ -77,19 +67,15 @@ define([
}, },
toggleSyncedRepos: function(e) { toggleSyncedRepos: function(e) {
if (this.model.get('synced_repos') == 0) {
return false;
}
var $icon= this.$('.dir-icon'), var $icon= this.$('.dir-icon'),
$popover = this.$('.device-libs-popover'); $popover = this.$('.device-libs-popover');
if ($popover.is(':hidden')) { if ($popover.is(':hidden')) {
$icon.removeClass('icon-caret-up').addClass('icon-caret-down'); $icon.removeClass('icon-caret-down').addClass('icon-caret-up');
$popover.removeClass('hide'); $popover.removeClass('hide');
$(document).on('click', { view: this }, this._hidePopover); $(document).on('click', { view: this }, this._hidePopover);
} else { } else {
$icon.removeClass('icon-caret-down').addClass('icon-caret-up'); $icon.removeClass('icon-caret-up').addClass('icon-caret-down');
$popover.addClass('hide'); $popover.addClass('hide');
$(document).off('click', this._hidePopover); $(document).off('click', this._hidePopover);
} }

View File

@@ -2,22 +2,22 @@ define([
'jquery', 'jquery',
'underscore', 'underscore',
'backbone', 'backbone',
'common' 'common',
], function($, _, Backbone, Common) { 'app/views/widgets/hl-item-view'
], function($, _, Backbone, Common, HLItemView) {
'use strict'; 'use strict';
var StarredFileView = Backbone.View.extend({ var StarredFileView = HLItemView.extend({
tagName: 'tr', tagName: 'tr',
template: _.template($('#starred-file-item-tmpl').html()), template: _.template($('#starred-file-item-tmpl').html()),
events: { events: {
'mouseenter': 'showAction',
'mouseleave': 'hideAction',
'click .unstar': 'removeShare' 'click .unstar': 'removeShare'
}, },
initialize: function() { initialize: function() {
HLItemView.prototype.initialize.call(this);
}, },
render: function () { render: function () {
@@ -48,16 +48,6 @@ define([
Common.ajaxErrorHandler(xhr); Common.ajaxErrorHandler(xhr);
} }
}); });
},
showAction: function() {
this.$el.addClass('hl');
this.$el.find('.op-icon').removeClass('vh');
},
hideAction: function() {
this.$el.removeClass('hl');
this.$el.find('.op-icon').addClass('vh');
} }
}); });

View File

@@ -0,0 +1,84 @@
define([
'jquery',
'underscore',
'backbone',
'common',
], function($, _, Backbone, Common) {
'use strict';
/*
* Dropdown View.
*/
// There can be only one visible dropdown view
$(document).click(function(e) {
var view = app.ui.currentDropdown;
var target = e.target || event.srcElement;
if (!view) {
return true;
}
if (!view.$('.js-dropdown-content').is(target)
&& !view.$('.js-dropdown-content').find('*').is(target))
{
view.hide();
if (app.ui.currentHighlightedItem) {
app.ui.currentHighlightedItem.rmHighlight();
}
}
return true;
});
var DropdownView = Backbone.View.extend({
toggleClass: '.js-dropdown-toggle',
popupClass: '.js-dropdown-content',
initialize: function(options) {
this.$el.on('click', '.js-dropdown-toggle', _.bind(this.toggleDropdown, this));
},
_hideDropdown: function(e) {
var view = e.data.view;
var target = e.target || event.srcElement;
if (!view.$(view.popupClass).is(target)
&& !view.$(view.popupClass).find('*').is(target)
&& !view.$(view.toggleClass).is(target)) {
$(view.popupClass).addClass('hide');
view.rmHighlight();
$(document).off('click', view._hidePopup);
if (view.onPopupHide) {
view.onPopupHide();
}
}
},
hide: function() {
app.ui.currentDropdown = null;
this.$('.js-dropdown-content').addClass('hide');
},
show: function() {
app.ui.currentDropdown = this;
this.$('.js-dropdown-content').removeClass('hide');
},
toggleDropdown: function() {
if (app.ui.currentDropdown && app.ui.currentDropdown != this) {
app.ui.currentDropdown.hide();
}
if (this.$('.js-dropdown-content').is(':hidden')) {
this.show();
} else {
this.hide();
}
return false;
}
});
return DropdownView;
});

View File

@@ -0,0 +1,41 @@
define([
'jquery',
'underscore',
'backbone',
'common',
], function($, _, Backbone, Common) {
'use strict';
/*
* Hightable Item View.
*/
var HLItemView = Backbone.View.extend({
tagName: 'tr',
hiddenOperationClass: '.op-icon',
initialize: function(options) {
this.$el.on('mouseenter', _.bind(this.highlight, this));
this.$el.on('mouseleave', _.bind(this.rmHighlight, this));
},
highlight: function() {
if (app.ui.currentDropdown) {
return;
}
app.ui.currentHighlightedItem = this;
this.$el.addClass('hl').find(this.hiddenOperationClass).removeClass('vh');
},
rmHighlight: function() {
if (app.ui.currentDropdown) {
return;
}
app.ui.currentHighlightedItem = null;
this.$el.removeClass('hl').find(this.hiddenOperationClass).addClass('vh');
}
});
return HLItemView;
});