You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
2.0 KiB
63 lines
2.0 KiB
/**
|
|
* Default implementation of a contextmenu-behaviour
|
|
*/
|
|
const DefaultContextMenu = {
|
|
openContextMenuAction: function (identifier, refPos) {
|
|
if (!refPos) {
|
|
refPos = function (event) {
|
|
return new Sides()
|
|
.left(event.pageX)
|
|
.top(event.pageY);
|
|
}
|
|
}
|
|
|
|
return function (event) {
|
|
event.preventDefault();
|
|
|
|
if (refPos instanceof Function) {
|
|
refPos = refPos(event);
|
|
}
|
|
|
|
let menu = document.querySelector(`[data-autocompel="${identifier}"`);
|
|
|
|
menu.style.left = `${refPos.getByIndex(SideDirections.LEFT)}px`;
|
|
menu.style.top = `${refPos.getByIndex(SideDirections.TOP)}px`;
|
|
|
|
helperFun.toggleElementVisibility(menu, true);
|
|
helperFun.toggleElementVisibility(menu);
|
|
|
|
document.addEventListener(
|
|
"click",
|
|
DefaultContextMenu.hideOnClickOutsideBoundsAction(identifier)
|
|
);
|
|
document.addEventListener(
|
|
"keyup",
|
|
DefaultContextMenu.hideOnEscapeAction(identifier)
|
|
);
|
|
}
|
|
|
|
}
|
|
,
|
|
hideOnEscapeAction: function (identifier) {
|
|
return function (event) {
|
|
if (event.key === "Escape") {
|
|
let menu = document.querySelector(`[data-autocompel="${identifier}"`);
|
|
helperFun.toggleElementVisibility(menu, true);
|
|
document.removeEventListener("keyup");
|
|
}
|
|
}
|
|
}
|
|
,
|
|
hideOnClickOutsideBoundsAction: function (identifier) {
|
|
return function (event) {
|
|
let menu = document.querySelector(`[data-autocompel="${identifier}"`);
|
|
|
|
let area = getEnclosingBounds(menu);
|
|
|
|
if (!areXYInArea(area, event.clientX, event.clientY)) {
|
|
helperFun.toggleElementVisibility(menu, true);
|
|
document.removeEventListener("click")
|
|
}
|
|
}
|
|
}
|
|
};
|