@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.
Files changed (49) hide show
  1. package/README.md +52 -1
  2. package/bundles/loxia-imx-viewer.umd.js +506 -96
  3. package/bundles/loxia-imx-viewer.umd.js.map +1 -1
  4. package/bundles/loxia-imx-viewer.umd.min.js +15 -1
  5. package/bundles/loxia-imx-viewer.umd.min.js.map +1 -1
  6. package/components/imx-viewer.component.d.ts +25 -11
  7. package/css/dgn.css +143 -0
  8. package/esm2015/components/imx-viewer.component.js +116 -78
  9. package/esm2015/imx-viewer.module.js +2 -2
  10. package/esm2015/loxia-imx-viewer.js +4 -2
  11. package/esm2015/model/point.js +7 -0
  12. package/esm2015/model/popover-info.js +7 -0
  13. package/esm2015/model/selectie-event.js +7 -0
  14. package/esm2015/model/selectie-info.js +7 -0
  15. package/esm2015/model/svg-info.js +7 -0
  16. package/esm2015/public_api.js +6 -6
  17. package/esm2015/services/clickarea.service.js +46 -0
  18. package/esm2015/services/puic-helper.service.js +15 -0
  19. package/esm2015/utils/classes-util.js +35 -0
  20. package/esm2015/utils/document-token.js +4 -0
  21. package/esm2015/utils/focus-util.js +63 -0
  22. package/esm2015/utils/svg-rect-util.js +48 -0
  23. package/fesm2015/loxia-imx-viewer.js +169 -78
  24. package/fesm2015/loxia-imx-viewer.js.map +1 -1
  25. package/loxia-imx-viewer.d.ts +3 -1
  26. package/loxia-imx-viewer.metadata.json +1 -1
  27. package/{components → model}/point.d.ts +0 -0
  28. package/{components → model}/popover-info.d.ts +0 -0
  29. package/{components → model}/selectie-event.d.ts +0 -0
  30. package/{components → model}/selectie-info.d.ts +0 -0
  31. package/{components → model}/svg-info.d.ts +0 -0
  32. package/package.json +1 -1
  33. package/public_api.d.ts +5 -5
  34. package/services/clickarea.service.d.ts +12 -0
  35. package/services/puic-helper.service.d.ts +5 -0
  36. package/{components → utils}/classes-util.d.ts +0 -0
  37. package/{components → utils}/document-token.d.ts +0 -0
  38. package/utils/focus-util.d.ts +7 -0
  39. package/{components → utils}/svg-rect-util.d.ts +0 -0
  40. package/components/focus-util.d.ts +0 -5
  41. package/esm2015/components/classes-util.js +0 -35
  42. package/esm2015/components/document-token.js +0 -4
  43. package/esm2015/components/focus-util.js +0 -63
  44. package/esm2015/components/point.js +0 -7
  45. package/esm2015/components/popover-info.js +0 -7
  46. package/esm2015/components/selectie-event.js +0 -7
  47. package/esm2015/components/selectie-info.js +0 -7
  48. package/esm2015/components/svg-info.js +0 -7
  49. 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, combineLatest } from 'rxjs';
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 = rootSvgDoc.querySelectorAll(`.p${puic}, #p${puic}`);
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.firstChild.getScreenCTM();
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.selectieInfos = [];
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
- if (this.svgInfo && changes.svgInfo) {
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 && changes.clickableIds && this.svgGeladen) {
267
+ if (this.clickableIds && clickableIds && this.svgGeladen) {
199
268
  this.addClickEventHandlersToElements(this.clickableIds, 'click');
200
269
  }
201
- if (this.rightClickableIds && changes.rightClickableIds && this.svgGeladen) {
270
+ if (this.rightClickableIds && rightClickableIds && this.svgGeladen) {
202
271
  this.addClickEventHandlersToElements(this.rightClickableIds, 'contextmenu');
203
272
  }
204
- if (this.selectieInfos && changes.selectieInfos && this.svgGeladen) {
273
+ if (this.selectieInfos && selectieInfos && this.svgGeladen) {
205
274
  this.selectElements();
206
275
  }
207
- if (this.popoverInfos && changes.popoverInfos && this.svgGeladen) {
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 = Array.from(this.document.querySelectorAll('#p' + puic));
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.getSvgParent().querySelectorAll(`.p${puic}, #p${puic}`);
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
- div.innerHTML = svgs[i];
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
- let elems = this.getSvgParent().querySelectorAll('.p' + id);
353
- if (elems.length === 0) {
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(elems.item(i), 'imxview-selected-' + selectieInfo.clazz);
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().firstElementChild;
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
- getSvgParent() {
386
- return this.svgParentRef.nativeElement;
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\">\n </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",
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:left;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}"]
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