Skip to content

Commit

Permalink
Delay loading custom menu items
Browse files Browse the repository at this point in the history
  • Loading branch information
JuliaRadzhabova committed Aug 10, 2024
1 parent 23eea02 commit f9106dc
Show file tree
Hide file tree
Showing 5 changed files with 181 additions and 518 deletions.
131 changes: 131 additions & 0 deletions apps/common/main/lib/view/DocumentHolderExt.js
Original file line number Diff line number Diff line change
Expand Up @@ -653,6 +653,137 @@ define([], function () {
}
return arr;
};

dh.updateCustomItems = function(menu, data) {
if (!menu || !data || data.length<1) return;

var me = this,
lang = me.mode && me.mode.lang ? me.mode.lang.split(/[\-_]/)[0] : 'en';

me._preventCustomClick && clearTimeout(me._preventCustomClick);
me._hasCustomItems && (me._preventCustomClick = setTimeout(function () {
me._preventCustomClick = null;
},500)); // set delay only on update existing items
me._hasCustomItems = true;

var findCustomItem = function(guid, id) {
if (menu && menu.items.length>0) {
for (var i = menu.items.length-1; i >=0 ; i--) {
if (menu.items[i].options.isCustomItem && (id===undefined && menu.items[i].options.guid === guid || menu.items[i].options.guid === guid && menu.items[i].value === id)) {
return menu.items[i];
}
}
}
}

var getMenu = function(items, guid, toMenu) {
if (toMenu)
toMenu.removeAll();
else {
toMenu = new Common.UI.Menu({
cls: 'shifted-right',
menuAlign: 'tl-tr',
items: []
});
toMenu.on('item:click', function(menu, item, e) {
!me._preventCustomClick && me.api && me.api.onPluginContextMenuItemClick && me.api.onPluginContextMenuItemClick(item.options.guid, item.value);
});
toMenu.on('menu:click', function(menu, e) {
me._preventCustomClick && e.stopPropagation();
});
}
items.forEach(function(item) {
item.separator && toMenu.addItem({
caption: '--',
isCustomItem: true,
guid: guid
});
item.text && toMenu.addItem({
caption: ((typeof item.text == 'object') ? item.text[lang] || item.text['en'] : item.text) || '',
isCustomItem: true,
value: item.id,
guid: guid,
menu: item.items ? getMenu(item.items, guid) : false,
iconImg: me.parseIcons(item.icons),
disabled: !!item.disabled
});
});
return toMenu;
}

var focused;
data.forEach(function(plugin) {
var isnew = !findCustomItem(plugin.guid);
if (plugin && plugin.items && plugin.items.length>0) {
plugin.items.forEach(function(item) {
if (item.separator && isnew) {// add separator only to new plugins menu
menu.addItem({
caption: '--',
isCustomItem: true,
guid: plugin.guid
});
}

if (!item.text) return;
var mnu = findCustomItem(plugin.guid, item.id),
caption = ((typeof item.text == 'object') ? item.text[lang] || item.text['en'] : item.text) || '';
if (mnu) {
mnu.setCaption(caption);
mnu.setDisabled(!!item.disabled);
if (item.items) {
if (mnu.menu) {
if (mnu.menu.isVisible() && mnu.menu.cmpEl.find(' > li:not(.divider):not(.disabled):visible').find('> a').filter(':focus').length>0) {
mnu.menu.isOver = true;
focused = mnu.cmpEl;
}
getMenu(item.items, plugin.guid, mnu.menu);
} else
mnu.setMenu(getMenu(item.items, plugin.guid));
}
} else {
var mnu = new Common.UI.MenuItem({
caption : caption,
isCustomItem: true,
value: item.id,
guid: plugin.guid,
menu: item.items && item.items.length>=0 ? getMenu(item.items, plugin.guid) : false,
iconImg: me.parseIcons(item.icons),
disabled: !!item.disabled
}).on('click', function(item, e) {
!me._preventCustomClick && me.api && me.api.onPluginContextMenuItemClick && me.api.onPluginContextMenuItemClick(item.options.guid, item.value);
});
menu.addItem(mnu);
}
});
}
});

if (focused) {
var $subitems = $('> [role=menu]', focused).find('> li:not(.divider):not(.disabled):visible > a');
($subitems.length>0) && $subitems.eq(0).focus();
}
menu.alignPosition();
};

dh.clearCustomItems = function(menu) {
if (menu && menu.items.length>0) {
for (var i = 0; i < menu.items.length; i++) {
if (menu.items[i].options.isCustomItem) {
menu.removeItem(menu.items[i]);
i--;
}
}
}
this._hasCustomItems = false;
};

dh.parseIcons = function(icons) {
var plugins = _editor.getController('Common.Controllers.Plugins').getView('Common.Views.Plugins');
if (icons && icons.length && plugins && plugins.parseIcons) {
icons = plugins.parseIcons(icons);
return icons ? icons['normal'] : undefined;
}
};
}

});
Expand Down
145 changes: 14 additions & 131 deletions apps/documenteditor/main/app/view/DocumentHolder.js
Original file line number Diff line number Diff line change
Expand Up @@ -2484,137 +2484,6 @@ define([
});
},

updateCustomItems: function(menu, data) {
if (!menu || !data || data.length<1) return;

var me = this,
lang = me.mode && me.mode.lang ? me.mode.lang.split(/[\-_]/)[0] : 'en';

me._preventCustomClick && clearTimeout(me._preventCustomClick);
me._hasCustomItems && (me._preventCustomClick = setTimeout(function () {
me._preventCustomClick = null;
},500)); // set delay only on update existing items
me._hasCustomItems = true;

var findCustomItem = function(guid, id) {
if (menu && menu.items.length>0) {
for (var i = menu.items.length-1; i >=0 ; i--) {
if (menu.items[i].options.isCustomItem && (id===undefined && menu.items[i].options.guid === guid || menu.items[i].options.guid === guid && menu.items[i].value === id)) {
return menu.items[i];
}
}
}
}

var getMenu = function(items, guid, toMenu) {
if (toMenu)
toMenu.removeAll();
else {
toMenu = new Common.UI.Menu({
cls: 'shifted-right',
menuAlign: 'tl-tr',
items: []
});
toMenu.on('item:click', function(menu, item, e) {
!me._preventCustomClick && me.api && me.api.onPluginContextMenuItemClick && me.api.onPluginContextMenuItemClick(item.options.guid, item.value);
});
toMenu.on('menu:click', function(menu, e) {
me._preventCustomClick && e.stopPropagation();
});
}
items.forEach(function(item) {
item.separator && toMenu.addItem({
caption: '--',
isCustomItem: true,
guid: guid
});
item.text && toMenu.addItem({
caption: ((typeof item.text == 'object') ? item.text[lang] || item.text['en'] : item.text) || '',
isCustomItem: true,
value: item.id,
guid: guid,
menu: item.items ? getMenu(item.items, guid) : false,
iconImg: me.parseIcons(item.icons),
disabled: !!item.disabled
});
});
return toMenu;
}

var focused;
data.forEach(function(plugin) {
var isnew = !findCustomItem(plugin.guid);
if (plugin && plugin.items && plugin.items.length>0) {
plugin.items.forEach(function(item) {
if (item.separator && isnew) {// add separator only to new plugins menu
menu.addItem({
caption: '--',
isCustomItem: true,
guid: plugin.guid
});
}

if (!item.text) return;
var mnu = findCustomItem(plugin.guid, item.id),
caption = ((typeof item.text == 'object') ? item.text[lang] || item.text['en'] : item.text) || '';
if (mnu) {
mnu.setCaption(caption);
mnu.setDisabled(!!item.disabled);
if (item.items) {
if (mnu.menu) {
if (mnu.menu.isVisible() && mnu.menu.cmpEl.find(' > li:not(.divider):not(.disabled):visible').find('> a').filter(':focus').length>0) {
mnu.menu.isOver = true;
focused = mnu.cmpEl;
}
getMenu(item.items, plugin.guid, mnu.menu);
} else
mnu.setMenu(getMenu(item.items, plugin.guid));
}
} else {
var mnu = new Common.UI.MenuItem({
caption : caption,
isCustomItem: true,
value: item.id,
guid: plugin.guid,
menu: item.items && item.items.length>=0 ? getMenu(item.items, plugin.guid) : false,
iconImg: me.parseIcons(item.icons),
disabled: !!item.disabled
}).on('click', function(item, e) {
!me._preventCustomClick && me.api && me.api.onPluginContextMenuItemClick && me.api.onPluginContextMenuItemClick(item.options.guid, item.value);
});
menu.addItem(mnu);
}
});
}
});

if (focused) {
var $subitems = $('> [role=menu]', focused).find('> li:not(.divider):not(.disabled):visible > a');
($subitems.length>0) && $subitems.eq(0).focus();
}
menu.alignPosition();
},

clearCustomItems: function(menu) {
if (menu && menu.items.length>0) {
for (var i = 0; i < menu.items.length; i++) {
if (menu.items[i].options.isCustomItem) {
menu.removeItem(menu.items[i]);
i--;
}
}
}
this._hasCustomItems = false;
},

parseIcons: function(icons) {
var plugins = DE.getController('Common.Controllers.Plugins').getView('Common.Views.Plugins');
if (icons && icons.length && plugins && plugins.parseIcons) {
icons = plugins.parseIcons(icons);
return icons ? icons['normal'] : undefined;
}
},

focus: function() {
var me = this;
_.defer(function(){ me.cmpEl.focus(); }, 50);
Expand All @@ -2626,6 +2495,20 @@ define([
this._fillFormMode = state ? fillFormMode : false;
},

addEquationMenu: function() {},

clearEquationMenu: function() {},

equationCallback: function() {},

initEquationMenu: function() {},

updateCustomItems: function() {},

clearCustomItems: function() {},

parseIcons: function() {},

alignmentText : 'Alignment',
leftText : 'Left',
rightText : 'Right',
Expand Down
Loading

0 comments on commit f9106dc

Please sign in to comment.