From eeae97288ae38e32f6c1585b316be12c0b4b6267 Mon Sep 17 00:00:00 2001 From: cracklesparkle Date: Tue, 10 Dec 2024 10:51:29 +0900 Subject: [PATCH] Remove @mui, move states into zustand store --- client/package-lock.json | 724 ++---------------- client/package.json | 6 - client/src/App.tsx | 12 +- client/src/components/CustomTable.tsx | 29 +- client/src/components/FolderViewer.tsx | 7 +- client/src/components/ServerData.tsx | 15 +- client/src/components/ServerHardware.tsx | 108 +-- client/src/components/ServerIpsView.tsx | 110 +-- client/src/components/ServerStorages.tsx | 121 +-- client/src/components/ServersView.tsx | 147 +--- client/src/components/TableEditable.tsx | 233 ------ client/src/components/Tree/ObjectTree.tsx | 2 +- client/src/components/map/MapComponent.tsx | 231 +++++- .../map/MapStatusbar/MapStatusbar.tsx | 28 +- client/src/components/map/mapUtils.ts | 9 +- client/src/components/modals/FileViewer.tsx | 228 +++--- client/src/interfaces/map.ts | 14 +- client/src/pages/ApiTest.tsx | 51 -- client/src/pages/Boilers.tsx | 5 +- client/src/pages/Roles.tsx | 3 +- client/src/pages/Users.tsx | 3 +- client/src/pages/auth/PasswordReset.tsx | 4 +- client/src/store/map.ts | 49 +- client/yarn.lock | 422 +--------- ems/src/api/general/index.ts | 29 +- ems/src/api/static/index.ts | 24 + ems/src/index.ts | 2 + 27 files changed, 537 insertions(+), 2079 deletions(-) delete mode 100644 client/src/components/TableEditable.tsx delete mode 100644 client/src/pages/ApiTest.tsx create mode 100644 ems/src/api/static/index.ts diff --git a/client/package-lock.json b/client/package-lock.json index 3ca22df..f9d5881 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -9,8 +9,6 @@ "version": "0.0.0", "dependencies": { "-": "^0.0.1", - "@emotion/react": "^11.11.4", - "@emotion/styled": "^11.11.5", "@fontsource/inter": "^5.0.19", "@fontsource/open-sans": "^5.0.28", "@js-preview/docx": "^1.6.2", @@ -29,10 +27,6 @@ "@mantine/nprogress": "^7.13.0", "@mantine/spotlight": "^7.13.0", "@mantine/tiptap": "^7.13.0", - "@mui/icons-material": "^5.15.20", - "@mui/material": "^5.15.20", - "@mui/x-charts": "^7.8.0", - "@mui/x-data-grid": "^7.7.1", "@tabler/icons-react": "^3.17.0", "@tanstack/react-table": "^8.20.5", "@tiptap/extension-link": "^2.7.3", @@ -114,6 +108,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dev": true, "dependencies": { "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" @@ -180,6 +175,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "dev": true, "dependencies": { "@babel/types": "^7.24.7", "@jridgewell/gen-mapping": "^0.3.5", @@ -327,6 +323,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", + "dev": true, "dependencies": { "@babel/types": "^7.24.7" }, @@ -338,6 +335,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", + "dev": true, "dependencies": { "@babel/template": "^7.24.7", "@babel/types": "^7.24.7" @@ -350,6 +348,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", + "dev": true, "dependencies": { "@babel/types": "^7.24.7" }, @@ -374,6 +373,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "dev": true, "dependencies": { "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" @@ -486,6 +486,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, "dependencies": { "@babel/types": "^7.24.7" }, @@ -497,6 +498,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -505,6 +507,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -550,6 +553,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", @@ -564,6 +568,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -575,6 +580,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -588,6 +594,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -595,12 +602,14 @@ "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, "engines": { "node": ">=0.8.0" } @@ -609,6 +618,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, "engines": { "node": ">=4" } @@ -617,6 +627,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -628,6 +639,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -1865,6 +1877,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/parser": "^7.24.7", @@ -1878,6 +1891,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/generator": "^7.24.7", @@ -1898,6 +1912,7 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, "engines": { "node": ">=4" } @@ -1906,6 +1921,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.24.7", "@babel/helper-validator-identifier": "^7.24.7", @@ -1921,139 +1937,6 @@ "integrity": "sha512-+imAQkHf7U/Rwvu0wk1XWgsP3WnpCWmK7B48f0XqSNzgk64+grljTKC7pnO/xBiEMUziF7vKRfbBnOQhg126qQ==", "dev": true }, - "node_modules/@emotion/babel-plugin": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", - "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", - "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/serialize": "^1.1.2", - "babel-plugin-macros": "^3.1.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/cache": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", - "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", - "dependencies": { - "@emotion/memoize": "^0.8.1", - "@emotion/sheet": "^1.2.2", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/hash": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", - "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" - }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", - "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", - "dependencies": { - "@emotion/memoize": "^0.8.1" - } - }, - "node_modules/@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" - }, - "node_modules/@emotion/react": { - "version": "11.11.4", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", - "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", - "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.11.0", - "@emotion/cache": "^11.11.0", - "@emotion/serialize": "^1.1.3", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "hoist-non-react-statics": "^3.3.1" - }, - "peerDependencies": { - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@emotion/serialize": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", - "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", - "dependencies": { - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/unitless": "^0.8.1", - "@emotion/utils": "^1.2.1", - "csstype": "^3.0.2" - } - }, - "node_modules/@emotion/sheet": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", - "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" - }, - "node_modules/@emotion/styled": { - "version": "11.11.5", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.5.tgz", - "integrity": "sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==", - "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.11.0", - "@emotion/is-prop-valid": "^1.2.2", - "@emotion/serialize": "^1.1.4", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@emotion/utils": "^1.2.1" - }, - "peerDependencies": { - "@emotion/react": "^11.0.0-rc.0", - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@emotion/unitless": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" - }, - "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", - "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@emotion/utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", - "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" - }, - "node_modules/@emotion/weak-memoize": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", - "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" - }, "node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", @@ -2663,6 +2546,7 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -2676,6 +2560,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, "engines": { "node": ">=6.0.0" } @@ -2684,6 +2569,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, "engines": { "node": ">=6.0.0" } @@ -2701,12 +2587,14 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -2919,314 +2807,6 @@ "react-dom": "^18.2.0" } }, - "node_modules/@mui/base": { - "version": "5.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz", - "integrity": "sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@floating-ui/react-dom": "^2.0.8", - "@mui/types": "^7.2.14", - "@mui/utils": "^5.15.14", - "@popperjs/core": "^2.11.8", - "clsx": "^2.1.0", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/core-downloads-tracker": { - "version": "5.15.20", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.20.tgz", - "integrity": "sha512-DoL2ppgldL16utL8nNyj/P12f8mCNdx/Hb/AJnX9rLY4b52hCMIx1kH83pbXQ6uMy6n54M3StmEbvSGoj2OFuA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - } - }, - "node_modules/@mui/icons-material": { - "version": "5.15.20", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.20.tgz", - "integrity": "sha512-oGcKmCuHaYbAAoLN67WKSXtHmEgyWcJToT1uRtmPyxMj9N5uqwc/mRtEnst4Wj/eGr+zYH2FiZQ79v9k7kSk1Q==", - "dependencies": { - "@babel/runtime": "^7.23.9" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@mui/material": "^5.0.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/material": { - "version": "5.15.20", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.20.tgz", - "integrity": "sha512-tVq3l4qoXx/NxUgIx/x3lZiPn/5xDbdTE8VrLczNpfblLYZzlrbxA7kb9mI8NoBF6+w9WE9IrxWnKK5KlPI2bg==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/base": "5.0.0-beta.40", - "@mui/core-downloads-tracker": "^5.15.20", - "@mui/system": "^5.15.20", - "@mui/types": "^7.2.14", - "@mui/utils": "^5.15.20", - "@types/react-transition-group": "^4.4.10", - "clsx": "^2.1.0", - "csstype": "^3.1.3", - "prop-types": "^15.8.1", - "react-is": "^18.2.0", - "react-transition-group": "^4.4.5" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/private-theming": { - "version": "5.15.20", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.20.tgz", - "integrity": "sha512-BK8F94AIqSrnaPYXf2KAOjGZJgWfvqAVQ2gVR3EryvQFtuBnG6RwodxrCvd3B48VuMy6Wsk897+lQMUxJyk+6g==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/utils": "^5.15.20", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/styled-engine": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.14.tgz", - "integrity": "sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@emotion/cache": "^11.11.0", - "csstype": "^3.1.3", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.4.1", - "@emotion/styled": "^11.3.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - } - } - }, - "node_modules/@mui/system": { - "version": "5.15.20", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.20.tgz", - "integrity": "sha512-LoMq4IlAAhxzL2VNUDBTQxAb4chnBe8JvRINVNDiMtHE2PiPOoHlhOPutSxEbaL5mkECPVWSv6p8JEV+uykwIA==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/private-theming": "^5.15.20", - "@mui/styled-engine": "^5.15.14", - "@mui/types": "^7.2.14", - "@mui/utils": "^5.15.20", - "clsx": "^2.1.0", - "csstype": "^3.1.3", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/types": { - "version": "7.2.14", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.14.tgz", - "integrity": "sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==", - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/utils": { - "version": "5.15.20", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.20.tgz", - "integrity": "sha512-mAbYx0sovrnpAu1zHc3MDIhPqL8RPVC5W5xcO1b7PiSCJPtckIZmBkp8hefamAvUiAV8gpfMOM6Zb+eSisbI2A==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@types/prop-types": "^15.7.11", - "prop-types": "^15.8.1", - "react-is": "^18.2.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/x-charts": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@mui/x-charts/-/x-charts-7.8.0.tgz", - "integrity": "sha512-SosaVtx4Ig1nu/loH6Mq4peH5Pq5UvVEnsMfe4G2IEVrMxfwrktWJo+86t9LxiHTERt4wxPKnsqlhkgBIf9ePQ==", - "dependencies": { - "@babel/runtime": "^7.24.7", - "@mui/base": "^5.0.0-beta.40", - "@mui/system": "^5.15.20", - "@mui/utils": "^5.15.20", - "@react-spring/rafz": "^9.7.3", - "@react-spring/web": "^9.7.3", - "clsx": "^2.1.1", - "d3-color": "^3.1.0", - "d3-delaunay": "^6.0.4", - "d3-interpolate": "^3.0.1", - "d3-scale": "^4.0.2", - "d3-shape": "^3.2.0", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "@emotion/react": "^11.9.0", - "@emotion/styled": "^11.8.1", - "@mui/material": "^5.15.14", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - } - } - }, - "node_modules/@mui/x-data-grid": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@mui/x-data-grid/-/x-data-grid-7.7.1.tgz", - "integrity": "sha512-5XsvuVpJfjV2ERtNiVRWL+0UUq5rh2Tq8aLZdJ8Ca5PnweEfNzOesQMlf0lpjXqnzuoq7uTwvICqoAMjsTTglg==", - "dependencies": { - "@babel/runtime": "^7.24.7", - "@mui/system": "^5.15.20", - "@mui/utils": "^5.15.20", - "clsx": "^2.1.1", - "prop-types": "^15.8.1", - "reselect": "^4.1.8" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@mui/material": "^5.15.14", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3286,71 +2866,6 @@ "url": "https://opencollective.com/popperjs" } }, - "node_modules/@react-spring/animated": { - "version": "9.7.3", - "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.3.tgz", - "integrity": "sha512-5CWeNJt9pNgyvuSzQH+uy2pvTg8Y4/OisoscZIR8/ZNLIOI+CatFBhGZpDGTF/OzdNFsAoGk3wiUYTwoJ0YIvw==", - "dependencies": { - "@react-spring/shared": "~9.7.3", - "@react-spring/types": "~9.7.3" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/core": { - "version": "9.7.3", - "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.3.tgz", - "integrity": "sha512-IqFdPVf3ZOC1Cx7+M0cXf4odNLxDC+n7IN3MDcVCTIOSBfqEcBebSv+vlY5AhM0zw05PDbjKrNmBpzv/AqpjnQ==", - "dependencies": { - "@react-spring/animated": "~9.7.3", - "@react-spring/shared": "~9.7.3", - "@react-spring/types": "~9.7.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-spring/donate" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/rafz": { - "version": "9.7.3", - "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.3.tgz", - "integrity": "sha512-9vzW1zJPcC4nS3aCV+GgcsK/WLaB520Iyvm55ARHfM5AuyBqycjvh1wbmWmgCyJuX4VPoWigzemq1CaaeRSHhQ==" - }, - "node_modules/@react-spring/shared": { - "version": "9.7.3", - "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.3.tgz", - "integrity": "sha512-NEopD+9S5xYyQ0pGtioacLhL2luflh6HACSSDUZOwLHoxA5eku1UPuqcJqjwSD6luKjjLfiLOspxo43FUHKKSA==", - "dependencies": { - "@react-spring/types": "~9.7.3" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/types": { - "version": "9.7.3", - "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.3.tgz", - "integrity": "sha512-Kpx/fQ/ZFX31OtlqVEFfgaD1ACzul4NksrvIgYfIFq9JpDHFwQkMVZ10tbo0FU/grje4rcL4EIrjekl3kYwgWw==" - }, - "node_modules/@react-spring/web": { - "version": "9.7.3", - "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.7.3.tgz", - "integrity": "sha512-BXt6BpS9aJL/QdVqEIX9YoUy8CE6TJrU0mNCqSoxdXlIeNcEBWOfIyE6B14ENNsyQKS3wOWkiJfco0tCr/9tUg==", - "dependencies": { - "@react-spring/animated": "~9.7.3", - "@react-spring/core": "~9.7.3", - "@react-spring/shared": "~9.7.3", - "@react-spring/types": "~9.7.3" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/@remirror/core-constants": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-3.0.0.tgz", @@ -4408,11 +3923,6 @@ "jspdf": "^2.5.1" } }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" - }, "node_modules/@types/proj4": { "version": "2.5.5", "resolved": "https://registry.npmjs.org/@types/proj4/-/proj4-2.5.5.tgz", @@ -4422,7 +3932,8 @@ "node_modules/@types/prop-types": { "version": "15.7.12", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", + "devOptional": true }, "node_modules/@types/raf": { "version": "3.4.3", @@ -4435,6 +3946,7 @@ "version": "18.3.3", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "devOptional": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -4449,14 +3961,6 @@ "@types/react": "*" } }, - "node_modules/@types/react-transition-group": { - "version": "4.4.10", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", - "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", - "dependencies": { - "@types/react": "*" - } - }, "node_modules/@types/resolve": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", @@ -5018,20 +4522,6 @@ "proxy-from-env": "^1.1.0" } }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.4.11", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", @@ -5468,6 +4958,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, "engines": { "node": ">=6" } @@ -5819,11 +5310,6 @@ "node": ">= 0.6" } }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, "node_modules/core-js": { "version": "3.38.1", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz", @@ -5855,29 +5341,6 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cosmiconfig/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - }, "node_modules/create-ecdh": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", @@ -6023,17 +5486,6 @@ "node": ">=12" } }, - "node_modules/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", - "dependencies": { - "delaunator": "5" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/d3-ease": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", @@ -6185,6 +5637,7 @@ "version": "4.3.5", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -6260,14 +5713,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/delaunator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", - "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", - "dependencies": { - "robust-predicates": "^3.0.2" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -6466,14 +5911,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, "node_modules/es-abstract": { "version": "1.23.3", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", @@ -7043,11 +6480,6 @@ "node": ">=8" } }, - "node_modules/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" - }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -7192,6 +6624,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7543,6 +6976,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -7569,19 +7003,6 @@ "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, "node_modules/html2canvas": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", @@ -7655,6 +7076,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -7759,11 +7181,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -7835,6 +7252,7 @@ "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, "dependencies": { "hasown": "^2.0.0" }, @@ -8250,6 +7668,7 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, "bin": { "jsesc": "bin/jsesc" }, @@ -8263,11 +7682,6 @@ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", @@ -8393,7 +7807,8 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true }, "node_modules/linkify-it": { "version": "5.0.0", @@ -8635,7 +8050,8 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, "node_modules/mz": { "version": "2.7.0", @@ -8977,6 +8393,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, "dependencies": { "callsites": "^3.0.0" }, @@ -9006,23 +8423,6 @@ "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", @@ -9065,7 +8465,8 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true }, "node_modules/path-scurry": { "version": "1.11.1", @@ -9093,6 +8494,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, "engines": { "node": ">=8" } @@ -9862,11 +9264,6 @@ "react": "^16.8.0 || ^17 || ^18 || ^19" } }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" - }, "node_modules/react-number-format": { "version": "5.4.2", "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.4.2.tgz", @@ -10221,15 +9618,11 @@ "node": ">=0.10.0" } }, - "node_modules/reselect": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", - "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" - }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -10246,6 +9639,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, "engines": { "node": ">=4" } @@ -10304,11 +9698,6 @@ "inherits": "^2.0.1" } }, - "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.18.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", @@ -11077,14 +10466,6 @@ "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", "dev": true }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -11384,11 +10765,6 @@ "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" - }, "node_modules/sucrase": { "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", @@ -11465,6 +10841,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -11665,6 +11042,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, "engines": { "node": ">=4" } diff --git a/client/package.json b/client/package.json index 8269566..1f0f693 100644 --- a/client/package.json +++ b/client/package.json @@ -12,8 +12,6 @@ }, "dependencies": { "-": "^0.0.1", - "@emotion/react": "^11.11.4", - "@emotion/styled": "^11.11.5", "@fontsource/inter": "^5.0.19", "@fontsource/open-sans": "^5.0.28", "@js-preview/docx": "^1.6.2", @@ -32,10 +30,6 @@ "@mantine/nprogress": "^7.13.0", "@mantine/spotlight": "^7.13.0", "@mantine/tiptap": "^7.13.0", - "@mui/icons-material": "^5.15.20", - "@mui/material": "^5.15.20", - "@mui/x-charts": "^7.8.0", - "@mui/x-data-grid": "^7.7.1", "@tabler/icons-react": "^3.17.0", "@tanstack/react-table": "^8.20.5", "@tiptap/extension-link": "^2.7.3", diff --git a/client/src/App.tsx b/client/src/App.tsx index 85176e9..5f82cea 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -5,7 +5,6 @@ import Roles from "./pages/Roles" import NotFound from "./pages/NotFound" import MainLayout from "./layouts/MainLayout" import SignIn from "./pages/auth/SignIn" -import ApiTest from "./pages/ApiTest" import SignUp from "./pages/auth/SignUp" import { initAuth, useAuthStore } from "./store/auth" import { useEffect, useState } from "react" @@ -18,7 +17,7 @@ import PasswordReset from "./pages/auth/PasswordReset" import MapTest from "./pages/MapTest" import MonitorPage from "./pages/MonitorPage" import DashboardLayout from "./layouts/DashboardLayout" -import { IconApi, IconBuildingFactory2, IconComponents, IconDeviceDesktopAnalytics, IconFiles, IconHome, IconLogin, IconLogin2, IconMap, IconPassword, IconReport, IconServer, IconSettings, IconShield, IconTable, IconUsers } from "@tabler/icons-react" +import { IconBuildingFactory2, IconComponents, IconDeviceDesktopAnalytics, IconFiles, IconHome, IconLogin, IconLogin2, IconMap, IconPassword, IconReport, IconServer, IconSettings, IconShield, IconTable, IconUsers } from "@tabler/icons-react" import { Box, Loader } from "@mantine/core" import TableTest from "./pages/TableTest" import ComponentTest from "./pages/ComponentTest" @@ -124,15 +123,6 @@ export const pages = [ dashboard: true, enabled: true, }, - { - label: "API Test", - path: "/api-test", - icon: , - component: , - drawer: true, - dashboard: true, - enabled: false, - }, { label: "ИКС", path: "/map-test", diff --git a/client/src/components/CustomTable.tsx b/client/src/components/CustomTable.tsx index e81497a..cd218d5 100644 --- a/client/src/components/CustomTable.tsx +++ b/client/src/components/CustomTable.tsx @@ -4,29 +4,34 @@ import { useMemo, useState } from 'react'; import styles from './CustomTable.module.scss' // Sample data -const initialData = [ - { id: 1, name: 'John Doe', age: 25 }, - { id: 2, name: 'Jane Smith', age: 30 }, - { id: 3, name: 'Sam Green', age: 22 }, -]; + +type DataType = { + id: number, + name: string, + age: number +} // Define columns -const columns: ColumnDef[] = [ +const columns: ColumnDef[] = [ { accessorKey: 'name', header: 'Name', - cell: (info: any) => info.getValue(), + cell: (info) => info.getValue(), maxSize: Number.MAX_SAFE_INTEGER, }, { accessorKey: 'age', header: 'Age', - cell: (info: any) => info.getValue(), + cell: (info) => info.getValue(), }, ]; const CustomTable = () => { - const [data, setData] = useState(initialData); + const [data, setData] = useState([ + { id: 1, name: 'John Doe', age: 25 }, + { id: 2, name: 'Jane Smith', age: 30 }, + { id: 3, name: 'Sam Green', age: 22 }, + ]); const [editingCell, setEditingCell] = useState({ rowIndex: null, columnId: null }); const tableColumns = useMemo[]>(() => columns, []); @@ -39,7 +44,11 @@ const CustomTable = () => { }); // Function to handle cell edit - const handleEditCell = (rowIndex: any, columnId: any, value: any) => { + const handleEditCell = ( + rowIndex: number, + columnId: keyof DataType, + value: DataType[keyof DataType] + ) => { const updatedData = [...data]; updatedData[rowIndex][columnId] = value; setData(updatedData); diff --git a/client/src/components/FolderViewer.tsx b/client/src/components/FolderViewer.tsx index 8d3a58f..ab220a7 100644 --- a/client/src/components/FolderViewer.tsx +++ b/client/src/components/FolderViewer.tsx @@ -1,12 +1,11 @@ import { useDocuments, useDownload, useFolders } from '../hooks/swrHooks' import { IDocument, IDocumentFolder } from '../interfaces/documents' -import { Folder, InsertDriveFile } from '@mui/icons-material' import React, { useEffect, useState } from 'react' import DocumentService from '../services/DocumentService' import { mutate } from 'swr' import FileViewer from './modals/FileViewer' import { ActionIcon, Anchor, Breadcrumbs, Button, Divider, FileButton, Flex, Loader, MantineStyleProp, RingProgress, ScrollAreaAutosize, Table, Text } from '@mantine/core' -import { IconCancel, IconDownload, IconFile, IconFilePlus, IconFileUpload, IconX } from '@tabler/icons-react' +import { IconCancel, IconDownload, IconFile, IconFileFilled, IconFilePlus, IconFileUpload, IconFolderFilled, IconX } from '@tabler/icons-react' interface FolderProps { folder: IDocumentFolder; @@ -39,7 +38,7 @@ function ItemFolder({ folder, handleFolderClick, ...props }: FolderProps) { style={FileItemStyle} {...props} > - + {folder.name} @@ -76,7 +75,7 @@ function ItemDocument({ doc, index, handleDocumentClick, ...props }: DocumentPro onClick={() => handleDocumentClick(index)} {...props} > - + {doc.name} diff --git a/client/src/components/ServerData.tsx b/client/src/components/ServerData.tsx index 322db37..81e3acb 100644 --- a/client/src/components/ServerData.tsx +++ b/client/src/components/ServerData.tsx @@ -1,12 +1,11 @@ import { IServer } from '../interfaces/servers' import { useServerIps } from '../hooks/swrHooks' -import { GridColDef } from '@mui/x-data-grid' import { Flex, Table } from '@mantine/core' function ServerData({ id }: IServer) { const { serverIps } = useServerIps(id, 0, 10) - const serverIpsColumns: GridColDef[] = [ + const serverIpsColumns = [ { field: 'id', headerName: 'ID', type: 'number' }, { field: 'server_id', headerName: 'Server ID', type: 'number' }, { field: 'name', headerName: 'Название', type: 'string' }, @@ -18,18 +17,6 @@ function ServerData({ id }: IServer) { return ( {serverIps && - // { - // //setCurrentServerData(params.row) - // //setServerDataOpen(true) - // }} - // onSave={undefined} - // onDelete={undefined} - // loading={false} - // /> diff --git a/client/src/components/ServerHardware.tsx b/client/src/components/ServerHardware.tsx index c2abe7c..70b3582 100644 --- a/client/src/components/ServerHardware.tsx +++ b/client/src/components/ServerHardware.tsx @@ -1,32 +1,15 @@ -import { AppBar, CircularProgress, Dialog, IconButton, Toolbar } from '@mui/material' import { useState } from 'react' -import { IRegion } from '../interfaces/fuel' import { useHardwares, useServers } from '../hooks/swrHooks' -import { GridColDef } from '@mui/x-data-grid' -import { Close } from '@mui/icons-material' -import ServerData from './ServerData' -import { Autocomplete, CloseButton, Table } from '@mantine/core' +import { Autocomplete, CloseButton, Loader, Table } from '@mantine/core' import { IServer } from '../interfaces/servers' export default function ServerHardware() { - const [open, setOpen] = useState(false) - const [selectedOption, setSelectedOption] = useState(null) - const { servers, isLoading } = useServers() + const [selectedOption, setSelectedOption] = useState(undefined) + const { servers } = useServers() - const [serverDataOpen, setServerDataOpen] = useState(false) - const [currentServerData, setCurrentServerData] = useState(null) + const { hardwares, isLoading: serversLoading } = useHardwares(selectedOption, 0, 10) - const handleInputChange = (value: string) => { - return value - } - - const handleOptionChange = (value: IRegion | null) => { - setSelectedOption(value) - } - - const { hardwares, isLoading: serversLoading } = useHardwares(selectedOption?.id, 0, 10) - - const hardwareColumns: GridColDef[] = [ + const hardwareColumns = [ { field: 'id', headerName: 'ID', type: 'number' }, { field: 'name', headerName: 'Название', type: 'string' }, { field: 'server_id', headerName: 'Server ID', type: 'number' }, @@ -39,38 +22,6 @@ export default function ServerHardware() { return ( <> - { - setServerDataOpen(false) - }} - aria-labelledby="modal-modal-title" - aria-describedby="modal-modal-description"> - - - { - setServerDataOpen(false) - }} - aria-label="close" - > - - - - - - {currentServerData && - - } - -
event.preventDefault()} onClick={() => { //setSearch('') - setSelectedOption(null) + setSelectedOption(undefined) }} aria-label="Clear value" /> @@ -98,53 +49,8 @@ export default function ServerHardware() { {serversLoading ? - + : - // { - // setOpen(true) - // }} - // onClose={() => { - // setOpen(false) - // }} - // onInputChange={(_, value) => handleInputChange(value)} - // onChange={(_, value) => handleOptionChange(value)} - // filterOptions={(x) => x} - // isOptionEqualToValue={(option: IRegion, value: IRegion) => option.name === value.name} - // getOptionLabel={(option: IRegion) => option.name ? option.name : ""} - // options={servers || []} - // loading={isLoading} - // value={selectedOption} - // renderInput={(params) => ( - // - // {isLoading ? : null} - // {params.InputProps.endAdornment} - // - // ) - // }} /> - // )} />} - // onSave={() => { - // }} - // onDelete={ServerService.removeServer} - // initialRows={hardwares || []} - // columns={hardwareColumns} - // actions - // onRowClick={(params) => { - // setCurrentServerData(params.row) - // setServerDataOpen(true) - // }} - // loading={false} - // />
diff --git a/client/src/components/ServerIpsView.tsx b/client/src/components/ServerIpsView.tsx index 80ec1c5..943b071 100644 --- a/client/src/components/ServerIpsView.tsx +++ b/client/src/components/ServerIpsView.tsx @@ -1,33 +1,15 @@ -import { AppBar, CircularProgress, Dialog, IconButton, Toolbar } from '@mui/material' -import { useState } from 'react' -import { IRegion } from '../interfaces/fuel' +import { useEffect, useState } from 'react' import { useServerIps, useServers } from '../hooks/swrHooks' -import ServerService from '../services/ServersService' -import { GridColDef } from '@mui/x-data-grid' -import { Close } from '@mui/icons-material' -import ServerData from './ServerData' -import { Autocomplete, CloseButton, Table } from '@mantine/core' +import { Autocomplete, CloseButton, Loader, Table } from '@mantine/core' import { IServer } from '../interfaces/servers' export default function ServerIpsView() { - const [open, setOpen] = useState(false) const [selectedOption, setSelectedOption] = useState(null) - const { servers, isLoading } = useServers() + const { servers } = useServers() - const [serverDataOpen, setServerDataOpen] = useState(false) - const [currentServerData, setCurrentServerData] = useState(null) + const { serverIps, isLoading: serversLoading } = useServerIps(selectedOption, 0, 10) - const handleInputChange = (value: string) => { - return value - } - - const handleOptionChange = (value: IRegion | null) => { - setSelectedOption(value) - } - - const { serverIps, isLoading: serversLoading } = useServerIps(selectedOption?.id, 0, 10) - - const serverIpsColumns: GridColDef[] = [ + const serverIpsColumns = [ { field: 'id', headerName: 'ID', type: 'number' }, { field: 'server_id', headerName: 'Server ID', type: 'number' }, { field: 'name', headerName: 'Название', type: 'string' }, @@ -36,40 +18,12 @@ export default function ServerIpsView() { { field: 'servername', headerName: 'Название сервера', type: 'string' }, ] + useEffect(() => { + console.log(serverIps) + }, [serverIps]) + return ( <> - { - setServerDataOpen(false) - }} - aria-labelledby="modal-modal-title" - aria-describedby="modal-modal-description"> - - - { - setServerDataOpen(false) - }} - aria-label="close" - > - - - - - - {currentServerData && - - } - -
{serversLoading ? - + : - // { - // setOpen(true) - // }} - // onClose={() => { - // setOpen(false) - // }} - // onInputChange={(_, value) => handleInputChange(value)} - // onChange={(_, value) => handleOptionChange(value)} - // filterOptions={(x) => x} - // isOptionEqualToValue={(option: IRegion, value: IRegion) => option.name === value.name} - // getOptionLabel={(option: IRegion) => option.name ? option.name : ""} - // options={servers || []} - // loading={isLoading} - // value={selectedOption} - // renderInput={(params) => ( - // - // {isLoading ? : null} - // {params.InputProps.endAdornment} - // - // ) - // }} /> - // )} />} - // onSave={() => { - // }} - // onDelete={ServerService.removeServer} - // initialRows={serverIps || []} - // columns={serverIpsColumns} - // actions - // onRowClick={(params) => { - // setCurrentServerData(params.row) - // setServerDataOpen(true) - // }} loading={false} - // />
diff --git a/client/src/components/ServerStorages.tsx b/client/src/components/ServerStorages.tsx index 2913a51..85aaf23 100644 --- a/client/src/components/ServerStorages.tsx +++ b/client/src/components/ServerStorages.tsx @@ -1,32 +1,14 @@ -import { AppBar, Autocomplete, CircularProgress, Dialog, IconButton, TextField, Toolbar } from '@mui/material' -import { Fragment, useState } from 'react' +import { useState } from 'react' import { IRegion } from '../interfaces/fuel' -import { useHardwares, useStorages } from '../hooks/swrHooks' -import FullFeaturedCrudGrid from './TableEditable' -import ServerService from '../services/ServersService' -import { GridColDef } from '@mui/x-data-grid' -import { Close } from '@mui/icons-material' -import ServerData from './ServerData' +import { useStorages } from '../hooks/swrHooks' +import { Loader, Table } from '@mantine/core' export default function ServerStorage() { - const [open, setOpen] = useState(false) const [selectedOption, setSelectedOption] = useState(null) - const { hardwares, isLoading } = useHardwares() - - const [serverDataOpen, setServerDataOpen] = useState(false) - const [currentServerData, setCurrentServerData] = useState(null) - - const handleInputChange = (value: string) => { - return value - } - - const handleOptionChange = (value: IRegion | null) => { - setSelectedOption(value) - } const { storages, isLoading: serversLoading } = useStorages(selectedOption?.id, 0, 10) - const storageColumns: GridColDef[] = [ + const storageColumns = [ { field: 'id', headerName: 'ID', type: 'number' }, { field: 'hardware_id', headerName: 'Hardware ID', type: 'number' }, { field: 'name', headerName: 'Название', type: 'string' }, @@ -36,86 +18,25 @@ export default function ServerStorage() { return ( <> - { - setServerDataOpen(false) - }} - aria-labelledby="modal-modal-title" - aria-describedby="modal-modal-description"> - - - { - setServerDataOpen(false) - }} - aria-label="close" - > - - - - - - {currentServerData && - - } - - {serversLoading ? - + : - { - setOpen(true) - }} - onClose={() => { - setOpen(false) - }} - onInputChange={(_, value) => handleInputChange(value)} - onChange={(_, value) => handleOptionChange(value)} - filterOptions={(x) => x} - isOptionEqualToValue={(option: IRegion, value: IRegion) => option.name === value.name} - getOptionLabel={(option: IRegion) => option.name ? option.name : ""} - options={hardwares || []} - loading={isLoading} - value={selectedOption} - renderInput={(params) => ( - - {isLoading ? : null} - {params.InputProps.endAdornment} - - ) - }} /> - )} />} - onSave={() => { - }} - onDelete={ServerService.removeServer} - initialRows={storages || []} - columns={storageColumns} - actions - onRowClick={(params) => { - setCurrentServerData(params.row) - setServerDataOpen(true) - }} - loading={false} - /> +
+ + + {storageColumns.map(column => ( + {column.headerName} + ))} + + + + + {storageColumns.map(column => ( + {storages ? storages[column.field] : ''} + ))} + + +
} ) diff --git a/client/src/components/ServersView.tsx b/client/src/components/ServersView.tsx index bfea7e0..2623ca4 100644 --- a/client/src/components/ServersView.tsx +++ b/client/src/components/ServersView.tsx @@ -1,14 +1,6 @@ -import { AppBar, Box, Dialog, Grid, IconButton, Toolbar } from '@mui/material' import { useState } from 'react' import { IRegion } from '../interfaces/fuel' -import { useRegions, useServers, useServersInfo } from '../hooks/swrHooks' -import { GridColDef } from '@mui/x-data-grid' -import { Close, Cloud, CloudOff } from '@mui/icons-material' -import ServerData from './ServerData' -import { IServersInfo } from '../interfaces/servers' -import CardInfo from './CardInfo/CardInfo' -import CardInfoLabel from './CardInfo/CardInfoLabel' -import CardInfoChip from './CardInfo/CardInfoChip' +import { useRegions, useServers } from '../hooks/swrHooks' import { useDebounce } from '@uidotdev/usehooks' import { Autocomplete, CloseButton, Table } from '@mantine/core' @@ -21,14 +13,9 @@ export default function ServersView() { const { regions } = useRegions(10, 1, debouncedSearch) - const { serversInfo } = useServersInfo(selectedOption) - - const [serverDataOpen, setServerDataOpen] = useState(false) - const [currentServerData, setCurrentServerData] = useState(null) - const { servers } = useServers(selectedOption, 0, 10) - const serversColumns: GridColDef[] = [ + const serversColumns = [ //{ field: 'id', headerName: 'ID', type: "number" }, { field: 'name', headerName: 'Название', type: "string", editable: true, @@ -37,101 +24,12 @@ export default function ServersView() { field: 'region_id', editable: true, headerName: 'region_id', - renderCell: (params) => ( -
- {params.value} -
- ), - // renderEditCell: (params: GridRenderCellParams) => ( - // setSearch(value)} - // onChange={(_, value) => { - // params.value = value - // }} - // isOptionEqualToValue={(option: IRegion, value: IRegion) => option.name === value.name} - // getOptionLabel={(option: IRegion) => option.name ? option.name : ""} - // options={regions || []} - // loading={isLoading} - // value={params.value} - // renderInput={(params) => ( - // - // {isLoading ? : null} - // {params.InputProps.endAdornment} - // - // ) - // }} - // /> - // )} - // /> - // ), flex: 1 } ] return ( <> - { - setServerDataOpen(false) - }} - aria-labelledby="modal-modal-title" - aria-describedby="modal-modal-description"> - - - { - setServerDataOpen(false) - }} - aria-label="close" - > - - - - - - {currentServerData && - - } - - - {serversInfo && - - - {serversInfo.map((serverInfo: IServersInfo) => ( - - - - - } - iconOff={} - /> - - - ))} - - - } - - - {/* setSearch(value)} - onChange={(_, value) => setSelectedOption(value)} - isOptionEqualToValue={(option: IRegion, value: IRegion) => option.id === value.id} - getOptionLabel={(option: IRegion) => option.name ? option.name : ""} - options={regions || []} - loading={isLoading} - value={selectedOption} - renderInput={(params) => ( - - {isLoading ? : null} - {params.InputProps.endAdornment} - - ) - }} - /> - )} - /> - } - onSave={() => { - }} - onDelete={ServerService.removeServer} - initialRows={servers} - columns={serversColumns} - actions - onRowClick={(params) => { - setCurrentServerData(params.row) - setServerDataOpen(true) - }} - /> */} ) } \ No newline at end of file diff --git a/client/src/components/TableEditable.tsx b/client/src/components/TableEditable.tsx deleted file mode 100644 index 5d50775..0000000 --- a/client/src/components/TableEditable.tsx +++ /dev/null @@ -1,233 +0,0 @@ -import { useEffect, useState } from 'react'; -import Box from '@mui/material/Box'; -import Button from '@mui/material/Button'; -import AddIcon from '@mui/icons-material/Add'; -import EditIcon from '@mui/icons-material/Edit'; -import DeleteIcon from '@mui/icons-material/DeleteOutlined'; -import SaveIcon from '@mui/icons-material/Save'; -import CancelIcon from '@mui/icons-material/Close'; -import { - GridRowsProp, - GridRowModesModel, - GridRowModes, - DataGrid, - GridColDef, - GridToolbarContainer, - GridActionsCellItem, - GridEventListener, - GridRowId, - GridRowModel, - GridRowEditStopReasons, - GridSlots, -} from '@mui/x-data-grid'; - -interface EditToolbarProps { - setRows: (newRows: (oldRows: GridRowsProp) => GridRowsProp) => void - setRowModesModel: ( - newModel: (oldModel: GridRowModesModel) => GridRowModesModel, - ) => void - columns: GridColDef[] - autoComplete?: React.ReactElement | null -} - -function EditToolbar(props: EditToolbarProps) { - const { setRows, setRowModesModel, columns, autoComplete } = props - - const handleClick = () => { - const id = Date.now().toString(36) - const newValues: any = {} - - columns.forEach(column => { - if (column.type === 'number') { - newValues[column.field] = 0 - } else if (column.type === 'string') { - newValues[column.field] = '' - } else if (column.type === 'boolean') { - newValues[column.field] = false - } else { - newValues[column.field] = undefined - } - - if (column.field === 'region_id') { - // column.valueGetter = (value: any) => { - // console.log(value) - // } - } - }) - - setRows((oldRows) => [...oldRows, { id, ...newValues, isNew: true }]); - setRowModesModel((oldModel) => ({ - ...oldModel, - [id]: { mode: GridRowModes.Edit, fieldToFocus: columns[0].field }, - })) - }; - - return ( - - {autoComplete && - - {autoComplete} - - } - - - - ); -} - -interface DataGridProps { - initialRows: GridRowsProp; - columns: GridColDef[]; - actions: boolean; - onRowClick: GridEventListener<"rowClick">; - onSave: any; - onDelete: any; - autoComplete?: React.ReactElement | null; - loading: boolean; -} - -export default function FullFeaturedCrudGrid({ - initialRows, - columns, - actions = false, - //onRowClick, - onSave, - onDelete, - autoComplete, - loading -}: DataGridProps) { - const [rows, setRows] = useState(initialRows); - const [rowModesModel, setRowModesModel] = useState({}); - - const handleRowEditStop: GridEventListener<'rowEditStop'> = (params, event) => { - if (params.reason === GridRowEditStopReasons.rowFocusOut) { - event.defaultMuiPrevented = true; - } - }; - - const handleEditClick = (id: GridRowId) => () => { - setRowModesModel({ ...rowModesModel, [id]: { mode: GridRowModes.Edit } }); - }; - - const handleSaveClick = (id: GridRowId) => () => { - setRowModesModel({ ...rowModesModel, [id]: { mode: GridRowModes.View } }); - onSave?.(id) - }; - - const handleDeleteClick = (id: GridRowId) => () => { - setRows(rows.filter((row) => row.id !== id)); - onDelete?.(id) - }; - - const handleCancelClick = (id: GridRowId) => () => { - setRowModesModel({ - ...rowModesModel, - [id]: { mode: GridRowModes.View, ignoreModifications: true }, - }); - - const editedRow = rows.find((row) => row.id === id); - if (editedRow!.isNew) { - setRows(rows.filter((row) => row.id !== id)); - } - }; - - const processRowUpdate = (newRow: GridRowModel) => { - const updatedRow = { ...newRow, isNew: false }; - setRows(rows.map((row) => (row.id === newRow.id ? updatedRow : row))); - return updatedRow; - }; - - const handleRowModesModelChange = (newRowModesModel: GridRowModesModel) => { - setRowModesModel(newRowModesModel); - }; - - useEffect(() => { - if (initialRows) { - setRows(initialRows) - } - }, [initialRows]) - - const actionColumns: GridColDef[] = [ - { - field: 'actions', - type: 'actions', - headerName: 'Действия', - width: 100, - cellClassName: 'actions', - getActions: ({ id }) => { - const isInEditMode = rowModesModel[id]?.mode === GridRowModes.Edit; - - if (isInEditMode) { - return [ - } - label="Save" - sx={{ - color: 'primary.main', - }} - onClick={handleSaveClick(id)} - />, - } - label="Cancel" - className="textPrimary" - onClick={handleCancelClick(id)} - color="inherit" - />, - ]; - } - - return [ - } - label="Edit" - className="textPrimary" - onClick={handleEditClick(id)} - color="inherit" - />, - } - label="Delete" - onClick={handleDeleteClick(id)} - color="inherit" - />, - ]; - }, - } - ] - - return ( - - - - ); -} \ No newline at end of file diff --git a/client/src/components/Tree/ObjectTree.tsx b/client/src/components/Tree/ObjectTree.tsx index 6f89de3..4c6b0ab 100644 --- a/client/src/components/Tree/ObjectTree.tsx +++ b/client/src/components/Tree/ObjectTree.tsx @@ -101,7 +101,7 @@ const ObjectList = ({ return ( {Array.isArray(data) && data.map((type) => ( - setCurrentObjectId(type.object_id)} /> + setCurrentObjectId(type.object_id)} /> ))} ) diff --git a/client/src/components/map/MapComponent.tsx b/client/src/components/map/MapComponent.tsx index ce28c07..f1459e8 100644 --- a/client/src/components/map/MapComponent.tsx +++ b/client/src/components/map/MapComponent.tsx @@ -2,13 +2,13 @@ import { useCallback, useEffect, useRef, useState } from 'react' import 'ol/ol.css' import Map from 'ol/Map' import View from 'ol/View' -import { Draw, Modify, Select, Snap, Translate } from 'ol/interaction' +import { DragBox, Draw, Modify, Select, Snap, Translate } from 'ol/interaction' import { ImageStatic, OSM, Vector as VectorSource, XYZ } from 'ol/source' import { Tile as TileLayer, VectorImage, Vector as VectorLayer } from 'ol/layer' import { click, never, platformModifierKeyOnly, primaryAction, shiftKeyOnly } from 'ol/events/condition' import Feature from 'ol/Feature' import { IRectCoords, SatelliteMapsProvider } from '../../interfaces/map' -import { Extent } from 'ol/extent' +import { Extent, getWidth } from 'ol/extent' import { drawingLayerStyle, highlightStyleRed, highlightStyleYellow, overlayStyle, regionsLayerStyle } from './MapStyles' import { googleMapsSatelliteSource, regionsLayerSource, yandexMapsSatelliteSource } from './MapSources' import ImageLayer from 'ol/layer/Image' @@ -22,7 +22,7 @@ import { get, transform } from 'ol/proj' import useSWR from 'swr' import { fetcher } from '../../http/axiosInstance' import { BASE_URL } from '../../constants' -import { Accordion, ActionIcon, Autocomplete, Box, CloseButton, Flex, Select as MantineSelect, MantineStyleProp, rem, ScrollAreaAutosize, Slider, useMantineColorScheme, Portal, Timeline, Text, Stack, NavLink, Grid, Checkbox } from '@mantine/core' +import { Accordion, ActionIcon, Autocomplete, Box, CloseButton, Flex, Select as MantineSelect, MantineStyleProp, rem, ScrollAreaAutosize, Slider, useMantineColorScheme, Portal, Timeline, Text, Stack, NavLink, Checkbox } from '@mantine/core' import { IconPlus, IconSearch, IconSettings, IconTable, IconUpload } from '@tabler/icons-react' import { getGridCellPosition } from './mapUtils' import { IFigure, ILine } from '../../interfaces/gis' @@ -32,7 +32,7 @@ import { IObjectParam } from '../../interfaces/objects' import MapToolbar from './MapToolbar/MapToolbar' import MapStatusbar from './MapStatusbar/MapStatusbar' import { measureStyleFunction, modifyStyle } from './Measure/MeasureStyles' -import { useMapStore } from '../../store/map' +import { setCurrentCoordinate, setCurrentX, setCurrentY, setCurrentZ, setSatMapsProvider, useMapStore } from '../../store/map' import { v4 as uuidv4 } from 'uuid' import { useThrottle } from '@uidotdev/usehooks' import ObjectTree from '../Tree/ObjectTree' @@ -42,6 +42,8 @@ import { setCurrentObjectId, setSelectedCity, setSelectedYear, useObjectsStore } const citySettings = [ { city_id: 145, + image_width: 8500, + image_height: 12544, // scale: 10000, scale: 9000, offset_x: 14442665.697619518, @@ -51,14 +53,11 @@ const citySettings = [ ] const MapComponent = () => { + + // States const { selectedCity, selectedYear, currentObjectId } = useObjectsStore() - - const mapState = useMapStore() - - const [currentCoordinate, setCurrentCoordinate] = useState(null) - const [currentZ, setCurrentZ] = useState(undefined) - const [currentX, setCurrentX] = useState(undefined) - const [currentY, setCurrentY] = useState(undefined) + const { currentTool, satMapsProvider } = useMapStore() + /// const [file, setFile] = useState(null) const [polygonExtent, setPolygonExtent] = useState(undefined) @@ -85,12 +84,85 @@ const MapComponent = () => { ///// + // Box selection + + const dragBox = useRef(new DragBox({ + condition: platformModifierKeyOnly + })) + + useEffect(() => { + if (dragBox.current) { + dragBox.current.on('boxend', function () { + const boxExtent = dragBox.current.getGeometry().getExtent(); + + // if the extent crosses the antimeridian process each world separately + const worldExtent = map.current?.getView().getProjection().getExtent(); + + if (worldExtent) { + const worldWidth = getWidth(worldExtent); + const startWorld = Math.floor((boxExtent[0] - worldExtent[0]) / worldWidth); + const endWorld = Math.floor((boxExtent[2] - worldExtent[0]) / worldWidth); + + for (let world = startWorld; world <= endWorld; ++world) { + const left = Math.max(boxExtent[0] - world * worldWidth, worldExtent[0]); + const right = Math.min(boxExtent[2] - world * worldWidth, worldExtent[2]); + const extent = [left, boxExtent[1], right, boxExtent[3]]; + + const boxFeatures = vectorSource + .getFeaturesInExtent(extent) + .filter( + (feature) => + !selectedFeatures.getArray().includes(feature) && + feature.getGeometry().intersectsExtent(extent), + ); + + // features that intersect the box geometry are added to the + // collection of selected features + + // if the view is not obliquely rotated the box geometry and + // its extent are equalivalent so intersecting features can + // be added directly to the collection + const rotation = map.getView().getRotation(); + const oblique = rotation % (Math.PI / 2) !== 0; + + // when the view is obliquely rotated the box extent will + // exceed its geometry so both the box and the candidate + // feature geometries are rotated around a common anchor + // to confirm that, with the box geometry aligned with its + // extent, the geometries intersect + if (oblique) { + const anchor = [0, 0]; + const geometry = dragBox.getGeometry().clone(); + geometry.translate(-world * worldWidth, 0); + geometry.rotate(-rotation, anchor); + const extent = geometry.getExtent(); + boxFeatures.forEach(function (feature) { + const geometry = feature.getGeometry().clone(); + geometry.rotate(-rotation, anchor); + if (geometry.intersectsExtent(extent)) { + selectedFeatures.push(feature); + } + }); + } else { + selectedFeatures.extend(boxFeatures); + } + } + } + }) + + // clear selection when drawing a new box and when clicking on the map + dragBox.current.on('boxstart', function () { + selectedFeatures.clear(); + }) + } + }, []) + + ///// + const mapElement = useRef(null) const map = useRef(null) - const [satMapsProvider, setSatMapsProvider] = useState('custom') - const gMapsSatSource = useRef(googleMapsSatelliteSource) const customMapSource = useRef(new XYZ({ @@ -134,7 +206,7 @@ const MapComponent = () => { } })) - const figuresLayer = useRef(new VectorImage({ + const figuresLayer = useRef(new VectorLayer({ source: new VectorSource(), declutter: true, properties: { @@ -143,7 +215,7 @@ const MapComponent = () => { } })) - const linesLayer = useRef(new VectorImage({ + const linesLayer = useRef(new VectorLayer({ source: new VectorSource(), declutter: true, properties: { @@ -179,6 +251,14 @@ const MapComponent = () => { } })) + const staticMapLayer = useRef>(new ImageLayer({ + properties: { + id: uuidv4(), + name: 'Static image' + } + })) + + // tile processing const handleImageDrop = useCallback((event: DragEvent) => { event.preventDefault(); @@ -360,6 +440,7 @@ const MapComponent = () => { layers: [ baseLayer.current, satLayer.current, + staticMapLayer.current, regionsLayer.current, citiesLayer.current, linesLayer.current, @@ -373,7 +454,8 @@ const MapComponent = () => { target: mapElement.current as HTMLDivElement, view: new View({ center: transform([129.7466541, 62.083504], 'EPSG:4326', 'EPSG:3857'),//center: fromLonLat([130.401113, 67.797368]), - zoom: 16, + //zoom: 16, + zoom: 15, maxZoom: 21, //extent: mapExtent, }), @@ -415,7 +497,7 @@ const MapComponent = () => { loadFeatures(drawingLayerSource) - regionsInit(map, selectedRegion, regionsLayer, setStatusText) + regionsInit(map, selectedRegion, regionsLayer) if (mapElement.current) { mapElement.current.addEventListener('dragover', (e) => { @@ -435,7 +517,7 @@ const MapComponent = () => { }, []) useEffect(() => { - if (mapState.currentTool) { + if (currentTool) { if (draw.current) map?.current?.removeInteraction(draw.current) //if (snap.current) map?.current?.removeInteraction(snap.current) addInteractions(drawingLayerSource, draw, map, snap, measureDraw, measureSource, measureModify) @@ -444,12 +526,10 @@ const MapComponent = () => { if (snap.current) map?.current?.removeInteraction(snap.current) if (measureDraw.current) map?.current?.removeInteraction(measureDraw.current) } - }, [mapState.currentTool]) + }, [currentTool]) const [satelliteOpacity, setSatelliteOpacity] = useState(0) - const [statusText, setStatusText] = useState('') - // Visibility setting useEffect(() => { satLayer.current?.setOpacity(satelliteOpacity) @@ -468,7 +548,11 @@ const MapComponent = () => { // Satellite tiles setting useEffect(() => { - satLayer.current?.setSource(satMapsProvider == 'google' ? gMapsSatSource.current : satMapsProvider == 'yandex' ? yMapsSatSource.current : satMapsProvider == 'custom' ? customMapSource.current : gMapsSatSource.current) + satLayer.current?.setSource( + satMapsProvider == 'google' ? gMapsSatSource.current : + satMapsProvider == 'yandex' ? yMapsSatSource.current : + satMapsProvider == 'custom' ? customMapSource.current : + gMapsSatSource.current) satLayer.current?.getSource()?.refresh() }, [satMapsProvider]) @@ -517,7 +601,7 @@ const MapComponent = () => { if (node.shape_type === 'LINE') { const coordinates: Coordinate[] = [] if (Array.isArray(node.shape)) { - node.shape.map((point: any) => { + node.shape.map((point: { x: number, y: number }) => { const coordinate = [point.x as number, point.y as number] as Coordinate coordinates.push(coordinate) }) @@ -658,24 +742,26 @@ const MapComponent = () => { w: 100000, h: 100000 } - let rotation = 0 + //let rotation = 0 - if (citySettings.find(el => el.city_id === selectedCity)) { + const settings = citySettings.find(el => el.city_id === selectedCity) + + if (settings) { console.log("City settings found") - if (citySettings.find(el => el.city_id === selectedCity)?.scale) { + if (settings.scale) { scale = { - w: citySettings.find(el => el.city_id === selectedCity).scale, - h: citySettings.find(el => el.city_id === selectedCity).scale + w: settings.scale, + h: settings.scale } } - if (citySettings.find(el => el.city_id === selectedCity)?.offset_x && citySettings.find(el => el.city_id === selectedCity)?.offset_y) { - offset_x = citySettings.find(el => el.city_id === selectedCity).offset_x - offset_y = citySettings.find(el => el.city_id === selectedCity).offset_y + if (settings.offset_x && settings.offset_y) { + offset_x = settings.offset_x + offset_y = settings.offset_y } - if (citySettings.find(el => el.city_id === selectedCity)?.rotation) { - rotation = citySettings.find(el => el.city_id === selectedCity)?.rotation + if (settings.rotation) { + //rotation = settings.rotation } } else { console.log("City settings NOT found") @@ -710,6 +796,78 @@ const MapComponent = () => { } }, [figuresData, linesData, selectedCity, selectedYear]) + useEffect(() => { + if (selectedCity) { + let offset_x = 14442665.697619518 + let offset_y = 8884520.63524492 + //let scale = 9000 + //let rotation = 0 + //let image_width = 8500 + //let image_height = 12544 + + const settings = citySettings.find(el => el.city_id === selectedCity) + + if (settings) { + console.log("City settings found") + + if (settings.scale) { + //scale = settings.scale + } + if (settings.offset_x && settings.offset_y) { + offset_x = settings.offset_x + offset_y = settings.offset_y + } + + if (settings.image_width && settings.image_height) { + //image_width = settings.image_width + //image_height = settings.image_height + } + + if (settings.rotation) { + //rotation = settings.rotation + } + } else { + console.log("City settings NOT found") + } + + const imageUrl = `${import.meta.env.VITE_API_EMS_URL}/static/${selectedCity}`; + const img = new Image(); + img.src = imageUrl; + img.onload = () => { + if (map.current) { + + const width = img.naturalWidth; + const height = img.naturalHeight; + console.log(width, height) + //const k = (width < height ? width / height : height / width) + const k = 0.40340 + + console.log(k) + + const wk = width * k + const hk = height * k + + const center = [offset_x + (wk), offset_y - (hk)]; + + const extent = [ + center[0] - (wk), + center[1] - (hk), + center[0] + (wk), + center[1] + (hk), + ]; + + // Set up the initial image layer with the extent + const imageSource = new ImageStatic({ + url: imageUrl, + imageExtent: extent, + }); + staticMapLayer.current.setSource(imageSource); + + //map.current.addLayer(imageLayer.current); + } + }; + } + }, [selectedCity]) useEffect(() => { // if (map.current) { @@ -754,7 +912,7 @@ const MapComponent = () => { setSatelliteOpacity(Array.isArray(value) ? value[0] : value)} /> - setSatMapsProvider(value as SatelliteMapsProvider)} /> + setSatMapsProvider(value as SatelliteMapsProvider)} /> @@ -949,11 +1107,6 @@ const MapComponent = () => {
diff --git a/client/src/components/map/MapStatusbar/MapStatusbar.tsx b/client/src/components/map/MapStatusbar/MapStatusbar.tsx index 50ac8a5..d40ff55 100644 --- a/client/src/components/map/MapStatusbar/MapStatusbar.tsx +++ b/client/src/components/map/MapStatusbar/MapStatusbar.tsx @@ -1,50 +1,42 @@ import { Divider, Flex, rem, Text } from '@mantine/core' -import { Coordinate } from 'ol/coordinate'; -import React, { CSSProperties } from 'react' +import { CSSProperties } from 'react' +import { useMapStore } from '../../../store/map'; interface IMapStatusbarProps { mapControlsStyle: CSSProperties; - currentCoordinate: Coordinate | null; - currentX: number | undefined; - currentY: number | undefined; - currentZ: number | undefined; - statusText: string; } const MapStatusbar = ({ mapControlsStyle, - currentCoordinate, - currentX, - currentY, - currentZ, - statusText }: IMapStatusbarProps) => { + const mapState = useMapStore() + return ( - x: {currentCoordinate?.[0]} + x: {mapState.currentCoordinate?.[0]} - y: {currentCoordinate?.[1]} + y: {mapState.currentCoordinate?.[1]} - Z={currentZ} + Z={mapState.currentZ} - X={currentX} + X={mapState.currentX} - Y={currentY} + Y={mapState.currentY} - {statusText} + {mapState.statusText} ) diff --git a/client/src/components/map/mapUtils.ts b/client/src/components/map/mapUtils.ts index 0dc44c4..76ba7d3 100644 --- a/client/src/components/map/mapUtils.ts +++ b/client/src/components/map/mapUtils.ts @@ -20,15 +20,14 @@ import ImageLayer from "ol/layer/Image"; import { IFigure, ILine } from "../../interfaces/gis"; import { fromCircle } from "ol/geom/Polygon"; import { measureStyleFunction, modifyStyle } from "./Measure/MeasureStyles"; -import { getCurrentTool, getMeasureClearPrevious, getMeasureType, getTipPoint } from "../../store/map"; -import { VectorImage } from "ol/layer"; +import { getCurrentTool, getMeasureClearPrevious, getMeasureType, getTipPoint, setStatusText } from "../../store/map"; import { MutableRefObject } from "react"; export function processLine( line: ILine, scaling: { w: number, h: number }, mapCenter: Coordinate, - linesLayer: React.MutableRefObject, VectorSource>>> + linesLayer: MutableRefObject> ) { const x1 = line.x1 * scaling.w const y1 = line.y1 * scaling.h @@ -55,7 +54,7 @@ export function processFigure( figure: IFigure, scaling: { w: number, h: number }, mapCenter: Coordinate, - figuresLayer: React.MutableRefObject, VectorSource>>> + figuresLayer: MutableRefObject> ) { if (figure.figure_type_id == 1) { const width = figure.width * scaling.w @@ -262,8 +261,6 @@ export function regionsInit( map: React.MutableRefObject, selectedRegion: React.MutableRefObject | null>, regionsLayer: React.MutableRefObject, VectorSource>>>, - setStatusText: (value: React.SetStateAction) => void, - ) { map.current?.on('click', function (e) { if (selectedRegion.current !== null) { diff --git a/client/src/components/modals/FileViewer.tsx b/client/src/components/modals/FileViewer.tsx index 21689bf..a776478 100644 --- a/client/src/components/modals/FileViewer.tsx +++ b/client/src/components/modals/FileViewer.tsx @@ -1,6 +1,4 @@ import { useEffect, useRef } from 'react' -import { AppBar, Box, Button, CircularProgress, Dialog, IconButton, Toolbar, Typography } from '@mui/material'; -import { ChevronLeft, ChevronRight, Close, Warning } from '@mui/icons-material'; import { useDownload, useFileType } from '../../hooks/swrHooks'; import jsPreviewExcel from "@js-preview/excel" @@ -11,6 +9,8 @@ import '@js-preview/docx/lib/index.css' import jsPreviewPdf from '@js-preview/pdf' import { IDocument } from '../../interfaces/documents'; +import { IconAlertTriangle, IconChevronLeft, IconChevronRight } from '@tabler/icons-react'; +import { Button, Flex, Grid, Loader, Modal, ScrollAreaAutosize, Text } from '@mantine/core'; interface Props { open: boolean; @@ -45,9 +45,9 @@ function PdfViewer({ }, [previewContainerRef]) return ( - ) } @@ -75,9 +75,9 @@ function DocxViewer({ }, []) return ( - ) } @@ -101,9 +101,9 @@ function ExcelViewer({ }, []) return ( - ) } @@ -112,7 +112,7 @@ function ImageViewer({ url }: ViewerProps) { return ( - - +
) } @@ -151,118 +151,106 @@ export default function FileViewer({ } return ( - { - setOpen(false) - setCurrentFileNo(-1) - }} - aria-labelledby="modal-modal-title" - aria-describedby="modal-modal-description" - > - - - { - setOpen(false) - setCurrentFileNo(-1) - }} - aria-label="close" - > - - - - - {currentFileNo != -1 && docs[currentFileNo].name} - - -
- { - if (currentFileNo >= 0 && currentFileNo > 0) { - setCurrentFileNo(currentFileNo - 1) - } - }} - disabled={currentFileNo >= 0 && currentFileNo === 0} - > - - - - { - if (currentFileNo >= 0 && currentFileNo < docs.length) { - setCurrentFileNo(currentFileNo + 1) - } - }} - disabled={currentFileNo >= 0 && currentFileNo >= docs.length - 1} - > - - -
- - -
-
- - setOpen(false)} scrollAreaComponent={ScrollAreaAutosize.Autosize}> + + - {fileIsLoading || fileTypeIsLoading ? - - - - : - fileType === 'application/pdf' ? - - : - fileType === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ? - - : - fileType === 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' ? - - : - fileType?.startsWith('image/') ? - - : - fileType && file ? - - - - - Предпросмотр данного файла невозможен. - - + + + + {currentFileNo != -1 && docs[currentFileNo].name} - - - - + + + + + + + + + + + + + + + + + {fileIsLoading || fileTypeIsLoading ? + + + + : + fileType === 'application/pdf' ? + + : + fileType === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ? + + : + fileType === 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' ? + + : + fileType?.startsWith('image/') ? + : - null - } - -
+ fileType && file ? + + + + + Предпросмотр данного файла невозможен. + + + + + + + + : + null + } + + + ) } \ No newline at end of file diff --git a/client/src/interfaces/map.ts b/client/src/interfaces/map.ts index 1aa438d..cfabd55 100644 --- a/client/src/interfaces/map.ts +++ b/client/src/interfaces/map.ts @@ -1,18 +1,8 @@ import { Coordinate } from "ol/coordinate"; -export interface SatelliteMapsProviders { - google: 'google'; - yandex: 'yandex'; - custom: 'custom'; -} -export type SatelliteMapsProvider = SatelliteMapsProviders[keyof SatelliteMapsProviders] +export type SatelliteMapsProvider = 'google' | 'yandex' | 'custom' | 'static' -export interface IGeometryTypes { - LINE: 'LINE' - POLYGON: 'POLYGON' -} - -export type IGeometryType = IGeometryTypes[keyof IGeometryTypes] +export type IGeometryType = 'LINE' | 'POLYGON' export interface IRectCoords { bl: Coordinate | undefined, diff --git a/client/src/pages/ApiTest.tsx b/client/src/pages/ApiTest.tsx deleted file mode 100644 index 3c108df..0000000 --- a/client/src/pages/ApiTest.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { useCities } from "../hooks/swrHooks" -import { useEffect, useState } from "react" -import { DataGrid, GridColDef } from "@mui/x-data-grid" -import axiosInstance from "../http/axiosInstance" -import { BASE_URL } from "../constants" -import { Flex } from "@mantine/core" - - -export default function ApiTest() { - const limit = 10 - - const [paginationModel, setPaginationModel] = useState({ - page: 1, - pageSize: limit - }) - - const [rowCount, setRowCount] = useState(0) - - const fetchCount = async () => { - await axiosInstance.get(`/general/cities_count`, { - baseURL: BASE_URL.fuel - }).then(response => { - setRowCount(response.data) - }) - } - - const { cities, isLoading } = useCities(paginationModel.pageSize, paginationModel.page) - - useEffect(() => { - fetchCount() - }, []) - - const citiesColumns: GridColDef[] = [ - { field: 'id' }, - { field: 'name' }, - ] - - return ( - - - - ) -} \ No newline at end of file diff --git a/client/src/pages/Boilers.tsx b/client/src/pages/Boilers.tsx index 63a078a..ef1de0e 100644 --- a/client/src/pages/Boilers.tsx +++ b/client/src/pages/Boilers.tsx @@ -1,4 +1,3 @@ -import { GridColDef } from '@mui/x-data-grid' import { useEffect, useState } from 'react' import { useBoilers } from '../hooks/swrHooks' import { Badge, ScrollAreaAutosize, Table, Text } from '@mantine/core' @@ -24,7 +23,7 @@ function Boilers() { setBoilerSearch("") }, []) - const boilersColumns: GridColDef[] = [ + const boilersColumns = [ { field: 'id_object', headerName: 'ID', type: "number" }, { field: 'boiler_name', headerName: 'Название', type: "string", flex: 1 }, { field: 'boiler_code', headerName: 'Код', type: "string", flex: 1 }, @@ -48,7 +47,7 @@ function Boilers() { - {boilers.map((boiler: any) => ( + {boilers.map((boiler: {id_object: string, activity: boolean}) => ( {boilersColumns.map(column => { if (column.field === 'activity') { diff --git a/client/src/pages/Roles.tsx b/client/src/pages/Roles.tsx index 8ae7e0e..cff0204 100644 --- a/client/src/pages/Roles.tsx +++ b/client/src/pages/Roles.tsx @@ -1,4 +1,3 @@ -import { GridColDef } from '@mui/x-data-grid' import { useRoles } from '../hooks/swrHooks' import { CreateField } from '../interfaces/create' import RoleService from '../services/RoleService' @@ -16,7 +15,7 @@ export default function Roles() { { key: 'description', headerName: 'Описание', type: 'string', required: false, defaultValue: '' }, ] - const columns: GridColDef[] = [ + const columns = [ { field: 'id', headerName: 'ID', type: "number" }, { field: 'name', headerName: 'Название', flex: 1, editable: true }, { field: 'description', headerName: 'Описание', flex: 1, editable: true }, diff --git a/client/src/pages/Users.tsx b/client/src/pages/Users.tsx index ca2266d..52b2ff2 100644 --- a/client/src/pages/Users.tsx +++ b/client/src/pages/Users.tsx @@ -1,4 +1,3 @@ -import { GridColDef } from "@mui/x-data-grid" import { useRoles, useUsers } from "../hooks/swrHooks" import { IRole } from "../interfaces/role" import { useEffect, useState } from "react" @@ -32,7 +31,7 @@ export default function Users() { { key: 'password', headerName: 'Пароль', type: 'string', required: true, defaultValue: '' }, ] - const columns: GridColDef[] = [ + const columns = [ { field: 'id', headerName: 'ID', type: "number", flex: 1 }, { field: 'email', headerName: 'Email', flex: 1, editable: true }, { field: 'login', headerName: 'Логин', flex: 1, editable: true }, diff --git a/client/src/pages/auth/PasswordReset.tsx b/client/src/pages/auth/PasswordReset.tsx index cd10866..95390d1 100644 --- a/client/src/pages/auth/PasswordReset.tsx +++ b/client/src/pages/auth/PasswordReset.tsx @@ -1,8 +1,8 @@ import { useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form'; import AuthService from '../../services/AuthService'; -import { CheckCircle } from '@mui/icons-material'; import { Button, Flex, Loader, Paper, Text, TextInput, Transition } from '@mantine/core'; +import { IconCheck } from '@tabler/icons-react'; interface PasswordResetProps { email: string; @@ -73,7 +73,7 @@ function PasswordReset() { {(styles) => - + На указанный адрес было отправлено письмо с новыми данными для авторизации. diff --git a/client/src/store/map.ts b/client/src/store/map.ts index a1003f8..10f8739 100644 --- a/client/src/store/map.ts +++ b/client/src/store/map.ts @@ -2,14 +2,22 @@ import { create } from 'zustand'; import { ToolType } from '../types/tools'; import { Point } from 'ol/geom'; import Map from 'ol/Map'; +import { Coordinate } from 'ol/coordinate'; +import { SatelliteMapsProvider } from '../interfaces/map'; interface MapState { - currentTool: ToolType, - measureType: "LineString" | "Polygon", - measureShowSegments: boolean, - measureClearPrevious: boolean, - tipPoint: Point | null, - map: Map | null + currentTool: ToolType; + measureType: "LineString" | "Polygon"; + measureShowSegments: boolean; + measureClearPrevious: boolean; + tipPoint: Point | null; + map: Map | null; + currentZ: number | undefined; + currentX: number | undefined; + currentY: number | undefined; + currentCoordinate: Coordinate | null; + statusText: string; + satMapsProvider: SatelliteMapsProvider; } export const useMapStore = create(() => ({ @@ -18,16 +26,21 @@ export const useMapStore = create(() => ({ measureShowSegments: true, measureClearPrevious: true, tipPoint: null, - map: null + map: null, + currentZ: undefined, + currentX: undefined, + currentY: undefined, + currentCoordinate: null, + statusText: '', + satMapsProvider: 'custom' })); -const getMap = () => { - return useMapStore.getState().map -} - -const setMap = (map: Map | null) => { - useMapStore.setState(() => ({ map: map })) -} +const setCurrentZ = (z: number | undefined) => useMapStore.setState(() => ({ currentZ: z })) +const setCurrentX = (x: number | undefined) => useMapStore.setState(() => ({ currentX: x })) +const setCurrentY = (y: number | undefined) => useMapStore.setState(() => ({ currentY: y })) +const setCurrentCoordinate = (c: Coordinate | null) => useMapStore.setState(() => ({ currentCoordinate: c })) +const setStatusText = (t: string) => useMapStore.setState(() => ({ statusText: t })) +const setSatMapsProvider = (p: SatelliteMapsProvider) => useMapStore.setState(() => ({ satMapsProvider: p })) const setTipPoint = (tipPoint: Point | null) => { useMapStore.setState(() => ({ tipPoint: tipPoint })) @@ -81,5 +94,11 @@ export { setMeasureType, getMeasureType, getTipPoint, - setTipPoint + setTipPoint, + setCurrentZ, + setCurrentX, + setCurrentY, + setCurrentCoordinate, + setStatusText, + setSatMapsProvider } \ No newline at end of file diff --git a/client/yarn.lock b/client/yarn.lock index 27b7499..83bb2b5 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -29,7 +29,7 @@ jsonpointer "^5.0.0" leven "^3.1.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.24.7": +"@babel/code-frame@^7.24.7": version "7.24.7" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz" integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== @@ -164,7 +164,7 @@ "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" -"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.24.7": +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.24.7": version "7.24.7" resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz" integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== @@ -936,7 +936,7 @@ resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.0", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.13", "@babel/runtime@^7.23.9", "@babel/runtime@^7.24.7", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": +"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.0", "@babel/runtime@^7.20.13", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": version "7.24.7" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz" integrity sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw== @@ -982,113 +982,6 @@ resolved "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.2.0.tgz" integrity sha512-+imAQkHf7U/Rwvu0wk1XWgsP3WnpCWmK7B48f0XqSNzgk64+grljTKC7pnO/xBiEMUziF7vKRfbBnOQhg126qQ== -"@emotion/babel-plugin@^11.11.0": - version "11.11.0" - resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz" - integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ== - dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/runtime" "^7.18.3" - "@emotion/hash" "^0.9.1" - "@emotion/memoize" "^0.8.1" - "@emotion/serialize" "^1.1.2" - babel-plugin-macros "^3.1.0" - convert-source-map "^1.5.0" - escape-string-regexp "^4.0.0" - find-root "^1.1.0" - source-map "^0.5.7" - stylis "4.2.0" - -"@emotion/cache@^11.11.0": - version "11.11.0" - resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz" - integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ== - dependencies: - "@emotion/memoize" "^0.8.1" - "@emotion/sheet" "^1.2.2" - "@emotion/utils" "^1.2.1" - "@emotion/weak-memoize" "^0.3.1" - stylis "4.2.0" - -"@emotion/hash@^0.9.1": - version "0.9.1" - resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz" - integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== - -"@emotion/is-prop-valid@^1.2.2": - version "1.2.2" - resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz" - integrity sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw== - dependencies: - "@emotion/memoize" "^0.8.1" - -"@emotion/memoize@^0.8.1": - version "0.8.1" - resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz" - integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== - -"@emotion/react@^11.0.0-rc.0", "@emotion/react@^11.11.4", "@emotion/react@^11.4.1", "@emotion/react@^11.5.0", "@emotion/react@^11.9.0": - version "11.11.4" - resolved "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz" - integrity sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw== - dependencies: - "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.11.0" - "@emotion/cache" "^11.11.0" - "@emotion/serialize" "^1.1.3" - "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" - "@emotion/utils" "^1.2.1" - "@emotion/weak-memoize" "^0.3.1" - hoist-non-react-statics "^3.3.1" - -"@emotion/serialize@^1.1.2", "@emotion/serialize@^1.1.3", "@emotion/serialize@^1.1.4": - version "1.1.4" - resolved "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz" - integrity sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ== - dependencies: - "@emotion/hash" "^0.9.1" - "@emotion/memoize" "^0.8.1" - "@emotion/unitless" "^0.8.1" - "@emotion/utils" "^1.2.1" - csstype "^3.0.2" - -"@emotion/sheet@^1.2.2": - version "1.2.2" - resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz" - integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA== - -"@emotion/styled@^11.11.5", "@emotion/styled@^11.3.0", "@emotion/styled@^11.8.1": - version "11.11.5" - resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.5.tgz" - integrity sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ== - dependencies: - "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.11.0" - "@emotion/is-prop-valid" "^1.2.2" - "@emotion/serialize" "^1.1.4" - "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" - "@emotion/utils" "^1.2.1" - -"@emotion/unitless@^0.8.1": - version "0.8.1" - resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz" - integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== - -"@emotion/use-insertion-effect-with-fallbacks@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz" - integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== - -"@emotion/utils@^1.2.1": - version "1.2.1" - resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz" - integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg== - -"@emotion/weak-memoize@^0.3.1": - version "0.3.1" - resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz" - integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== - "@esbuild/win32-x64@0.21.5": version "0.21.5" resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz" @@ -1141,7 +1034,7 @@ "@floating-ui/core" "^1.0.0" "@floating-ui/utils" "^0.2.0" -"@floating-ui/react-dom@^2.0.8", "@floating-ui/react-dom@^2.1.2": +"@floating-ui/react-dom@^2.1.2": version "2.1.2" resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz" integrity sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A== @@ -1352,128 +1245,6 @@ resolved "https://registry.npmjs.org/@mantine/tiptap/-/tiptap-7.13.0.tgz" integrity sha512-WoquUeyX6s6CVFkm4qwJWSt9e10JjX9p/LdGPpdKLn0lrJ4vGJy+L2zFDcoDxwXwgUKIw32rTmIoSsxUBziVIQ== -"@mui/base@^5.0.0-beta.40", "@mui/base@5.0.0-beta.40": - version "5.0.0-beta.40" - resolved "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz" - integrity sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ== - dependencies: - "@babel/runtime" "^7.23.9" - "@floating-ui/react-dom" "^2.0.8" - "@mui/types" "^7.2.14" - "@mui/utils" "^5.15.14" - "@popperjs/core" "^2.11.8" - clsx "^2.1.0" - prop-types "^15.8.1" - -"@mui/core-downloads-tracker@^5.15.20": - version "5.15.20" - resolved "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.20.tgz" - integrity sha512-DoL2ppgldL16utL8nNyj/P12f8mCNdx/Hb/AJnX9rLY4b52hCMIx1kH83pbXQ6uMy6n54M3StmEbvSGoj2OFuA== - -"@mui/icons-material@^5.15.20": - version "5.15.20" - resolved "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.20.tgz" - integrity sha512-oGcKmCuHaYbAAoLN67WKSXtHmEgyWcJToT1uRtmPyxMj9N5uqwc/mRtEnst4Wj/eGr+zYH2FiZQ79v9k7kSk1Q== - dependencies: - "@babel/runtime" "^7.23.9" - -"@mui/material@^5.0.0", "@mui/material@^5.15.14", "@mui/material@^5.15.20": - version "5.15.20" - resolved "https://registry.npmjs.org/@mui/material/-/material-5.15.20.tgz" - integrity sha512-tVq3l4qoXx/NxUgIx/x3lZiPn/5xDbdTE8VrLczNpfblLYZzlrbxA7kb9mI8NoBF6+w9WE9IrxWnKK5KlPI2bg== - dependencies: - "@babel/runtime" "^7.23.9" - "@mui/base" "5.0.0-beta.40" - "@mui/core-downloads-tracker" "^5.15.20" - "@mui/system" "^5.15.20" - "@mui/types" "^7.2.14" - "@mui/utils" "^5.15.20" - "@types/react-transition-group" "^4.4.10" - clsx "^2.1.0" - csstype "^3.1.3" - prop-types "^15.8.1" - react-is "^18.2.0" - react-transition-group "^4.4.5" - -"@mui/private-theming@^5.15.20": - version "5.15.20" - resolved "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.20.tgz" - integrity sha512-BK8F94AIqSrnaPYXf2KAOjGZJgWfvqAVQ2gVR3EryvQFtuBnG6RwodxrCvd3B48VuMy6Wsk897+lQMUxJyk+6g== - dependencies: - "@babel/runtime" "^7.23.9" - "@mui/utils" "^5.15.20" - prop-types "^15.8.1" - -"@mui/styled-engine@^5.15.14": - version "5.15.14" - resolved "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.14.tgz" - integrity sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw== - dependencies: - "@babel/runtime" "^7.23.9" - "@emotion/cache" "^11.11.0" - csstype "^3.1.3" - prop-types "^15.8.1" - -"@mui/system@^5.15.20": - version "5.15.20" - resolved "https://registry.npmjs.org/@mui/system/-/system-5.15.20.tgz" - integrity sha512-LoMq4IlAAhxzL2VNUDBTQxAb4chnBe8JvRINVNDiMtHE2PiPOoHlhOPutSxEbaL5mkECPVWSv6p8JEV+uykwIA== - dependencies: - "@babel/runtime" "^7.23.9" - "@mui/private-theming" "^5.15.20" - "@mui/styled-engine" "^5.15.14" - "@mui/types" "^7.2.14" - "@mui/utils" "^5.15.20" - clsx "^2.1.0" - csstype "^3.1.3" - prop-types "^15.8.1" - -"@mui/types@^7.2.14": - version "7.2.14" - resolved "https://registry.npmjs.org/@mui/types/-/types-7.2.14.tgz" - integrity sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ== - -"@mui/utils@^5.15.14", "@mui/utils@^5.15.20": - version "5.15.20" - resolved "https://registry.npmjs.org/@mui/utils/-/utils-5.15.20.tgz" - integrity sha512-mAbYx0sovrnpAu1zHc3MDIhPqL8RPVC5W5xcO1b7PiSCJPtckIZmBkp8hefamAvUiAV8gpfMOM6Zb+eSisbI2A== - dependencies: - "@babel/runtime" "^7.23.9" - "@types/prop-types" "^15.7.11" - prop-types "^15.8.1" - react-is "^18.2.0" - -"@mui/x-charts@^7.8.0": - version "7.8.0" - resolved "https://registry.npmjs.org/@mui/x-charts/-/x-charts-7.8.0.tgz" - integrity sha512-SosaVtx4Ig1nu/loH6Mq4peH5Pq5UvVEnsMfe4G2IEVrMxfwrktWJo+86t9LxiHTERt4wxPKnsqlhkgBIf9ePQ== - dependencies: - "@babel/runtime" "^7.24.7" - "@mui/base" "^5.0.0-beta.40" - "@mui/system" "^5.15.20" - "@mui/utils" "^5.15.20" - "@react-spring/rafz" "^9.7.3" - "@react-spring/web" "^9.7.3" - clsx "^2.1.1" - d3-color "^3.1.0" - d3-delaunay "^6.0.4" - d3-interpolate "^3.0.1" - d3-scale "^4.0.2" - d3-shape "^3.2.0" - prop-types "^15.8.1" - -"@mui/x-data-grid@^7.7.1": - version "7.7.1" - resolved "https://registry.npmjs.org/@mui/x-data-grid/-/x-data-grid-7.7.1.tgz" - integrity sha512-5XsvuVpJfjV2ERtNiVRWL+0UUq5rh2Tq8aLZdJ8Ca5PnweEfNzOesQMlf0lpjXqnzuoq7uTwvICqoAMjsTTglg== - dependencies: - "@babel/runtime" "^7.24.7" - "@mui/system" "^5.15.20" - "@mui/utils" "^5.15.20" - clsx "^2.1.1" - prop-types "^15.8.1" - reselect "^4.1.8" - "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" @@ -1505,55 +1276,11 @@ resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@popperjs/core@^2.11.8", "@popperjs/core@^2.9.0": +"@popperjs/core@^2.9.0": version "2.11.8" resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz" integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== -"@react-spring/animated@~9.7.3": - version "9.7.3" - resolved "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.3.tgz" - integrity sha512-5CWeNJt9pNgyvuSzQH+uy2pvTg8Y4/OisoscZIR8/ZNLIOI+CatFBhGZpDGTF/OzdNFsAoGk3wiUYTwoJ0YIvw== - dependencies: - "@react-spring/shared" "~9.7.3" - "@react-spring/types" "~9.7.3" - -"@react-spring/core@~9.7.3": - version "9.7.3" - resolved "https://registry.npmjs.org/@react-spring/core/-/core-9.7.3.tgz" - integrity sha512-IqFdPVf3ZOC1Cx7+M0cXf4odNLxDC+n7IN3MDcVCTIOSBfqEcBebSv+vlY5AhM0zw05PDbjKrNmBpzv/AqpjnQ== - dependencies: - "@react-spring/animated" "~9.7.3" - "@react-spring/shared" "~9.7.3" - "@react-spring/types" "~9.7.3" - -"@react-spring/rafz@^9.7.3": - version "9.7.3" - resolved "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.3.tgz" - integrity sha512-9vzW1zJPcC4nS3aCV+GgcsK/WLaB520Iyvm55ARHfM5AuyBqycjvh1wbmWmgCyJuX4VPoWigzemq1CaaeRSHhQ== - -"@react-spring/shared@~9.7.3": - version "9.7.3" - resolved "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.3.tgz" - integrity sha512-NEopD+9S5xYyQ0pGtioacLhL2luflh6HACSSDUZOwLHoxA5eku1UPuqcJqjwSD6luKjjLfiLOspxo43FUHKKSA== - dependencies: - "@react-spring/types" "~9.7.3" - -"@react-spring/types@~9.7.3": - version "9.7.3" - resolved "https://registry.npmjs.org/@react-spring/types/-/types-9.7.3.tgz" - integrity sha512-Kpx/fQ/ZFX31OtlqVEFfgaD1ACzul4NksrvIgYfIFq9JpDHFwQkMVZ10tbo0FU/grje4rcL4EIrjekl3kYwgWw== - -"@react-spring/web@^9.7.3": - version "9.7.3" - resolved "https://registry.npmjs.org/@react-spring/web/-/web-9.7.3.tgz" - integrity sha512-BXt6BpS9aJL/QdVqEIX9YoUy8CE6TJrU0mNCqSoxdXlIeNcEBWOfIyE6B14ENNsyQKS3wOWkiJfco0tCr/9tUg== - dependencies: - "@react-spring/animated" "~9.7.3" - "@react-spring/core" "~9.7.3" - "@react-spring/shared" "~9.7.3" - "@react-spring/types" "~9.7.3" - "@remirror/core-constants@3.0.0": version "3.0.0" resolved "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-3.0.0.tgz" @@ -1958,17 +1685,12 @@ resolved "https://registry.npmjs.org/@siedlerchr/types-ol-ext/-/types-ol-ext-3.5.0.tgz" integrity sha512-qC6hvHtLBqHSEGxqCkHlc/e0ZhMZNy9MlcY80i6yH8cwSJydOsmVK0BaCZ4WY/s4goFwx5hoZ7CkRy/P4KHLCg== -"@types/parse-json@^4.0.0": - version "4.0.2" - resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz" - integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== - "@types/proj4@^2.5.5": version "2.5.5" resolved "https://registry.npmjs.org/@types/proj4/-/proj4-2.5.5.tgz" integrity sha512-y4tHUVVoMEOm2nxRLQ2/ET8upj/pBmoutGxFw2LZJTQWPgWXI+cbxVEUFFmIzr/bpFR83hGDOTSXX6HBeObvZA== -"@types/prop-types@*", "@types/prop-types@^15.7.11": +"@types/prop-types@*": version "15.7.12" resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz" integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== @@ -1985,14 +1707,7 @@ dependencies: "@types/react" "*" -"@types/react-transition-group@^4.4.10": - version "4.4.10" - resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz" - integrity sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q== - dependencies: - "@types/react" "*" - -"@types/react@*", "@types/react@^16.8.0 || ^17.0.0 || ^18.0.0", "@types/react@^16.9.0 || ^17.0.0 || ^18.0.0", "@types/react@^17.0.0 || ^18.0.0", "@types/react@^18.2.66", "@types/react@>=16.8": +"@types/react@*", "@types/react@^16.8.0 || ^17.0.0 || ^18.0.0", "@types/react@^16.9.0 || ^17.0.0 || ^18.0.0", "@types/react@^18.2.66", "@types/react@>=16.8": version "18.3.3" resolved "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz" integrity sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw== @@ -2325,15 +2040,6 @@ axios@^1.7.2: form-data "^4.0.0" proxy-from-env "^1.1.0" -babel-plugin-macros@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz" - integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== - dependencies: - "@babel/runtime" "^7.12.5" - cosmiconfig "^7.0.0" - resolve "^1.19.0" - babel-plugin-polyfill-corejs2@^0.4.10: version "0.4.11" resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz" @@ -2690,7 +2396,7 @@ clipboardy@3.0.0: execa "^5.1.1" is-wsl "^2.2.0" -clsx@^2.0.0, clsx@^2.1.0, clsx@^2.1.1: +clsx@^2.0.0, clsx@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== @@ -2811,11 +2517,6 @@ content-disposition@0.5.2: resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz" integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== -convert-source-map@^1.5.0: - version "1.9.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - convert-source-map@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" @@ -2838,17 +2539,6 @@ core-util-is@~1.0.0: resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cosmiconfig@^7.0.0: - version "7.1.0" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz" - integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - create-ecdh@^4.0.0: version "4.0.4" resolved "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz" @@ -2933,7 +2623,7 @@ cssesc@^3.0.0: resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -csstype@^3.0.2, csstype@^3.1.3: +csstype@^3.0.2: version "3.1.3" resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== @@ -2945,18 +2635,11 @@ d3-array@^3.1.6, "d3-array@2 - 3", "d3-array@2.10.0 - 3": dependencies: internmap "1 - 2" -d3-color@^3.1.0, "d3-color@1 - 3": +"d3-color@1 - 3": version "3.1.0" resolved "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz" integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== -d3-delaunay@^6.0.4: - version "6.0.4" - resolved "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz" - integrity sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A== - dependencies: - delaunator "5" - d3-ease@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz" @@ -2990,7 +2673,7 @@ d3-scale@^4.0.2: d3-time "2.1.1 - 3" d3-time-format "2 - 4" -d3-shape@^3.1.0, d3-shape@^3.2.0: +d3-shape@^3.1.0: version "3.2.0" resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz" integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== @@ -3100,13 +2783,6 @@ define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -delaunator@5: - version "5.0.1" - resolved "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz" - integrity sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw== - dependencies: - robust-predicates "^3.0.2" - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" @@ -3244,13 +2920,6 @@ entities@^4.4.0: resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: version "1.23.3" resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz" @@ -3607,11 +3276,6 @@ fill-range@^7.1.1: dependencies: to-regex-range "^5.0.1" -find-root@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" - integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== - find-up@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" @@ -3926,13 +3590,6 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoist-non-react-statics@^3.3.1: - version "3.3.2" - resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - html2canvas@^1.0.0-rc.5: version "1.4.1" resolved "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz" @@ -4039,11 +3696,6 @@ is-array-buffer@^3.0.4: call-bind "^1.0.2" get-intrinsic "^1.2.1" -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - is-bigint@^1.0.1: version "1.0.4" resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" @@ -4304,11 +3956,6 @@ json-buffer@3.0.1: resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" @@ -4861,16 +4508,6 @@ parse-headers@^2.0.2: resolved "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz" integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA== -parse-json@^5.0.0: - version "5.2.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - path-browserify@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz" @@ -5393,16 +5030,6 @@ react-is@^16.13.1: resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^18.2.0: - version "18.3.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz" - integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== - react-number-format@^5.3.1: version "5.4.2" resolved "https://registry.npmjs.org/react-number-format/-/react-number-format-5.4.2.tgz" @@ -5628,11 +5255,6 @@ require-from-string@^2.0.2: resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -reselect@^4.1.8: - version "4.1.8" - resolved "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz" - integrity sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ== - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" @@ -5645,7 +5267,7 @@ resolve-protobuf-schema@^2.1.0: dependencies: protocol-buffers-schema "^3.3.1" -resolve@^1.1.7, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.22.1, resolve@^1.22.2: +resolve@^1.1.7, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.22.1, resolve@^1.22.2: version "1.22.8" resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -5679,11 +5301,6 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -robust-predicates@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz" - integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg== - "rollup@^1.20.0 || ^2.0.0", rollup@^1.20.0||^2.0.0, rollup@^2.43.1: version "2.79.1" resolved "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz" @@ -5958,11 +5575,6 @@ source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.5.7: - version "0.5.7" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - source-map@^0.6.0: version "0.6.1" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" @@ -6148,11 +5760,6 @@ strtok3@^7.0.0: "@tokenizer/token" "^0.3.0" peek-readable "^5.0.0" -stylis@4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz" - integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== - sucrase@^3.32.0: version "3.35.0" resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz" @@ -6928,11 +6535,6 @@ yallist@^3.0.2: resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yaml@^1.10.0: - version "1.10.2" - resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - yaml@^2.3.4: version "2.4.5" resolved "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz" diff --git a/ems/src/api/general/index.ts b/ems/src/api/general/index.ts index 0cf0463..ccde534 100644 --- a/ems/src/api/general/index.ts +++ b/ems/src/api/general/index.ts @@ -61,11 +61,38 @@ router.get('/objects/list', async (req: Request, res: Response) => { if (type) { const result = await tediousQuery( + // ` + // SELECT + // * + // FROM + // vObjects + // WHERE + // vObjects.id_city = ${city_id} + // AND vObjects.year = ${year} + // AND type = ${type} + // AND + // ( + // CASE + // WHEN TRY_CAST(vObjects.planning AS BIT) IS NOT NULL THEN TRY_CAST(vObjects.planning AS BIT) + // WHEN vObjects.planning = 'TRUE' THEN 1 + // WHEN vObjects.planning = 'FALSE' THEN 0 + // ELSE NULL + // END + // ) = ${planning}; + // ` ` SELECT - * + vObjects.*, + CASE + WHEN vObjects.boiler_id IS NOT NULL THEN vBoilers.name + ELSE CAST(tValues.value AS varchar(max)) + END AS name FROM vObjects + JOIN + vBoilers ON vBoilers.id = vObjects.boiler_id + JOIN + tValues ON tValues.id_param = 4 AND tValues.id_object = vObjects.object_id WHERE vObjects.id_city = ${city_id} AND vObjects.year = ${year} diff --git a/ems/src/api/static/index.ts b/ems/src/api/static/index.ts new file mode 100644 index 0000000..dd2cb31 --- /dev/null +++ b/ems/src/api/static/index.ts @@ -0,0 +1,24 @@ +import express, { Request, Response } from 'express'; +import path from 'path'; +import fs from 'fs'; + +const router = express.Router() + +const tileFolder = path.join(__dirname, '..', '..', '..', 'public', 'static') + +router.get('/:city_id', async (req: Request, res: Response) => { + const { city_id } = req.params + + const tilePath1 = path.join(tileFolder, `${city_id}.jpg`) + const tilePath2 = path.join(tileFolder, `${city_id}.png`) + + if (fs.existsSync(tilePath1)) { + return res.sendFile(tilePath1) + } else if (fs.existsSync(tilePath2)) { + return res.sendFile(tilePath2) + } else { + res.status(404).send('Tile is not generated or not provided') + } +}) + +export default router \ No newline at end of file diff --git a/ems/src/index.ts b/ems/src/index.ts index f8d7101..a7dc3f9 100644 --- a/ems/src/index.ts +++ b/ems/src/index.ts @@ -5,6 +5,7 @@ import generalRouter from './api/general' import gisRouter from './api/gis' import nodesRouter from './api/nodes' import tilesRouter from './api/tiles' +import staticRouter from './api/static' const app = express() const PORT = process.env.EMS_PORT || 5000 @@ -19,5 +20,6 @@ app.use('/general', generalRouter) app.use('/gis', gisRouter) app.use('/nodes', nodesRouter) app.use('/tiles', tilesRouter) +app.use('/static', staticRouter) app.listen(PORT, () => console.log(`Server running on port ${PORT}`)); \ No newline at end of file