diff --git a/index.html b/index.html
index fefe10d..f99b382 100644
--- a/index.html
+++ b/index.html
@@ -119,10 +119,10 @@
+
diff --git a/package-lock.json b/package-lock.json
index 0a6bf6f..d70a4d6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -50,9 +50,9 @@
}
},
"node_modules/@babel/compat-data": {
- "version": "7.13.11",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.11.tgz",
- "integrity": "sha512-BwKEkO+2a67DcFeS3RLl0Z3Gs2OvdXewuWjc1Hfokhb5eQWP9YRYH1/+VrVZvql2CfjOiNGqSAFOYt4lsqTHzg==",
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.12.tgz",
+ "integrity": "sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ==",
"dev": true
},
"node_modules/@babel/core": {
@@ -219,38 +219,37 @@
}
},
"node_modules/@babel/helper-member-expression-to-functions": {
- "version": "7.13.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.0.tgz",
- "integrity": "sha512-yvRf8Ivk62JwisqV1rFRMxiSMDGnN6KH1/mDMmIrij4jztpQNRoHqqMG3U6apYbGRPJpgPalhva9Yd06HlUxJQ==",
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz",
+ "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.13.0"
+ "@babel/types": "^7.13.12"
}
},
"node_modules/@babel/helper-module-imports": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz",
- "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==",
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz",
+ "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.12.13"
+ "@babel/types": "^7.13.12"
}
},
"node_modules/@babel/helper-module-transforms": {
- "version": "7.13.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.0.tgz",
- "integrity": "sha512-Ls8/VBwH577+pw7Ku1QkUWIyRRNHpYlts7+qSqBBFCW3I8QteB9DxfcZ5YJpOwH6Ihe/wn8ch7fMGOP1OhEIvw==",
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.12.tgz",
+ "integrity": "sha512-7zVQqMO3V+K4JOOj40kxiCrMf6xlQAkewBB0eu2b03OO/Q21ZutOzjpfD79A5gtE/2OWi1nv625MrDlGlkbknQ==",
"dev": true,
"dependencies": {
- "@babel/helper-module-imports": "^7.12.13",
- "@babel/helper-replace-supers": "^7.13.0",
- "@babel/helper-simple-access": "^7.12.13",
+ "@babel/helper-module-imports": "^7.13.12",
+ "@babel/helper-replace-supers": "^7.13.12",
+ "@babel/helper-simple-access": "^7.13.12",
"@babel/helper-split-export-declaration": "^7.12.13",
"@babel/helper-validator-identifier": "^7.12.11",
"@babel/template": "^7.12.13",
"@babel/traverse": "^7.13.0",
- "@babel/types": "^7.13.0",
- "lodash": "^4.17.19"
+ "@babel/types": "^7.13.12"
}
},
"node_modules/@babel/helper-optimise-call-expression": {
@@ -280,24 +279,24 @@
}
},
"node_modules/@babel/helper-replace-supers": {
- "version": "7.13.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.0.tgz",
- "integrity": "sha512-Segd5me1+Pz+rmN/NFBOplMbZG3SqRJOBlY+mA0SxAv6rjj7zJqr1AVr3SfzUVTLCv7ZLU5FycOM/SBGuLPbZw==",
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz",
+ "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==",
"dev": true,
"dependencies": {
- "@babel/helper-member-expression-to-functions": "^7.13.0",
+ "@babel/helper-member-expression-to-functions": "^7.13.12",
"@babel/helper-optimise-call-expression": "^7.12.13",
"@babel/traverse": "^7.13.0",
- "@babel/types": "^7.13.0"
+ "@babel/types": "^7.13.12"
}
},
"node_modules/@babel/helper-simple-access": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz",
- "integrity": "sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA==",
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz",
+ "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.12.13"
+ "@babel/types": "^7.13.12"
}
},
"node_modules/@babel/helper-skip-transparent-expression-wrappers": {
@@ -365,9 +364,9 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.13.11",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.11.tgz",
- "integrity": "sha512-PhuoqeHoO9fc4ffMEVk4qb/w/s2iOSWohvbHxLtxui0eBg3Lg5gN1U8wp1V1u61hOWkPQJJyJzGH6Y+grwkq8Q==",
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.12.tgz",
+ "integrity": "sha512-4T7Pb244rxH24yR116LAuJ+adxXXnHhZaLJjegJVKSdoNCe4x1eDBaud5YIcQFcqzsaD5BHvJw5BQ0AZapdCRw==",
"dev": true,
"bin": {
"parser": "bin/babel-parser.js"
@@ -376,6 +375,20 @@
"node": ">=6.0.0"
}
},
+ "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz",
+ "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.13.0",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1",
+ "@babel/plugin-proposal-optional-chaining": "^7.13.12"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.13.0"
+ }
+ },
"node_modules/@babel/plugin-proposal-async-generator-functions": {
"version": "7.13.8",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.8.tgz",
@@ -525,9 +538,9 @@
}
},
"node_modules/@babel/plugin-proposal-optional-chaining": {
- "version": "7.13.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.8.tgz",
- "integrity": "sha512-hpbBwbTgd7Cz1QryvwJZRo1U0k1q8uyBmeXOSQUjdg/A2TASkhR/rz7AyqZ/kS8kbpsNA80rOYbxySBJAqmhhQ==",
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz",
+ "integrity": "sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.13.0",
@@ -1149,15 +1162,16 @@
}
},
"node_modules/@babel/preset-env": {
- "version": "7.13.10",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.13.10.tgz",
- "integrity": "sha512-nOsTScuoRghRtUsRr/c69d042ysfPHcu+KOB4A9aAO9eJYqrkat+LF8G1yp1HD18QiwixT2CisZTr/0b3YZPXQ==",
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.13.12.tgz",
+ "integrity": "sha512-JzElc6jk3Ko6zuZgBtjOd01pf9yYDEIH8BcqVuYIuOkzOwDesoa/Nz4gIo4lBG6K861KTV9TvIgmFuT6ytOaAA==",
"dev": true,
"dependencies": {
- "@babel/compat-data": "^7.13.8",
+ "@babel/compat-data": "^7.13.12",
"@babel/helper-compilation-targets": "^7.13.10",
"@babel/helper-plugin-utils": "^7.13.0",
"@babel/helper-validator-option": "^7.12.17",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12",
"@babel/plugin-proposal-async-generator-functions": "^7.13.8",
"@babel/plugin-proposal-class-properties": "^7.13.0",
"@babel/plugin-proposal-dynamic-import": "^7.13.8",
@@ -1168,7 +1182,7 @@
"@babel/plugin-proposal-numeric-separator": "^7.12.13",
"@babel/plugin-proposal-object-rest-spread": "^7.13.8",
"@babel/plugin-proposal-optional-catch-binding": "^7.13.8",
- "@babel/plugin-proposal-optional-chaining": "^7.13.8",
+ "@babel/plugin-proposal-optional-chaining": "^7.13.12",
"@babel/plugin-proposal-private-methods": "^7.13.0",
"@babel/plugin-proposal-unicode-property-regex": "^7.12.13",
"@babel/plugin-syntax-async-generators": "^7.8.4",
@@ -1216,7 +1230,7 @@
"@babel/plugin-transform-unicode-escapes": "^7.12.13",
"@babel/plugin-transform-unicode-regex": "^7.12.13",
"@babel/preset-modules": "^0.1.4",
- "@babel/types": "^7.13.0",
+ "@babel/types": "^7.13.12",
"babel-plugin-polyfill-corejs2": "^0.1.4",
"babel-plugin-polyfill-corejs3": "^0.1.3",
"babel-plugin-polyfill-regenerator": "^0.1.2",
@@ -1281,9 +1295,9 @@
}
},
"node_modules/@babel/types": {
- "version": "7.13.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.0.tgz",
- "integrity": "sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==",
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.12.tgz",
+ "integrity": "sha512-K4nY2xFN4QMvQwkQ+zmBDp6ANMbVNw6BbxWmYA4qNjhR9W+Lj/8ky5MEY2Me5r+B2c6/v6F53oMndG+f9s3IiA==",
"dev": true,
"dependencies": {
"@babel/helper-validator-identifier": "^7.12.11",
@@ -2009,9 +2023,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001202",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001202.tgz",
- "integrity": "sha512-ZcijQNqrcF8JNLjzvEiXqX4JUYxoZa7Pvcsd9UD8Kz4TvhTonOSNRsK+qtvpVL4l6+T1Rh4LFtLfnNWg6BGWCQ==",
+ "version": "1.0.30001204",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001204.tgz",
+ "integrity": "sha512-JUdjWpcxfJ9IPamy2f5JaRDCaqJOxDzOSKtbdx4rH9VivMd1vIzoPumsJa9LoMIi4Fx2BV2KZOxWhNkBjaYivQ==",
"dev": true
},
"node_modules/caseless": {
@@ -2434,9 +2448,9 @@
}
},
"node_modules/css-loader/node_modules/semver": {
- "version": "7.3.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
- "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
@@ -2611,9 +2625,9 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.3.690",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.690.tgz",
- "integrity": "sha512-zPbaSv1c8LUKqQ+scNxJKv01RYFkVVF1xli+b+3Ty8ONujHjAMg+t/COmdZqrtnS1gT+g4hbSodHillymt1Lww==",
+ "version": "1.3.695",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.695.tgz",
+ "integrity": "sha512-lz66RliUqLHU1Ojxx1A4QUxKydjiQ79Y4dZyPobs2Dmxj5aVL2TM3KoQ2Gs7HS703Bfny+ukI3KOxwAB0xceHQ==",
"dev": true
},
"node_modules/emoji-regex": {
@@ -4132,9 +4146,9 @@
}
},
"node_modules/node-gyp/node_modules/semver": {
- "version": "7.3.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
- "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
@@ -4678,9 +4692,9 @@
}
},
"node_modules/queue-microtask": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz",
- "integrity": "sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg==",
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
"dev": true,
"funding": [
{
@@ -4891,9 +4905,9 @@
"dev": true
},
"node_modules/regjsparser": {
- "version": "0.6.7",
- "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.7.tgz",
- "integrity": "sha512-ib77G0uxsA2ovgiYbCVGx4Pv3PSttAx2vIwidqQzbL2U5S4Q+j00HdSAneSBuyVcMvEnTXMjiGgB+DlXozVhpQ==",
+ "version": "0.6.8",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.8.tgz",
+ "integrity": "sha512-3weFrFQREJhJ2PW+iCGaG6TenyzNSZgsBKZ/oEf6Trme31COSeIWhHw9O6FPkuXktfx+b6Hf/5e6dKPHaROq2g==",
"dev": true,
"dependencies": {
"jsesc": "~0.5.0"
@@ -5834,9 +5848,9 @@
}
},
"node_modules/terser": {
- "version": "5.6.0",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.6.0.tgz",
- "integrity": "sha512-vyqLMoqadC1uR0vywqOZzriDYzgEkNJFK4q9GeyOBHIbiECHiWLKcWfbQWAUaPfxkjDhapSlZB9f7fkMrvkVjA==",
+ "version": "5.6.1",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.6.1.tgz",
+ "integrity": "sha512-yv9YLFQQ+3ZqgWCUk+pvNJwgUTdlIxUk1WTN+RnaFJe2L7ipG2csPT0ra2XRm7Cs8cxN7QXmK1rFzEwYEQkzXw==",
"dev": true,
"dependencies": {
"commander": "^2.20.0",
@@ -6211,9 +6225,9 @@
}
},
"node_modules/webpack": {
- "version": "5.26.3",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.26.3.tgz",
- "integrity": "sha512-z/F2lt2N1fZqaud1B4SzjL3OW03eULThbBXQ2OX4LSrZX4N9k1A5d0Rje3zS2g887DTWyAV0KGqEf64ois2dhg==",
+ "version": "5.27.2",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.27.2.tgz",
+ "integrity": "sha512-brNF3N/EdvMzkaZ/Xzb8sqPn5Si3iw6meqCnmNFtcnkorZsFZCBFMa2ElpIMjx6sKWYsnUpBO2dnX+7xgj+mjg==",
"dev": true,
"dependencies": {
"@types/eslint-scope": "^3.7.0",
@@ -6305,9 +6319,9 @@
}
},
"node_modules/webpack-cli/node_modules/commander": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-7.1.0.tgz",
- "integrity": "sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
"dev": true,
"engines": {
"node": ">= 10"
@@ -6636,9 +6650,9 @@
}
},
"@babel/compat-data": {
- "version": "7.13.11",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.11.tgz",
- "integrity": "sha512-BwKEkO+2a67DcFeS3RLl0Z3Gs2OvdXewuWjc1Hfokhb5eQWP9YRYH1/+VrVZvql2CfjOiNGqSAFOYt4lsqTHzg==",
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.12.tgz",
+ "integrity": "sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ==",
"dev": true
},
"@babel/core": {
@@ -6786,38 +6800,37 @@
}
},
"@babel/helper-member-expression-to-functions": {
- "version": "7.13.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.0.tgz",
- "integrity": "sha512-yvRf8Ivk62JwisqV1rFRMxiSMDGnN6KH1/mDMmIrij4jztpQNRoHqqMG3U6apYbGRPJpgPalhva9Yd06HlUxJQ==",
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz",
+ "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==",
"dev": true,
"requires": {
- "@babel/types": "^7.13.0"
+ "@babel/types": "^7.13.12"
}
},
"@babel/helper-module-imports": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz",
- "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==",
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz",
+ "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==",
"dev": true,
"requires": {
- "@babel/types": "^7.12.13"
+ "@babel/types": "^7.13.12"
}
},
"@babel/helper-module-transforms": {
- "version": "7.13.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.0.tgz",
- "integrity": "sha512-Ls8/VBwH577+pw7Ku1QkUWIyRRNHpYlts7+qSqBBFCW3I8QteB9DxfcZ5YJpOwH6Ihe/wn8ch7fMGOP1OhEIvw==",
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.12.tgz",
+ "integrity": "sha512-7zVQqMO3V+K4JOOj40kxiCrMf6xlQAkewBB0eu2b03OO/Q21ZutOzjpfD79A5gtE/2OWi1nv625MrDlGlkbknQ==",
"dev": true,
"requires": {
- "@babel/helper-module-imports": "^7.12.13",
- "@babel/helper-replace-supers": "^7.13.0",
- "@babel/helper-simple-access": "^7.12.13",
+ "@babel/helper-module-imports": "^7.13.12",
+ "@babel/helper-replace-supers": "^7.13.12",
+ "@babel/helper-simple-access": "^7.13.12",
"@babel/helper-split-export-declaration": "^7.12.13",
"@babel/helper-validator-identifier": "^7.12.11",
"@babel/template": "^7.12.13",
"@babel/traverse": "^7.13.0",
- "@babel/types": "^7.13.0",
- "lodash": "^4.17.19"
+ "@babel/types": "^7.13.12"
}
},
"@babel/helper-optimise-call-expression": {
@@ -6847,24 +6860,24 @@
}
},
"@babel/helper-replace-supers": {
- "version": "7.13.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.0.tgz",
- "integrity": "sha512-Segd5me1+Pz+rmN/NFBOplMbZG3SqRJOBlY+mA0SxAv6rjj7zJqr1AVr3SfzUVTLCv7ZLU5FycOM/SBGuLPbZw==",
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz",
+ "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==",
"dev": true,
"requires": {
- "@babel/helper-member-expression-to-functions": "^7.13.0",
+ "@babel/helper-member-expression-to-functions": "^7.13.12",
"@babel/helper-optimise-call-expression": "^7.12.13",
"@babel/traverse": "^7.13.0",
- "@babel/types": "^7.13.0"
+ "@babel/types": "^7.13.12"
}
},
"@babel/helper-simple-access": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz",
- "integrity": "sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA==",
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz",
+ "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==",
"dev": true,
"requires": {
- "@babel/types": "^7.12.13"
+ "@babel/types": "^7.13.12"
}
},
"@babel/helper-skip-transparent-expression-wrappers": {
@@ -6932,11 +6945,22 @@
}
},
"@babel/parser": {
- "version": "7.13.11",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.11.tgz",
- "integrity": "sha512-PhuoqeHoO9fc4ffMEVk4qb/w/s2iOSWohvbHxLtxui0eBg3Lg5gN1U8wp1V1u61hOWkPQJJyJzGH6Y+grwkq8Q==",
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.12.tgz",
+ "integrity": "sha512-4T7Pb244rxH24yR116LAuJ+adxXXnHhZaLJjegJVKSdoNCe4x1eDBaud5YIcQFcqzsaD5BHvJw5BQ0AZapdCRw==",
"dev": true
},
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz",
+ "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.13.0",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1",
+ "@babel/plugin-proposal-optional-chaining": "^7.13.12"
+ }
+ },
"@babel/plugin-proposal-async-generator-functions": {
"version": "7.13.8",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.8.tgz",
@@ -7053,9 +7077,9 @@
}
},
"@babel/plugin-proposal-optional-chaining": {
- "version": "7.13.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.8.tgz",
- "integrity": "sha512-hpbBwbTgd7Cz1QryvwJZRo1U0k1q8uyBmeXOSQUjdg/A2TASkhR/rz7AyqZ/kS8kbpsNA80rOYbxySBJAqmhhQ==",
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz",
+ "integrity": "sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.13.0",
@@ -7527,15 +7551,16 @@
}
},
"@babel/preset-env": {
- "version": "7.13.10",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.13.10.tgz",
- "integrity": "sha512-nOsTScuoRghRtUsRr/c69d042ysfPHcu+KOB4A9aAO9eJYqrkat+LF8G1yp1HD18QiwixT2CisZTr/0b3YZPXQ==",
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.13.12.tgz",
+ "integrity": "sha512-JzElc6jk3Ko6zuZgBtjOd01pf9yYDEIH8BcqVuYIuOkzOwDesoa/Nz4gIo4lBG6K861KTV9TvIgmFuT6ytOaAA==",
"dev": true,
"requires": {
- "@babel/compat-data": "^7.13.8",
+ "@babel/compat-data": "^7.13.12",
"@babel/helper-compilation-targets": "^7.13.10",
"@babel/helper-plugin-utils": "^7.13.0",
"@babel/helper-validator-option": "^7.12.17",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12",
"@babel/plugin-proposal-async-generator-functions": "^7.13.8",
"@babel/plugin-proposal-class-properties": "^7.13.0",
"@babel/plugin-proposal-dynamic-import": "^7.13.8",
@@ -7546,7 +7571,7 @@
"@babel/plugin-proposal-numeric-separator": "^7.12.13",
"@babel/plugin-proposal-object-rest-spread": "^7.13.8",
"@babel/plugin-proposal-optional-catch-binding": "^7.13.8",
- "@babel/plugin-proposal-optional-chaining": "^7.13.8",
+ "@babel/plugin-proposal-optional-chaining": "^7.13.12",
"@babel/plugin-proposal-private-methods": "^7.13.0",
"@babel/plugin-proposal-unicode-property-regex": "^7.12.13",
"@babel/plugin-syntax-async-generators": "^7.8.4",
@@ -7594,7 +7619,7 @@
"@babel/plugin-transform-unicode-escapes": "^7.12.13",
"@babel/plugin-transform-unicode-regex": "^7.12.13",
"@babel/preset-modules": "^0.1.4",
- "@babel/types": "^7.13.0",
+ "@babel/types": "^7.13.12",
"babel-plugin-polyfill-corejs2": "^0.1.4",
"babel-plugin-polyfill-corejs3": "^0.1.3",
"babel-plugin-polyfill-regenerator": "^0.1.2",
@@ -7653,9 +7678,9 @@
}
},
"@babel/types": {
- "version": "7.13.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.0.tgz",
- "integrity": "sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==",
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.12.tgz",
+ "integrity": "sha512-K4nY2xFN4QMvQwkQ+zmBDp6ANMbVNw6BbxWmYA4qNjhR9W+Lj/8ky5MEY2Me5r+B2c6/v6F53oMndG+f9s3IiA==",
"dev": true,
"requires": {
"@babel/helper-validator-identifier": "^7.12.11",
@@ -8258,9 +8283,9 @@
}
},
"caniuse-lite": {
- "version": "1.0.30001202",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001202.tgz",
- "integrity": "sha512-ZcijQNqrcF8JNLjzvEiXqX4JUYxoZa7Pvcsd9UD8Kz4TvhTonOSNRsK+qtvpVL4l6+T1Rh4LFtLfnNWg6BGWCQ==",
+ "version": "1.0.30001204",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001204.tgz",
+ "integrity": "sha512-JUdjWpcxfJ9IPamy2f5JaRDCaqJOxDzOSKtbdx4rH9VivMd1vIzoPumsJa9LoMIi4Fx2BV2KZOxWhNkBjaYivQ==",
"dev": true
},
"caseless": {
@@ -8606,9 +8631,9 @@
}
},
"semver": {
- "version": "7.3.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
- "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
"dev": true,
"requires": {
"lru-cache": "^6.0.0"
@@ -8725,9 +8750,9 @@
}
},
"electron-to-chromium": {
- "version": "1.3.690",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.690.tgz",
- "integrity": "sha512-zPbaSv1c8LUKqQ+scNxJKv01RYFkVVF1xli+b+3Ty8ONujHjAMg+t/COmdZqrtnS1gT+g4hbSodHillymt1Lww==",
+ "version": "1.3.695",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.695.tgz",
+ "integrity": "sha512-lz66RliUqLHU1Ojxx1A4QUxKydjiQ79Y4dZyPobs2Dmxj5aVL2TM3KoQ2Gs7HS703Bfny+ukI3KOxwAB0xceHQ==",
"dev": true
},
"emoji-regex": {
@@ -9910,9 +9935,9 @@
},
"dependencies": {
"semver": {
- "version": "7.3.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
- "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
"dev": true,
"requires": {
"lru-cache": "^6.0.0"
@@ -10310,9 +10335,9 @@
"dev": true
},
"queue-microtask": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz",
- "integrity": "sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg==",
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
"dev": true,
"peer": true
},
@@ -10481,9 +10506,9 @@
"dev": true
},
"regjsparser": {
- "version": "0.6.7",
- "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.7.tgz",
- "integrity": "sha512-ib77G0uxsA2ovgiYbCVGx4Pv3PSttAx2vIwidqQzbL2U5S4Q+j00HdSAneSBuyVcMvEnTXMjiGgB+DlXozVhpQ==",
+ "version": "0.6.8",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.8.tgz",
+ "integrity": "sha512-3weFrFQREJhJ2PW+iCGaG6TenyzNSZgsBKZ/oEf6Trme31COSeIWhHw9O6FPkuXktfx+b6Hf/5e6dKPHaROq2g==",
"dev": true,
"requires": {
"jsesc": "~0.5.0"
@@ -11219,9 +11244,9 @@
}
},
"terser": {
- "version": "5.6.0",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.6.0.tgz",
- "integrity": "sha512-vyqLMoqadC1uR0vywqOZzriDYzgEkNJFK4q9GeyOBHIbiECHiWLKcWfbQWAUaPfxkjDhapSlZB9f7fkMrvkVjA==",
+ "version": "5.6.1",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.6.1.tgz",
+ "integrity": "sha512-yv9YLFQQ+3ZqgWCUk+pvNJwgUTdlIxUk1WTN+RnaFJe2L7ipG2csPT0ra2XRm7Cs8cxN7QXmK1rFzEwYEQkzXw==",
"dev": true,
"requires": {
"commander": "^2.20.0",
@@ -11498,9 +11523,9 @@
}
},
"webpack": {
- "version": "5.26.3",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.26.3.tgz",
- "integrity": "sha512-z/F2lt2N1fZqaud1B4SzjL3OW03eULThbBXQ2OX4LSrZX4N9k1A5d0Rje3zS2g887DTWyAV0KGqEf64ois2dhg==",
+ "version": "5.27.2",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.27.2.tgz",
+ "integrity": "sha512-brNF3N/EdvMzkaZ/Xzb8sqPn5Si3iw6meqCnmNFtcnkorZsFZCBFMa2ElpIMjx6sKWYsnUpBO2dnX+7xgj+mjg==",
"dev": true,
"requires": {
"@types/eslint-scope": "^3.7.0",
@@ -11580,9 +11605,9 @@
},
"dependencies": {
"commander": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-7.1.0.tgz",
- "integrity": "sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
"dev": true
}
}
diff --git a/src/js/clip/Picking.js b/src/js/clip/Picking.js
index fa08bb9..7532949 100644
--- a/src/js/clip/Picking.js
+++ b/src/js/clip/Picking.js
@@ -17,6 +17,8 @@ export class Picking {
plane;
touchCapable = false;
isDraging = false;
+ enabled = true;
+ defaultMapCursor;
constructor(size, center, simulation) {
this.size = size;
@@ -43,6 +45,7 @@ export class Picking {
simulation.scene.add(this.plane);
this.domElement = simulation.renderer.domElement;
+ this.defaultMapCursor = this.domElement.style.cursor;
domEvent.on(this.domElement, 'mousemove', this.mouseMove, this);
if (this.touchCapable == true) {
domEvent.on(this.domElement, 'touchstart', this.beginDrag, this);
@@ -78,7 +81,7 @@ export class Picking {
}
mouseMove(event) {
- if (this.isDraging == true || this.simulation.selection.visible == false) {
+ if (this.isDraging == true || this.simulation.selection.visible == false || this.enabled == false) {
return;
}
let point = this._getCanvasPoint(event);
@@ -110,14 +113,14 @@ export class Picking {
// cursor is not selecting the box
this.intersected.guardian.rayOut();
this.intersected = null;
- this.simulation.renderer.domElement.style.cursor = 'auto';
+ this.simulation.renderer.domElement.style.cursor = this.defaultMapCursor;
// this.simulation.throttledRender();
this.simulation.deferringThrottle();
}
}
beginDrag(event) {
- if (this.simulation.selection.visible == false) {
+ if (this.simulation.selection.visible == false && this.enabled == false) {
return;
}
// exit drag method, if not left mouse button was clicked
@@ -225,5 +228,25 @@ export class Picking {
}
}
+ disable () {
+ domEvent.off(this.domElement, 'mousemove', this.mouseMove, this);
+ if (this.touchCapable == true) {
+ domEvent.off(this.domElement, 'touchstart', this.beginDrag, this);
+ } else {
+ domEvent.off(this.domElement, 'mousedown', this.beginDrag, this);
+ }
+ this.enabled = false;
+ }
+
+ enable() {
+ domEvent.on(this.domElement, 'mousemove', this.mouseMove, this);
+ if (this.touchCapable == true) {
+ domEvent.on(this.domElement, 'touchstart', this.beginDrag, this);
+ } else {
+ domEvent.on(this.domElement, 'mousedown', this.beginDrag, this);
+ }
+ this.enabled = true;
+ }
+
}
\ No newline at end of file
diff --git a/src/js/controls/BoreholeControl.css b/src/js/controls/BoreholeControl.css
new file mode 100644
index 0000000..a00c724
--- /dev/null
+++ b/src/js/controls/BoreholeControl.css
@@ -0,0 +1,51 @@
+.gba-maptool-control {
+ border-radius: 4px;
+ border: 1px solid #bbb;
+ box-shadow: none;
+ margin:0;
+ padding:0;
+ overflow:hidden;
+}
+.gba-maptool-control a {
+ background-position: 50% 50%;
+ margin: 0;
+ background-repeat: no-repeat;
+ display: block;
+ height: 30px;
+ width: 30px;
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAdCAAAAACYz4PQAAAAAnRSTlMA/1uRIrUAAAAJcEhZcwAAFxIAABcSAWef0lIAAACLSURBVCjPzZExGQUxCINjoB5qAge1UBvdKgIN3c8ELjqjAQu89W4g8+tG/4+QAPL9zMw+H3gXd5mtKLGfTK3x/XPsDLskyR3SyFr2wKi7cwCLiAPPqcUDhwbbmfxi2thaDjpxPoFZ4+gYSjCEOpdg2DVdmPPojcxWATlodrRNgz27np029RLx9PjWPwOEKTMp8DmSAAAAAElFTkSuQmCC') /*img/drill2.png*/;
+ float: left;
+}
+.measure-enabled .gba-maptool-control a{
+ background-color:skyblue;
+}
+#radio{
+ float: left;
+}
+
+.gba-maptool-toggle {
+ display: inline-block;
+ vertical-align: middle;
+}
+.gba-maptool-control input:checked + label:before {
+ content: '✓';
+ padding-left: -2em;
+}
+.gba-maptool-control input[type=radio] {
+ display: none;
+}
+.gba-maptool-control input[type=radio] + label {
+ display: none;
+ line-height: 30px;
+ height: 30px;
+ width: 30px;
+ margin: 0;
+ padding: 0;
+ font-size: 12px;
+ text-align: center;
+ vertical-align: middle;
+ cursor: pointer;
+}
+.measure-enabled .gba-maptool-control input[type=radio] + label {
+ display: inline-block;
+}
\ No newline at end of file
diff --git a/src/js/controls/BoreholeControl.js b/src/js/controls/BoreholeControl.js
new file mode 100644
index 0000000..bb40060
--- /dev/null
+++ b/src/js/controls/BoreholeControl.js
@@ -0,0 +1,34 @@
+import { Control } from "./Control";
+import * as dom from '../core/domUtil';
+import * as util from '../core/utilities';
+import * as domEvent from '../core/domEvent';
+import { BoreholeTool } from '../tools/BoreholeTool';
+
+import './BoreholeControl.css';
+
+export class BoreholeControl extends Control {
+
+ onAdd (map) {
+ this.map = map;
+
+ // var b = this._nls = util.mixin({}, N.widgets.boreholetool);
+ this._container = dom.createDom("div", { "class": 'gba-maptool-control gba-control' });
+ //new L.Measurable(map);
+ let mapTool = new BoreholeTool(this.map);
+
+ //var inputDiv = dom.createDom("div", { id: "radio" }, this._container);
+ //this.addUnit(inputDiv, 'km', 'km', 'kilometers', true);
+ //this.addUnit(inputDiv, 'mi', 'mi', 'miles');
+ ////this.addUnit(inputDiv, 'nm', 'NM', 'nautical miles');
+ let toggle = dom.createDom('a', { "class": "gba-maptool-toggle", href: "#", title: "b.title" }, this._container);
+
+ domEvent.disableClickPropagation(this._container);
+ domEvent
+ // .on(toggle, 'click', domEvent.stop)
+ // .on(toggle, 'click', domEvent.preventDefault)
+ .on(toggle, 'click', mapTool.toggle, mapTool);
+
+ return this._container;
+ }
+
+}
\ No newline at end of file
diff --git a/src/js/core/BaseEditor.js b/src/js/core/BaseEditor.js
new file mode 100644
index 0000000..7abbe1e
--- /dev/null
+++ b/src/js/core/BaseEditor.js
@@ -0,0 +1,150 @@
+import * as util from './utilities';
+
+var Editable = {
+
+ makeCancellable: function (e) {
+ e.cancel = function () {
+ e._cancelled = true;
+ };
+ }
+};
+
+export class BaseEditor {
+
+ map;
+ marker;
+ mapTool;
+
+
+ constructor(map, featureLayer, options = {}) {
+ util.setOptions(this, options);
+ this.map = map;
+ this.marker = featureLayer;
+ this.marker.editor = this;
+ //this.editLayer = new LayerGroup();
+ this.mapTool = map.mapTool; //this.options.editTools || map.mapTool;
+
+ // this.marker.bindPopup(map._controls.boreholePopup);
+ }
+
+ enable() {
+ if (this._enabled) return this;
+ //if (this.isConnected() == true) {
+ // this.mapTool.editLayer.addLayer(this.editLayer);
+ //}
+ this.onEnable();
+ this._enabled = true;
+ this.marker.on('remove', this.disable.bind(this));
+ return this;
+ }
+
+ disable() {
+ this.marker.off('remove', this.disable.bind(this));
+ //this.editLayer.clearLayers();
+ //this.mapTool.editLayer.removeLayer(this.editLayer);
+ this.onDisable();
+ delete this._enabled;
+ if (this._drawing) this.cancelDrawing();
+ return this;
+ }
+
+ isConnected() {
+ return this.map.hasLayer(this.marker);
+ }
+
+ drawing() {
+ return !!this._drawing;
+ }
+
+ fireAndForward(type, e) {
+ e = e || {};
+ e.layer = this.marker;
+ this.marker.emit(type, e);
+ this.mapTool.fireAndForward(type, e);
+ }
+
+ onEnable() {
+ this.fireAndForward('editable:enable');
+ }
+
+ onDisable() {
+ this.fireAndForward('editable:disable');
+ }
+
+ onEditing() {
+ this.fireAndForward('editable:editing');
+ }
+
+
+ onDrawingMouseDown(e) {
+ this.fireAndForward('editable:drawing:mousedown', e);
+ }
+
+
+ startDrawing() {
+ if (!this._drawing) {
+ this._drawing = 1;// L.Editable.FORWARD;
+ }
+ this.mapTool.registerForDrawing(this);
+ this._onStartDrawing();
+ }
+
+ _onStartDrawing() {
+ this.fireAndForward('editable:drawing:start');
+ }
+
+
+ onDrawingClick(e) {
+ if (!this.drawing) return;
+ Editable.makeCancellable(e);
+ this.fireAndForward('editable:drawing:click', e);
+ if (e._cancelled) return;
+ //if (!this.isConnected()) {
+ // this.connect(e);
+ //}
+ var dxfIdentifyParams = {};
+ dxfIdentifyParams.clientX = e.clientX;
+ dxfIdentifyParams.clientY = e.clientY;
+ dxfIdentifyParams.width = this.map.container.clientWidth;
+ dxfIdentifyParams.height = this.map.container.clientHeight;
+ // var deferred = this.mapTool.drillTask.execute(dxfIdentifyParams);
+ // deferred.then(this.handleQueryResults3.bind(this));
+
+ this._processDrawingClick(e);
+ }
+
+ _processDrawingClick (e) {
+ this.fireAndForward('editable:drawing:clicked', e);
+ this._commitDrawing(e);
+ }
+
+ _commitDrawing (e) {
+ this._onCommitDrawing(e);
+ }
+
+ _onCommitDrawing(e) {
+ this.fireAndForward('editable:drawing:commit', e);
+ }
+
+
+
+
+ cancelDrawing() {
+ this._onCancelDrawing();
+ this._endDrawing();
+ }
+
+ _onCancelDrawing () {
+ this.fireAndForward('editable:drawing:cancel');
+ }
+
+ _endDrawing () {
+ this._drawing = false;
+ this.mapTool.unregisterForDrawing(this);
+ this._onEndDrawing();
+ }
+
+ _onEndDrawing() {
+ this.fireAndForward('editable:drawing:end');
+ }
+}
\ No newline at end of file
diff --git a/src/js/core/Map.js b/src/js/core/Map.js
index c64c860..ecbab4b 100644
--- a/src/js/core/Map.js
+++ b/src/js/core/Map.js
@@ -2,6 +2,7 @@ import { OrbitControls } from '../lib/OrbitControls';
import * as dom from './domUtil';
import { HomeButton } from '../controls/HomeButton';
import { ZoomControl } from '../controls/ZoomControl';
+import { BoreholeControl } from '../controls/BoreholeControl';
import * as util from './utilities';
import { TinLayer } from '../layer/TinLayer';
@@ -125,6 +126,8 @@ class Map extends OrbitControls {
let zoomControl = this._controls.zoomControl = new ZoomControl();
zoomControl.addTo(this);
+
+ this._controls.maptoolControl = new BoreholeControl().addTo(this);
}
async addLayer(layer) {
@@ -150,6 +153,10 @@ class Map extends OrbitControls {
return !!layer && (util.stamp(layer) in this._layers);
}
+ getCenter () { // (Boolean) -> LatLng
+ return this.target;
+ }
+
}
export { Map };
\ No newline at end of file
diff --git a/src/js/core/domUtil.js b/src/js/core/domUtil.js
index 6aec6fd..d8602ca 100644
--- a/src/js/core/domUtil.js
+++ b/src/js/core/domUtil.js
@@ -86,6 +86,17 @@ export function setProperties(element, properties) {
}
}
+
+// @function hasClass(el: HTMLElement, name: String): Boolean
+// Returns `true` if the element's class attribute contains `name`.
+export function hasClass(el, name) {
+ if (el.classList !== undefined) {
+ return el.classList.contains(name);
+ }
+ var className = getClass(el);
+ return className.length > 0 && new RegExp('(^|\\s)' + name + '(\\s|$)').test(className);
+}
+
// @function addClass(el: HTMLElement, name: String)
// Adds `name` to the element's class attribute.
export function addClass(el, name) {
diff --git a/src/js/layer/Layer.js b/src/js/layer/Layer.js
index 2365e66..5026537 100644
--- a/src/js/layer/Layer.js
+++ b/src/js/layer/Layer.js
@@ -41,7 +41,58 @@ class Layer extends EventEmitter {
getScene() {
return this._map.scene;
}
-
+
+ // @method bindPopup(content: String|HTMLElement|Function|Popup, options?: Popup options): this
+ // Binds a popup to the layer with the passed `content` and sets up the
+ // neccessary event listeners. If a `Function` is passed it will receive
+ // the layer as the first argument and should return a `String` or `HTMLElement`.
+ bindPopup(content) {
+
+ if (content instanceof BoreholePopup) {
+ //util.setOptions(content, options);
+ this._popup = content;
+ content._source = this;
+ }
+
+ if (!this._popup) {
+ //this._popup = new L.Popup(options, this);
+ this._popup = new BoreholePopup({}, this);
+ this._popup.addTo(this._map);
+ this._popup.setChartContent(content);
+ }
+
+
+
+ if (!this._popupHandlersAdded) {
+ this.on("click", this.openPopup, this); //remove: this.closePopup //move: this._movePopup
+ this.on('remove', this.closePopup, this);
+ this._popupHandlersAdded = true;
+ }
+
+ //// save the originally passed offset
+ //this._originalPopupOffset = this._popup.options.offset;
+
+ return this;
+ }
+
+ setPopupChartData(content) {
+ this._popup.setChartContent(content);
+ }
+
+ openPopup() {
+ this._popup.show();
+ }
+
+ // @method closePopup(): this
+ // Closes the popup bound to this layer if it is open.
+ closePopup() {
+ if (this._popup) {
+ this._popup._close();
+ //this._popup.removeFrom(this._map);
+ }
+ return this;
+ }
+
}
export { Layer };
\ No newline at end of file
diff --git a/src/js/layer/MarkerLayer.js b/src/js/layer/MarkerLayer.js
new file mode 100644
index 0000000..5404f88
--- /dev/null
+++ b/src/js/layer/MarkerLayer.js
@@ -0,0 +1,131 @@
+import { Layer } from './Layer';
+import * as util from '../core/utilities';
+import { BaseEditor } from '../core/BaseEditor';
+
+export class MarkerLayer extends Layer {
+
+ createEditor(map) {
+ map = map || this._map;
+ var Klass = this.options.editorClass || this.getEditorClass(map);
+ return new Klass(map, this, this.options.editOptions);
+ }
+
+ enableEdit(map) {
+ if (!this.editor) {
+ this.createEditor(map);
+ }
+ return this.editor.enable();
+ }
+
+ getEditorClass(map) {
+ return BaseEditor;
+ }
+
+ options = {
+ pane: 'markerPane',
+ nonBubblingEvents: ['click', 'dblclick', 'mouseover', 'mouseout', 'contextmenu'],
+ //icon: new L.Icon.Default(),
+ opacity: 1,
+ clickable: true,
+ };
+
+ constructor(latlng, options) {
+ super();
+ util.setOptions(this, options);
+ this._latlng = latlng;
+
+ }
+
+ onAdd(map) {
+ //this._zoomAnimated = this._zoomAnimated && map.options.markerZoomAnimation;
+
+ this._initIcon();
+ this.update();
+ this.emit('add');
+ }
+
+ onRemove() {
+ //if (this.dragging && this.dragging.enabled()) {
+ // this.options.draggable = true;
+ // this.dragging.removeHooks();
+ //}
+
+ this._removeIcon();
+ //this._removeShadow();
+ this.emit('remove');
+ this._map = null;
+ }
+
+ update() {
+ if (this._icon) {
+ var pos = this._latlng;
+ this._setPos(pos);
+ }
+ this._map.emit("change");
+ return this;
+ }
+
+ getElement() {
+ return this._icon;
+ }
+
+ _initIcon() {
+ //create default icon
+ var opt = { r: 0.25, c: 0xffff00, o: 0.8 };
+ var icon = new THREE.Mesh(new THREE.CylinderGeometry(0, 0.5, 2),
+ new THREE.MeshLambertMaterial({ color: 0x38eeff, opacity: opt.o, transparent: (opt.o < 1) }));
+ icon.rotation.x = THREE.Math.degToRad(-90);
+ icon.visible = true;
+ //app.scene.add(app.boreholeMarker);
+ var addIcon = false;
+
+ // if we're not reusing the icon, remove the old one and init new one
+ if (icon !== this._icon) {
+ if (this._icon) {
+ this._removeIcon();
+ }
+ addIcon = true;
+
+ //if (options.title) {
+ // icon.title = options.title;
+ //}
+ //if (options.alt) {
+ // icon.alt = options.alt;
+ //}
+ }
+ this._icon = icon;
+
+ //this._initInteraction();
+
+ if (addIcon === true) {
+ this.getPane().add(this._icon);
+ }
+ }
+
+ _removeIcon() {
+ //if (this.options.riseOnHover) {
+ // this.off({
+ // mouseover: this._bringToFront,
+ // mouseout: this._resetZIndex
+ // });
+ //}
+
+ //L.DomUtil.remove(this._icon);
+ this.getPane().remove(this._icon);
+ //this.removeInteractiveTarget(this._icon);
+
+ this._icon = null;
+ }
+
+ _setPos(pos) {
+ //L.DomUtil.setPosition(this._icon, pos);
+ this._icon.position.set(pos.x, pos.y, pos.z);
+
+ }
+
+ setLatLng(latlng) {
+ this._latlng = latlng;
+ this.update();
+ }
+
+}
\ No newline at end of file
diff --git a/src/js/main.js b/src/js/main.js
index 472ac1e..1346641 100644
--- a/src/js/main.js
+++ b/src/js/main.js
@@ -13,7 +13,6 @@ import { NorthArrow } from './controls/NorthArrow';
import { LayerControl } from './controls/LayerControl';
import { BasemapControl } from './controls/BasemapControl';
import { SliderControl } from './controls/SliderControl';
-// import { SlicerControl } from './controls/SlicerControl';
import { Mesh } from 'three/src/objects/Mesh';
import { SphereGeometry } from 'three/src/geometries/SphereGeometry';
import { MeshLambertMaterial } from 'three/src/materials/MeshLambertMaterial';
@@ -196,7 +195,7 @@ class Application {
);
this.map.addLayer(this.selection);
- new Picking(size, center, this);
+ this.map.picking = new Picking(size, center, this);
// let boxLayer = new BoxLayer({
diff --git a/src/js/tools/BoreholeTool.js b/src/js/tools/BoreholeTool.js
new file mode 100644
index 0000000..ab73a57
--- /dev/null
+++ b/src/js/tools/BoreholeTool.js
@@ -0,0 +1,185 @@
+import { EventEmitter } from '../core/EventEmitter';
+import { MeshLambertMaterial } from 'three/src/materials/MeshLambertMaterial';
+import * as domEvent from '../core/domEvent';
+import { MarkerLayer } from '../layer/MarkerLayer';
+import * as dom from '../core/domUtil';
+import * as util from '../core/utilities';
+
+export class BoreholeTool extends EventEmitter {
+
+ options = {
+ zIndex: 1000,
+ markerClass: MarkerLayer,//THREE.CylinderGeometry,
+ drawingCSSClass: 'gba-editable-drawing',
+ drawingCursor: 'crosshair'
+ };
+
+ constructor(map, options = {}) {
+ super();
+
+ util.setOptions(this, options);
+ this._lastZIndex = this.options.zIndex;
+ this.map = map;
+ // this.featuresLayer = this._createFeaturesLayer();
+ //this.forwardLineGuide = this.createLineGuide();
+ //this.backwardLineGuide = this.createLineGuide();
+
+ this.map.mapTool = this;
+ //this.on('editable:drawing:end', function () {
+ // if (this.enabled()) this.startMarker();
+ //});
+
+ let highlightMaterial = new MeshLambertMaterial({ emissive: 0x999900, transparent: true, opacity: 0.5 });
+ this.defaultMapCursor = this.map.domElement.style.cursor;
+ }
+
+ // _createFeaturesLayer () {
+ // return new LayerGroup().addTo(this.map);
+ // }
+
+ enabled() {
+ return dom.hasClass(this.map.container, 'measure-enabled');
+ }
+
+ toggle() {
+ if (this.enabled()) {
+ this.disable();
+ }
+ else {
+ this.enable();
+ }
+ }
+
+ enable() {
+ //if (this.map.mapTool) this.map.mapTool.on('editable:drawing:start', this.disable.bind(this));
+ dom.addClass(this.map.container, 'measure-enabled');
+ //this.fireAndForward('showmeasure');
+ this._startMarker();
+ }
+
+ disable() {
+ //if (this.map.mapTool) this.map.mapTool.off('editable:drawing:start', this.disable.bind(this));
+ dom.removeClass(this.map.container, 'measure-enabled');
+ // this.featuresLayer.clearLayers();
+ //this.fireAndForward('hidemeasure');
+ if (this._drawingEditor) {
+ this._drawingEditor.cancelDrawing();
+ }
+ }
+
+ fireAndForward(type, e) {
+ e = e || {};
+ e.mapTool = this;
+ this.emit(type, e);
+ this.map.emit(type, e);
+ }
+
+ _startMarker(latlng, options) {
+ latlng = latlng || this.map.getCenter().clone();
+ let markerLayer = this._createMarker(latlng, options);//.addTo(this.map);
+ //this.map.addLayer(marker);
+ //marker.enableEdit(this.map).startDrawing(); //editor.startDrawing() -> registerForDrawing
+ let baseEditor = markerLayer.enableEdit(this.map);
+ baseEditor.startDrawing();
+ return markerLayer;
+ }
+
+ _createMarker(latlng, options) {
+ return this._createLayer(options && options.markerClass || this.options.markerClass, latlng, options);
+ }
+
+ _createLayer(klass, latlngs, options) {
+ options = util.extend({ editOptions: { mapTool: this } }, options);
+ let layer = new klass(latlngs, options);
+ //this.fireAndForward('editable:created', { layer: layer });
+ return layer;
+ }
+
+
+ registerForDrawing(editor) {
+ if (this._drawingEditor) {
+ this.unregisterForDrawing(this._drawingEditor);
+ }
+ //this.map.on('mousemove touchmove', editor.onDrawingMouseMove, editor);
+ this._blockEvents();
+ this._drawingEditor = editor;
+ this.map.on('mousedown', this._onMousedown);
+ this.map.on('clicked', this._onMouseup);
+ dom.addClass(this.map.domElement, this.options.drawingCSSClass);
+ // this.defaultMapCursor = this.map.domElement.style.cursor;
+ //this.map.domElement.style.cursor = this.options.drawingCursor;
+ // this.map.domElement.style.cursor = "crosshair";
+ this.map.domElement.style.cursor = "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAdCAMAAABRwYYcAAABPlBMVEUAAAC7u7vQ0NCTk5PU1NTr6+u6urpVVVXR0dEhISG8vLxISEjS0tL09PTo6OiEhISlpaX39/cAAABNTU2mpqZRUVH4+Phzc3NOTk75+fmBgYHu7u7CwsKdnZ1cXFzQ0NAvLy8FBQXb29v9/f0rKysJCQmFhYVlZWUyMjLa2tr///96enoMDAyJiYkXFxcZGRkLCwtZWVl/f38aGhqrq6vV1dXj4+N5eXnb29vd3d1FRUXR0dG5ubnQ0NCCgoKVlZWNjY1BQUHt7e0GBgYAAAC3t7ctLS2/v783NzcfHx/r6+uUlJSkpKQCAgKoqKh8fHyAgIAsLCynp6cHBwddXV0yMjIXFxfOzs4+Pj7g4OCioqITExOfn58BAQEbGxsxMTGTk5PPz8+QkJAICAi4uLjf39+zs7O+vr5LS0uLi4svZJaIAAAATHRSTlMA7uD+DN/YA9/Y/tjfye4Z9Mn+/vTuydj+yfTmFRULC+7+38nY/hUZ/uDJ2P7+C/7Y2BT+/tjJFeD8C+AL3/702O7f/gPu/hTY7uDuXbwlLQAAAKxJREFUeF6VzWVyAmEMBuCwuLu7lsW9uBWqK7i7tb3/BcjHDciPPJPJmwnUBb8KCQBQ/OXWtAOUTVLtSg9Qe8JNCdW5jiEACHDLYTSGDhZvSpyrHTZhRen1mCuoAcS7nwi5oxy9l38L+Zfj3zGvYk4GOeY8ZjacRb+nW2MbFc98bpJv/GleiXTrY24LAshG13wG993D3v+Jpr7YdPxxd2aSmPP2J8IiYIkqTux3Y8Yeb6YtyDkAAAAASUVORK5CYII=') 3 31, crosshair";
+ //background-image:url(/content/img/drill.png);
+ }
+
+ unregisterForDrawing(editor) {
+ this._unblockEvents();
+ dom.removeClass(this.map.domElement, this.options.drawingCSSClass);
+ this.map.domElement.style.cursor = this.defaultMapCursor;
+ editor = editor || this._drawingEditor;
+ if (!editor) return;
+ //this.map.off('mousemove touchmove', editor.onDrawingMouseMove, editor);
+ this.map.off('mousedown', this._onMousedown);
+ this.map.off('clicked', this._onMouseup);
+ if (editor !== this._drawingEditor) return;
+ delete this._drawingEditor;
+ //if (editor._drawing) {
+ // editor.cancelDrawing();
+ //}
+ }
+
+ _blockEvents() {
+ // Hack: force map not to listen to other layers events while drawing.
+ //if (!this._oldTargets) {
+ //this._oldTargets = this.map._events;
+ //this.map._events = {};
+ //}
+ if (!this._oldClickTargets) {
+ this._oldClickTargets = this.map._events.clicked;
+ this.map._events.clicked = [];
+ }
+ if (this.map.picking) {
+ this.map.picking.disable();
+ }
+ }
+
+ _unblockEvents() {
+ //if (this._oldTargets) {
+ // // Reset, but keep targets created while drawing.
+ // this.map._events = util.extend(this.map._events, this._oldTargets);
+ // delete this._oldTargets;
+ //}
+ if (this._oldClickTargets) {
+ // Reset, but keep targets created while drawing.
+ this.map._events.clicked = this.map._events.clicked.concat(this._oldClickTargets);
+ delete this._oldClickTargets;
+ }
+ if (this.map.picking) {
+ this.map.picking.enable();
+ }
+ }
+
+ _onMousedown(e) {
+ //var canvasOffset = $(this.domElement).offset();
+ //var xClickedOnCanvas = e.clientX - canvasOffset.left;
+ //var yClickedonCanvas = e.clientY - canvasOffset.top;
+ //var event = { x: xClickedOnCanvas, y: yClickedonCanvas };
+ this.mapTool._mouseDown = e;
+ this.mapTool._drawingEditor.onDrawingMouseDown(e);
+ }
+
+ _onMouseup(e) {
+ if (this.mapTool._mouseDown) {
+ //var originPoint = new Point(this.mapTool._mouseDown.clientX, this.mapTool._mouseDown.clientY);
+ //var endPoint = new Point(e.clientX, e.clientY);
+ //var distance = endPoint.distanceTo(originPoint);
+ //if (Math.abs(distance) < 9 * (window.devicePixelRatio || 1)) this.mapTool._drawingEditor.onDrawingClick(e);
+ //else this._drawingEditor.onDrawingMouseUp(e);
+ this.mapTool._drawingEditor.onDrawingClick(this.mapTool._mouseDown);
+ }
+ this.mapTool._mouseDown = null;
+ }
+
+
+}
\ No newline at end of file