Merge pull request #426 from xwiki-labs/responsiveContextmenu

Responsive contextmenu
pull/1/head
ansuz 5 years ago committed by GitHub
commit 628b8866cb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -22,13 +22,16 @@
} }
} }
.dropdown-toggle { .dropdown-toggle {
transform: rotate(270deg);
margin-left: 1rem; margin-left: 1rem;
float: right;
} }
.dropdown-menu { .dropdown-menu {
top: -0.7rem; top: -0.7rem;
left: 100%; left: 100%;
&.left { &.left {
left: -10rem; left: 0%;
transform: translate(-100%);
} }
} }
} }

@ -397,16 +397,34 @@ define([
'data-icon': AppConfig.applicationsIcon.slide, 'data-icon': AppConfig.applicationsIcon.slide,
'data-type': 'slide' 'data-type': 'slide'
}, Messages.button_newslide)), }, Messages.button_newslide)),
h('li.dropdown-submenu', [
h('a.cp-app-drive-context-newdocmenu.dropdown-item', {
'tabindex': '-1',
'data-icon': "fa-plus",
}, Messages.fm_morePads || "More pads"), //XXX
h("ul.dropdown-menu", [
h('li', h('a.cp-app-drive-context-newdoc.dropdown-item.cp-app-drive-context-editable', { h('li', h('a.cp-app-drive-context-newdoc.dropdown-item.cp-app-drive-context-editable', {
'tabindex': '-1', 'tabindex': '-1',
'data-icon': AppConfig.applicationsIcon.poll, 'data-icon': AppConfig.applicationsIcon.sheet,
'data-type': 'poll' 'data-type': 'sheet'
}, Messages.button_newpoll)), }, Messages.button_newsheet)),
h('li', h('a.cp-app-drive-context-newdoc.dropdown-item.cp-app-drive-context-editable', { h('li', h('a.cp-app-drive-context-newdoc.dropdown-item.cp-app-drive-context-editable', {
'tabindex': '-1', 'tabindex': '-1',
'data-icon': AppConfig.applicationsIcon.whiteboard, 'data-icon': AppConfig.applicationsIcon.whiteboard,
'data-type': 'whiteboard' 'data-type': 'whiteboard'
}, Messages.button_newwhiteboard)), }, Messages.button_newwhiteboard)),
h('li', h('a.cp-app-drive-context-newdoc.dropdown-item.cp-app-drive-context-editable', {
'tabindex': '-1',
'data-icon': AppConfig.applicationsIcon.kanban,
'data-type': 'kanban'
}, Messages.button_newkanban)),
h('li', h('a.cp-app-drive-context-newdoc.dropdown-item.cp-app-drive-context-editable', {
'tabindex': '-1',
'data-icon': AppConfig.applicationsIcon.poll,
'data-type': 'poll'
}, Messages.button_newpoll)),
]),
]),
$separator.clone()[0], $separator.clone()[0],
h('li', h('a.cp-app-drive-context-empty.dropdown-item.cp-app-drive-context-editable', { h('li', h('a.cp-app-drive-context-empty.dropdown-item.cp-app-drive-context-editable', {
'tabindex': '-1', 'tabindex': '-1',
@ -443,6 +461,7 @@ define([
}, Messages.fc_prop)), }, Messages.fc_prop)),
]) ])
]); ]);
// add icons to the contextmenu options
$(menu).find("li a.dropdown-item").each(function (i, el) { $(menu).find("li a.dropdown-item").each(function (i, el) {
var $icon = $("<span>"); var $icon = $("<span>");
if ($(el).attr('data-icon')) { if ($(el).attr('data-icon')) {
@ -453,21 +472,46 @@ define([
} }
$(el).prepend($icon); $(el).prepend($icon);
}); });
// add events handlers for the contextmenu submenus
$(menu).find(".dropdown-submenu").each(function (i, el) { $(menu).find(".dropdown-submenu").each(function (i, el) {
var $el = $(el); var $el = $(el);
var $a = $el.children().filter("a"); var $a = $el.children().filter("a");
var $sub = $el.find(".dropdown-menu").first(); var $sub = $el.find(".dropdown-menu").first();
var timeoutId;
var showSubmenu = function () {
clearTimeout(timeoutId);
$sub.toggleClass("left", $el.offset().left + $el.outerWidth() + $sub.outerWidth() > $(window).width());
$el.siblings().find(".dropdown-menu").hide();
$sub.show();
};
var hideSubmenu = function () {
$sub.hide();
$sub.removeClass("left");
};
var mouseOutSubmenu = function () {
// don't hide immediately the submenu
timeoutId = setTimeout(hideSubmenu, 100);
};
// Add submenu expand icon // Add submenu expand icon
$a.append(h("span.dropdown-toggle")); $a.append(h("span.dropdown-toggle"));
// Show / hide submenu // Show / hide submenu
$el.hover(function () { $el.hover(function () {
setTimeout(function () { // wait for dom to update showSubmenu();
$sub.toggleClass("left", $el.offset().left + $el.outerWidth() + $sub.outerWidth() > $(window).width());
$sub.show();
});
}, function () { }, function () {
$sub.hide(); mouseOutSubmenu();
$sub.removeClass("left"); });
// handle click event
$el.click(function (e) {
var targetItem = $(e.target).closest(".dropdown-item")[0]; // don't close contextmenu if open submenu
var elTarget = $el.children(".dropdown-item")[0];
if (targetItem === elTarget) { e.stopPropagation(); }
if ($el.children().filter(".dropdown-menu:visible").length !== 0) {
$el.find(".dropdown-menu").hide();
hideSubmenu();
}
else {
showSubmenu();
}
}); });
}); });
return $(menu); return $(menu);
@ -1313,12 +1357,11 @@ define([
updateContextButton(); updateContextButton();
}; };
var displayMenu = function (e) { // show / hide dropdown separators
var $menu = $contextMenu; var hideSeparators = function ($menu) {
var showSep = false; var showSep = false;
var $lastVisibleSep = null; var $lastVisibleSep = null;
// show / hide drop-down divider $menu.children().each(function (i, el) {
$menu.find(".dropdown-menu").children().each(function (i, el) {
var $el = $(el); var $el = $(el);
if ($el.is(".dropdown-divider")) { if ($el.is(".dropdown-divider")) {
$el.css("display", showSep ? "list-item" : "none"); $el.css("display", showSep ? "list-item" : "none");
@ -1330,16 +1373,27 @@ define([
} }
}); });
if (!showSep && $lastVisibleSep) { $lastVisibleSep.css("display", "none"); } // remove last divider if no options after if (!showSep && $lastVisibleSep) { $lastVisibleSep.css("display", "none"); } // remove last divider if no options after
};
// prepare and display contextmenu
var displayMenu = function (e) {
var $menu = $contextMenu;
// show / hide submenus // show / hide submenus
$menu.find(".dropdown-submenu").each(function (i, el) { $menu.find(".dropdown-submenu").each(function (i, el) {
var $el = $(el); var $el = $(el);
$el.children(".dropdown-menu").css("display", "none");
$el.find("li").each(function (i, li) { $el.find("li").each(function (i, li) {
if ($(li).css("display") !== "none") { if ($(li).css("display") !== "none") {
$(el).css("display", "block"); $el.css("display", "block");
return; return;
} }
}); });
}); });
// show / hide separators
$menu.find(".dropdown-menu").each(function (i, menu) {
hideSeparators($(menu));
});
// show contextmenu at cursor position
$menu.css({ display: "block" }); $menu.css({ display: "block" });
if (APP.mobile()) { if (APP.mobile()) {
$menu.css({ $menu.css({
@ -3556,7 +3610,7 @@ define([
if (paths.length !== 1) { return; } if (paths.length !== 1) { return; }
displayRenameInput(paths[0].element, paths[0].path); displayRenameInput(paths[0].element, paths[0].path);
} }
if ($(this).hasClass("cp-app-drive-context-color")) { else if ($(this).hasClass("cp-app-drive-context-color")) {
var currentColor = getFolderColor(paths[0].path); var currentColor = getFolderColor(paths[0].path);
pickFolderColor(paths[0].element, currentColor, function (color) { pickFolderColor(paths[0].element, currentColor, function (color) {
paths.forEach(function (p) { paths.forEach(function (p) {
@ -3802,6 +3856,7 @@ define([
}); });
$appContainer.on('mouseup', function (e) { $appContainer.on('mouseup', function (e) {
if (e.which !== 1) { return ; } if (e.which !== 1) { return ; }
if ($(e.target).is(".dropdown-submenu a, .dropdown-submenu a span")) { return; } // if we click on dropdown-submenu, don't close menu
APP.hideMenu(e); APP.hideMenu(e);
}); });
$appContainer.on('click', function (e) { $appContainer.on('click', function (e) {

Loading…
Cancel
Save