diff --git a/package-lock.json b/package-lock.json index 1def4cbe8a..25a1e006aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -849,10 +849,7 @@ "version": "18.2.13", "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-18.2.13.tgz", "integrity": "sha512-fVC943qEqGNUy923NMmSSzfoIqNw2k2UbG/3Y4QEmel/nZFWHA3PhiYr+lE7J3RhRHFMmnNP1bmXDJgy+R+pzA==", - "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -7623,6 +7620,34 @@ "url": "https://opencollective.com/turf" } }, + "node_modules/@turf/boolean-disjoint": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-disjoint/-/boolean-disjoint-6.5.0.tgz", + "integrity": "sha512-rZ2ozlrRLIAGo2bjQ/ZUu4oZ/+ZjGvLkN5CKXSKBcu6xFO6k2bgqeM8a1836tAW+Pqp/ZFsTA5fZHsJZvP2D5g==", + "dependencies": { + "@turf/boolean-point-in-polygon": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/line-intersect": "^6.5.0", + "@turf/meta": "^6.5.0", + "@turf/polygon-to-line": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-intersects": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-intersects/-/boolean-intersects-6.5.0.tgz", + "integrity": "sha512-nIxkizjRdjKCYFQMnml6cjPsDOBCThrt+nkqtSEcxkKMhAQj5OO7o2CecioNTaX8EayqwMGVKcsz27oP4mKPTw==", + "dependencies": { + "@turf/boolean-disjoint": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, "node_modules/@turf/boolean-point-in-polygon": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/@turf/boolean-point-in-polygon/-/boolean-point-in-polygon-6.5.0.tgz", @@ -7636,6 +7661,24 @@ "url": "https://opencollective.com/turf" } }, + "node_modules/@turf/buffer": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/buffer/-/buffer-6.5.0.tgz", + "integrity": "sha512-qeX4N6+PPWbKqp1AVkBVWFerGjMYMUyencwfnkCesoznU6qvfugFHNAngNqIBVnJjZ5n8IFyOf+akcxnrt9sNg==", + "license": "MIT", + "dependencies": { + "@turf/bbox": "^6.5.0", + "@turf/center": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0", + "@turf/projection": "^6.5.0", + "d3-geo": "1.7.1", + "turf-jsts": "*" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, "node_modules/@turf/center": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/@turf/center/-/center-6.5.0.tgz", @@ -7696,6 +7739,19 @@ "url": "https://opencollective.com/turf" } }, + "node_modules/@turf/intersect": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/intersect/-/intersect-6.5.0.tgz", + "integrity": "sha512-2legGJeKrfFkzntcd4GouPugoqPUjexPZnOvfez+3SfIMrHvulw8qV8u7pfVyn2Yqs53yoVCEjS5sEpvQ5YRQg==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "polygon-clipping": "^0.15.3" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, "node_modules/@turf/invariant": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", @@ -7781,6 +7837,31 @@ "url": "https://opencollective.com/turf" } }, + "node_modules/@turf/polygon-to-line": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/polygon-to-line/-/polygon-to-line-6.5.0.tgz", + "integrity": "sha512-5p4n/ij97EIttAq+ewSnKt0ruvuM+LIDzuczSzuHTpq4oS7Oq8yqg5TQ4nzMVuK41r/tALCk7nAoBuw3Su4Gcw==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/projection": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/projection/-/projection-6.5.0.tgz", + "integrity": "sha512-/Pgh9mDvQWWu8HRxqpM+tKz8OzgauV+DiOcr3FCjD6ubDnrrmMJlsf6fFJmggw93mtVPrZRL6yyi9aYCQBOIvg==", + "dependencies": { + "@turf/clone": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, "node_modules/@types/body-parser": { "version": "1.19.5", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", @@ -7934,6 +8015,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/jasminewd2": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.13.tgz", + "integrity": "sha512-aJ3wj8tXMpBrzQ5ghIaqMisD8C3FIrcO6sDKHqFbuqAsI7yOxj0fA7MrRCPLZHIVUjERIwsMmGn/vB0UQ9u0Hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/jasmine": "*" + } + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -11308,6 +11399,16 @@ "node": ">= 0.10" } }, + "node_modules/corser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", + "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/cosmiconfig": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", @@ -11920,6 +12021,21 @@ "node": ">=6" } }, + "node_modules/d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-geo": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.7.1.tgz", + "integrity": "sha512-O4AempWAr+P5qbk2bC2FuN/sDW4z+dN2wDf9QV3bxQt4M5HfOEeXLgJ/UKQW0+o1Dj8BE+L5kiDbdWUMjsmQpw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "1" + } + }, "node_modules/dargs": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", @@ -15608,6 +15724,16 @@ "node": ">= 0.4" } }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, "node_modules/highlight.js": { "version": "10.7.3", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", @@ -15664,6 +15790,19 @@ "wbuf": "^1.1.0" } }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/html-entities": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", @@ -15852,6 +15991,100 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/http-server": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", + "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "basic-auth": "^2.0.1", + "chalk": "^4.1.2", + "corser": "^2.0.1", + "he": "^1.2.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy": "^1.18.1", + "mime": "^1.6.0", + "minimist": "^1.2.6", + "opener": "^1.5.1", + "portfinder": "^1.0.28", + "secure-compare": "3.0.1", + "union": "~0.5.0", + "url-join": "^4.0.1" + }, + "bin": { + "http-server": "bin/http-server" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/http-server/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/http-server/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/http-server/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/http-server/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/http-server/node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true, + "license": "MIT" + }, "node_modules/http-signature": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz", @@ -16001,6 +16234,10 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/igo": { + "resolved": "projects/igo2", + "link": true + }, "node_modules/image-size": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", @@ -22691,6 +22928,16 @@ "opencollective-postinstall": "index.js" } }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -23451,6 +23698,47 @@ "node": ">=4" } }, + "node_modules/polygon-clipping": { + "version": "0.15.7", + "resolved": "https://registry.npmjs.org/polygon-clipping/-/polygon-clipping-0.15.7.tgz", + "integrity": "sha512-nhfdr83ECBg6xtqOAJab1tbksbBAOMUltN60bU+llHVOL0e5Onm1WpAXXWXVB39L8AJFssoIhEVuy/S90MmotA==", + "dependencies": { + "robust-predicates": "^3.0.2", + "splaytree": "^3.1.0" + } + }, + "node_modules/portfinder": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "dev": true, + "dependencies": { + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, "node_modules/postcss": { "version": "8.4.41", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", @@ -24158,70 +24446,180 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg/node_modules/parse-json": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.1.0.tgz", - "integrity": "sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==", + "node_modules/read-pkg-up": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-10.1.0.tgz", + "integrity": "sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.22.13", - "index-to-position": "^0.1.2", - "type-fest": "^4.7.1" + "find-up": "^6.3.0", + "read-pkg": "^8.1.0", + "type-fest": "^4.2.0" }, "engines": { - "node": ">=18" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.33.0.tgz", - "integrity": "sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g==", + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, "engines": { - "node": ">=16" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/read-pkg-up/node_modules/lines-and-columns": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", + "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "dev": true, "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/read-pkg-up/node_modules/parse-json": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.1.1.tgz", + "integrity": "sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==", "dev": true, "license": "MIT", "dependencies": { - "picomatch": "^2.2.1" + "@babel/code-frame": "^7.21.4", + "error-ex": "^1.3.2", + "json-parse-even-better-errors": "^3.0.0", + "lines-and-columns": "^2.0.3", + "type-fest": "^3.8.0" }, "engines": { - "node": ">=8.10.0" - } + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/parse-json/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/read-pkg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.1.0.tgz", + "integrity": "sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.1", + "normalize-package-data": "^6.0.0", + "parse-json": "^7.0.0", + "type-fest": "^4.2.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.29.0.tgz", + "integrity": "sha512-RPYt6dKyemXJe7I6oNstcH24myUGSReicxcHTvCLgzm4e0n8y05dGvcGB15/SoPRBmhlMthWQ9pvKyL81ko8nQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/parse-json": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.1.0.tgz", + "integrity": "sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "index-to-position": "^0.1.2", + "type-fest": "^4.7.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.33.0.tgz", + "integrity": "sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } }, "node_modules/readdirp/node_modules/picomatch": { "version": "2.3.1", @@ -24636,6 +25034,11 @@ "node": "*" } }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" + }, "node_modules/rollup": { "version": "4.22.4", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", @@ -24941,6 +25344,13 @@ "compute-scroll-into-view": "^3.0.2" } }, + "node_modules/secure-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", + "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", + "dev": true, + "license": "MIT" + }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -26124,6 +26534,11 @@ "node": ">= 6" } }, + "node_modules/splaytree": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/splaytree/-/splaytree-3.1.2.tgz", + "integrity": "sha512-4OM2BJgC5UzrhVnnJA4BkHKGtjXNzzUfpQjCO8I05xYPsfS/VuQDwjCGGMi8rYQilHEV4j8NBqTFbls/PZEE7A==" + }, "node_modules/split": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", @@ -27266,6 +27681,12 @@ "node": "*" } }, + "node_modules/turf-jsts": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/turf-jsts/-/turf-jsts-1.2.3.tgz", + "integrity": "sha512-Ja03QIJlPuHt4IQ2FfGex4F4JAr8m3jpaHbFbQrgwr7s7L6U8ocrHiF3J1+wf9jzhGKxvDeaCAnGDot8OjGFyA==", + "license": "(EDL-1.0 OR EPL-1.0)" + }, "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", @@ -27479,6 +27900,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/union": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", + "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", + "dev": true, + "dependencies": { + "qs": "^6.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/unique-filename": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", @@ -28740,6 +29173,32 @@ "node": ">=0.8.0" } }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -29247,7 +29706,10 @@ "version": "18.0.0-next.10", "license": "MIT", "dependencies": { + "@turf/boolean-intersects": "^6.5.0", + "@turf/buffer": "^6.5.0", "@turf/helpers": "^6.5.0", + "@turf/intersect": "^6.5.0", "@turf/line-intersect": "^6.5.0", "@turf/point-on-feature": "^6.5.0", "nosleep.js": "^0.12.0", @@ -29333,7 +29795,6 @@ "projects/igo2": { "name": "igo", "version": "17.0.1", - "extraneous": true, "license": "LiLiQ-R", "dependencies": { "@angular/animations": "^18.2.1", @@ -29395,6 +29856,499 @@ "engines": { "node": ">=18.13.0" } + }, + "projects/igo2/node_modules/@angular-eslint/bundled-angular-compiler": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-18.3.0.tgz", + "integrity": "sha512-v/59FxUKnMzymVce99gV43huxoqXWMb85aKvzlNvLN+ScDu6ZE4YMiTQNpfapVL2lkxhs0uwB3jH17EYd5TcsA==", + "dev": true, + "license": "MIT" + }, + "projects/igo2/node_modules/@angular-eslint/schematics": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-18.3.0.tgz", + "integrity": "sha512-rQ4DEWwf3f5n096GAK6JvXD0SRzRJ52WRaIyKg8MMkk6qvUDfZI8seOkcbjDtZoIe6Ds7DfqSfJgNVte75qvPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/eslint-plugin": "18.3.0", + "@angular-eslint/eslint-plugin-template": "18.3.0", + "ignore": "5.3.2", + "semver": "7.6.3", + "strip-json-comments": "3.1.1" + }, + "peerDependencies": { + "@angular-devkit/core": ">= 18.0.0 < 19.0.0", + "@angular-devkit/schematics": ">= 18.0.0 < 19.0.0" + } + }, + "projects/igo2/node_modules/@angular-eslint/schematics/node_modules/@angular-eslint/eslint-plugin": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-18.3.0.tgz", + "integrity": "sha512-Vl7gfPMXxvtHTjYdlzR161aj5xrqW6T57wd8ToQ7Gqzm0qHGfY6kE4SQobUa2LCYckTNSlv+zXe48C4ah/dSjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "18.3.0", + "@angular-eslint/utils": "18.3.0" + }, + "peerDependencies": { + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "projects/igo2/node_modules/@angular-eslint/schematics/node_modules/@angular-eslint/eslint-plugin-template": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-18.3.0.tgz", + "integrity": "sha512-ddR/qwYbUeq9IpyVKrPbfZyRBTy6V8uc5I0JcBKttQ4CZ4joXhqsVgWFsI+JAMi8E66uNj1VC7NuKCOjDINv2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "18.3.0", + "@angular-eslint/utils": "18.3.0", + "aria-query": "5.3.0", + "axobject-query": "4.1.0" + }, + "peerDependencies": { + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "projects/igo2/node_modules/@angular-eslint/schematics/node_modules/@angular-eslint/utils": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-18.3.0.tgz", + "integrity": "sha512-sCrkHkpxBJZLuCikdboZoawCfc2UgbJv+T14tu2uQCv+Vwzeadnu04vkeY2vTkA8GeBdBij/G9/N/nvwmwVw3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "18.3.0" + }, + "peerDependencies": { + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "projects/igo2/node_modules/@types/jasmine": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.6.4.tgz", + "integrity": "sha512-qCw5sVW+ylTnrEhe5kfX4l6MgU9REXIVDa/lWEcvTOUmd+LqDYwyjovDq+Zk9blElaEHOj1URDQ/djEBVRf+pw==", + "dev": true, + "license": "MIT" + }, + "projects/igo2/node_modules/angular-eslint": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/angular-eslint/-/angular-eslint-18.3.0.tgz", + "integrity": "sha512-neBE3BUtxj1EPPNVww3i/e8DKh/gb+fT/WpDEsRZM//8vS+qb0pMC04dn4bqeUriM05Nq/oUESdwkLuyadJE9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/builder": "18.3.0", + "@angular-eslint/eslint-plugin": "18.3.0", + "@angular-eslint/eslint-plugin-template": "18.3.0", + "@angular-eslint/schematics": "18.3.0", + "@angular-eslint/template-parser": "18.3.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*", + "typescript-eslint": "^8.0.0" + } + }, + "projects/igo2/node_modules/angular-eslint/node_modules/@angular-eslint/builder": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-18.3.0.tgz", + "integrity": "sha512-httEQyqyBw3+0CRtAa7muFxHrauRfkEfk/jmrh5fn2Eiu+I53hAqFPgrwVi1V6AP/kj2zbAiWhd5xM3pMJdoRQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "projects/igo2/node_modules/angular-eslint/node_modules/@angular-eslint/eslint-plugin": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-18.3.0.tgz", + "integrity": "sha512-Vl7gfPMXxvtHTjYdlzR161aj5xrqW6T57wd8ToQ7Gqzm0qHGfY6kE4SQobUa2LCYckTNSlv+zXe48C4ah/dSjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "18.3.0", + "@angular-eslint/utils": "18.3.0" + }, + "peerDependencies": { + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "projects/igo2/node_modules/angular-eslint/node_modules/@angular-eslint/eslint-plugin-template": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-18.3.0.tgz", + "integrity": "sha512-ddR/qwYbUeq9IpyVKrPbfZyRBTy6V8uc5I0JcBKttQ4CZ4joXhqsVgWFsI+JAMi8E66uNj1VC7NuKCOjDINv2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "18.3.0", + "@angular-eslint/utils": "18.3.0", + "aria-query": "5.3.0", + "axobject-query": "4.1.0" + }, + "peerDependencies": { + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "projects/igo2/node_modules/angular-eslint/node_modules/@angular-eslint/eslint-plugin-template/node_modules/@angular-eslint/utils": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-18.3.0.tgz", + "integrity": "sha512-sCrkHkpxBJZLuCikdboZoawCfc2UgbJv+T14tu2uQCv+Vwzeadnu04vkeY2vTkA8GeBdBij/G9/N/nvwmwVw3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "18.3.0" + }, + "peerDependencies": { + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "projects/igo2/node_modules/angular-eslint/node_modules/@angular-eslint/eslint-plugin/node_modules/@angular-eslint/utils": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-18.3.0.tgz", + "integrity": "sha512-sCrkHkpxBJZLuCikdboZoawCfc2UgbJv+T14tu2uQCv+Vwzeadnu04vkeY2vTkA8GeBdBij/G9/N/nvwmwVw3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "18.3.0" + }, + "peerDependencies": { + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "projects/igo2/node_modules/angular-eslint/node_modules/@angular-eslint/template-parser": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-18.3.0.tgz", + "integrity": "sha512-1mUquqcnugI4qsoxcYZKZ6WMi6RPelDcJZg2YqGyuaIuhWmi3ZqJZLErSSpjP60+TbYZu7wM8Kchqa1bwJtEaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "18.3.0", + "eslint-scope": "^8.0.2" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "projects/igo2/node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "projects/igo2/node_modules/conventional-changelog": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-5.1.0.tgz", + "integrity": "sha512-aWyE/P39wGYRPllcCEZDxTVEmhyLzTc9XA6z6rVfkuCD2UBnhV/sgSOKbQrEG5z9mEZJjnopjgQooTKxEg8mAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-changelog-angular": "^7.0.0", + "conventional-changelog-atom": "^4.0.0", + "conventional-changelog-codemirror": "^4.0.0", + "conventional-changelog-conventionalcommits": "^7.0.2", + "conventional-changelog-core": "^7.0.0", + "conventional-changelog-ember": "^4.0.0", + "conventional-changelog-eslint": "^5.0.0", + "conventional-changelog-express": "^4.0.0", + "conventional-changelog-jquery": "^5.0.0", + "conventional-changelog-jshint": "^4.0.0", + "conventional-changelog-preset-loader": "^4.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "projects/igo2/node_modules/conventional-changelog-atom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-4.0.0.tgz", + "integrity": "sha512-q2YtiN7rnT1TGwPTwjjBSIPIzDJCRE+XAUahWxnh+buKK99Kks4WLMHoexw38GXx9OUxAsrp44f9qXe5VEMYhw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "projects/igo2/node_modules/conventional-changelog-cli": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-cli/-/conventional-changelog-cli-4.1.0.tgz", + "integrity": "sha512-MscvILWZ6nWOoC+p/3Nn3D2cVLkjeQjyZPUr0bQ+vUORE/SPrkClJh8BOoMNpS4yk+zFJ5LlgXACxH6XGQoRXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "add-stream": "^1.0.0", + "conventional-changelog": "^5.1.0", + "meow": "^12.0.1", + "tempfile": "^5.0.0" + }, + "bin": { + "conventional-changelog": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, + "projects/igo2/node_modules/conventional-changelog-codemirror": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-4.0.0.tgz", + "integrity": "sha512-hQSojc/5imn1GJK3A75m9hEZZhc3urojA5gMpnar4JHmgLnuM3CUIARPpEk86glEKr3c54Po3WV/vCaO/U8g3Q==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "projects/igo2/node_modules/conventional-changelog-core": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-7.0.0.tgz", + "integrity": "sha512-UYgaB1F/COt7VFjlYKVE/9tTzfU3VUq47r6iWf6lM5T7TlOxr0thI63ojQueRLIpVbrtHK4Ffw+yQGduw2Bhdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@hutson/parse-repository-url": "^5.0.0", + "add-stream": "^1.0.0", + "conventional-changelog-writer": "^7.0.0", + "conventional-commits-parser": "^5.0.0", + "git-raw-commits": "^4.0.0", + "git-semver-tags": "^7.0.0", + "hosted-git-info": "^7.0.0", + "normalize-package-data": "^6.0.0", + "read-pkg": "^8.0.0", + "read-pkg-up": "^10.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "projects/igo2/node_modules/conventional-changelog-ember": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-4.0.0.tgz", + "integrity": "sha512-D0IMhwcJUg1Y8FSry6XAplEJcljkHVlvAZddhhsdbL1rbsqRsMfGx/PIkPYq0ru5aDgn+OxhQ5N5yR7P9mfsvA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "projects/igo2/node_modules/conventional-changelog-eslint": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-5.0.0.tgz", + "integrity": "sha512-6JtLWqAQIeJLn/OzUlYmzd9fKeNSWmQVim9kql+v4GrZwLx807kAJl3IJVc3jTYfVKWLxhC3BGUxYiuVEcVjgA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "projects/igo2/node_modules/conventional-changelog-express": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-4.0.0.tgz", + "integrity": "sha512-yWyy5c7raP9v7aTvPAWzqrztACNO9+FEI1FSYh7UP7YT1AkWgv5UspUeB5v3Ibv4/o60zj2o9GF2tqKQ99lIsw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "projects/igo2/node_modules/conventional-changelog-jquery": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-5.0.0.tgz", + "integrity": "sha512-slLjlXLRNa/icMI3+uGLQbtrgEny3RgITeCxevJB+p05ExiTgHACP5p3XiMKzjBn80n+Rzr83XMYfRInEtCPPw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "projects/igo2/node_modules/conventional-changelog-jshint": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-4.0.0.tgz", + "integrity": "sha512-LyXq1bbl0yG0Ai1SbLxIk8ZxUOe3AjnlwE6sVRQmMgetBk+4gY9EO3d00zlEt8Y8gwsITytDnPORl8al7InTjg==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "projects/igo2/node_modules/conventional-changelog-preset-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-4.1.0.tgz", + "integrity": "sha512-HozQjJicZTuRhCRTq4rZbefaiCzRM2pr6u2NL3XhrmQm4RMnDXfESU6JKu/pnKwx5xtdkYfNCsbhN5exhiKGJA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "projects/igo2/node_modules/conventional-changelog-writer": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-7.0.1.tgz", + "integrity": "sha512-Uo+R9neH3r/foIvQ0MKcsXkX642hdm9odUp7TqgFS7BsalTcjzRlIfWZrZR1gbxOozKucaKt5KAbjW8J8xRSmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-commits-filter": "^4.0.0", + "handlebars": "^4.7.7", + "json-stringify-safe": "^5.0.1", + "meow": "^12.0.1", + "semver": "^7.5.2", + "split2": "^4.0.0" + }, + "bin": { + "conventional-changelog-writer": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, + "projects/igo2/node_modules/conventional-commits-filter": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-4.0.0.tgz", + "integrity": "sha512-rnpnibcSOdFcdclpFwWa+pPlZJhXE7l+XK04zxhbWrhgpR96h33QLz8hITTXbcYICxVr3HZFtbtUAQ+4LdBo9A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "projects/igo2/node_modules/git-semver-tags": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-7.0.1.tgz", + "integrity": "sha512-NY0ZHjJzyyNXHTDZmj+GG7PyuAKtMsyWSwh07CR2hOZFa+/yoTsXci/nF2obzL8UDhakFNkD9gNdt/Ed+cxh2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "meow": "^12.0.1", + "semver": "^7.5.2" + }, + "bin": { + "git-semver-tags": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, + "projects/igo2/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "projects/igo2/node_modules/lines-and-columns": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", + "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "projects/igo2/node_modules/meow": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", + "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "projects/igo2/node_modules/parse-json": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.1.1.tgz", + "integrity": "sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.21.4", + "error-ex": "^1.3.2", + "json-parse-even-better-errors": "^3.0.0", + "lines-and-columns": "^2.0.3", + "type-fest": "^3.8.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "projects/igo2/node_modules/parse-json/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "projects/igo2/node_modules/read-pkg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.1.0.tgz", + "integrity": "sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.1", + "normalize-package-data": "^6.0.0", + "parse-json": "^7.0.0", + "type-fest": "^4.2.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "projects/igo2/node_modules/type-fest": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.29.0.tgz", + "integrity": "sha512-RPYt6dKyemXJe7I6oNstcH24myUGSReicxcHTvCLgzm4e0n8y05dGvcGB15/SoPRBmhlMthWQ9pvKyL81ko8nQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/packages/geo/ng-package.json b/packages/geo/ng-package.json index 1a8a9ca668..805b59c3a3 100644 --- a/packages/geo/ng-package.json +++ b/packages/geo/ng-package.json @@ -9,6 +9,9 @@ "ts-cacheable", "ts-md5", "@turf/helpers", + "@turf/boolean-intersects", + "@turf/buffer", + "@turf/intersect", "@turf/line-intersect", "@turf/point-on-feature" ], diff --git a/packages/geo/package.json b/packages/geo/package.json index b389945a71..c40183df0b 100644 --- a/packages/geo/package.json +++ b/packages/geo/package.json @@ -39,6 +39,9 @@ }, "dependencies": { "@turf/helpers": "^6.5.0", + "@turf/boolean-intersects": "^6.5.0", + "@turf/buffer": "^6.5.0", + "@turf/intersect": "^6.5.0", "@turf/line-intersect": "^6.5.0", "@turf/point-on-feature": "^6.5.0", "nosleep.js": "^0.12.0", diff --git a/packages/geo/src/lib/geometry/shared/geometry.utils.ts b/packages/geo/src/lib/geometry/shared/geometry.utils.ts index d5747576a1..9654065057 100644 --- a/packages/geo/src/lib/geometry/shared/geometry.utils.ts +++ b/packages/geo/src/lib/geometry/shared/geometry.utils.ts @@ -8,9 +8,12 @@ import OlPoint from 'ol/geom/Point'; import OlPolygon from 'ol/geom/Polygon'; import * as olstyle from 'ol/style'; -import { lineString } from '@turf/helpers'; +import booleanIntersects from '@turf/boolean-intersects'; +import buffer from '@turf/buffer'; +import { Units, lineString } from '@turf/helpers'; import lineIntersect from '@turf/line-intersect'; +import { FeatureGeometry } from '../../feature'; import { GeometrySliceLineStringError, GeometrySliceMultiPolygonError, @@ -145,3 +148,30 @@ export function getMousePositionFromOlGeometryEvent(olEvent: BasicEvent) { const olGeometryCast = olGeometry as OlPoint | OlLineString | OlCircle; return olGeometryCast.getFlatCoordinates().slice(-2) as [number, number]; } + +export function doesOlGeometryIntersects( + olGeometry1: OlGeometry, + olGeometry2: OlGeometry +): boolean { + const olGeoJSON = new OlGeoJSON(); + const firstGeom = olGeoJSON.writeGeometryObject(olGeometry1); + const secondGeom = olGeoJSON.writeGeometryObject(olGeometry2); + return booleanIntersects( + firstGeom as FeatureGeometry, + secondGeom as FeatureGeometry + ); +} + +export function bufferOlGeometry( + olGeometry: OlGeometry, + dist: number, + units: Units = 'meters' +): FeatureGeometry { + const olGeoJSON = new OlGeoJSON(); + const bufferedGeom = olGeoJSON.writeGeometryObject( + olGeometry + ) as FeatureGeometry; + + var buffered = buffer(bufferedGeom, dist, { units }); + return buffered.geometry; +} diff --git a/packages/geo/src/lib/workspace/widgets/interactive-selection/interactive-selection.component.html b/packages/geo/src/lib/workspace/widgets/interactive-selection/interactive-selection.component.html new file mode 100644 index 0000000000..ec9dcc079c --- /dev/null +++ b/packages/geo/src/lib/workspace/widgets/interactive-selection/interactive-selection.component.html @@ -0,0 +1,33 @@ + + + +
+ +
+ +
+ + +
+
diff --git a/packages/geo/src/lib/workspace/widgets/interactive-selection/interactive-selection.component.scss b/packages/geo/src/lib/workspace/widgets/interactive-selection/interactive-selection.component.scss new file mode 100644 index 0000000000..684b99fda3 --- /dev/null +++ b/packages/geo/src/lib/workspace/widgets/interactive-selection/interactive-selection.component.scss @@ -0,0 +1,23 @@ +:host { + .close { + margin-top: 1px; + margin-right: 2px; + position: absolute; + top: 0; + right: 0; + } + .actions-container { + button:not(:last-child) { + margin-right: 8px; + } + } + .form-container { + width: 100%; + padding: 10px; + + igo-form-field { + display: block; + height: auto; + } + } +} diff --git a/packages/geo/src/lib/workspace/widgets/interactive-selection/interactive-selection.component.ts b/packages/geo/src/lib/workspace/widgets/interactive-selection/interactive-selection.component.ts new file mode 100644 index 0000000000..5b1b1744a5 --- /dev/null +++ b/packages/geo/src/lib/workspace/widgets/interactive-selection/interactive-selection.component.ts @@ -0,0 +1,327 @@ +import { CommonModule } from '@angular/common'; +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + EventEmitter, + Input, + OnDestroy, + OnInit, + Output +} from '@angular/core'; +import { Validators } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; + +import { OnUpdateInputs } from '@igo2/common/dynamic-component'; +import { + Form, + FormComponent, + FormFieldComponent, + FormService +} from '@igo2/common/form'; +import { WidgetComponent } from '@igo2/common/widget'; +import { IgoLanguageModule, LanguageService } from '@igo2/core/language'; + +import * as olstyle from 'ol/style'; + +import { BehaviorSubject, Observable, Subscription, pairwise } from 'rxjs'; + +import { FeatureStore, featureToOl } from '../../../feature'; +import { FEATURE } from '../../../feature/shared/feature.enums'; +import { + Feature, + FeatureGeometry +} from '../../../feature/shared/feature.interfaces'; +import { + bufferOlGeometry, + doesOlGeometryIntersects +} from '../../../geometry/shared/geometry.utils'; +import { IgoMap } from '../../../map/shared/map'; +import { FeatureWorkspace } from '../../shared/feature-workspace'; +import { WfsWorkspace } from '../../shared/wfs-workspace'; + +interface DataSelectionData { + geometry?: FeatureGeometry; + action?: SelectionAction; + buffer?: string; +} + +enum SelectionAction { + New = 'new', + Add = 'add', + Remove = 'remove' +} + +@Component({ + selector: 'igo-interactive-selection', + templateUrl: './interactive-selection.component.html', + styleUrls: ['./interactive-selection.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [ + CommonModule, + MatButtonModule, + MatIconModule, + IgoLanguageModule, + FormComponent, + FormFieldComponent + ] +}) +export class InteractiveSelectionFormComponent + implements OnInit, OnDestroy, OnUpdateInputs, WidgetComponent +{ + public form$ = new BehaviorSubject
(undefined); + public submitButtonText$ = new BehaviorSubject(undefined); + public submitDisabled = true; + private valueChanges$$: Subscription; + public data$ = new BehaviorSubject({ + geometry: undefined, + buffer: undefined, + action: SelectionAction.Add + }); + @Input() map: IgoMap; + @Input() workspace: FeatureWorkspace | WfsWorkspace; + + /** + * Event emitted on complete + */ + @Output() complete = new EventEmitter(); + + /** + * Event emitted on cancel + */ + @Output() cancel = new EventEmitter(); + + constructor( + private cdRef: ChangeDetectorRef, + private formService: FormService, + private languageService: LanguageService + ) {} + ngOnInit(): void { + const fieldConfigs = [ + { + name: 'geometry', + title: '', + type: 'geometry', + options: { + validator: Validators.required + }, + inputs: { + map: this.map, + geometryTypeField: true, + geometryType: 'Polygon', + drawGuideField: false, + drawGuide: 0, + drawGuidePlaceholder: '', + drawStyle: new olstyle.Style({ + stroke: new olstyle.Stroke({ + color: [255, 0, 0, 1], + width: 2 + }), + fill: new olstyle.Fill({ + color: [255, 0, 0, 0.2] + }), + image: new olstyle.Circle({ + radius: 8, + stroke: new olstyle.Stroke({ + color: [255, 0, 0, 1] + }), + fill: new olstyle.Fill({ + color: [255, 0, 0, 0.2] + }) + }) + }), + overlayStyle: new olstyle.Style({ + stroke: new olstyle.Stroke({ + color: [0, 255, 0, 1], + width: 2 + }), + fill: new olstyle.Fill({ + color: [0, 255, 0, 0.2] + }), + image: new olstyle.Circle({ + radius: 8, + stroke: new olstyle.Stroke({ + color: [0, 255, 0, 1] + }), + fill: new olstyle.Fill({ + color: [0, 255, 0, 0.2] + }) + }) + }) + } + }, + { + name: 'action', + title: this.languageService.translate.instant( + 'igo.geo.workspace.widget.interactiveSelection.action.title' + ), + type: 'select', + options: { + cols: 1, + validator: Validators.required + }, + inputs: { + choices: [ + { + value: SelectionAction.New, + title: this.languageService.translate.instant( + 'igo.geo.workspace.widget.interactiveSelection.selection.new' + ) + }, + { + value: SelectionAction.Add, + title: this.languageService.translate.instant( + 'igo.geo.workspace.widget.interactiveSelection.selection.add' + ) + }, + { + value: SelectionAction.Remove, + title: this.languageService.translate.instant( + 'igo.geo.workspace.widget.interactiveSelection.selection.remove' + ) + } + ] + } + }, + { + name: 'buffer', + title: this.languageService.translate.instant( + 'igo.geo.workspace.widget.interactiveSelection.buffer.title' + ), + type: 'text', + options: { + cols: 1, + validator: Validators.pattern(/^\d+$/) + } + } + ]; + this.setAction(SelectionAction.Add); + + const fields = fieldConfigs.map((config) => this.formService.field(config)); + const form = this.formService.form(fields, []); + + this.valueChanges$$ = ( + form.control.valueChanges satisfies Observable + ) + .pipe(pairwise()) + .subscribe(([previous, current]) => { + const currentValues = current; + if (previous?.action !== current.action) { + currentValues.buffer = undefined; + } + this.data$.next(currentValues); + this.submitDisabled = !form.control.valid; + if ( + !currentValues || + !currentValues.action || + currentValues.action === SelectionAction.Add + ) { + this.setAction(SelectionAction.Add); + } else if (currentValues.action === SelectionAction.New) { + this.setAction(SelectionAction.New); + } else if (currentValues.action === SelectionAction.Remove) { + this.setAction(SelectionAction.Remove); + } + }); + + this.form$.next(form); + } + + private setAction(action: SelectionAction) { + this.submitButtonText$.next( + `igo.geo.workspace.widget.interactiveSelection.selection.${action}` + ); + } + + ngOnDestroy() { + this.valueChanges$$.unsubscribe(); + } + + /** + * Implemented as part of OnUpdateInputs + */ + onUpdateInputs() { + this.cdRef.detectChanges(); + } + + /** + * On close, emit the cancel event + */ + onClose() { + this.cancel.emit(); + } + + onSubmit(data: DataSelectionData) { + const featureStore = this.workspace.entityStore as FeatureStore; + const storeFeatures = featureStore.all(); + + const buffer = data.buffer ? +data.buffer : undefined; + + const formFeature: Feature = { + type: FEATURE, + geometry: data.geometry, + projection: 'EPSG:4326', + properties: {} + }; + let olFormFeature = featureToOl(formFeature, 'EPSG:4326'); + if (buffer) { + const bufferedGeom = bufferOlGeometry( + olFormFeature.getGeometry(), + buffer, + 'meters' + ); + const bufferedFeature: Feature = { + type: FEATURE, + geometry: bufferedGeom, + projection: 'EPSG:4326', + properties: {} + }; + olFormFeature = featureToOl(bufferedFeature, 'EPSG:4326'); + } + + const intersectingFeatures = storeFeatures + .map((storeFeature) => { + const doesIntersects = doesOlGeometryIntersects( + featureToOl(storeFeature, 'EPSG:4326').getGeometry(), + olFormFeature.getGeometry() + ); + return doesIntersects ? storeFeature : undefined; + }) + .filter((f) => f); + + let selectedStateToApply = false; + let exclusive = false; + if (intersectingFeatures.length) { + if ([SelectionAction.New, SelectionAction.Add].includes(data.action)) { + selectedStateToApply = true; + exclusive = data.action === SelectionAction.New ? true : false; + } else if (SelectionAction.Remove) { + selectedStateToApply = false; + exclusive = false; + } + featureStore.state.updateMany( + intersectingFeatures, + { selected: selectedStateToApply }, + exclusive + ); + } + this.data$.next( + Object.assign({}, this.data$.getValue(), { geometry: undefined }) + ); + } + + clear() { + const featureStore = this.workspace.entityStore as FeatureStore; + featureStore.state.updateAll({ selected: false }); + this.form$.value.control.reset(); + this.setAction(SelectionAction.Add); + this.data$.next( + Object.assign({}, this.data$.getValue(), { + geometry: undefined, + action: SelectionAction.Add + }) + ); + } +} diff --git a/packages/geo/src/lib/workspace/widgets/ogc-filter/ogc-filter.component.html b/packages/geo/src/lib/workspace/widgets/ogc-filter/ogc-filter.component.html index 9cd4150cc5..528b108ae3 100644 --- a/packages/geo/src/lib/workspace/widgets/ogc-filter/ogc-filter.component.html +++ b/packages/geo/src/lib/workspace/widgets/ogc-filter/ogc-filter.component.html @@ -1,3 +1,6 @@ + ('OgcFilterWidget'); +export const InteractiveSelectionFormWidget = new InjectionToken( + 'InteractiveSelectionFormWidget' +); export function ogcFilterWidgetFactory(widgetService: WidgetService): Widget { return widgetService.create(OgcFilterComponent); @@ -17,3 +21,17 @@ export function provideOgcFilterWidget() { deps: [WidgetService] }; } + +export function interactiveSelectionFormWidgetFactory( + widgetService: WidgetService +): Widget { + return widgetService.create(InteractiveSelectionFormComponent); +} + +export function provideInteractiveSelectionFormWidget() { + return { + provide: InteractiveSelectionFormWidget, + useFactory: interactiveSelectionFormWidgetFactory, + deps: [WidgetService] + }; +} diff --git a/packages/geo/src/lib/workspace/workspace.module.ts b/packages/geo/src/lib/workspace/workspace.module.ts index 6cfc785e8a..6c86531cf7 100644 --- a/packages/geo/src/lib/workspace/workspace.module.ts +++ b/packages/geo/src/lib/workspace/workspace.module.ts @@ -4,7 +4,10 @@ import { MatDialogModule } from '@angular/material/dialog'; import { IgoWidgetModule } from '@igo2/common/widget'; import { IgoOgcFilterModule } from './widgets/ogc-filter/ogc-filter.module'; -import { provideOgcFilterWidget } from './widgets/widgets'; +import { + provideInteractiveSelectionFormWidget, + provideOgcFilterWidget +} from './widgets/widgets'; import { IgoWorkspaceSelectorModule } from './workspace-selector/workspace-selector.module'; @NgModule({ @@ -15,6 +18,6 @@ import { IgoWorkspaceSelectorModule } from './workspace-selector/workspace-selec MatDialogModule ], exports: [IgoOgcFilterModule], - providers: [provideOgcFilterWidget()] + providers: [provideOgcFilterWidget(), provideInteractiveSelectionFormWidget()] }) export class IgoGeoWorkspaceModule {} diff --git a/packages/geo/src/locale/en.geo.json b/packages/geo/src/locale/en.geo.json index 716989b6ba..b2ca1bb104 100644 --- a/packages/geo/src/locale/en.geo.json +++ b/packages/geo/src/locale/en.geo.json @@ -820,8 +820,20 @@ "addError": "An error has occured. Entity could not be added.", "modifyError": "An error has occured. Entity could not be modified.", "cancel": "Cancel", - "inMapExtent.active.tooltip": "Ne montrer que les entités contenues dans la carte", - "inMapExtent.inactive.tooltip": "Montrer tous les entités" + "inMapExtent.active.tooltip": "Show only features contained in the map", + "inMapExtent.inactive.tooltip": "Show all features", + "widget": { + "interactiveSelection": { + "selection.add": "Add to the current selection", + "selection.new": "Select", + "selection.remove": "Remove from the current selection", + "reset": { + "button": "Reset" + }, + "action.title": "How to handle results", + "buffer.title": "Buffer size (meters)" + } + } }, "formValidation": { "mandatory": "{{column}} is mandatory", diff --git a/packages/geo/src/locale/fr.geo.json b/packages/geo/src/locale/fr.geo.json index 9ee0c8f85a..31562ea3c5 100644 --- a/packages/geo/src/locale/fr.geo.json +++ b/packages/geo/src/locale/fr.geo.json @@ -821,7 +821,19 @@ "modifyError": "Un problème est survenu. L'entité n'a pas pu être modifiée.", "cancel": "Annuler", "inMapExtent.active.tooltip": "Ne montrer que les enregistrements contenus dans la carte", - "inMapExtent.inactive.tooltip": "Montrer tous les enregistrements" + "inMapExtent.inactive.tooltip": "Montrer tous les enregistrements", + "widget": { + "interactiveSelection": { + "selection.add": "Ajouter à la présente sélection", + "selection.new": "Effectuer la sélection", + "selection.remove": "Supprimer les résultats de la sélection", + "reset": { + "button": "Réinitialiser" + }, + "action.title": "Action à faire avec le résultat de la présente sélection", + "buffer.title": "Taille de la zone tampon en mètre" + } + } }, "formValidation": { "mandatory": "{{column}}est un champ obligatoire", diff --git a/packages/integration/src/lib/workspace/shared/feature-actions.service.ts b/packages/integration/src/lib/workspace/shared/feature-actions.service.ts index f280be4e0a..aeb6441e71 100644 --- a/packages/integration/src/lib/workspace/shared/feature-actions.service.ts +++ b/packages/integration/src/lib/workspace/shared/feature-actions.service.ts @@ -1,6 +1,7 @@ -import { Injectable, OnDestroy } from '@angular/core'; +import { Inject, Injectable, OnDestroy } from '@angular/core'; import { Action } from '@igo2/common/action'; +import { Widget } from '@igo2/common/widget'; import { LanguageService } from '@igo2/core/language'; import { MediaService } from '@igo2/core/media'; import { @@ -8,7 +9,7 @@ import { StorageServiceEvent, StorageServiceEventEnum } from '@igo2/core/storage'; -import { FeatureWorkspace } from '@igo2/geo'; +import { FeatureWorkspace, InteractiveSelectionFormWidget } from '@igo2/geo'; import { BehaviorSubject, Subscription } from 'rxjs'; import { skipWhile } from 'rxjs/operators'; @@ -35,6 +36,8 @@ export class FeatureActionsService implements OnDestroy { } constructor( + @Inject(InteractiveSelectionFormWidget) + private interactiveSelectionFormWidget: Widget, private storageState: StorageState, public languageService: LanguageService, private toolState: ToolState, @@ -92,7 +95,8 @@ export class FeatureActionsService implements OnDestroy { this.storageService, this.languageService, this.mediaService, - this.toolState + this.toolState, + this.interactiveSelectionFormWidget ); } } diff --git a/packages/integration/src/lib/workspace/shared/wfs-actions.service.ts b/packages/integration/src/lib/workspace/shared/wfs-actions.service.ts index b37a0fd80c..290cb8a932 100644 --- a/packages/integration/src/lib/workspace/shared/wfs-actions.service.ts +++ b/packages/integration/src/lib/workspace/shared/wfs-actions.service.ts @@ -9,7 +9,11 @@ import { StorageServiceEvent, StorageServiceEventEnum } from '@igo2/core/storage'; -import { OgcFilterWidget, WfsWorkspace } from '@igo2/geo'; +import { + InteractiveSelectionFormWidget, + OgcFilterWidget, + WfsWorkspace +} from '@igo2/geo'; import { BehaviorSubject, Subscription } from 'rxjs'; import { skipWhile } from 'rxjs/operators'; @@ -38,6 +42,9 @@ export class WfsActionsService implements OnDestroy { } constructor( + @Optional() + @Inject(InteractiveSelectionFormWidget) + private interactiveSelectionFormWidget: Widget, @Optional() @Inject(OgcFilterWidget) private ogcFilterWidget: Widget, @@ -98,7 +105,8 @@ export class WfsActionsService implements OnDestroy { this.storageService, this.languageService, this.mediaService, - this.toolState + this.toolState, + this.interactiveSelectionFormWidget ); } } diff --git a/packages/integration/src/lib/workspace/shared/workspace.utils.ts b/packages/integration/src/lib/workspace/shared/workspace.utils.ts index 1fd56ba5fc..9e8ed5cac6 100644 --- a/packages/integration/src/lib/workspace/shared/workspace.utils.ts +++ b/packages/integration/src/lib/workspace/shared/workspace.utils.ts @@ -49,7 +49,8 @@ export function getWorkspaceActions( storageService: StorageService, languageService: LanguageService, mediaService: MediaService, - toolState: ToolState + toolState: ToolState, + interactiveSelectionFormWidget?: Widget ): Action[] { const actions = [ { @@ -142,6 +143,19 @@ export function getWorkspaceActions( }, args: [ogcFilterWidget, workspace] }, + { + id: 'interactiveSelect', + icon: 'select-marker', + title: 'igo.integration.workspace.interactiveSelection.title', + tooltip: 'igo.integration.workspace.interactiveSelection.tooltip', + handler: (widget: Widget, ws: FeatureWorkspace | WfsWorkspace) => { + ws.activateWidget(widget, { + map: ws.map, + workspace: ws + }); + }, + args: [interactiveSelectionFormWidget, workspace] + }, { id: 'maximize', title: languageService.translate.instant( diff --git a/packages/integration/src/locale/en.integration.json b/packages/integration/src/locale/en.integration.json index 27db49428e..1286af3cd2 100644 --- a/packages/integration/src/locale/en.integration.json +++ b/packages/integration/src/locale/en.integration.json @@ -85,7 +85,9 @@ "maximize": "Extend", "maximizeTooltip": "Extend panel", "standardExtent": "Reduce", - "standardExtentTooltip": "Reduce panel" + "standardExtentTooltip": "Reduce panel", + "interactiveSelection.title": "Select features by geometry", + "interactiveSelection.tooltip": "Select features by geometry" }, "directions": { "warning": { diff --git a/packages/integration/src/locale/fr.integration.json b/packages/integration/src/locale/fr.integration.json index c869c11bde..b7002c59d2 100644 --- a/packages/integration/src/locale/fr.integration.json +++ b/packages/integration/src/locale/fr.integration.json @@ -85,7 +85,9 @@ "maximize": "Agrandir", "maximizeTooltip": "Agrandir la fenêtre", "standardExtent": "Réduire", - "standardExtentTooltip": "Réduire la fenêtre" + "standardExtentTooltip": "Réduire la fenêtre", + "interactiveSelection.title": "Sélectioner les entités par géométrie", + "interactiveSelection.tooltip": "Sélectioner les entités par géométrie" }, "directions": { "warning": {