@dotglitch/ngx-ctx-menu
Version:
Angular context menu that works with templates
116 lines • 15.6 kB
JavaScript
export const getPosition = (el, config = {}, bounds) => {
// Bounds of the popup owner
const src = !!el['nodeName']
? el.getBoundingClientRect()
: {
// It's a pointer event, so we'll take the X and Y from the pointer.
x: el['clientX'],
y: el['clientY'],
// Set a default tiny size, so we don't divide by zero.
width: 0.0001,
height: 0.0001
};
// Popup bounds
const { width, height } = bounds;
const winh = window.innerHeight;
const winw = window.innerWidth;
const cords = {
top: null,
left: null
};
if (config?.position == "left" || config?.position == "right" || !config?.position) {
switch (config?.alignment) {
case "end": {
// vertically bind to bottom
cords.top = src.y + src.height - height;
break;
}
case "afterend": {
// vertically bind below bottom
cords.top = src.y + src.height;
break;
}
case "beforestart": {
// vertically bind above top
cords.top = src.y - height;
break;
}
case "start": {
// vertically bind to top
cords.top = src.y;
break;
}
case "center":
default: {
// vertically center
cords.top = (src.y + (src.height / 2)) - (height / 2);
break;
}
}
// Apply bounds to prevent the dialog from being cut-off screen
// Lower bound
cords.top = Math.max(config?.edgePadding || 0, cords.top);
// Upper bound
cords.top = Math.min(winh - height, cords.top);
if (config?.position == "left") {
cords.left = src.x - (width + (config?.arrowSize || 0) + (config?.arrowPadding || 0));
}
if (config?.position == "right" || !config?.position) {
cords.left = src.x + (src.width + (config?.arrowSize || 0) + (config?.arrowPadding || 0));
}
// Lower bound
cords.left = Math.max(config?.edgePadding || 0, cords.left);
// Upper bound
cords.left = Math.min(winw - width, cords.left);
}
else if (config?.position == "top" || config?.position == "bottom") {
switch (config?.alignment) {
case "end": {
// vertically bind to right
cords.left = src.x + src.width - width;
break;
}
case "afterend": {
// vertically bind past right
cords.left = src.x + src.width;
break;
}
case "beforestart": {
// vertically bind before left
cords.left = src.x - width;
break;
}
case "start": {
// vertically bind to left
cords.left = src.x;
break;
}
case "center":
default: {
// vertically center
cords.left = (src.x + (src.width / 2)) - (width / 2);
break;
}
}
// Apply bounds to prevent the dialog from being cut-off screen
// Lower bound
cords.left = Math.max(config?.edgePadding || 0, cords.left);
// Upper bound
cords.left = Math.min(winw - width, cords.left);
if (config?.position == "top") {
cords.top = src.y - (height + (config?.arrowSize || 0) + (config?.arrowPadding || 0));
}
if (config?.position == "bottom") {
cords.top = src.y + (src.height + (config?.arrowSize || 0) + (config?.arrowPadding || 0));
}
// Lower bound
cords.top = Math.max(config?.edgePadding || 0, cords.top);
// Upper bound
cords.top = Math.min(winh - height, cords.top);
}
// Assign unit
cords.top = cords.top + 'px';
cords.left = cords.left + 'px';
return cords;
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxDQUFDLEVBQThCLEVBQUUsU0FBYyxFQUFFLEVBQUUsTUFBZSxFQUFFLEVBQUU7SUFDN0YsNEJBQTRCO0lBQzVCLE1BQU0sR0FBRyxHQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDO1FBQ3pCLENBQUMsQ0FBRSxFQUFrQixDQUFDLHFCQUFxQixFQUFFO1FBQzdDLENBQUMsQ0FBQztZQUNFLG9FQUFvRTtZQUNwRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUNoQixDQUFDLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUNoQix1REFBdUQ7WUFDdkQsS0FBSyxFQUFFLE1BQU07WUFDYixNQUFNLEVBQUUsTUFBTTtTQUNOLENBQUM7SUFFekIsZUFBZTtJQUNmLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBRWpDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7SUFDaEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztJQUUvQixNQUFNLEtBQUssR0FBRztRQUNWLEdBQUcsRUFBRSxJQUFJO1FBQ1QsSUFBSSxFQUFFLElBQUk7S0FDYixDQUFDO0lBRUYsSUFBSSxNQUFNLEVBQUUsUUFBUSxJQUFJLE1BQU0sSUFBSSxNQUFNLEVBQUUsUUFBUSxJQUFJLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUU7UUFDaEYsUUFBUSxNQUFNLEVBQUUsU0FBUyxFQUFFO1lBRXZCLEtBQUssS0FBSyxDQUFDLENBQUM7Z0JBQ1IsNEJBQTRCO2dCQUM1QixLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sR0FBRyxN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RyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxNQUFNLEVBQUUsU0FBUyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzdGO1FBRUQsY0FBYztRQUNkLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUQsY0FBYztRQUNkLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUNsRDtJQUVELGNBQWM7SUFDZCxLQUFLLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO0lBQzdCLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFFL0IsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiXG5cbmV4cG9ydCBjb25zdCBnZXRQb3NpdGlvbiA9IChlbDogSFRNTEVsZW1lbnQgfCBQb2ludGVyRXZlbnQsIGNvbmZpZzogYW55ID0ge30sIGJvdW5kczogRE9NUmVjdCkgPT4ge1xuICAgIC8vIEJvdW5kcyBvZiB0aGUgcG9wdXAgb3duZXJcbiAgICBjb25zdCBzcmM6IERPTVJlY3QgPSAhIWVsWydub2RlTmFtZSddXG4gICAgICAgICAgICAgICAgPyAoZWwgYXMgSFRNTEVsZW1lbnQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEl0J3MgYSBwb2ludGVyIGV2ZW50LCBzbyB3ZSdsbCB0YWtlIHRoZSBYIGFuZCBZIGZyb20gdGhlIHBvaW50ZXIuXG4gICAgICAgICAgICAgICAgICAgIHg6IGVsWydjbGllbnRYJ10sXG4gICAgICAgICAgICAgICAgICAgIHk6IGVsWydjbGllbnRZJ10sXG4gICAgICAgICAgICAgICAgICAgIC8vIFNldCBhIGRlZmF1bHQgdGlueSBzaXplLCBzbyB3ZSBkb24ndCBkaXZpZGUgYnkgemVyby5cbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDAuMDAwMSxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAwLjAwMDFcbiAgICAgICAgICAgICAgICB9IGFzIERPTVJlY3Q7XG5cbiAgICAvLyBQb3B1cCBib3VuZHNcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGJvdW5kcztcblxuICAgIGNvbnN0IHdpbmggPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgY29uc3Qgd2ludyA9IHdpbmRvdy5pbm5lcldpZHRoO1xuXG4gICAgY29uc3QgY29yZHMgPSB7XG4gICAgICAgIHRvcDogbnVsbCxcbiAgICAgICAgbGVmdDogbnVsbFxuICAgIH07XG5cbiAgICBpZiAoY29uZmlnPy5wb3NpdGlvbiA9PSBcImxlZnRcIiB8fCBjb25maWc/LnBvc2l0aW9uID09IFwicmlnaHRcIiB8fCAhY29uZmlnPy5wb3NpdGlvbikge1xuICAgICAgICBzd2l0Y2ggKGNvbmZpZz8uYWxpZ25tZW50KSB7XG5cbiAgICAgICAgICAgIGNhc2UgXCJlbmRcIjoge1xuICAgICAgICAgICAgICAgIC8vIHZlcnRpY2FsbHkgYmluZCB0byBib3R0b21cbiAgICAgICAgICAgICAgICBjb3Jkcy50b3AgPSBzcmMueSArIHNyYy5oZWlnaHQgLSBoZWlnaHQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwiYWZ0ZXJlbmRcIjoge1xuICAgICAgICAgICAgICAgIC8vIHZlcnRpY2FsbHkgYmluZCBiZWxvdyBib3R0b21cbiAgICAgICAgICAgICAgICBjb3Jkcy50b3AgPSBzcmMueSArIHNyYy5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwiYmVmb3Jlc3RhcnRcIjoge1xuICAgICAgICAgICAgICAgIC8vIHZlcnRpY2FsbHkgYmluZCBhYm92ZSB0b3BcbiAgICAgICAgICAgICAgICBjb3Jkcy50b3AgPSBzcmMueSAtIGhlaWdodDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJzdGFydFwiOiB7XG4gICAgICAgICAgICAgICAgLy8gdmVydGljYWxseSBiaW5kIHRvIHRvcFxuICAgICAgICAgICAgICAgIGNvcmRzLnRvcCA9IHNyYy55O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcImNlbnRlclwiOlxuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIC8vIHZlcnRpY2FsbHkgY2VudGVyXG4gICAgICAgICAgICAgICAgY29yZHMudG9wID0gKHNyYy55ICsgKHNyYy5oZWlnaHQgLyAyKSkgLSAoaGVpZ2h0IC8gMik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBib3VuZHMgdG8gcHJldmVudCB0aGUgZGlhbG9nIGZyb20gYmVpbmcgY3V0LW9mZiBzY3JlZW5cbiAgICAgICAgLy8gTG93ZXIgYm91bmRcbiAgICAgICAgY29yZHMudG9wID0gTWF0aC5tYXgoY29uZmlnPy5lZGdlUGFkZGluZyB8fCAwLCBjb3Jkcy50b3ApO1xuICAgICAgICAvLyBVcHBlciBib3VuZFxuICAgICAgICBjb3Jkcy50b3AgPSBNYXRoLm1pbih3aW5oIC0gaGVpZ2h0LCBjb3Jkcy50b3ApO1xuXG4gICAgICAgIGlmIChjb25maWc/LnBvc2l0aW9uID09IFwibGVmdFwiKSB7XG4gICAgICAgICAgICBjb3Jkcy5sZWZ0ID0gc3JjLnggLSAod2lkdGggKyAoY29uZmlnPy5hcnJvd1NpemUgfHwgMCkgKyAoY29uZmlnPy5hcnJvd1BhZGRpbmcgfHwgMCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWc/LnBvc2l0aW9uID09IFwicmlnaHRcIiB8fCAhY29uZmlnPy5wb3NpdGlvbikge1xuICAgICAgICAgICAgY29yZHMubGVmdCA9IHNyYy54ICsgKHNyYy53aWR0aCArIChjb25maWc/LmFycm93U2l6ZSB8fCAwKSArIChjb25maWc/LmFycm93UGFkZGluZyB8fCAwKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb3dlciBib3VuZFxuICAgICAgICBjb3Jkcy5sZWZ0ID0gTWF0aC5tYXgoY29uZmlnPy5lZGdlUGFkZGluZyB8fCAwLCBjb3Jkcy5sZWZ0KTtcbiAgICAgICAgLy8gVXBwZXIgYm91bmRcbiAgICAgICAgY29yZHMubGVmdCA9IE1hdGgubWluKHdpbncgLSB3aWR0aCwgY29yZHMubGVmdCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNvbmZpZz8ucG9zaXRpb24gPT0gXCJ0b3BcIiB8fCBjb25maWc/LnBvc2l0aW9uID09IFwiYm90dG9tXCIpIHtcbiAgICAgICAgc3dpdGNoIChjb25maWc/LmFsaWdubWVudCkge1xuICAgICAgICAgICAgY2FzZSBcImVuZFwiOiB7XG4gICAgICAgICAgICAgICAgLy8gdmVydGljYWxseSBiaW5kIHRvIHJpZ2h0XG4gICAgICAgICAgICAgICAgY29yZHMubGVmdCA9IHNyYy54ICsgc3JjLndpZHRoIC0gd2lkdGg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwiYWZ0ZXJlbmRcIjoge1xuICAgICAgICAgICAgICAgIC8vIHZlcnRpY2FsbHkgYmluZCBwYXN0IHJpZ2h0XG4gICAgICAgICAgICAgICAgY29yZHMubGVmdCA9IHNyYy54ICsgc3JjLndpZHRoO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcImJlZm9yZXN0YXJ0XCI6IHtcbiAgICAgICAgICAgICAgICAvLyB2ZXJ0aWNhbGx5IGJpbmQgYmVmb3JlIGxlZnRcbiAgICAgICAgICAgICAgICBjb3Jkcy5sZWZ0ID0gc3JjLnggLSB3aWR0aDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJzdGFydFwiOiB7XG4gICAgICAgICAgICAgICAgLy8gdmVydGljYWxseSBiaW5kIHRvIGxlZnRcbiAgICAgICAgICAgICAgICBjb3Jkcy5sZWZ0ID0gc3JjLng7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwiY2VudGVyXCI6XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgLy8gdmVydGljYWxseSBjZW50ZXJcbiAgICAgICAgICAgICAgICBjb3Jkcy5sZWZ0ID0gKHNyYy54ICsgKHNyYy53aWR0aCAvIDIpKSAtICh3aWR0aCAvIDIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwbHkgYm91bmRzIHRvIHByZXZlbnQgdGhlIGRpYWxvZyBmcm9tIGJlaW5nIGN1dC1vZmYgc2NyZWVuXG4gICAgICAgIC8vIExvd2VyIGJvdW5kXG4gICAgICAgIGNvcmRzLmxlZnQgPSBNYXRoLm1heChjb25maWc/LmVkZ2VQYWRkaW5nIHx8IDAsIGNvcmRzLmxlZnQpO1xuICAgICAgICAvLyBVcHBlciBib3VuZFxuICAgICAgICBjb3Jkcy5sZWZ0ID0gTWF0aC5taW4od2ludyAtIHdpZHRoLCBjb3Jkcy5sZWZ0KTtcblxuXG4gICAgICAgIGlmIChjb25maWc/LnBvc2l0aW9uID09IFwidG9wXCIpIHtcbiAgICAgICAgICAgIGNvcmRzLnRvcCA9IHNyYy55IC0gKGhlaWdodCArIChjb25maWc/LmFycm93U2l6ZSB8fCAwKSArIChjb25maWc/LmFycm93UGFkZGluZyB8fCAwKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZz8ucG9zaXRpb24gPT0gXCJib3R0b21cIikge1xuICAgICAgICAgICAgY29yZHMudG9wID0gc3JjLnkgKyAoc3JjLmhlaWdodCArIChjb25maWc/LmFycm93U2l6ZSB8fCAwKSArIChjb25maWc/LmFycm93UGFkZGluZyB8fCAwKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb3dlciBib3VuZFxuICAgICAgICBjb3Jkcy50b3AgPSBNYXRoLm1heChjb25maWc/LmVkZ2VQYWRkaW5nIHx8IDAsIGNvcmRzLnRvcCk7XG4gICAgICAgIC8vIFVwcGVyIGJvdW5kXG4gICAgICAgIGNvcmRzLnRvcCA9IE1hdGgubWluKHdpbmggLSBoZWlnaHQsIGNvcmRzLnRvcCk7XG4gICAgfVxuXG4gICAgLy8gQXNzaWduIHVuaXRcbiAgICBjb3Jkcy50b3AgPSBjb3Jkcy50b3AgKyAncHgnO1xuICAgIGNvcmRzLmxlZnQgPSBjb3Jkcy5sZWZ0ICsgJ3B4JztcblxuICAgIHJldHVybiBjb3Jkcztcbn1cbiJdfQ==