Commit 540d3989 authored by Maxim Kadushkin's avatar Maxim Kadushkin

[SSE mobile] implemented sheet tabs scrolling

parent 90d437a9
...@@ -43,157 +43,287 @@ define([ ...@@ -43,157 +43,287 @@ define([
'underscore' 'underscore'
, 'common/mobile/utils/utils' , 'common/mobile/utils/utils'
], ],
function(template){ function(core){
'use strict'; 'use strict';
SSE.Views.Statusbar = Backbone.View.extend({ SSE.Views.Statusbar = Backbone.View.extend((function(){
el: '.pages > .page', function tabVisible(t) {
template: '<div class="statusbar">' + var leftbound = arguments[1] || this.$boxTabs.offset().left,
'<div id="box-addtab" class="status-group">' + rightbound = arguments[2] || (leftbound + this.$boxTabs.width()),
'<a href="#" id="btn-addtab" class="button" style="display:none"><i class="icon icon-plus"></i></a>' + tab;
'</div>' +
'<div class="box-tabs">' +
'<ul class="sheet-tabs bottom"></ul>' +
'</div>' +
'</div>',
tabtemplate: _.template('<li class="tab<% if (locked) print(" locked"); %>"><a><%= label %></a></li>'),
menutemplate: _.template(
'<% _.each(menuItems, function(item) { %>' +
'<li data-event="<%= item.event %>" class="<% if (item.locked===true) print("disabled") %>">' +
'<a href="#" class="item-link list-button"><%= item.caption %>' +
'</li>' +
'<% }); %>'),
events: {},
api: undefined,
initialize: function (options) {
_.extend(this, options);
},
render: function () {
var me = this;
me.$el = $(me.template).appendTo($(me.el));
me.$boxTabs = me.$el.find('.box-tabs > ul');
me.$btnAddTab = me.$el.find('#box-addtab > .button');
me.$btnAddTab.single('click', _.buffered(function(e) {
me.fireEvent('sheet:addnew');
}, 300));
// me.editMode = false;
return me;
},
setMode: function(mode) {
if ('edit' == mode) {
this.$btnAddTab.show();
} else
if ('disconnect' == mode) {
this.$btnAddTab.toggleClass('disabled', true);
}
},
setVisible: function(visible) {
visible ? this.show(): this.hide();
},
addSheet: function(model) {
var index = this.$boxTabs.children().length;
var $item = $(this.tabtemplate({
label: model.get('name'),
locked: model.get('locked')
})).appendTo(this.$boxTabs);
$item.on('click', this.onSheetClick.bind(this, index, model));
model.get('active') && $item.addClass('active');
return $item;
},
addSheets: function (collection) {
var me = this;
collection.each(function(model) {
var $item = me.addSheet(model);
model.set('el', $item, {silent:true});
});
},
clearTabs: function () { if ( typeof t == 'number' ) {
this.$boxTabs.children().off('click'); if ( !(t < 0) && t < this.$boxTabs.children().length ) {
this.$boxTabs.empty(); tab = this.$boxTabs.children().eq(t);
}, }
} else {
tab = t.get('el');
}
setActiveTab: function (index) { if ( tab ) {
this.$boxTabs.children().removeClass('active') var rect = tab.get(0).getBoundingClientRect();
.eq(index).addClass('active'); return !(rect.left < leftbound) && !(rect.right > rightbound);
}, }
onSheetClick: function (index, model, e) {
this.fireEvent('sheet:click', [index, model]);
return false; return false;
}, }
onSheetChanged: function(o, index, tab) { function setTabVisible(tab) {
this.api.asc_showWorksheet(tab.sheetindex); var _sheets = SSE.getCollection('Sheets');
if (this.hasTabInvisible && !this.tabbar.isTabVisible(index)) { if ( typeof tab == 'object' ) {
this.tabbar.setTabVisible(index); if ( tab == _sheets.first() ) tab = 'first'; else
if ( tab == _sheets.last() ) tab = 'last';
} else
if ( typeof tab == 'number' ) {
if ( !(tab > 0) ) tab = 'first'; else
if ( !(tab + 1 < _sheets.size()) ) tab = 'last';
else tab = _sheets.at(tab);
} }
this.fireEvent('sheet:changed', [this, tab.sheetindex]); if (tab <= 0 || tab == 'first') {
this.fireEvent('sheet:updateColors', [true]); this.$boxTabs.scrollLeft(0);
} else
Common.NotificationCenter.trigger('comments:updatefilter', if ( tab == 'last' || tab >= (_sheets.size() - 1) ) {
{ this.$boxTabs.scrollLeft(10000);
property: 'uid',
value: new RegExp('^(doc_|sheet' + this.api.asc_getActiveWorksheetId() + '_)')
},
false // hide popover
);
},
changeViewMode: function (edit) {
if (edit) {
this.tabBarBox.css('left', '152px');
} else { } else {
this.tabBarBox.css('left', ''); var $el = tab.get('el');
if ( $el ) {
var rightbound = this.$boxTabs.width();
var left = tab.position().left,
right = left + parseInt(tab.css('width'));
if (left < 0) {
this.$boxTabs.scrollLeft(/*this.$boxTabs.scrollLeft() + */left - 26);
} else if (right > rightbound) {
this.$boxTabs.scrollLeft(/*this.$boxTabs.scrollLeft() + */(right - rightbound) + 20);
}
}
} }
}
this.tabbar.options.draggable = edit; function hasInvisible() {
this.editMode = edit; var _sheets = SSE.getCollection('Sheets');
},
showTabContextMenu: function (items, model) { var _left_bound_ = this.$boxTabs.offset().left,
uiApp.closeModal('.document-menu.modal-in'); _right_bound_ = _left_bound_ + this.$boxTabs.width();
var popoverHTML = var tab = _sheets.first().get('el');
'<div class="popover document-menu">'+ var rect = tab.get(0).getBoundingClientRect();
'<div class="popover-inner">'+
'<div class="list-block">'+ if ( !(rect.left < _left_bound_) ) {
'<ul>'+ tab = _sheets.last().get('el');
this.menutemplate({menuItems: items}) + rect = tab.get(0).getBoundingClientRect();
'</ul>'+
'</div>'+ if ( !(rect.right > _right_bound_) )
'</div>'+ return false;
'</div>'; }
return true;
}
var touch = {};
function onTouchStart(e) {
if ( hasInvisible.call(this) )
{
var touches = e.originalEvent.changedTouches;
touch.startx = touches[0].clientX;
touch.scrollx = this.$boxTabs.scrollLeft();
touch.timer = setTimeout(function () {
// touch.longtouch = true;
}, 500);
e.preventDefault();
}
}
var $target = model.get('el'); function onTouchMove(e) {
var popover = uiApp.popover(popoverHTML, $target); if ( touch.startx !== undefined ) {
var touches = e.originalEvent.changedTouches;
if (Common.SharedSettings.get('android')) { if ( touch.longtouch ) {}
Common.Utils.androidMenuTop($(popover), $target); else {
if ( touch.timer ) clearTimeout(touch.timer), delete touch.timer;
this.$boxTabs.scrollLeft(touch.scrollx + (touch.startx - touches[0].clientX));
}
e.preventDefault();
}
}
function onTouchEnd(e) {
if ( touch.startx !== undefined ) {
touch.longtouch = false;
delete touch.startx;
e.preventDefault();
} }
}
return {
el: '.pages > .page',
template: '<div class="statusbar">' +
'<div id="box-addtab" class="status-group">' +
'<a href="#" id="btn-addtab" class="button" style="display:none"><i class="icon icon-plus"></i></a>' +
'</div>' +
'<div class="box-tabs">' +
'<ul class="sheet-tabs bottom"></ul>' +
'</div>' +
'</div>',
tabtemplate: _.template('<li class="tab<% if (locked) print(" locked"); %>"><a><%= label %></a></li>'),
menutemplate: _.template(
'<% _.each(menuItems, function(item) { %>' +
'<li data-event="<%= item.event %>" class="<% if (item.locked===true) print("disabled") %>">' +
'<a href="#" class="item-link list-button"><%= item.caption %>' +
'</li>' +
'<% }); %>'),
events: {},
api: undefined,
$('.modal-overlay').removeClass('modal-overlay-visible'); initialize: function (options) {
$('.document-menu li').single('click', _.buffered(function(e) { _.extend(this, options);
},
render: function () {
var me = this;
me.$el = $(me.template).appendTo($(me.el));
me.$boxTabs = me.$el.find('.box-tabs > ul');
me.$btnAddTab = me.$el.find('#box-addtab > .button');
me.$btnAddTab.single('click', _.buffered(function(e) {
me.fireEvent('sheet:addnew');
}, 300));
me.$boxTabs.on({
'touchstart': onTouchStart.bind(this),
'touchmove': onTouchMove.bind(this),
'touchend': onTouchEnd
});
// me.editMode = false;
return me;
},
setMode: function(mode) {
if ('edit' == mode) {
this.$btnAddTab.show();
} else
if ('disconnect' == mode) {
this.$btnAddTab.toggleClass('disabled', true);
}
},
setVisible: function(visible) {
visible ? this.show(): this.hide();
},
addSheet: function(model) {
var index = this.$boxTabs.children().length;
var $item = $(this.tabtemplate({
label: model.get('name'),
locked: model.get('locked')
})).appendTo(this.$boxTabs);
$item.on('click', this.onSheetClick.bind(this, index, model));
model.get('active') && $item.addClass('active');
model.set('el', $item, {silent:true});
return $item;
},
addSheets: function (collection) {
var active;
collection.each(function(model) {
this.addSheet(model);
if ( model.get('active') )
active = model;
}, this);
if ( active && !tabVisible.call(this, active) )
setTabVisible.call(this, active);
},
clearTabs: function () {
this.$boxTabs.children().off('click');
this.$boxTabs.empty();
},
setActiveTab: function (index) {
this.$boxTabs.children().removeClass('active')
.eq(index).addClass('active');
if ( !tabVisible.call(this, index) )
setTabVisible.call(this, index);
},
onSheetClick: function (index, model, e) {
this.fireEvent('sheet:click', [index, model]);
return false;
},
// onSheetChanged: function(o, index, tab) {
// this.api.asc_showWorksheet(tab.sheetindex);
//
// if (this.hasTabInvisible && !this.tabbar.isTabVisible(index)) {
// this.tabbar.setTabVisible(index);
// }
//
// this.fireEvent('sheet:changed', [this, tab.sheetindex]);
// this.fireEvent('sheet:updateColors', [true]);
//
// Common.NotificationCenter.trigger('comments:updatefilter',
// {
// property: 'uid',
// value: new RegExp('^(doc_|sheet' + this.api.asc_getActiveWorksheetId() + '_)')
// },
// false // hide popover
// );
// },
changeViewMode: function (edit) {
if (edit) {
this.tabBarBox.css('left', '152px');
} else {
this.tabBarBox.css('left', '');
}
this.tabbar.options.draggable = edit;
this.editMode = edit;
},
showTabContextMenu: function (items, model) {
uiApp.closeModal('.document-menu.modal-in'); uiApp.closeModal('.document-menu.modal-in');
var $target = $(e.currentTarget), var popoverHTML =
eventName = $target.data('event'); '<div class="popover document-menu">'+
'<div class="popover-inner">'+
'<div class="list-block">'+
'<ul>'+
this.menutemplate({menuItems: items}) +
'</ul>'+
'</div>'+
'</div>'+
'</div>';
var $target = model.get('el');
var popover = uiApp.popover(popoverHTML, $target);
if (Common.SharedSettings.get('android')) {
Common.Utils.androidMenuTop($(popover), $target);
}
this.fireEvent('contextmenu:click', [this, eventName, model]); $('.modal-overlay').removeClass('modal-overlay-visible');
}, 100, this)); $('.document-menu li').single('click', _.buffered(function(e) {
uiApp.closeModal('.document-menu.modal-in');
var $target = $(e.currentTarget),
eventName = $target.data('event');
this.fireEvent('contextmenu:click', [this, eventName, model]);
}, 100, this));
}
} }
}); })())
} }
); );
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -15,11 +15,12 @@ ...@@ -15,11 +15,12 @@
.hairline(top, @statusBarBorderColor); .hairline(top, @statusBarBorderColor);
height: @statusBarHeight; height: @statusBarHeight;
min-height: @statusBarHeight; min-height: @statusBarHeight;
display: flex;
flex-direction: row;
.box-tabs { .box-tabs {
flex-grow: 1; }
#box-addtab {
float: left;
} }
.button { .button {
...@@ -47,6 +48,7 @@ ...@@ -47,6 +48,7 @@
margin: 0; margin: 0;
padding: 0; padding: 0;
white-space: nowrap; white-space: nowrap;
overflow: hidden;
> li { > li {
list-style: none; list-style: none;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment