ngx-extended-pdf-viewer
Version:
Embedding PDF files in your Angular application. Highly configurable viewer including the toolbar, sidebar, and all the features you're used to.
54 lines • 9.3 kB
JavaScript
import { pdfDefaultOptions } from '../options/pdf-default-options';
export class PositioningService {
positionPopupBelowItsButton(buttonId, popupId) {
if (!pdfDefaultOptions.positionPopupDialogsWithJavaScript) {
return;
}
setTimeout(() => {
const visibleButton = Array.from(document.querySelectorAll(`#${buttonId}`)).find((el) => el.offsetParent !== null);
if (visibleButton) {
const popup = document.querySelector(`#${popupId}`);
if (popup instanceof HTMLElement) {
const popupContainer = popup.offsetParent;
if (popupContainer) {
const buttonRect = visibleButton.getBoundingClientRect();
const containerRect = popupContainer.getBoundingClientRect();
const width = buttonRect.width;
const doorhangerOffset = 17;
// Detect text direction
const isRTL = document.documentElement.getAttribute('dir') === 'rtl';
let doorHangerRight = isRTL;
if (popup.classList.contains('doorHangerRight')) {
doorHangerRight = !isRTL;
}
// Apply styles
popup.style.position = 'absolute';
popup.style.display = 'block';
// support the attribute 'mobileFriendlyZoom' correctly
popup.style.transformOrigin = doorHangerRight ? 'top right' : 'top left';
if (!doorHangerRight) {
// For RTL languages, use 'left' property
// also use the 'left' property for the findbar in LTR languages
const left = buttonRect.left - containerRect.left + width / 2 - doorhangerOffset;
popup.style.left = `${left}px`;
popup.style.right = '';
}
else {
// For LTR, use 'right' property
const right = containerRect.right - buttonRect.right + width / 2 - doorhangerOffset;
popup.style.right = `${right}px`; // 109
popup.style.left = '';
}
const toolbarContainer = document.querySelector('#toolbarContainer');
if (toolbarContainer instanceof HTMLElement) {
const toolbarContainerRect = toolbarContainer.getBoundingClientRect();
const top = toolbarContainerRect.bottom - containerRect.top + 4;
popup.style.top = `${top}px`; // 92
}
}
}
}
});
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zaXRpb25pbmcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1leHRlbmRlZC1wZGYtdmlld2VyL3NyYy9saWIvZHluYW1pYy1jc3MvcG9zaXRpb25pbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVuRSxNQUFNLE9BQU8sa0JBQWtCO0lBQ3RCLDJCQUEyQixDQUFDLFFBQWdCLEVBQUUsT0FBZTtRQUNsRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsa0NBQWtDLEVBQUU7WUFDekQsT0FBTztTQUNSO1FBQ0QsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLElBQUksUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQWUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsQ0FBQztZQUNoSSxJQUFJLGFBQWEsRUFBRTtnQkFDakIsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ3BELElBQUksS0FBSyxZQUFZLFdBQVcsRUFBRTtvQkFDaEMsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLFlBQTJCLENBQUM7b0JBQ3pELElBQUksY0FBYyxFQUFFO3dCQUNsQixNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQzt3QkFDekQsTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUFDLHFCQUFxQixFQUFFLENBQUM7d0JBRTdELE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7d0JBQy9CLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO3dCQUU1Qix3QkFBd0I7d0JBQ3hCLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQzt3QkFDckUsSUFBSSxlQUFlLEdBQUcsS0FBSyxDQUFDO3dCQUM1QixJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEVBQUU7NEJBQy9DLGVBQWUsR0FBRyxDQUFDLEtBQUssQ0FBQzt5QkFDMUI7d0JBRUQsZUFBZTt3QkFDZixLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7d0JBQ2xDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQzt3QkFFOUIsdURBQXVEO3dCQUN2RCxLQUFLLENBQUMsS0FBSyxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO3dCQUV6RSxJQUFJLENBQUMsZUFBZSxFQUFFOzRCQUNwQix5Q0FBeUM7NEJBQ3pDLGdFQUFnRTs0QkFDaEUsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUMsSUFBSSxHQUFHLEtBQUssR0FBRyxDQUFDLEdBQUcsZ0JBQWdCLENBQUM7NEJBRWpGLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUM7NEJBQy9CLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQzt5QkFDeEI7NkJBQU07NEJBQ0wsZ0NBQWdDOzRCQUNoQyxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLEdBQUcsS0FBSyxHQUFHLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQzs0QkFDcEYsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxLQUFLLElBQUksQ0FBQyxDQUFDLE1BQU07NEJBQ3hDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQzt5QkFDdkI7d0JBRUQsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLENBQUM7d0JBQ3JFLElBQUksZ0JBQWdCLFlBQVksV0FBVyxFQUFFOzRCQUMzQyxNQUFNLG9CQUFvQixHQUFHLGdCQUFnQixDQUFDLHFCQUFxQixFQUFFLENBQUM7NEJBQ3RFLE1BQU0sR0FBRyxHQUFHLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQzs0QkFDaEUsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLEtBQUs7eUJBQ3BDO3FCQUNGO2lCQUNGO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHBkZkRlZmF1bHRPcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy9wZGYtZGVmYXVsdC1vcHRpb25zJztcblxuZXhwb3J0IGNsYXNzIFBvc2l0aW9uaW5nU2VydmljZSB7XG4gIHB1YmxpYyBwb3NpdGlvblBvcHVwQmVsb3dJdHNCdXR0b24oYnV0dG9uSWQ6IHN0cmluZywgcG9wdXBJZDogc3RyaW5nKSB7XG4gICAgaWYgKCFwZGZEZWZhdWx0T3B0aW9ucy5wb3NpdGlvblBvcHVwRGlhbG9nc1dpdGhKYXZhU2NyaXB0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgdmlzaWJsZUJ1dHRvbiA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgIyR7YnV0dG9uSWR9YCkpLmZpbmQoKGVsOiBIVE1MRWxlbWVudCkgPT4gZWwub2Zmc2V0UGFyZW50ICE9PSBudWxsKTtcbiAgICAgIGlmICh2aXNpYmxlQnV0dG9uKSB7XG4gICAgICAgIGNvbnN0IHBvcHVwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7cG9wdXBJZH1gKTtcbiAgICAgICAgaWYgKHBvcHVwIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgICBjb25zdCBwb3B1cENvbnRhaW5lciA9IHBvcHVwLm9mZnNldFBhcmVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICBpZiAocG9wdXBDb250YWluZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvblJlY3QgPSB2aXNpYmxlQnV0dG9uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IHBvcHVwQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IGJ1dHRvblJlY3Qud2lkdGg7XG4gICAgICAgICAgICBjb25zdCBkb29yaGFuZ2VyT2Zmc2V0ID0gMTc7XG5cbiAgICAgICAgICAgIC8vIERldGVjdCB0ZXh0IGRpcmVjdGlvblxuICAgICAgICAgICAgY29uc3QgaXNSVEwgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkaXInKSA9PT0gJ3J0bCc7XG4gICAgICAgICAgICBsZXQgZG9vckhhbmdlclJpZ2h0ID0gaXNSVEw7XG4gICAgICAgICAgICBpZiAocG9wdXAuY2xhc3NMaXN0LmNvbnRhaW5zKCdkb29ySGFuZ2VyUmlnaHQnKSkge1xuICAgICAgICAgICAgICBkb29ySGFuZ2VyUmlnaHQgPSAhaXNSVEw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFwcGx5IHN0eWxlc1xuICAgICAgICAgICAgcG9wdXAuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICAgICAgcG9wdXAuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICAgICAgICAgIC8vIHN1cHBvcnQgdGhlIGF0dHJpYnV0ZSAnbW9iaWxlRnJpZW5kbHlab29tJyBjb3JyZWN0bHlcbiAgICAgICAgICAgIHBvcHVwLnN0eWxlLnRyYW5zZm9ybU9yaWdpbiA9IGRvb3JIYW5nZXJSaWdodCA/ICd0b3AgcmlnaHQnIDogJ3RvcCBsZWZ0JztcblxuICAgICAgICAgICAgaWYgKCFkb29ySGFuZ2VyUmlnaHQpIHtcbiAgICAgICAgICAgICAgLy8gRm9yIFJUTCBsYW5ndWFnZXMsIHVzZSAnbGVmdCcgcHJvcGVydHlcbiAgICAgICAgICAgICAgLy8gYWxzbyB1c2UgdGhlICdsZWZ0JyBwcm9wZXJ0eSBmb3IgdGhlIGZpbmRiYXIgaW4gTFRSIGxhbmd1YWdlc1xuICAgICAgICAgICAgICBjb25zdCBsZWZ0ID0gYnV0dG9uUmVjdC5sZWZ0IC0gY29udGFpbmVyUmVjdC5sZWZ0ICsgd2lkdGggLyAyIC0gZG9vcmhhbmdlck9mZnNldDtcblxuICAgICAgICAgICAgICBwb3B1cC5zdHlsZS5sZWZ0ID0gYCR7bGVmdH1weGA7XG4gICAgICAgICAgICAgIHBvcHVwLnN0eWxlLnJpZ2h0ID0gJyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBGb3IgTFRSLCB1c2UgJ3JpZ2h0JyBwcm9wZXJ0eVxuICAgICAgICAgICAgICBjb25zdCByaWdodCA9IGNvbnRhaW5lclJlY3QucmlnaHQgLSBidXR0b25SZWN0LnJpZ2h0ICsgd2lkdGggLyAyIC0gZG9vcmhhbmdlck9mZnNldDtcbiAgICAgICAgICAgICAgcG9wdXAuc3R5bGUucmlnaHQgPSBgJHtyaWdodH1weGA7IC8vIDEwOVxuICAgICAgICAgICAgICBwb3B1cC5zdHlsZS5sZWZ0ID0gJyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHRvb2xiYXJDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdG9vbGJhckNvbnRhaW5lcicpO1xuICAgICAgICAgICAgaWYgKHRvb2xiYXJDb250YWluZXIgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAgICAgICBjb25zdCB0b29sYmFyQ29udGFpbmVyUmVjdCA9IHRvb2xiYXJDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgIGNvbnN0IHRvcCA9IHRvb2xiYXJDb250YWluZXJSZWN0LmJvdHRvbSAtIGNvbnRhaW5lclJlY3QudG9wICsgNDtcbiAgICAgICAgICAgICAgcG9wdXAuc3R5bGUudG9wID0gYCR7dG9wfXB4YDsgLy8gOTJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIl19