diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..471c0f27a --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,15 @@ +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +polar: # Replace with a single Polar username +buy_me_a_coffee: gorkemcetin +thanks_dev: # Replace with a single thanks.dev username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/README.md b/README.md index c4001bf27..eb85dae4c 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,10 @@ Usage instructions can be found [here](https://docs.checkmate.so/). It's still W See installation instructions in [Checkmate documentation portal](https://docs.checkmate.so/quickstart). Alternatively, you can also use [Coolify](https://coolify.io/) or [Elestio](https://elest.io/open-source/checkmate) for a one click Docker deployment. If you would like to monitor your server infrastructure, you'll need [Capture agent](https://github.com/bluewave-labs/capture). Capture repository also contains the installation instructions. +## 🏁 Translations + +If you would like to use Checkmate in your language, please [go to this page](https://poeditor.com/join/project/lRUoGZFCsJ) and register for the language you would like to translate Checkmate to. + ## πŸš€ Performance Thanks to extensive optimizations, Checkmate operates with an exceptionally small memory footprint, requiring minimal memory and CPU resources. Here’s the memory usage of a Node.js instance running on a server that monitors 323 servers every minute: @@ -106,7 +110,7 @@ If you have any questions, suggestions or comments, please use our [Discord chan ## 🀝 Contributing -We are [@ajhollid](http://github.com/ajhollid) (team lead), [@vishnusn77](http://github.com/vishnusn77), [@mohicody](http://github.com/mohicody), [@gorkem-bwl](http://github.com/gorkem-bwl/) and [@Owaiseimdad](http://github.com/Owaiseimdad), helping individuals and businesses monitor their infra and servers. +We are [Alex](http://github.com/ajhollid) (team lead), [Vishnu](http://github.com/vishnusn77), [Mohadeseh](http://github.com/mohicody), [Gorkem](http://github.com/gorkem-bwl/), [Owaise](http://github.com/Owaiseimdad), and [Aryaman](https://github.com/Br0wnHammer) helping individuals and businesses monitor their infra and servers. We pride ourselves on building strong connections with contributors at every level. Despite being a young project, Checkmate has already earned 4.6K+ stars and attracted 60 contributors from around the globe. diff --git a/package-lock.json b/package-lock.json index 6300c0e49..cb0cf91fa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,12 +12,12 @@ "@emotion/styled": "^11.13.0", "@fontsource/roboto": "^5.0.13", "@hello-pangea/dnd": "^18.0.0", - "@mui/icons-material": "6.4.8", - "@mui/lab": "6.0.0-beta.31", - "@mui/material": "6.4.8", + "@mui/icons-material": "6.4.9", + "@mui/lab": "6.0.0-dev.240424162023-9968b4889d", + "@mui/material": "6.4.9", "@mui/x-charts": "^7.5.1", - "@mui/x-data-grid": "7.28.1", - "@mui/x-date-pickers": "7.28.0", + "@mui/x-data-grid": "7.28.2", + "@mui/x-date-pickers": "7.28.2", "@reduxjs/toolkit": "2.6.1", "@solana/wallet-adapter-base": "0.9.23", "@solana/wallet-adapter-material-ui": "0.16.35", @@ -33,7 +33,7 @@ "immutability-helper": "^3.1.1", "joi": "17.13.3", "jwt-decode": "^4.0.0", - "maplibre-gl": "5.2.0", + "maplibre-gl": "5.3.0", "mui-color-input": "^6.0.0", "react": "18.3.1", "react-dnd": "^16.0.1", @@ -394,25 +394,25 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", + "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.8.tgz", - "integrity": "sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.26.8" + "@babel/types": "^7.27.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -1996,14 +1996,14 @@ } }, "node_modules/@babel/template": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.8.tgz", - "integrity": "sha512-iNKaX3ZebKIsCvJ+0jd6embf+Aulaa3vNBqZ41kM7iTWjx5qzWKXGHiJUW3+nTpQ18SG11hdF8OAzKrpXkb96Q==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.26.8", - "@babel/types": "^7.26.8" + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" }, "engines": { "node": ">=6.9.0" @@ -2048,9 +2048,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.8.tgz", - "integrity": "sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", @@ -2466,9 +2466,9 @@ } }, "node_modules/@ethersproject/bytes": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", - "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.8.0.tgz", + "integrity": "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==", "funding": [ { "type": "individual", @@ -2481,7 +2481,7 @@ ], "license": "MIT", "dependencies": { - "@ethersproject/logger": "^5.7.0" + "@ethersproject/logger": "^5.8.0" } }, "node_modules/@ethersproject/constants": { @@ -2524,9 +2524,9 @@ } }, "node_modules/@ethersproject/logger": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.8.0.tgz", + "integrity": "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==", "funding": [ { "type": "individual", @@ -2540,9 +2540,9 @@ "license": "MIT" }, "node_modules/@ethersproject/properties": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", - "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.8.0.tgz", + "integrity": "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==", "funding": [ { "type": "individual", @@ -2555,7 +2555,7 @@ ], "license": "MIT", "dependencies": { - "@ethersproject/logger": "^5.7.0" + "@ethersproject/logger": "^5.8.0" } }, "node_modules/@ethersproject/rlp": { @@ -2579,9 +2579,9 @@ } }, "node_modules/@ethersproject/signing-key": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", - "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.8.0.tgz", + "integrity": "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==", "funding": [ { "type": "individual", @@ -2594,35 +2594,14 @@ ], "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", - "elliptic": "6.5.4", + "elliptic": "6.6.1", "hash.js": "1.1.7" } }, - "node_modules/@ethersproject/signing-key/node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/@ethersproject/signing-key/node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", - "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", - "license": "MIT" - }, "node_modules/@ethersproject/transactions": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", @@ -4149,42 +4128,10 @@ "node": ">= 10.*" } }, - "node_modules/@mui/base": { - "version": "5.0.0-beta.70", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.70.tgz", - "integrity": "sha512-Tb/BIhJzb0pa5zv/wu7OdokY9ZKEDqcu1BDFnohyvGCoHuSXbEr90rPq1qeNW3XvTBIbNWHEF7gqge+xpUo6tQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.26.0", - "@floating-ui/react-dom": "^2.1.1", - "@mui/types": "~7.2.24", - "@mui/utils": "^6.4.8", - "@popperjs/core": "^2.11.8", - "clsx": "^2.1.1", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@mui/core-downloads-tracker": { - "version": "6.4.8", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.4.8.tgz", - "integrity": "sha512-vjP4+A1ybyCRhDZC7r5EPWu/gLseFZxaGyPdDl94vzVvk6Yj6gahdaqcjbhkaCrJjdZj90m3VioltWPAnWF/zw==", + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.4.9.tgz", + "integrity": "sha512-3UvsvOjqZJcokHKSzA1lskj2XMM/G5GBgge6ykwmAij2pGGxydGxAXirQlLaeoMwTKDS6BcrLqPZyPVwzri20A==", "license": "MIT", "funding": { "type": "opencollective", @@ -4192,9 +4139,9 @@ } }, "node_modules/@mui/icons-material": { - "version": "6.4.8", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.4.8.tgz", - "integrity": "sha512-LKGWiLWRyoOw3dWxZQ+lV//mK+4DVTTAiLd2ljmJdD6XV0rDB8JFKjRD9nyn9cJAU5XgWnii7ZR3c93ttUnMKg==", + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.4.9.tgz", + "integrity": "sha512-a8l63VIscBteJlh31R88aVgHelCcrhl3Rk0GnN8znTsGhcam9mFeo4Xlw+gLUYQP7mxVcVt3WP9XJkwXWZflnw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.26.0" @@ -4207,7 +4154,7 @@ "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@mui/material": "^6.4.8", + "@mui/material": "^6.4.9", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, @@ -4218,21 +4165,21 @@ } }, "node_modules/@mui/lab": { - "version": "6.0.0-beta.31", - "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-6.0.0-beta.31.tgz", - "integrity": "sha512-iZjchha0XznSqp5fKtgsozz/zZEjJFG8s4EeBypdlZEIcHvRKx3hUKBuaFM6B/PiC2kJrNMQSi5W2Fjio5sLKQ==", + "version": "6.0.0-dev.240424162023-9968b4889d", + "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-6.0.0-dev.240424162023-9968b4889d.tgz", + "integrity": "sha512-iKFAz7/EeWI4PaFsP4jK2FcYJmUYDBkn3XZwpQSAl5806yYq5J2U2mPQLuZBdhrH50gT2O98p95i3vwL4YBwAg==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.26.0", - "@mui/base": "5.0.0-beta.70", - "@mui/system": "^6.4.8", - "@mui/types": "~7.2.24", - "@mui/utils": "^6.4.8", - "clsx": "^2.1.1", + "@babel/runtime": "^7.24.4", + "@mui/base": "5.0.0-beta.42", + "@mui/system": "^6.0.0-dev.240424162023-9968b4889d", + "@mui/types": "^7.2.14", + "@mui/utils": "^6.0.0-alpha.3", + "clsx": "^2.1.0", "prop-types": "^15.8.1" }, "engines": { - "node": ">=14.0.0" + "node": ">=12.0.0" }, "funding": { "type": "opencollective", @@ -4241,11 +4188,10 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@mui/material": "^6.4.8", - "@mui/material-pigment-css": "^6.4.8", - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + "@mui/material": "^6.0.0-dev.240424162023-9968b4889d", + "@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": { @@ -4254,23 +4200,53 @@ "@emotion/styled": { "optional": true }, - "@mui/material-pigment-css": { + "@types/react": { "optional": true - }, + } + } + }, + "node_modules/@mui/lab/node_modules/@mui/base": { + "version": "5.0.0-beta.42", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.42.tgz", + "integrity": "sha512-fWRiUJVCHCPF+mxd5drn08bY2qRw3jj5f1SSQdUXmaJ/yKpk23ys8MgLO2KGVTRtbks/+ctRfgffGPbXifj0Ug==", + "deprecated": "This package has been replaced by @base-ui-components/react", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.4", + "@floating-ui/react-dom": "^2.0.8", + "@mui/types": "^7.2.14", + "@mui/utils": "^6.0.0-alpha.1", + "@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/material": { - "version": "6.4.8", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.4.8.tgz", - "integrity": "sha512-5S9UTjKZZBd9GfbcYh/nYfD9cv6OXmj5Y7NgKYfk7JcSoshp8/pW5zP4wecRiroBSZX8wcrywSgogpVNO+5W0Q==", + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.4.9.tgz", + "integrity": "sha512-+5dExw9xUUFujIW889gB3qrfjeNo3YjYW7aWVZ6BlBIJnKpJ0jNcYZJpBUFoXt/FUV5Wy1V+/+XzR3Is2mXX2w==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.26.0", - "@mui/core-downloads-tracker": "^6.4.8", - "@mui/system": "^6.4.8", + "@mui/core-downloads-tracker": "^6.4.9", + "@mui/system": "^6.4.9", "@mui/types": "~7.2.24", "@mui/utils": "^6.4.8", "@popperjs/core": "^2.11.8", @@ -4291,7 +4267,7 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@mui/material-pigment-css": "^6.4.8", + "@mui/material-pigment-css": "^6.4.9", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" @@ -4345,9 +4321,9 @@ } }, "node_modules/@mui/styled-engine": { - "version": "6.4.8", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.4.8.tgz", - "integrity": "sha512-oyjx1b1FvUCI85ZMO4trrjNxGm90eLN3Ohy0AP/SqK5gWvRQg1677UjNf7t6iETOKAleHctJjuq0B3aXO2gtmw==", + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.4.9.tgz", + "integrity": "sha512-qZRWO0cT407NI4ZRjZcH+1SOu8f3JzLHqdMlg52GyEufM9pkSZFnf7xjpwnlvkixcGjco6wLlMD0VB43KRcBuA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.26.0", @@ -4379,14 +4355,14 @@ } }, "node_modules/@mui/system": { - "version": "6.4.8", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.4.8.tgz", - "integrity": "sha512-gV7iBHoqlsIenU2BP0wq14BefRoZcASZ/4LeyuQglayBl+DfLX5rEd3EYR3J409V2EZpR0NOM1LATAGlNk2cyA==", + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.4.9.tgz", + "integrity": "sha512-JOj7efXGtZn+NIzX8KDyMpO1QKc0DhilPBsxvci1xAvI1e5AtAtfzrEuV5ZvN+lz2BDuzngCWlllnqQ/cg40RQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.26.0", "@mui/private-theming": "^6.4.8", - "@mui/styled-engine": "^6.4.8", + "@mui/styled-engine": "^6.4.9", "@mui/types": "~7.2.24", "@mui/utils": "^6.4.8", "clsx": "^2.1.1", @@ -4527,9 +4503,9 @@ } }, "node_modules/@mui/x-data-grid": { - "version": "7.28.1", - "resolved": "https://registry.npmjs.org/@mui/x-data-grid/-/x-data-grid-7.28.1.tgz", - "integrity": "sha512-uDJcjRB7zfRoquZb4G8iw0NWbhziVVPsHisi/EIzvOPHP+a1ZUnG0bLEnY+cy6eEwDrO1dNzYpwGFCcjl8ZKfA==", + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@mui/x-data-grid/-/x-data-grid-7.28.2.tgz", + "integrity": "sha512-ac/CPZ/zOeHjCvv3LwTUSFy+dofELP/Cl2nXLYWrqVHUgFAkkWxhk85kiI/N1G+Rf4WiKw+oJfeyGe8ZSeY4tg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.7", @@ -4565,9 +4541,9 @@ } }, "node_modules/@mui/x-date-pickers": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.28.0.tgz", - "integrity": "sha512-m1bfkZLOw3cMogeh6q92SjykVmLzfptnz3ZTgAlFKV7UBnVFuGUITvmwbgTZ1Mz3FmLVnGUQYUpZWw0ZnoghNA==", + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.28.2.tgz", + "integrity": "sha512-py8u0iOShM8m/Ocs/giS8MwTNFn+iRFG6m5L6YJ/JmKzNfQfkVJOjpbdSIWxdCJ8plJn95oar1nKUhDdwn88HA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.7", @@ -9152,9 +9128,9 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.19", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.19.tgz", - "integrity": "sha512-fcdJqaHOMDbiAwJnXv6XCzX0jDW77yI3tJqYh1Byn8EL5/S628WRx9b/y3DnNe55zTukUQKrfYxiZls2dHcUMw==", + "version": "18.3.20", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.20.tgz", + "integrity": "sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==", "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -15543,9 +15519,9 @@ } }, "node_modules/maplibre-gl": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-5.2.0.tgz", - "integrity": "sha512-9zZKD0M80qtDsqBet+EDuAhoCeA/cnAuZAA0p3hcGKGbyjM/SH+R6wQvnBEgvJz9UhDynnkoKdUwhI+fUkHoXQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-5.3.0.tgz", + "integrity": "sha512-qru6B6jHlDPR4Q9/P4W1zEPbPofR4wwYbrrjiHKWI7yLtyXmpJ1/G1KaIYDr5uNdFbPZ7uiZAWdqtfdNLmIhGg==", "license": "BSD-3-Clause", "dependencies": { "@mapbox/geojson-rewind": "^0.5.2", @@ -19924,9 +19900,9 @@ } }, "node_modules/vite": { - "version": "5.4.14", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.14.tgz", - "integrity": "sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==", + "version": "5.4.15", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.15.tgz", + "integrity": "sha512-6ANcZRivqL/4WtwPGTKNaosuNJr5tWiftOC7liM7G9+rMb8+oeJeyzymDu4rTN93seySBmbjSfsS3Vzr19KNtA==", "license": "MIT", "dependencies": { "esbuild": "^0.21.3", diff --git a/package.json b/package.json index 9c541d025..da40b2cc4 100644 --- a/package.json +++ b/package.json @@ -16,11 +16,11 @@ "@fontsource/roboto": "^5.0.13", "@hello-pangea/dnd": "^18.0.0", "@mui/x-charts": "^7.5.1", - "@mui/x-data-grid": "7.28.1", - "@mui/x-date-pickers": "7.28.0", - "@mui/icons-material": "6.4.8", - "@mui/lab": "6.0.0-beta.31", - "@mui/material": "6.4.8", + "@mui/x-data-grid": "7.28.2", + "@mui/x-date-pickers": "7.28.2", + "@mui/icons-material": "6.4.9", + "@mui/lab": "6.0.0-dev.240424162023-9968b4889d", + "@mui/material": "6.4.9", "@reduxjs/toolkit": "2.6.1", "@solana/wallet-adapter-base": "0.9.23", "@solana/wallet-adapter-material-ui": "0.16.35", @@ -36,7 +36,7 @@ "i18next": "^24.2.2", "immutability-helper": "^3.1.1", "joi": "17.13.3", - "maplibre-gl": "5.2.0", + "maplibre-gl": "5.3.0", "mui-color-input": "^6.0.0", "react": "18.3.1", "react-dnd": "^16.0.1", diff --git a/src/Components/Dialog/genericDialog.jsx b/src/Components/Dialog/genericDialog.jsx index 871b3f329..b2cbe1299 100644 --- a/src/Components/Dialog/genericDialog.jsx +++ b/src/Components/Dialog/genericDialog.jsx @@ -21,7 +21,7 @@ const GenericDialog = ({ title, description, open, onClose, theme, children }) = top: "50%", left: "50%", transform: "translate(-50%, -50%)", - width: 400, + minWidth: 400, bgcolor: theme.palette.primary.main, border: 1, borderColor: theme.palette.primary.lowContrast, diff --git a/src/Components/Fallback/index.jsx b/src/Components/Fallback/index.jsx index 3e30cd374..bdee376c5 100644 --- a/src/Components/Fallback/index.jsx +++ b/src/Components/Fallback/index.jsx @@ -35,6 +35,7 @@ const Fallback = ({ title, checks, link = "/", isAdmin, vowelStart = false }) => overflow="hidden" sx={{ borderStyle: "dashed", + minHeight: "calc(100vh - var(--env-var-spacing-2) * 2)", }} > { gap={14} > - + + + ); }; diff --git a/src/Components/NotificationIntegrationModal/Components/NotificationIntegrationModal.jsx b/src/Components/NotificationIntegrationModal/Components/NotificationIntegrationModal.jsx index 437b1ca2e..16ebd130c 100644 --- a/src/Components/NotificationIntegrationModal/Components/NotificationIntegrationModal.jsx +++ b/src/Components/NotificationIntegrationModal/Components/NotificationIntegrationModal.jsx @@ -1,5 +1,6 @@ import { useState, useMemo } from "react"; import { useTranslation } from "react-i18next"; +import PropTypes from "prop-types"; import { Dialog, @@ -49,11 +50,11 @@ const NotificationIntegrationModal = ({ // Helper to get the field state key with error handling const getFieldKey = (typeId, fieldId) => { if (typeof typeId !== 'string' || typeId === '') { - throw new Error('Invalid typeId provided to getFieldKey'); + throw new Error(t('errorInvalidTypeId')); } if (typeof fieldId !== 'string' || fieldId === '') { - throw new Error('Invalid fieldId provided to getFieldKey'); + throw new Error(t('errorInvalidFieldId')); } return `${typeId}${fieldId.charAt(0).toUpperCase() + fieldId.slice(1)}`; @@ -182,43 +183,64 @@ const NotificationIntegrationModal = ({ await sendTestNotification(type, config); }; - const handleSave = () => { - //notifications array for selected integrations - const notifications = [...(monitor?.notifications || [])]; - - // Get all notification types IDs - const existingTypes = activeNotificationTypes.map(type => type.id); - - // Filter out notifications that are configurable in this modal - const filteredNotifications = notifications.filter( - notification => !existingTypes.includes(notification.type) - ); + // In NotificationIntegrationModal.jsx, update the handleSave function: - // Add each enabled notification with its configured fields - activeNotificationTypes.forEach(type => { - if (integrations[type.id]) { - const notificationObject = { - type: type.id - }; - - // Add each field value to the notification object - type.fields.forEach(field => { - const fieldKey = getFieldKey(type.id, field.id); - notificationObject[field.id] = integrations[fieldKey]; - }); - - filteredNotifications.push(notificationObject); +const handleSave = () => { + // Get existing notifications + const notifications = [...(monitor?.notifications || [])]; + + // Get all notification types IDs + const existingTypes = activeNotificationTypes.map(type => type.id); + + // Filter out notifications that are configurable in this modal + const filteredNotifications = notifications.filter( + notification => { + + if (notification.platform) { + return !existingTypes.includes(notification.platform); } - }); + + return !existingTypes.includes(notification.type); + } + ); - // Update monitor with new notifications - setMonitor(prev => ({ - ...prev, - notifications: filteredNotifications - })); - - onClose(); - }; + // Add each enabled notification with its configured fields + activeNotificationTypes.forEach(type => { + if (integrations[type.id]) { + + let notificationObject = { + type: "webhook", + platform: type.id, // Set platform to identify the specific service + config: {} + }; + + // Configure based on notification type + switch(type.id) { + case "slack": + case "discord": + notificationObject.config.webhookUrl = integrations[getFieldKey(type.id, 'webhook')]; + break; + case "telegram": + notificationObject.config.botToken = integrations[getFieldKey(type.id, 'token')]; + notificationObject.config.chatId = integrations[getFieldKey(type.id, 'chatId')]; + break; + case "webhook": + notificationObject.config.webhookUrl = integrations[getFieldKey(type.id, 'url')]; + break; + } + + filteredNotifications.push(notificationObject); + } + }); + + // Update monitor with new notifications + setMonitor(prev => ({ + ...prev, + notifications: filteredNotifications + })); + + onClose(); +}; return ( {item.icon} @@ -653,6 +655,7 @@ function Sidebar() { gap: theme.spacing(4), borderRadius: theme.shape.borderRadius, px: theme.spacing(4), + pl: theme.spacing(5), }} > {item.icon} diff --git a/src/Components/TabPanels/Account/TeamPanel.jsx b/src/Components/TabPanels/Account/TeamPanel.jsx index eef7b6421..950f0ea69 100644 --- a/src/Components/TabPanels/Account/TeamPanel.jsx +++ b/src/Components/TabPanels/Account/TeamPanel.jsx @@ -10,6 +10,7 @@ import { useSelector } from "react-redux"; import Select from "../../Inputs/Select"; import { GenericDialog } from "../../Dialog/genericDialog"; import DataTable from "../../Table/"; +import { useGetInviteToken } from "../../../Hooks/inviteHooks"; /** * TeamPanel component manages the organization and team members, * providing functionalities like renaming the organization, managing team members, @@ -20,7 +21,6 @@ import DataTable from "../../Table/"; const TeamPanel = () => { const theme = useTheme(); - const SPACING_GAP = theme.spacing(12); const [toInvite, setToInvite] = useState({ @@ -34,6 +34,8 @@ const TeamPanel = () => { const [errors, setErrors] = useState({}); const [isSendingInvite, setIsSendingInvite] = useState(false); + const [getInviteToken, clearToken, isLoading, error, token] = useGetInviteToken(); + const headers = [ { id: "name", @@ -124,6 +126,10 @@ const TeamPanel = () => { }); }; + const handleGetToken = async () => { + await getInviteToken({ email: toInvite.email, role: toInvite.role }); + }; + const handleInviteMember = async () => { if (!toInvite.email) { setErrors((prev) => ({ ...prev, email: "Email is required." })); @@ -146,7 +152,7 @@ const TeamPanel = () => { } try { - await networkService.requestInvitationToken({ + await networkService.sendInvitationToken({ email: toInvite.email, role: toInvite.role, }); @@ -165,6 +171,7 @@ const TeamPanel = () => { const closeInviteModal = () => { setIsOpen(false); + clearToken(); setToInvite({ email: "", role: ["0"] }); setErrors({}); }; @@ -275,6 +282,13 @@ const TeamPanel = () => { { _id: "user", name: "User" }, ]} /> + {token && Invite link} + {token && ( + + )} { > Cancel + diff --git a/src/Hooks/inviteHooks.js b/src/Hooks/inviteHooks.js new file mode 100644 index 000000000..f8b44f0fd --- /dev/null +++ b/src/Hooks/inviteHooks.js @@ -0,0 +1,46 @@ +import { useState } from "react"; +import { networkService } from "../main"; +import { useTranslation } from "react-i18next"; + +const CLIENT_HOST = import.meta.env.VITE_CLIENT_HOST; + +const useGetInviteToken = () => { + const { t } = useTranslation(); + + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(undefined); + const [token, setToken] = useState(undefined); + + const clearToken = () => { + setToken(undefined); + }; + + const getInviteToken = async ({ email, role }) => { + try { + const response = await networkService.requestInvitationToken({ + email, + role, + }); + const token = response?.data?.data?.token; + if (typeof token === "undefined") { + throw new Error(t("inviteNoTokenFound")); + } + + let inviteLink = token; + + if (typeof CLIENT_HOST !== "undefined") { + inviteLink = `${CLIENT_HOST}/register/${token}`; + } + + setToken(inviteLink); + } catch (error) { + setError(error); + } finally { + setIsLoading(false); + } + }; + + return [getInviteToken, clearToken, isLoading, error, token]; +}; + +export { useGetInviteToken }; diff --git a/src/Hooks/useSubscribeToDepinDetails.js b/src/Hooks/useSubscribeToDepinDetails.js index 67b7c898f..0e8c2744f 100644 --- a/src/Hooks/useSubscribeToDepinDetails.js +++ b/src/Hooks/useSubscribeToDepinDetails.js @@ -27,6 +27,7 @@ const useSubscribeToDepinDetails = ({ monitorId, isPublic, isPublished, dateRang monitorId, dateRange: dateRange, normalize: true, + isPublic, }); const responseData = res?.data?.data; diff --git a/src/Pages/PageSpeed/Details/Components/PerformanceReport/index.jsx b/src/Pages/PageSpeed/Details/Components/PerformanceReport/index.jsx index 942933a19..c83f77294 100644 --- a/src/Pages/PageSpeed/Details/Components/PerformanceReport/index.jsx +++ b/src/Pages/PageSpeed/Details/Components/PerformanceReport/index.jsx @@ -32,7 +32,7 @@ const PerformanceReport = ({ shouldRender, audits }) => { component="span" fontSize="inherit" sx={{ - color: theme.palette.primary.main, + color: theme.palette.primary.contrastTextTertiary, fontWeight: 500, textDecoration: "underline", textUnderlineOffset: 2, diff --git a/src/Pages/Uptime/Configure/index.jsx b/src/Pages/Uptime/Configure/index.jsx index 735a087e4..37d8511c7 100644 --- a/src/Pages/Uptime/Configure/index.jsx +++ b/src/Pages/Uptime/Configure/index.jsx @@ -69,9 +69,9 @@ const Configure = () => { ]; const expectedValuePlaceholders = { - regex: "^[\w.-]+@gmail.com$", - equal: "janet@gmail.com", - include: "@gmail.com", + regex: "^(success|ok)$", + equal: "success", + include: "ok", }; useEffect(() => { @@ -490,7 +490,7 @@ const Configure = () => { id="json-path" label="JSON Path" isOptional={true} - placeholder="data.email" + placeholder="data.status" value={monitor.jsonPath} onChange={(event) => handleChange(event, "jsonPath")} error={errors["jsonPath"] ? true : false} diff --git a/src/Pages/Uptime/Create/index.jsx b/src/Pages/Uptime/Create/index.jsx index bc757984d..7422cda37 100644 --- a/src/Pages/Uptime/Create/index.jsx +++ b/src/Pages/Uptime/Create/index.jsx @@ -41,9 +41,9 @@ const CreateMonitor = () => { ]; const expectedValuePlaceholders = { - regex: "^[\w.-]+@gmail.com$", - equal: "janet@gmail.com", - include: "@gmail.com", + regex: "^(success|ok)$", + equal: "success", + include: "ok", }; const monitorTypeMaps = { @@ -415,7 +415,7 @@ const CreateMonitor = () => { onChange={(event) => handleNotifications(event, "email")} /> - + {/* - + */} @@ -477,7 +477,7 @@ const CreateMonitor = () => { id="json-path" label="JSON Path" isOptional={true} - placeholder="data.email" + placeholder="data.status" value={monitor.jsonPath} onChange={(event) => handleChange(event, "jsonPath")} error={errors["jsonPath"] ? true : false} diff --git a/src/Pages/Uptime/Monitors/Components/UptimeDataTable/index.jsx b/src/Pages/Uptime/Monitors/Components/UptimeDataTable/index.jsx index 9b5e7571f..a6ef105b6 100644 --- a/src/Pages/Uptime/Monitors/Components/UptimeDataTable/index.jsx +++ b/src/Pages/Uptime/Monitors/Components/UptimeDataTable/index.jsx @@ -149,7 +149,11 @@ const UptimeDataTable = ({ { id: "responseTime", content: t("responseTime"), - render: (row) => , + render: (row) => ( + + + + ), }, { id: "type", diff --git a/src/Utils/NetworkService.js b/src/Utils/NetworkService.js index 2e4736c45..7c4ffba9f 100644 --- a/src/Utils/NetworkService.js +++ b/src/Utils/NetworkService.js @@ -45,7 +45,7 @@ class NetworkService { this.axiosInstance.interceptors.response.use( (response) => response, (error) => { - if (!error.request && error.response && error.response.status === 401) { + if (error.response && error.response.status === 401) { dispatch(clearAuthState()); dispatch(clearUptimeMonitorState()); navigate("/login"); @@ -263,6 +263,9 @@ class NetworkService { description: monitor.description, interval: monitor.interval, notifications: monitor.notifications, + matchMethod: monitor.matchMethod, + expectedValue: monitor.expectedValue, + jsonPath: monitor.jsonPath, }; return this.axiosInstance.put(`/monitors/${monitorId}`, payload, { headers: { @@ -530,6 +533,24 @@ class NetworkService { async requestInvitationToken(config) { return this.axiosInstance.post(`/invite`, { email: config.email, role: config.role }); } + /** + * ************************************ + * Sends an invitation token + * ************************************ + * + * @async + * @param {Object} config - The configuration object. + * @param {string} config.email - The email of the user to be invited. + * @param {string} config.role - The role of the user to be invited. + * @returns {Promise} The response from the axios POST request. + * + */ + async sendInvitationToken(config) { + return this.axiosInstance.post(`/invite/send`, { + email: config.email, + role: config.role, + }); + } /** * ************************************ @@ -926,10 +947,15 @@ class NetworkService { getDistributedUptimeDetails(config) { const params = new URLSearchParams(); - const { monitorId, onUpdate, onOpen, onError, dateRange, normalize } = config; + const { monitorId, dateRange, normalize, isPublic } = config; if (dateRange) params.append("dateRange", dateRange); if (normalize) params.append("normalize", normalize); - const url = `${this.axiosInstance.defaults.baseURL}/distributed-uptime/monitors/details/${monitorId}/initial?${params.toString()}`; + let url; + if (isPublic) { + url = `${this.axiosInstance.defaults.baseURL}/distributed-uptime/monitors/details/public/${monitorId}/initial?${params.toString()}`; + } else { + url = `${this.axiosInstance.defaults.baseURL}/distributed-uptime/monitors/details/${monitorId}/initial?${params.toString()}`; + } return this.axiosInstance.get(url); } diff --git a/src/Utils/Theme/globalTheme.js b/src/Utils/Theme/globalTheme.js index 6530e911d..f7061343b 100644 --- a/src/Utils/Theme/globalTheme.js +++ b/src/Utils/Theme/globalTheme.js @@ -359,7 +359,9 @@ const baseTheme = (palette) => ({ root: ({ theme }) => ({ fontSize: theme.typography.fontSize - 1, color: theme.palette.tertiary.contrastText, - backgroundColor: theme.palette.tertiary.main, + backgroundColor: theme.palette.primary.main, + height: '34px', + borderRadius: 0, textTransform: "none", minWidth: "fit-content", padding: `${theme.spacing(6)}px ${theme.spacing(4)}px`, @@ -378,6 +380,7 @@ const baseTheme = (palette) => ({ color: theme.palette.secondary.contrastText, borderColor: theme.palette.secondary.contrastText, borderRightColor: theme.palette.primary.lowContrast, + borderRadius: 0, }, "&:hover": { borderColor: theme.palette.primary.lowContrast, @@ -428,6 +431,12 @@ const baseTheme = (palette) => ({ MuiTabs: { styleOverrides: { root: ({ theme }) => ({ + display: 'inline-flex', + borderTop: '1px solid', + borderLeft: '1px solid', + borderRight: '1px solid', + borderColor: theme.palette.primary.lowContrast, + borderRadius: `${theme.shape.borderRadius}px ${theme.shape.borderRadius}px 0 0`, "& .MuiTabs-indicator": { backgroundColor: theme.palette.tertiary.contrastText, }, diff --git a/src/locales/gb.json b/src/locales/gb.json index 4bf9c4814..5dfe9b4ca 100644 --- a/src/locales/gb.json +++ b/src/locales/gb.json @@ -372,5 +372,8 @@ "infrastructureEditYour": "Edit your", "infrastructureEditMonitor": "Save Infrastructure Monitor", "infrastructureMonitorCreated": "Infrastructure monitor created successfully!", - "infrastructureMonitorUpdated": "Infrastructure monitor updated successfully!" + "infrastructureMonitorUpdated": "Infrastructure monitor updated successfully!", + "errorInvalidTypeId": "Invalid notification type provided", + "errorInvalidFieldId": "Invalid field ID provided", + "inviteNoTokenFound": "No invite token found" } diff --git a/src/locales/tr.json b/src/locales/tr.json index 020bcc69c..3dd4f168a 100644 --- a/src/locales/tr.json +++ b/src/locales/tr.json @@ -372,5 +372,8 @@ "infrastructureEditYour": "", "infrastructureEditMonitor": "", "infrastructureMonitorCreated": "", - "infrastructureMonitorUpdated": "" + "infrastructureMonitorUpdated": "", + "errorInvalidTypeId": "", + "errorInvalidFieldId": "", + "inviteNoTokenFound": "" }