UNPKG

@dotglitch/ngx-common

Version:

Angular components and utilities that are commonly used.

120 lines 16.3 kB
/** * This utils file exists outside of the strict angular DI zone * This enables opening popups without requiring absolute DI bindings. */ 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL2RpcmVjdGl2ZXMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQUMsRUFBOEIsRUFBRSxTQUFjLEVBQUUsRUFBRSxNQUFlLEVBQUUsRUFBRTtJQUM3Riw0QkFBNEI7SUFDNUIsTUFBTSxHQUFHLEdBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUM7UUFDekIsQ0FBQyxDQUFFLEVBQWtCLENBQUMscUJBQXFCLEVBQUU7UUFDN0MsQ0FBQyxDQUFDO1lBQ0Usb0VBQW9FO1lBQ3BFLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQ2hCLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQ2hCLHVEQUF1RDtZQUN2RCxLQUFLLEVBQUUsTUFBTTtZQUNiLE1BQU0sRUFBRSxNQUFNO1NBQ04sQ0FBQztJQUV6QixlQUFlO0lBQ2YsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFFakMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztJQUNoQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO0lBRS9CLE1BQU0sS0FBSyxHQUFHO1FBQ1YsR0FBRyxFQUFFLElBQUk7UUFDVCxJQUFJLEVBQUUsSUFBSTtLQUNiLENBQUM7SUFFRixJQUFJLE1BQU0sRUFBRSxRQUFRLElBQUksTUFBTSxJQUFJLE1BQU0sRUFBRSxRQUFRLElBQUksT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDO1FBQ2pGLFFBQVEsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO1lBRXhCLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDVCw0QkFBNEI7Z0JBQzVCLEtBQUssQ0FB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QUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLE1BQU0sRUFBRSxTQUFTLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUYsQ0FBQztRQUNELElBQUksTUFBTSxFQUFFLFFBQVEsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUMvQixLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsTUFBTSxFQUFFLFNBQVMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5RixDQUFDO1FBRUQsY0FBYztRQUNkLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUQsY0FBYztRQUNkLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsY0FBYztJQUNkLEtBQUssQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7SUFDN0IsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUUvQixPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoaXMgdXRpbHMgZmlsZSBleGlzdHMgb3V0c2lkZSBvZiB0aGUgc3RyaWN0IGFuZ3VsYXIgREkgem9uZVxuICogVGhpcyBlbmFibGVzIG9wZW5pbmcgcG9wdXBzIHdpdGhvdXQgcmVxdWlyaW5nIGFic29sdXRlIERJIGJpbmRpbmdzLlxuICovXG5cbmV4cG9ydCBjb25zdCBnZXRQb3NpdGlvbiA9IChlbDogSFRNTEVsZW1lbnQgfCBQb2ludGVyRXZlbnQsIGNvbmZpZzogYW55ID0ge30sIGJvdW5kczogRE9NUmVjdCkgPT4ge1xuICAgIC8vIEJvdW5kcyBvZiB0aGUgcG9wdXAgb3duZXJcbiAgICBjb25zdCBzcmM6IERPTVJlY3QgPSAhIWVsWydub2RlTmFtZSddXG4gICAgICAgICAgICAgICAgPyAoZWwgYXMgSFRNTEVsZW1lbnQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEl0J3MgYSBwb2ludGVyIGV2ZW50LCBzbyB3ZSdsbCB0YWtlIHRoZSBYIGFuZCBZIGZyb20gdGhlIHBvaW50ZXIuXG4gICAgICAgICAgICAgICAgICAgIHg6IGVsWydjbGllbnRYJ10sXG4gICAgICAgICAgICAgICAgICAgIHk6IGVsWydjbGllbnRZJ10sXG4gICAgICAgICAgICAgICAgICAgIC8vIFNldCBhIGRlZmF1bHQgdGlueSBzaXplLCBzbyB3ZSBkb24ndCBkaXZpZGUgYnkgemVyby5cbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDAuMDAwMSxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAwLjAwMDFcbiAgICAgICAgICAgICAgICB9IGFzIERPTVJlY3Q7XG5cbiAgICAvLyBQb3B1cCBib3VuZHNcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGJvdW5kcztcblxuICAgIGNvbnN0IHdpbmggPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgY29uc3Qgd2ludyA9IHdpbmRvdy5pbm5lcldpZHRoO1xuXG4gICAgY29uc3QgY29yZHMgPSB7XG4gICAgICAgIHRvcDogbnVsbCxcbiAgICAgICAgbGVmdDogbnVsbFxuICAgIH07XG5cbiAgICBpZiAoY29uZmlnPy5wb3NpdGlvbiA9PSBcImxlZnRcIiB8fCBjb25maWc/LnBvc2l0aW9uID09IFwicmlnaHRcIiB8fCAhY29uZmlnPy5wb3NpdGlvbikge1xuICAgICAgICBzd2l0Y2ggKGNvbmZpZz8uYWxpZ25tZW50KSB7XG5cbiAgICAgICAgICAgIGNhc2UgXCJlbmRcIjoge1xuICAgICAgICAgICAgICAgIC8vIHZlcnRpY2FsbHkgYmluZCB0byBib3R0b21cbiAgICAgICAgICAgICAgICBjb3Jkcy50b3AgPSBzcmMueSArIHNyYy5oZWlnaHQgLSBoZWlnaHQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwiYWZ0ZXJlbmRcIjoge1xuICAgICAgICAgICAgICAgIC8vIHZlcnRpY2FsbHkgYmluZCBiZWxvdyBib3R0b21cbiAgICAgICAgICAgICAgICBjb3Jkcy50b3AgPSBzcmMueSArIHNyYy5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwiYmVmb3Jlc3RhcnRcIjoge1xuICAgICAgICAgICAgICAgIC8vIHZlcnRpY2FsbHkgYmluZCBhYm92ZSB0b3BcbiAgICAgICAgICAgICAgICBjb3Jkcy50b3AgPSBzcmMueSAtIGhlaWdodDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJzdGFydFwiOiB7XG4gICAgICAgICAgICAgICAgLy8gdmVydGljYWxseSBiaW5kIHRvIHRvcFxuICAgICAgICAgICAgICAgIGNvcmRzLnRvcCA9IHNyYy55O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcImNlbnRlclwiOlxuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIC8vIHZlcnRpY2FsbHkgY2VudGVyXG4gICAgICAgICAgICAgICAgY29yZHMudG9wID0gKHNyYy55ICsgKHNyYy5oZWlnaHQgLyAyKSkgLSAoaGVpZ2h0IC8gMik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBib3VuZHMgdG8gcHJldmVudCB0aGUgZGlhbG9nIGZyb20gYmVpbmcgY3V0LW9mZiBzY3JlZW5cbiAgICAgICAgLy8gTG93ZXIgYm91bmRcbiAgICAgICAgY29yZHMudG9wID0gTWF0aC5tYXgoY29uZmlnPy5lZGdlUGFkZGluZyB8fCAwLCBjb3Jkcy50b3ApO1xuICAgICAgICAvLyBVcHBlciBib3VuZFxuICAgICAgICBjb3Jkcy50b3AgPSBNYXRoLm1pbih3aW5oIC0gaGVpZ2h0LCBjb3Jkcy50b3ApO1xuXG4gICAgICAgIGlmIChjb25maWc/LnBvc2l0aW9uID09IFwibGVmdFwiKSB7XG4gICAgICAgICAgICBjb3Jkcy5sZWZ0ID0gc3JjLnggLSAod2lkdGggKyAoY29uZmlnPy5hcnJvd1NpemUgfHwgMCkgKyAoY29uZmlnPy5hcnJvd1BhZGRpbmcgfHwgMCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWc/LnBvc2l0aW9uID09IFwicmlnaHRcIiB8fCAhY29uZmlnPy5wb3NpdGlvbikge1xuICAgICAgICAgICAgY29yZHMubGVmdCA9IHNyYy54ICsgKHNyYy53aWR0aCArIChjb25maWc/LmFycm93U2l6ZSB8fCAwKSArIChjb25maWc/LmFycm93UGFkZGluZyB8fCAwKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb3dlciBib3VuZFxuICAgICAgICBjb3Jkcy5sZWZ0ID0gTWF0aC5tYXgoY29uZmlnPy5lZGdlUGFkZGluZyB8fCAwLCBjb3Jkcy5sZWZ0KTtcbiAgICAgICAgLy8gVXBwZXIgYm91bmRcbiAgICAgICAgY29yZHMubGVmdCA9IE1hdGgubWluKHdpbncgLSB3aWR0aCwgY29yZHMubGVmdCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNvbmZpZz8ucG9zaXRpb24gPT0gXCJ0b3BcIiB8fCBjb25maWc/LnBvc2l0aW9uID09IFwiYm90dG9tXCIpIHtcbiAgICAgICAgc3dpdGNoIChjb25maWc/LmFsaWdubWVudCkge1xuICAgICAgICAgICAgY2FzZSBcImVuZFwiOiB7XG4gICAgICAgICAgICAgICAgLy8gdmVydGljYWxseSBiaW5kIHRvIHJpZ2h0XG4gICAgICAgICAgICAgICAgY29yZHMubGVmdCA9IHNyYy54ICsgc3JjLndpZHRoIC0gd2lkdGg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwiYWZ0ZXJlbmRcIjoge1xuICAgICAgICAgICAgICAgIC8vIHZlcnRpY2FsbHkgYmluZCBwYXN0IHJpZ2h0XG4gICAgICAgICAgICAgICAgY29yZHMubGVmdCA9IHNyYy54ICsgc3JjLndpZHRoO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcImJlZm9yZXN0YXJ0XCI6IHtcbiAgICAgICAgICAgICAgICAvLyB2ZXJ0aWNhbGx5IGJpbmQgYmVmb3JlIGxlZnRcbiAgICAgICAgICAgICAgICBjb3Jkcy5sZWZ0ID0gc3JjLnggLSB3aWR0aDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJzdGFydFwiOiB7XG4gICAgICAgICAgICAgICAgLy8gdmVydGljYWxseSBiaW5kIHRvIGxlZnRcbiAgICAgICAgICAgICAgICBjb3Jkcy5sZWZ0ID0gc3JjLng7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwiY2VudGVyXCI6XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgLy8gdmVydGljYWxseSBjZW50ZXJcbiAgICAgICAgICAgICAgICBjb3Jkcy5sZWZ0ID0gKHNyYy54ICsgKHNyYy53aWR0aCAvIDIpKSAtICh3aWR0aCAvIDIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwbHkgYm91bmRzIHRvIHByZXZlbnQgdGhlIGRpYWxvZyBmcm9tIGJlaW5nIGN1dC1vZmYgc2NyZWVuXG4gICAgICAgIC8vIExvd2VyIGJvdW5kXG4gICAgICAgIGNvcmRzLmxlZnQgPSBNYXRoLm1heChjb25maWc/LmVkZ2VQYWRkaW5nIHx8IDAsIGNvcmRzLmxlZnQpO1xuICAgICAgICAvLyBVcHBlciBib3VuZFxuICAgICAgICBjb3Jkcy5sZWZ0ID0gTWF0aC5taW4od2ludyAtIHdpZHRoLCBjb3Jkcy5sZWZ0KTtcblxuXG4gICAgICAgIGlmIChjb25maWc/LnBvc2l0aW9uID09IFwidG9wXCIpIHtcbiAgICAgICAgICAgIGNvcmRzLnRvcCA9IHNyYy55IC0gKGhlaWdodCArIChjb25maWc/LmFycm93U2l6ZSB8fCAwKSArIChjb25maWc/LmFycm93UGFkZGluZyB8fCAwKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZz8ucG9zaXRpb24gPT0gXCJib3R0b21cIikge1xuICAgICAgICAgICAgY29yZHMudG9wID0gc3JjLnkgKyAoc3JjLmhlaWdodCArIChjb25maWc/LmFycm93U2l6ZSB8fCAwKSArIChjb25maWc/LmFycm93UGFkZGluZyB8fCAwKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb3dlciBib3VuZFxuICAgICAgICBjb3Jkcy50b3AgPSBNYXRoLm1heChjb25maWc/LmVkZ2VQYWRkaW5nIHx8IDAsIGNvcmRzLnRvcCk7XG4gICAgICAgIC8vIFVwcGVyIGJvdW5kXG4gICAgICAgIGNvcmRzLnRvcCA9IE1hdGgubWluKHdpbmggLSBoZWlnaHQsIGNvcmRzLnRvcCk7XG4gICAgfVxuXG4gICAgLy8gQXNzaWduIHVuaXRcbiAgICBjb3Jkcy50b3AgPSBjb3Jkcy50b3AgKyAncHgnO1xuICAgIGNvcmRzLmxlZnQgPSBjb3Jkcy5sZWZ0ICsgJ3B4JztcblxuICAgIHJldHVybiBjb3Jkcztcbn1cbiJdfQ==