diff --git a/dashboard/README.md b/dashboard/README.md index 8062f56..8723aa5 100644 --- a/dashboard/README.md +++ b/dashboard/README.md @@ -19,6 +19,7 @@ npm install axios # for API connection npm install react-router-dom # for organizing the router npm install dotenv # for setting environment variables npm install react-icons +npm install react-zoom-pan-pinch # Start dev server, ensuring the API url is added as environment variable VITE_API_BASE_URL="http://:" npm run dev diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json index d5cbc58..a27a1e3 100644 --- a/dashboard/package-lock.json +++ b/dashboard/package-lock.json @@ -8,12 +8,19 @@ "name": "portal", "version": "0.0.0", "dependencies": { + "@xterm/addon-fit": "^0.10.0", + "@xterm/xterm": "^5.5.0", "axios": "^1.7.9", "dotenv": "^16.4.7", + "leaflet": "^1.9.4", "react": "^18.3.1", "react-dom": "^18.3.1", "react-icons": "^5.4.0", + "react-leaflet": "^4.2.1", "react-router-dom": "^7.1.1", + "react-xtermjs": "^1.0.9", + "react-zoom-pan-pinch": "^3.6.1", + "shpjs": "^6.1.0", "webpack-dev-server": "^5.2.0" }, "devDependencies": { @@ -1092,6 +1099,17 @@ "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", "license": "MIT" }, + "node_modules/@react-leaflet/core": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@react-leaflet/core/-/core-2.1.0.tgz", + "integrity": "sha512-Qk7Pfu8BSarKGqILj4x7bCSZ1pjuAPZ+qmRwH5S7mDS91VSbVVsJSrW4qA+GPrro8t69gFYVMWb1Zc4yFmPiVg==", + "license": "Hippocratic-2.1", + "peerDependencies": { + "leaflet": "^1.9.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.30.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz", @@ -1896,6 +1914,21 @@ } } }, + "node_modules/@xterm/addon-fit": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@xterm/addon-fit/-/addon-fit-0.10.0.tgz", + "integrity": "sha512-UFYkDm4HUahf2lnEyHvio51TNGiLK66mqP2JoATy7hRZeXaGMRDr00JiSF7m63vR5WKATF605yEggJKsw0JpMQ==", + "license": "MIT", + "peerDependencies": { + "@xterm/xterm": "^5.0.0" + } + }, + "node_modules/@xterm/xterm": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@xterm/xterm/-/xterm-5.5.0.tgz", + "integrity": "sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A==", + "license": "MIT" + }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -2400,6 +2433,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/but-unzip": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/but-unzip/-/but-unzip-0.1.4.tgz", + "integrity": "sha512-Q5/55MTk0PHjxtYyZBbhIVMJP0+FNc/AOKBrrnqaxnbJR4I7w+R4CMRNYMxUQrKmCLrih7D1p4/nwZHMn7IToA==", + "license": "Apache-2.0" + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -4996,6 +5035,12 @@ "shell-quote": "^1.8.1" } }, + "node_modules/leaflet": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", + "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==", + "license": "BSD-2-Clause" + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -5129,6 +5174,12 @@ "node": ">= 0.6" } }, + "node_modules/mgrs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mgrs/-/mgrs-1.0.0.tgz", + "integrity": "sha512-awNbTOqCxK1DBGjalK3xqWIstBZgN6fxsMSiXLs9/spqWkF2pAhb2rrYCFSsr1/tT7PhcDGjZndG8SWYn0byYA==", + "license": "MIT" + }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -5540,6 +5591,12 @@ "node": ">=6" } }, + "node_modules/parsedbf": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parsedbf/-/parsedbf-2.0.0.tgz", + "integrity": "sha512-WNjKn/cwgGBkXqQLif+2VMEahcRHkBRU0/RfBWZ7Vj7snRNNW63yW1mVuuHRDyXTRxuGCzAHHBcr/Fn+U/bXjQ==", + "license": "MIT" + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -5724,6 +5781,16 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "license": "MIT" }, + "node_modules/proj4": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.15.0.tgz", + "integrity": "sha512-LqCNEcPdI03BrCHxPLj29vsd5afsm+0sV1H/O3nTDKrv8/LA01ea1z4QADDMjUqxSXWnrmmQDjqFm1J/uZ5RLw==", + "license": "MIT", + "dependencies": { + "mgrs": "1.0.0", + "wkt-parser": "^1.4.0" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -5865,6 +5932,20 @@ "dev": true, "license": "MIT" }, + "node_modules/react-leaflet": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/react-leaflet/-/react-leaflet-4.2.1.tgz", + "integrity": "sha512-p9chkvhcKrWn/H/1FFeVSqLdReGwn2qmiobOQGO3BifX+/vV/39qhY8dGqbdcPh1e6jxh/QHriLXr7a4eLFK4Q==", + "license": "Hippocratic-2.1", + "dependencies": { + "@react-leaflet/core": "^2.1.0" + }, + "peerDependencies": { + "leaflet": "^1.9.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, "node_modules/react-refresh": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", @@ -5915,6 +5996,29 @@ "react-dom": ">=18" } }, + "node_modules/react-xtermjs": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/react-xtermjs/-/react-xtermjs-1.0.9.tgz", + "integrity": "sha512-lrK1xiWfgxAC+4shtMHh0Irxg2t5t7JbTtpP0W7GIf1gQ9SHW/djmyiLpQSA75mN1DpT0bKeqj1fOKd0XX8RBA==", + "license": "ISC", + "peerDependencies": { + "@xterm/xterm": "^5.5.0" + } + }, + "node_modules/react-zoom-pan-pinch": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/react-zoom-pan-pinch/-/react-zoom-pan-pinch-3.6.1.tgz", + "integrity": "sha512-SdPqdk7QDSV7u/WulkFOi+cnza8rEZ0XX4ZpeH7vx3UZEg7DoyuAy3MCmm+BWv/idPQL2Oe73VoC0EhfCN+sZQ==", + "license": "MIT", + "engines": { + "node": ">=8", + "npm": ">=5" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -6578,6 +6682,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/shpjs": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/shpjs/-/shpjs-6.1.0.tgz", + "integrity": "sha512-uaUpod7uIWetJK80yiiedZ3x4z9ZAPgDVT89N27+8F97Z8ZOqmu88P96I6CBC8N+YyERqdneZNT/wNFUEnzNpw==", + "license": "MIT", + "dependencies": { + "but-unzip": "^0.1.4", + "parsedbf": "^2.0.0", + "proj4": "^2.1.4" + } + }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -7713,6 +7828,12 @@ "dev": true, "license": "MIT" }, + "node_modules/wkt-parser": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/wkt-parser/-/wkt-parser-1.4.0.tgz", + "integrity": "sha512-qpwO7Ihds/YYDTi1aADFTI1Sm9YC/tTe3SHD24EeIlZxy7Ik6a1b4HOz7jAi0xdUAw487duqpo8OGu+Tf4nwlQ==", + "license": "MIT" + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", diff --git a/dashboard/package.json b/dashboard/package.json index 1452f91..5c70f24 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -11,12 +11,19 @@ "preview": "vite preview" }, "dependencies": { + "@xterm/addon-fit": "^0.10.0", + "@xterm/xterm": "^5.5.0", "axios": "^1.7.9", "dotenv": "^16.4.7", + "leaflet": "^1.9.4", "react": "^18.3.1", "react-dom": "^18.3.1", "react-icons": "^5.4.0", + "react-leaflet": "^4.2.1", "react-router-dom": "^7.1.1", + "react-xtermjs": "^1.0.9", + "react-zoom-pan-pinch": "^3.6.1", + "shpjs": "^6.1.0", "webpack-dev-server": "^5.2.0" }, "devDependencies": { diff --git a/dashboard/src/App.css b/dashboard/src/App.css index 0b1003d..fac0065 100644 --- a/dashboard/src/App.css +++ b/dashboard/src/App.css @@ -15,6 +15,24 @@ overflow-y: auto; /* scrollable with overflowing content */ padding: 1rem; /* Optional: Add some padding */ } +.btn { + background-color: #0a4777; + border-color: #0a4777; + color: #fff; + marginBottom: 10px; +} +/* Close Button for menus and widgets */ +.close-button { + align-self: flex-end; + font-size: 24px; + font-weight: bold; + color: white; + background: none; + border: none; + cursor: pointer; + margin-bottom: 20px; +} + .logo { diff --git a/dashboard/src/App.jsx b/dashboard/src/App.jsx index be8e427..45962e8 100644 --- a/dashboard/src/App.jsx +++ b/dashboard/src/App.jsx @@ -10,6 +10,7 @@ import Device from './views/device'; import DiskManagement from './views/diskManagement' import WaterLevel from './views/waterLevel' import CameraAim from './views/cameraAim' +import Calibration from './views/calibration' import api from './api' const App = () => { @@ -27,6 +28,8 @@ const App = () => { } /> } /> } /> + } /> +