Merge pull request #227 from ONLYOFFICE/feature/sse-formula-tab-additional
Feature/sse formula tab additional
This commit is contained in:
commit
2e38661ebd
|
@ -409,6 +409,10 @@ define([
|
||||||
},
|
},
|
||||||
|
|
||||||
onAfterKeydownMenu: function(e) {
|
onAfterKeydownMenu: function(e) {
|
||||||
|
this.trigger('keydown:before', this, e);
|
||||||
|
if (e.isDefaultPrevented())
|
||||||
|
return;
|
||||||
|
|
||||||
if (e.keyCode == Common.UI.Keys.RETURN) {
|
if (e.keyCode == Common.UI.Keys.RETURN) {
|
||||||
var li = $(e.target).closest('li');
|
var li = $(e.target).closest('li');
|
||||||
if (li.length<=0) li = $(e.target).parent().find('li .dataview');
|
if (li.length<=0) li = $(e.target).parent().find('li .dataview');
|
||||||
|
|
|
@ -41,8 +41,8 @@
|
||||||
function onDropDownKeyDown(e) {
|
function onDropDownKeyDown(e) {
|
||||||
var $this = $(this),
|
var $this = $(this),
|
||||||
$parent = $this.parent(),
|
$parent = $this.parent(),
|
||||||
beforeEvent = jQuery.Event('keydown.before.bs.dropdown'),
|
beforeEvent = jQuery.Event('keydown.before.bs.dropdown', {keyCode: e.keyCode}),
|
||||||
afterEvent = jQuery.Event('keydown.after.bs.dropdown');
|
afterEvent = jQuery.Event('keydown.after.bs.dropdown', {keyCode: e.keyCode});
|
||||||
|
|
||||||
$parent.trigger(beforeEvent);
|
$parent.trigger(beforeEvent);
|
||||||
|
|
||||||
|
@ -110,8 +110,9 @@ function patchDropDownKeyDown(e) {
|
||||||
_.delay(function() {
|
_.delay(function() {
|
||||||
var mnu = $('> [role=menu]', li),
|
var mnu = $('> [role=menu]', li),
|
||||||
$subitems = mnu.find('> li:not(.divider):not(.disabled):visible > a'),
|
$subitems = mnu.find('> li:not(.divider):not(.disabled):visible > a'),
|
||||||
$dataviews = mnu.find('> li:not(.divider):not(.disabled):visible .dataview');
|
$dataviews = mnu.find('> li:not(.divider):not(.disabled):visible .dataview'),
|
||||||
if ($subitems.length>0 && $dataviews.length<1)
|
$internal_menu = mnu.find('> li:not(.divider):not(.disabled):visible ul.internal-menu');
|
||||||
|
if ($subitems.length>0 && $dataviews.length<1 && $internal_menu.length<1)
|
||||||
($subitems.index($subitems.filter(':focus'))<0) && $subitems.eq(0).focus();
|
($subitems.index($subitems.filter(':focus'))<0) && $subitems.eq(0).focus();
|
||||||
}, 250);
|
}, 250);
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,15 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.internal-menu {
|
||||||
|
border: none;
|
||||||
|
border-radius: 0;
|
||||||
|
.box-shadow(none);
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
li {
|
li {
|
||||||
& > a {
|
& > a {
|
||||||
padding: 5px 20px;
|
padding: 5px 20px;
|
||||||
|
|
|
@ -247,6 +247,40 @@ define([
|
||||||
}, this);
|
}, this);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
focusInner: function(menu, e) {
|
||||||
|
if (e.keyCode == Common.UI.Keys.UP)
|
||||||
|
menu.items[menu.items.length-1].cmpEl.find('> a').focus();
|
||||||
|
else
|
||||||
|
menu.items[0].cmpEl.find('> a').focus();
|
||||||
|
},
|
||||||
|
|
||||||
|
focusOuter: function(menu, e) {
|
||||||
|
menu.items[2].cmpEl.find('> a').focus();
|
||||||
|
},
|
||||||
|
|
||||||
|
onBeforeKeyDown: function(menu, e) {
|
||||||
|
if (e.keyCode == Common.UI.Keys.RETURN) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
var li = $(e.target).closest('li');
|
||||||
|
(li.length>0) && li.click();
|
||||||
|
Common.UI.Menu.Manager.hideAll();
|
||||||
|
} else if (e.namespace!=="after.bs.dropdown" && (e.keyCode == Common.UI.Keys.DOWN || e.keyCode == Common.UI.Keys.UP)) {
|
||||||
|
var $items = $('> [role=menu] > li:not(.divider):not(.disabled):visible', menu.$el).find('> a');
|
||||||
|
if (!$items.length) return;
|
||||||
|
var index = $items.index($items.filter(':focus')),
|
||||||
|
me = this;
|
||||||
|
if (menu._outerMenu && (e.keyCode == Common.UI.Keys.UP && index==0 || e.keyCode == Common.UI.Keys.DOWN && index==$items.length - 1) ||
|
||||||
|
menu._innerMenu && (e.keyCode == Common.UI.Keys.UP || e.keyCode == Common.UI.Keys.DOWN) && index!==-1) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
_.delay(function() {
|
||||||
|
menu._outerMenu ? me.focusOuter(menu._outerMenu, e) : me.focusInner(menu._innerMenu, e);
|
||||||
|
}, 10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
setButtonMenu: function(btn, name) {
|
setButtonMenu: function(btn, name) {
|
||||||
var me = this,
|
var me = this,
|
||||||
arr = [],
|
arr = [],
|
||||||
|
@ -262,32 +296,124 @@ define([
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (arr.length) {
|
if (arr.length) {
|
||||||
arr.push(new Common.UI.MenuItem({
|
|
||||||
caption: '--'
|
|
||||||
}));
|
|
||||||
arr.push(new Common.UI.MenuItem({
|
|
||||||
caption: me.txtAdditional,
|
|
||||||
value: 'more'
|
|
||||||
}));
|
|
||||||
|
|
||||||
if (btn.menu && btn.menu.rendered) {
|
if (btn.menu && btn.menu.rendered) {
|
||||||
btn.menu.removeAll();
|
var menu = btn.menu._innerMenu;
|
||||||
arr.forEach(function(item){
|
if (menu) {
|
||||||
btn.menu.addItem(item);
|
menu.removeAll();
|
||||||
});
|
arr.forEach(function(item){
|
||||||
|
menu.addItem(item);
|
||||||
|
});
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
btn.setMenu(new Common.UI.Menu({
|
btn.setMenu(new Common.UI.Menu({
|
||||||
restoreHeight: 415,
|
items: [
|
||||||
items: arr
|
{template: _.template('<div id="id-toolbar-formula-menu-'+ name +'" style="display: flex;" class="open"></div>')},
|
||||||
|
{ caption: '--' },
|
||||||
|
{
|
||||||
|
caption: me.txtAdditional,
|
||||||
|
value: 'more'
|
||||||
|
}
|
||||||
|
]
|
||||||
}));
|
}));
|
||||||
btn.menu.on('item:click', function (menu, item, e) {
|
btn.menu.items[2].on('click', function (item, e) {
|
||||||
me.fireEvent('function:apply', [{name: item.caption, origin: item.value}, false, name]);
|
me.fireEvent('function:apply', [{name: item.caption, origin: item.value}, false, name]);
|
||||||
});
|
});
|
||||||
|
btn.menu.on('show:after', function (menu, e) {
|
||||||
|
var internalMenu = menu._innerMenu;
|
||||||
|
internalMenu.scroller.update({alwaysVisibleY: true});
|
||||||
|
_.delay(function() {
|
||||||
|
menu._innerMenu && menu._innerMenu.cmpEl.focus();
|
||||||
|
}, 10);
|
||||||
|
}).on('keydown:before', _.bind(me.onBeforeKeyDown, this));
|
||||||
|
|
||||||
|
var menu = new Common.UI.Menu({
|
||||||
|
maxHeight: 300,
|
||||||
|
cls: 'internal-menu',
|
||||||
|
items: arr
|
||||||
|
});
|
||||||
|
menu.render(btn.menu.items[0].cmpEl.children(':first'));
|
||||||
|
menu.cmpEl.css({
|
||||||
|
display : 'block',
|
||||||
|
position : 'relative',
|
||||||
|
left : 0,
|
||||||
|
top : 0
|
||||||
|
});
|
||||||
|
menu.cmpEl.attr({tabindex: "-1"});
|
||||||
|
menu.on('item:click', function (menu, item, e) {
|
||||||
|
me.fireEvent('function:apply', [{name: item.caption, origin: item.value}, false, name]);
|
||||||
|
}).on('keydown:before', _.bind(me.onBeforeKeyDown, this));
|
||||||
|
btn.menu._innerMenu = menu;
|
||||||
|
menu._outerMenu = btn.menu;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
btn.setDisabled(arr.length<1);
|
btn.setDisabled(arr.length<1);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
setMenuItemMenu: function(name) {
|
||||||
|
var me = this,
|
||||||
|
arr = [],
|
||||||
|
formulaDialog = SSE.getController('FormulaDialog'),
|
||||||
|
group = me.formulasGroups.findWhere({name : name});
|
||||||
|
|
||||||
|
if (group) {
|
||||||
|
var functions = group.get('functions');
|
||||||
|
functions && functions.forEach(function(item) {
|
||||||
|
arr.push(new Common.UI.MenuItem({
|
||||||
|
caption: item.get('name'),
|
||||||
|
value: item.get('origin')
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
if (arr.length) {
|
||||||
|
var mnu = new Common.UI.MenuItem({
|
||||||
|
caption : formulaDialog['sCategory' + name] || name,
|
||||||
|
menu: new Common.UI.Menu({
|
||||||
|
menuAlign: 'tl-tr',
|
||||||
|
items: [
|
||||||
|
{template: _.template('<div id="id-toolbar-formula-menu-'+ name +'" style="display: flex;" class="open"></div>')},
|
||||||
|
{ caption: '--' },
|
||||||
|
{
|
||||||
|
caption: me.txtAdditional,
|
||||||
|
value: 'more'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
});
|
||||||
|
mnu.menu.items[2].on('click', function (item, e) {
|
||||||
|
me.fireEvent('function:apply', [{name: item.caption, origin: item.value}, false, name]);
|
||||||
|
});
|
||||||
|
mnu.menu.on('show:after', function (menu, e) {
|
||||||
|
var internalMenu = menu._innerMenu;
|
||||||
|
internalMenu.scroller.update({alwaysVisibleY: true});
|
||||||
|
_.delay(function() {
|
||||||
|
menu._innerMenu && menu._innerMenu.items[0].cmpEl.find('> a').focus();
|
||||||
|
}, 10);
|
||||||
|
}).on('keydown:before', _.bind(me.onBeforeKeyDown, this))
|
||||||
|
.on('keydown:before', function(menu, e) {
|
||||||
|
if (e.keyCode == Common.UI.Keys.LEFT || e.keyCode == Common.UI.Keys.ESC) {
|
||||||
|
var $parent = menu.cmpEl.parent();
|
||||||
|
if ($parent.hasClass('dropdown-submenu') && $parent.hasClass('over')) { // close submenu
|
||||||
|
$parent.removeClass('over');
|
||||||
|
$parent.find('> a').focus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// internal menu
|
||||||
|
var menu = new Common.UI.Menu({
|
||||||
|
maxHeight: 300,
|
||||||
|
cls: 'internal-menu',
|
||||||
|
items: arr
|
||||||
|
});
|
||||||
|
menu.on('item:click', function (menu, item, e) {
|
||||||
|
me.fireEvent('function:apply', [{name: item.caption, origin: item.value}, false, name]);
|
||||||
|
}).on('keydown:before', _.bind(me.onBeforeKeyDown, this));
|
||||||
|
mnu.menu._innerMenu = menu;
|
||||||
|
menu._outerMenu = mnu.menu;
|
||||||
|
return mnu;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
fillFunctions: function () {
|
fillFunctions: function () {
|
||||||
if (this.formulasGroups) {
|
if (this.formulasGroups) {
|
||||||
this.setButtonMenu(this.btnFinancial, 'Financial');
|
this.setButtonMenu(this.btnFinancial, 'Financial');
|
||||||
|
@ -305,41 +431,11 @@ define([
|
||||||
|
|
||||||
// more button
|
// more button
|
||||||
var me = this,
|
var me = this,
|
||||||
morearr = [],
|
morearr = [];
|
||||||
formulaDialog = SSE.getController('FormulaDialog');
|
|
||||||
['Cube', 'Database', 'Engineering', 'Information', 'Statistical'].forEach(function(name) {
|
['Cube', 'Database', 'Engineering', 'Information', 'Statistical'].forEach(function(name) {
|
||||||
var group = me.formulasGroups.findWhere({name : name});
|
var mnu = me.setMenuItemMenu(name);
|
||||||
if (group) {
|
mnu && morearr.push(mnu);
|
||||||
var functions = group.get('functions'),
|
|
||||||
arr = [];
|
|
||||||
functions && functions.forEach(function(item) {
|
|
||||||
arr.push(new Common.UI.MenuItem({
|
|
||||||
caption: item.get('name'),
|
|
||||||
value: item.get('origin')
|
|
||||||
}));
|
|
||||||
});
|
|
||||||
if (arr.length) {
|
|
||||||
arr.push(new Common.UI.MenuItem({
|
|
||||||
caption: '--'
|
|
||||||
}));
|
|
||||||
arr.push(new Common.UI.MenuItem({
|
|
||||||
caption: me.txtAdditional,
|
|
||||||
value: 'more'
|
|
||||||
}));
|
|
||||||
var mnu = new Common.UI.MenuItem({
|
|
||||||
caption : formulaDialog['sCategory' + name] || name,
|
|
||||||
menu : new Common.UI.Menu({
|
|
||||||
restoreHeight: 415,
|
|
||||||
menuAlign: 'tl-tr',
|
|
||||||
items: arr
|
|
||||||
})
|
|
||||||
});
|
|
||||||
mnu.menu.on('item:click', function (menu, item, e) {
|
|
||||||
me.fireEvent('function:apply', [{name: item.caption, origin: item.value}, false, name]);
|
|
||||||
});
|
|
||||||
morearr.push(mnu);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
var btn = this.btnMore;
|
var btn = this.btnMore;
|
||||||
if (morearr.length) {
|
if (morearr.length) {
|
||||||
|
@ -350,10 +446,21 @@ define([
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
btn.setMenu(new Common.UI.Menu({
|
btn.setMenu(new Common.UI.Menu({
|
||||||
restoreHeight: 415,
|
|
||||||
items: morearr
|
items: morearr
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
btn.menu.items.forEach(function(mnu){
|
||||||
|
var menuContainer = mnu.menu.items[0].cmpEl.children(':first'),
|
||||||
|
menu = mnu.menu._innerMenu;
|
||||||
|
menu.render(menuContainer);
|
||||||
|
menu.cmpEl.css({
|
||||||
|
display : 'block',
|
||||||
|
position : 'relative',
|
||||||
|
left : 0,
|
||||||
|
top : 0
|
||||||
|
});
|
||||||
|
menu.cmpEl.attr({tabindex: "-1"});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
btn.setDisabled(morearr.length<1);
|
btn.setDisabled(morearr.length<1);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue