@loxia/imx-viewer 7.1.2 → 7.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -1
- package/bundles/loxia-imx-viewer.umd.js +506 -96
- package/bundles/loxia-imx-viewer.umd.js.map +1 -1
- package/bundles/loxia-imx-viewer.umd.min.js +15 -1
- package/bundles/loxia-imx-viewer.umd.min.js.map +1 -1
- package/components/imx-viewer.component.d.ts +25 -11
- package/css/dgn.css +143 -0
- package/esm2015/components/imx-viewer.component.js +116 -78
- package/esm2015/imx-viewer.module.js +2 -2
- package/esm2015/loxia-imx-viewer.js +4 -2
- package/esm2015/model/point.js +7 -0
- package/esm2015/model/popover-info.js +7 -0
- package/esm2015/model/selectie-event.js +7 -0
- package/esm2015/model/selectie-info.js +7 -0
- package/esm2015/model/svg-info.js +7 -0
- package/esm2015/public_api.js +6 -6
- package/esm2015/services/clickarea.service.js +46 -0
- package/esm2015/services/puic-helper.service.js +15 -0
- package/esm2015/utils/classes-util.js +35 -0
- package/esm2015/utils/document-token.js +4 -0
- package/esm2015/utils/focus-util.js +63 -0
- package/esm2015/utils/svg-rect-util.js +48 -0
- package/fesm2015/loxia-imx-viewer.js +169 -78
- package/fesm2015/loxia-imx-viewer.js.map +1 -1
- package/loxia-imx-viewer.d.ts +3 -1
- package/loxia-imx-viewer.metadata.json +1 -1
- package/{components → model}/point.d.ts +0 -0
- package/{components → model}/popover-info.d.ts +0 -0
- package/{components → model}/selectie-event.d.ts +0 -0
- package/{components → model}/selectie-info.d.ts +0 -0
- package/{components → model}/svg-info.d.ts +0 -0
- package/package.json +1 -1
- package/public_api.d.ts +5 -5
- package/services/clickarea.service.d.ts +12 -0
- package/services/puic-helper.service.d.ts +5 -0
- package/{components → utils}/classes-util.d.ts +0 -0
- package/{components → utils}/document-token.d.ts +0 -0
- package/utils/focus-util.d.ts +7 -0
- package/{components → utils}/svg-rect-util.d.ts +0 -0
- package/components/focus-util.d.ts +0 -5
- package/esm2015/components/classes-util.js +0 -35
- package/esm2015/components/document-token.js +0 -4
- package/esm2015/components/focus-util.js +0 -63
- package/esm2015/components/point.js +0 -7
- package/esm2015/components/popover-info.js +0 -7
- package/esm2015/components/selectie-event.js +0 -7
- package/esm2015/components/selectie-info.js +0 -7
- package/esm2015/components/svg-info.js +0 -7
- package/esm2015/components/svg-rect-util.js +0 -48
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class PuicHelperService {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.setRootSvg = (svgParent) => this.rootSvg = svgParent;
|
|
6
|
+
this.getAllElementsForPuic = (puic) => this.rootSvg.querySelectorAll(`.p${puic}, #p${puic}`);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
PuicHelperService.ɵprov = i0.ɵɵdefineInjectable({ factory: function PuicHelperService_Factory() { return new PuicHelperService(); }, token: PuicHelperService, providedIn: "root" });
|
|
10
|
+
PuicHelperService.decorators = [
|
|
11
|
+
{ type: Injectable, args: [{
|
|
12
|
+
providedIn: 'root'
|
|
13
|
+
},] }
|
|
14
|
+
];
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVpYy1oZWxwZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIvbG9jYWwvaG9tZS9sb3hpYS9qZW5raW5zX2JzXzEuMi93b3Jrc3BhY2Uvdmlld2VyX3N2Zy1pbXgtdmlld2VyLWNpX2RldmVsb3Avc3JjLyIsInNvdXJjZXMiOlsic2VydmljZXMvcHVpYy1oZWxwZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUszQyxNQUFNLE9BQU8saUJBQWlCO0lBSDlCO1FBTVcsZUFBVSxHQUFHLENBQUMsU0FBd0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7UUFDcEUsMEJBQXFCLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsS0FBTSxJQUFLLE9BQVEsSUFBSyxFQUFFLENBQTRCLENBQUM7S0FDekk7Ozs7WUFSQSxVQUFVLFNBQUM7Z0JBQ1IsVUFBVSxFQUFFLE1BQU07YUFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUHVpY0hlbHBlclNlcnZpY2Uge1xuICAgIHByaXZhdGUgcm9vdFN2ZzogYW55O1xuXG4gICAgcHVibGljIHNldFJvb3RTdmcgPSAoc3ZnUGFyZW50OiBTVkdTVkdFbGVtZW50KSA9PiB0aGlzLnJvb3RTdmcgPSBzdmdQYXJlbnQ7XG4gICAgcHVibGljIGdldEFsbEVsZW1lbnRzRm9yUHVpYyA9IChwdWljOiBzdHJpbmcpID0+IHRoaXMucm9vdFN2Zy5xdWVyeVNlbGVjdG9yQWxsKGAucCR7IHB1aWMgfSwgI3AkeyBwdWljIH1gKSBhcyBOb2RlTGlzdE9mPEhUTUxFbGVtZW50Pjtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export class ClassesUtil {
|
|
2
|
+
static addClass(elem, cls) {
|
|
3
|
+
if ('' === cls) {
|
|
4
|
+
return;
|
|
5
|
+
}
|
|
6
|
+
const classAttr = elem.getAttribute('class');
|
|
7
|
+
const classes = classAttr ? classAttr.split(' ') : [];
|
|
8
|
+
for (let j = 0; j < classes.length; j++) {
|
|
9
|
+
if (classes[j] === cls) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
elem.setAttribute('class', classAttr ? classAttr + ' ' + cls : cls);
|
|
14
|
+
}
|
|
15
|
+
static removeClassesStartingWith(elem, cls) {
|
|
16
|
+
const classAttr = elem.getAttribute('class');
|
|
17
|
+
if (!classAttr) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const classes = classAttr.split(' ');
|
|
21
|
+
let j = classes.length;
|
|
22
|
+
while (j--) {
|
|
23
|
+
if (classes[j].indexOf(cls) === 0) {
|
|
24
|
+
classes.splice(j, 1);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
if (classes.length === 0) {
|
|
28
|
+
elem.removeAttribute('class');
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
elem.setAttribute('class', classes.join(' '));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy11dGlsLmpzIiwic291cmNlUm9vdCI6Ii9sb2NhbC9ob21lL2xveGlhL2plbmtpbnNfYnNfMS4yL3dvcmtzcGFjZS92aWV3ZXJfc3ZnLWlteC12aWV3ZXItY2lfZGV2ZWxvcC9zcmMvIiwic291cmNlcyI6WyJ1dGlscy9jbGFzc2VzLXV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLFdBQVc7SUFDcEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFhLEVBQUUsR0FBVztRQUN0QyxJQUFJLEVBQUUsS0FBSyxHQUFHLEVBQUU7WUFDWixPQUFPO1NBQ1Y7UUFDRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3RELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3JDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtnQkFDcEIsT0FBTzthQUNWO1NBQ0o7UUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsTUFBTSxDQUFDLHlCQUF5QixDQUFDLElBQWEsRUFBRSxHQUFXO1FBQ3ZELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNaLE9BQU87U0FDVjtRQUNELE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUN2QixPQUFPLENBQUMsRUFBRSxFQUFFO1lBQ1IsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDL0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDeEI7U0FDSjtRQUVELElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDdEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNqQzthQUNJO1lBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ2pEO0lBQ0wsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIENsYXNzZXNVdGlsIHtcbiAgICBzdGF0aWMgYWRkQ2xhc3MoZWxlbTogRWxlbWVudCwgY2xzOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCcnID09PSBjbHMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbGFzc0F0dHIgPSBlbGVtLmdldEF0dHJpYnV0ZSgnY2xhc3MnKTtcbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IGNsYXNzQXR0ciA/IGNsYXNzQXR0ci5zcGxpdCgnICcpIDogW107XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY2xhc3Nlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKGNsYXNzZXNbal0gPT09IGNscykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbGVtLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCBjbGFzc0F0dHIgPyBjbGFzc0F0dHIgKyAnICcgKyBjbHMgOiBjbHMpO1xuICAgIH1cblxuICAgIHN0YXRpYyByZW1vdmVDbGFzc2VzU3RhcnRpbmdXaXRoKGVsZW06IEVsZW1lbnQsIGNsczogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGNsYXNzQXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKCdjbGFzcycpO1xuICAgICAgICBpZiAoIWNsYXNzQXR0cikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNsYXNzZXMgPSBjbGFzc0F0dHIuc3BsaXQoJyAnKTtcbiAgICAgICAgbGV0IGogPSBjbGFzc2VzLmxlbmd0aDtcbiAgICAgICAgd2hpbGUgKGotLSkge1xuICAgICAgICAgICAgaWYgKGNsYXNzZXNbal0uaW5kZXhPZihjbHMpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5zcGxpY2UoaiwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2xhc3Nlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGVsZW0ucmVtb3ZlQXR0cmlidXRlKCdjbGFzcycpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgY2xhc3Nlcy5qb2luKCcgJykpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
export const DocumentToken = new InjectionToken('Document');
|
|
3
|
+
export function documentProvider() { return document; }
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtdG9rZW4uanMiLCJzb3VyY2VSb290IjoiL2xvY2FsL2hvbWUvbG94aWEvamVua2luc19ic18xLjIvd29ya3NwYWNlL3ZpZXdlcl9zdmctaW14LXZpZXdlci1jaV9kZXZlbG9wL3NyYy8iLCJzb3VyY2VzIjpbInV0aWxzL2RvY3VtZW50LXRva2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0MsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLElBQUksY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzVELE1BQU0sVUFBVSxnQkFBZ0IsS0FBSyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgY29uc3QgRG9jdW1lbnRUb2tlbiA9IG5ldyBJbmplY3Rpb25Ub2tlbignRG9jdW1lbnQnKTtcbmV4cG9ydCBmdW5jdGlvbiBkb2N1bWVudFByb3ZpZGVyKCkgeyByZXR1cm4gZG9jdW1lbnQ7IH1cbiJdfQ==
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { SvgRectUtil } from './svg-rect-util';
|
|
2
|
+
export class FocusUtil {
|
|
3
|
+
static focusOnIds(focusIds, svgPanZoomRef, puicHelper) {
|
|
4
|
+
if (focusIds && focusIds.length > 0) {
|
|
5
|
+
// calculate the union rectangle of elements with ids
|
|
6
|
+
const svgContainer = document.getElementById('svgContainer');
|
|
7
|
+
const rootSvgDoc = svgContainer.firstChild;
|
|
8
|
+
let resultRect;
|
|
9
|
+
if (rootSvgDoc && rootSvgDoc.nodeName === 'svg') {
|
|
10
|
+
focusIds.forEach(puic => {
|
|
11
|
+
const elems = puicHelper.getAllElementsForPuic(puic);
|
|
12
|
+
for (let i = 0; i < elems.length; i++) {
|
|
13
|
+
const elementRect = FocusUtil.getElementRectangleWithNestedSvgOffset(elems[i]);
|
|
14
|
+
resultRect = SvgRectUtil.rectUnion(resultRect, elementRect);
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
FocusUtil.focusOnRect(resultRect, svgContainer.getBoundingClientRect(), rootSvgDoc, svgPanZoomRef);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
static focusOnRect(rect, elementRect, rootSvgDoc, svgPanZoomRef) {
|
|
22
|
+
if (rect) {
|
|
23
|
+
// make sure we are in the svgpanzoom transformed area
|
|
24
|
+
const matrix = rootSvgDoc.getElementsByClassName('svg-pan-zoom_viewport')[0].getScreenCTM();
|
|
25
|
+
// get from svg coordinate system to webpage coordinate system
|
|
26
|
+
const location = rootSvgDoc.createSVGPoint();
|
|
27
|
+
location.x = rect.x + (rect.width / 2);
|
|
28
|
+
location.y = rect.y + (rect.height / 2);
|
|
29
|
+
const transformedLocation = location.matrixTransform(matrix);
|
|
30
|
+
// transform the rectangle dimension (we have to use a SVGPoint since there is no SVGDimension)
|
|
31
|
+
const size = rootSvgDoc.createSVGPoint();
|
|
32
|
+
size.x = rect.width;
|
|
33
|
+
size.y = rect.height;
|
|
34
|
+
const transformedSize = size.matrixTransform(matrix.inverse());
|
|
35
|
+
// tel the svgPanZoom to zoom on the rectangle in relation to the total view size
|
|
36
|
+
const zoomFactor = Math.min(5, elementRect.height / Math.abs(transformedSize.y));
|
|
37
|
+
svgPanZoomRef.zoomAtPoint(zoomFactor, { x: transformedLocation.x - elementRect.left, y: transformedLocation.y - elementRect.top });
|
|
38
|
+
// tel the svgPanZoom to pan to the middel of the rectangle
|
|
39
|
+
svgPanZoomRef.panBy({
|
|
40
|
+
x: (elementRect.width / 2) - transformedLocation.x,
|
|
41
|
+
y: ((elementRect.height + elementRect.top) / 2) - transformedLocation.y
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
static getElementRectangleWithNestedSvgOffset(elem) {
|
|
46
|
+
const svgElem = elem;
|
|
47
|
+
const rect = svgElem.getBBox();
|
|
48
|
+
while (elem.parentElement.nodeName !== 'svg') {
|
|
49
|
+
elem = elem.parentElement;
|
|
50
|
+
}
|
|
51
|
+
elem = elem.parentElement;
|
|
52
|
+
rect.x = rect.x + parseInt(elem.getAttribute('x'), 10);
|
|
53
|
+
rect.y = rect.y + parseInt(elem.getAttribute('y'), 10);
|
|
54
|
+
const viewBox = elem.getAttribute('viewBox');
|
|
55
|
+
if (viewBox) {
|
|
56
|
+
const viewBoxCoordinates = viewBox.split(' ');
|
|
57
|
+
rect.x = rect.x - parseInt(viewBoxCoordinates[0], 10);
|
|
58
|
+
rect.y = rect.y - parseInt(viewBoxCoordinates[1], 10);
|
|
59
|
+
}
|
|
60
|
+
return rect;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9jdXMtdXRpbC5qcyIsInNvdXJjZVJvb3QiOiIvbG9jYWwvaG9tZS9sb3hpYS9qZW5raW5zX2JzXzEuMi93b3Jrc3BhY2Uvdmlld2VyX3N2Zy1pbXgtdmlld2VyLWNpX2RldmVsb3Avc3JjLyIsInNvdXJjZXMiOlsidXRpbHMvZm9jdXMtdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFOUMsTUFBTSxPQUFPLFNBQVM7SUFFWCxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQWtCLEVBQUUsYUFBa0MsRUFBRSxVQUE2QjtRQUMxRyxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUVqQyxxREFBcUQ7WUFDckQsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUM3RCxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsVUFBMkIsQ0FBQztZQUM1RCxJQUFJLFVBQW1CLENBQUM7WUFDeEIsSUFBSSxVQUFVLElBQUksVUFBVSxDQUFDLFFBQVEsS0FBSyxLQUFLLEVBQUU7Z0JBQzdDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ3BCLE1BQU0sS0FBSyxHQUE0QixVQUFVLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzlFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO3dCQUNuQyxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsc0NBQXNDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQy9FLFVBQVUsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztxQkFDL0Q7Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7YUFDTjtZQUNELFNB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QUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3QyxJQUFJLE9BQU8sRUFBRTtZQUNULE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDekQ7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU3ZnUGFuWm9vbSBmcm9tICdzdmctcGFuLXpvb20nO1xuaW1wb3J0IHsgUHVpY0hlbHBlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wdWljLWhlbHBlci5zZXJ2aWNlJztcbmltcG9ydCB7IFN2Z1JlY3RVdGlsIH0gZnJvbSAnLi9zdmctcmVjdC11dGlsJztcblxuZXhwb3J0IGNsYXNzIEZvY3VzVXRpbCB7XG5cbiAgICBwdWJsaWMgc3RhdGljIGZvY3VzT25JZHMoZm9jdXNJZHM6IHN0cmluZ1tdLCBzdmdQYW5ab29tUmVmOiBTdmdQYW5ab29tLkluc3RhbmNlLCBwdWljSGVscGVyOiBQdWljSGVscGVyU2VydmljZSkge1xuICAgICAgICBpZiAoZm9jdXNJZHMgJiYgZm9jdXNJZHMubGVuZ3RoID4gMCkge1xuXG4gICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIHVuaW9uIHJlY3RhbmdsZSBvZiBlbGVtZW50cyB3aXRoIGlkc1xuICAgICAgICAgICAgY29uc3Qgc3ZnQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Z0NvbnRhaW5lcicpO1xuICAgICAgICAgICAgY29uc3Qgcm9vdFN2Z0RvYyA9IHN2Z0NvbnRhaW5lci5maXJzdENoaWxkIGFzIFNWR1NWR0VsZW1lbnQ7XG4gICAgICAgICAgICBsZXQgcmVzdWx0UmVjdDogU1ZHUmVjdDtcbiAgICAgICAgICAgIGlmIChyb290U3ZnRG9jICYmIHJvb3RTdmdEb2Mubm9kZU5hbWUgPT09ICdzdmcnKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNJZHMuZm9yRWFjaChwdWljID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbXM6IE5vZGVMaXN0T2Y8SFRNTEVsZW1lbnQ+ID0gcHVpY0hlbHBlci5nZXRBbGxFbGVtZW50c0ZvclB1aWMocHVpYyk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRSZWN0ID0gRm9jdXNVdGlsLmdldEVsZW1lbnRSZWN0YW5nbGVXaXRoTmVzdGVkU3ZnT2Zmc2V0KGVsZW1zW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFJlY3QgPSBTdmdSZWN0VXRpbC5yZWN0VW5pb24ocmVzdWx0UmVjdCwgZWxlbWVudFJlY3QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBGb2N1c1V0aWwuZm9jdXNPblJlY3QocmVzdWx0UmVjdCwgc3ZnQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCByb290U3ZnRG9jLCBzdmdQYW5ab29tUmVmKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmb2N1c09uUmVjdChyZWN0OiBTVkdSZWN0LCBlbGVtZW50UmVjdDogQ2xpZW50UmVjdCwgcm9vdFN2Z0RvYzogU1ZHU1ZHRWxlbWVudCwgc3ZnUGFuWm9vbVJlZjogYW55KSB7XG4gICAgICAgIGlmIChyZWN0KSB7XG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UgYXJlIGluIHRoZSBzdmdwYW56b29tIHRyYW5zZm9ybWVkIGFyZWFcbiAgICAgICAgICAgIGNvbnN0IG1hdHJpeCA9IChyb290U3ZnRG9jLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3N2Zy1wYW4tem9vbV92aWV3cG9ydCcpWzBdIGFzIFNWR0dFbGVtZW50KS5nZXRTY3JlZW5DVE0oKTtcblxuICAgICAgICAgICAgLy8gZ2V0IGZyb20gc3ZnIGNvb3JkaW5hdGUgc3lzdGVtIHRvIHdlYnBhZ2UgY29vcmRpbmF0ZSBzeXN0ZW1cbiAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gcm9vdFN2Z0RvYy5jcmVhdGVTVkdQb2ludCgpO1xuICAgICAgICAgICAgbG9jYXRpb24ueCA9IHJlY3QueCArIChyZWN0LndpZHRoIC8gMik7XG4gICAgICAgICAgICBsb2NhdGlvbi55ID0gcmVjdC55ICsgKHJlY3QuaGVpZ2h0IC8gMik7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZExvY2F0aW9uID0gbG9jYXRpb24ubWF0cml4VHJhbnNmb3JtKG1hdHJpeCk7XG5cbiAgICAgICAgICAgIC8vIHRyYW5zZm9ybSB0aGUgcmVjdGFuZ2xlIGRpbWVuc2lvbiAod2UgaGF2ZSB0byB1c2UgYSBTVkdQb2ludCBzaW5jZSB0aGVyZSBpcyBubyBTVkdEaW1lbnNpb24pXG4gICAgICAgICAgICBjb25zdCBzaXplID0gcm9vdFN2Z0RvYy5jcmVhdGVTVkdQb2ludCgpO1xuICAgICAgICAgICAgc2l6ZS54ID0gcmVjdC53aWR0aDtcbiAgICAgICAgICAgIHNpemUueSA9IHJlY3QuaGVpZ2h0O1xuICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRTaXplID0gc2l6ZS5tYXRyaXhUcmFuc2Zvcm0obWF0cml4LmludmVyc2UoKSk7XG5cbiAgICAgICAgICAgIC8vIHRlbCB0aGUgc3ZnUGFuWm9vbSB0byB6b29tIG9uIHRoZSByZWN0YW5nbGUgaW4gcmVsYXRpb24gdG8gdGhlIHRvdGFsIHZpZXcgc2l6ZVxuICAgICAgICAgICAgY29uc3Qgem9vbUZhY3RvciA9IE1hdGgubWluKDUsIGVsZW1lbnRSZWN0LmhlaWdodCAvIE1hdGguYWJzKHRyYW5zZm9ybWVkU2l6ZS55KSk7XG4gICAgICAgICAgICBzdmdQYW5ab29tUmVmLnpvb21BdFBvaW50KHpvb21GYWN0b3IsXG4gICAgICAgICAgICAgICAgeyB4OiB0cmFuc2Zvcm1lZExvY2F0aW9uLnggLSBlbGVtZW50UmVjdC5sZWZ0LCB5OiB0cmFuc2Zvcm1lZExvY2F0aW9uLnkgLSBlbGVtZW50UmVjdC50b3AgfSk7XG4gICAgICAgICAgICAvLyB0ZWwgdGhlIHN2Z1Bhblpvb20gdG8gcGFuIHRvIHRoZSBtaWRkZWwgb2YgdGhlIHJlY3RhbmdsZVxuICAgICAgICAgICAgc3ZnUGFuWm9vbVJlZi5wYW5CeSh7XG4gICAgICAgICAgICAgICAgeDogKGVsZW1lbnRSZWN0LndpZHRoIC8gMikgLSB0cmFuc2Zvcm1lZExvY2F0aW9uLngsXG4gICAgICAgICAgICAgICAgeTogKChlbGVtZW50UmVjdC5oZWlnaHQgKyBlbGVtZW50UmVjdC50b3ApIC8gMikgLSB0cmFuc2Zvcm1lZExvY2F0aW9uLnlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0RWxlbWVudFJlY3RhbmdsZVdpdGhOZXN0ZWRTdmdPZmZzZXQoZWxlbTogRWxlbWVudCk6IFNWR1JlY3Qge1xuICAgICAgICBjb25zdCBzdmdFbGVtID0gKDxTVkdHcmFwaGljc0VsZW1lbnQ+IGVsZW0pO1xuICAgICAgICBjb25zdCByZWN0ID0gc3ZnRWxlbS5nZXRCQm94KCk7XG5cbiAgICAgICAgd2hpbGUgKGVsZW0ucGFyZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gJ3N2ZycpIHtcbiAgICAgICAgICAgIGVsZW0gPSBlbGVtLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbSA9IGVsZW0ucGFyZW50RWxlbWVudDtcbiAgICAgICAgcmVjdC54ID0gcmVjdC54ICsgcGFyc2VJbnQoZWxlbS5nZXRBdHRyaWJ1dGUoJ3gnKSwgMTApO1xuICAgICAgICByZWN0LnkgPSByZWN0LnkgKyBwYXJzZUludChlbGVtLmdldEF0dHJpYnV0ZSgneScpLCAxMCk7XG4gICAgICAgIGNvbnN0IHZpZXdCb3ggPSBlbGVtLmdldEF0dHJpYnV0ZSgndmlld0JveCcpO1xuICAgICAgICBpZiAodmlld0JveCkge1xuICAgICAgICAgICAgY29uc3Qgdmlld0JveENvb3JkaW5hdGVzID0gdmlld0JveC5zcGxpdCgnICcpO1xuICAgICAgICAgICAgcmVjdC54ID0gcmVjdC54IC0gcGFyc2VJbnQodmlld0JveENvb3JkaW5hdGVzWzBdLCAxMCk7XG4gICAgICAgICAgICByZWN0LnkgPSByZWN0LnkgLSBwYXJzZUludCh2aWV3Qm94Q29vcmRpbmF0ZXNbMV0sIDEwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVjdDtcbiAgICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export class SvgRectUtil {
|
|
2
|
+
// copied from java.awt.Rectangle
|
|
3
|
+
static rectUnion(r1, r2) {
|
|
4
|
+
if (!r1) {
|
|
5
|
+
return r2;
|
|
6
|
+
}
|
|
7
|
+
let tx2 = r1.width;
|
|
8
|
+
let ty2 = r1.height;
|
|
9
|
+
if ((tx2 | ty2) < 0) { // tslint:disable-line
|
|
10
|
+
// This rectangle has negative dimensions...
|
|
11
|
+
// If r has non-negative dimensions then it is the answer.
|
|
12
|
+
// If r is non-existant (has a negative dimension), then both
|
|
13
|
+
// are non-existant and we can return any non-existant rectangle
|
|
14
|
+
// as an answer. Thus, returning r meets that criterion.
|
|
15
|
+
// Either way, r is our answer.
|
|
16
|
+
return r2;
|
|
17
|
+
}
|
|
18
|
+
let rx2 = r2.width;
|
|
19
|
+
let ry2 = r2.height;
|
|
20
|
+
if ((rx2 | ry2) < 0) { // tslint:disable-line
|
|
21
|
+
return r1;
|
|
22
|
+
}
|
|
23
|
+
let tx1 = r1.x;
|
|
24
|
+
let ty1 = r1.y;
|
|
25
|
+
tx2 += tx1;
|
|
26
|
+
ty2 += ty1;
|
|
27
|
+
const rx1 = r2.x;
|
|
28
|
+
const ry1 = r2.y;
|
|
29
|
+
rx2 += rx1;
|
|
30
|
+
ry2 += ry1;
|
|
31
|
+
if (tx1 > rx1) {
|
|
32
|
+
tx1 = rx1;
|
|
33
|
+
}
|
|
34
|
+
if (ty1 > ry1) {
|
|
35
|
+
ty1 = ry1;
|
|
36
|
+
}
|
|
37
|
+
if (tx2 < rx2) {
|
|
38
|
+
tx2 = rx2;
|
|
39
|
+
}
|
|
40
|
+
if (ty2 < ry2) {
|
|
41
|
+
ty2 = ry2;
|
|
42
|
+
}
|
|
43
|
+
tx2 -= tx1;
|
|
44
|
+
ty2 -= ty1;
|
|
45
|
+
return new DOMRect(tx1, ty1, tx2, ty2);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ZnLXJlY3QtdXRpbC5qcyIsInNvdXJjZVJvb3QiOiIvbG9jYWwvaG9tZS9sb3hpYS9qZW5raW5zX2JzXzEuMi93b3Jrc3BhY2Uvdmlld2VyX3N2Zy1pbXgtdmlld2VyLWNpX2RldmVsb3Avc3JjLyIsInNvdXJjZXMiOlsidXRpbHMvc3ZnLXJlY3QtdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sV0FBVztJQUVwQixpQ0FBaUM7SUFDMUIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFXLEVBQUUsRUFBVztRQUM1QyxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ0wsT0FBTyxFQUFFLENBQUM7U0FDYjtRQUVELElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUM7UUFDbkIsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNwQixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLHNCQUFzQjtZQUN6Qyw0Q0FBNEM7WUFDNUMsMERBQTBEO1lBQzFELDZEQUE2RDtZQUM3RCxnRUFBZ0U7WUFDaEUseURBQXlEO1lBQ3pELCtCQUErQjtZQUMvQixPQUFPLEVBQUUsQ0FBQztTQUNiO1FBQ0QsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQztRQUNuQixJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsc0JBQXNCO1lBQ3pDLE9BQU8sRUFBRSxDQUFDO1NBQ2I7UUFDRCxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2YsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNmLEdBQUcsSUFBSSxHQUFHLENBQUM7UUFDWCxHQUFHLElBQUksR0FBRyxDQUFDO1FBQ1gsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqQixNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLEdBQUcsSUFBSSxHQUFHLENBQUM7UUFDWCxHQUFHLElBQUksR0FBRyxDQUFDO1FBQ1gsSUFBSSxHQUFHLEdBQUcsR0FBRyxFQUFFO1lBQ1gsR0FBRyxHQUFHLEdBQUcsQ0FBQztTQUNiO1FBQ0QsSUFBSSxHQUFHLEdBQUcsR0FBRyxFQUFFO1lBQ1gsR0FBRyxHQUFHLEdBQUcsQ0FBQztTQUNiO1FBQ0QsSUFBSSxHQUFHLEdBQUcsR0FBRyxFQUFFO1lBQ1gsR0FBRyxHQUFHLEdBQUcsQ0FBQztTQUNiO1FBQ0QsSUFBSSxHQUFHLEdBQUcsR0FBRyxFQUFFO1lBQ1gsR0FBRyxHQUFHLEdBQUcsQ0FBQztTQUNiO1FBQ0QsR0FBRyxJQUFJLEdBQUcsQ0FBQztRQUNYLEdBQUcsSUFBSSxHQUFHLENBQUM7UUFFWCxPQUFPLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBTdmdSZWN0VXRpbCB7XG5cbiAgICAvLyBjb3BpZWQgZnJvbSBqYXZhLmF3dC5SZWN0YW5nbGVcbiAgICBwdWJsaWMgc3RhdGljIHJlY3RVbmlvbihyMTogU1ZHUmVjdCwgcjI6IFNWR1JlY3QpOiBTVkdSZWN0IHtcbiAgICAgICAgaWYgKCFyMSkge1xuICAgICAgICAgICAgcmV0dXJuIHIyO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHR4MiA9IHIxLndpZHRoO1xuICAgICAgICBsZXQgdHkyID0gcjEuaGVpZ2h0O1xuICAgICAgICBpZiAoKHR4MiB8IHR5MikgPCAwKSB7IC8vIHRzbGludDpkaXNhYmxlLWxpbmVcbiAgICAgICAgICAgIC8vIFRoaXMgcmVjdGFuZ2xlIGhhcyBuZWdhdGl2ZSBkaW1lbnNpb25zLi4uXG4gICAgICAgICAgICAvLyBJZiByIGhhcyBub24tbmVnYXRpdmUgZGltZW5zaW9ucyB0aGVuIGl0IGlzIHRoZSBhbnN3ZXIuXG4gICAgICAgICAgICAvLyBJZiByIGlzIG5vbi1leGlzdGFudCAoaGFzIGEgbmVnYXRpdmUgZGltZW5zaW9uKSwgdGhlbiBib3RoXG4gICAgICAgICAgICAvLyBhcmUgbm9uLWV4aXN0YW50IGFuZCB3ZSBjYW4gcmV0dXJuIGFueSBub24tZXhpc3RhbnQgcmVjdGFuZ2xlXG4gICAgICAgICAgICAvLyBhcyBhbiBhbnN3ZXIuICBUaHVzLCByZXR1cm5pbmcgciBtZWV0cyB0aGF0IGNyaXRlcmlvbi5cbiAgICAgICAgICAgIC8vIEVpdGhlciB3YXksIHIgaXMgb3VyIGFuc3dlci5cbiAgICAgICAgICAgIHJldHVybiByMjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcngyID0gcjIud2lkdGg7XG4gICAgICAgIGxldCByeTIgPSByMi5oZWlnaHQ7XG4gICAgICAgIGlmICgocngyIHwgcnkyKSA8IDApIHsgLy8gdHNsaW50OmRpc2FibGUtbGluZVxuICAgICAgICAgICAgcmV0dXJuIHIxO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0eDEgPSByMS54O1xuICAgICAgICBsZXQgdHkxID0gcjEueTtcbiAgICAgICAgdHgyICs9IHR4MTtcbiAgICAgICAgdHkyICs9IHR5MTtcbiAgICAgICAgY29uc3QgcngxID0gcjIueDtcbiAgICAgICAgY29uc3QgcnkxID0gcjIueTtcbiAgICAgICAgcngyICs9IHJ4MTtcbiAgICAgICAgcnkyICs9IHJ5MTtcbiAgICAgICAgaWYgKHR4MSA+IHJ4MSkge1xuICAgICAgICAgICAgdHgxID0gcngxO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eTEgPiByeTEpIHtcbiAgICAgICAgICAgIHR5MSA9IHJ5MTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHgyIDwgcngyKSB7XG4gICAgICAgICAgICB0eDIgPSByeDI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5MiA8IHJ5Mikge1xuICAgICAgICAgICAgdHkyID0gcnkyO1xuICAgICAgICB9XG4gICAgICAgIHR4MiAtPSB0eDE7XG4gICAgICAgIHR5MiAtPSB0eTE7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBET01SZWN0KHR4MSwgdHkxLCB0eDIsIHR5Mik7XG4gICAgfVxufVxuIl19
|
|
@@ -1,11 +1,66 @@
|
|
|
1
1
|
import { CommonModule } from '@angular/common';
|
|
2
|
-
import { InjectionToken, EventEmitter, Component, Inject, Input, ViewChild, Output, NgModule } from '@angular/core';
|
|
2
|
+
import { ɵɵdefineInjectable, Injectable, ɵɵinject, InjectionToken, EventEmitter, Component, Inject, Input, ViewChild, Output, NgModule } from '@angular/core';
|
|
3
3
|
import { HttpClient, HttpClientModule } from '@angular/common/http';
|
|
4
4
|
import { parse } from 'dataurl';
|
|
5
|
-
import { of, throwError
|
|
5
|
+
import { combineLatest, of, throwError } from 'rxjs';
|
|
6
6
|
import { take } from 'rxjs/operators';
|
|
7
7
|
import * as SvgPanZoom from 'svg-pan-zoom';
|
|
8
8
|
|
|
9
|
+
class PuicHelperService {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.setRootSvg = (svgParent) => this.rootSvg = svgParent;
|
|
12
|
+
this.getAllElementsForPuic = (puic) => this.rootSvg.querySelectorAll(`.p${puic}, #p${puic}`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
PuicHelperService.ɵprov = ɵɵdefineInjectable({ factory: function PuicHelperService_Factory() { return new PuicHelperService(); }, token: PuicHelperService, providedIn: "root" });
|
|
16
|
+
PuicHelperService.decorators = [
|
|
17
|
+
{ type: Injectable, args: [{
|
|
18
|
+
providedIn: 'root'
|
|
19
|
+
},] }
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
class ClickareaService {
|
|
23
|
+
constructor(puicHelper) {
|
|
24
|
+
this.puicHelper = puicHelper;
|
|
25
|
+
this.timeout = 250;
|
|
26
|
+
}
|
|
27
|
+
delayedClickAreaCreation(ids) {
|
|
28
|
+
if (ids.size === 0) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
window.clearTimeout(this.timer);
|
|
32
|
+
this.timer = window.setTimeout(() => this.createClickareas(ids), this.timeout);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Mogelijke optimalisatie is om de delta te bepalen van de te verwerken ids
|
|
36
|
+
*/
|
|
37
|
+
createClickareas(ids) {
|
|
38
|
+
Array.from(document.getElementsByClassName('imxview-clickarea')).forEach(x => x.remove());
|
|
39
|
+
ids.forEach(id => {
|
|
40
|
+
this.puicHelper.getAllElementsForPuic(id).forEach(element => {
|
|
41
|
+
if (element) {
|
|
42
|
+
const polylines = Array.from(element.getElementsByTagName('polyline'));
|
|
43
|
+
polylines.forEach(p => {
|
|
44
|
+
const clone = p.cloneNode(true);
|
|
45
|
+
clone.setAttribute('class', 'imxview-clickarea');
|
|
46
|
+
clone.removeAttribute('id');
|
|
47
|
+
element.insertBefore(clone, p);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
ClickareaService.ɵprov = ɵɵdefineInjectable({ factory: function ClickareaService_Factory() { return new ClickareaService(ɵɵinject(PuicHelperService)); }, token: ClickareaService, providedIn: "root" });
|
|
55
|
+
ClickareaService.decorators = [
|
|
56
|
+
{ type: Injectable, args: [{
|
|
57
|
+
providedIn: 'root'
|
|
58
|
+
},] }
|
|
59
|
+
];
|
|
60
|
+
ClickareaService.ctorParameters = () => [
|
|
61
|
+
{ type: PuicHelperService }
|
|
62
|
+
];
|
|
63
|
+
|
|
9
64
|
class ClassesUtil {
|
|
10
65
|
static addClass(elem, cls) {
|
|
11
66
|
if ('' === cls) {
|
|
@@ -93,7 +148,7 @@ class SvgRectUtil {
|
|
|
93
148
|
}
|
|
94
149
|
|
|
95
150
|
class FocusUtil {
|
|
96
|
-
static focusOnIds(focusIds, svgPanZoomRef) {
|
|
151
|
+
static focusOnIds(focusIds, svgPanZoomRef, puicHelper) {
|
|
97
152
|
if (focusIds && focusIds.length > 0) {
|
|
98
153
|
// calculate the union rectangle of elements with ids
|
|
99
154
|
const svgContainer = document.getElementById('svgContainer');
|
|
@@ -101,7 +156,7 @@ class FocusUtil {
|
|
|
101
156
|
let resultRect;
|
|
102
157
|
if (rootSvgDoc && rootSvgDoc.nodeName === 'svg') {
|
|
103
158
|
focusIds.forEach(puic => {
|
|
104
|
-
const elems =
|
|
159
|
+
const elems = puicHelper.getAllElementsForPuic(puic);
|
|
105
160
|
for (let i = 0; i < elems.length; i++) {
|
|
106
161
|
const elementRect = FocusUtil.getElementRectangleWithNestedSvgOffset(elems[i]);
|
|
107
162
|
resultRect = SvgRectUtil.rectUnion(resultRect, elementRect);
|
|
@@ -114,7 +169,7 @@ class FocusUtil {
|
|
|
114
169
|
static focusOnRect(rect, elementRect, rootSvgDoc, svgPanZoomRef) {
|
|
115
170
|
if (rect) {
|
|
116
171
|
// make sure we are in the svgpanzoom transformed area
|
|
117
|
-
const matrix = rootSvgDoc.
|
|
172
|
+
const matrix = rootSvgDoc.getElementsByClassName('svg-pan-zoom_viewport')[0].getScreenCTM();
|
|
118
173
|
// get from svg coordinate system to webpage coordinate system
|
|
119
174
|
const location = rootSvgDoc.createSVGPoint();
|
|
120
175
|
location.x = rect.x + (rect.width / 2);
|
|
@@ -170,12 +225,18 @@ class SelectieEvent {
|
|
|
170
225
|
|
|
171
226
|
const _svgPanZoom = SvgPanZoom; // via andere variabele zodat ng-packgr/rollup geen error geeft bij de aannroep
|
|
172
227
|
class ImxViewerComponent {
|
|
173
|
-
constructor(document, http) {
|
|
228
|
+
constructor(document, http, clickAreaService, puicHelper) {
|
|
174
229
|
this.document = document;
|
|
175
230
|
this.http = http;
|
|
231
|
+
this.clickAreaService = clickAreaService;
|
|
232
|
+
this.puicHelper = puicHelper;
|
|
233
|
+
this.useClickArea = false;
|
|
234
|
+
this.inlineDgnCssImport = true;
|
|
235
|
+
this.selectieInfos = [];
|
|
236
|
+
// Onderstaande inputs worden meegenomen voor clickarea:
|
|
176
237
|
this.clickableIds = [];
|
|
177
238
|
this.rightClickableIds = [];
|
|
178
|
-
this.
|
|
239
|
+
this.popoverInfos = [];
|
|
179
240
|
this.errors = false;
|
|
180
241
|
this.popoverStyle = { display: 'inline' };
|
|
181
242
|
this.popoverHtmlContent = '';
|
|
@@ -184,35 +245,40 @@ class ImxViewerComponent {
|
|
|
184
245
|
this.svgLoaded = new EventEmitter();
|
|
185
246
|
this.svgGeladen = false;
|
|
186
247
|
this.eventListeners = new Map();
|
|
248
|
+
this.getSvgPanZoomInstance = () => this.svgPanZoomRef;
|
|
249
|
+
this.hidePopOver = () => this.popoverStyle.visibility = 'hidden';
|
|
250
|
+
this.getSvgParent = () => this.svgParentRef.nativeElement;
|
|
187
251
|
}
|
|
188
252
|
ngOnInit() {
|
|
189
253
|
this.createSvgPanZoomRefIfNotExists();
|
|
254
|
+
this.puicHelper.setRootSvg(this.getSvgParent());
|
|
190
255
|
}
|
|
191
256
|
ngOnChanges(changes) {
|
|
192
257
|
// If Imx-viewer is initialized with svgInfo, ngOnChanges is called before ngOnInit.
|
|
193
258
|
// In that case we need to create svgPanZoomRef here.
|
|
194
259
|
this.createSvgPanZoomRefIfNotExists();
|
|
195
|
-
|
|
260
|
+
const { useClickArea, clickableIds, rightClickableIds, popoverInfos, selectieInfos, svgInfo } = changes;
|
|
261
|
+
if (useClickArea || clickableIds || rightClickableIds || popoverInfos) {
|
|
262
|
+
this.delayedClickAreaCreation();
|
|
263
|
+
}
|
|
264
|
+
if (this.svgInfo && svgInfo) {
|
|
196
265
|
this.loadSvgs();
|
|
197
266
|
}
|
|
198
|
-
if (this.clickableIds &&
|
|
267
|
+
if (this.clickableIds && clickableIds && this.svgGeladen) {
|
|
199
268
|
this.addClickEventHandlersToElements(this.clickableIds, 'click');
|
|
200
269
|
}
|
|
201
|
-
if (this.rightClickableIds &&
|
|
270
|
+
if (this.rightClickableIds && rightClickableIds && this.svgGeladen) {
|
|
202
271
|
this.addClickEventHandlersToElements(this.rightClickableIds, 'contextmenu');
|
|
203
272
|
}
|
|
204
|
-
if (this.selectieInfos &&
|
|
273
|
+
if (this.selectieInfos && selectieInfos && this.svgGeladen) {
|
|
205
274
|
this.selectElements();
|
|
206
275
|
}
|
|
207
|
-
if (this.popoverInfos &&
|
|
276
|
+
if (this.popoverInfos && popoverInfos && this.svgGeladen) {
|
|
208
277
|
this.addMouseoverEventHandlerToElements();
|
|
209
278
|
}
|
|
210
279
|
}
|
|
211
280
|
focusOnIds(focusIds) {
|
|
212
|
-
FocusUtil.focusOnIds(focusIds, this.svgPanZoomRef);
|
|
213
|
-
}
|
|
214
|
-
getSvgPanZoomInstance() {
|
|
215
|
-
return this.svgPanZoomRef;
|
|
281
|
+
FocusUtil.focusOnIds(focusIds, this.svgPanZoomRef, this.puicHelper);
|
|
216
282
|
}
|
|
217
283
|
// Here only used in test, but also used by applications. Do not remove.
|
|
218
284
|
static getXCoordinate(decodedSvgDataUrl) {
|
|
@@ -224,6 +290,65 @@ class ImxViewerComponent {
|
|
|
224
290
|
div = null;
|
|
225
291
|
return result;
|
|
226
292
|
}
|
|
293
|
+
createSvgPanZoomRefIfNotExists() {
|
|
294
|
+
if (!this.svgPanZoomRef) {
|
|
295
|
+
this.svgPanZoomRef = _svgPanZoom(this.getSvgParent(), {
|
|
296
|
+
fit: false,
|
|
297
|
+
center: true,
|
|
298
|
+
dblClickZoomEnabled: false,
|
|
299
|
+
onZoom: () => this.hidePopOver(),
|
|
300
|
+
onPan: () => this.hidePopOver()
|
|
301
|
+
});
|
|
302
|
+
this.addStyleToRootSvg();
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Style wordt vanuit javascript toegevoegd na de create van SvgZoomPanRef deze maakt een viewport aan.
|
|
307
|
+
* - Clickarea CSS wordt dynamisch aan de SVG toegevoegd, dit voorkomt dat dat er ngcontent property op geplaatst wordt.
|
|
308
|
+
* De SVG's worden niet voorzien van ngcontent attribuut.
|
|
309
|
+
* - DGN.css import wordt (optioneel) in de root SVG opgenomen, deze is eerst verwijderd uit de SVG's. Om meerdere imports te voorkomen.
|
|
310
|
+
* */
|
|
311
|
+
addStyleToRootSvg() {
|
|
312
|
+
const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');
|
|
313
|
+
let style = this.inlineDgnCssImport ? '@import url("dgn.css");\n' : '';
|
|
314
|
+
style +=
|
|
315
|
+
`.imxview-selected > polyline.imxview-clickarea, polyline.imxview-clickarea {
|
|
316
|
+
stroke: var(--imxview-clickarea-stroke, transparent);
|
|
317
|
+
stroke-width: var(--imxview-clickarea-stroke-width, 10px);
|
|
318
|
+
stroke-dasharray: none;
|
|
319
|
+
}`;
|
|
320
|
+
defs.innerHTML =
|
|
321
|
+
`<style type="text/css">
|
|
322
|
+
${style}
|
|
323
|
+
</style>`;
|
|
324
|
+
const firstElementChild = this.getSvgParent().firstElementChild;
|
|
325
|
+
this.getSvgParent().insertBefore(defs, firstElementChild);
|
|
326
|
+
}
|
|
327
|
+
loadSvgs() {
|
|
328
|
+
combineLatest(this.svgInfo.map(svgInfo => this.loadSvg(svgInfo.svg)))
|
|
329
|
+
.pipe(take(1))
|
|
330
|
+
.subscribe(svgs => {
|
|
331
|
+
const svg = this.concatenateSvgs(svgs);
|
|
332
|
+
this.updateDom(svg);
|
|
333
|
+
this.svgGeladen = true;
|
|
334
|
+
this.svgLoaded.emit();
|
|
335
|
+
this.delayedClickAreaCreation();
|
|
336
|
+
this.addClickEventHandlersToElements(this.clickableIds, 'click');
|
|
337
|
+
this.addClickEventHandlersToElements(this.rightClickableIds, 'contextmenu');
|
|
338
|
+
this.selectElements();
|
|
339
|
+
this.addMouseoverEventHandlerToElements();
|
|
340
|
+
}, error => this.flagErrors(error));
|
|
341
|
+
}
|
|
342
|
+
loadSvg(svgSrc) {
|
|
343
|
+
if (svgSrc.startsWith('data:')) {
|
|
344
|
+
const parsed = parse(svgSrc);
|
|
345
|
+
if (parsed) {
|
|
346
|
+
return of(parsed.data.toString());
|
|
347
|
+
}
|
|
348
|
+
return throwError('Data-url parse error');
|
|
349
|
+
}
|
|
350
|
+
return this.http.get(svgSrc, { responseType: 'text' });
|
|
351
|
+
}
|
|
227
352
|
addClickEventHandlersToElement(listeners, elem, eventType, puic) {
|
|
228
353
|
const elemAlreadyHasListener = listeners.get(elem);
|
|
229
354
|
if (!elemAlreadyHasListener) {
|
|
@@ -245,10 +370,8 @@ class ImxViewerComponent {
|
|
|
245
370
|
const listeners = this.removeOldState(eventtype);
|
|
246
371
|
if (clickableIds) {
|
|
247
372
|
clickableIds.forEach(puic => {
|
|
248
|
-
const elements =
|
|
249
|
-
elements.forEach((element) =>
|
|
250
|
-
this.addClickEventHandlersToElement(listeners, element, eventtype, puic);
|
|
251
|
-
});
|
|
373
|
+
const elements = this.puicHelper.getAllElementsForPuic(puic);
|
|
374
|
+
elements.forEach((element) => this.addClickEventHandlersToElement(listeners, element, eventtype, puic));
|
|
252
375
|
});
|
|
253
376
|
}
|
|
254
377
|
}
|
|
@@ -257,7 +380,7 @@ class ImxViewerComponent {
|
|
|
257
380
|
if (this.popoverInfos) {
|
|
258
381
|
this.popoverInfos.forEach(popoverInfo => {
|
|
259
382
|
popoverInfo.puicArray.forEach(puic => {
|
|
260
|
-
const elems = this.
|
|
383
|
+
const elems = this.puicHelper.getAllElementsForPuic(puic);
|
|
261
384
|
for (let i = 0; i < elems.length; i++) {
|
|
262
385
|
const fn = (e) => {
|
|
263
386
|
this.popoverHtmlContent = popoverInfo.popoverHtmlContent;
|
|
@@ -278,57 +401,21 @@ class ImxViewerComponent {
|
|
|
278
401
|
for (let i = 0, len = this.svgInfo.length; i < len; i++) {
|
|
279
402
|
const sourceCoordinates = this.svgInfo[i].coordinates || new Point(0, 0);
|
|
280
403
|
const div = document.createElement('div');
|
|
281
|
-
|
|
404
|
+
/** Verwijder dgn.css import uit geleverde SVG's.
|
|
405
|
+
* De import wordt optioneel (standaard aan) in de root SVG geplaats om te voorkomen dat de import meermaals gebeurd.
|
|
406
|
+
* zie addStyleToRootSvg()
|
|
407
|
+
*/
|
|
408
|
+
div.innerHTML = svgs[i].replace('@import url("dgn.css");', '');
|
|
282
409
|
div.firstElementChild.setAttribute('x', sourceCoordinates.x.toString());
|
|
283
410
|
div.firstElementChild.setAttribute('y', sourceCoordinates.y.toString());
|
|
284
411
|
svgContent += div.innerHTML;
|
|
285
412
|
}
|
|
286
413
|
return svgContent;
|
|
287
414
|
}
|
|
288
|
-
createSvgPanZoomRefIfNotExists() {
|
|
289
|
-
if (!this.svgPanZoomRef) {
|
|
290
|
-
this.svgPanZoomRef = _svgPanZoom(this.getSvgParent(), {
|
|
291
|
-
fit: false,
|
|
292
|
-
center: true,
|
|
293
|
-
dblClickZoomEnabled: false,
|
|
294
|
-
onZoom: () => {
|
|
295
|
-
this.hidePopOver();
|
|
296
|
-
},
|
|
297
|
-
onPan: () => this.hidePopOver()
|
|
298
|
-
});
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
415
|
flagErrors(error) {
|
|
302
416
|
console.log(error);
|
|
303
417
|
this.errors = true;
|
|
304
418
|
}
|
|
305
|
-
hidePopOver() {
|
|
306
|
-
this.popoverStyle.visibility = 'hidden';
|
|
307
|
-
}
|
|
308
|
-
loadSvg(svgSrc) {
|
|
309
|
-
if (svgSrc.startsWith('data:')) {
|
|
310
|
-
const parsed = parse(svgSrc);
|
|
311
|
-
if (parsed) {
|
|
312
|
-
return of(parsed.data.toString());
|
|
313
|
-
}
|
|
314
|
-
return throwError('Data-url parse error');
|
|
315
|
-
}
|
|
316
|
-
return this.http.get(svgSrc, { responseType: 'text' });
|
|
317
|
-
}
|
|
318
|
-
loadSvgs() {
|
|
319
|
-
combineLatest(this.svgInfo.map(svgInfo => this.loadSvg(svgInfo.svg)))
|
|
320
|
-
.pipe(take(1))
|
|
321
|
-
.subscribe(svgs => {
|
|
322
|
-
const svg = this.concatenateSvgs(svgs);
|
|
323
|
-
this.updateDom(svg);
|
|
324
|
-
this.svgGeladen = true;
|
|
325
|
-
this.svgLoaded.emit();
|
|
326
|
-
this.addClickEventHandlersToElements(this.clickableIds, 'click');
|
|
327
|
-
this.addClickEventHandlersToElements(this.rightClickableIds, 'contextmenu');
|
|
328
|
-
this.selectElements();
|
|
329
|
-
this.addMouseoverEventHandlerToElements();
|
|
330
|
-
}, error => this.flagErrors(error));
|
|
331
|
-
}
|
|
332
419
|
removeOldState(eventType) {
|
|
333
420
|
let listeners = this.eventListeners.get(eventType);
|
|
334
421
|
if (listeners) {
|
|
@@ -349,16 +436,12 @@ class ImxViewerComponent {
|
|
|
349
436
|
if (this.selectieInfos) {
|
|
350
437
|
this.selectieInfos.forEach(selectieInfo => {
|
|
351
438
|
selectieInfo.ids.forEach(id => {
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
elems = this.getSvgParent().querySelectorAll('#p' + id);
|
|
355
|
-
}
|
|
356
|
-
for (let i = 0; i < elems.length; i++) {
|
|
357
|
-
ClassesUtil.addClass(elems.item(i), 'imxview-selected');
|
|
439
|
+
this.puicHelper.getAllElementsForPuic(id).forEach(elem => {
|
|
440
|
+
ClassesUtil.addClass(elem, 'imxview-selected');
|
|
358
441
|
if ('' !== selectieInfo.clazz) {
|
|
359
|
-
ClassesUtil.addClass(
|
|
442
|
+
ClassesUtil.addClass(elem, 'imxview-selected-' + selectieInfo.clazz);
|
|
360
443
|
}
|
|
361
|
-
}
|
|
444
|
+
});
|
|
362
445
|
});
|
|
363
446
|
});
|
|
364
447
|
}
|
|
@@ -377,31 +460,39 @@ class ImxViewerComponent {
|
|
|
377
460
|
};
|
|
378
461
|
}
|
|
379
462
|
updateDom(svg) {
|
|
380
|
-
const svgGroup = this.getSvgParent().
|
|
463
|
+
const svgGroup = this.getSvgParent().getElementsByClassName('svg-pan-zoom_viewport')[0];
|
|
381
464
|
svgGroup.innerHTML = svg.substring(svg.indexOf('<svg'));
|
|
382
465
|
this.svgPanZoomRef.updateBBox();
|
|
383
466
|
this.svgPanZoomRef.center();
|
|
384
467
|
}
|
|
385
|
-
|
|
386
|
-
|
|
468
|
+
delayedClickAreaCreation() {
|
|
469
|
+
if (this.svgGeladen && this.useClickArea) {
|
|
470
|
+
const clickareaIds = new Set([...this.clickableIds, ...this.rightClickableIds,
|
|
471
|
+
...this.popoverInfos.flatMap(pi => pi.puicArray)]);
|
|
472
|
+
this.clickAreaService.delayedClickAreaCreation(clickareaIds);
|
|
473
|
+
}
|
|
387
474
|
}
|
|
388
475
|
}
|
|
389
476
|
ImxViewerComponent.decorators = [
|
|
390
477
|
{ type: Component, args: [{
|
|
391
478
|
selector: 'imx-viewer',
|
|
392
|
-
template: "<div id=\"imxviewer\">\n <div id=\"svgContainer\" class=\"col-md-12 top10\" [hidden]=\"errors\" (click)=\"hidePopOver()\">\n <svg #svgParent xmlns=\"http://www.w3.org/2000/svg\"
|
|
393
|
-
styles: [".popover{background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif;font-size:.875rem;font-style:normal;font-weight:400;left:0;letter-spacing:normal;line-break:auto;line-height:1.5;max-width:100%;text-align:
|
|
479
|
+
template: "<div id=\"imxviewer\">\n <div id=\"svgContainer\" class=\"col-md-12 top10\" [hidden]=\"errors\" (click)=\"hidePopOver()\">\n <svg #svgParent xmlns=\"http://www.w3.org/2000/svg\"></svg>\n </div>\n <div id=\"popover\" class=\"popover top bs-popover-top\" [ngStyle]=\"popoverStyle\" (mouseleave)=\"hidePopOver()\">\n <div class=\"arrow\"></div>\n <h3 class=\"popover-header\" *ngIf=\"popoverTitleContent !== undefined\">{{popoverTitleContent}}</h3>\n <div class=\"popover-body\" [innerHTML]=\"popoverHtmlContent\"></div>\n </div>\n</div>\n",
|
|
480
|
+
styles: [".popover{background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif;font-size:.875rem;font-style:normal;font-weight:400;left:0;letter-spacing:normal;line-break:auto;line-height:1.5;max-width:100%;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;top:0;visibility:hidden;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:break-word;z-index:1060}.popover,.popover .arrow{display:block;position:absolute}.popover .arrow{height:.5rem;left:40%;margin:0 .3rem;width:1rem}.popover .arrow:after,.popover .arrow:before{border-color:transparent;border-style:solid;content:\"\";display:block;position:absolute}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow:before,.bs-popover-top>.arrow:before{border-top-color:rgba(0,0,0,.25);border-width:.5rem .5rem 0;bottom:0}.bs-popover-auto[x-placement^=top]>.arrow:after,.bs-popover-top>.arrow:after{border-top-color:#fff;border-width:.5rem .5rem 0;bottom:1px}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{height:1rem;left:calc(-.5rem - 1px);margin:.3rem 0;width:.5rem}.bs-popover-auto[x-placement^=right]>.arrow:before,.bs-popover-right>.arrow:before{border-right-color:rgba(0,0,0,.25);border-width:.5rem .5rem .5rem 0;left:0}.bs-popover-auto[x-placement^=right]>.arrow:after,.bs-popover-right>.arrow:after{border-right-color:#fff;border-width:.5rem .5rem .5rem 0;left:1px}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow:before,.bs-popover-bottom>.arrow:before{border-bottom-color:rgba(0,0,0,.25);border-width:0 .5rem .5rem;top:0}.bs-popover-auto[x-placement^=bottom]>.arrow:after,.bs-popover-bottom>.arrow:after{border-bottom-color:#fff;border-width:0 .5rem .5rem;top:1px}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{border-bottom:1px solid #f7f7f7;content:\"\";display:block;left:50%;margin-left:-.5rem;position:absolute;top:0;width:1rem}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{height:1rem;margin:.3rem 0;right:calc(-.5rem - 1px);width:.5rem}.bs-popover-auto[x-placement^=left]>.arrow:before,.bs-popover-left>.arrow:before{border-left-color:rgba(0,0,0,.25);border-width:.5rem 0 .5rem .5rem;right:0}.bs-popover-auto[x-placement^=left]>.arrow:after,.bs-popover-left>.arrow:after{border-left-color:#fff;border-width:.5rem 0 .5rem .5rem;right:1px}.popover-header{background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px);font-size:1rem;margin-bottom:0;padding:.5rem .75rem}.popover-header:empty{display:none}.popover-body{color:#212529;padding:.5rem .75rem}"]
|
|
394
481
|
},] }
|
|
395
482
|
];
|
|
396
483
|
ImxViewerComponent.ctorParameters = () => [
|
|
397
484
|
{ type: undefined, decorators: [{ type: Inject, args: [DocumentToken,] }] },
|
|
398
|
-
{ type: HttpClient }
|
|
485
|
+
{ type: HttpClient },
|
|
486
|
+
{ type: ClickareaService },
|
|
487
|
+
{ type: PuicHelperService }
|
|
399
488
|
];
|
|
400
489
|
ImxViewerComponent.propDecorators = {
|
|
490
|
+
useClickArea: [{ type: Input }],
|
|
491
|
+
inlineDgnCssImport: [{ type: Input }],
|
|
401
492
|
svgInfo: [{ type: Input }],
|
|
493
|
+
selectieInfos: [{ type: Input }],
|
|
402
494
|
clickableIds: [{ type: Input }],
|
|
403
495
|
rightClickableIds: [{ type: Input }],
|
|
404
|
-
selectieInfos: [{ type: Input }],
|
|
405
496
|
popoverInfos: [{ type: Input }],
|
|
406
497
|
svgParentRef: [{ type: ViewChild, args: ['svgParent', { static: true },] }],
|
|
407
498
|
clickHandler: [{ type: Output }],
|
|
@@ -455,5 +546,5 @@ class SelectieInfo {
|
|
|
455
546
|
* Generated bundle index. Do not edit.
|
|
456
547
|
*/
|
|
457
548
|
|
|
458
|
-
export { ImxViewerComponent, ImxViewerModule, Point, PopoverInfo, SelectieEvent, SelectieInfo, SvgInfo, ɵ0, DocumentToken as ɵa, documentProvider as ɵb };
|
|
549
|
+
export { ImxViewerComponent, ImxViewerModule, Point, PopoverInfo, SelectieEvent, SelectieInfo, SvgInfo, ɵ0, DocumentToken as ɵa, documentProvider as ɵb, ClickareaService as ɵc, PuicHelperService as ɵd };
|
|
459
550
|
//# sourceMappingURL=loxia-imx-viewer.js.map
|