Compare commits

...
987 Commits
Author SHA1 Message Date
Alexander Holliday 065a6cb1fd Merge pull request #2785 from bluewave-labs/fix/caputre
add capture to prod and staging docker-compose
2025-08-14 12:49:11 -07:00
Alex Holliday ae9eb494ae add capture to prod and staging docker-compose 2025-08-14 12:48:49 -07:00
Gorkem Cetin (BWL) 0241797e79 Update README.md 2025-08-14 15:48:11 -04:00
Alexander Holliday 9d45947b08 Merge pull request #2782 from bluewave-labs/fix/version
bump versoin
2025-08-14 11:27:13 -07:00
Alex Holliday f2c26c0eed bump versoin 2025-08-14 11:26:46 -07:00
Alexander Holliday f7a1416070 Merge pull request #2780 from bluewave-labs/hotfix/remove-redis-from-workflow
remove redis from production workflow
2025-08-14 10:32:36 -07:00
Alex Holliday 9e05d024a8 remove redis from production workflow 2025-08-14 10:32:10 -07:00
Alexander Holliday 3bd4c8d747 Merge pull request #2778 from bluewave-labs/hotfix/workflow
add release workflow
2025-08-14 10:00:49 -07:00
Alex Holliday 9ae7314f54 add release workflow 2025-08-14 10:00:20 -07:00
Alexander Holliday c77d1e3322 Merge pull request #2777 from bluewave-labs/hotfix/workflow
remove redis from workflows
2025-08-14 09:59:11 -07:00
Alex Holliday 0e767d6581 remove redis from workflows 2025-08-14 09:58:41 -07:00
Alexander Holliday 7ff5935f94 Merge pull request #2775 from Tafadzwa-Chiwozva/feature/custom-ca-trust-docs
docs: add guide and tooling for custom CA trust in Dockerized Checkmate (Fixes #2747)
2025-08-14 09:52:52 -07:00
Alexander Holliday cb4566f829 Merge pull request #2772 from singh-kanwarpreet/feature/sticky-header
Made NavBar Still
2025-08-14 09:43:31 -07:00
Alexander Holliday 52249d5b7e Merge pull request #2774 from bluewave-labs/fix/remove-mogno-replica-set-config
fix: remove mogno replica set config
2025-08-14 09:35:09 -07:00
Alex Holliday 22e0507fbd fix arm dist health check 2025-08-14 09:34:30 -07:00
Alexander Holliday e32e72de7a Merge pull request #2741 from Owaiseimdad/Network-tab-implementation-FE
Network tab implementation fe
2025-08-14 09:22:09 -07:00
Owaise ff31ee773f Added a drop down so that we have choice to make about which network interface to choose. 2025-08-14 19:35:12 +05:30
singh-kanwarpreet a1cbbf5d42 Added zIndex as earlier causes problem in diagnostics 2025-08-14 15:06:01 +05:30
singh-kanwarpreet ce667bc53b Improved code quality 2025-08-14 15:02:44 +05:30
Alex Holliday d5526b89d9 remove redis references 2025-08-13 15:22:03 -07:00
Alex Holliday 096cfccf40 update dokcer compose files to remove mongo replica set config 2025-08-13 15:16:01 -07:00
Tafadzwa Chiwozva f381b0ce4a docs: add guide and tooling for custom CA trust in Dockerized Checkmate (Fixes #2747) 2025-08-13 17:50:30 -04:00
Alexander Holliday 867b530573 Merge pull request #2765 from bluewave-labs/refactor-login-page
Refactor login page
2025-08-13 14:38:12 -07:00
Owaise 2141c3eacd Metrics validated. 2025-08-14 00:04:53 +05:30
singh-kanwarpreet 13a5f699ba Updated Style 2025-08-13 22:53:18 +05:30
singh-kanwarpreet 7ab5f4ab09 Refactored code 2025-08-13 22:41:13 +05:30
singh-kanwarpreet 480ba034ce Made NavBar Still 2025-08-13 14:47:09 +05:30
karenvicent d560e923d2 Merge branch 'develop' into refactor-login-page 2025-08-12 14:30:55 -04:00
karenvicent 235fc979b2 move hooks to login file 2025-08-12 14:30:11 -04:00
Owaise f5aefb1f0b Ran formattor. 2025-08-12 23:49:45 +05:30
Owaise e27cc8a12b Added delta instead of avg, and formatted the code to re-use already existing code. 2025-08-12 23:48:47 +05:30
Alexander Holliday f2e2d5c2ed Merge pull request #2766 from mertssmnoglu/ci/format-remove-close-pr-step
ci: remove extra 'Close PR' step in check-format workflow
2025-08-12 10:08:23 -07:00
Alexander Holliday 6d999eccbd Merge pull request #2767 from bluewave-labs/fix/reduce-animation-size-in-empty-states
Fix: Reduce animated gif size to 2/3 in empty states
2025-08-12 10:00:03 -07:00
gorkem-bwl 136144b8ec fix: use transform scale instead of width for better border radius preservation 2025-08-12 11:03:46 -04:00
Owaise 355a445ead Fixed the code for linus, windows and mac based. Also made changes to pipeline. 2025-08-12 10:05:58 +05:30
gorkem-bwl c490508252 fix: reduce animated gif size to 2/3 in empty states
Reduces animation size from 100% to 66.67% width for better visual balance
2025-08-11 23:28:35 -04:00
Gorkem Cetin (BWL) 7b4160ac92 Update README.md 2025-08-11 20:38:53 -04:00
karenvicent 781854d85c delete console.log 2025-08-11 18:42:33 -04:00
Mert Şişmanoğlu 86dc71687d ci: remove extra 'Close PR' step in check-format workflow
Signed-off-by: Mert Şişmanoğlu <mertssmnoglu@gmail.com>
2025-08-12 01:41:45 +03:00
karenvicent f0e79121a7 Merge branch 'develop' into refactor-login-page 2025-08-11 18:22:11 -04:00
karenvicent ed1b88f1fd refactor login page 2025-08-11 18:21:23 -04:00
Alexander Holliday bb5a3e73c8 Merge pull request #2763 from bluewave-labs/security/add-jwt-cookie-infrastructure
Add JWT Cookie Infrastructure
2025-08-11 15:09:10 -07:00
Alexander Holliday 38b2025286 Merge branch 'develop' into security/add-jwt-cookie-infrastructure 2025-08-11 15:08:54 -07:00
Alexander Holliday c12f5880e2 Delete server/utils/sanitization.js 2025-08-11 15:07:42 -07:00
Alexander Holliday 94cf22ab8e Merge pull request #2760 from bluewave-labs/security/add-sanitization-infrastructure
Add Input Sanitization Infrastructure
2025-08-11 15:03:37 -07:00
Alex Holliday 0bc8142e71 move to middleware 2025-08-11 15:02:07 -07:00
Alexander Holliday d890b972be Merge pull request #2762 from bluewave-labs/security/apply-input-sanitization
Apply Input Sanitization for XSS Protection
2025-08-11 14:53:32 -07:00
gorkem-bwl 05945a9a74 feat: add JWT cookie infrastructure
Adds the foundation for secure cookie-based authentication without changing
the authentication flow. This prepares the codebase for moving JWT tokens
from Redux state to httpOnly cookies in a follow-up PR.

Changes:
- Added cookie-parser dependency for HTTP cookie handling
- Added cookieParser() middleware to Express application
- Created cookieHelpers.js utilities for consistent cookie options
- Includes getAuthCookieOptions() for setting secure authentication cookies
- Includes getClearAuthCookieOptions() for clearing cookies on logout

Infrastructure only - no behavioral changes to authentication flow yet.

Files added/modified:
- package.json (cookie-parser dependency)
- src/app.js (cookieParser middleware)
- src/utils/cookieHelpers.js (cookie utilities)

Next steps:
- Follow-up PR will modify JWT verification to check cookies
- Enable secure cookie-based authentication
- Add logout functionality to clear httpOnly cookies

Risk level: LOW (infrastructure only, no authentication changes)
2025-08-11 17:47:09 -04:00
gorkem-bwl 88b68a9df0 fix: apply prettier formatting to app.js
Fixed formatting issues to pass CI/CD checks
2025-08-11 17:39:08 -04:00
gorkem-bwl 8b322a0ec0 feat: apply input sanitization to prevent XSS attacks
Enables comprehensive XSS protection by applying sanitization middleware
to all incoming requests. Uses the sanitization utilities added in previous PR.

Changes:
- Added sanitizeBody() and sanitizeQuery() middleware after express.json()
- Enhanced Content Security Policy headers for additional XSS protection
- Added 'object-src: none' and 'base-uri: self' directives
- All user inputs now automatically sanitized before processing

Security improvements:
- Prevents stored XSS attacks through HTML sanitization
- Recursive sanitization handles nested objects and arrays
- Maintains backward compatibility with existing functionality
- Strengthened CSP headers block unsafe content injection

Files changed: src/app.js (9 lines added)
Risk level: Medium (global middleware application)
2025-08-11 17:33:05 -04:00
gorkem-bwl 7968ed8a19 fix: apply prettier formatting to sanitization.js
Fixed formatting issues identified by CI/CD system
2025-08-11 17:26:28 -04:00
gorkem-bwl 2fba22d0f6 feat: add input sanitization infrastructure
Adds foundational utilities for XSS prevention without applying them yet.
This prepares the codebase for comprehensive input sanitization in a follow-up PR.

Changes:
- Added isomorphic-dompurify and jsdom dependencies
- Created sanitization utilities in src/utils/sanitization.js
- Includes recursive object sanitization functions
- Provides Express middleware for body and query sanitization

Infrastructure only - no behavioral changes yet.

Files added:
- src/utils/sanitization.js (sanitization utilities)
- package.json (new dependencies)

Next steps:
- Apply sanitization middleware in follow-up PR
- Enable XSS protection across application
2025-08-11 17:23:14 -04:00
Alexander Holliday cce930b90a Merge pull request #2757 from bluewave-labs/fix/update-openapi-docs
fix: update openapi specs
2025-08-11 13:56:33 -07:00
Alex Holliday c5dd16511d update openapi specs 2025-08-11 13:55:01 -07:00
Owaise 65f437f08e Merge remote-tracking branch 'origin' into Network-tab-implementation-FE 2025-08-09 12:21:21 +05:30
Owaise 47c231a214 Formating done. 2025-08-09 12:17:25 +05:30
Owaise f5d0b74ccf Fixed the processing to be done in backend now. 2025-08-09 12:14:25 +05:30
Alexander Holliday 17cac37967 Merge pull request #2736 from burak28/feat/add-game-server-support
Feat/add game server support
2025-08-08 15:11:06 -07:00
Burak Arslan b7e7028b6f Fix error handling and method assignment in requestGame function 2025-08-08 23:59:41 +03:00
Alexander Holliday ea3df7be42 Merge pull request #2749 from bluewave-labs/fix/gap-select-components
Fix/gap select components
2025-08-08 09:27:21 -07:00
karenvicent f0d7e82e22 Merge branch 'develop' into fix/gap-select-components 2025-08-07 18:53:58 -04:00
karenvicent c6d56b30e4 fix gaps in select components 2025-08-07 18:53:05 -04:00
Alexander Holliday 8225924da6 Merge pull request #2746 from vineet-channe/feature/yellow-range-infrastructure-monitors
feat: Add yellow warning range (50-80%) for infrastructure monitors
2025-08-07 14:54:00 -07:00
Alexander Holliday 6517e9ee6c Merge pull request #2748 from bluewave-labs/feat/fe/sidebar-theme
Feat: Theme Switch Removal from Sidebar
2025-08-07 14:53:15 -07:00
vineet-channe 10ad3397a3 docs(CustomGauge): remove threshold prop from documentation and usage example
- Removed all references to the unused  prop from the JSDoc and usage example in the CustomGauge component.
- Ensured PropTypes and documentation accurately
2025-08-08 03:03:23 +05:30
Br0wnHammer dd9468cb2e Remove unused Imports 2025-08-08 02:06:44 +05:30
Br0wnHammer 0b9ab0614f Tooltip Position 2025-08-08 01:31:20 +05:30
Br0wnHammer e13f495d71 Remove Redundant Stack 2025-08-08 01:11:27 +05:30
Br0wnHammer 029b8fac37 Feat: Remove Theme Toggle Button 2025-08-08 01:07:49 +05:30
Alexander Holliday 6e5ada79de Merge pull request #2742 from bluewave-labs/feat/register-page
Feat/register page
2025-08-07 09:20:07 -07:00
Alexander Holliday 59f050135a Merge pull request #2744 from bluewave-labs/fix/fe/appname-color
Fix: Checkmate Color
2025-08-07 09:15:09 -07:00
vineet-channe dc8b0aed9f chore: format CustomGauge with Prettier 2025-08-07 20:46:15 +05:30
vineet-channe 424df24bf3 feat: Add yellow warning range (50-80%) for infrastructure monitors
Fixes #2615
2025-08-07 20:35:24 +05:30
Br0wnHammer d451f725cd Redundant sx prop 2025-08-07 18:21:50 +05:30
Br0wnHammer d04b8fddb0 Fix: Appname Color 2025-08-07 18:04:58 +05:30
karenvicent bb592964ee Merge branch 'develop' into feat/register-page 2025-08-06 17:19:21 -04:00
karenvicent 786dd427bc feat: Update Register page to match new Login design for consistent UX 2025-08-06 17:17:44 -04:00
Burak Arslan 4c2c452b91 Improve validation and error handling on form field 2025-08-06 00:53:35 +03:00
Alexander Holliday 1765bf7e55 Merge pull request #2740 from vineet-channe/fix-diagnostic-page-design
fix: update diagnostic page design to match infrastructure page
2025-08-05 10:10:35 -07:00
Alexander Holliday e19de23770 Merge pull request #2693 from Owaiseimdad/Network-tab-implementation-infra
Network tab implementation infra, in api at backend
2025-08-05 09:54:17 -07:00
Owaise 765a1a24ed Added en.json based values and console removal. 2025-08-05 21:04:15 +05:30
Owaise e42b4b2808 fixed the minor changes for FE. 2025-08-05 20:46:42 +05:30
ThetaOI 65f6925864 Merge branch 'bluewave-labs:develop' into Network-tab-implementation-FE 2025-08-05 19:49:59 +05:30
ThetaOI 02b7dc080b Merge branch 'bluewave-labs:develop' into Network-tab-implementation-infra 2025-08-05 19:49:38 +05:30
Owaise d4e8381827 Renamed them as average values in the table. 2025-08-05 19:43:35 +05:30
vineet-channe de34710c90 fix: address review feedback
- Replace hardcoded button text with translation
- Fix status box translation to avoid showing removed title
- Add conditional rendering for optional gauge metrics
2025-08-05 17:35:40 +05:30
Alexander Holliday cd8752c1cb Merge pull request #2737 from Jesulayomy/fe-infra_monitor_upgrade
[Frontend]: Refactor Infrastructure monitor create Component
2025-08-04 10:05:06 -07:00
vineet-channe 86a0b0b60c fix: update diagnostic page design to match infrastructure page
- Remove 'System diagnostics' title and divider line
- Add infrastructure-style status boxes with dynamic status
- Update gauge components to use BaseContainer styling
- Match infrastructure page layout and spacing

Resolves #2725
2025-08-04 18:43:37 +05:30
Alexander Holliday fc5ccf1cf8 Merge pull request #2738 from bluewave-labs/feature/2564-add-custom-css-field
Add customCSS field to StatusPage model
2025-08-03 16:16:46 -07:00
mohadeseh safari 45352b62e1 feat(status-page): add customCSS field to StatusPage model 2025-08-03 18:51:12 -04:00
Burak Arslan 0ea3379397 Merge branch 'feat/add-game-server-support' of https://github.com/burak28/Checkmate into feat/add-game-server-support 2025-08-03 13:20:02 +03:00
Burak Arslan 281cbbc30f feat: add game server monitoring support
- Added a new `/games` route in `monitorRoute.js` to fetch all supported games.
- Implemented `getAllGames` method in `monitorController.js` using the `gamedig` library.
- Introduced `useFetchMonitorGames` hook in `monitorHooks.js` to fetch game data in the frontend.
- Updated `UptimeCreate` page to support game server monitoring:
  - Added a new monitor type `"game"`.
  - Dynamically fetches and displays game options using the new `/games` API.
- Removed hardcoded `GAMES` object and replaced it with dynamic fetching from the backend.
- Updated `NetworkService.js` with a new `getMonitorGames` method for API calls.

This update introduces game server monitoring functionality, allowing users to monitor game servers dynamically.
2025-08-03 13:19:55 +03:00
Alexander Holliday 0de9e067c6 Merge pull request #2728 from Mohansai-M/feat/incident-page-block-icons
Feat/incident page block icons
2025-08-02 19:58:49 -07:00
Alexander Holliday 77c00558aa Merge pull request #2735 from bluewave-labs/fix/sidebar
fix: sidebar
2025-08-02 19:50:17 -07:00
owiaseimdad 10c5463892 Fixed the tool tip. 2025-08-03 01:26:13 +05:30
owiaseimdad 7b963ca877 Network tab first implementation 2025-08-03 00:30:04 +05:30
Jesulayomy aa35e9211b [Infra]: Removed duplicate call to .find method on the errors object 2025-08-02 04:13:29 -04:00
Jesulayomy 2fc0eb9460 [Infra]: Added translations for some time blocks 2025-08-02 03:53:54 -04:00
Jesulayomy 91b4c976e5 [Infra]: Refactor Create Component, Added Pause and Remove tool bar 2025-08-02 03:53:11 -04:00
owiaseimdad 950c5fdc92 Formating done. 2025-08-02 12:42:35 +05:30
allanmaaz 114572024c Removed teh required true from network db. 2025-08-02 12:34:31 +05:30
Burak Arslan 8503b7ece4 Merge branch 'develop' into feat/add-game-server-support 2025-08-02 02:28:53 +03:00
Burak Arslan b53650a50f Run npm run format 2025-08-02 02:25:58 +03:00
Burak Arslan 9ad3b58fcd Added game server support 2025-08-02 02:04:06 +03:00
Alex Holliday 521c6988a5 add onclick to avatar 2025-08-01 15:58:01 -07:00
Alex Holliday 7900e1104f clean up nav item 2025-08-01 15:52:55 -07:00
Alex Holliday 035edd92f4 add proptypes, fix logo text animation 2025-08-01 15:45:43 -07:00
Alex Holliday 2c4c6a5024 extract role names 2025-08-01 15:43:12 -07:00
Alex Holliday 12747bd95b remove console 2025-08-01 15:36:33 -07:00
Alex Holliday 7c22663250 remove unused css and old sidebar 2025-08-01 15:31:03 -07:00
Alex Holliday eb4856901b extract function 2025-08-01 15:28:22 -07:00
Alex Holliday da905169e1 remove extra popup state 2025-08-01 15:22:44 -07:00
Alex Holliday fe9bf6375f fix sticky sidebar 2025-08-01 15:14:03 -07:00
Alex Holliday 800f988979 move components to component folder 2025-08-01 15:01:30 -07:00
Alex Holliday b4f42bb7d4 fix arrow icons 2025-08-01 14:58:30 -07:00
Alex Holliday e58c5fdb86 Merge branch 'develop' into fix/sidebar 2025-08-01 14:43:33 -07:00
Alex Holliday 4e3f552538 simplify layouts 2025-08-01 14:10:20 -07:00
Alex Holliday 2d01205f70 auth footer styling 2025-08-01 12:39:35 -07:00
Mohansai Mallineni ebfb25ebc0 Handled styling of new icons 2025-08-01 22:09:15 +05:30
Alexander Holliday d93fb48202 Merge pull request #2732 from bluewave-labs/improve/login-page
Improve/login page
2025-08-01 09:13:02 -07:00
Mohansai Mallineni a73d0ef3b4 format 2025-08-01 21:15:12 +05:30
Mohansai Mallineni 8274d4ffbe Handled styling of new icons 2025-08-01 21:11:46 +05:30
Mohansai Mallineni 48990b860f Handled styling of new icons 2025-08-01 21:09:51 +05:30
Alex Holliday b61a7ffc3c components 2025-07-31 15:37:40 -07:00
karenvicent 37a3028540 Merge branch 'develop' into improve/login-page 2025-07-31 16:33:12 -04:00
karenvicent 2e675f5dee feat: Enhance Login page design and fix UI details 2025-07-31 16:32:30 -04:00
Alexander Holliday 6a2a79c086 Merge pull request #2731 from bluewave-labs/hotfix/monitor-module
fix references
2025-07-31 13:25:12 -07:00
Alex Holliday a86e9ff480 fix references 2025-07-31 13:24:32 -07:00
Alex Holliday 3dc332010e start refactor 2025-07-31 12:47:36 -07:00
Alexander Holliday 61a1972c4c Merge pull request #2730 from bluewave-labs/fix/diagnostic-module
fix: diagnostic module
2025-07-31 12:06:30 -07:00
Alex Holliday 0779e5ea15 remove commented out imports 2025-07-31 12:02:52 -07:00
Alexander Holliday fab78f0cee Merge pull request #2729 from bluewave-labs/feat/settings-module
feat: settubgs module -> class
2025-07-31 12:01:45 -07:00
Alex Holliday ce49270cf8 remove unused diagnostic db module 2025-07-31 12:00:27 -07:00
Alex Holliday 7a190f7c69 module -> class 2025-07-31 11:57:55 -07:00
Mohansai Mallineni 126767ed5c Replaced existing icons with the provided svg's in the Incident page block area 2025-07-31 22:39:17 +05:30
Alexander Holliday 7d5302cfcf Merge pull request #2707 from singh-kanwarpreet/feature/global-thresholds
Feature/global thresholds
2025-07-31 09:31:14 -07:00
Alexander Holliday 87d3d6a8f0 Merge pull request #2724 from bluewave-labs/feat/recovery-module
feat: recovery module -> class
2025-07-31 09:18:56 -07:00
Alex Holliday 927e8a88b8 remove console log 2025-07-31 09:18:12 -07:00
singh-kanwarpreet 73a6277feb Refactored Code 2025-07-31 16:04:41 +05:30
Mohansai Mallineni 94a7044b7b Replaced existing icons with the provided svg's in the Incident page block area 2025-07-31 05:07:42 +05:30
Alex Holliday 54d3392cf1 remove commented out imports 2025-07-30 15:35:16 -07:00
Alexander Holliday f1c9aad4e6 Merge pull request #2723 from bluewave-labs/feat/pagespeed-module
feat: pagespeed module->class
2025-07-30 15:34:32 -07:00
Alex Holliday 48cf8a5e73 module -> class 2025-07-30 15:34:03 -07:00
Alex Holliday b5f4c04165 module->class 2025-07-30 15:21:22 -07:00
Alexander Holliday a9c2549376 Merge pull request #2722 from bluewave-labs/feat/notification-module
feat: notification module -> class
2025-07-30 15:17:19 -07:00
Alex Holliday 7bf96f6194 module -> class 2025-07-30 15:14:36 -07:00
Alexander Holliday ae40cb8a54 Merge pull request #2721 from bluewave-labs/feat/network-check-module
feat: NetworkCheck module -> class
2025-07-30 15:06:50 -07:00
Alex Holliday 16ebe4b1ab module -> class 2025-07-30 15:06:19 -07:00
Alexander Holliday c7914a1c4f Merge pull request #2720 from bluewave-labs/feat/monitor-module
feat: monitor module
2025-07-30 15:06:03 -07:00
Alex Holliday 6b12246ec0 Merge branch 'develop' into feat/monitor-module 2025-07-30 15:00:33 -07:00
Alexander Holliday 4a42b6eb43 Merge pull request #2719 from bluewave-labs/feat/maintenance-window-module
feat: module -> class
2025-07-30 14:59:46 -07:00
Alex Holliday de742068a7 module -> class 2025-07-30 12:25:12 -07:00
Alex Holliday b383ce5b11 Merge branch 'develop' into feat/maintenance-window-module 2025-07-30 11:39:23 -07:00
Alexander Holliday ccb424eafe Merge pull request #2718 from bluewave-labs/feat/hardware-module
module -> class
2025-07-30 11:38:34 -07:00
Alex Holliday 585fb4f700 module -> class 2025-07-30 11:36:19 -07:00
Alex Holliday 00f5eaf44d module -> class 2025-07-30 11:27:29 -07:00
singh-kanwarpreet 8bacbcde89 Removed Unnecassary command 2025-07-30 23:35:51 +05:30
Alexander Holliday 245e436a88 Merge pull request #2717 from bluewave-labs/feat/user-module-class
feat: refactor user module into class
2025-07-30 10:54:41 -07:00
singh-kanwarpreet 2d6fdcb1e2 Made code readable 2025-07-30 23:14:35 +05:30
Alex Holliday 8adad64248 refactor module into class 2025-07-30 10:41:53 -07:00
Alexander Holliday e7cf6d385c Merge pull request #2714 from bluewave-labs/feat/statuspage-module
feat: refactor status page module into class
2025-07-30 10:22:46 -07:00
Alex Holliday 753a904c94 refacotr status page module into class 2025-07-30 10:20:33 -07:00
Alexander Holliday 0ccbd17709 Merge pull request #2713 from bluewave-labs/hotfix/crypto
fix crypto dependency
2025-07-30 09:19:07 -07:00
Alex Holliday 78a5b2e666 fix crypto dependency 2025-07-30 09:18:16 -07:00
singh-kanwarpreet 5e46a9f2d5 Pushed global thresholds inside create if branch 2025-07-30 19:38:23 +05:30
singh-kanwarpreet 0ecbf48f5d client/src/Pages/Infrastructure/Create/index.jsx 2025-07-30 19:18:24 +05:30
singh-kanwarpreet d4ecb26ffe Updated UseEffect 2025-07-30 18:30:04 +05:30
singh-kanwarpreet e04ac77ddd Ran npm start format 2025-07-30 16:39:41 +05:30
Alexander Holliday cd3702f5b5 Merge pull request #2712 from bluewave-labs/feat/invite-module
feat: refactor invite module into class
2025-07-29 20:01:39 -07:00
Alex Holliday ca02ed9d18 refactor invite module into class 2025-07-29 19:53:11 -07:00
Alexander Holliday f934bbf829 Merge pull request #2711 from bluewave-labs/fix/check-module
fix: convert checkModule to class for dependency injection
2025-07-29 12:04:44 -07:00
singh-kanwarpreet da7d9c02c8 Used Parent State And Set Minor Changes 2025-07-30 00:25:53 +05:30
Alex Holliday e55d8618bd convert checkModule to class for dependency injection 2025-07-29 11:51:06 -07:00
singh-kanwarpreet af010e138d Some changes in ui 2025-07-30 00:01:27 +05:30
Alexander Holliday 9d94b71583 Merge pull request #2664 from Jesulayomy/fe-uptime_monitor_config
[Frontend]: Refactor Uptime monitor Create & Configure components
2025-07-29 11:15:55 -07:00
Alexander Holliday 38d31192ed Merge pull request #2710 from bluewave-labs/fix/sort-json
sort en.json
2025-07-29 11:14:30 -07:00
Alex Holliday a0799874e4 sort en.json 2025-07-29 11:14:06 -07:00
Alexander Holliday 5ec2500310 Merge pull request #2698 from bluewave-labs/improve/light-mode-ui
Improve/light mode UI
2025-07-29 11:11:17 -07:00
karenvicent 0bd9aa1e3f Merge branch 'develop' into improve/light-mode-ui 2025-07-29 13:45:14 -04:00
karenvicent 20dd3ead3e change background and boder colors to tertiry pallette 2025-07-29 13:43:47 -04:00
Alexander Holliday b30a512d6e Merge pull request #2709 from bluewave-labs/hotfix/secrets
hotfix: replace missing secrets
2025-07-29 10:09:17 -07:00
Alex Holliday e63faebcb8 replace missing secrets 2025-07-29 10:08:45 -07:00
Alexander Holliday 7e5cb1facc Merge pull request #2708 from bluewave-labs/hotfix/logger
add legacy logger
2025-07-29 10:01:49 -07:00
Alex Holliday 10c822c5d9 add legacy logger 2025-07-29 10:01:20 -07:00
Alexander Holliday 8761b3e28d Merge pull request #2704 from bluewave-labs/fix/settings
fix/settings
2025-07-29 09:39:08 -07:00
Alexander Holliday 19cccbbcad Merge pull request #2705 from satnam72/develop
Fix the broken breadcrumbs link
2025-07-29 09:38:25 -07:00
singh-kanwarpreet dbea93f9ba Improved Code Quality 2025-07-29 21:35:30 +05:30
karenvicent 4629014922 Merge branch 'develop' into improve/light-mode-ui 2025-07-29 10:08:29 -04:00
karenvicent 24e7b1c224 add darmode animation to fallback component 2025-07-29 10:07:37 -04:00
singh-kanwarpreet ad06544a64 Removed Consecutive same statements 2025-07-29 16:05:53 +05:30
singh-kanwarpreet 8d105e636d Updated Global THreshold Code Quality 2025-07-29 16:05:53 +05:30
singh-kanwarpreet bf5d7f3c53 Adding Global Threshold Settings 2025-07-29 16:05:53 +05:30
satnam72 c5cd3512af Fixed Formatting issue
Ran the npm run format to fix formatting
2025-07-29 02:56:41 -04:00
satnam72 2802cce6f1 Fix the breadcrumbs route
- Updated breadcrumbs to use `/status/uptime/${url}` instead of `/status/${url}`
2025-07-28 23:40:24 -04:00
Alex Holliday 6e49e19ba1 refactor serviceRegistry 2025-07-28 15:25:33 -07:00
Alexander Holliday 0c6d635b67 Merge pull request #2700 from bluewave-labs/translation-update-75
🌐 Updated Translations from POEditor
2025-07-28 15:06:17 -07:00
Alex Holliday de80a530e5 refactor logger 2025-07-28 15:03:28 -07:00
GitHub Action 63b106d844 feat: translations updated from POEditor 2025-07-28 21:42:35 +00:00
Alexander Holliday ab96e321c9 Merge pull request #2699 from bluewave-labs/feat/ja
Feat/ja
2025-07-28 14:41:52 -07:00
Alex Holliday 0b7d1abb71 add ja 2025-07-28 14:41:24 -07:00
Alex Holliday 592c184ffe add ja 2025-07-28 14:40:10 -07:00
Alex Holliday f3e50120ee appSettings -> envSettings 2025-07-28 14:37:18 -07:00
Gorkem Cetin (BWL) 850510b7e8 Update README.md 2025-07-28 17:30:33 -04:00
karenvicent d1e9a1221f Merge remote-tracking branch 'origin/develop' into improve/light-mode-ui 2025-07-28 17:08:31 -04:00
karenvicent 56ea28aa83 run format 2025-07-28 17:05:22 -04:00
Alexander Holliday 140ae1d049 Merge pull request #2694 from bluewave-labs/feat/rate-limiting
feat: add rate limiting
2025-07-28 13:48:59 -07:00
Alex Holliday 6025323c4b less aggressive auth rate limiting 2025-07-28 13:48:09 -07:00
karenvicent 261c83158b Merge remote-tracking branch 'origin/develop' into improve/light-mode-ui 2025-07-28 16:33:20 -04:00
karenvicent 1a5f16c4e3 improves in light mode 2025-07-28 16:28:44 -04:00
Owaise Imdad ab0bf5ca5f Fixed the names and err out and err in . 2025-07-29 00:42:55 +05:30
Owaise Imdad 158b66e43b Merge branch 'develop' of https://github.com/Owaiseimdad/Checkmate into Network-tab-implementation-infra 2025-07-29 00:30:46 +05:30
Alex Holliday ec99b5e9b4 add rate limiting 2025-07-28 12:00:09 -07:00
Owaise Imdad 19fe41d738 reverting the docker dev changes I made. 2025-07-29 00:22:14 +05:30
Owaise Imdad 5c147562b3 Added net to be returned from api in backend for infra. 2025-07-29 00:17:34 +05:30
Alexander Holliday 051c17f454 Merge pull request #2692 from bluewave-labs/feat/status-page-paintenance
feat: add isMaintenance field to monitors for status page queries
2025-07-28 11:40:30 -07:00
Alex Holliday ab8868e6c4 add an field to the monitor for status page queries 2025-07-28 11:35:49 -07:00
Jesulayomy b5b600db1f [Merge]: Merged commits from develop into branch fe-uptime_monitor_config 2025-07-28 13:09:09 -04:00
Alexander Holliday 41f917ddf6 Merge pull request #2688 from bluewave-labs/feat/server-refactor
feat: server refactor
2025-07-28 09:01:39 -07:00
Alex Holliday e5e02b553a fix dependencies 2025-07-27 19:51:39 -07:00
Owaise Imdad 729f107af2 Merge branch 'develop' of https://github.com/Owaiseimdad/Checkmate into develop 2025-07-27 03:47:49 +05:30
Owaise Imdad 8bfb187ef0 FIX merge conflicts 2025-07-27 03:47:30 +05:30
Alex Holliday 1c47c8ce2c move to src 2025-07-25 15:33:48 -07:00
Alex Holliday acc910cbc0 refactor server 2025-07-25 15:15:14 -07:00
Jesulayomy 1aedf21566 [Uptime]: Added PropType validation, passed isClone directly as prop 2025-07-25 13:37:17 -04:00
Alexander Holliday 6cb538ce69 Merge pull request #2681 from bluewave-labs/feat/error-service
feat: error service
2025-07-25 10:36:10 -07:00
Alex Holliday cafd9f9899 remove empty file 2025-07-25 10:29:40 -07:00
Alex Holliday bb2ab8e08a format 2025-07-25 10:29:04 -07:00
Alex Holliday 3059e730e2 type errors 2025-07-25 10:19:22 -07:00
Alex Holliday dc321580c3 refactor out common dependenceis 2025-07-25 10:16:29 -07:00
Jesulayomy 6cfa77a335 [Uptime]: Add clone Route and restore cloning logic 2025-07-25 11:11:39 -04:00
Alex Holliday ddf3e8251d add an error service, base controller 2025-07-24 15:06:46 -07:00
Alexander Holliday 0cfe9d60fb Merge pull request #2678 from bluewave-labs/feat/monitor-service
feat: monitor service
2025-07-24 13:57:25 -07:00
Alex Holliday 19d3ae119c added safe var access 2025-07-24 13:51:00 -07:00
Alex Holliday d59e2796e7 refactor to monitor service 2025-07-24 13:50:21 -07:00
Gorkem Cetin (BWL) 12ff66fd3e Merge pull request #2667 from ferCancholaCruz/add-readme-es
Spanish version of Readme File. Agrega traducción al español del README
2025-07-24 14:16:25 -04:00
Fernando Canchola Cruz 35270e2761 Update README.es.md
Fixed readme.es.md
2025-07-24 11:38:45 -06:00
Jesulayomy 47021fa55c [Uptime]: removed formatAndSet, added displayInterval, moved UI logic out of component view 2025-07-24 13:38:14 -04:00
Jesulayomy 89f5be2cc9 [Uptime]: Moved hook, removed duplicate imports, teporarily disabled formatAndSet function due to rerenders 2025-07-23 21:13:19 -04:00
Jesulayomy d3493a0af6 [Uptime]: Used latest formatting rules 2025-07-23 20:01:39 -04:00
Jesulayomy 157343d152 [Locales]: Sorted translations, fixed a duplicate key from the original branch 2025-07-23 19:59:45 -04:00
Jesulayomy 5f36543d44 [Uptime]: Removed UptimeConfigure component, added extra translations for Uptime and other monitor pages 2025-07-23 19:22:09 -04:00
Jesulayomy a004b7b450 [Uptime]: Merged Configure into Create Component 2025-07-23 19:20:37 -04:00
Jesulayomy 56d8224fb9 [Uptime]: Added skeleton file 2025-07-23 19:15:28 -04:00
Alexander Holliday dd6e7b7e7e Merge pull request #2677 from bluewave-labs/hotfix/clone-monitor
fix: reimplement clone monitor, resolves #2676
2025-07-23 15:32:23 -07:00
Alex Holliday 6d5034e2a5 reimplement clone monitor 2025-07-23 15:31:26 -07:00
Alexander Holliday ed6882ba95 Merge pull request #2675 from bluewave-labs/feat/mw-service
feat: add maintenance window service
2025-07-23 15:15:25 -07:00
Alex Holliday b3f8d77238 add maintenance window service 2025-07-23 15:14:47 -07:00
Alexander Holliday c287da92d9 Merge pull request #2674 from bluewave-labs/feat/invite-service
feat: add invite service
2025-07-23 15:00:51 -07:00
Alex Holliday aea79fec2e add invite service 2025-07-23 14:58:44 -07:00
Alexander Holliday 3239f555a1 Merge pull request #2673 from bluewave-labs/feat/diagnostic-service
feat: diagnostic service
2025-07-23 14:31:51 -07:00
Alex Holliday da49e15589 jsdocs, move observer 2025-07-23 14:31:40 -07:00
Alex Holliday cfebc770fd add diagnostic service 2025-07-23 14:28:16 -07:00
Alexander Holliday ffef14957f Merge pull request #2671 from bluewave-labs/feat/check-service
feat: check service
2025-07-23 14:22:25 -07:00
Alexander Holliday 05666f70e0 Merge pull request #2672 from bluewave-labs/fix/validation
Fix/validation
2025-07-23 14:21:02 -07:00
Alex Holliday c1dc575f53 reset server validation 2025-07-23 14:17:47 -07:00
Alex Holliday bf861700fa resest client validation 2025-07-23 14:15:43 -07:00
Alexander Holliday 627c2174a9 Merge pull request #2670 from bluewave-labs/feat/fe/resolve-monitor-incidents
Feat: Selected Monitor Incidents Resolve
2025-07-23 14:03:34 -07:00
Br0wnHammer b27eccec88 Merge branch 'develop' into feat/fe/resolve-monitor-incidents 2025-07-24 02:15:00 +05:30
Alex Holliday 8c0dfb2cc5 add a check service 2025-07-23 13:41:10 -07:00
Br0wnHammer c766dc9f00 JSDOC for both network calls 2025-07-24 02:06:55 +05:30
Br0wnHammer 7236e85321 Removal of old code 2025-07-24 01:56:05 +05:30
Br0wnHammer b7093b5de5 Feat: One Hook for Incidents Ack 2025-07-24 01:54:58 +05:30
Br0wnHammer 3650c400ca Feat: Monitor Incidents Resolve 2025-07-24 01:47:42 +05:30
Br0wnHammer 4933d11dfd Network Service: Monitor Check Func 2025-07-24 01:42:46 +05:30
Alexander Holliday 08128279b4 Merge pull request #2669 from bluewave-labs/feat/service-refactor
feat: service refactor
2025-07-23 13:11:52 -07:00
Alex Holliday 181e149028 Merge branch 'develop' into feat/service-refactor 2025-07-23 13:09:48 -07:00
Alexander Holliday 9bb9265a19 Merge pull request #2668 from bluewave-labs/feat/user-service
feat: user service
2025-07-23 13:08:33 -07:00
Alex Holliday 65f232161f sync package lock 2025-07-23 13:06:23 -07:00
Br0wnHammer df97b93a9a Button Text Dynamic 2025-07-24 01:35:31 +05:30
Alex Holliday f58d05f1b3 format 2025-07-23 13:04:26 -07:00
Alex Holliday 06fa79e09d refactor service dir structure 2025-07-23 13:03:57 -07:00
Gorkem Cetin (BWL) 6da52adc74 Trying to fix anchors 2025-07-23 15:41:44 -04:00
Alex Holliday 0b4ec46f79 add updated JSdoc 2025-07-23 12:12:22 -07:00
Alex Holliday 6e321afa72 add remaining methods to service 2025-07-23 12:09:23 -07:00
Alex Holliday a08ded4093 move checksuperadmin to userservice 2025-07-23 11:48:47 -07:00
Alex Holliday e76b44fcba fix validaiton for editing user 2025-07-23 11:47:21 -07:00
Alex Holliday 1fa2dbcf85 Add user serivce, move register, login, and edit 2025-07-23 11:47:13 -07:00
Alex Holliday 74fd20cfa8 move checksuperadmin 2025-07-23 11:46:59 -07:00
Fernando Canchola Cruz f90b5bab4b Agrega traducción al español del README 2025-07-23 12:36:07 -06:00
Alexander Holliday 812cff0fd9 Merge pull request #2559 from bluewave-labs/feat/super-simple-queue
feat: super simple queue
2025-07-23 10:38:13 -07:00
Alex Holliday 7127c28c35 bump dependency 2025-07-23 10:35:32 -07:00
Alex Holliday 4f186a6b49 Merge branch 'develop' into feat/super-simple-queue 2025-07-23 10:35:11 -07:00
Alexander Holliday fe76416059 Merge pull request #2666 from bluewave-labs/hotfix/import
fix import path
2025-07-23 10:13:12 -07:00
Alex Holliday ac2b7bd65d fix import path 2025-07-23 10:12:47 -07:00
Alexander Holliday 604b20855b Merge pull request #2663 from bluewave-labs/feat/fe/infrastructure-disk-ui-overflow
Fix: Infrastructure disks overflow
2025-07-23 09:45:56 -07:00
Alexander Holliday e157ee7c53 Merge pull request #2661 from bluewave-labs/feat/edit-users
feat: edit users, resolves #2659
2025-07-23 09:43:27 -07:00
Alex Holliday 91ccfe26b7 Merge branch 'feat/edit-users' of github.com:bluewave-labs/checkmate into feat/edit-users 2025-07-23 09:37:52 -07:00
Alex Holliday de88e1d442 return early if delete superadmin 2025-07-23 09:37:37 -07:00
Alexander Holliday baf5967dca Merge branch 'develop' into feat/edit-users 2025-07-23 09:37:04 -07:00
Alexander Holliday df6a1b39e0 Merge pull request #2662 from bluewave-labs/feat/fallback-refactor
Reopen Feat/fallback refactor
2025-07-23 09:33:47 -07:00
Br0wnHammer 8fcaf721ad Fix: Infrastructure disks overflow 2025-07-23 15:33:09 +05:30
karenvicent 22d17708cd format 2025-07-22 16:46:43 -04:00
Alex Holliday 457408006b sort en.json 2025-07-22 13:33:11 -07:00
Alex Holliday f74289fe49 format 2025-07-22 13:32:26 -07:00
Alex Holliday 86ece89cec Merge branch 'develop' into feat/edit-users 2025-07-22 13:32:03 -07:00
Alex Holliday 22826afd21 apply validation 2025-07-22 13:26:45 -07:00
Alex Holliday 73f2f29c2a add valid roles 2025-07-22 13:26:01 -07:00
karenvicent a6eb2735aa Merge branch 'develop' into feat/fallback-refactor 2025-07-22 16:23:37 -04:00
Alex Holliday c4d42dd9e3 add db 2025-07-22 12:27:41 -07:00
Alex Holliday e047309812 add controller methods 2025-07-22 12:27:33 -07:00
Alex Holliday c11da04e13 add edit user routes 2025-07-22 12:27:17 -07:00
Alex Holliday 4f68a76674 implement frontend of user edit 2025-07-22 12:27:06 -07:00
karenvicent b2fdb11195 run format 2025-07-22 14:54:41 -04:00
Mohansai Mallineni 97082b30b9 feat(i18n): implement new language mappings and initialize translation files 2025-07-22 13:59:19 -04:00
Alex Holliday 43ac0174d1 format 2025-07-22 09:23:26 -07:00
Alex Holliday cb02bb0de7 Merge branch 'develop' into feat/fallback-refactor 2025-07-22 09:23:09 -07:00
Alexander Holliday 9c9eaca990 Merge pull request #2646 from Mohansai-M/feat/i18n-new-lang-support
feat(i18n): implement new language mappings and initialize translatio…
2025-07-22 09:21:36 -07:00
Alexander Holliday 8336ea199d Merge pull request #2658 from bluewave-labs/fix/protect-demo-user
prevent demo user from being deleted
2025-07-21 15:05:57 -07:00
Alex Holliday 48848d1d43 prevent demo user from being deleted 2025-07-21 15:05:17 -07:00
Alexander Holliday 1eea0b6862 Merge pull request #2632 from Yasir-Rafique/validationRemoval_monitorURL
Relax monitor URL validation
2025-07-21 14:52:12 -07:00
Alexander Holliday 2977c1f6db Merge pull request #2641 from miguemely/develop
Increase helm chart support for different cluster types + CORS Fixes
2025-07-21 14:45:40 -07:00
Alexander Holliday c70ee26c8a Merge pull request #2657 from bluewave-labs/fix/notification-routes
fix auth for notification controller
2025-07-21 14:11:52 -07:00
Alex Holliday 1b085236c7 fix aith for notification controller 2025-07-21 14:11:09 -07:00
Alexander Holliday 78b371bfad Merge pull request #2656 from bluewave-labs/fix/monitor-routes
fix: monitor routes
2025-07-21 13:58:33 -07:00
Alex Holliday fdff3be316 fix team auth 2025-07-21 13:58:01 -07:00
Alex Holliday f2037bf5fe fix route 2025-07-21 13:46:06 -07:00
karenvicent a28a8fe5f9 Merge branch 'develop' into feat/fallback-refactor 2025-07-21 16:19:49 -04:00
karenvicent 62f94cfb20 refactor: extract Fallback component into smaller reusable components 2025-07-21 16:13:18 -04:00
Alexander Holliday 3e75972b02 Merge pull request #2654 from bluewave-labs/fix/mw-routes
fix: mw routes
2025-07-21 12:28:44 -07:00
Alex Holliday d6d3b53846 add team auth to mw routes 2025-07-21 12:27:53 -07:00
Alex Holliday 87f843df1c add getmonitorsbyids 2025-07-21 12:27:43 -07:00
Alex Holliday 5dbec377e5 reorder routes 2025-07-21 12:26:38 -07:00
Alexander Holliday a489c9ff45 Merge pull request #2653 from ajhollid/fix/diagnositc-routes
fix: remove unused routes, add authentication
2025-07-21 12:04:52 -07:00
Alex Holliday 4d989746fd remove unused routes, add authentication 2025-07-21 12:04:16 -07:00
Alexander Holliday ba48461417 Merge pull request #2652 from bluewave-labs/fix/check-routes
fix auth for check routes
2025-07-21 11:54:44 -07:00
Alex Holliday 55e2d5c0e3 fix auth for check routes 2025-07-21 11:54:04 -07:00
Alexander Holliday 8864f9799f Merge pull request #2651 from bluewave-labs/fix/auth-routes
fix: auth routes
2025-07-21 11:06:42 -07:00
Alex Holliday e2ddffe24b remove userId param from routes 2025-07-21 11:05:48 -07:00
Alex Holliday 12b7819791 remove user ID param from rotues 2025-07-21 11:05:10 -07:00
Alex Holliday bfa6832beb format 2025-07-21 10:34:16 -07:00
Alex Holliday 846564a17e reorder routes 2025-07-21 10:34:04 -07:00
Alexander Holliday 46d7009837 Merge pull request #2650 from bluewave-labs/fix/route-reorder
fix: reorder routes for correctness
2025-07-21 09:56:50 -07:00
Alex Holliday 0c04db3299 reorder routes for correctness 2025-07-21 09:55:49 -07:00
Miguel Rodriguez 2d437e2016 coderabbit fix: Add HTTPS to CORS origins 2025-07-20 13:30:01 -04:00
Miguel Rodriguez 37655a64c0 fix: Set CORS headers with a split setup on helm. 2025-07-20 13:22:01 -04:00
Miguel Rodriguez 4921b17f11 fix: docker.sock doesn't exist on many K8S Servers 2025-07-20 12:57:16 -04:00
Gorkem Cetin (BWL) dae0d6cc42 Update README.md 2025-07-20 11:50:34 -04:00
Mohansai Mallineni c392933e55 feat(i18n): implement new language mappings and initialize translation files 2025-07-20 20:08:06 +05:30
Gorkem Cetin (BWL) c915137ed7 Add reddit group 2025-07-20 10:11:52 -04:00
Yasir Rafique 945cff978b Use URL.canParse for URL validation; add strict regex fallback (maintainer feedback) 2025-07-19 06:53:01 +01:00
Alexander Holliday ae21b728bc Merge pull request #2625 from bluewave-labs/feat/toast-refactor
feat: toast refactor
2025-07-18 11:22:32 -07:00
Yasir Rafique 8ffd9a5e2a Tighten Docker hostname regex for monitor URL validation 2025-07-18 11:58:27 +01:00
Yasir Rafique b823f0f7db Relax monitor URL validation for Docker and local hostnames (fixes #2605) 2025-07-18 11:40:20 +01:00
Yasir Rafique 066df2c64f Relax monitor URL validation 2025-07-18 10:59:02 +01:00
Alexander Holliday 200a933647 Merge pull request #2621 from bluewave-labs/fix/consistent-error-handling
fix: imporved and consistent error handling
2025-07-17 09:37:51 -07:00
Alex Holliday 4cd5cd4bae fix close icon placement for toasts without title 2025-07-16 12:51:52 -07:00
Alexander Holliday bfba1d148e Merge pull request #2592 from bluewave-labs/feature/all-maintenance-on-window
Add "All Monitors" as an option for Maintenance windows  #2579
2025-07-16 10:38:47 -07:00
Alex Holliday c58801f6f7 update toastUtils to use Toast component 2025-07-16 10:33:06 -07:00
Alex Holliday 616927d388 Add new toast component 2025-07-16 10:32:19 -07:00
shanika Jayawardane 1cbebf322b remove unwanted code 2025-07-16 11:06:05 -06:00
Alexander Holliday a46c032979 Merge pull request #2617 from career-yashaswee/bug/2603-url-validation-email-format
(fix): implemented email and webhook url validation with proper error and toast creation
2025-07-16 09:16:12 -07:00
Alexander Holliday f03f94c3dd Merge pull request #2616 from bluewave-labs/fix/forms-margins-infrastructure-alignment
Fix/forms margins infrastructure alignment
2025-07-16 08:57:06 -07:00
karenvicent 1cee10842e apply style to MuiSelect in globalTheme 2025-07-16 10:36:52 -04:00
Br0wnHammer 55e9c74031 Fix: Page State Reset in Infra 2025-07-16 10:29:22 -04:00
Alexander Holliday 45a9495a51 Merge pull request #2624 from bluewave-labs/fix/fe/search-page-reset
Fix: Page State Reset in Infra
2025-07-16 06:33:50 -07:00
Br0wnHammer c785704dd8 Fix: Page State Reset in Infra 2025-07-16 12:29:18 +05:30
Alex Holliday 38bb915144 add error handling util, update middleware and controllers 2025-07-15 16:33:35 -07:00
Alexander Holliday e2f99f52db Merge branch 'develop' into fix/forms-margins-infrastructure-alignment 2025-07-15 15:22:43 -07:00
Alexander Holliday c54feb9306 Merge pull request #2620 from bluewave-labs/feat/diagnostics
Feat/diagnostics
2025-07-15 15:21:15 -07:00
Alexander Holliday e11b09feac Merge pull request #2600 from career-yashaswee/feat/2598-search-timezone-ux
Feat/2598 Search Timezone UX Addition
2025-07-15 13:05:34 -07:00
Yashaswee Kesharwani fe44bc989a fix: use-memo dependency array and prop-types error 2025-07-16 00:59:22 +05:30
karenvicent 93bf98fe72 Merge branch 'develop' into fix/forms-margins-infrastructure-alignment 2025-07-15 14:42:20 -04:00
karenvicent 5a2626b38b feat: apply styleOverrides for MuiSelect in base theme 2025-07-15 14:39:41 -04:00
Alexander Holliday 5d57138ea8 Merge pull request #2619 from mertssmnoglu/helm-syntax-error
fix: correct syntax error in secrets.yaml template #2618
2025-07-15 10:11:31 -07:00
Mert Şişmanoğlu 20519afe17 fix: correct syntax error in secrets.yaml template #2618
Signed-off-by: Mert Şişmanoğlu <mertssmnoglu@gmail.com>
2025-07-15 20:01:38 +03:00
Alexander Holliday f23f7df147 Merge pull request #2595 from bluewave-labs/feat/diagnostics
feat: diagnostics tab
2025-07-15 09:46:31 -07:00
Yashaswee Kesharwani b89ab5a192 (fix): implemented email and webhook url validation with proper error and toast creation #2603 2025-07-15 22:13:31 +05:30
karenvicent 35c59dc53b Merge branch 'develop' into fix/forms-margins-infrastructure-alignment 2025-07-15 09:03:56 -04:00
shanika Jayawardane 870cd6407e remove the drag and drop fuction for list and remove dublicate code 2025-07-14 23:44:50 -06:00
Alex Holliday f62350fea0 add refresh button 2025-07-14 16:26:34 -07:00
Alex Holliday 39779b9dd5 refacotr interval to be self documenting 2025-07-14 16:26:24 -07:00
Alexander Holliday 0f9f814b27 Merge pull request #2604 from bluewave-labs/fix/page-reset
Fix: Reset Page when Searching
2025-07-14 10:50:18 -07:00
Alexander Holliday 49b08e9e6f Merge pull request #2608 from bluewave-labs/fix/route-specificity
fix: reorder rotues to correctly match
2025-07-14 09:40:02 -07:00
Alex Holliday a879051454 reorder rotues to correctly match 2025-07-14 09:38:00 -07:00
Alexander Holliday a0439cd7f4 Merge pull request #2576 from JefferMarcelino/feature/add-helm-chart
Add Helm chart and Kubernetes installation guide
2025-07-14 09:03:23 -07:00
Alexander Holliday bc436da263 Merge pull request #2588 from Jesulayomy/fe-monitor_config_pages
[Frontend]: Refactor PageSpeed monitor Create & Configure components
2025-07-14 09:02:20 -07:00
karenvicent c86c5d8235 Merge branch 'develop' into fix/forms-margins-infrastructure-alignment 2025-07-13 20:25:23 -04:00
karenvicent 86160a103d feat(forms): standardized label-to-input spacing in forms via new FieldWrapper component 2025-07-13 20:23:10 -04:00
Br0wnHammer f912c5eb5d Fix: Reset Page when Searching 2025-07-14 01:45:28 +05:30
Jeffer Marcelino 84f0b936ca Merge branch 'feature/add-helm-chart' of https://github.com/JefferMarcelino/Checkmate into feature/add-helm-chart 2025-07-13 19:18:10 +02:00
Jeffer Marcelino 72d34fcc4f chore: update appVersion and images in Helm chart for Checkmate 2025-07-13 19:18:01 +02:00
Yashaswee Kesharwani 2bb7818116 fix: replaced remaining Selects with Search in Settings Tab - optimised with useMemo and standardised the no unit found 2025-07-13 03:52:16 +05:30
shanika Jayawardane 39d666df6b add the checkboxes for dropdown list and remove searchbox list inside it 2025-07-12 15:13:24 -06:00
Jesulayomy a7dd23141c [PageSpeed]: Formatting monitorHooks 2025-07-12 14:26:17 -04:00
Yashaswee Kesharwani a7e26d553f chore: format code using npm run format 2025-07-12 23:22:42 +05:30
Yashaswee Kesharwani 95e82cf254 feat: resolve #2598 improve timezone search UX 2025-07-12 23:17:41 +05:30
Alex Holliday 07c8334248 Merge branch 'develop' into feat/super-simple-queue 2025-07-11 13:51:14 -07:00
Alexander Holliday c54e6b0b34 Merge pull request #2596 from bluewave-labs/feat/codeowners
add CODEOWNERS
2025-07-11 11:59:50 -07:00
Alex Holliday f8a7b86ab7 add CODEOWNERS 2025-07-11 11:58:05 -07:00
Alex Holliday 5b395b96cd implemet stats 2025-07-11 11:23:50 -07:00
Alex Holliday b1b4fd3f64 add 1s cpu usage metric, return standard units of ms and bytes 2025-07-11 11:23:36 -07:00
Jesulayomy 352d3a1647 [PageSpeed]: Use typeof operator for clarity, and to handle undeclared and undefined variables 2025-07-11 13:40:29 -04:00
Jesulayomy f04fd8bea2 [PageSpeed]: Merged loading states, used theme spacing, moved Skeleton layout outside of main component render 2025-07-11 11:40:28 -04:00
shanika Jayawardane 6e76e29768 add the translation to selectAll 2025-07-11 07:59:12 -06:00
shanika Jayawardane 2c1a01bb6a add the All select option to monitor maintenance window for all monitors same as status pages 2025-07-11 07:44:02 -06:00
Jesulayomy 2d587a7d1b [PageSpeed]: Clean console statement and run npm format 2025-07-10 22:09:13 -04:00
Jesulayomy b7b7687608 [PageSpeed]: Loading states from hooks, unused classnames, conditional calling of hook removed 2025-07-10 21:54:27 -04:00
Jesulayomy 840069b935 [PageSpeed]: Implement conditional check for monitorId inside useFetchMonitorById hook 2025-07-10 21:53:33 -04:00
Alex Holliday 1cbec8220d add diagnostic page 2025-07-10 16:08:04 -07:00
Alex Holliday 1456c4f749 bump version 2025-07-10 16:06:38 -07:00
Alex Holliday 881944ab98 Merge branch 'develop' into feat/super-simple-queue 2025-07-10 14:45:47 -07:00
Jesulayomy eaa85bb9c4 [PageSpeed]: Renamed to isCreate to follow convention, removed redundant loading states, Added validation on update submit 2025-07-10 15:21:27 -04:00
Alexander Holliday cc26601c06 Merge pull request #2590 from clipsmm/fix-add-missing-notification-service-name
[Fix] nit; Add missing notification service name
2025-07-10 09:22:04 -07:00
Cliff Mitamita 643d160748 nit; Add missing notification service name 2025-07-10 16:58:23 +03:00
Jesulayomy a71756a6ec [PageSpeed]: Added localized strings for frequecies, form error, lighthouse API. Removed configure prop and used monitorId check. 2025-07-09 15:47:01 -04:00
Jesulayomy db02f68095 Configure fix merged: Merge branch 'fe-monitor_config_pages' of https://github.com/Jesulayomy/Checkmate into fe-monitor_config_pages 2025-07-08 19:44:17 -04:00
Jesulayomy a0f3db812e [Refactor]: Renamed to Create/ and PageSpeedCreate for easier diff 2025-07-08 19:43:22 -04:00
Jesulayomi Michael Aina 8c393f848b [Fix]: Changed /setup/monitorId route that was used in development CRUMBS 2025-07-08 19:33:16 -04:00
Jesulayomy cf591a5a0b [Format]: npm format on client folder 2025-07-08 19:13:40 -04:00
Jesulayomy b45df68ece [PageSpeed]: Removed Create and Configure folders, Polished Setup folder to ensure consistency with manual testing 2025-07-08 18:49:26 -04:00
Alexander Holliday fdaaacc3af Merge pull request #2587 from bluewave-labs/fix/placeholder-center-align
fix: uptime placeholder size and merge with develop
2025-07-08 11:06:06 -07:00
Alex Holliday cb2016a5dc update queue version 2025-07-08 11:04:20 -07:00
Alex Holliday 9040a99853 Merge branch 'develop' into feat/super-simple-queue 2025-07-08 11:02:14 -07:00
karenvicent 94ac24289e fix: uptime placeholder size and merge with develop 2025-07-08 13:12:15 -04:00
Alex Holliday 1d816b0677 bump version 2025-07-07 16:14:51 -07:00
Alexander Holliday 9b413f25fb Merge pull request #2581 from bluewave-labs/feat/delete-notification-dialog
feat: add delete confirmation dialog to notificiaton page
2025-07-07 15:35:23 -07:00
Alex Holliday e08fba1b76 add delete confirmation dialog to notificiaton page 2025-07-07 15:34:45 -07:00
Alexander Holliday 961c398690 Merge pull request #2573 from luismsousa/feat/notifications-delete
Notification channel Delete:
2025-07-07 15:25:55 -07:00
Luis Sousa 9954a74dfd bleep boop fix translations 2025-07-07 20:08:34 +01:00
Alexander Holliday faf4164818 Merge pull request #2563 from bluewave-labs/fix/2471-infrastructure-action-menu
Fix/2471 infrastructure action menu
2025-07-07 11:05:52 -07:00
mohadeseh safari 9254b9096c refactor: Remove default string parameter from t() calls 2025-07-07 12:17:59 -04:00
mohadeseh safari aa8029a854 fix: Update InfrastructureMenu to use isActive instead of status for pause state 2025-07-07 12:16:17 -04:00
Alex Holliday c3f5d249a0 use latest library 2025-07-07 08:55:57 -07:00
mohadeseh safari 9edc6e4b27 Fix formating 2025-07-06 18:11:30 -04:00
mohadeseh safari d842f93a19 fix: Remove unnecessary local monitor state in InfrastructureMenu component 2025-07-06 18:09:17 -04:00
mohadeseh safari 0f82f076f7 Merge branch 'develop' into fix/2471-infrastructure-action-menu 2025-07-06 17:59:51 -04:00
Jesulayomy f00d7275e5 [PageSpeed]: Monitor Config and Create pages consolidated into Setup Component 2025-07-05 18:26:34 -04:00
Alexander Holliday 5fdf8431da Merge pull request #2557 from bluewave-labs/fix/placeholder-center-align
Fix/placeholder center align
2025-07-04 14:57:37 -07:00
karenvicent af0c69764f Fix: change height and witdth and Merge branch 'develop' into fix/placeholder-center-align 2025-07-04 17:46:41 -04:00
Jeffer Marcelino 4ed8d6b90c Merge branch 'develop' into feature/add-helm-chart 2025-07-04 19:21:22 +02:00
Alexander Holliday a88e304c5d Merge pull request #2574 from bluewave-labs/feat/fe/resolve-incidents
Feat: Resolve Incidents All and One
2025-07-04 09:58:19 -07:00
Br0wnHammer 847c7630ec Strings localizations 2025-07-04 22:24:59 +05:30
karenvicent 4aaa2faf9a Merge branch 'develop' into fix/placeholder-center-align 2025-07-04 11:15:43 -04:00
Luis Sousa 292c7fd7ea address PR feedback 2025-07-04 11:53:25 +01:00
Gorkem Cetin (BWL) 87263dc6d9 Add Pikapods 2025-07-03 22:17:21 -04:00
Br0wnHammer 8a4fba056b All Incidents Resolve Hook 2025-07-04 01:29:52 +05:30
Br0wnHammer 30131c97a3 Implemented resolve incident hook 2025-07-04 01:25:33 +05:30
Alexander Holliday b02a3379da Merge pull request #2534 from bluewave-labs/issue-2150-move-status-page-delete-button
Move Status Page Delete Button
2025-07-04 02:54:02 +08:00
Alexander Holliday 8f46da0907 Merge pull request #2570 from loma373/feat/if-no-notif
feat: disable send test notification when 0 notifications are configured
2025-07-04 02:24:04 +08:00
Jeffer Marcelino 6e5550ba32 docs: add INSTALLATION.md with Helm-based Kubernetes deployment steps 2025-07-03 18:16:42 +02:00
Jeffer Marcelino edd2346939 fix: change hardcoded protocol and host to be change_me by default 2025-07-03 18:06:54 +02:00
Luis Sousa d5262a1968 add i18n for the notifications dropdown menu in the list. 2025-07-02 23:18:34 +01:00
Luis Sousa d9cc0f82c1 add internationalization for button labels in notifications 2025-07-02 23:05:53 +01:00
Luis Sousa 34455e10e4 running npm run format 2025-07-02 22:32:08 +01:00
Br0wnHammer d9ccc72a38 Feat: Resolve Incidents All and One 2025-07-03 02:15:37 +05:30
Amol e2e1eff289 feat: add language localization and refactor to remove duplicate ternary op 2025-07-03 01:26:33 +05:30
Luis Sousa 85b13686a4 Notification channel Delete:
attempt to add the delete button to the notifications view
2025-07-02 17:14:39 +01:00
karenvicent c8bf571f7a implement adjustments and merge with develop 2025-07-02 10:02:01 -04:00
Alexander Holliday 731f2e12fb Merge pull request #2567 from bluewave-labs/feat/fe/incidents-ui
Feat: Status Boxes in Incidents Table
2025-07-02 15:26:51 +08:00
Br0wnHammer 3acfde97df Legacy UI Fixes 2025-07-02 12:51:27 +05:30
Amol 0e8a71c760 fix: removing code duplication 2025-07-01 22:57:28 +05:30
Amol 2e869310b8 feat: disable send test notification when 0 notification configured 2025-07-01 22:44:42 +05:30
Alexander Holliday f5cf8e25f5 Merge pull request #2566 from bluewave-labs/fix/missing-strings
fix: missing strings
2025-07-01 23:47:07 +08:00
Alexander Holliday 9c836ed39b Merge branch 'develop' into fix/missing-strings 2025-07-01 23:45:44 +08:00
Alexander Holliday 32b731f60e Merge pull request #2569 from bluewave-labs/revert-2568-fix/sort-keys
Revert "sort en.json alphabetically"
2025-07-01 23:42:44 +08:00
Alexander Holliday 708234118a Revert "sort en.json alphabetically" 2025-07-01 23:42:31 +08:00
Alexander Holliday 798b9aed8f Merge pull request #2568 from bluewave-labs/fix/sort-keys
sort en.json alphabetically
2025-07-01 23:36:25 +08:00
Alexander Holliday d55196e06f Merge branch 'develop' into fix/sort-keys 2025-07-01 23:36:17 +08:00
Alex Holliday 3d130bd8a5 sort en.json alphabetically 2025-07-01 23:35:11 +08:00
Br0wnHammer 278964500b Minor Changes 2025-07-01 18:23:11 +05:30
Br0wnHammer 644de5f34a Feat: Hooks for Summary 2025-07-01 18:10:35 +05:30
Br0wnHammer 5428999d46 Feat: Summary for Incidents 2025-07-01 17:55:50 +05:30
Br0wnHammer 35a9c081b5 Feat: Status Boxes in Incidents Page 2025-07-01 15:54:50 +05:30
Alex Holliday 3295423804 add settingsSave 2025-07-01 15:27:23 +08:00
Alex Holliday 19c5f4c8c3 update strings 2025-07-01 15:25:45 +08:00
Alex Holliday 6c4717d5f6 resolve strings 2025-07-01 15:23:00 +08:00
karenvicent 1cb730764a Merge branch 'develop' into fix/placeholder-center-align 2025-06-30 12:24:33 -04:00
mohadeseh safari 95403fb56b fix deletion props passed to Tabs component 2025-06-29 12:14:42 -04:00
Jeffer Marcelino 2b4727db0d feat: add checkmate helm chart with basic validation 2025-06-29 15:34:50 +02:00
mohadeseh safari 59c8c14e6c Merge remote-tracking branch 'origin/develop' into issue-2150-move-status-page-delete-button 2025-06-28 19:17:40 -04:00
mohadeseh safari fbbd9b9092 Format MonitorsTableMenu component 2025-06-28 19:09:27 -04:00
mohadeseh safari 1f804a725e Add comment explaining why monitor.type must remain optional in PropTypes 2025-06-28 19:05:21 -04:00
mohadeseh safari 5ba82415ad Format MonitorsTableMenu component 2025-06-28 18:50:14 -04:00
mohadeseh safari c44325ba7f Add missing translation keys for MonitorsTableMenu component 2025-06-28 18:46:17 -04:00
mohadeseh safari 78626253ee Merge develop branch into fix/2471-infrastructure-action-menu 2025-06-28 18:36:36 -04:00
mohadeseh safari 1a2009b615 Fix infrastructure action menu: correct pause/resume text display and handle undefined monitor properties 2025-06-28 17:41:13 -04:00
karenvicent eca4bb0cb5 Fix: center placeholder in content area and merge branch 'develop' into fix/placeholder-center-align 2025-06-27 10:29:28 -04:00
karenvicent 866b29db68 FIx: center placeholde box in the content area 2025-06-27 10:16:37 -04:00
Alex Holliday ce103c6b59 format 2025-06-27 13:51:39 +08:00
Alex Holliday 38f5c41272 implement flush 2025-06-27 13:45:18 +08:00
Alex Holliday ca13185d84 convert monitor to object 2025-06-27 13:40:41 +08:00
Alex Holliday f1c6beacf2 use super-simple-queue 2025-06-27 12:38:06 +08:00
Alexander Holliday 07b2ddc29e Merge pull request #2555 from shanikauwu1/fixed-alighment-issue-on-pagespeed-page-piechart
Fixed alighment issue on pagespeed page piechart
2025-06-27 08:53:48 +08:00
karenvicent 6db0aff073 fix: replace breakpoints with theme.spacing for consistent layout sizing 2025-06-26 14:37:35 -04:00
karenvicent 2bb76a1b2f Merge branch 'develop' into fix/placeholder-center-align 2025-06-26 09:20:48 -04:00
karenvicent e91e01adf3 fix: Hardcoded dimensions in layout constraints with format 2025-06-26 09:18:49 -04:00
shanika Jayawardane c5870b96d5 Fix PageSpeed performance report alignment - Center pie chart and text 2025-06-25 23:19:29 -06:00
Alexander Holliday e772a35243 Merge pull request #2553 from bluewave-labs/hotfix/status-page
apply hotfix for logo
2025-06-26 11:47:16 +08:00
Alex Holliday 6047163150 apply hotfix for logo 2025-06-26 11:46:50 +08:00
Alexander Holliday 4c5bb66c3d Merge pull request #2496 from bluewave-labs/feat/incidents-clear
Feat: Incidents Resolve BE
2025-06-26 09:34:10 +08:00
Alex Holliday d9dbfc6d6e hide resolved 2025-06-26 09:33:39 +08:00
Alexander Holliday b462968650 Merge pull request #2552 from bluewave-labs/fix/action
update msg
2025-06-26 09:26:10 +08:00
Alex Holliday 2c553ae1d2 update msg 2025-06-26 09:25:37 +08:00
Alexander Holliday e04ba2d163 Merge pull request #2547 from deepanshu2711/2543-hide-pause-button-for-members
fix: hide pause button for members (closes #2543)
2025-06-26 09:20:34 +08:00
Alexander Holliday a30417ab42 Merge pull request #2551 from bluewave-labs/hotfix/notification-action-menu
hotfix: stop propagation
2025-06-26 09:15:00 +08:00
Alex Holliday 83373d0520 stop propagation 2025-06-26 09:14:18 +08:00
Alexander Holliday b59cad5389 Merge pull request #2550 from bluewave-labs/hotfix/status-page-with-no-monitors
hotfix: status page
2025-06-26 09:11:35 +08:00
Alex Holliday 58b102b921 fix status page 2025-06-26 09:09:41 +08:00
karenvicent 32edb64da4 fix: Hardcoded dimensions in layout constraints 2025-06-25 20:39:34 -04:00
karenvicent eecdb7e552 fix: center and constrain empty placeholder layout with format 2025-06-25 18:27:37 -04:00
karenvicent fd51af97fa fix: center and constrain empty placeholder layout 2025-06-25 18:06:43 -04:00
Br0wnHammer e5028c95b3 Conflicts in en.json 2025-06-25 14:26:11 +05:30
Aryaman Sharma 5d20cf26ab Merge branch 'develop' into feat/incidents-clear 2025-06-25 14:20:15 +05:30
Br0wnHammer 6457984dd4 ackStage Backword Compatible 2025-06-25 14:16:00 +05:30
Deepanshu 8749edfaf0 fix: hide pause button for members (closes #2543) 2025-06-25 12:52:06 +05:30
Br0wnHammer 78a2e5d106 VerifyTemAccess Middleware 2025-06-25 11:52:38 +05:30
shanika Jayawardane 6ec6d582d8 Merge remote-tracking branch 'upstream/develop' into develop 2025-06-24 23:37:16 -06:00
Alexander Holliday 6a079704bb Merge pull request #2544 from bluewave-labs/fix/logs-rights
fix: logs access
2025-06-25 12:41:44 +08:00
Alexander Holliday 65eb22bbe0 Merge branch 'develop' into fix/logs-rights 2025-06-25 12:41:30 +08:00
Alex Holliday 549044f973 fix sidebar logs 2025-06-25 12:38:57 +08:00
Alexander Holliday df56799ab9 Merge pull request #2542 from bluewave-labs/fix/process-env
fix: use process.env
2025-06-25 12:17:47 +08:00
Alex Holliday ba8011a22e use process.env 2025-06-25 12:17:16 +08:00
Alexander Holliday 1a69af6360 Merge pull request #2541 from bluewave-labs/fix/fetch-depth
fix: fetch depth
2025-06-25 12:07:58 +08:00
Alex Holliday b718c02787 update workflows 2025-06-25 12:07:31 +08:00
Alex Holliday 4fa0e08574 update workflows 2025-06-25 12:07:12 +08:00
Alexander Holliday 9681730263 Merge pull request #2540 from bluewave-labs/fix/mongo-4.4-compatibility
version fix
2025-06-25 11:57:09 +08:00
Alex Holliday b03f951352 version fix 2025-06-25 11:56:04 +08:00
Alexander Holliday 34b56bcadc Merge pull request #2539 from bluewave-labs/fix/mongo-4.4-compatibility
fix: donwgrade mongo functions
2025-06-25 11:40:30 +08:00
Alex Holliday 8606b5e5de donwgrade mongo functoins 2025-06-25 11:39:05 +08:00
Alexander Holliday 6c7fefe4ed Merge pull request #2538 from bluewave-labs/translation-update-74
🌐 Updated Translations from POEditor
2025-06-25 10:44:55 +08:00
GitHub Action 9bb5362c5f feat: translations updated from POEditor 2025-06-25 02:44:18 +00:00
Alexander Holliday a84f30c36d Merge pull request #2535 from bluewave-labs/fix/invite-email
fix: verify transport before sending email
2025-06-25 09:36:00 +08:00
Alex Holliday 4cc3765e0d verify transport before sending email 2025-06-25 09:35:41 +08:00
Alex Holliday 915d2e06ae verify transport before sending email 2025-06-25 09:34:07 +08:00
Alex Holliday 95b832c1c6 Merge branch 'develop' into feat/incidents-clear 2025-06-25 09:03:00 +08:00
Alexander Holliday 1e0ddb248c Merge pull request #2533 from bluewave-labs/feat/version
feat: extract version from git tag
2025-06-25 08:51:56 +08:00
Alexander Holliday 635717ec92 Merge pull request #2531 from bluewave-labs/fix/settings-page-strings
fix: settings page strings
2025-06-25 08:51:39 +08:00
Alexander Holliday db285d1867 Merge pull request #2530 from bluewave-labs/feat/on-user-delete-cascade
feat: cascade on superuser delete
2025-06-25 08:50:45 +08:00
mohadeseh safari 00ebc4c270 translation fix 2025-06-24 16:29:13 -04:00
mohadeseh safari d1b3d14457 Format code with prettier 2025-06-24 16:02:41 -04:00
mohadeseh safari 6cd52cb31d Merge develop into issue-2150-move-status-page-delete-button 2025-06-24 15:50:34 -04:00
mohadeseh safari 310084a902 translation fix 2025-06-24 15:30:52 -04:00
mohadeseh safari 1b8c6167b7 Add localization for status page creation and update messages 2025-06-24 15:16:24 -04:00
mohadeseh safari e371596d15 Fix status page deletion network requests and implement optimistic UI update pattern 2025-06-24 15:07:37 -04:00
Br0wnHammer 183c13fe53 Naming Changes in BE 2025-06-24 14:44:02 +05:30
Alex Holliday 8d6078e2c1 safely extract version 2025-06-24 16:31:18 +08:00
Alex Holliday 4f17e84247 extract version from git tag 2025-06-24 15:40:50 +08:00
Alex Holliday 563cc8d03d fix label 2025-06-24 14:45:04 +08:00
Alex Holliday 09b5261ba2 Merge branch 'develop' into fix/settings-page-strings 2025-06-24 14:42:39 +08:00
Alexander Holliday ff9a7c33eb Merge pull request #2532 from bluewave-labs/fix/sort
sort json
2025-06-24 14:38:03 +08:00
Alex Holliday 08b9cc16fc sort json 2025-06-24 14:37:16 +08:00
Alexander Holliday 27c1e9f1da Merge pull request #2518 from tamirazrab/refactor/2511-remove-useless-string
chore: remove unnecessary string
2025-06-24 14:34:53 +08:00
Alexander Holliday 8d0cd1dc05 Merge pull request #2522 from bluewave-labs/feat/uptime-empty-view
feat: add stat boxes and timeframe header
2025-06-24 14:34:25 +08:00
Alex Holliday 0d01a08304 sort 2025-06-24 14:32:28 +08:00
Alex Holliday 4d91377259 fix settings page strings 2025-06-24 14:30:14 +08:00
Tamir Azrab fe25a5d170 chore: remove keys entirely 2025-06-24 10:44:35 +05:00
Alex Holliday c16d5c4246 early return if user not found 2025-06-24 13:25:10 +08:00
Alex Holliday 40f4294cae cascade on superuser delete 2025-06-24 12:07:02 +08:00
Alexander Holliday 1cc9f4e4d9 Merge pull request #2529 from bluewave-labs/hotfix/delete-user
hotfix: delete user
2025-06-24 11:46:51 +08:00
Alex Holliday b282ff9883 fix delete user 2025-06-24 11:45:51 +08:00
Alexander Holliday 06d35e1626 Merge pull request #2528 from bluewave-labs/hotfix/logger
hotfix: add missing contenxt
2025-06-24 11:19:23 +08:00
Alex Holliday d184f3fd38 add missing contenxt 2025-06-24 11:18:13 +08:00
Alexander Holliday 3d67cfaacd Merge pull request #2527 from bluewave-labs/hotfix/logger
add missing  context
2025-06-24 11:15:48 +08:00
Alex Holliday 2ee2d9b905 add missing context 2025-06-24 11:15:14 +08:00
Alexander Holliday 2df8bc14dd Merge pull request #2526 from bluewave-labs/feat/update-docker-compose
feat: update docker compose
2025-06-24 11:13:58 +08:00
Alex Holliday 2cb40b3885 update docker ignore 2025-06-24 11:12:44 +08:00
Alex Holliday 536c27cb30 update docker compose files 2025-06-24 10:59:01 +08:00
Alexander Holliday 1df36a66b9 Merge pull request #2525 from bluewave-labs/fix/temporary-comment-out-import-export
fix: temporarliy comment out import/export
2025-06-24 10:52:48 +08:00
Alex Holliday 1ebb6b922b temporarliy comment out import/export 2025-06-24 10:52:19 +08:00
Alexander Holliday dc7cc431d2 Merge pull request #2524 from bluewave-labs/fix/i18n
fix: translations ignore empty strings
2025-06-24 10:45:33 +08:00
Alex Holliday b9a8328a48 ignore empty strings 2025-06-24 10:44:16 +08:00
Alexander Holliday 5e14c15b92 Merge pull request #2523 from bluewave-labs/fix/bg-color
fix: update bg color
2025-06-24 10:29:02 +08:00
Alex Holliday 3bcf3b1ed0 update bg color 2025-06-24 10:28:25 +08:00
Alex Holliday e7429ecd67 add stat boxes and timeframe header 2025-06-24 10:18:25 +08:00
Alexander Holliday 0c94472062 Merge pull request #2520 from bluewave-labs/fix/prod-docker-compose
fix: add entrypoint to prod certbot
2025-06-24 10:09:52 +08:00
Alex Holliday dbf9f86105 add entrypoint to prod certbot 2025-06-24 10:09:07 +08:00
Alexander Holliday dfee81f5b0 Merge pull request #2517 from bluewave-labs/feat/team-access-middleware
feat: add middleware for verifying team access
2025-06-24 10:03:00 +08:00
Alex Holliday 40f879f671 user and teamId check 2025-06-24 10:02:36 +08:00
Alex Holliday c8685c4273 remove console 2025-06-24 10:00:41 +08:00
Alexander Holliday 2b9fbf743a Merge pull request #2519 from Giridhar88/feature/maintenance-window-click
Add maintenance row click feature to edit the maintenance window
2025-06-24 09:11:05 +08:00
Br0wnHammer 30d85e5712 Ack Field in Checks 2025-06-23 22:07:03 +05:30
giridhar88 ac9ff86e68 Add maintenance row click feature to edit the maintenance window 2025-06-23 19:01:03 +05:30
Alexander Holliday b6680be345 Merge pull request #2513 from bluewave-labs/feat/queue-page-update
feat: move queue to logs page
2025-06-23 20:10:46 +08:00
Alex Holliday 7839e4c197 correct logging 2025-06-23 20:10:10 +08:00
Alexander Holliday daa57ed948 Merge pull request #2509 from bluewave-labs/feat/email-settings-transport-display
feat: display transport settings
2025-06-23 19:05:16 +08:00
Tamir Azrab 41137c09b2 chore: remove unnecessary string 2025-06-23 15:52:34 +05:00
Alex Holliday 05add10ba8 add middleware for verifying team access 2025-06-23 15:45:24 +08:00
Alex Holliday bf73a71523 remove duplicate user 2025-06-23 14:48:45 +08:00
Alexander Holliday 91ab821090 Merge pull request #2506 from JefferMarcelino/feature/hide-admin-login-link
Add toggle to optionally display admin login link on status page and fix syntax errors
2025-06-23 13:25:43 +08:00
Alex Holliday 32688ba320 add missing stack 2025-06-23 13:22:53 +08:00
Alexander Holliday 288c6f88a3 Merge pull request #2515 from bluewave-labs/feat/logs
feat: logs
2025-06-23 13:19:52 +08:00
Alex Holliday 0336170c8d refactor 2025-06-23 13:19:18 +08:00
Alex Holliday 03ced27d30 Merge branch 'develop' into feat/queue-page-update 2025-06-23 13:15:14 +08:00
Alexander Holliday 8e4bb89974 Merge pull request #2516 from bluewave-labs/fix/light-mode-bg
fix: don't render bg svg on light mode
2025-06-23 12:35:31 +08:00
Alex Holliday 35aa5162ca don't render bg svg on light mode 2025-06-23 12:34:30 +08:00
Alex Holliday 92c2b2d6c1 remove unused import 2025-06-23 12:26:35 +08:00
Alex Holliday 5758a84e13 fix tab order 2025-06-23 12:21:27 +08:00
Alex Holliday 176f576979 change page order 2025-06-23 12:20:33 +08:00
Alex Holliday 9d18d55bbf increase log cache size 2025-06-23 12:19:52 +08:00
Alex Holliday 961d827a52 add a description 2025-06-23 12:19:40 +08:00
Alex Holliday 365ae08123 FE log component implementation 2025-06-23 12:09:30 +08:00
Alex Holliday 0b6febbb82 add log cache, routes, and controller 2025-06-23 11:25:42 +08:00
Alexander Holliday 6913bd0179 Merge pull request #2514 from bluewave-labs/translation-update-73
🌐 Updated Translations from POEditor
2025-06-23 11:14:12 +08:00
GitHub Action c607581767 feat: translations updated from POEditor 2025-06-23 03:11:03 +00:00
Alex Holliday 34485a0cae move queue to logs 2025-06-23 11:07:12 +08:00
Alexander Holliday 05e2bbd211 Merge pull request #2508 from bluewave-labs/fix/update-prod-docker-compose
remove redis from production docker copose
2025-06-23 10:06:24 +08:00
Alex Holliday 766c073ec4 localisation 2025-06-23 10:05:06 +08:00
Alex Holliday 3faa6194f3 display transport settings 2025-06-23 10:02:06 +08:00
Alex Holliday ddf9673a35 remove redis from production docker copose 2025-06-23 09:24:33 +08:00
Jeffer Marcelino 5fcf8ce7ba chore: format 2025-06-23 02:58:51 +02:00
Alexander Holliday d10341ac2f Merge pull request #2489 from Owaiseimdad/network-page-BE-part-1
Code for network db settings
2025-06-23 08:52:08 +08:00
Alexander Holliday 2161ef4388 Merge pull request #2492 from bluewave-labs/fix/notifications-loading-state
fix: button loading state
2025-06-23 08:49:15 +08:00
Alexander Holliday 7870e83586 Merge branch 'develop' into feature/hide-admin-login-link 2025-06-23 08:45:37 +08:00
Alexander Holliday 230753320a Merge pull request #2504 from Sky-walkerX/refactor/email-settings-toggle
refactor(settings): moved email settings toggle buttons to end of line and renamed the wordings
2025-06-23 08:43:38 +08:00
Jeffer Marcelino 465bdd2945 chore: format 2025-06-22 18:33:58 +02:00
Jeffer Marcelino 4a36bd3157 feat: add toggle to show/hide “Administrator? Login Here” link in status page settings 2025-06-22 18:28:17 +02:00
Jeffer Marcelino e6fd57d0bb feat: optionally hide the "Administrator? Login Here" on status page 2025-06-22 18:27:56 +02:00
Jeffer Marcelino 7c5516cd75 feat(api): add backend support for toggling admin login link visibility on status page 2025-06-22 18:26:20 +02:00
Jeffer Marcelino 31321749b2 fix: syntax errors in NetworkService.js and en.json causing build failure 2025-06-22 17:11:01 +02:00
Sky-walkerX 50e9a6b967 chore: formatted NetworkService 2025-06-22 19:40:42 +05:30
Sky-walkerX 3a6d3071be chore: format 2025-06-22 17:39:42 +05:30
Sky-walkerX 9972c3cf9a refactor(settings): changed wordings of email settings 2025-06-22 17:35:45 +05:30
Sky-walkerX f853a03491 refactor(settings): email settings toggle in one row 2025-06-22 17:17:26 +05:30
Alexander Holliday c98b901902 Merge pull request #2495 from bluewave-labs/feat/dev-settings
feat: dev settings
2025-06-21 18:00:34 +08:00
Alexander Holliday b77f05709b Merge branch 'develop' into feat/dev-settings 2025-06-21 18:00:23 +08:00
Alexander Holliday 28157c0b55 Merge pull request #2475 from Owaiseimdad/Bulk-export-uptime-monitors
Addition of export.
2025-06-21 17:57:42 +08:00
Alex Holliday f3072e0447 add missing columns 2025-06-21 16:20:31 +08:00
Alex Holliday 105353c9f6 add factory utils for creating header function 2025-06-21 16:15:34 +08:00
Alexander Holliday 40117f777e Merge pull request #2502 from bluewave-labs/fix/missing-password-error-translation
Fix Missing Password Error Translation
2025-06-21 15:29:33 +08:00
mohadeseh safari 2523d73625 Format code with prettier 2025-06-20 20:58:36 -04:00
mohadeseh safari 74cef5adb1 Fix #2471: Add Details, Configure, and Pause options to infrastructure action menu 2025-06-20 20:39:18 -04:00
mohadeseh safari 452d1a2ad5 Fix missing password error translation for auth.common.fields.password.errors.incorrect 2025-06-20 19:58:11 -04:00
mohadeseh safari a29282801a Format code for PR submission (#2150) 2025-06-20 19:06:57 -04:00
mohadeseh safari fc1f4fc142 Modify 2025-06-20 18:59:50 -04:00
mohadeseh safari 2b017490a3 Move status page delete button to configuration page header (#2150) 2025-06-20 18:56:39 -04:00
Owaise Imdad ecb1ca4517 Missed to add a line in jsdoc. 2025-06-21 00:25:57 +05:30
Owaise Imdad ba00e9afff Added JSDocs in module file. 2025-06-21 00:25:30 +05:30
Owaise Imdad 9700551f41 Removal of n count of document. 2025-06-21 00:18:09 +05:30
ThetaOI 24cb4c70a7 Merge branch 'bluewave-labs:develop' into network-page-BE-part-1 2025-06-21 00:09:51 +05:30
Owaise Imdad 75ed049b01 Resolved teh conflict in en.json file. 2025-06-21 00:06:09 +05:30
Br0wnHammer faa2a2d965 Fixes in the controllers 2025-06-20 20:42:57 +05:30
Br0wnHammer a9c1d131a5 Route Update All Monitor/Team Checks 2025-06-20 16:11:22 +05:30
Br0wnHammer e8908351a2 Route for Updating a single Incident Status 2025-06-20 15:39:13 +05:30
Alex Holliday 3351115e3c fix props 2025-06-20 14:47:19 +08:00
Alex Holliday 2b279af093 localization 2025-06-20 14:30:17 +08:00
Alex Holliday a7f795795f add route 2025-06-20 14:29:36 +08:00
Alex Holliday 85a996635f add controller method for getting all metrics 2025-06-20 14:29:27 +08:00
Alex Holliday 92d4e9ea12 Add additional metrics 2025-06-20 14:29:08 +08:00
Alex Holliday c23e941ece Add queue hooks 2025-06-20 14:28:43 +08:00
Alex Holliday c804f8b873 add routes and localisation 2025-06-20 14:28:33 +08:00
Alex Holliday 6c51fc91b4 add dev settings 2025-06-20 14:28:20 +08:00
Alex Holliday e610acb9c7 Add Queue page and components 2025-06-20 14:27:50 +08:00
Alex Holliday d8573be7ac add util methods 2025-06-20 14:27:22 +08:00
Alex Holliday 0a0c84b7f4 update link component to allow for internal links 2025-06-20 14:26:59 +08:00
Alex Holliday 61a66644da disable job on addition if monitor is paused 2025-06-20 10:58:29 +08:00
Alex Holliday 1187f9d4cc add fix button loading state 2025-06-20 10:08:13 +08:00
Alexander Holliday 906a76c545 Merge pull request #2491 from bluewave-labs/refactor/notification-service
refactor: notification service, resolves #2467, resolves #2468
2025-06-20 09:04:01 +08:00
Br0wnHammer 205e16a96d Resolved Filter in FE 2025-06-20 02:54:09 +05:30
Owaise Imdad 4cf3804898 Formatting issues. 2025-06-19 22:45:04 +05:30
Owaise Imdad 223203737f Logging error only once as middleware takes care of it. 2025-06-19 22:42:07 +05:30
ThetaOI 5675990504 Merge branch 'bluewave-labs:develop' into network-page-BE-part-1 2025-06-19 22:36:57 +05:30
Owaise Imdad 9f88fbbcf2 Formatting issues. 2025-06-19 22:32:53 +05:30
Owaise Imdad c70b5b0ae8 Resolving merge issues. 2025-06-19 22:30:50 +05:30
Owaise Imdad a1c11fbb3c Added a new method for file download and correct csv is getting added. 2025-06-19 22:23:10 +05:30
Alex Holliday 2b48a72f35 formatting 2025-06-19 12:17:00 +08:00
Alex Holliday 48b25e0838 refactor notification service 2025-06-19 12:12:55 +08:00
Alex Holliday 1b4b66e36d inject notification utils 2025-06-19 12:12:34 +08:00
Alex Holliday 30a7de5333 remove unused import 2025-06-19 12:12:09 +08:00
Alex Holliday d4b8eebd64 cleanup 2025-06-19 12:11:43 +08:00
Alex Holliday 8ea2053d37 add a utils file for notifications 2025-06-19 12:11:11 +08:00
Alex Holliday 68aa9a6b2d remove unused route 2025-06-19 12:10:44 +08:00
Alex Holliday dbbe008e23 remove unused controller methods 2025-06-19 12:10:29 +08:00
Alex Holliday 7e5521eb13 Move thresholds from Notification to Monitor 2025-06-19 12:10:07 +08:00
Alex Holliday f9e0930336 Merge branch 'develop' into refactor/notification-service 2025-06-19 10:34:14 +08:00
Alexander Holliday dfbc3ed728 Merge pull request #2486 from bluewave-labs/refactor/build-and-send-email
refactor: build and send
2025-06-19 10:33:37 +08:00
Alex Holliday 7ed92427a3 fix error handling 2025-06-19 10:33:00 +08:00
Alexander Holliday 2df1dc1721 Merge pull request #2469 from bluewave-labs/refactor/useFetchChecks
Refactor: useFetchChecks
2025-06-19 09:51:26 +08:00
Alexander Holliday 9a88523ea5 Merge pull request #2481 from virendra-jadhav/feat/bulk-select-status-page-servers
Add bulk selection for status page servers
2025-06-19 09:48:26 +08:00
Alex Holliday 196757d36f inject logger 2025-06-19 09:44:24 +08:00
Alexander Holliday 28718680fa Merge pull request #2473 from deepanshu2711/fix/floating-strings-2470
fix(ui): shorten URL label and resize notification button (#2470)
2025-06-19 07:23:25 +08:00
Owaise Imdad 8fe3ed9bd1 Added formating. 2025-06-18 23:30:39 +05:30
Owaise Imdad 0f298d6450 Code for network db settings. 2025-06-18 23:23:24 +05:30
unknown 8d93d80e1e resolve merge conflit for bulk selection for status page servers 2025-06-18 22:32:14 +05:30
Owaise Imdad e6b9b5df3c Translation and localisation. 2025-06-18 22:31:48 +05:30
unknown 711cd6cd44 resolve merge conflit for bulk selection for status page servers 2025-06-18 22:29:13 +05:30
Owaise Imdad 81d830d99e Miss with respect to blob type. 2025-06-18 22:24:43 +05:30
Virendra Jadhav b041c9014f Merge branch 'develop' into feat/bulk-select-status-page-servers 2025-06-18 22:07:49 +05:30
myusername 3cacda687c fix more changes for bulk selection on status page server 2025-06-18 19:05:04 +05:30
Alex Holliday 7bca60269c update schema and validation 2025-06-18 14:42:59 +08:00
Alex Holliday bb921690bf Update validation 2025-06-18 14:42:39 +08:00
Alex Holliday 440ce8a12b simplify creatign notifications 2025-06-18 14:42:26 +08:00
Alex Holliday a86bc59e09 remove unsued params from hook 2025-06-18 14:42:00 +08:00
Br0wnHammer a091bf23b7 isLoading Check 2025-06-18 11:32:33 +05:30
Br0wnHammer acd5dc982e Fix: Type Check in useFetchChecksMonitor 2025-06-18 11:13:42 +05:30
Deepanshu 6b3773ed76 chore: remove URL_TRUNCATE_LENGTH from component 2025-06-18 11:09:23 +05:30
Alex Holliday 29cfc4fb41 Merge branch 'develop' into refactor/notification-service 2025-06-18 13:30:24 +08:00
Alexander Holliday 30e95b431c Merge pull request #2488 from bluewave-labs/hotfix/fetch-settings
fix: add empty functions
2025-06-18 13:20:56 +08:00
Alex Holliday cb4fda937f add empty functions 2025-06-18 13:20:08 +08:00
Alexander Holliday 728e337722 Merge pull request #2487 from bluewave-labs/hotfix/react-router
hotfix: react router import
2025-06-18 10:55:07 +08:00
Alex Holliday d558cdd49f fix react router import 2025-06-18 10:52:11 +08:00
Alex Holliday 47131633d0 refactor build and send 2025-06-18 10:44:59 +08:00
Alexander Holliday 85e81184e5 Merge pull request #2485 from bluewave-labs/hotfix/radio
hotfix: add name prop to radio component
2025-06-18 10:10:57 +08:00
Alex Holliday c78f43e32e add name prop to radio component 2025-06-18 10:10:14 +08:00
Alexander Holliday 79b5a33874 Merge pull request #2484 from bluewave-labs/hotfix/ping-monitoring
hotfix: ping monitoring
2025-06-18 10:06:18 +08:00
Alex Holliday 76a5a79482 fix ping monitoring 2025-06-18 10:05:04 +08:00
Alexander Holliday f45736e318 Merge pull request #2483 from hackr-sh/fix/first-name-last-name-additional-special-chars
fix: name validation now takes into account additional special chars
2025-06-18 09:55:39 +08:00
Alexander Holliday 8d30de1ff8 Merge pull request #2480 from bluewave-labs/fix/time-format
fix: update time format function, resolves #2477
2025-06-18 09:44:20 +08:00
Alexander Holliday 68f1895cda Merge pull request #2478 from bluewave-labs/feat/handle-api-and-password-input
feat: handle api and password input, resolves #2385
2025-06-18 09:43:59 +08:00
Alex Holliday fc2676c33e deal with redux before validation 2025-06-18 09:43:41 +08:00
Mohammad Al-Ahdal c9359cc4e1 implement server-validation wording feedback 2025-06-17 18:40:51 -06:00
Mohammad Al-Ahdal b5752024e7 fix: name validation now takes into account additional special chars 2025-06-17 18:29:09 -06:00
Gorkem Cetin (BWL) df4f55b410 Update README.md 2025-06-17 19:38:08 -04:00
Owaise Imdad e71e2ef42c Addressed all the comments in pr. 2025-06-18 01:07:22 +05:30
Gorkem Cetin (BWL) 1e5c8612b8 Sponsor a feature link added 2025-06-17 14:59:38 -04:00
Deepanshu 75309fc53c chore: add URL_TRUNCATE_LENGTH 2025-06-17 17:36:06 +05:30
Deepanshu e3b6ed27ba chore: remove nowrap as already exists in monitorUrl varient 2025-06-17 17:33:21 +05:30
Deepanshu f474d63e88 chore: extract monitor URL formatting to utils 2025-06-17 17:30:11 +05:30
Br0wnHammer 287ea3e5a6 Updated params 2025-06-17 13:27:51 +05:30
Br0wnHammer bcf883223b Exporting Hooks from One File 2025-06-17 13:13:21 +05:30
Alex Holliday 9c40021318 return time string 2025-06-17 13:41:25 +08:00
Deepanshu e818f1cd61 chore: fix formatting 2025-06-17 10:57:30 +05:30
unknown 34ca3a65d6 Add bulk selection for status page servers 2025-06-17 10:13:58 +05:30
Alex Holliday 1298b23844 update time format function 2025-06-17 11:32:35 +08:00
Alexander Holliday f15cef4916 Merge pull request #2479 from bluewave-labs/translation-update-72
🌐 Updated Translations from POEditor
2025-06-17 11:17:04 +08:00
GitHub Action 64e4a3278a feat: translations updated from POEditor 2025-06-17 03:15:12 +00:00
Alex Holliday 791c62b583 remove console log 2025-06-17 11:13:37 +08:00
Alex Holliday 456798ca15 move state to parent 2025-06-17 10:58:41 +08:00
Alex Holliday 7d333c6d93 return updated settings 2025-06-17 10:58:30 +08:00
Alexander Holliday 7c275db662 Merge pull request #2466 from bluewave-labs/fix/hardware-notifications
fix: hardware notifications
2025-06-17 09:27:34 +08:00
Alexander Holliday c1004fc37a Merge pull request #2458 from bluewave-labs/feat/discord-notification-channel
feat: discord notification channel
2025-06-17 09:21:36 +08:00
Owaise Imdad 11212c7371 Formatting was done. 2025-06-17 00:17:46 +05:30
Owaise Imdad e9e509ab04 Addition of export. 2025-06-17 00:11:33 +05:30
Deepanshu df42932e0c fix(ui): shorten URL label and resize notification button (#2470) 2025-06-16 20:40:19 +05:30
Gorkem Cetin (BWL) 36d8e8c0cf Better screnshots 2025-06-16 09:46:50 -04:00
Gorkem Cetin (BWL) 75eb9f8560 Add ToC 2025-06-16 09:43:59 -04:00
Br0wnHammer c981b25ef9 Hooks integration in Incidents Table 2025-06-16 13:51:15 +05:30
Br0wnHammer 638fcb3b9b Incidents useFetchChecksMonitor Integration 2025-06-16 13:08:39 +05:30
Br0wnHammer 37406484fc useFetchChecksTeam Hook 2025-06-16 13:00:23 +05:30
Br0wnHammer bebbe5896d Uptime useFetchChecksByMonitor Integration 2025-06-16 12:57:00 +05:30
Br0wnHammer f47d3c2cd6 Feat: useFetchChecksByMonitor 2025-06-16 12:56:08 +05:30
Alex Holliday 3df6b451e7 fix hardware notifications 2025-06-16 13:53:08 +08:00
Alex Holliday 4fd2a29ab3 fix email type 2025-06-16 13:30:27 +08:00
Alexander Holliday a3b22d9056 Merge pull request #2465 from bluewave-labs/fix/send-test-notifications
fix: send test notifications
2025-06-16 13:28:27 +08:00
Alex Holliday ca4da6d485 add testAll 2025-06-16 12:17:43 +08:00
Alex Holliday 959f265617 add route 2025-06-16 12:17:22 +08:00
Alex Holliday 3cdc21f1be add controller method 2025-06-16 12:16:52 +08:00
Alex Holliday bc3801edc0 add strings' 2025-06-16 12:16:08 +08:00
Alex Holliday 13741d0f0a add test all notifications method 2025-06-16 12:15:54 +08:00
Alex Holliday 9bba8440ca update monitor details header 2025-06-16 12:15:29 +08:00
Alex Holliday 6f133ed7a0 add test all hook 2025-06-16 12:15:07 +08:00
Alexander Holliday 55ea81c46a Merge pull request #2464 from bluewave-labs/fix/cleanup
fix: cleanup
2025-06-16 11:36:52 +08:00
Alexander Holliday 37443823b8 Merge pull request #2463 from bluewave-labs/fix/incidents
fix: load monitor from params if present
2025-06-16 11:35:40 +08:00
Alexander Holliday 7c76125a0a Merge pull request #2462 from bluewave-labs/fix/infrastructure-header
fix: add universal header to infra details
2025-06-16 11:35:20 +08:00
Alexander Holliday dd16c3e8fe Merge pull request #2461 from bluewave-labs/fix/pagespeed-header
fix: pagespeed header
2025-06-16 11:35:04 +08:00
Alex Holliday 30a610511c remove unused component/imports 2025-06-16 11:34:41 +08:00
Alex Holliday e173269acd remove unused depedencies 2025-06-16 11:34:25 +08:00
Alex Holliday 3235bf68e4 Merge branch 'fix/incidents' into fix/cleanup 2025-06-16 11:24:36 +08:00
Alex Holliday 6cbc6546ac Merge branch 'fix/infrastructure-header' into fix/cleanup 2025-06-16 11:24:28 +08:00
Alex Holliday 1490e9171d load monitor from params if present 2025-06-16 11:21:28 +08:00
Alex Holliday f30529e8a2 add universal header to infra details 2025-06-16 11:17:09 +08:00
Alex Holliday 90a5fe946a add update trigger prop 2025-06-16 11:13:45 +08:00
Alex Holliday 1a198c28ee use universal details header in PageSpeed page 2025-06-16 11:13:28 +08:00
Alexander Holliday c90fb9dd08 Merge pull request #2460 from bluewave-labs/hotfix/uptime-config
hotfix: uptime config
2025-06-16 10:45:52 +08:00
Alex Holliday 9de6b4e2bc fix uptime config 2025-06-16 10:45:13 +08:00
Alex Holliday bea23a94bb handle discord webhooks 2025-06-16 10:38:05 +08:00
Alex Holliday 5aae164865 extrat userId and teamId from req.uesr 2025-06-16 10:37:04 +08:00
Alex Holliday bfae00b69b add strings 2025-06-16 10:36:45 +08:00
Alex Holliday 22f8a37f1f add discord type 2025-06-16 10:36:34 +08:00
Alex Holliday f6be4317cd remove user and teamid from validation 2025-06-16 10:36:20 +08:00
Alexander Holliday 1aeb4472bc Merge pull request #2457 from bluewave-labs/hotfix/rows-per-page
hotfix: safe rowsPerPage access
2025-06-16 09:45:27 +08:00
Alex Holliday 20e32fad04 safe rowsPerPage access 2025-06-16 09:44:21 +08:00
Alexander Holliday cb35dc591c Merge pull request #2450 from loma373/feat/search-infra-moniters
feat: add search functionality to infrastructure monitor
2025-06-15 20:44:55 +08:00
Amol 738925d5ec fix: remove shouldRender prop as it is now managed by isLoading 2025-06-15 15:29:48 +05:30
Alexander Holliday b229720431 Merge pull request #2455 from bluewave-labs/feat/image-tags
fix: change workflow names
2025-06-15 17:36:02 +08:00
Alexander Holliday beffce8823 Merge pull request #2453 from Kaotic3/feature/persist-rows-setting
Feature/persist rows setting
2025-06-15 17:12:21 +08:00
Alexander Holliday 1607aba78f Merge pull request #2427 from bluewave-labs/feat/test-email
Feat: New Email Options
2025-06-15 17:11:12 +08:00
Amol Vyas 87ccc93ff9 Merge branch 'develop' into feat/search-infra-moniters 2025-06-15 03:39:10 +05:30
Amol 91741c2ae5 fix: removing unused code blocks and better handling for filter param 2025-06-15 03:17:22 +05:30
Amol e366741aa9 fix: updating code to the coding standards & changing the search param 2025-06-14 23:49:39 +05:30
Steven Kennedy b105626f0b Persist rowsPerPage setting in local storage 2025-06-14 17:40:46 +01:00
Kaotic3 a37505b095 Merge pull request #1 from Kaotic3/codex/persist-rowsperpage-setting
Persist infrastructure rows per page
2025-06-14 17:16:26 +01:00
Kaotic3 216e53166d Persist infrastructure monitors rows per page 2025-06-14 17:13:55 +01:00
Amol 800fd4792d fix: running formatting script on both client and server directories 2025-06-14 16:23:05 +05:30
Amol 7189c19d55 feat: add search functionality to infrastructure moniter 2025-06-14 16:16:49 +05:30
Br0wnHammer 91694ff072 Password Validation Check 2025-06-14 11:01:47 +05:30
Alexander Holliday fcffb93a60 Merge pull request #2449 from bluewave-labs/fix/status-page-on-monitor-delete
fix/status page on monitor delete
2025-06-14 11:41:41 +08:00
Alexander Holliday ad7912e6ba Merge pull request #2448 from bluewave-labs/fix/bulk-create
fix: move bulk monitors hook to monitorHooks
2025-06-14 11:41:25 +08:00
Alexander Holliday 252961aca9 Merge pull request #2447 from bluewave-labs/fix/autocomplete-style
fix: move style to global theme
2025-06-14 11:41:07 +08:00
Br0wnHammer 2d839285f2 Switch Buttons Position 2025-06-13 20:40:01 +05:30
Br0wnHammer d19bbf2b8e Hide send email button until validation is complete 2025-06-13 14:15:37 +05:30
Alex Holliday 4b621a228f remove monitors from status page on delete 2025-06-13 14:54:59 +08:00
Br0wnHammer 38a1d5e7a1 Implement PR Comments 2025-06-13 12:22:28 +05:30
Alex Holliday cc8949538f move bulk monitors hook to monitorHooks 2025-06-13 14:04:08 +08:00
Alex Holliday 985ca3334d move style to global theme 2025-06-13 13:49:54 +08:00
Alexander Holliday df69d06048 Merge pull request #2446 from bluewave-labs/fix/remove-team-and-user-id
fix: remove team and user
2025-06-13 13:35:36 +08:00
Alexander Holliday ef8f74d4e3 Merge pull request #2445 from bluewave-labs/fix/checks-team-id
fix: checks team
2025-06-13 13:34:35 +08:00
Alexander Holliday 062df395c5 Merge pull request #2444 from bluewave-labs/fix/maintenance-window-team-id
fix: maintenance window team
2025-06-13 13:34:22 +08:00
Alexander Holliday a25f292217 Merge pull request #2443 from bluewave-labs/fix/monitors-remove-team-id
fix: monitors remove team ID parameters
2025-06-13 13:34:05 +08:00
Alexander Holliday 30fc14ed7f Merge pull request #2442 from bluewave-labs/fix/notifications-team-id
fix: remove team id from notifications
2025-06-13 13:33:48 +08:00
Alexander Holliday 1850655467 Merge pull request #2441 from bluewave-labs/fix/advanced-settings
fix: add a checkbox to enable/disable advanced settings
2025-06-13 13:33:30 +08:00
Alex Holliday ab3f867b5b remove unused redux state 2025-06-13 13:32:55 +08:00
Alex Holliday b499b2879c remove teamId from status pages 2025-06-13 13:29:03 +08:00
Alex Holliday 18ea551118 remove user 2025-06-13 13:11:58 +08:00
Alex Holliday 42372ab111 remove userID and teamID from status page 2025-06-13 13:10:56 +08:00
Alex Holliday 5e23a2b79c Remove team and user id 2025-06-13 12:16:52 +08:00
Alex Holliday c32cde6189 fix incidents page 2025-06-13 12:08:59 +08:00
Alex Holliday d2233d2e3e remove teamId from checks 2025-06-13 12:04:39 +08:00
Alex Holliday 9da3d3ef55 remove teamId from checks 2025-06-13 12:03:32 +08:00
Alex Holliday cedd660fd9 get teamID from req.user 2025-06-13 11:52:10 +08:00
Alex Holliday b9fbfd2a25 remove team id from monitor controller/db methods, standardize parameters 2025-06-13 11:49:03 +08:00
Alex Holliday 4168c86734 remove team id from monitor controller/db methods, standardize parameters 2025-06-13 11:47:29 +08:00
Alex Holliday 024096631f remove team id from notificaitons 2025-06-13 11:15:42 +08:00
Alex Holliday e53901f6fd add a checkbox to enable/disable advanced settings 2025-06-13 11:07:37 +08:00
Alexander Holliday 1a7842164d Merge pull request #2434 from bluewave-labs/fix/redux-removal-action-menu
fix: remove redux from action menu
2025-06-13 10:55:19 +08:00
Alexander Holliday 656c3c61a8 Merge pull request #2435 from bluewave-labs/fix/remove-redux-sidebar
fix: remove redux sidebar
2025-06-13 10:54:32 +08:00
Alexander Holliday 19303d43ea Merge pull request #2436 from bluewave-labs/fix/redux-removal-password-reset
fix: redux removal password reset
2025-06-13 10:54:15 +08:00
Alexander Holliday cd0b9cd7d6 Merge pull request #2437 from bluewave-labs/fix/redux-removal-settings
fix: remove redux from settings
2025-06-13 10:54:02 +08:00
Alexander Holliday 5e8a0afd3b Merge pull request #2438 from bluewave-labs/fix/remove-uptime-reducer
fix: remove uptime reducer
2025-06-13 10:53:50 +08:00
Alexander Holliday fac2f6f205 Merge pull request #2439 from bluewave-labs/fix/remove-unused-reducers
fix: remove unused reducers
2025-06-13 10:53:34 +08:00
Alexander Holliday c3a2ca314a Merge pull request #2440 from bluewave-labs/fix/remove-team-id-from-requests
fix: remove team id from requests
2025-06-13 10:53:18 +08:00
Alex Holliday 57f4db8d37 remove reference to state 2025-06-13 10:52:05 +08:00
Alex Holliday afece4df65 update routes, validation 2025-06-13 10:46:06 +08:00
Alex Holliday d9c2f31f4e remove teamId from uptime monitor requests 2025-06-13 10:38:52 +08:00
Alex Holliday 134e547736 remove redux loading state 2025-06-13 10:18:43 +08:00
Alex Holliday 1542cf01a7 comment out pagespeed check, TODO later 2025-06-13 10:13:22 +08:00
Alex Holliday a63bcb5b4a add missing finally block 2025-06-13 10:05:29 +08:00
Alex Holliday deeb6a030c remove settings reducer 2025-06-13 10:00:48 +08:00
Alex Holliday 5e6aaa3caa remove unused reducers 2025-06-13 09:59:01 +08:00
Alex Holliday 9503f08dd8 remove uptime monitor reducer 2025-06-13 09:56:06 +08:00
Alex Holliday fca39f1914 remove redux from settings 2025-06-13 09:51:26 +08:00
Alex Holliday 8d512b4719 remove redux 2025-06-13 09:27:29 +08:00
Alex Holliday 9f204b36b0 remove unused redux state from sidebar 2025-06-13 09:18:45 +08:00
Alex Holliday a93edc1131 remove redux from action menu 2025-06-13 09:16:07 +08:00
Alexander Holliday 09b7dc8401 Merge pull request #2431 from bluewave-labs/fix/redux-removal-hook-cleanup
fix: redux removal hook cleanup
2025-06-13 09:03:25 +08:00
Alexander Holliday 6f3c2df6ee Merge pull request #2430 from bluewave-labs/feat/bg-svg
feat: add a background component
2025-06-13 09:02:33 +08:00
Alex Holliday a111903965 use hooks 2025-06-12 15:47:59 +08:00
Alex Holliday d62fe5f4ab add missing dependencies 2025-06-12 15:47:43 +08:00
Alex Holliday 289aa4fe32 refactor check hooks 2025-06-12 15:47:21 +08:00
Alex Holliday cf84d1fde5 use arrow functions to preserve context 2025-06-12 15:46:48 +08:00
Alex Holliday 50986d4493 use hooks 2025-06-12 12:44:46 +08:00
Alex Holliday 948e5e932b refactor hooks to common util 2025-06-12 12:44:35 +08:00
Alex Holliday 1574624f69 add a background component 2025-06-12 09:37:51 +08:00
Alexander Holliday 275f2384c0 Merge pull request #2426 from bluewave-labs/feat/register
feat: register
2025-06-12 09:05:21 +08:00
Alex Holliday b58fe4ae74 add loading state 2025-06-12 09:04:19 +08:00
Alexander Holliday b1f4c64a21 Merge pull request #2425 from bluewave-labs/feat/login
feat: login
2025-06-12 09:01:58 +08:00
Alexander Holliday 4e10325eea Merge pull request #2429 from anuragparashar26/develop
fix: update TextInput border color to match dropdown (#2406)
2025-06-12 09:01:40 +08:00
anuragparashar26 6dea8b434b fix: update TextInput border color to match dropdown (#2406) 2025-06-12 05:20:16 +05:30
anuragparashar26 9242612f30 fix: update TextInput border color to match dropdown (#2406) 2025-06-12 05:01:09 +05:30
Br0wnHammer de3d38d891 Implement remaining email config 2025-06-12 00:39:47 +05:30
Alex Holliday 0e4b371925 add login header 2025-06-11 20:12:02 +08:00
Br0wnHammer 1794429cbe Formatting Run 2025-06-11 15:29:25 +05:30
Br0wnHammer 7e1a7066fc TLS Options Set Up 2025-06-11 15:11:28 +05:30
Br0wnHammer 01ed3d8aaa Feat: New Email Settings 2025-06-11 14:42:51 +05:30
Br0wnHammer ec25ebee35 Fix: Node Mailer Settings 2025-06-11 14:11:49 +05:30
Alex Holliday c0ad2dfce2 fix superadmin state 2025-06-11 12:41:58 +08:00
Alex Holliday bcea3a5e66 refactor register page 2025-06-11 12:32:36 +08:00
Alex Holliday 3ade8b5bd4 update admin check HOC 2025-06-11 12:32:16 +08:00
Alex Holliday fac960b9ac set minHeight, force lowercase for email 2025-06-11 12:32:03 +08:00
Alex Holliday 045b506e2a remove unused component 2025-06-11 10:22:17 +08:00
Alex Holliday 9e6b826f6e update translations 2025-06-11 10:21:47 +08:00
Alex Holliday cd17ecdadb fix import path 2025-06-11 10:21:33 +08:00
Alex Holliday f32892adaf add components directory 2025-06-11 10:20:36 +08:00
Alex Holliday 18ef81f6f1 refactor login page 2025-06-11 10:20:14 +08:00
Alexander Holliday 3cd8191aa4 Merge pull request #2422 from bluewave-labs/feat/notification-on-click
feat: add row click handling to notificaitons table
2025-06-10 14:21:29 +08:00
Alexander Holliday ff0d338899 Merge pull request #2423 from bluewave-labs/hotfix/docker-image-name
hotfix: image name
2025-06-10 14:20:52 +08:00
Alex Holliday e44114b5e5 fix image name 2025-06-10 14:19:57 +08:00
Alex Holliday 7587fea6d5 Add row click handling to notificaitons table 2025-06-10 14:03:49 +08:00
Alexander Holliday a105e85a5a Merge pull request #2421 from bluewave-labs/hotfix/duplicate-strings
hotfix: duplicate strings, remove uptime percentage
2025-06-10 13:58:44 +08:00
Alex Holliday 3224feeb9e fix duplicate strings, remove uptime percentage 2025-06-10 13:57:00 +08:00
Alexander Holliday cb98359d35 Merge pull request #2420 from bluewave-labs/feat/test-notification
feat: test notification
2025-06-10 13:49:16 +08:00
Alexander Holliday 64390bae2b Merge pull request #2419 from bluewave-labs/feat/edit-notification-channel
feat: implement editing notification channels
2025-06-10 13:47:25 +08:00
Alexander Holliday 94d10b6385 Merge pull request #2418 from bluewave-labs/fix/delete-cascade
fix: implement delete cascade
2025-06-10 13:45:55 +08:00
Alex Holliday 08875b07ec add pagerduty 2025-06-10 13:44:15 +08:00
Alex Holliday c20b8c665a add tests notification for email 2025-06-10 13:20:44 +08:00
Alex Holliday e6493df881 add test notificaiton button and methods 2025-06-10 12:07:31 +08:00
Alex Holliday 1ed317d0cb update fallback 2025-06-10 11:29:03 +08:00
Alex Holliday df63e74116 update icon 2025-06-10 11:22:24 +08:00
Alex Holliday 910bf4c72e formatting 2025-06-10 11:16:39 +08:00
Alex Holliday 0ac1f13043 implement editing notification channels 2025-06-10 11:13:19 +08:00
Alex Holliday 76de8f11f2 formatting 2025-06-10 09:53:17 +08:00
Alex Holliday 711e85cb6e implement delete cascade 2025-06-10 09:49:53 +08:00
Alexander Holliday f41709bd12 Merge pull request #2414 from bluewave-labs/feat/fe/uptime-notification-channels
feat: fe/uptime notification channels, resolves #2344
2025-06-10 09:24:56 +08:00
Alexander Holliday 59955cd29a Merge pull request #2413 from bluewave-labs/feat/notification-channels
feat: notification channels
2025-06-10 09:24:37 +08:00
Alexander Holliday e438e4572f Merge pull request #2417 from bluewave-labs/fix/account-delete
fix: add empty query object to fix default destructuring, resolves #2386
2025-06-10 09:17:50 +08:00
Alex Holliday f445c2b310 add empty query object to fix default destructuring 2025-06-10 09:16:38 +08:00
Alexander Holliday 5dd52808b3 Merge pull request #2416 from kelvinyim0705/develop
fix: standardize pagination alignment in ChartBox components
2025-06-10 09:00:49 +08:00
Alexander Holliday a85d2c8559 Merge pull request #2409 from bluewave-labs/Capture-version-on-details-page
Capture version on details page
2025-06-10 08:59:26 +08:00
Alexander Holliday 427f52b5a4 Merge pull request #2415 from SaikatDeb12/fix/login-error-display-message
fix: changed login error display message
2025-06-10 08:58:31 +08:00
Alexander Holliday c1b828a58e Merge pull request #2410 from ceskyDJ/i18n-refactor
i18n: Refactoring, fixes and cleaning up (part I)
2025-06-10 08:54:57 +08:00
Michal Šmahel 89bc2a9293 style: Reformat code 2025-06-09 21:54:48 +02:00
Michal Šmahel 8c9084cc7a i18n: Clean up auth-related keys
Removes only keys that aren't used on any place (I searched for
each of them in all Components and Pages).
2025-06-09 21:54:48 +02:00
Michal Šmahel 00f3941ca6 i18n: Refactor, fix and clean up auth forms 2025-06-09 21:54:47 +02:00
Michal Šmahel 74915f6840 fix: Strict password validation in login form
Strict password validation is for registration, change password,
reset password and similar forms. In login form, we don't want
to interrupt user with unnecessary validation as it's completely
irrelevant what they actually entered. The one thing it's about
is the correctness of the email and the password.

Disabling strict validation for password is a kind of security
through obscurity, which could filter some untargeted attempts
for trying passwords by bots. If the bot immediatelly receives
notes about the requirements, it has more imformation for better
attacks.
2025-06-09 21:54:47 +02:00
Michal Šmahel 3ac0eb2128 refactor: Simplify client-side email validation
We don't need to implement custom check for lowercase, as it's
been already implemented in joi library. Also we don't need to
convert email to lowercase twice (via onChange and onInput event
handlers), onChange is completely sufficient and as it's just
before form validation, it's the better one.
2025-06-09 21:54:47 +02:00
Michal Šmahel c5efa71875 i18n: Refactor and fix network error 2025-06-09 21:54:45 +02:00
Michal Šmahel 6460fe33d6 i18n: Refactor page for server unreachable and remove unused 2025-06-09 21:53:04 +02:00
Michal Šmahel 6b81eabf07 i18n: Fix theme toggle 2025-06-09 21:53:03 +02:00
Michal Šmahel d63e3db216 i18n: Refactor and fix app names (Checkmate and Capture) 2025-06-09 21:53:02 +02:00
Michal Šmahel 7e873161bc l10n(ar): Remove empty localization 2025-06-09 21:53:00 +02:00
Michal Šmahel fe5f24ef44 l10n(cs): Clean up localization file 2025-06-09 21:52:53 +02:00
Kelvin Yim 21a26a5ebb fix: standardize pagination alignment in ChartBox components
Remove alignItems="center" from ChartBox to prevent unintended centering of pagination controls in uptime details, ensuring consistent pagination layout across all tables per

issue #2405
2025-06-09 17:36:26 +01:00
Owaise Imdad 4608390cfd Added local support for the page. 2025-06-09 21:25:34 +05:30
SaikatDeb12 a73d3ec83e fix: changed login error display message 2025-06-09 16:03:44 +05:30
Alex Holliday 1b40aa0ded add notifications to infra page, add generic webhook notification channel 2025-06-09 14:59:26 +08:00
Alex Holliday de673ea5d1 add notifications to pagespeed 2025-06-09 14:22:11 +08:00
Alex Holliday 4c3ea2fd65 add validation 2025-06-09 12:59:02 +08:00
Alex Holliday f2000ffe56 add notificaitons to projection 2025-06-09 12:58:52 +08:00
Alex Holliday a0de1e3c72 remove old notificaiton code 2025-06-09 12:58:25 +08:00
Alex Holliday b825e0fef4 remove old notification code 2025-06-09 12:58:04 +08:00
Alex Holliday 5b21906894 add notificaion pages 2025-06-09 12:57:30 +08:00
Alex Holliday 46b2b4c3ab add hooks 2025-06-09 12:57:15 +08:00
Alex Holliday ff11a91190 add notification config component 2025-06-09 12:57:02 +08:00
Alex Holliday eb79eef2a2 Add network service methods 2025-06-09 12:56:45 +08:00
Alex Holliday e8a4496199 add notification channel pages 2025-06-09 12:56:24 +08:00
Alex Holliday 04ab4e23db add notificaions channel to Uptime Configure 2025-06-09 12:56:05 +08:00
Alex Holliday e36abfa9a6 add notificaitons channel to Create Uptime 2025-06-09 12:55:45 +08:00
Alex Holliday 358381ddc2 update client side validation 2025-06-09 12:55:13 +08:00
Alex Holliday 1fbfbc4204 add strings 2025-06-09 12:55:01 +08:00
Alex Holliday 95703c1505 remove console.log 2025-06-09 12:54:41 +08:00
Alex Holliday 0225b93c72 add notifications channel to sidebar 2025-06-09 12:52:52 +08:00
Alex Holliday 3027606524 remove console.log 2025-06-09 12:52:32 +08:00
Alex Holliday 92ddf023ec add pager duty handling method 2025-06-09 10:49:52 +08:00
Alex Holliday 5a50e9b301 Add controller, db, and validation for notifications 2025-06-09 10:30:21 +08:00
Alex Holliday 0f10a39f91 add notification routes 2025-06-09 10:25:06 +08:00
Alex Holliday 55a871cb3c update notification model 2025-06-09 10:24:06 +08:00
Alexander Holliday bd78dbb95d Merge pull request #2412 from bluewave-labs/feat/purge-distributed-uptime
fix: purge distributed uptime
2025-06-09 10:19:36 +08:00
Alex Holliday 274595a533 purge distributed uptime 2025-06-09 10:17:09 +08:00
Alexander Holliday 5690d91d59 Merge pull request #2408 from varunrmantri23/develop
fix: prevent monitor URL and name overflow with sx Prop
2025-06-09 09:53:06 +08:00
Alexander Holliday 1cdb3d1ef7 Merge pull request #2411 from Shivansh-22866/fix/remove_future_features
Fix/remove future features
2025-06-09 09:39:46 +08:00
Shivansh-22866 048c0a7994 Merge branch 'fix/remove_future_features' of https://github.com/Shivansh-22866/Checkmate into fix/remove_future_features 2025-06-08 23:21:14 +05:30
Shivansh-22866 8412e0f17f Add comments 2025-06-08 23:20:48 +05:30
Shivansh e04bfcc96a Merge branch 'bluewave-labs:develop' into fix/remove_future_features 2025-06-08 23:18:12 +05:30
Shivansh-22866 f6f1842863 Merge branch 'develop' of https://github.com/Shivansh-22866/Checkmate into fix/remove_future_features 2025-06-08 23:16:40 +05:30
varunrmantri23 5e2fa7a8f0 fix: add global Typography variants for monitor text truncation 2025-06-08 23:12:48 +05:30
Shivansh-22866 d0dbc75587 Remove future email features from Page Speed configure 2025-06-08 19:27:33 +05:30
Owaise Imdad 3886617b11 Fix formatted the files. 2025-06-08 17:32:45 +05:30
varunrmantri23 e4ade39db7 fix: prevent monitor URL and name overflow using MUI sx prop 2025-06-08 14:33:56 +05:30
varunrmantri23 1f6826e045 fix: add CSS classes to prevent URL and name overflow in monitors 2025-06-08 13:11:04 +05:30
Gorkem Cetin (BWL) 6d236477ac Add npm run format directive 2025-06-08 00:30:59 -04:00
Alexander Holliday 32817829d8 Merge pull request #2404 from bluewave-labs/feat/pulse
feat: pulse
2025-06-08 09:03:34 +08:00
Alex Holliday afbd1157c0 add factory method 2025-06-08 09:01:30 +08:00
Alex Holliday 8de2c0387c fix method name 2025-06-08 08:57:45 +08:00
Alex Holliday 267693668d format fix 2025-06-08 08:42:16 +08:00
Alex Holliday 7475dcfb21 add update job method 2025-06-08 08:41:42 +08:00
Alexander Holliday 6d43665e59 Merge pull request #2400 from bluewave-labs/fix/general-settings-desc
Minor changes/typo fix in general settings description
2025-06-08 08:19:44 +08:00
Alexander Holliday a98c36aea3 Merge pull request #2403 from bluewave-labs/fix/port-monitor-status-page
Fix #2365: Add port monitor support to status page
2025-06-08 08:19:14 +08:00
Alexander Holliday fdf8e88e44 Merge pull request #2398 from bluewave-labs/Fix-for-csv-lowecase-check
FIX for csv file case sensitive file ending.
2025-06-08 08:18:12 +08:00
Alex Holliday f2b7a9cc67 fix formatting 2025-06-08 08:14:17 +08:00
Alex Holliday ecd8ca0940 fix formatting 2025-06-08 08:11:31 +08:00
Alex Holliday dfe88b30e8 fix formatting 2025-06-08 08:09:00 +08:00
mohadeseh safari a13056bd1b Fix #2365: Add port monitor support to status page 2025-06-07 19:12:22 -04:00
Owaise Imdad ccc9faa892 Feature for adding capture version on the deatils page. 2025-06-08 00:13:47 +05:30
Vishnu Sreekumaran Nair fe041bc0c0 fix typo in docker desc 2025-06-07 14:20:26 -04:00
Vishnu Sreekumaran Nair 1bf1387a05 update ping monitoring desc 2025-06-07 14:19:43 -04:00
Owaise Imdad 958a8ad5a7 FIX for csv file case sensitive file ending. 2025-06-07 21:14:03 +05:30
Alexander Holliday 9c921896fd Merge pull request #2331 from Thirukumaran-T/save-button-enhancement
REFACTOR: added sticky behaviour to the save button at the end
2025-06-07 20:48:33 +08:00
Alexander Holliday b0cf59b0f9 Merge pull request #2396 from bluewave-labs/translation-update-71
🌐 Updated Translations from POEditor
2025-06-07 08:24:10 +08:00
GitHub Action ded137a197 feat: translations updated from POEditor 2025-06-07 00:23:08 +00:00
Alex Holliday 9a22d4a971 initial Pulse implementation 2025-06-06 14:05:59 +08:00
Alex Holliday 9e42fd6ffd change workflow names 2025-06-06 07:44:19 +08:00
Thirukumaran-T a101bd479a CHORE: added border styles to the save button container 2025-06-05 12:00:16 +05:30
Alexander Holliday a597d23c95 Merge pull request #2394 from bluewave-labs/feat/image-tags
version tagging images
2025-06-04 19:51:06 -07:00
Alex Holliday 9591ba3dc4 version tagging images 2025-06-05 10:44:27 +08:00
Gorkem Cetin (BWL) 1f9fbf7115 Update PULLREQUESTS.md 2025-06-04 09:09:54 -04:00
Gorkem Cetin (BWL) 1286dd30b3 Update README.md 2025-06-02 22:43:56 -04:00
Alexander Holliday 8498d7abc9 Merge pull request #2381 from bluewave-labs/general-settings-description
Change general settings description according to selected uptime monitor type
2025-06-01 12:05:25 -07:00
Alexander Holliday 41e3e262fb Merge pull request #2382 from bluewave-labs/feat/format-check
Feat/format check
2025-06-01 11:57:08 -07:00
Alex Holliday c119df1553 format 2025-06-01 11:55:16 -07:00
Alex Holliday c02ba84864 user pr number 2025-06-01 11:51:49 -07:00
Alex Holliday fabbc659ad checkout repo 2025-06-01 11:49:33 -07:00
Alex Holliday 4241758354 use github cli 2025-06-01 11:47:13 -07:00
Alex Holliday 59f1ce7d31 add dependencies 2025-06-01 11:42:04 -07:00
Alex Holliday 2e7b67d991 auto-close 2025-06-01 11:39:17 -07:00
Alex Holliday 62a79aaf4b fix formatting 2025-06-01 11:31:18 -07:00
Alex Holliday 1b97a2d488 add formatting check action 2025-06-01 11:28:15 -07:00
Vishnu Sreekumaran Nair 4e414e289d update translation values for ru 2025-06-01 14:23:00 -04:00
Alexander Holliday 4ed4903272 Merge pull request #2379 from bluewave-labs/fix/2336-settings-select-value-type
Resolve Settings page Select component errors
2025-06-01 11:16:31 -07:00
Alexander Holliday 8075d3c63c Merge branch 'develop' into fix/2336-settings-select-value-type 2025-06-01 11:16:20 -07:00
Vishnu Sreekumaran Nair d6658d16f9 update translation values for pt-BR 2025-06-01 14:14:35 -04:00
Vishnu Sreekumaran Nair 6b539b009b update the en translation values 2025-06-01 14:03:56 -04:00
Vishnu Sreekumaran Nair 50e6767259 dynamically update string based on selected monitor.type 2025-06-01 13:56:13 -04:00
Vishnu Sreekumaran Nair bc06db03a2 group general instructions and update translation files 2025-06-01 13:55:19 -04:00
Alexander Holliday b8284bfddf Merge pull request #2376 from bluewave-labs/develop
Develop -> Master
2025-05-30 15:11:37 -07:00
Alexander Holliday c84322c142 Merge pull request #2375 from bluewave-labs/fix/i18n
fix: refactor i18n, resolves #2374
2025-05-30 15:11:05 -07:00
Alex Holliday 70055c712b refactor i18n 2025-05-30 15:03:32 -07:00
Alexander Holliday fd0b1633de Merge pull request #2361 from bluewave-labs/fix/2343-timezone-save-button
# Fix: Save button disabled when timezone changes (#2343)
2025-05-30 14:05:37 -07:00
mohadeseh safari aa91c9ff86 Resolve Settings page Select component errors
- Enhanced Select component to accept boolean values in PropTypes
- Updated component documentation to reflect new type support
- Added default value for showURL prop to prevent undefined value errors

- Fixed two related issues:
  1. Type mismatch error when passing boolean values
  2. Required prop error during initial rendering
2025-05-29 21:01:09 -04:00
Alexander Holliday 2486bfa146 Merge pull request #2372 from bluewave-labs/develop
Develop -> Master
2025-05-29 17:11:29 -07:00
Alexander Holliday 4f678827f3 Merge pull request #2370 from bluewave-labs/fix/webhook-notifications
fix: add config for webhook
2025-05-29 17:10:44 -07:00
Alex Holliday 5018a2dfde add config for webhook 2025-05-29 17:09:47 -07:00
mohadeseh safari 126fda6bc0 remove call 2025-05-29 19:34:21 -04:00
Alexander Holliday a3fb77565a Merge pull request #2367 from bluewave-labs/develop
Develop -> Master
2025-05-28 16:52:48 -07:00
Alexander Holliday 064fb1bfd9 Merge pull request #2360 from bluewave-labs/fix/2286-maintenance-placeholder-flash
Fix Maintenance Placeholder Flash (#2286)
2025-05-28 10:20:32 -07:00
mohadeseh safari ed5d5986ff Fix #2343: Enable Save button when timezone changes
- Added timezone field to frontend validation schema
- Added timezone field to backend validation schema
- Fixed state synchronization in Settings component
2025-05-27 20:28:53 -04:00
mohadeseh safari e6c2e34b78 fix(maintenance): prevent placeholder flash when maintenance items exist (#2286) 2025-05-27 19:54:31 -04:00
Thirukumaran-T 9ce1bf9bfb CHORE: reduced padding to make the whole stack thinner 2025-05-27 10:15:05 +05:30
Thirukumaran-T 76d69005aa REFACTOR: added sticky behaviour to the save button at the end 2025-05-24 18:33:05 +05:30
550 changed files with 35942 additions and 27009 deletions

No files matched your search

+1
View File
@@ -0,0 +1 @@
* @ajhollid @mohicody @Br0wnHammer @Owaiseimdad @karenvicent @shanikauwu1
+2 -1
View File
@@ -20,7 +20,8 @@ const { t } = useTranslation();
```
- [ ] I have **not** included any files that are not related to my pull request, including package-lock and package-json if dependencies have not changed
- [ ] I didn't use any hardcoded values (otherwise it will not scale, and will make it difficult to maintain consistency across the application).
- [ ] I made sure font sizes, color choices etc are all referenced from the theme. I have no hardcoded dimensions.
- [ ] I made sure font sizes, color choices etc are all referenced from the theme. I don't have any hardcoded dimensions.
- [ ] My PR is granular and targeted to one specific feature.
- [ ] I ran `npm run format` in server and client directories, which automatically formats your code.
- [ ] I took a screenshot or a video and attached to this PR if there is a UI change.
+3 -1
View File
@@ -6,7 +6,9 @@ import { URLSearchParams } from "url";
// POEditor API information
const API_TOKEN = process.env.POEDITOR_API;
const PROJECT_ID = process.env.POEDITOR_PROJECT_ID;
const LANGUAGES = (process.env.LANGUAGES || "tr,en").split(",");
const LANGUAGES = (
process.env.LANGUAGES || "ar,zh-tw,cs,en,fi,fr,de,pt-br,ru,es,tr,ja"
).split(",");
const EXPORT_FORMAT = process.env.EXPORT_FORMAT || "key_value_json";
// POEditor API endpoint
+41
View File
@@ -0,0 +1,41 @@
name: Format Check (Client & Server)
on:
pull_request:
workflow_dispatch:
jobs:
format-client:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Node
uses: actions/setup-node@v4
with:
node-version: 22
- name: Install client dependencies
working-directory: client
run: npm ci
- name: Check client formatting
working-directory: client
run: npm run format-check
format-server:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Node
uses: actions/setup-node@v4
with:
node-version: 22
- name: Install server dependencies
working-directory: server
run: npm ci
- name: Check server formatting
working-directory: server
run: npm run format-check
@@ -0,0 +1,147 @@
name: Deploy images on release
on:
push:
tags:
- "v*"
workflow_dispatch:
jobs:
docker-build-and-push-client:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Extract version from tag
id: extract_tag
run: echo "version=${GITHUB_REF#refs/tags/}" >> "$GITHUB_OUTPUT"
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build Client Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate-client:${{ steps.extract_tag.outputs.version }} \
-f ./docker/dist/client.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
.
- name: Push Client Docker image
run: |
docker push ghcr.io/bluewave-labs/checkmate-client:${{ steps.extract_tag.outputs.version }}
docker-build-and-push-server:
needs: docker-build-and-push-client
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Extract version
id: extract_tag
run: echo "version=${GITHUB_REF#refs/tags/}" >> "$GITHUB_OUTPUT"
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build Server Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate-backend:${{ steps.extract_tag.outputs.version }} \
-f ./docker/dist/server.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
.
- name: Push Server Docker image
run: |
docker push ghcr.io/bluewave-labs/checkmate-backend:${{ steps.extract_tag.outputs.version }}
- name: Build Mongo Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate-mongo:${{ steps.extract_tag.outputs.version }} \
-f ./docker/dist/mongoDB.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
.
- name: Push MongoDB Docker image
run: |
docker push ghcr.io/bluewave-labs/checkmate-mongo:${{ steps.extract_tag.outputs.version }}
docker-build-and-push-server-mono-multiarch:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Extract version
id: extract_tag
run: echo "version=${GITHUB_REF#refs/tags/}" >> "$GITHUB_OUTPUT"
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push multi-arch Docker image
uses: docker/build-push-action@v5
with:
context: .
file: ./docker/dist-arm/server.Dockerfile
push: true
tags: |
ghcr.io/bluewave-labs/checkmate-backend-mono-multiarch:${{ steps.extract_tag.outputs.version }}
platforms: linux/amd64,linux/arm64
labels: |
org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate
build-args: |
VITE_APP_VERSION=${{ steps.extract_tag.outputs.version }}
docker-build-and-push-server-mono:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Extract version
id: extract_tag
run: echo "version=${GITHUB_REF#refs/tags/}" >> "$GITHUB_OUTPUT"
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build Server Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate-backend-mono:${{ steps.extract_tag.outputs.version }} \
-f ./docker/dist-mono/server.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
--build-arg VITE_APP_VERSION=${{ steps.extract_tag.outputs.version }} \
.
- name: Push Server Docker image
run: docker push ghcr.io/bluewave-labs/checkmate-backend-mono:${{ steps.extract_tag.outputs.version }}
+142
View File
@@ -0,0 +1,142 @@
name: Deploy images
on:
push:
branches: ["master"]
workflow_dispatch:
jobs:
docker-build-and-push-client:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Get version
id: vars
run: echo "VERSION=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV
- name: Build Client Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate-client:latest \
-f ./docker/dist/client.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
--build-arg VITE_APP_VERSION=${{ env.VERSION }} \
.
- name: Push Client Docker image
run: |
docker push ghcr.io/bluewave-labs/checkmate-client:latest
docker-build-and-push-server:
needs: docker-build-and-push-client
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build Server Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate-backend:latest \
-f ./docker/dist/server.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
.
- name: Push Server Docker image
run: |
docker push ghcr.io/bluewave-labs/checkmate-backend:latest
- name: Build Mongo Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate-mongo:latest \
-f ./docker/dist/mongoDB.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
.
- name: Push MongoDB Docker image
run: |
docker push ghcr.io/bluewave-labs/checkmate-mongo:latest
docker-build-and-push-server-mono-multiarch:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Get version
id: vars
run: echo "VERSION=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV
- name: Build and push multi-arch Docker image
uses: docker/build-push-action@v5
with:
context: .
file: ./docker/dist-arm/server.Dockerfile
push: true
tags: |
ghcr.io/bluewave-labs/checkmate-backend-mono-multiarch:latest
platforms: linux/amd64,linux/arm64
labels: |
org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate
build-args: |
VITE_APP_VERSION=${{ env.VERSION }}
docker-build-and-push-server-mono:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Get version
id: vars
run: echo "VERSION=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV
- name: Build Server Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate-backend-mono:latest \
-f ./docker/dist-mono/server.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
--build-arg VITE_APP_VERSION=${{ env.VERSION }} \
.
- name: Push Server Docker image
run: docker push ghcr.io/bluewave-labs/checkmate-backend-mono:latest
-80
View File
@@ -1,80 +0,0 @@
name: Distribution deploy
on:
push:
branches: ["master"]
workflow_dispatch:
jobs:
docker-build-and-push-client:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build Client Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate:frontend-dist \
-f ./docker/dist/client.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
.
- name: Push Client Docker image
run: docker push ghcr.io/bluewave-labs/checkmate:frontend-dist
docker-build-and-push-server:
needs: docker-build-and-push-client
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build Server Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate:backend-dist \
-f ./docker/dist/server.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
.
- name: Push Server Docker image
run: docker push ghcr.io/bluewave-labs/checkmate:backend-dist
- name: Build Mongo Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate:mongo-dist \
-f ./docker/dist/mongoDB.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
.
- name: Push MongoDB Docker image
run: docker push ghcr.io/bluewave-labs/checkmate:mongo-dist
- name: Build Redis Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate:redis-dist \
-f ./docker/dist/redis.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
.
- name: Push Redis Docker image
run: docker push ghcr.io/bluewave-labs/checkmate:redis-dist
@@ -1,44 +0,0 @@
name: Distribution deploy - Monolithic Multiarch
on:
push:
branches: ["master"]
workflow_dispatch:
jobs:
docker-build-and-push-server:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push multi-arch Docker image
uses: docker/build-push-action@v5
with:
context: .
file: ./docker/dist-arm/server.Dockerfile
push: true
tags: ghcr.io/bluewave-labs/checkmate:backend-dist-mono-multiarch
platforms: linux/amd64,linux/arm64
labels: |
org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate
# - name: Build Server Docker image
# run: |
# docker build \
# -t ghcr.io/bluewave-labs/checkmate:backend-dist-mono-multiarch \
# -f ./docker/dist-arm/server.Dockerfile \
# --label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
# .
# - name: Push Server Docker image
# run: docker push ghcr.io/bluewave-labs/checkmate:backend-dist-mono-multiarch
@@ -1,30 +0,0 @@
name: Distribution deploy - Monolithic
on:
push:
branches: ["master"]
workflow_dispatch:
jobs:
docker-build-and-push-server:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build Server Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate:backend-dist-mono \
-f ./docker/dist-mono/server.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
.
- name: Push Server Docker image
run: docker push ghcr.io/bluewave-labs/checkmate:backend-dist-mono
+1 -1
View File
@@ -7,7 +7,7 @@ on:
languages:
description: "Languages to synchronize (comma separated, e.g.: tr,en,es)"
required: false
default: "ar,zh-tw,cs,en,fi,fr,de,pt-br,ru,es,tr"
default: "ar,zh-tw,cs,en,fi,fr,de,pt-br,ru,es,tr,ja"
format:
description: "Export format (key_value_json or json)"
required: false
+6 -11
View File
@@ -10,6 +10,8 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
@@ -18,12 +20,16 @@ jobs:
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Get version
id: vars
run: echo "VERSION=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV
- name: Build Client Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate:frontend-demo \
-f ./docker/prod/client.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
--build-arg VITE_APP_VERSION=${{ env.VERSION }} \
.
- name: Push Client Docker image
@@ -65,17 +71,6 @@ jobs:
- name: Push MongoDB Docker image
run: docker push ghcr.io/bluewave-labs/checkmate:mongo-demo
- name: Build Redis Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate:redis-demo \
-f ./docker/prod/redis.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
.
- name: Push Redis Docker image
run: docker push ghcr.io/bluewave-labs/checkmate:redis-demo
deploy-to-demo:
needs: docker-build-and-push-server
runs-on: ubuntu-latest
+6 -11
View File
@@ -10,6 +10,8 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
@@ -18,12 +20,16 @@ jobs:
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Get version
id: vars
run: echo "VERSION=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV
- name: Build Client Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate:frontend-staging \
-f ./docker/staging/client.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
--build-arg VITE_APP_VERSION=${{ env.VERSION }} \
.
- name: Push Client Docker image
@@ -65,17 +71,6 @@ jobs:
- name: Push MongoDB Docker image
run: docker push ghcr.io/bluewave-labs/checkmate:mongo-staging
- name: Build Redis Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate:redis-staging \
-f ./docker/staging/redis.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
.
- name: Push Redis Docker image
run: docker push ghcr.io/bluewave-labs/checkmate:redis-staging
deploy-to-staging:
needs: docker-build-and-push-server
runs-on: ubuntu-latest
+5 -1
View File
@@ -27,6 +27,10 @@ Process. If more revisions are required after the second review we’re looking
If PRs are small and manageable it is far more likely that a dev will catch bugs during the review process. If our eyes glaze over at line 400 of a 700 line PR since we’ve reached our cognitive limit we’re not going to likely miss bugs in the last 300 lines of code.
### Bonus Topic: Keep PRs focused
### Format your PRs for better readability
Ensure you execute `npm run format` before submitting your pull requests in both the client and server directories. This command automatically applies our formatting structure, making the code easier to follow and review.
### Keep PRs focused
It may be tempting to address a bug you suddenly remembered or make some tiny adjustments in some component that bothers you, but don’t! Keep all commits in your pull request fully focused on the specific feature you are working on. Open up another PR if you want to fix a big or work on another feature.
+172
View File
@@ -0,0 +1,172 @@
<p align=center> <a href="https://trendshift.io/repositories/12443" target="_blank"><img src="https://trendshift.io/api/badge/repositories/12443" alt="bluewave-labs%2Fcheckmate | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a></p>
![](https://img.shields.io/github/license/bluewave-labs/checkmate)
![](https://img.shields.io/github/repo-size/bluewave-labs/checkmate)
![](https://img.shields.io/github/commit-activity/m/bluewave-labs/checkmate)
![](https://img.shields.io/github/last-commit/bluewave-labs/checkmate)
![](https://img.shields.io/github/languages/top/bluewave-labs/checkmate)
![](https://img.shields.io/github/issues/bluewave-labs/checkmate)
![](https://img.shields.io/github/issues-pr/bluewave-labs/checkmate)
[![OpenSSF Mejores Prácticas](https://www.bestpractices.dev/projects/9901/badge)](https://www.bestpractices.dev/projects/9901)
[![Pregunta en DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/bluewave-labs/checkmate)
<h1 align="center"><a href="https://bluewavelabs.ca" target="_blank">Checkmate</a></h1>
<p align="center"><strong>Una aplicación de código abierto para monitoreo de infraestructura y tiempo de actividad</strong></p>
<img width="1660" alt="image" src="https://github.com/user-attachments/assets/b748f36d-a271-4965-ad0a-18bf153bbee7" />
Este repositorio contiene tanto el frontend como el backend de Checkmate, una herramienta de monitoreo de código abierto y autoalojada para rastrear hardware de servidores, tiempo de actividad, tiempos de respuesta e incidentes en tiempo real con visualizaciones atractivas. Checkmate revisa regularmente si un servidor o sitio web es accesible y funciona de manera óptima, proporcionando alertas e informes en tiempo real sobre la disponibilidad, el tiempo de inactividad y el tiempo de respuesta de los servicios monitoreados.
Checkmate también tiene un agente llamado [Capture](https://github.com/bluewave-labs/capture), para recuperar datos de servidores remotos. Aunque Capture no es obligatorio para ejecutar Checkmate, proporciona información adicional sobre el estado de la CPU, RAM, disco y temperatura de tus servidores.
Checkmate ha sido probado con más de 1000 monitores activos sin problemas ni cuellos de botella de rendimiento.
**Si deseas patrocinar una función, [visita este enlace](https://checkmate.so/sponsored-features).**
## 📚 Tabla de contenidos
- [📦 Demo](#demo)
- [🔗 Guía del usuario](#guía-del-usuario)
- [🛠️ Instalación](#instalación)
- [🏁 Traducciones](#traducciones)
- [🚀 Rendimiento](#rendimiento)
- [💚 Preguntas e ideas](#preguntas-e-ideas)
- [🧩 Características](#características)
- [🏗️ Capturas de pantalla](#capturas-de-pantalla)
- [🏗️ Tecnologías](#tecnologías)
- [🔗 Enlaces útiles](#enlaces-útiles)
- [🤝 Contribuciones](#contribuciones)
- [💰 Patrocinadores](#patrocinadores)
...
**[Texto truncado para mantener la longitud del mensaje manejable]**
## Demo
Puedes ver la última versión de [Checkmate](https://checkmate-demo.bluewavelabs.ca/) en acción. El usuario es uptimedemo@demo.com y la contraseña es Demouser1! (ten en cuenta que actualizamos el servidor de demostración de vez en cuando, así que si no funciona para ti, por favor contáctanos en el canal de Discusiones).
## Guía del usuario
Las instrucciones de uso se pueden encontrar [aquí](https://docs.checkmate.so/checkmate-2.1). Todavía está en desarrollo y parte de la información puede estar desactualizada ya que continuamente añadimos funciones cada semana. ¡Ten por seguro que estamos haciendo lo mejor posible! :)
## Instalación
Consulta las instrucciones de instalación en el [portal de documentación de Checkmate](https://docs.checkmate.so/checkmate-2.1/users-guide/quickstart).
Alternativamente, también puedes usar [Coolify](https://coolify.io/), [Elestio](https://elest.io/open-source/checkmate), [K8s](./charts/helm/checkmate/INSTALLATION.md) o [Pikapods](https://www.pikapods.com/) para desplegar rápidamente una instancia de Checkmate. Si deseas monitorear tu infraestructura de servidores, necesitarás el agente [Capture](https://github.com/bluewave-labs/capture). El repositorio de Capture también contiene las instrucciones de instalación.
## Traducciones
Si deseas usar Checkmate en tu idioma, por favor [ve a esta página](https://poeditor.com/join/project/lRUoGZFCsJ) y regístrate para el idioma al que te gustaría traducir Checkmate.
## Rendimiento
Gracias a extensas optimizaciones, Checkmate opera con un uso de memoria excepcionalmente bajo, requiriendo recursos mínimos de memoria y CPU. Aquí está el uso de memoria de una instancia de Node.js ejecutándose en un servidor que monitorea 323 servidores cada minuto:
![image](https://github.com/user-attachments/assets/37e04a75-d83a-488f-b25c-025511b492c9)
También puedes ver el consumo de memoria de MongoDB y Redis en el mismo servidor (398Mb y 15Mb) para la misma cantidad de servidores:
![image](https://github.com/user-attachments/assets/3b469e85-e675-4040-a162-3f24c1afc751)
## Preguntas e Ideas
Si tienes alguna pregunta, sugerencia o comentario, tienes varias opciones:
- [Canal de Discord](https://discord.gg/NAb6H3UTjK)
- [Discusiones en GitHub](https://github.com/bluewave-labs/bluewave-uptime/discussions)
- [Grupo en Reddit](https://www.reddit.com/r/CheckmateMonitoring/)
¡No dudes en hacer preguntas o compartir tus ideas, nos encantaría saber de ti!
## Características
- Completamente de código abierto, desplegable en tus propios servidores o dispositivos personales (por ejemplo, Raspberry Pi 4 o 5)
- Monitoreo de sitios web
- Monitoreo de velocidad de carga
- Monitoreo de infraestructura (memoria, uso de disco, rendimiento de CPU, etc) - requiere el agente [Capture](https://github.com/bluewave-labs/capture)
- Monitoreo de Docker
- Monitoreo con ping
- Monitoreo de certificados SSL
- Monitoreo de puertos
- Incidentes en una sola vista
- Páginas de estado
- Notificaciones por correo, Webhooks, Discord, Telegram, Slack
- Mantenimiento programado
- Monitoreo de consultas JSON
- Soporte para múltiples idiomas
**Hoja de ruta a corto plazo:** ([Milestone 2.2](https://github.com/bluewave-labs/Checkmate/milestone/8))
- Mejores notificaciones
- Monitoreo de red
- ...y algunas funciones más
## Capturas de pantalla
<p>
<img width="1628" alt="image" src="https://github.com/user-attachments/assets/2eff6464-0738-4a32-9312-26e1e8e86275" />
</p>
<p>
<img width="1656" alt="image" src="https://github.com/user-attachments/assets/616c3563-c2a7-4ee4-af6c-7e6068955d1a" />
</p>
<p>
<img width="1652" alt="image" src="https://github.com/user-attachments/assets/7912d7cf-0d0e-4f26-aa5c-2ad7170b5c99" />
</p>
<p>
<img width="1652" alt="image" src="https://github.com/user-attachments/assets/08c2c6ac-3a2f-44d1-a229-d1746a3f9d16" />
</p>
## Tecnologías
- [ReactJs](https://react.dev/)
- [MUI (framework de React)](https://mui.com/)
- [Node.js](https://nodejs.org/en)
- [MongoDB](https://mongodb.com)
- [Recharts](https://recharts.org)
- ¡Y muchos otros componentes de código abierto!
## Enlaces útiles
- Si deseas apoyarnos, por favor considera darle una ⭐ y haz clic en "watch".
- ¿Tienes una pregunta o sugerencia para la hoja de ruta? Revisa nuestro [canal de Discord](https://discord.gg/NAb6H3UTjK) o el foro de [Discusiones](https://github.com/bluewave-labs/checkmate/discussions).
- ¿Quieres saber cuándo hay una nueva versión? Usa [Newreleases](https://newreleases.io/), un servicio gratuito para seguir lanzamientos.
- Mira un video de instalación y uso de Checkmate [aquí](https://www.youtube.com/watch?v=GfFOc0xHIwY)
## Contribuciones
Somos [Alex](http://github.com/ajhollid) (líder de equipo), [Vishnu](http://github.com/vishnusn77), [Mohadeseh](http://github.com/mohicody), [Gorkem](http://github.com/gorkem-bwl/), [Owaise](http://github.com/Owaiseimdad), [Aryaman](https://github.com/Br0wnHammer) y [Mert](https://github.com/mertssmnoglu), ayudando a personas y empresas a monitorear su infraestructura y servidores.
Nos enorgullecemos de construir conexiones fuertes con contribuyentes de todos los niveles. A pesar de ser un proyecto joven, Checkmate ya ha ganado más de 7000 estrellas y ha atraído a más de 90 contribuyentes de todo el mundo.
Nuestro repositorio ha sido marcado con estrella por empleados de **Google, Microsoft, Intel, Cisco, Tencent, Electronic Arts, ByteDance, JP Morgan Chase, Deloitte, Accenture, Foxconn, Broadcom, China Telecom, Barclays, Capgemini, Wipro, Cloudflare, Dassault Systèmes y NEC**, ¡así que no te detengas — participa, contribuye y aprende con nosotros!
Cómo contribuir:
0. Dale una estrella al repositorio :)
1. Revisa la [guía para contribuidores](https://github.com/bluewave-labs/Checkmate/blob/develop/CONTRIBUTING.md). Se anima a los nuevos a revisar las etiquetas `good-first-issue`.
2. Consulta la [estructura del proyecto](https://docs.checkmate.so/checkmate-2.1/developers-guide/general-project-structure) y la [visión general](https://bluewavelabs.gitbook.io/checkmate/developers-guide/high-level-overview).
3. Lee una estructura detallada de [Checkmate](https://deepwiki.com/bluewave-labs/Checkmate) si deseas profundizar en la arquitectura.
4. Abre un issue si crees que has encontrado un error.
5. Revisa los issues con la etiqueta `good-first-issue` si eres nuevo.
6. Haz un pull request para añadir nuevas funciones, mejoras o correcciones.
<a href="https://github.com/bluewave-labs/checkmate/graphs/contributors">
<img src="https://contrib.rocks/image?repo=bluewave-labs/checkmate" />
</a>
[![Historial de estrellas](https://api.star-history.com/svg?repos=bluewave-labs/checkmate&type=Date)](https://star-history.com/#bluewave-labs/bluewave-uptime&Date)
## Patrocinadores
Gracias a [Gitbook](https://gitbook.io/) por darnos una cuenta gratuita para su plataforma de documentación, y a [Poeditor](https://poeditor.com/) por proporcionarnos una cuenta gratuita para servicios de traducción. Si deseas patrocinar Checkmate, por favor envía un correo a hello@bluewavelabs.ca
Si deseas patrocinar una función, [visita esta página](https://checkmate.so/sponsored-features).
También puedes revisar otros proyectos de BlueWave orientados a desarrolladores y contribuidores:
- [VerifyWise](https://github.com/bluewave-labs/verifywise), la primera plataforma de gobernanza de IA de código abierto.
- [DataRoom](https://github.com/bluewave-labs/bluewave-dataroom), una aplicación de intercambio de archivos seguro, también conocida como dataroom.
- [Guidefox](https://github.com/bluewave-labs/guidefox), una app que ayuda a nuevos usuarios a aprender a usar tu producto mediante pistas, tours, popups y banners.
+68 -26
View File
@@ -14,33 +14,58 @@
<p align="center"><strong>An open source uptime and infrastructure monitoring application</strong></p>
![dashboard](https://github.com/user-attachments/assets/252d6047-522b-4576-8f14-233510e464b8)
<img width="1660" alt="image" src="https://github.com/user-attachments/assets/b748f36d-a271-4965-ad0a-18bf153bbee7" />
This repository contains both the frontend and the backend of Checkmate, an open-source, self-hosted monitoring tool for tracking server hardware, uptime, response times, and incidents in real-time with beautiful visualizations. Checkmate regularly checks whether a server/website is accessible and performs optimally, providing real-time alerts and reports on the monitored services' availability, downtime, and response time.
Checkmate also has an agent, called [Capture](https://github.com/bluewave-labs/capture), to retrieve data from remote servers. While Capture is not required to run Checkmate, it provides additional insights about your servers' CPU, RAM, disk, and temperature status.
Checkmate also has an agent, called [Capture](https://github.com/bluewave-labs/capture), to retrieve data from remote servers. While Capture is not required to run Checkmate, it provides additional insights about your servers' CPU, RAM, disk, and temperature status. Capture can run on Linux, Windows, Mac, Raspberry Pi, or any device that can run Go.
Checkmate has been stress-tested with 1000+ active monitors without any particular issues or performance bottlenecks.
We **love** what we are building here, and we continuously learn a few things about Reactjs, Nodejs, MongoDB, and Docker while building Checkmate.
**If you would like to sponsor a feature, [see this link](https://checkmate.so/sponsored-features).**
## 📦 Demo
## 📚 Table of contents
- [📦 Demo](#demo)
- [🔗 User's guide](#users-guide)
- [🛠️ Installation](#installation)
- [🏁 Translations](#translations)
- [🚀 Performance](#performance)
- [💚 Questions & Ideas](#questions--ideas)
- [🧩 Features](#features)
- [🏗️ Screenshots](#screenshots)
- [🏗️ Tech stack](#tech-stack)
- [🔗 A few links](#a-few-links)
- [🤝 Contributing](#contributing)
- [💰 Our sponsors](#our-sponsors)
## Demo
You can see the latest build of [Checkmate](https://checkmate-demo.bluewavelabs.ca/) in action. The username is uptimedemo@demo.com and the password is Demouser1! (just a note that we update the demo server from time to time, so if it doesn't work for you, please ping us on the Discussions channel).
## 🔗 User's guide
## User's guide
Usage instructions can be found [here](https://docs.checkmate.so/checkmate-2.1). It's still WIP and some of the information there might be outdated as we continuously add features weekly. Rest assured, we are doing our best! :)
## 🛠️ Installation
## Installation
See installation instructions in [Checkmate documentation portal](https://docs.checkmate.so/checkmate-2.1/users-guide/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.
See installation instructions in [Checkmate documentation portal](https://docs.checkmate.so/checkmate-2.1/users-guide/quickstart).
## 🏁 Translations
Alternatively, you can also use [Coolify](https://coolify.io/), [Elestio](https://elest.io/open-source/checkmate), [K8s](./charts/helm/checkmate/INSTALLATION.md) or [Pikapods](https://www.pikapods.com/) to quickly spin off a Checkmate instance. 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.
### Using a Custom CA
If you need to monitor internal HTTPS endpoints with certificates from private Certificate Authorities (like Smallstep), see our [Custom CA Trust Guide](./docs/custom-ca-trust.md) for Docker configuration options.
For more documentation, see the [docs directory](./docs/).
## 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
## 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:
@@ -50,46 +75,61 @@ You can see the memory footprint of MongoDB and Redis on the same server (398Mb
![image](https://github.com/user-attachments/assets/3b469e85-e675-4040-a162-3f24c1afc751)
## 💚 Questions & Ideas
## Questions & Ideas
If you have any questions, suggestions or comments, please use our [Discord channel](https://discord.gg/NAb6H3UTjK). We've also launched our [Discussions](https://github.com/bluewave-labs/bluewave-uptime/discussions) page! Feel free to ask questions or share your ideas—we'd love to hear from you!
If you have any questions, suggestions or comments, you have several options:
## 🧩 Features
- [Discord channel](https://discord.gg/NAb6H3UTjK)
- [GitHub Discussions](https://github.com/bluewave-labs/bluewave-uptime/discussions)
- [Reddit group](https://www.reddit.com/r/CheckmateMonitoring/)
Feel free to ask questions or share your ideas - we'd love to hear from you!
## Features
- Completely open source, deployable on your servers or home devices (e.g Raspberry Pi 4 or 5)
- Website monitoring
- Page speed monitoring
- Infrastructure monitoring (memory, disk usage, CPU performance etc) - requires [Capture](https://github.com/bluewave-labs/capture)
- Infrastructure monitoring (memory, disk usage, CPU performance, network etc) - requires [Capture](https://github.com/bluewave-labs/capture) agent
- Docker monitoring
- Ping monitoring
- SSL monitoring
- Port monitoring
- Game server monitoring (3.0)
- Incidents at a glance
- Status pages
- E-mail, Webhooks, Discord, Telegram, Slack notifications
- E-mail, Webhooks, Discord and Slack notifications
- Scheduled maintenance
- JSON query monitoring
- Support for multiple languages
- Multi-language support for English, German, Japanese, Portuguese (Brazil), Russian, Turkish, Ukrainian, Vietnamese, Chinese (Traditional, Taiwan)
**Short term roadmap:** ([Milestone 2.2](https://github.com/bluewave-labs/Checkmate/milestone/8))
**Short term roadmap:**
- Plugins that will help Checkmate get any information from a remote service (e.g database, etc)
- Better notifications
- Network monitoring
- ..and a few more features
## 🏗️ Screenshots
If you would like to sponsor an additional feature, [see this page](https://checkmate.so/sponsored-features).
## Screenshots
<p>
<img width="2714" alt="server" src="https://github.com/user-attachments/assets/f7cb272a-69a6-48c5-93b0-249ecf20ecc6" />
<img width="1628" alt="image" src="https://github.com/user-attachments/assets/2eff6464-0738-4a32-9312-26e1e8e86275" />
</p>
<p>
<img width="2714" alt="uptime" src="https://github.com/user-attachments/assets/98ddc6c0-3384-47fd-96ce-7e53e6b688ac" />
<img width="1656" alt="image" src="https://github.com/user-attachments/assets/616c3563-c2a7-4ee4-af6c-7e6068955d1a" />
</p>
<p>
<img width="2714" alt="page speed" src="https://github.com/user-attachments/assets/b5589f79-da30-4239-9846-1f8bb2637ff9" />
</p><img width="1652" alt="image" src="https://github.com/user-attachments/assets/7912d7cf-0d0e-4f26-aa5c-2ad7170b5c99" />
</p>
<p>
<img width="1652" alt="image" src="https://github.com/user-attachments/assets/08c2c6ac-3a2f-44d1-a229-d1746a3f9d16" />
</p>
## 🏗️ Tech stack
## Tech stack
- [ReactJs](https://react.dev/)
- [MUI (React framework)](https://mui.com/)
@@ -105,11 +145,11 @@ If you have any questions, suggestions or comments, please use our [Discord chan
- Need a ping when there's a new release? Use [Newreleases](https://newreleases.io/), a free service to track releases.
- Watch a Checkmate [installation and usage video](https://www.youtube.com/watch?v=GfFOc0xHIwY)
## 🤝 Contributing
## Contributing
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), [Aryaman](https://github.com/Br0wnHammer) and [Mert](https://github.com/mertssmnoglu) helping individuals and businesses monitor their infra and servers.
We are [Alex](http://github.com/ajhollid) (team lead), [Gorkem](http://github.com/gorkem-bwl/), [Owaise](http://github.com/Owaiseimdad), [Aryaman](https://github.com/Br0wnHammer), [Mert](https://github.com/mertssmnoglu) and [Karen](https://github.com/karenvicent) 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 5800+ stars and attracted 70+ contributors from around the globe.
We pride ourselves on building strong connections with contributors at every level. Despite being a young project, Checkmate has already earned 7000+ stars and attracted 90+ contributors from around the globe.
Our repo is starred by employees from **Google, Microsoft, Intel, Cisco, Tencent, Electronic Arts, ByteDance, JP Morgan Chase, Deloitte, Accenture, Foxconn, Broadcom, China Telecom, Barclays, Capgemini, Wipro, Cloudflare, Dassault Systèmes and NEC**, so don’t hold back — jump in, contribute and learn with us!
@@ -127,11 +167,13 @@ Here's how you can contribute:
<img src="https://contrib.rocks/image?repo=bluewave-labs/checkmate" />
</a>
## 💰 Our sponsors
[![Star History Chart](https://api.star-history.com/svg?repos=bluewave-labs/checkmate&type=Date)](https://star-history.com/#bluewave-labs/bluewave-uptime&Date)
## Our sponsors
Thanks to [Gitbook](https://gitbook.io/) for giving us a free tier for their documentation platform, and [Poeditor](https://poeditor.com/) providing us a free account to use their i18n services. If you would like to sponsor Checkmate, please send an email to hello@bluewavelabs.ca
[![Star History Chart](https://api.star-history.com/svg?repos=bluewave-labs/checkmate&type=Date)](https://star-history.com/#bluewave-labs/bluewave-uptime&Date)
If you would like to sponsor a feature, [see this page](https://checkmate.so/sponsored-features).
Also check other developer and contributor-friendly projects of BlueWave:
+17
View File
@@ -0,0 +1,17 @@
.DS_Store
.git/
.gitignore
.bzr/
.bzrignore
.hg/
.hgignore
.svn/
*.swp
*.bak
*.tmp
*.orig
*~
.project
.idea/
*.tmproj
.vscode/
+6
View File
@@ -0,0 +1,6 @@
apiVersion: v2
name: checkmate-chart
description: A Helm chart for Checkmate App
type: application
version: 0.1.0
appVersion: "2.3"
+39
View File
@@ -0,0 +1,39 @@
# Kubernetes Installation Guide for Checkmate
This guide walks you through deploying Checkmate on your Kubernetes cluster using Helm.
## Prerequisites
- A running Kubernetes cluster
- Helm CLI installed and configured
- `kubectl` configured to access your cluster
## Steps
### 1. Clone the repo and navigate to the Helm chart
```bash
git clone https://github.com/bluewave-labs/checkmate.git
cd checkmate/charts/helm/checkmate
```
### 2. Customize values.yaml
Edit `values.yaml` to update:
- `client.ingress.host` and `server.ingress.host` with your domain names
- `server.protocol` (usually http or https)
- Secrets under the `secrets` section (`JWT_SECRET`, email credentials, API keys, etc.) — replace all change_me values
### 3. Deploy the Helm chart
```bash
helm install checkmate ./charts/helm/checkmate
```
This will deploy the client, server, MongoDB, and Redis components.
### 4. Verify the deployment
Check pods and services:
```bash
kubectl get pods
kubectl get svc
```
Once all pods are `Running` and `Ready`, you can access Checkmate via the configured ingress hosts.
@@ -0,0 +1,12 @@
{{- if eq .Values.client.ingress.host "change_me" }}
{{- fail "client.ingress.host must be overridden and not set to 'change_me'" }}
{{- end }}
{{- if eq .Values.server.ingress.host "change_me" }}
{{- fail "server.ingress.host must be overridden and not set to 'change_me'" }}
{{- end }}
{{- $protocol := .Values.server.protocol }}
{{- if not (or (eq $protocol "http") (eq $protocol "https")) }}
{{- fail "server.protocol must be either 'http' or 'https'" }}
{{- end }}
@@ -0,0 +1,22 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: client
spec:
replicas: 1
selector:
matchLabels:
app: client
template:
metadata:
labels:
app: client
spec:
containers:
- name: client
image: {{ .Values.client.image }}
ports:
- containerPort: {{ .Values.client.port }}
env:
- name: UPTIME_APP_API_BASE_URL
value: "{{ .Values.server.protocol }}://{{ .Values.server.ingress.host }}/api/v1"
@@ -0,0 +1,20 @@
{{- if .Values.client.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: client-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: {{ .Values.client.ingress.host }}
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: client
port:
number: {{ .Values.client.port }}
{{- end }}
@@ -0,0 +1,9 @@
apiVersion: v1
kind: Service
metadata:
name: client
spec:
selector:
app: client
ports:
- port: {{ .Values.client.port }}
@@ -0,0 +1,27 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongodb
spec:
replicas: 1
selector:
matchLabels:
app: mongodb
template:
metadata:
labels:
app: mongodb
spec:
containers:
- name: mongodb
image: {{ .Values.mongodb.image }}
ports:
- containerPort: {{ .Values.mongodb.port }}
command: ["mongod", "--quiet", "--bind_ip_all"]
volumeMounts:
- name: mongodb-data
mountPath: /data/db
volumes:
- name: mongodb-data
persistentVolumeClaim:
claimName: mongodb-pvc
@@ -0,0 +1,10 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mongodb-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: {{ .Values.persistence.mongodbSize }}
@@ -0,0 +1,9 @@
apiVersion: v1
kind: Service
metadata:
name: mongodb
spec:
selector:
app: mongodb
ports:
- port: {{ .Values.mongodb.port }}
@@ -0,0 +1,26 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: {{ .Values.redis.image }}
ports:
- containerPort: {{ .Values.redis.port }}
volumeMounts:
- name: redis-data
mountPath: /data
volumes:
- name: redis-data
persistentVolumeClaim:
claimName: redis-pvc
@@ -0,0 +1,10 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: redis-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: {{ .Values.persistence.redisSize }}
@@ -0,0 +1,9 @@
apiVersion: v1
kind: Service
metadata:
name: redis
spec:
selector:
app: redis
ports:
- port: {{ .Values.redis.port }}
@@ -0,0 +1,19 @@
{{- $secrets := .Values.secrets }}
{{- if or (not $secrets.JWT_SECRET) (eq $secrets.JWT_SECRET "change_me") }}
{{- fail "secrets.JWT_SECRET must be overridden and cannot be 'change_me'" }}
{{- end }}
{{- if or (not $secrets.REFRESH_TOKEN_SECRET) (eq $secrets.REFRESH_TOKEN_SECRET "change_me") }}
{{- fail "secrets.REFRESH_TOKEN_SECRET must be overridden and cannot be 'change_me'" }}
{{- end }}
apiVersion: v1
kind: Secret
metadata:
name: checkmate-secrets
type: Opaque
stringData:
{{- range $key, $value := $secrets }}
{{ $key }}: {{ $value | quote }}
{{- end }}
@@ -0,0 +1,22 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: server
spec:
replicas: 1
selector:
matchLabels:
app: server
template:
metadata:
labels:
app: server
spec:
containers:
- name: server
image: {{ .Values.server.image }}
ports:
- containerPort: {{ .Values.server.port }}
envFrom:
- secretRef:
name: checkmate-secrets
@@ -0,0 +1,25 @@
{{- if .Values.server.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: server-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-origin: "http://{{ .Values.client.ingress.host }},https://{{ .Values.client.ingress.host }}"
nginx.ingress.kubernetes.io/cors-allow-methods: "GET, PUT, POST, DELETE, PATCH, OPTIONS"
nginx.ingress.kubernetes.io/cors-allow-headers: "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization"
nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
spec:
rules:
- host: {{ .Values.server.ingress.host }}
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: server
port:
number: {{ .Values.server.port }}
{{- end }}
@@ -0,0 +1,9 @@
apiVersion: v1
kind: Service
metadata:
name: server
spec:
selector:
app: server
ports:
- port: {{ .Values.server.port }}
+41
View File
@@ -0,0 +1,41 @@
client:
image: ghcr.io/bluewave-labs/checkmate-client:v2.3
port: 80
ingress:
enabled: true
host: change_me
server:
image: ghcr.io/bluewave-labs/checkmate-backend:v2.3
port: 52345
protocol: change_me
ingress:
enabled: true
host: change_me
redis:
image: redis:7.2
port: 6379
mongodb:
image: mongo:7.0
port: 27017
secrets:
JWT_SECRET: change_me
REFRESH_TOKEN_SECRET: change_me
SYSTEM_EMAIL_ADDRESS: test@example.com
SYSTEM_EMAIL_PASSWORD: change_me
SYSTEM_EMAIL_HOST: smtp.example.com
SYSTEM_EMAIL_PORT: "587"
PAGESPEED_API_KEY: change_me
DB_CONNECTION_STRING: mongodb://mongodb:27017/uptime_db
REDIS_HOST: redis
REDIS_PORT: "6379"
DB_TYPE: MongoDB
TOKEN_TTL: 99d
REFRESH_TOKEN_TTL: 99d
persistence:
mongodbSize: 5Gi
redisSize: 1Gi
+4
View File
@@ -16,4 +16,8 @@ module.exports = {
"react-refresh/only-export-components": ["warn", { allowConstantExport: true }],
"react/no-unescaped-entities": "off",
},
globals: {
__APP_VERSION__: "readonly",
process: "readonly",
},
};
+246 -668
View File
File diff suppressed because it is too large. Load diff
+1 -8
View File
@@ -15,13 +15,11 @@
"dependencies": {
"@emotion/react": "^11.13.3",
"@emotion/styled": "^11.13.0",
"@fontsource/roboto": "^5.0.13",
"@hello-pangea/dnd": "^18.0.0",
"@mui/icons-material": "6.4.11",
"@mui/lab": "6.0.0-dev.240424162023-9968b4889d",
"@mui/material": "6.4.11",
"@mui/x-charts": "^7.5.1",
"@mui/x-data-grid": "7.29.0",
"@mui/x-date-pickers": "7.29.0",
"@reduxjs/toolkit": "2.7.0",
"axios": "^1.7.4",
@@ -29,14 +27,9 @@
"flag-icons": "7.3.2",
"html2canvas": "^1.4.1",
"i18next": "^24.2.2",
"immutability-helper": "^3.1.1",
"joi": "17.13.3",
"jwt-decode": "^4.0.0",
"maplibre-gl": "5.3.1",
"mui-color-input": "^6.0.0",
"react": "18.3.1",
"react-dnd": "^16.0.1",
"react-dnd-html5-backend": "^16.0.1",
"react-dom": "^18.2.0",
"react-i18next": "^15.4.0",
"react-icons": "5.5.0",
@@ -65,7 +58,7 @@
"eslint-plugin-react-hooks": "^5.0.0",
"eslint-plugin-react-refresh": "^0.4.6",
"prettier": "^3.3.3",
"vite": "^5.4.19"
"vite": "6.3.5"
},
"optionalDependencies": {
"@rollup/rollup-linux-arm64-musl": "4.41.0"
+5 -11
View File
@@ -10,6 +10,7 @@ import { logger } from "./Utils/Logger"; // Import the logger
import { networkService } from "./main";
import { Routes } from "./Routes";
import WalletProvider from "./Components/WalletProvider";
import AppLayout from "./Components/Layouts/AppLayout";
function App() {
const mode = useSelector((state) => state.ui.mode);
@@ -27,17 +28,10 @@ function App() {
<ThemeProvider theme={mode === "light" ? lightTheme : darkTheme}>
<WalletProvider>
<CssBaseline />
<GlobalStyles
styles={({ palette }) => {
return {
body: {
backgroundImage: `radial-gradient(circle, ${palette.gradient.color1}, ${palette.gradient.color2}, ${palette.gradient.color3}, ${palette.gradient.color4}, ${palette.gradient.color5})`,
color: palette.primary.contrastText,
},
};
}}
/>
<Routes />
<AppLayout>
<Routes />
</AppLayout>
<ToastContainer />
</WalletProvider>
</ThemeProvider>
+19 -29
View File
@@ -1,17 +1,18 @@
// Components
import IconButton from "@mui/material/IconButton";
import Menu from "@mui/material/Menu";
import MenuItem from "@mui/material/MenuItem";
import Settings from "../../assets/icons/settings-bold.svg?react";
import Dialog from "../../Components/Dialog";
// Utils
import { useState } from "react";
import { useSelector, useDispatch } from "react-redux";
import { useTheme } from "@emotion/react";
import { useNavigate } from "react-router-dom";
import { createToast } from "../../Utils/toastUtils";
import { logger } from "../../Utils/Logger";
import { IconButton, Menu, MenuItem } from "@mui/material";
import {
deleteUptimeMonitor,
pauseUptimeMonitor,
} from "../../Features/UptimeMonitors/uptimeMonitorsSlice";
import Settings from "../../assets/icons/settings-bold.svg?react";
import PropTypes from "prop-types";
import Dialog from "../../Components/Dialog";
import { usePauseMonitor, useDeleteMonitor } from "../../Hooks/monitorHooks";
const ActionsMenu = ({
monitor,
@@ -23,38 +24,27 @@ const ActionsMenu = ({
const [anchorEl, setAnchorEl] = useState(null);
const [actions, setActions] = useState({});
const [isOpen, setIsOpen] = useState(false);
const dispatch = useDispatch();
const theme = useTheme();
const { isLoading } = useSelector((state) => state.uptimeMonitors);
const [pauseMonitor, isPausing, error] = usePauseMonitor();
const [deleteMonitor, isDeleting] = useDeleteMonitor();
const handleRemove = async (event) => {
event.preventDefault();
event.stopPropagation();
let monitor = { _id: actions.id };
const action = await dispatch(deleteUptimeMonitor({ monitor }));
if (action.meta.requestStatus === "fulfilled") {
setIsOpen(false); // close modal
updateRowCallback();
createToast({ body: "Monitor deleted successfully." });
} else {
createToast({ body: "Failed to delete monitor." });
}
await deleteMonitor({ monitor });
updateRowCallback();
};
const handlePause = async () => {
try {
setIsLoading(true);
const action = await dispatch(pauseUptimeMonitor({ monitorId: monitor._id }));
if (pauseUptimeMonitor.fulfilled.match(action)) {
const state = action?.payload?.data.isActive === false ? "resumed" : "paused";
createToast({ body: `Monitor ${state} successfully.` });
pauseCallback();
} else {
throw new Error(action?.error?.message ?? "Failed to pause monitor.");
}
await pauseMonitor({ monitorId: monitor._id });
pauseCallback();
} catch (error) {
logger.error("Error pausing monitor:", monitor._id, error);
createToast({ body: "Failed to pause monitor." });
} finally {
setIsLoading(false);
}
};
@@ -210,7 +200,7 @@ const ActionsMenu = ({
e.stopPropagation();
handleRemove(e);
}}
isLoading={isLoading}
isLoading={isDeleting}
modelTitle="modal-delete-monitor"
modelDescription="delete-monitor-confirmation"
/>
+35
View File
@@ -0,0 +1,35 @@
import LeftArrow from "../../assets/icons/left-arrow.svg?react";
import LeftArrowDouble from "../../assets/icons/left-arrow-double.svg?react";
import LeftArrowLong from "../../assets/icons/left-arrow-long.svg?react";
import PropTypes from "prop-types";
const ArrowLeft = ({ type, color = "#667085", ...props }) => {
if (type === "double") {
return (
<LeftArrowDouble
style={{ color }}
{...props}
/>
);
} else if (type === "long") {
return (
<LeftArrowLong
style={{ color }}
{...props}
/>
);
} else {
return (
<LeftArrow
style={{ color }}
{...props}
/>
);
}
};
ArrowLeft.propTypes = {
color: PropTypes.string,
type: PropTypes.oneOf(["double", "long", "default"]),
};
export default ArrowLeft;
@@ -0,0 +1,28 @@
import RightArrow from "../../assets/icons/right-arrow.svg?react";
import RightArrowDouble from "../../assets/icons/right-arrow-double.svg?react";
import PropTypes from "prop-types";
const ArrowRight = ({ type, color = "#667085", ...props }) => {
if (type === "double") {
return (
<RightArrowDouble
style={{ color }}
{...props}
/>
);
} else {
return (
<RightArrow
style={{ color }}
{...props}
/>
);
}
};
ArrowRight.propTypes = {
type: PropTypes.oneOf(["double", "default"]),
color: PropTypes.string,
};
export default ArrowRight;
+3 -1
View File
@@ -15,7 +15,7 @@ import { useTheme } from "@emotion/react";
* <Avatar src="assets/img" first="Alex" last="Holliday" small />
*/
const Avatar = ({ src, small, sx }) => {
const Avatar = ({ src, small, sx, onClick = () => {} }) => {
const { user } = useSelector((state) => state.auth);
const theme = useTheme();
@@ -31,6 +31,7 @@ const Avatar = ({ src, small, sx }) => {
return (
<MuiAvatar
onClick={onClick}
alt={`${user?.firstName} ${user?.lastName}`}
/* TODO What is the /static/images/avatar/2.jpg ?*/
src={src ? src : user?.avatarImage ? image : "/static/images/avatar/2.jpg"}
@@ -66,6 +67,7 @@ Avatar.propTypes = {
src: PropTypes.string,
small: PropTypes.bool,
sx: PropTypes.object,
onClick: PropTypes.func,
};
export default Avatar;
+2 -3
View File
@@ -1,9 +1,8 @@
import PropTypes from "prop-types";
import { Box, Breadcrumbs as MUIBreadcrumbs } from "@mui/material";
import { useTheme } from "@emotion/react";
import { useNavigate } from "react-router";
import ArrowRight from "../../assets/icons/right-arrow.svg?react";
import { useNavigate } from "react-router-dom";
import ArrowRight from "../ArrowRight";
import "./index.css";
/**
@@ -43,7 +43,6 @@ const ChartBox = ({
>
<Stack
flex={1}
alignItems="center"
sx={{
padding: theme.spacing(8),
justifyContent,
@@ -1,8 +1,10 @@
import { useTheme } from "@emotion/react";
import { useEffect, useState, useMemo } from "react";
import Stack from "@mui/material/Stack";
import { Box, Typography } from "@mui/material";
import PropTypes from "prop-types";
import "./index.css";
import CircularProgress from "@mui/material/CircularProgress";
const MINIMUM_VALUE = 0;
const MAXIMUM_VALUE = 100;
@@ -15,19 +17,26 @@ const MAXIMUM_VALUE = 100;
* @param {number} [props.progress=0] - Progress percentage (0-100)
* @param {number} [props.radius=60] - Radius of the gauge circle
* @param {number} [props.strokeWidth=15] - Width of the gauge stroke
* @param {number} [props.threshold=50] - Threshold for color change
* @param {number} [props.precision=1] - Precision of the progress percentage
* @param {string} [props.unit="%"] - Unit of progress
*
* @example
* <CustomGauge
* progress={75}
* radius={50}
* strokeWidth={10}
* threshold={50}
* />
*
* @returns {React.ReactElement} Rendered CustomGauge component
*/
const CustomGauge = ({ progress = 0, radius = 70, strokeWidth = 15, threshold = 50 }) => {
const CustomGauge = ({
isLoading = false,
progress = 0,
radius = 70,
strokeWidth = 15,
precision = 1,
unit = "%",
}) => {
const theme = useTheme();
// Calculate the length of the stroke for the circle
const { circumference, totalSize, strokeLength } = useMemo(
@@ -52,10 +61,28 @@ const CustomGauge = ({ progress = 0, radius = 70, strokeWidth = 15, threshold =
const progressWithinRange = Math.max(MINIMUM_VALUE, Math.min(progress, MAXIMUM_VALUE));
const fillColor =
progressWithinRange > threshold
? theme.palette.error.lowContrast // CAIO_REVIEW
: theme.palette.accent.main; // CAIO_REVIEW
let fillColor;
if (progressWithinRange < 50) {
fillColor = theme.palette.success.main;
} else if (progressWithinRange < 80) {
fillColor = theme.palette.warning.lowContrast;
} else {
fillColor = theme.palette.error.lowContrast;
}
if (isLoading) {
return (
<Stack
className="radial-chart"
width={radius}
height={radius}
alignItems="center"
justifyContent="center"
>
<CircularProgress color="accent" />
</Stack>
);
}
return (
<Box
@@ -71,7 +98,7 @@ const CustomGauge = ({ progress = 0, radius = 70, strokeWidth = 15, threshold =
>
<circle
className="radial-chart-base"
stroke={theme.palette.secondary.light} // CAIO_REVIEW
stroke={theme.palette.secondary.light}
strokeWidth={strokeWidth}
fill="none"
cx={totalSize / 2} // Center the circle
@@ -103,7 +130,7 @@ const CustomGauge = ({ progress = 0, radius = 70, strokeWidth = 15, threshold =
fill: theme.typography.h2.color,
}}
>
{`${progressWithinRange.toFixed(1)}%`}
{`${progressWithinRange.toFixed(precision)}${unit}`}
</Typography>
</Box>
);
@@ -112,8 +139,10 @@ const CustomGauge = ({ progress = 0, radius = 70, strokeWidth = 15, threshold =
export default CustomGauge;
CustomGauge.propTypes = {
isLoading: PropTypes.bool,
progress: PropTypes.number,
radius: PropTypes.number,
strokeWidth: PropTypes.number,
threshold: PropTypes.number,
precision: PropTypes.number,
unit: PropTypes.string,
};
@@ -88,7 +88,51 @@ PercentTick.propTypes = {
*/
const getFormattedPercentage = (value) => {
if (typeof value !== "number") return value;
return `${(value * 100).toFixed(2)}.%`;
return `${(value * 100).toFixed(2)}%`;
};
/**
* Custom tick component for rendering network bytes per second.
*
* @param {Object} props - The properties object.
* @param {number} props.x - The x-coordinate for the tick.
* @param {number} props.y - The y-coordinate for the tick.
* @param {Object} props.payload - The payload object containing tick data.
* @param {number} props.index - The index of the tick.
* @returns {JSX.Element|null} The rendered tick component or null for the first tick.
*/
export const NetworkTick = ({ x, y, payload, index, formatter }) => {
const theme = useTheme();
if (index === 0) return null;
if (formatter === undefined) {
formatter = (value, space = false) => {
if (typeof value !== "number") return value;
// need to add space between value and unit
return `${(value / 1024).toFixed(1)}${space ? " " : ""}Kbps`;
};
}
return (
<Text
x={x - 20}
y={y}
textAnchor="middle"
fill={theme.palette.primary.contrastTextTertiary}
fontSize={11}
fontWeight={400}
>
{formatter(payload?.value, true)}
</Text>
);
};
NetworkTick.propTypes = {
x: PropTypes.number,
y: PropTypes.number,
payload: PropTypes.object,
index: PropTypes.number,
formatter: PropTypes.func,
};
/**
@@ -112,6 +156,7 @@ export const InfrastructureTooltip = ({
yLabel,
dotColor,
dateRange,
formatter = getFormattedPercentage,
}) => {
const uiTimezone = useSelector((state) => state.ui.timezone);
const theme = useTheme();
@@ -166,8 +211,8 @@ export const InfrastructureTooltip = ({
sx={{ opacity: 0.8 }}
>
{yIdx >= 0
? `${yLabel} ${getFormattedPercentage(payload[0].payload[hardwareType][yIdx][metric])}`
: `${yLabel} ${getFormattedPercentage(payload[0].payload[yKey])}`}
? `${yLabel} ${formatter(payload[0].payload[hardwareType][yIdx][metric])}`
: `${yLabel} ${formatter(payload[0].payload[yKey])}`}
</Typography>
</Stack>
</Box>
+3 -2
View File
@@ -51,9 +51,10 @@ const Check = ({ text, noHighlightText, variant = "info", outlined = false }) =>
sx={{
color:
variant === "info"
? theme.palette.primary.contrastTextTertiary
? theme.palette.primary.contrastTextSecondary
: colors[variant],
opacity: 0.8,
opacity: 0.9,
fontWeight: 450,
}}
>
{noHighlightText && <Typography component="span">{noHighlightText}</Typography>}{" "}
-3
View File
@@ -47,9 +47,6 @@ const AppAppBar = () => {
const location = useLocation();
const navigate = useNavigate();
// Debugging: Log the current theme mode
console.log("Current theme mode:", mode);
const logoSrc =
mode === "light" ? "/images/prism-black.png" : "/images/prism-white.png";
+8 -4
View File
@@ -4,15 +4,14 @@ const ConfigBox = styled(Stack)(({ theme }) => ({
display: "flex",
flexDirection: "row",
justifyContent: "space-between",
gap: theme.spacing(20),
backgroundColor: theme.palette.primary.main,
border: 1,
borderStyle: "solid",
borderColor: theme.palette.primary.lowContrast,
borderRadius: theme.spacing(2),
"& > *": {
paddingTop: theme.spacing(12),
paddingBottom: theme.spacing(18),
paddingTop: theme.spacing(15),
paddingBottom: theme.spacing(15),
},
"& > div:first-of-type": {
flex: 0.7,
@@ -21,11 +20,16 @@ const ConfigBox = styled(Stack)(({ theme }) => ({
borderRightColor: theme.palette.primary.lowContrast,
paddingRight: theme.spacing(15),
paddingLeft: theme.spacing(15),
backgroundColor: theme.palette.tertiary.background,
"& :is(h1, h2):first-of-type": {
fontWeight: 600,
marginBottom: theme.spacing(4),
},
},
"& > div:last-of-type": {
flex: 1,
paddingRight: theme.spacing(20),
paddingLeft: theme.spacing(18),
paddingLeft: theme.spacing(20),
},
"& h1, & h2": {
color: theme.palette.primary.contrastTextSecondary,
+1 -1
View File
@@ -57,7 +57,7 @@ Dialog.propTypes = {
onCancel: PropTypes.func.isRequired,
confirmationButtonLabel: PropTypes.string.isRequired,
onConfirm: PropTypes.func.isRequired,
isLoading: PropTypes.bool.isRequired,
isLoading: PropTypes.bool,
};
export default Dialog;
@@ -0,0 +1,44 @@
import { Button, Stack } from "@mui/material";
import { useTheme } from "@mui/material/styles";
import { useNavigate } from "react-router-dom";
import { useTranslation } from "react-i18next";
import PropTypes from "prop-types";
const FallbackActionButtons = ({ link, type }) => {
const theme = useTheme();
const navigate = useNavigate();
const { t } = useTranslation();
return (
<Stack
gap={theme.spacing(10)}
alignItems="center"
>
<Button
variant="contained"
color="accent"
sx={{ fontWeight: 700 }}
onClick={() => navigate(link)}
>
{t(`${type}.fallback.actionButton`)}
</Button>
{type === "uptimeMonitor" && (
<Button
variant="contained"
color="accent"
sx={{ alignSelf: "center" }}
onClick={() => navigate("/uptime/bulk-import")}
>
{t("bulkImport.fallbackPage")}
</Button>
)}
</Stack>
);
};
FallbackActionButtons.propTypes = {
title: PropTypes.string.isRequired,
link: PropTypes.string.isRequired,
type: PropTypes.string.isRequired,
};
export default FallbackActionButtons;
@@ -0,0 +1,40 @@
import { useTheme } from "@emotion/react";
import Box from "@mui/material/Box";
import Background from "../../assets/Images/background-grid.svg?react";
import SkeletonDark from "../../assets/Images/create-placeholder-dark.svg?react";
import OutputAnimation from "../../assets/Animations/output.gif";
import DarkmodeOutput from "../../assets/Animations/darkmodeOutput.gif";
import { useSelector } from "react-redux";
const FallbackBackground = () => {
const theme = useTheme();
const mode = useSelector((state) => state.ui.mode);
return (
<>
<Box
component="img"
src={mode === "light" ? OutputAnimation : DarkmodeOutput}
Background="transparent"
alt="Loading animation"
sx={{
zIndex: 1,
border: "none",
borderRadius: theme.spacing(8),
width: "100%",
transform: "scale(0.6667)",
}}
/>
<Box
className="background-pattern-svg"
sx={{
"& svg g g:last-of-type path": {
stroke: theme.palette.primary.lowContrast,
},
}}
>
<Background style={{ width: "100%" }} />
</Box>
</>
);
};
export default FallbackBackground;
@@ -0,0 +1,35 @@
import PropTypes from "prop-types";
import { useTheme } from "@mui/material/styles";
import Box from "@mui/material/Box";
import Stack from "@mui/material/Stack";
import Check from "../Check/Check";
const FallbackCheckList = ({ checks, type }) => {
const theme = useTheme();
return (
<Box
sx={{
display: "flex",
flexWrap: "wrap",
gap: theme.spacing(2),
alignItems: "flex-start",
maxWidth: { xs: "90%", md: "80%", lg: "75%" },
}}
>
{checks?.map((check, index) => (
<Check
text={check}
key={`${type.trim().split(" ")[0]}-${index}`}
outlined={true}
/>
))}
</Box>
);
};
FallbackCheckList.propTypes = {
checks: PropTypes.arrayOf(PropTypes.string).isRequired,
title: PropTypes.string.isRequired,
type: PropTypes.string.isRequired,
};
export default FallbackCheckList;
@@ -0,0 +1,44 @@
import { useTheme } from "@emotion/react";
import { Box, Stack } from "@mui/material";
import PropTypes from "prop-types";
const FallbackContainer = ({ children, type }) => {
const theme = useTheme();
return (
<Box
border={1}
borderColor={theme.palette.tertiary.border}
borderRadius={theme.shape.borderRadius}
backgroundColor={theme.palette.tertiary.background}
overflow="hidden"
sx={{
display: "flex",
borderStyle: "dashed",
height: "fit-content",
minHeight: "60vh",
width: {
sm: "90%",
md: "70%",
lg: "50%",
xl: "40%",
},
padding: `${theme.spacing(20)} ${theme.spacing(10)}`,
}}
>
<Stack
className={`fallback__${type?.trim().split(" ")[0]}`}
alignItems="center"
gap={theme.spacing(20)}
>
{children}
</Stack>
</Box>
);
};
FallbackContainer.propTypes = {
children: PropTypes.node,
type: PropTypes.string,
};
export default FallbackContainer;
@@ -0,0 +1,69 @@
import Box from "@mui/material/Box";
import { useTheme } from "@mui/material/styles";
import Link from "@mui/material/Link";
import { Link as RouterLink } from "react-router-dom";
import { useTranslation } from "react-i18next";
import Alert from "../Alert";
import PropTypes from "prop-types";
const renderWarningMessage = (t) => {
return (
<>
{t("pageSpeedWarning")}{" "}
<Link
component={RouterLink}
to="/settings"
sx={{
textDecoration: "underline",
color: "inherit",
fontWeight: "inherit",
"&:hover": {
textDecoration: "underline",
},
}}
>
{t("pageSpeedLearnMoreLink")}
</Link>{" "}
{t("pageSpeedAddApiKey")}
</>
);
};
const FallbackPageSpeedWarning = ({ settingsData }) => {
const theme = useTheme();
const { t } = useTranslation();
return (
<Box sx={{ width: "80%", maxWidth: "600px", zIndex: 1 }}>
<Box
sx={{
"& .alert.row-stack": {
backgroundColor: theme.palette.warningSecondary.main,
borderColor: theme.palette.warningSecondary.lowContrast,
"& .MuiTypography-root": {
color: theme.palette.warningSecondary.contrastText,
},
"& .MuiBox-root > svg": {
color: theme.palette.warningSecondary.contrastText,
},
},
}}
>
{settingsData?.pagespeedKeySet === false && (
<Alert
variant="warning"
hasIcon={true}
body={renderWarningMessage(t)}
/>
)}
</Box>
</Box>
);
};
FallbackPageSpeedWarning.propTypes = {
settingsData: PropTypes.shape({
pagespeedKeySet: PropTypes.bool,
}),
};
export default FallbackPageSpeedWarning;
@@ -0,0 +1,21 @@
import { useTheme } from "@mui/material/styles";
import { Typography } from "@mui/material";
import PropTypes from "prop-types";
const FallbackTitle = ({ title }) => {
const theme = useTheme();
return (
<Typography
alignSelf="center"
component="h1"
marginY={theme.spacing(4)}
color={theme.palette.primary.contrastText}
>
{title}
</Typography>
);
};
FallbackTitle.propTypes = {
title: PropTypes.string.isRequired,
};
export default FallbackTitle;
+4 -4
View File
@@ -1,19 +1,22 @@
[class*="fallback__"] {
width: fit-content;
margin: auto;
margin-top: 100px;
}
[class*="fallback__"] h1.MuiTypography-root {
font-size: var(--env-var-font-size-large);
font-weight: 600;
}
[class*="fallback__"] button.MuiButtonBase-root,
[class*="fallback__"] .check {
width: max-content;
}
[class*="fallback__"] button.MuiButtonBase-root {
min-height: 34px;
}
[class*="fallback__"] .check span.MuiTypography-root,
[class*="fallback__"] button.MuiButtonBase-root {
font-size: var(--env-var-font-size-medium);
@@ -35,6 +38,3 @@
background-size: cover;
background-repeat: no-repeat;
}
.fallback__status > .MuiStack-root {
margin-left: var(--env-var-spacing-2);
}
+37 -148
View File
@@ -1,186 +1,75 @@
import PropTypes from "prop-types";
import { useTheme } from "@emotion/react";
import { Box, Button, Stack, Typography, Link } from "@mui/material";
import { Link as RouterLink } from "react-router-dom";
import Skeleton from "../../assets/Images/create-placeholder.svg?react";
import SkeletonDark from "../../assets/Images/create-placeholder-dark.svg?react";
import Background from "../../assets/Images/background-grid.svg?react";
import Check from "../Check/Check";
import { useNavigate } from "react-router-dom";
import { useSelector } from "react-redux";
import Alert from "../Alert";
import { useTranslation } from "react-i18next";
import { Box, Stack } from "@mui/material";
import "./index.css";
import { useFetchSettings } from "../../Hooks/useFetchSettings";
import { useState } from "react";
import FallbackTitle from "./FallbackTitle";
import FallbackCheckList from "./FallbackCheckList";
import FallbackActionButtons from "./FallBackActionButtons";
import FallbackBackground from "./FallbackBackground";
import FallbackContainer from "./FallbackContainer";
/**
* Fallback component to display a fallback UI with a title, a list of checks, and a navigation button.
*
* @param {Object} props - The component props.
* @param {string} props.title - The title to be displayed in the fallback UI.
* @param {string} props.type - The type of the fallback (e.g., "pageSpeed", "notifications").
* @param {Array<string>} props.checks - An array of strings representing the checks to display.
* @param {string} [props.link="/"] - The link to navigate to.
* @param {boolean} [props.vowelStart=false] - Whether the title starts with a vowel.
* @param {boolean} [props.showPageSpeedWarning=false] - Whether to show the PageSpeed API warning.
* @returns {JSX.Element} The rendered fallback UI.
*/
const Fallback = ({
title,
checks,
link = "/",
isAdmin,
vowelStart = false,
showPageSpeedWarning = false,
}) => {
const Fallback = ({ title, checks, link = "/", isAdmin, type, children }) => {
const theme = useTheme();
const navigate = useNavigate();
const mode = useSelector((state) => state.ui.mode);
const { t } = useTranslation();
const [settingsData, setSettingsData] = useState(undefined);
const [isLoading, error] = useFetchSettings({ setSettingsData });
// Custom warning message with clickable link
const renderWarningMessage = () => {
return (
<>
{t("pageSpeedWarning")}{" "}
<Link
component={RouterLink}
to="/settings"
sx={{
textDecoration: "underline",
color: "inherit",
fontWeight: "inherit",
"&:hover": {
textDecoration: "underline",
},
}}
>
{t("pageSpeedLearnMoreLink")}
</Link>{" "}
{t("pageSpeedAddApiKey")}
</>
);
};
return (
<Box
position="relative"
border={1}
borderColor={theme.palette.primary.lowContrast}
borderRadius={theme.shape.borderRadius}
backgroundColor={theme.palette.primary.main}
overflow="hidden"
sx={{
borderStyle: "dashed",
minHeight: "calc(100vh - var(--env-var-spacing-2) * 2)",
height: "100%",
width: "100%",
display: "flex",
justifyContent: "center",
alignItems: "center",
}}
>
<Stack
className={`fallback__${title?.trim().split(" ")[0]}`}
alignItems="center"
gap={theme.spacing(20)}
>
{mode === "light" ? (
<Skeleton style={{ zIndex: 1 }} />
) : (
<SkeletonDark style={{ zIndex: 1 }} />
)}
<Box
className="background-pattern-svg"
sx={{
"& svg g g:last-of-type path": {
stroke: theme.palette.primary.lowContrast,
},
}}
>
<Background style={{ width: "100%" }} />
</Box>
<FallbackContainer type={type}>
<FallbackBackground />
<Stack
gap={theme.spacing(4)}
maxWidth={"300px"}
gap={theme.spacing(5)}
zIndex={1}
alignItems="center"
>
<Typography
component="h1"
marginY={theme.spacing(4)}
color={theme.palette.primary.contrastTextTertiary}
>
{vowelStart ? "An" : "A"} {title} is used to:
</Typography>
{checks?.map((check, index) => (
<Check
text={check}
key={`${title.trim().split(" ")[0]}-${index}`}
outlined={true}
/>
))}
<FallbackTitle title={title} />
<FallbackCheckList
checks={checks}
title={title}
type={type}
/>
</Stack>
{/* TODO - display a different fallback if user is not an admin*/}
{isAdmin && (
<>
<Button
variant="contained"
color="accent"
sx={{ alignSelf: "center" }}
onClick={() => navigate(link)}
>
Let's create your first {title}
</Button>
{/* Bulk create of uptime monitors */}
{title === "uptime monitor" && (
<Button
variant="contained"
color="accent"
sx={{ alignSelf: "center" }}
onClick={() => navigate("/uptime/bulk-import")}
>
{t("bulkImport.fallbackPage")}
</Button>
)}
{/* Warning box for PageSpeed monitor */}
{title === "pagespeed monitor" && showPageSpeedWarning && (
<Box sx={{ width: "80%", maxWidth: "600px", zIndex: 1 }}>
<Box
sx={{
"& .alert.row-stack": {
backgroundColor: theme.palette.warningSecondary.main,
borderColor: theme.palette.warningSecondary.lowContrast,
"& .MuiTypography-root": {
color: theme.palette.warningSecondary.contrastText,
},
"& .MuiBox-root > svg": {
color: theme.palette.warningSecondary.contrastText,
},
},
}}
>
{settingsData?.pagespeedKeySet === false && (
<Alert
variant="warning"
hasIcon={true}
body={renderWarningMessage()}
/>
)}
</Box>
</Box>
)}
</>
<Stack
gap={theme.spacing(10)}
alignItems="center"
>
<FallbackActionButtons
title={title}
link={link}
type={type}
/>
{children}
</Stack>
)}
</Stack>
</FallbackContainer>
</Box>
);
};
Fallback.propTypes = {
title: PropTypes.string.isRequired,
checks: PropTypes.arrayOf(PropTypes.string).isRequired,
link: PropTypes.string,
isAdmin: PropTypes.bool,
vowelStart: PropTypes.bool,
showPageSpeedWarning: PropTypes.bool,
type: PropTypes.string.isRequired,
children: PropTypes.node,
};
export default Fallback;
@@ -1,8 +1,11 @@
import { Typography } from "@mui/material";
import { useTheme } from "@emotion/react";
import { useTranslation } from "react-i18next";
const NetworkError = () => {
const theme = useTheme();
const { t } = useTranslation();
return (
<>
<Typography
@@ -10,9 +13,9 @@ const NetworkError = () => {
marginY={theme.spacing(4)}
color={theme.palette.primary.contrastTextTertiary}
>
Network error
{t("common.toasts.networkError")}
</Typography>
<Typography>Please check your connection</Typography>
<Typography>{t("common.toasts.checkConnection")}</Typography>
</>
);
};
@@ -1,7 +1,7 @@
import { useTheme } from "@emotion/react";
import { Box, Stack } from "@mui/material";
import Skeleton from "../../assets/Images/create-placeholder.svg?react";
import SkeletonDark from "../../assets/Images/create-placeholder-dark.svg?react";
import OutputAnimation from "../../assets/Animations/output.gif";
import DarkmodeOutput from "../../assets/Animations/darkmodeOutput.gif";
import Background from "../../assets/Images/background-grid.svg?react";
import { useSelector } from "react-redux";
@@ -37,11 +37,18 @@ const GenericFallback = ({ children }) => {
marginTop: "100px",
}}
>
{mode === "light" ? (
<Skeleton style={{ zIndex: 1 }} />
) : (
<SkeletonDark style={{ zIndex: 1 }} />
)}
<Box
component="img"
src={mode === "light" ? OutputAnimation : DarkmodeOutput}
Background="transparent"
alt="Loading animation"
sx={{
zIndex: 1,
border: "none",
borderRadius: theme.spacing(8),
width: "100%",
}}
/>
<Box
sx={{
"& svg g g:last-of-type path": {
+15 -3
View File
@@ -1,4 +1,4 @@
import { useEffect } from "react";
import { useEffect, useState } from "react";
import { useNavigate } from "react-router-dom";
import { logger } from "../../Utils/Logger";
@@ -7,23 +7,35 @@ import { networkService } from "../../main";
const withAdminCheck = (WrappedComponent) => {
const WithAdminCheck = (props) => {
const navigate = useNavigate();
const [isChecking, setIsChecking] = useState(true);
const [superAdminExists, setSuperAdminExists] = useState(false);
useEffect(() => {
networkService
.doesSuperAdminExist()
.then((response) => {
if (response.data.data === true) {
if (response?.data?.data === true) {
navigate("/login");
} else {
setSuperAdminExists(false);
}
})
.catch((error) => {
logger.error(error);
})
.finally(() => {
setIsChecking(false);
});
}, [navigate]);
if (isChecking) {
return null;
}
return (
<WrappedComponent
{...props}
isSuperAdmin={true}
superAdminExists={superAdminExists}
/>
);
};
@@ -0,0 +1,16 @@
import i18n from "../../Utils/i18n";
import { useSelector } from "react-redux";
import { useEffect } from "react";
const I18nLoader = () => {
const language = useSelector((state) => state.ui.language);
useEffect(() => {
if (language && i18n.language !== language) {
i18n.changeLanguage(language);
}
}, [language]);
return null;
};
export default I18nLoader;
@@ -105,7 +105,7 @@ const Checkbox = ({
};
Checkbox.propTypes = {
id: PropTypes.string.isRequired,
id: PropTypes.string,
name: PropTypes.string,
label: PropTypes.oneOfType([PropTypes.string, PropTypes.node]).isRequired,
size: PropTypes.oneOf(["small", "medium", "large"]),
@@ -0,0 +1,51 @@
import { Stack, Typography } from "@mui/material";
import PropTypes from "prop-types";
import { useTheme } from "@emotion/react";
const DEFAULT_GAP = 6;
const FieldWrapper = ({
label,
children,
gap,
labelMb,
labelFontWeight = 500,
labelVariant = "h3",
labelSx = {},
sx = {},
}) => {
const theme = useTheme();
return (
<Stack
gap={gap ?? theme.spacing(DEFAULT_GAP)}
sx={sx}
>
{label && (
<Typography
component={labelVariant}
color={theme.palette.primary.contrastTextSecondary}
fontWeight={labelFontWeight}
sx={{
...(labelMb !== undefined && { mb: theme.spacing(labelMb) }),
...labelSx,
}}
>
{label}
</Typography>
)}
{children}
</Stack>
);
};
FieldWrapper.propTypes = {
label: PropTypes.node,
children: PropTypes.node.isRequired,
gap: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.object]),
labelMb: PropTypes.number,
labelFontWeight: PropTypes.number,
labelVariant: PropTypes.string,
labelSx: PropTypes.object,
sx: PropTypes.object,
};
export default FieldWrapper;
+37 -14
View File
@@ -16,26 +16,37 @@ import "./index.css";
* size="small"
* />
*
* @param {Object} props - The component props.
* @param {string} props.id - The id of the radio button.
* @param {string} props.title - The title of the radio button.
* @param {string} [props.desc] - The description of the radio button.
* @param {string} [props.size="small"] - The size of the radio button.
* @param {Object} props - The component
* @param {string} id - The id of the radio button.
* @param {string} title - The title of the radio button.
* @param {string} [desc] - The description of the radio button.
* @param {string} [size="small"] - The size of the radio button.
* @returns {JSX.Element} - The rendered Radio component.
*/
const Radio = (props) => {
const Radio = ({
name,
checked,
value,
id,
size,
title,
desc,
onChange,
labelSpacing,
}) => {
const theme = useTheme();
return (
<FormControlLabel
className="custom-radio-button"
checked={props.checked}
value={props.value}
name={name}
checked={checked}
value={value}
control={
<MUIRadio
id={props.id}
size={props.size}
id={id}
size={size}
checkedIcon={<RadioChecked />}
sx={{
color: "transparent",
@@ -49,16 +60,23 @@ const Radio = (props) => {
}}
/>
}
onChange={props.onChange}
onChange={onChange}
label={
<>
<Typography component="p">{props.title}</Typography>
<Typography
component="p"
mb={
labelSpacing !== undefined ? theme.spacing(labelSpacing) : theme.spacing(2)
}
>
{title}
</Typography>
<Typography
component="h6"
mt={theme.spacing(1)}
color={theme.palette.primary.contrastTextSecondary}
>
{props.desc}
{desc}
</Typography>
</>
}
@@ -81,9 +99,14 @@ const Radio = (props) => {
};
Radio.propTypes = {
title: PropTypes.string.isRequired,
title: PropTypes.string,
desc: PropTypes.string,
size: PropTypes.string,
name: PropTypes.string,
checked: PropTypes.bool,
value: PropTypes.string,
id: PropTypes.string,
onChange: PropTypes.func,
};
export default Radio;
+120 -40
View File
@@ -1,7 +1,17 @@
import PropTypes from "prop-types";
import { Box, ListItem, Autocomplete, TextField, Stack, Typography } from "@mui/material";
import {
Box,
ListItem,
Autocomplete,
TextField,
Typography,
Checkbox,
} from "@mui/material";
import { useTheme } from "@emotion/react";
import SearchIcon from "../../../assets/icons/search.svg?react";
import React, { useEffect } from "react";
import { useTranslation } from "react-i18next";
import FieldWrapper from "../FieldWrapper";
/**
* Search component using Material UI's Autocomplete.
@@ -14,6 +24,7 @@ import SearchIcon from "../../../assets/icons/search.svg?react";
* @param {Function} props.handleChange - Function to call when the input changes
* @param {Function} Prop.onBlur - Function to call when the input is blured
* @param {Object} props.sx - Additional styles to apply to the component
* @param {string} props.unit - Label to identify type of options
* @returns {JSX.Element} The rendered Search component
*/
@@ -21,7 +32,6 @@ const SearchAdornment = () => {
const theme = useTheme();
return (
<Box
mr={theme.spacing(4)}
height={16}
sx={{
"& svg": {
@@ -39,7 +49,7 @@ const SearchAdornment = () => {
);
};
//TODO keep search state inside of component
//TODO keep search state inside of component.
const Search = ({
label,
id,
@@ -58,38 +68,96 @@ const Search = ({
startAdornment,
endAdornment,
onBlur,
//FieldWrapper's props
gap,
labelMb,
labelFontWeight,
labelVariant,
labelSx = {},
unit = "option",
maxWidth = "100%",
}) => {
const theme = useTheme();
const { t } = useTranslation();
const [selectAll, setSelectAll] = React.useState(false);
const [open, setOpen] = React.useState(false);
const enhancedOptions = React.useMemo(() => {
return multiple && isAdorned
? [
{ [filteredBy]: t("selectAll"), isSelectAll: true, _id: "select_all" },
...options,
]
: options;
}, [multiple, isAdorned, options, filteredBy]);
const isOptionSelected = (option) => {
if (!multiple && !isAdorned) return false;
if (Array.isArray(value)) {
return value.some((item) => item._id === option._id);
}
return false;
};
const handleSelectAll = (isSelectAll) => {
const newValue = isSelectAll ? [...options] : [];
handleChange(newValue);
setSelectAll(isSelectAll);
};
useEffect(() => {
const allSelected =
Array.isArray(value) && Array.isArray(options) && value.length === options.length;
if (selectAll !== allSelected) setSelectAll(allSelected);
}, [value, options]);
return (
<Autocomplete
onBlur={onBlur}
multiple={multiple}
id={id}
value={value}
open={open}
onOpen={() => setOpen(true)}
onClose={(event, reason) => {
if (reason === "blur" || reason === "escape") {
setOpen(false);
}
}}
inputValue={inputValue}
onInputChange={(_, newValue) => {
handleInputChange(newValue);
}}
onChange={(_, newValue) => {
handleChange(newValue);
if (multiple && isAdorned) {
const hasSelectAllSelected =
Array.isArray(newValue) && newValue.some((item) => item.isSelectAll);
if (hasSelectAllSelected) {
handleSelectAll(!selectAll);
} else {
handleChange(newValue);
setSelectAll(Array.isArray(newValue) && newValue.length === options.length);
}
} else {
handleChange(newValue);
setOpen(false);
}
}}
fullWidth
freeSolo
disabled={disabled}
disableClearable
options={options}
options={enhancedOptions}
getOptionLabel={(option) => option[filteredBy]}
isOptionEqualToValue={(option, value) => option._id === value._id} // Compare by unique identifier
renderInput={(params) => (
<Stack>
<Typography
component="h3"
fontSize={"var(--env-var-font-size-medium)"}
color={theme.palette.primary.contrastTextSecondary}
fontWeight={500}
>
{label}
</Typography>
<FieldWrapper
label={label}
labelMb={labelMb}
labelVariant={labelVariant}
labelFontWeight={labelFontWeight}
labelSx={labelSx}
gap={gap}
sx={{
...sx,
}}
>
<TextField
{...params}
error={Boolean(error)}
@@ -102,27 +170,7 @@ const Search = ({
...(endAdornment && { endAdornment: endAdornment }),
},
}}
sx={{
"& fieldset": {
borderColor: theme.palette.primary.lowContrast,
borderRadius: theme.shape.borderRadius,
},
"& .MuiOutlinedInput-root:hover:not(:has(input:focus)):not(:has(textarea:focus)) fieldset":
{
borderColor: theme.palette.primary.lowContrast,
},
"& .MuiOutlinedInput-root": {
paddingY: 0,
},
"& .MuiAutocomplete-tag": {
// CAIO_REVIEW
color: theme.palette.primary.contrastText,
backgroundColor: theme.palette.primary.lowContrast,
},
"& .MuiChip-deleteIcon": {
color: theme.palette.primary.contrastText, // CAIO_REVIEW
},
}}
sx={{}}
/>
{error && (
<Typography
@@ -137,15 +185,23 @@ const Search = ({
{error}
</Typography>
)}
</Stack>
</FieldWrapper>
)}
filterOptions={(options, { inputValue }) => {
if (inputValue.trim() === "" && multiple && isAdorned) {
return enhancedOptions;
}
const filtered = options.filter((option) =>
option[filteredBy].toLowerCase().includes(inputValue.toLowerCase())
);
if (filtered.length === 0) {
return [{ [filteredBy]: "No monitors found", noOptions: true }];
return [
{
[filteredBy]: t("general.noOptionsFound", { unit: unit }),
noOptions: true,
},
];
}
return filtered;
}}
@@ -156,6 +212,7 @@ const Search = ({
const { key, ...optionProps } = props;
const hasSecondaryLabel = secondaryLabel && option[secondaryLabel] !== undefined;
const port = option["port"];
const selected = isOptionSelected(option);
return (
<ListItem
key={key}
@@ -166,9 +223,29 @@ const Search = ({
pointerEvents: "none",
backgroundColor: theme.palette.primary.main,
}
: {}
: option.isSelectAll
? {
fontWeight: "bold",
backgroundColor: theme.palette.primary.light,
"&:hover": {
backgroundColor: theme.palette.primary.light,
},
}
: {}
}
>
{multiple && isAdorned && !option.noOptions && (
<Checkbox
checked={option.isSelectAll ? selectAll : selected}
sx={{
color: theme.palette.primary.contrastTextSecondary,
"&.Mui-checked": {
color: theme.palette.secondary.main,
},
padding: 0,
}}
/>
)}
{option[filteredBy] +
(hasSecondaryLabel
? ` (${option[secondaryLabel]}${port ? `: ${port}` : ""})`
@@ -205,7 +282,9 @@ const Search = ({
}}
sx={{
/* height: 34,*/
"&.MuiAutocomplete-root .MuiAutocomplete-input": { p: 0 },
"&.MuiAutocomplete-root .MuiAutocomplete-input": {
padding: `0 ${theme.spacing(5)}`,
},
...sx,
}}
/>
@@ -219,7 +298,7 @@ Search.propTypes = {
options: PropTypes.array.isRequired,
filteredBy: PropTypes.string.isRequired,
secondaryLabel: PropTypes.string,
value: PropTypes.array,
value: PropTypes.oneOfType([PropTypes.array, PropTypes.object]),
inputValue: PropTypes.string.isRequired,
handleInputChange: PropTypes.func.isRequired,
handleChange: PropTypes.func,
@@ -230,6 +309,7 @@ Search.propTypes = {
startAdornment: PropTypes.object,
endAdornment: PropTypes.object,
onBlur: PropTypes.func,
unit: PropTypes.string,
};
export default Search;
+36 -19
View File
@@ -2,6 +2,7 @@ import PropTypes from "prop-types";
import { useTheme } from "@emotion/react";
import { MenuItem, Select as MuiSelect, Stack, Typography } from "@mui/material";
import KeyboardArrowDownIcon from "@mui/icons-material/KeyboardArrowDown";
import FieldWrapper from "../FieldWrapper";
import "./index.css";
@@ -12,9 +13,9 @@ import "./index.css";
* @param {string} props.placeholder - The label of the select element.
* @param {string} props.placeholder - The placeholder text when no option is selected.
* @param {boolean} props.isHidden - Whether the placeholder should be hidden.
* @param {string} props.value - The currently selected value.
* @param {(string | number | boolean)} props.value - The currently selected value.
* @param {object[]} props.items - The array of items to populate in the select dropdown.
* @param {(string | number)} props.items._id - The unique identifier of each item.
* @param {(string | number | boolean)} props.items._id - The unique identifier of each item.
* @param {string} props.items.name - The display name of each item.
* @param {function} props.onChange - The function to handle onChange event.
* @param {object} props.sx - The custom styles object for MUI Select component.
@@ -49,9 +50,16 @@ const Select = ({
onChange,
onBlur,
sx,
error = false,
name = "",
labelControlSpacing = 2,
labelControlSpacing = 6,
maxWidth,
//FieldWrapper's props
labelMb,
labelFontWeight,
labelVariant,
labelSx = {},
fieldWrapperSx = {},
}) => {
const theme = useTheme();
const itemStyles = {
@@ -69,26 +77,24 @@ const Select = ({
};
return (
<Stack
gap={theme.spacing(labelControlSpacing)}
className="select-wrapper"
<FieldWrapper
label={label}
labelMb={labelMb}
labelVariant={labelVariant}
labelFontWeight={labelFontWeight}
labelSx={labelSx}
gap={labelControlSpacing}
sx={{
...fieldWrapperSx,
}}
>
{label && (
<Typography
component="h3"
color={theme.palette.primary.contrastTextSecondary}
fontWeight={500}
fontSize={13}
>
{label}
</Typography>
)}
<MuiSelect
className="select-component"
value={value}
onChange={onChange}
onBlur={onBlur}
displayEmpty
error={error}
name={name}
inputProps={{ id: id }}
IconComponent={KeyboardArrowDownIcon}
@@ -107,6 +113,13 @@ const Select = ({
"& svg path": {
fill: theme.palette.primary.contrastTextTertiary,
},
"& .MuiSelect-select": {
padding: "0",
minHeight: "34px",
display: "flex",
alignItems: "center",
lineHeight: 1,
},
...sx,
}}
renderValue={(selected) => {
@@ -151,7 +164,7 @@ const Select = ({
</MenuItem>
))}
</MuiSelect>
</Stack>
</FieldWrapper>
);
};
@@ -161,10 +174,14 @@ Select.propTypes = {
label: PropTypes.string,
placeholder: PropTypes.string,
isHidden: PropTypes.bool,
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
error: PropTypes.bool,
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.bool])
.isRequired,
items: PropTypes.arrayOf(
PropTypes.shape({
_id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
_id: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.bool])
.isRequired,
name: PropTypes.string.isRequired,
})
).isRequired,
@@ -2,6 +2,7 @@ import { Stack, TextField, Typography } from "@mui/material";
import { useTheme } from "@emotion/react";
import { forwardRef, useState, cloneElement } from "react";
import PropTypes from "prop-types";
import FieldWrapper from "../FieldWrapper";
const getSx = (theme, type, maxWidth) => {
const sx = {
@@ -85,31 +86,43 @@ const TextInput = forwardRef(
marginLeft,
disabled = false,
hidden = false,
//FieldWrapper's props
gap,
labelMb,
labelFontWeight,
labelVariant,
labelSx = {},
sx = {},
},
ref
) => {
const [fieldType, setFieldType] = useState(type);
const theme = useTheme();
const labelContent = label && (
<>
{label}
{isRequired && <Required />}
{isOptional && <Optional optionalLabel={optionalLabel} />}
</>
);
return (
<Stack
flex={flex}
display={hidden ? "none" : ""}
marginTop={marginTop}
marginRight={marginRight}
marginBottom={marginBottom}
marginLeft={marginLeft}
<FieldWrapper
label={labelContent}
labelMb={labelMb}
labelVariant={labelVariant}
labelFontWeight={labelFontWeight}
labelSx={labelSx}
gap={gap}
sx={{
flex,
display: hidden ? "none" : "",
mt: marginTop,
mr: marginRight,
mb: marginBottom,
ml: marginLeft,
...sx,
}}
>
<Typography
component="h3"
fontSize={"var(--env-var-font-size-medium)"}
color={theme.palette.primary.contrastTextSecondary}
fontWeight={500}
mb={theme.spacing(2)}
>
{label}
{isRequired && <Required />}
{isOptional && <Optional optionalLabel={optionalLabel} />}
</Typography>
<TextField
id={id}
name={name}
@@ -132,7 +145,7 @@ const TextInput = forwardRef(
}}
disabled={disabled}
/>
</Stack>
</FieldWrapper>
);
}
);
+30 -8
View File
@@ -3,15 +3,24 @@ import { Box, MenuItem, Select, Stack } from "@mui/material";
import { useTheme } from "@emotion/react";
import "flag-icons/css/flag-icons.min.css";
import { useSelector } from "react-redux";
import { useDispatch } from "react-redux";
import { setLanguage } from "../Features/UI/uiSlice";
const langMap = {
cs: "cz",
ja: "jp",
uk: "ua",
vi: "vn",
};
const LanguageSelector = () => {
const { i18n } = useTranslation();
const theme = useTheme();
const { language } = useSelector((state) => state.ui);
const dispatch = useDispatch();
const handleChange = (event) => {
const newLang = event.target.value;
i18n.changeLanguage(newLang);
dispatch(setLanguage(newLang));
};
const languages = Object.keys(i18n.options.resources || {});
@@ -21,31 +30,44 @@ const LanguageSelector = () => {
value={language}
onChange={handleChange}
size="small"
sx={{ minWidth: 80 }}
sx={{
minWidth: 80,
"& .MuiSelect-select": {
display: "flex",
alignItems: "center",
justifyContent: "center",
},
"& .MuiSelect-icon": {
alignSelf: "center",
},
}}
>
{languages.map((lang) => {
let parsedLang = lang === "en" ? "gb" : lang;
// Fix for Czech
if (parsedLang === "cs") {
parsedLang = "cz";
}
if (parsedLang.includes("-")) {
parsedLang = parsedLang.split("-")[1].toLowerCase();
console.log("parsedLang", parsedLang);
}
parsedLang = langMap[parsedLang] || parsedLang;
const flag = parsedLang ? `fi fi-${parsedLang}` : null;
return (
<MenuItem
key={lang}
value={lang}
sx={{
display: "flex",
justifyContent: "center",
alignItems: "center",
}}
>
<Stack
direction="row"
spacing={theme.spacing(2)}
alignItems="center"
justifyContent="center"
>
<Box
component="span"
@@ -0,0 +1,31 @@
import Box from "@mui/material/Box";
import PropTypes from "prop-types";
import { useTheme } from "@emotion/react";
import BackgroundSVG from "../../../assets/Images/background.svg";
import { useSelector } from "react-redux";
const AppLayout = ({ children }) => {
const theme = useTheme();
const ui = useSelector((state) => state.ui);
return (
<Box
sx={{
minHeight: "100vh",
backgroundColor: theme.palette.primaryBackground.main,
backgroundImage: ui?.mode === "dark" ? `url("${BackgroundSVG}")` : "none",
backgroundSize: "100% 100%",
backgroundPosition: "center",
backgroundRepeat: "no-repeat",
color: theme.palette.primary.contrastText,
}}
>
{children}
</Box>
);
};
AppLayout.propTypes = {
children: PropTypes.node,
};
export default AppLayout;
@@ -12,13 +12,13 @@
}
} */
.home-layout aside {
/* .home-layout aside {
position: sticky;
top: 0;
left: 0;
height: 100vh;
max-width: var(--env-var-side-bar-width);
}
} */
.home-layout > div {
min-height: calc(100vh - var(--env-var-spacing-2) * 2);
+8 -4
View File
@@ -1,4 +1,6 @@
import { Link as MuiLink, useTheme } from "@mui/material";
import { Link as RouterLink } from "react-router-dom";
import PropTypes from "prop-types";
/**
@@ -10,7 +12,7 @@ import PropTypes from "prop-types";
* @returns {JSX.Element}
*/
const Link = ({ level, label, url }) => {
const Link = ({ level, label, url, external = true }) => {
const theme = useTheme();
const levelConfig = {
@@ -49,11 +51,12 @@ const Link = ({ level, label, url }) => {
const { sx, color } = levelConfig[level];
return (
<MuiLink
href={url}
component={external ? "a" : RouterLink}
to={external ? undefined : url}
href={external ? url : undefined}
sx={{ width: "fit-content", ...sx }}
color={color}
target="_blank"
rel="noreferrer"
{...(external && { target: "_blank", rel: "noreferrer" })}
>
{label}
</MuiLink>
@@ -64,6 +67,7 @@ Link.propTypes = {
url: PropTypes.string.isRequired,
level: PropTypes.oneOf(["primary", "secondary", "tertiary", "error"]),
label: PropTypes.string.isRequired,
external: PropTypes.bool,
};
export default Link;
@@ -0,0 +1,116 @@
import * as React from "react";
import Button from "@mui/material/Button";
import ButtonGroup from "@mui/material/ButtonGroup";
import ArrowDropDownIcon from "@mui/icons-material/ArrowDropDown";
import ClickAwayListener from "@mui/material/ClickAwayListener";
import Grow from "@mui/material/Grow";
import Paper from "@mui/material/Paper";
import Popper from "@mui/material/Popper";
import MenuItem from "@mui/material/MenuItem";
import MenuList from "@mui/material/MenuList";
import { useNavigate } from "react-router-dom";
import { useTranslation } from "react-i18next";
import { createToast } from "../../Utils/toastUtils";
import { useExportMonitors } from "../../Hooks/monitorHooks";
const MonitorActions = ({ isLoading }) => {
const [open, setOpen] = React.useState(false);
const anchorRef = React.useRef(null);
const [selectedIndex, setSelectedIndex] = React.useState(0);
const navigate = useNavigate();
const { t } = useTranslation();
const [exportMonitors, isExporting] = useExportMonitors();
const options = [t("monitorActions.import"), t("monitorActions.export")];
const handleClick = async () => {
if (selectedIndex === 0) {
// Import
navigate("/uptime/bulk-import");
} else {
// Export
const [success, error] = await exportMonitors();
if (!success) {
createToast({ body: error || t("export.failed") });
}
}
};
const handleMenuItemClick = (event, index) => {
setSelectedIndex(index);
setOpen(false);
};
const handleToggle = () => {
setOpen((prevOpen) => !prevOpen);
};
const handleClose = (event) => {
if (anchorRef.current && anchorRef.current.contains(event.target)) {
return;
}
setOpen(false);
};
return (
<React.Fragment>
<ButtonGroup
variant="contained"
color="accent"
ref={anchorRef}
aria-label="Monitor actions"
disabled={isLoading || isExporting}
>
<Button onClick={handleClick}>{options[selectedIndex]}</Button>
<Button
size="small"
aria-controls={open ? "split-button-menu" : undefined}
aria-expanded={open ? "true" : undefined}
aria-label="select monitor action"
aria-haspopup="menu"
onClick={handleToggle}
>
<ArrowDropDownIcon />
</Button>
</ButtonGroup>
<Popper
sx={{ zIndex: 1 }}
open={open}
anchorEl={anchorRef.current}
role={undefined}
transition
disablePortal
>
{({ TransitionProps, placement }) => (
<Grow
{...TransitionProps}
style={{
transformOrigin: placement === "bottom" ? "center top" : "center bottom",
}}
>
<Paper>
<ClickAwayListener onClickAway={handleClose}>
<MenuList
id="split-button-menu"
autoFocusItem
>
{options.map((option, index) => (
<MenuItem
key={option}
selected={index === selectedIndex}
onClick={(event) => handleMenuItemClick(event, index)}
>
{option}
</MenuItem>
))}
</MenuList>
</ClickAwayListener>
</Paper>
</Grow>
)}
</Popper>
</React.Fragment>
);
};
export default MonitorActions;
@@ -4,14 +4,14 @@ import { useTheme } from "@emotion/react";
import SkeletonLayout from "./skeleton";
const MonitorCountHeader = ({
shouldRender = true,
isLoading = false,
monitorCount,
heading = "monitors",
sx,
children,
}) => {
const theme = useTheme();
if (!shouldRender) return <SkeletonLayout />;
if (isLoading) return <SkeletonLayout />;
if (monitorCount === 1) {
heading = "monitor";
@@ -42,7 +42,7 @@ const MonitorCountHeader = ({
};
MonitorCountHeader.propTypes = {
shouldRender: PropTypes.bool,
isLoading: PropTypes.bool,
monitorCount: PropTypes.number,
heading: PropTypes.string,
children: PropTypes.node,
@@ -3,6 +3,7 @@ import { useNavigate } from "react-router-dom";
import PropTypes from "prop-types";
import { useTranslation } from "react-i18next";
import { useTheme } from "@emotion/react";
import MonitorActions from "../MonitorActions";
const CreateMonitorHeader = ({ isAdmin, label, isLoading = true, path, bulkPath }) => {
const navigate = useNavigate();
@@ -28,18 +29,7 @@ const CreateMonitorHeader = ({ isAdmin, label, isLoading = true, path, bulkPath
>
{label || t("createNew")}
</Button>
{bulkPath && (
<Button
loading={isLoading}
variant="contained"
color="accent"
onClick={() => {
navigate(`${bulkPath}`);
}}
>
{t("bulkImport.title")}
</Button>
)}
{/* {bulkPath && <MonitorActions isLoading={isLoading} />} */}
</Stack>
);
};
@@ -2,6 +2,7 @@ import Stack from "@mui/material/Stack";
import Status from "./status";
import Skeleton from "./skeleton";
import Button from "@mui/material/Button";
import { Tooltip } from "@mui/material";
import SettingsOutlinedIcon from "@mui/icons-material/SettingsOutlined";
import PauseOutlinedIcon from "@mui/icons-material/PauseOutlined";
import PlayArrowOutlinedIcon from "@mui/icons-material/PlayArrowOutlined";
@@ -11,10 +12,10 @@ import EmailIcon from "@mui/icons-material/Email";
import PropTypes from "prop-types";
import { useNavigate } from "react-router-dom";
import { useTheme } from "@mui/material/styles";
import { usePauseMonitor } from "../../Hooks/useMonitorControls";
import { usePauseMonitor } from "../../Hooks/monitorHooks";
import { useSendTestEmail } from "../../Hooks/useSendTestEmail";
import { useTranslation } from "react-i18next";
import { useTestAllNotifications } from "../../Hooks/useNotifications";
/**
* MonitorDetailsControlHeader component displays the control header for monitor details.
* It includes status display, pause/resume button, and a configure button for admins.
@@ -38,12 +39,16 @@ const MonitorDetailsControlHeader = ({
const navigate = useNavigate();
const theme = useTheme();
const { t } = useTranslation();
const [pauseMonitor, isPausing, error] = usePauseMonitor({
monitorId: monitor?._id,
triggerUpdate,
});
const [pauseMonitor, isPausing, error] = usePauseMonitor();
const [isSending, emailError, sendTestEmail] = useSendTestEmail();
const isTestNotificationsDisabled = monitor?.notifications?.length === 0;
const tooltipTitle = isTestNotificationsDisabled ? t("testNotificationsDisabled") : "";
// const [isSending, emailError, sendTestEmail] = useSendTestEmail();
const [testAllNotifications, isSending, errorAllNotifications] =
useTestAllNotifications();
if (isLoading) {
return <Skeleton />;
@@ -60,17 +65,29 @@ const MonitorDetailsControlHeader = ({
direction="row"
gap={theme.spacing(2)}
>
<Button
variant="contained"
color="secondary"
loading={isSending}
startIcon={<EmailIcon />}
onClick={() => {
sendTestEmail();
}}
<Tooltip
key={monitor?._id}
placement="bottom"
title={tooltipTitle}
>
{t("sendTestEmail")}
</Button>
<span>
<Button
variant="contained"
color="secondary"
loading={isSending}
startIcon={<EmailIcon />}
disabled={isTestNotificationsDisabled}
onClick={() => {
testAllNotifications({ monitorId: monitor?._id });
}}
sx={{
whiteSpace: "nowrap",
}}
>
{t("sendTestNotifications")}
</Button>
</span>
</Tooltip>
<Button
variant="contained"
color="secondary"
@@ -80,20 +97,24 @@ const MonitorDetailsControlHeader = ({
>
{t("menu.incidents")}
</Button>
<Button
variant="contained"
color="secondary"
loading={isPausing}
startIcon={
monitor?.isActive ? <PauseOutlinedIcon /> : <PlayArrowOutlinedIcon />
}
onClick={() => {
pauseMonitor();
}}
>
{monitor?.isActive ? "Pause" : "Resume"}
</Button>
{isAdmin && (
<Button
variant="contained"
color="secondary"
loading={isPausing}
startIcon={
monitor?.isActive ? <PauseOutlinedIcon /> : <PlayArrowOutlinedIcon />
}
onClick={() => {
pauseMonitor({
monitorId: monitor?._id,
triggerUpdate,
});
}}
>
{monitor?.isActive ? "Pause" : "Resume"}
</Button>
)}
{isAdmin && (
<Button
variant="contained"
@@ -7,8 +7,8 @@ import Dot from "../../Components/Dot";
import { formatDurationRounded } from "../../Utils/timeUtils";
import PropTypes from "prop-types";
import { useTheme } from "@emotion/react";
import useUtils from "../../Pages/Uptime/Monitors/Hooks/useUtils";
import { useMonitorUtils } from "../../Hooks/useMonitorUtils";
import { formatMonitorUrl } from "../../Utils/utils";
/**
* Status component displays the status information of a monitor.
* It includes the monitor's name, URL, and check interval.
@@ -23,23 +23,18 @@ import useUtils from "../../Pages/Uptime/Monitors/Hooks/useUtils";
*/
const Status = ({ monitor }) => {
const theme = useTheme();
const { statusColor, determineState } = useUtils();
const { statusColor, determineState } = useMonitorUtils();
return (
<Stack>
<Typography variant="h1">{monitor?.name}</Typography>
<Typography variant="monitorName">{monitor?.name}</Typography>
<Stack
direction="row"
alignItems={"center"}
gap={theme.spacing(4)}
>
<PulseDot color={statusColor[determineState(monitor)]} />
<Typography
variant="h2"
style={{ fontFamily: "monospace", fontWeight: "bolder" }}
>
{monitor?.url?.replace(/^https?:\/\//, "") || "..."}
</Typography>
<Typography variant="monitorUrl">{formatMonitorUrl(monitor?.url)}</Typography>
<Dot />
<Typography>
Checking every {formatDurationRounded(monitor?.interval)}.
@@ -1,41 +0,0 @@
import { Button, Box } from "@mui/material";
import { useTheme } from "@emotion/react";
import { useNavigate } from "react-router-dom";
import SettingsIcon from "../../../assets/icons/settings-bold.svg?react";
import PropTypes from "prop-types";
const ConfigButton = ({ shouldRender = true, monitorId, path }) => {
const theme = useTheme();
const navigate = useNavigate();
if (!shouldRender) return null;
return (
<Box alignSelf="flex-end">
<Button
variant="contained"
color="secondary"
onClick={() => navigate(`/${path}/configure/${monitorId}`)}
sx={{
px: theme.spacing(5),
"& svg": {
mr: theme.spacing(3),
"& path": {
/* Should always be contrastText for the button color */
stroke: theme.palette.secondary.contrastText,
},
},
}}
>
<SettingsIcon /> Configure
</Button>
</Box>
);
};
ConfigButton.propTypes = {
shouldRender: PropTypes.bool,
monitorId: PropTypes.string.isRequired,
path: PropTypes.string.isRequired,
};
export default ConfigButton;
@@ -1,59 +0,0 @@
import { Stack, Typography } from "@mui/material";
import PulseDot from "../Animated/PulseDot";
import Dot from "../Dot";
import { useTheme } from "@emotion/react";
import useUtils from "../../Pages/Uptime/Monitors/Hooks/useUtils";
import { formatDurationRounded } from "../../Utils/timeUtils";
import ConfigButton from "./ConfigButton";
import SkeletonLayout from "./skeleton";
import PropTypes from "prop-types";
const MonitorStatusHeader = ({ path, isLoading = false, isAdmin, monitor }) => {
const theme = useTheme();
const { statusColor, determineState } = useUtils();
if (isLoading) {
return <SkeletonLayout />;
}
return (
<Stack
direction="row"
justifyContent="space-between"
>
<Stack>
<Typography variant="h1">{monitor?.name}</Typography>
<Stack
direction="row"
alignItems={"center"}
gap={theme.spacing(4)}
>
<PulseDot color={statusColor[determineState(monitor)]} />
<Typography
variant="h2"
style={{ fontFamily: "monospace", fontWeight: "bolder" }}
>
{monitor?.url?.replace(/^https?:\/\//, "") || "..."}
</Typography>
<Dot />
<Typography>
Checking every {formatDurationRounded(monitor?.interval)}.
</Typography>
</Stack>
</Stack>
<ConfigButton
path={path}
shouldRender={isAdmin}
monitorId={monitor?._id}
/>
</Stack>
);
};
MonitorStatusHeader.propTypes = {
path: PropTypes.string.isRequired,
isLoading: PropTypes.bool,
isAdmin: PropTypes.bool,
monitor: PropTypes.object,
};
export default MonitorStatusHeader;
@@ -1,23 +0,0 @@
import { Stack, Skeleton } from "@mui/material";
const SkeletonLayout = () => {
return (
<Stack
direction="row"
justifyContent="space-between"
>
<Skeleton
height={40}
variant="rounded"
width="15%"
/>
<Skeleton
height={40}
variant="rounded"
width="15%"
/>
</Stack>
);
};
export default SkeletonLayout;
@@ -0,0 +1,125 @@
// Components
import Stack from "@mui/material/Stack";
import Typography from "@mui/material/Typography";
import Divider from "@mui/material/Divider";
import DeleteOutlineRoundedIcon from "@mui/icons-material/DeleteOutlineRounded";
import Search from "../Inputs/Search";
// Utils
import { useState, useEffect } from "react";
import { useTheme } from "@mui/material/styles";
import PropTypes from "prop-types";
const NotificationConfig = ({
notifications,
setMonitor,
setNotifications,
//FieldWrapper's props
gap,
labelMb,
labelFontWeight,
labelVariant,
labelSx = {},
sx = {},
}) => {
// Local state
const [notificationsSearch, setNotificationsSearch] = useState("");
const [selectedNotifications, setSelectedNotifications] = useState([]);
const handleSearch = (value) => {
setSelectedNotifications(value);
setMonitor((prev) => {
return {
...prev,
notifications: value.map((notification) => notification._id),
};
});
};
// Handlers
const handleDelete = (id) => {
const updatedNotifications = selectedNotifications.filter(
(notification) => notification._id !== id
);
setSelectedNotifications(updatedNotifications);
setMonitor((prev) => {
return {
...prev,
notifications: updatedNotifications.map((notification) => notification._id),
};
});
};
// Setup
const theme = useTheme();
useEffect(() => {
if (setNotifications) {
const toSet = setNotifications.map((notification) => {
return notifications.find((n) => n._id === notification);
});
setSelectedNotifications(toSet);
}
}, [setNotifications, notifications]);
return (
<Stack gap={theme.spacing(6)}>
<Search
type="notifications"
label="Notifications"
options={notifications}
filteredBy="notificationName"
multiple={true}
value={selectedNotifications}
inputValue={notificationsSearch}
handleInputChange={setNotificationsSearch}
handleChange={(value) => {
handleSearch(value);
}}
labelMb={labelMb}
labelVariant={labelVariant}
labelFontWeight={labelFontWeight}
labelSx={labelSx}
gap={gap}
sx={{
...sx,
}}
/>
<Stack
flex={1}
width="100%"
>
{selectedNotifications.map((notification, index) => (
<Stack
direction="row"
alignItems="center"
key={notification._id}
width="100%"
>
<Typography
flexGrow={1} // <-- This will take up all available horizontal space
>
{notification.notificationName}
</Typography>
<DeleteOutlineRoundedIcon
onClick={() => {
handleDelete(notification._id);
}}
sx={{ cursor: "pointer" }}
/>
{index < selectedNotifications.length - 1 && <Divider />}
</Stack>
))}
</Stack>
</Stack>
);
};
NotificationConfig.propTypes = {
notifications: PropTypes.array,
setMonitor: PropTypes.func,
setNotifications: PropTypes.array,
};
export default NotificationConfig;
@@ -1,30 +0,0 @@
import { Navigate } from "react-router-dom";
import { useSelector } from "react-redux";
import PropTypes from "prop-types";
/**
* @param {Object} props - The props passed to the ProtectedDistributedUptimeRoute component.
* @param {React.ReactNode} props.children - The children to render if the user is authenticated.
* @returns {React.ReactElement} The children wrapped in a protected route or a redirect to the login page.
*/
const ProtectedDistributedUptimeRoute = ({ children }) => {
const distributedUptimeEnabled = useSelector(
(state) => state.ui.distributedUptimeEnabled
);
return distributedUptimeEnabled === true ? (
children
) : (
<Navigate
to="/uptime"
replace
/>
);
};
ProtectedDistributedUptimeRoute.propTypes = {
children: PropTypes.node.isRequired,
};
export default ProtectedDistributedUptimeRoute;
@@ -0,0 +1,35 @@
import { Navigate } from "react-router-dom";
import { useSelector } from "react-redux";
import PropTypes from "prop-types";
/**
* ProtectedRoute is a wrapper component that ensures only authenticated users
* can access the wrapped content. It checks authentication status (e.g., from Redux or Context).
* If the user is authenticated, it renders the children; otherwise, it redirects to the login page.
*
* @param {Object} props - The props passed to the ProtectedRoute component.
* @param {React.ReactNode} props.children - The children to render if the user is authenticated.
* @returns {React.ReactElement} The children wrapped in a protected route or a redirect to the login page.
*/
const RoleProtectedRoute = ({ roles, children }) => {
const authState = useSelector((state) => state.auth);
const userRoles = authState?.user?.role || [];
const canAccess = userRoles.some((role) => roles.includes(role));
return canAccess ? (
children
) : (
<Navigate
to="/uptime"
replace
/>
);
};
RoleProtectedRoute.propTypes = {
children: PropTypes.element.isRequired,
roles: PropTypes.array,
};
export default RoleProtectedRoute;
@@ -0,0 +1,277 @@
import Stack from "@mui/material/Stack";
import Box from "@mui/material/Box";
import Typography from "@mui/material/Typography";
import Tooltip from "@mui/material/Tooltip";
import IconButton from "@mui/material/IconButton";
import Avatar from "../../Avatar";
import Menu from "@mui/material/Menu";
import MenuItem from "@mui/material/MenuItem";
import Divider from "@mui/material/Divider";
import DotsVertical from "../../../assets/icons/dots-vertical.svg?react";
import LogoutSvg from "../../../assets/icons/logout.svg?react";
import { useTheme } from "@emotion/react";
import { useSelector } from "react-redux";
import { useTranslation } from "react-i18next";
import { useState } from "react";
import { useNavigate } from "react-router";
import { clearAuthState } from "../../../Features/Auth/authSlice";
import { useDispatch } from "react-redux";
import PropTypes from "prop-types";
const getFilteredAccountMenuItems = (user, items) => {
if (!user) return [];
let filtered = [...items];
if (user.role?.includes("demo")) {
filtered = filtered.filter((item) => item.name !== "Password");
}
if (!user.role?.includes("superadmin")) {
filtered = filtered.filter((item) => item.name !== "Team");
}
return filtered;
};
const getRoleDisplayText = (user, t) => {
if (!user?.role) return "";
if (user.role.includes("superadmin")) return t("roles.superAdmin");
if (user.role.includes("admin")) return t("roles.admin");
if (user.role.includes("user")) return t("roles.teamMember");
if (user.role.includes("demo")) return t("roles.demoUser");
return user.role;
};
const AuthFooter = ({ collapsed, accountMenuItems }) => {
const { t } = useTranslation();
const theme = useTheme();
const authState = useSelector((state) => state.auth);
const navigate = useNavigate();
const dispatch = useDispatch();
const [anchorEl, setAnchorEl] = useState(null);
const openPopup = (event) => {
setAnchorEl(event.currentTarget);
};
const closePopup = () => {
setAnchorEl(null);
};
const logout = async () => {
dispatch(clearAuthState());
navigate("/login");
};
const renderAccountMenuItems = (user, items) => {
const filteredItems = getFilteredAccountMenuItems(user, items);
return filteredItems.map((item) => (
<MenuItem
key={item.name}
onClick={() => {
closePopup();
navigate(item.path);
}}
sx={{
gap: theme.spacing(2),
borderRadius: theme.shape.borderRadius,
pl: theme.spacing(4),
}}
>
{item.icon}
{item.name}
</MenuItem>
));
};
return (
<Stack
direction="row"
height="var(--env-var-side-bar-auth-footer-height)"
alignItems="center"
py={theme.spacing(4)}
px={theme.spacing(8)}
gap={theme.spacing(2)}
borderRadius={theme.shape.borderRadius}
boxSizing={"border-box"}
>
<Avatar
small={true}
onClick={(e) => collapsed && openPopup(e)}
sx={{
cursor: collapsed ? "pointer" : "default",
}}
/>
<Stack
direction={"row"}
alignItems={"center"}
gap={theme.spacing(2)}
minWidth={0}
maxWidth={collapsed ? 0 : "100%"}
sx={{
opacity: collapsed ? 0 : 1,
transition: "opacity 300ms ease, max-width 300ms ease",
transitionDelay: collapsed ? "0ms" : "300ms",
}}
>
<Stack
ml={theme.spacing(2)}
sx={{
maxWidth: "50%",
overflow: "hidden",
}}
>
<Typography
color={theme.palette.primary.contrastText}
fontWeight={500}
lineHeight={1}
fontSize={"var(--env-var-font-size-medium)"}
sx={{
display: "block",
whiteSpace: "nowrap",
overflow: "hidden",
textOverflow: "ellipsis",
}}
>
{authState.user?.firstName} {authState.user?.lastName}
</Typography>
<Typography
color={theme.palette.primary.contrastText}
fontSize={"var(--env-var-font-size-small)"}
textOverflow="ellipsis"
overflow="hidden"
whiteSpace="nowrap"
sx={{ textTransform: "capitalize", opacity: 0.8 }}
>
{getRoleDisplayText(authState.user, t)}
</Typography>
</Stack>
<Tooltip
title={t("navControls")}
disableInteractive
>
<IconButton
sx={{
ml: "50px",
"&:focus": { outline: "none" },
alignSelf: "center",
"& svg": {
width: "22px",
height: "22px",
},
"& svg path": {
/* Vertical three dots */
stroke: theme.palette.primary.contrastTextTertiary,
},
}}
onClick={(event) => openPopup(event)}
>
<DotsVertical />
</IconButton>
</Tooltip>
</Stack>
<Menu
className="sidebar-popup"
anchorEl={anchorEl}
open={Boolean(anchorEl)}
onClose={closePopup}
disableScrollLock
anchorOrigin={{
vertical: "top",
horizontal: "right",
}}
slotProps={{
paper: {
sx: {
marginTop: theme.spacing(-4),
marginLeft: collapsed ? theme.spacing(2) : 0,
},
},
}}
MenuListProps={{
sx: {
p: 2,
"& li": { m: 0 },
"& li:has(.MuiBox-root):hover": {
backgroundColor: "transparent",
},
},
}}
sx={{
ml: theme.spacing(4),
}}
>
{collapsed && (
<MenuItem sx={{ cursor: "default", minWidth: "50%" }}>
<Box
mb={theme.spacing(2)}
sx={{
minWidth: "50%",
maxWidth: "max-content",
overflow: "visible",
whiteSpace: "nowrap",
}}
>
<Typography
component="span"
fontWeight={500}
fontSize={13}
sx={{
display: "block",
whiteSpace: "nowrap",
overflow: "visible",
// wordBreak: "break-word",
textOverflow: "clip",
}}
>
{authState.user?.firstName} {authState.user?.lastName}
</Typography>
<Typography
sx={{
textTransform: "capitalize",
fontSize: 12,
whiteSpace: "nowrap",
overflow: "visible",
// wordBreak: "break-word",
}}
>
{authState.user?.role}
</Typography>
</Box>
</MenuItem>
)}
{/* TODO Do we need two dividers? */}
{collapsed && <Divider />}
{/* <Divider /> */}
{renderAccountMenuItems(authState.user, accountMenuItems)}
<MenuItem
onClick={logout}
sx={{
gap: theme.spacing(4),
borderRadius: theme.shape.borderRadius,
pl: theme.spacing(4),
"& svg path": {
stroke: theme.palette.primary.contrastTextTertiary,
},
}}
>
<LogoutSvg />
{t("menu.logOut", "Log out")}
</MenuItem>
</Menu>
</Stack>
);
};
AuthFooter.propTypes = {
collapsed: PropTypes.bool,
accountMenuItems: PropTypes.array,
};
export default AuthFooter;
@@ -0,0 +1,55 @@
import IconButton from "@mui/material/IconButton";
import ArrowRight from "../../ArrowRight";
import ArrowLeft from "../../ArrowLeft";
import { useTheme } from "@mui/material/styles";
import { useDispatch } from "react-redux";
import { toggleSidebar } from "../../../Features/UI/uiSlice";
import PropTypes from "prop-types";
const CollapseButton = ({ collapsed }) => {
const theme = useTheme();
const dispatch = useDispatch();
const arrowIcon = collapsed ? (
<ArrowRight
height={theme.spacing(8)}
width={theme.spacing(8)}
color={theme.palette.primary.contrastTextSecondary}
/>
) : (
<ArrowLeft
height={theme.spacing(8)}
width={theme.spacing(8)}
color={theme.palette.primary.contrastTextSecondary}
/>
);
return (
<IconButton
sx={{
position: "absolute",
/* TODO 60 is a magic number. if logo chnges size this might break */
top: 60,
right: 0,
transform: `translate(50%, 0)`,
backgroundColor: theme.palette.tertiary.main,
border: `1px solid ${theme.palette.primary.lowContrast}`,
p: theme.spacing(2.5),
"&:focus": { outline: "none" },
"&:hover": {
backgroundColor: theme.palette.primary.lowContrast,
borderColor: theme.palette.primary.lowContrast,
},
}}
onClick={() => {
dispatch(toggleSidebar());
}}
>
{arrowIcon}
</IconButton>
);
};
CollapseButton.propTypes = {
collapsed: PropTypes.bool.isRequired,
};
export default CollapseButton;
@@ -0,0 +1,67 @@
import Stack from "@mui/material/Stack";
import Box from "@mui/material/Box";
import Typography from "@mui/material/Typography";
import { useTheme } from "@mui/material/styles";
import { useNavigate } from "react-router";
import { useTranslation } from "react-i18next";
import PropTypes from "prop-types";
const Logo = ({ collapsed }) => {
const { t } = useTranslation();
const theme = useTheme();
const navigate = useNavigate();
return (
<Stack
pt={theme.spacing(6)}
pb={theme.spacing(12)}
pl={theme.spacing(8)}
direction="row"
alignItems="center"
gap={theme.spacing(4)}
onClick={() => navigate("/")}
sx={{ cursor: "pointer" }}
>
<Typography
pl={theme.spacing("1px")}
minWidth={theme.spacing(16)}
minHeight={theme.spacing(16)}
display={"flex"}
justifyContent={"center"}
alignItems={"center"}
backgroundColor={theme.palette.accent.main}
borderRadius={theme.shape.borderRadius}
color={theme.palette.accent.contrastText}
fontSize={18}
>
C
</Typography>
<Box
overflow={"hidden"}
sx={{
transition: "opacity 900ms ease, width 900ms ease",
opacity: collapsed ? 0 : 1,
whiteSpace: "nowrap",
width: collapsed ? 0 : "100%",
}}
>
{" "}
<Typography
lineHeight={1}
mt={theme.spacing(2)}
color={theme.palette.primary.contrastText}
fontSize={"var(--env-var-font-size-medium-plus)"}
sx={{ fontWeight: 500 }}
>
{t("common.appName")}
</Typography>
</Box>
</Stack>
);
};
Logo.propTypes = {
collapsed: PropTypes.bool,
};
export default Logo;
@@ -0,0 +1,97 @@
import Tooltip from "@mui/material/Tooltip";
import ListItemButton from "@mui/material/ListItemButton";
import ListItemIcon from "@mui/material/ListItemIcon";
import Box from "@mui/material/Box";
import Typography from "@mui/material/Typography";
import { useTheme } from "@emotion/react";
import PropTypes from "prop-types";
const NavItem = ({ item, collapsed, selected, onClick }) => {
const theme = useTheme();
const iconStroke = selected
? theme.palette.primary.contrastText
: theme.palette.primary.contrastTextTertiary;
const buttonBgColor = selected ? theme.palette.secondary.main : "transparent";
const buttonBgHoverColor = selected
? theme.palette.secondary.main
: theme.palette.tertiary.main;
const fontWeight = selected ? 600 : 400;
return (
<Tooltip
placement="right"
title={collapsed ? item.name : ""}
slotProps={{
popper: {
modifiers: [
{
name: "offset",
options: {
offset: [0, -16],
},
},
],
},
}}
disableInteractive
>
<ListItemButton
sx={{
backgroundColor: buttonBgColor,
"&:hover": {
backgroundColor: buttonBgHoverColor,
},
height: 37,
gap: theme.spacing(4),
borderRadius: theme.shape.borderRadius,
px: theme.spacing(4),
pl: theme.spacing(5),
}}
onClick={onClick}
>
<ListItemIcon
sx={{
minWidth: 0,
"& svg": {
height: 20,
width: 20,
opacity: 0.81,
},
"& svg path": {
stroke: iconStroke,
},
}}
>
{item.icon}
</ListItemIcon>
<Box
sx={{
overflow: "hidden",
transition: "opacity 900ms ease",
opacity: collapsed ? 0 : 1,
whiteSpace: "nowrap",
}}
>
<Typography
variant="body1"
color={theme.palette.primary.contrastText}
sx={{
fontWeight: fontWeight,
opacity: 0.9,
}}
>
{item.name}
</Typography>
</Box>
</ListItemButton>
</Tooltip>
);
};
NavItem.propTypes = {
item: PropTypes.object,
collapsed: PropTypes.bool,
selected: PropTypes.bool,
onClick: PropTypes.func,
};
export default NavItem;
-106
View File
@@ -1,106 +0,0 @@
/* TODO */
aside .MuiList-root svg {
width: 20px;
height: 20px;
opacity: 0.9;
}
aside span.MuiTypography-root {
font-size: var(--env-var-font-size-medium);
line-height: 1;
}
aside .MuiStack-root + span.MuiTypography-root {
font-size: var(--env-var-font-size-medium-plus);
}
aside .MuiListSubheader-root {
font-size: var(--env-var-font-size-small);
font-weight: 500;
line-height: 1.5;
text-transform: uppercase;
margin-bottom: 2px;
opacity: 0.6;
}
aside p.MuiTypography-root {
font-size: var(--env-var-font-size-small);
opacity: 0.8;
}
aside .MuiListItemButton-root:not(.selected-path) > * {
opacity: 0.9;
}
aside .selected-path > * {
opacity: 1;
}
aside .selected-path span.MuiTypography-root {
font-weight: 600;
}
aside .MuiCollapse-wrapperInner .MuiList-root > .MuiListItemButton-root {
position: relative;
}
aside .MuiCollapse-wrapperInner .MuiList-root svg,
aside .MuiList-root .MuiListItemText-root + svg {
width: 18px;
height: 18px;
}
.sidebar-popup li.MuiButtonBase-root:has(.MuiBox-root) {
padding-bottom: 0;
}
.sidebar-popup svg {
width: 16px;
height: 16px;
opacity: 0.9;
}
/* TRANSITIONS */
aside {
flex: 1;
transition: max-width 650ms cubic-bezier(0.36, -0.01, 0, 0.77);
}
.home-layout aside.collapsed {
max-width: 64px;
}
aside.expanded .MuiTypography-root,
aside.expanded p.MuiTypography-root,
aside.expanded .MuiListItemText-root + svg,
aside.expanded .MuiAvatar-root + .MuiBox-root + .MuiIconButton-root {
visibility: visible;
animation: fadeIn 1s ease;
}
aside.collapsed .MuiTypography-root,
aside.collapsed p.MuiTypography-root,
aside.collapsed .MuiListItemText-root + svg,
aside.collapsed .MuiAvatar-root + .MuiBox-root + .MuiIconButton-root {
opacity: 0;
visibility: hidden;
}
aside .MuiListSubheader-root {
transition: padding 200ms ease;
}
.sidebar-delay-fade {
opacity: 0;
visibility: hidden;
transition: opacity 0.3s ease;
}
aside.expanded.sidebar-ready .sidebar-delay-fade {
opacity: 1;
visibility: visible;
}
@keyframes fadeIn {
0% {
opacity: 0;
visibility: hidden;
}
30% {
opacity: 0;
visibility: hidden;
}
100% {
opacity: 0.9;
visibility: visible;
}
}
+85 -790
View File
@@ -1,71 +1,59 @@
import React, { useEffect, useState, useRef } from "react";
import {
Box,
Collapse,
Divider,
IconButton,
List,
ListItemButton,
ListItemIcon,
ListItemText,
ListSubheader,
Menu,
MenuItem,
Stack,
Tooltip,
Typography,
} from "@mui/material";
import ThemeSwitch from "../ThemeSwitch";
import Avatar from "../Avatar";
import Stack from "@mui/material/Stack";
import List from "@mui/material/List";
import Logo from "./components/logo";
import CollapseButton from "./components/collapseButton";
import Divider from "@mui/material/Divider";
import NavItem from "./components/navItem";
import AuthFooter from "./components/authFooter";
import StarPrompt from "../StarPrompt";
import LockSvg from "../../assets/icons/lock.svg?react";
import UserSvg from "../../assets/icons/user.svg?react";
import TeamSvg from "../../assets/icons/user-two.svg?react";
import LogoutSvg from "../../assets/icons/logout.svg?react";
import Support from "../../assets/icons/support.svg?react";
import Account from "../../assets/icons/user-edit.svg?react";
import Maintenance from "../../assets/icons/maintenance.svg?react";
import Monitors from "../../assets/icons/monitors.svg?react";
import Incidents from "../../assets/icons/incidents.svg?react";
import Integrations from "../../assets/icons/integrations.svg?react";
import PageSpeed from "../../assets/icons/page-speed.svg?react";
import Settings from "../../assets/icons/settings.svg?react";
import ArrowDown from "../../assets/icons/down-arrow.svg?react";
import ArrowUp from "../../assets/icons/up-arrow.svg?react";
import ArrowRight from "../../assets/icons/right-arrow.svg?react";
import ArrowLeft from "../../assets/icons/left-arrow.svg?react";
import DotsVertical from "../../assets/icons/dots-vertical.svg?react";
import ChangeLog from "../../assets/icons/changeLog.svg?react";
import Docs from "../../assets/icons/docs.svg?react";
import Folder from "../../assets/icons/folder.svg?react";
import StatusPages from "../../assets/icons/status-pages.svg?react";
import Discussions from "../../assets/icons/discussions.svg?react";
import DistributedUptimeIcon from "../../assets/icons/distributed-uptime.svg?react";
import "./index.css";
import Notifications from "../../assets/icons/notifications.svg?react";
import Logs from "../../assets/icons/logs.svg?react";
// Utils
import { useLocation, useNavigate } from "react-router";
import { useTheme } from "@emotion/react";
import { useDispatch, useSelector } from "react-redux";
import { useTheme } from "@mui/material/styles";
import { useSelector } from "react-redux";
import { useTranslation } from "react-i18next";
import { clearAuthState } from "../../Features/Auth/authSlice";
import { toggleSidebar } from "../../Features/UI/uiSlice";
import { clearUptimeMonitorState } from "../../Features/UptimeMonitors/uptimeMonitorsSlice";
import { useNavigate } from "react-router";
const URL_MAP = {
support: "https://discord.com/invite/NAb6H3UTjK",
discussions: "https://github.com/bluewave-labs/checkmate/discussions",
docs: "https://bluewavelabs.gitbook.io/checkmate",
changelog: "https://github.com/bluewave-labs/checkmate/releases",
};
const getMenu = (t) => [
{ name: t("menu.uptime"), path: "uptime", icon: <Monitors /> },
{ name: t("menu.pagespeed"), path: "pagespeed", icon: <PageSpeed /> },
{ name: t("menu.infrastructure"), path: "infrastructure", icon: <Integrations /> },
{
name: t("menu.distributedUptime"),
path: "distributed-uptime",
icon: <DistributedUptimeIcon />,
name: t("menu.notifications"),
path: "notifications",
icon: <Notifications />,
},
{ name: t("menu.incidents"), path: "incidents", icon: <Incidents /> },
{ name: t("menu.statusPages"), path: "status", icon: <StatusPages /> },
{ name: t("menu.maintenance"), path: "maintenance", icon: <Maintenance /> },
// { name: t("menu.integrations"), path: "integrations", icon: <Integrations /> },
{ name: t("menu.logs"), path: "logs", icon: <Logs /> },
{
name: t("menu.settings"),
icon: <Settings />,
@@ -90,787 +78,94 @@ const getAccountMenuItems = (t) => [
{ name: t("menu.team"), path: "account/team", icon: <TeamSvg /> },
];
/* TODO this could be a key in nested Path would be the link */
const URL_MAP = {
support: "https://discord.com/invite/NAb6H3UTjK",
discussions: "https://github.com/bluewave-labs/checkmate/discussions",
docs: "https://bluewavelabs.gitbook.io/checkmate",
changelog: "https://github.com/bluewave-labs/bluewave-uptime/releases",
};
const PATH_MAP = {
monitors: "Dashboard",
pagespeed: "Dashboard",
infrastructure: "Dashboard",
["distributed-uptime"]: "Dashboard",
account: "Account",
settings: "Settings",
};
/**
* @component
* Sidebar component serves as a sidebar containing a menu.
*
* @returns {JSX.Element} The JSX element representing the Sidebar component.
*/
function Sidebar() {
const Sidebar = () => {
const theme = useTheme();
const navigate = useNavigate();
const location = useLocation();
const dispatch = useDispatch();
const { t } = useTranslation();
const authState = useSelector((state) => state.auth);
const navigate = useNavigate();
// Redux state
const collapsed = useSelector((state) => state.ui.sidebar.collapsed);
const menu = getMenu(t);
const otherMenuItems = getOtherMenuItems(t);
const accountMenuItems = getAccountMenuItems(t);
const collapsed = useSelector((state) => state.ui.sidebar.collapsed);
const [open, setOpen] = useState({ Dashboard: false, Account: false, Other: false });
const [anchorEl, setAnchorEl] = useState(null);
const [popup, setPopup] = useState();
const { user } = useSelector((state) => state.auth);
const distributedUptimeEnabled = useSelector(
(state) => state.ui.distributedUptimeEnabled
);
const sidebarRef = useRef(null);
const [sidebarReady, setSidebarReady] = useState(false);
const TRANSITION_DURATION = 200;
useEffect(() => {
if (!collapsed) {
setSidebarReady(false);
const timeout = setTimeout(() => {
setSidebarReady(true);
}, TRANSITION_DURATION);
return () => clearTimeout(timeout);
} else {
setSidebarReady(false);
}
}, [collapsed]);
const renderAccountMenuItems = () => {
let filteredAccountMenuItems = [...accountMenuItems];
// If the user is in demo mode, remove the "Password" option
if (user.role?.includes("demo")) {
filteredAccountMenuItems = filteredAccountMenuItems.filter(
(item) => item.name !== "Password"
);
}
// If the user is NOT a superadmin, remove the "Team" option
if (user.role && !user.role.includes("superadmin")) {
filteredAccountMenuItems = filteredAccountMenuItems.filter(
(item) => item.name !== "Team"
);
}
return filteredAccountMenuItems.map((item) => (
<MenuItem
key={item.name}
onClick={() => {
closePopup();
navigate(item.path);
}}
sx={{
gap: theme.spacing(2),
borderRadius: theme.shape.borderRadius,
pl: theme.spacing(4),
}}
>
{item.icon}
{item.name}
</MenuItem>
));
};
const openPopup = (event, id) => {
setAnchorEl(event.currentTarget);
setPopup(id);
};
const closePopup = () => {
setAnchorEl(null);
};
/**
* Handles logging out the user
*
*/
const logout = async () => {
// Clear auth state
dispatch(clearAuthState());
dispatch(clearUptimeMonitorState());
navigate("/login");
};
useEffect(() => {
const matchedKey = Object.keys(PATH_MAP).find((key) =>
location.pathname.includes(key)
);
if (matchedKey) {
setOpen((prev) => ({ ...prev, [PATH_MAP[matchedKey]]: true }));
}
}, [location]);
const iconColor = theme.palette.primary.contrastTextTertiary;
const sidebarClassName = `${collapsed ? "collapsed" : "expanded"} ${sidebarReady ? "sidebar-ready" : ""}`;
/* TODO refactor this, there are a some ternaries and comments in the return */
return (
<Stack
height="100vh"
width={
collapsed
? "var(--env-var-side-bar-collapsed-width)"
: "var(--env-var-side-bar-width)"
}
component="aside"
ref={sidebarRef}
className={sidebarClassName}
/* TODO general padding should be here */
py={theme.spacing(6)}
position="sticky"
top={0}
borderRight={`1px solid ${theme.palette.primary.lowContrast}`}
paddingTop={theme.spacing(6)}
paddingBottom={theme.spacing(6)}
gap={theme.spacing(6)}
/* TODO set all style in this sx if possible (when general)
This is the top lever for styles
*/
sx={{
position: "relative",
borderRight: `1px solid ${theme.palette.primary.lowContrast}`,
borderColor: theme.palette.primary.lowContrast,
borderRadius: 0,
backgroundColor: theme.palette.primary.main,
"& :is(p, span, .MuiListSubheader-root)": {
/*
Text color for unselected menu items and menu headings
Secondary contrast text against main background
*/
color: theme.palette.primary.contrastTextSecondary,
},
"& .MuiList-root svg path": {
/* Menu Icons */
stroke: iconColor,
},
"& .selected-path": {
/* Selected menu item */
backgroundColor: theme.palette.secondary.main,
"&:hover": {
backgroundColor: theme.palette.secondary.main,
},
"& .MuiListItemIcon-root svg path": {
/* Selected menu item icon */
stroke: theme.palette.secondary.contrastText,
},
"& .MuiListItemText-root :is(p, span)": {
/* Selected menu item text */
color: theme.palette.secondary.contrastText,
},
},
"& .MuiListItemButton-root:not(.selected-path)": {
transition: "background-color .3s",
" &:hover": {
/* Hovered menu item bg color */
backgroundColor: theme.palette.tertiary.main,
"& :is(p, span)": {
/* Hovered menu item text color */
color: theme.palette.tertiary.contrastText,
},
},
},
transition: "width 650ms cubic-bezier(0.36, -0.01, 0, 0.77)",
}}
>
<IconButton
<CollapseButton collapsed={collapsed} />
<Logo collapsed={collapsed} />
<List
component="nav"
aria-labelledby="nested-menu-subheader"
disablePadding
sx={{
position: "absolute",
/* TODO 60 is a magic number. if logo chnges size this might break */
top: 60,
right: 0,
transform: `translate(50%, 0)`,
backgroundColor: theme.palette.tertiary.main,
border: 1,
borderColor: theme.palette.primary.lowContrast,
p: theme.spacing(2.5),
"& svg": {
width: theme.spacing(8),
height: theme.spacing(8),
"& path": {
/* TODO this should be set at the top level if possible */
stroke: theme.palette.primary.contrastTextSecondary,
},
},
"&:focus": { outline: "none" },
"&:hover": {
backgroundColor: theme.palette.primary.lowContrast,
borderColor: theme.palette.primary.lowContrast,
},
px: theme.spacing(6),
height: "100%",
}}
onClick={() => {
setOpen((prev) =>
Object.fromEntries(Object.keys(prev).map((key) => [key, false]))
>
{menu.map((item) => {
const selected = location.pathname.startsWith(`/${item.path}`);
return (
<NavItem
key={item.path}
item={item}
collapsed={collapsed}
selected={selected}
onClick={() => navigate(`/${item.path}`)}
/>
);
dispatch(toggleSidebar());
}}
>
{collapsed ? <ArrowRight /> : <ArrowLeft />}
</IconButton>
{/* TODO Alignment done using padding. Use single source of truth to that*/}
<Stack
pt={theme.spacing(6)}
pb={theme.spacing(12)}
pl={theme.spacing(8)}
>
{/* TODO Abstract logo into component */}
{/* TODO Turn logo into a link */}
<Stack
direction="row"
alignItems="center"
gap={theme.spacing(4)}
onClick={() => navigate("/")}
sx={{ cursor: "pointer" }}
>
<Stack
justifyContent="center"
alignItems="center"
minWidth={theme.spacing(16)}
minHeight={theme.spacing(16)}
pl="1px"
fontSize={18}
color={theme.palette.accent.contrastText}
sx={{
position: "relative",
backgroundColor: theme.palette.accent.main,
color: theme.palette.accent.contrastText,
borderRadius: theme.shape.borderRadius,
userSelect: "none",
}}
>
C
</Stack>
<Typography
component="span"
mt={theme.spacing(2)}
sx={{ opacity: 0.8, fontWeight: 500 }}
>
Checkmate
</Typography>
</Stack>
</Stack>
<Box
sx={{
flexGrow: 1,
overflow: "auto",
overflowX: "hidden",
"&::-webkit-scrollbar": {
width: theme.spacing(2),
},
"&::-webkit-scrollbar-thumb": {
backgroundColor: theme.palette.primary.lowContrast,
borderRadius: theme.spacing(4),
},
}}
>
<List
component="nav"
aria-labelledby="nested-menu-subheader"
disablePadding
sx={{
px: theme.spacing(6),
height: "100%",
/* overflow: "hidden", */
}}
>
{menu.map((item) => {
if (
item.path === "distributed-uptime" &&
distributedUptimeEnabled === false
) {
return null;
}
return item.path ? (
/* If item has a path */
<Tooltip
key={item.path}
placement="right"
title={collapsed ? item.name : ""}
slotProps={{
popper: {
modifiers: [
{
name: "offset",
options: {
offset: [0, -16],
},
},
],
},
}}
disableInteractive
>
<ListItemButton
className={
location.pathname.startsWith(`/${item.path}`) ? "selected-path" : ""
}
onClick={() => navigate(`/${item.path}`)}
sx={{
height: "37px",
gap: theme.spacing(4),
borderRadius: theme.shape.borderRadius,
px: theme.spacing(4),
pl: theme.spacing(5),
}}
>
<ListItemIcon sx={{ minWidth: 0 }}>{item.icon}</ListItemIcon>
<ListItemText>{item.name}</ListItemText>
</ListItemButton>
</Tooltip>
) : collapsed ? (
/* TODO Do we ever get here? If item does not have a path and collapsed state is true */
<React.Fragment key={item.name}>
<Tooltip
placement="right"
title={collapsed ? item.name : ""}
slotProps={{
popper: {
modifiers: [
{
name: "offset",
options: {
offset: [0, -16],
},
},
],
},
}}
disableInteractive
>
<ListItemButton
className={
Boolean(anchorEl) && popup === item.name ? "selected-path" : ""
}
onClick={(event) => openPopup(event, item.name)}
sx={{
position: "relative",
gap: theme.spacing(4),
borderRadius: theme.shape.borderRadius,
px: theme.spacing(4),
}}
>
<ListItemIcon sx={{ minWidth: 0 }}>{item.icon}</ListItemIcon>
<ListItemText>{item.name}</ListItemText>
</ListItemButton>
</Tooltip>
<Menu
className="sidebar-popup"
anchorEl={anchorEl}
open={Boolean(anchorEl) && popup === item.name}
onClose={closePopup}
disableScrollLock
anchorOrigin={{
vertical: "top",
horizontal: "right",
}}
slotProps={{
paper: {
sx: {
mt: theme.spacing(-2),
ml: theme.spacing(1),
},
},
}}
MenuListProps={{ sx: { px: 1, py: 2 } }}
sx={{
ml: theme.spacing(8),
/* TODO what is this selection? */
"& .selected-path": {
backgroundColor: theme.palette.tertiary.main,
},
}}
>
{item.nested.map((child) => {
if (
child.name === "Team" &&
authState.user?.role &&
!authState.user.role.includes("superadmin")
) {
return null;
}
return (
<MenuItem
className={
location.pathname.includes(child.path) ? "selected-path" : ""
}
key={child.path}
onClick={() => {
const url = URL_MAP[child.path];
if (url) {
window.open(url, "_blank", "noreferrer");
} else {
navigate(`/${child.path}`);
}
closePopup();
}}
sx={{
gap: theme.spacing(4),
opacity: 0.9,
/* TODO this has no effect? */
"& svg": {
"& path": {
stroke: theme.palette.primary.contrastTextTertiary,
strokeWidth: 1.1,
},
},
}}
>
{child.icon}
{child.name}
</MenuItem>
);
})}
</Menu>
</React.Fragment>
) : (
/* TODO Do we ever get here? If item does not have a path and collapsed state is false */
<React.Fragment key={item.name}>
<ListItemButton
onClick={() =>
setOpen((prev) => ({
...Object.fromEntries(Object.keys(prev).map((key) => [key, false])),
[item.name]: !prev[item.name],
}))
}
sx={{
gap: theme.spacing(4),
borderRadius: theme.shape.borderRadius,
px: theme.spacing(4),
}}
>
<ListItemIcon sx={{ minWidth: 0 }}>{item.icon}</ListItemIcon>
<ListItemText>{item.name}</ListItemText>
{open[`${item.name}`] ? <ArrowUp /> : <ArrowDown />}
</ListItemButton>
<Collapse
in={open[`${item.name}`]}
timeout="auto"
>
<List
component="div"
disablePadding
sx={{ pl: theme.spacing(12) }}
>
{item.nested.map((child) => {
if (
child.name === "Team" &&
authState.user?.role &&
!authState.user.role.includes("superadmin")
) {
return null;
}
return (
<ListItemButton
className={
location.pathname.includes(child.path) ? "selected-path" : ""
}
key={child.path}
onClick={() => {
const url = URL_MAP[child.path];
if (url) {
window.open(url, "_blank", "noreferrer");
} else {
navigate(`/${child.path}`);
}
}}
sx={{
gap: theme.spacing(4),
borderRadius: theme.shape.borderRadius,
pl: theme.spacing(4),
"&::before": {
content: `""`,
position: "absolute",
top: 0,
left: "-7px",
height: "100%",
borderLeft: 1,
borderLeftColor: theme.palette.primary.lowContrast,
},
"&:last-child::before": {
height: "50%",
},
"&::after": {
content: `""`,
position: "absolute",
top: "45%",
left: "-8px",
height: "3px",
width: "3px",
borderRadius: "50%",
backgroundColor: theme.palette.primary.lowContrast,
},
"&.selected-path::after": {
/* TODO what is this selector doing? */
backgroundColor: theme.palette.primary.contrastTextTertiary,
transform: "scale(1.2)",
},
}}
>
<ListItemIcon sx={{ minWidth: 0 }}>{child.icon}</ListItemIcon>
<ListItemText>{child.name}</ListItemText>
</ListItemButton>
);
})}
</List>
</Collapse>
</React.Fragment>
);
})}
</List>
</Box>
})}
</List>
{!collapsed && <StarPrompt />}
<List
component="nav"
disablePadding
sx={{ px: theme.spacing(6) }}
>
{otherMenuItems.map((item) => {
return item.path ? (
<Tooltip
const selected = location.pathname.startsWith(`/${item.path}`);
return (
<NavItem
key={item.path}
placement="right"
title={collapsed ? item.name : ""}
slotProps={{
popper: {
modifiers: [
{
name: "offset",
options: {
offset: [0, -16],
},
},
],
},
}}
disableInteractive
>
<ListItemButton
className={
location.pathname.startsWith(`/${item.path}`) ? "selected-path" : ""
item={item}
collapsed={collapsed}
selected={selected}
onClick={() => {
const url = URL_MAP[item.path];
if (url) {
window.open(url, "_blank", "noreferrer");
} else {
navigate(`/${item.path}`);
}
onClick={() => {
const url = URL_MAP[item.path];
if (url) {
window.open(url, "_blank", "noreferrer");
} else {
navigate(`/${item.path}`);
}
}}
sx={{
height: "37px",
gap: theme.spacing(4),
borderRadius: theme.shape.borderRadius,
px: theme.spacing(4),
pl: theme.spacing(5),
}}
>
<ListItemIcon sx={{ minWidth: 0 }}>{item.icon} </ListItemIcon>
<ListItemText>{item.name} </ListItemText>{" "}
</ListItemButton>
</Tooltip>
) : null;
}}
/>
);
})}
</List>
<Divider sx={{ mt: "auto", borderColor: theme.palette.primary.lowContrast }} />
<Stack
direction="row"
height="50px"
alignItems="center"
py={theme.spacing(4)}
px={theme.spacing(8)}
gap={theme.spacing(2)}
borderRadius={theme.shape.borderRadius}
>
{collapsed ? (
<>
<Tooltip
title="Options"
slotProps={{
popper: {
modifiers: [
{
name: "offset",
options: {
offset: [0, -10],
},
},
],
},
}}
disableInteractive
>
<IconButton
onClick={(event) => openPopup(event, "logout")}
sx={{ p: 0, "&:focus": { outline: "none" } }}
>
<Avatar small={true} />
</IconButton>
</Tooltip>
</>
) : (
<>
<Avatar small={true} />
<Box
ml={theme.spacing(2)}
sx={{ maxWidth: "50%", overflow: "hidden" }}
>
<Typography
component="span"
fontWeight={500}
sx={{
display: "block",
whiteSpace: "nowrap",
overflow: "hidden",
textOverflow: "ellipsis",
}}
>
{authState.user?.firstName} {authState.user?.lastName}
</Typography>
<Typography sx={{ textTransform: "capitalize" }}>
{authState.user?.role?.includes("superadmin")
? t("roles.superAdmin")
: authState.user?.role?.includes("admin")
? t("roles.admin")
: authState.user?.role?.includes("user")
? t("roles.teamMember")
: authState.user?.role?.includes("demo")
? t("roles.demoUser")
: authState.user?.role}
</Typography>
</Box>
<Stack
className="sidebar-delay-fade"
flexDirection={"row"}
marginLeft={"auto"}
columnGap={theme.spacing(2)}
>
<ThemeSwitch color={iconColor} />
<Tooltip
title={t("navControls")}
disableInteractive
>
<IconButton
sx={{
ml: "auto",
mr: "-8px",
"&:focus": { outline: "none" },
alignSelf: "center",
padding: "10px",
"& svg": {
width: "22px",
height: "22px",
},
"& svg path": {
/* Vertical three dots */
stroke: iconColor,
},
}}
onClick={(event) => openPopup(event, "logout")}
>
<DotsVertical />
</IconButton>
</Tooltip>
</Stack>
</>
)}
<Menu
className="sidebar-popup"
anchorEl={anchorEl}
open={Boolean(anchorEl) && popup === "logout"}
onClose={closePopup}
disableScrollLock
anchorOrigin={{
vertical: "top",
horizontal: "right",
}}
slotProps={{
paper: {
sx: {
marginTop: theme.spacing(-4),
marginLeft: collapsed ? theme.spacing(2) : 0,
},
},
}}
MenuListProps={{
sx: {
p: 2,
"& li": { m: 0 },
"& li:has(.MuiBox-root):hover": {
backgroundColor: "transparent",
},
},
}}
sx={{
ml: theme.spacing(4),
}}
>
{collapsed && (
<MenuItem sx={{ cursor: "default", minWidth: "50%" }}>
<Box
mb={theme.spacing(2)}
sx={{
minWidth: "50%",
maxWidth: "max-content",
overflow: "visible",
whiteSpace: "nowrap",
}}
>
<Typography
component="span"
fontWeight={500}
fontSize={13}
sx={{
display: "block",
whiteSpace: "nowrap",
overflow: "visible",
// wordBreak: "break-word",
textOverflow: "clip",
}}
>
{authState.user?.firstName} {authState.user?.lastName}
</Typography>
<Typography
sx={{
textTransform: "capitalize",
fontSize: 12,
whiteSpace: "nowrap",
overflow: "visible",
// wordBreak: "break-word",
}}
>
{authState.user?.role}
</Typography>
</Box>
</MenuItem>
)}
{/* TODO Do we need two dividers? */}
{collapsed && <Divider />}
{/* <Divider /> */}
{renderAccountMenuItems()}
<MenuItem
onClick={logout}
sx={{
gap: theme.spacing(4),
borderRadius: theme.shape.borderRadius,
pl: theme.spacing(4),
"& svg path": {
stroke: iconColor,
},
}}
>
<LogoutSvg />
{t("menu.logOut", "Log out")}
</MenuItem>
</Menu>
</Stack>
<AuthFooter
collapsed={collapsed}
accountMenuItems={accountMenuItems}
/>
</Stack>
);
}
};
export default Sidebar;
@@ -33,7 +33,6 @@ const StarPrompt = ({ repoUrl = "https://github.com/bluewave-labs/checkmate" })
borderBottom: `1px solid ${theme.palette.primary.lowContrast}`,
borderRadius: 0,
gap: theme.spacing(1.5),
backgroundColor: theme.palette.primary.main,
}}
>
<Stack
+4 -4
View File
@@ -2,7 +2,7 @@ import { Stack, Typography } from "@mui/material";
import Image from "../Image";
import { useTheme } from "@mui/material/styles";
import PropTypes from "prop-types";
import useUtils from "../../Pages/Uptime/Monitors/Hooks/useUtils";
import { useMonitorUtils } from "../../Hooks/useMonitorUtils";
/**
* StatBox Component
@@ -41,7 +41,7 @@ const StatBox = ({
sx,
}) => {
const theme = useTheme();
const { statusToTheme } = useUtils();
const { statusToTheme } = useMonitorUtils();
const themeColor = statusToTheme[status];
const statusBoxStyles = gradient
@@ -136,8 +136,8 @@ const StatBox = ({
};
StatBox.propTypes = {
heading: PropTypes.string.isRequired,
subHeading: PropTypes.node.isRequired,
heading: PropTypes.string,
subHeading: PropTypes.node,
gradient: PropTypes.bool,
status: PropTypes.string,
sx: PropTypes.object,
+1 -1
View File
@@ -4,7 +4,7 @@ import SkeletonLayout from "./skeleton";
// Utils
import { useTheme } from "@mui/material/styles";
import PropTypes from "prop-types";
const StatusBoxes = ({ shouldRender, flexWrap = "nowrap", children }) => {
const StatusBoxes = ({ shouldRender = true, flexWrap = "nowrap", children }) => {
const theme = useTheme();
if (!shouldRender) {
return (
+1
View File
@@ -16,6 +16,7 @@ const CustomTabList = ({ value, onChange, children, ...props }) => {
return (
<Box
sx={{
marginBottom: theme.spacing(12),
borderBottom: `1px solid ${theme.palette.primary.lowContrast}`,
"& .MuiTabs-root": { height: "fit-content", minHeight: "0" },
}}
@@ -1,9 +1,7 @@
import PropTypes from "prop-types";
import { Box, Button } from "@mui/material";
import LeftArrowDouble from "../../../../assets/icons/left-arrow-double.svg?react";
import RightArrowDouble from "../../../../assets/icons/right-arrow-double.svg?react";
import LeftArrow from "../../../../assets/icons/left-arrow.svg?react";
import RightArrow from "../../../../assets/icons/right-arrow.svg?react";
import LeftArrow from "../../../ArrowLeft";
import RightArrow from "../../../ArrowRight";
import { useTheme } from "@emotion/react";
TablePaginationActions.propTypes = {
@@ -50,7 +48,7 @@ function TablePaginationActions({ count, page, rowsPerPage, onPageChange }) {
disabled={page === 0}
aria-label="first page"
>
<LeftArrowDouble />
<LeftArrow type="double" />
</Button>
<Button
variant="group"
@@ -74,7 +72,7 @@ function TablePaginationActions({ count, page, rowsPerPage, onPageChange }) {
disabled={page >= Math.ceil(count / rowsPerPage) - 1}
aria-label="last page"
>
<RightArrowDouble />
<RightArrow type="double" />
</Button>
</Box>
);
+11
View File
@@ -0,0 +1,11 @@
export const createHeaderFactory = (getCellSx = () => {}) => {
return ({ id, content, onClick = () => {}, render = () => {} }) => {
return {
id,
content,
onClick,
getCellSx,
render,
};
};
};
+3
View File
@@ -70,6 +70,9 @@ const DataTable = ({
backgroundColor: theme.palette.primary.main,
color: theme.palette.primary.contrastTextSecondary,
},
"& .MuiTableBody-root .MuiTableRow-root:last-child .MuiTableCell-root": {
borderBottom: "none",
},
}}
>
<TableHead>
+36
View File
@@ -0,0 +1,36 @@
import Typography from "@mui/material/Typography";
import Stack from "@mui/material/Stack";
import Link from "@mui/material/Link";
import PropTypes from "prop-types";
import { useTheme } from "@emotion/react";
import { Link as RouterLink } from "react-router-dom";
const TextLink = ({ text, linkText, href, target = "_self" }) => {
const theme = useTheme();
return (
<Stack
direction="row"
gap={theme.spacing(4)}
>
<Typography>{text}</Typography>
<Link
color="accent"
to={href}
component={RouterLink}
target={target}
>
{linkText}
</Link>
</Stack>
);
};
TextLink.propTypes = {
text: PropTypes.string,
linkText: PropTypes.string,
href: PropTypes.string,
target: PropTypes.string,
};
export default TextLink;
+3 -1
View File
@@ -14,10 +14,12 @@ import SunAndMoonIcon from "./SunAndMoonIcon";
import { useDispatch, useSelector } from "react-redux";
import { setMode } from "../../Features/UI/uiSlice";
import "./index.css";
import { useTranslation } from "react-i18next";
const ThemeSwitch = ({ width = 48, height = 48, color }) => {
const mode = useSelector((state) => state.ui.mode);
const dispatch = useDispatch();
const { t } = useTranslation();
const toggleTheme = () => {
dispatch(setMode(mode === "light" ? "dark" : "light"));
@@ -26,7 +28,7 @@ const ThemeSwitch = ({ width = 48, height = 48, color }) => {
return (
<IconButton
id="theme-toggle"
title="Toggles light & dark"
title={t("common.buttons.toggleTheme")}
className={`theme-${mode}`}
aria-label="auto"
aria-live="polite"
+34
View File
@@ -0,0 +1,34 @@
import Stack from "@mui/material/Stack";
import Typography from "@mui/material/Typography";
import { useTheme } from "@emotion/react";
import PropTypes from "prop-types";
const ToastBody = ({ body }) => {
const theme = useTheme();
if (Array.isArray(body)) {
return (
<Stack gap={theme.spacing(2)}>
{body.map((item, idx) => (
<Typography
key={`item-${idx}`}
color={theme.palette.secondary.contrastText}
>
{item}
</Typography>
))}
</Stack>
);
} else if (typeof body === "string") {
return <Typography color={theme.palette.secondary.contrastText}>{body}</Typography>;
}
return null;
};
ToastBody.propTypes = {
body: PropTypes.oneOfType([PropTypes.string, PropTypes.array]),
};
export default ToastBody;
+96
View File
@@ -0,0 +1,96 @@
import Stack from "@mui/material/Stack";
import IconButton from "@mui/material/IconButton";
import Typography from "@mui/material/Typography";
import Button from "@mui/material/Button";
import ToastBody from "./body";
import InfoOutlinedIcon from "@mui/icons-material/InfoOutlined";
import ErrorOutlineOutlinedIcon from "@mui/icons-material/ErrorOutlineOutlined";
import WarningAmberOutlinedIcon from "@mui/icons-material/WarningAmberOutlined";
import CloseIcon from "@mui/icons-material/Close";
// Utils
import { useTheme } from "@emotion/react";
import PropTypes from "prop-types";
const icons = {
info: <InfoOutlinedIcon />,
error: <ErrorOutlineOutlinedIcon />,
warning: <WarningAmberOutlinedIcon />,
};
const Toast = ({ variant, title, body, onClick, hasDismiss, hasIcon }) => {
const theme = useTheme();
const icon = icons[variant];
return (
<Stack
gap={theme.spacing(2)}
paddingTop={theme.spacing(4)}
paddingRight={theme.spacing(8)}
paddingBottom={theme.spacing(4)}
paddingLeft={theme.spacing(8)}
backgroundColor={theme.palette.alert.main}
border={`solid 1px ${theme.palette.alert.contrastText}`}
borderRadius={theme.shape.borderRadius}
>
<Stack
direction="row"
gap={theme.spacing(8)}
justifyContent="space-between"
alignItems="center"
>
{hasIcon && icon}
{title && (
<Typography
fontWeight="700"
color={theme.palette.secondary.contrastText}
>
{title}
</Typography>
)}
{title && (
<IconButton onClick={onClick}>
<CloseIcon />
</IconButton>
)}
</Stack>
<Stack
direction="row"
gap={theme.spacing(2)}
alignItems="center"
>
<ToastBody body={body} />
{!title && (
<IconButton onClick={onClick}>
<CloseIcon />
</IconButton>
)}
</Stack>
{hasDismiss && (
<Button
variant="text"
color="info"
onClick={onClick}
sx={{
fontWeight: "600",
width: "fit-content",
}}
>
Dismiss
</Button>
)}
</Stack>
);
};
export default Toast;
Toast.propTypes = {
variant: PropTypes.string.isRequired,
title: PropTypes.string,
body: PropTypes.oneOfType([PropTypes.string, PropTypes.array]),
hasDismiss: PropTypes.bool,
hasIcon: PropTypes.bool,
onClick: PropTypes.func,
};
+1 -5
View File
@@ -44,7 +44,6 @@ export const login = createAsyncThunk("auth/login", async (form, thunkApi) => {
export const update = createAsyncThunk("auth/update", async (data, thunkApi) => {
const { localData: form } = data;
const user = thunkApi.getState().auth.user;
try {
const fd = new FormData();
form.firstName && fd.append("firstName", form.firstName);
@@ -60,7 +59,6 @@ export const update = createAsyncThunk("auth/update", async (data, thunkApi) =>
form.deleteProfileImage && fd.append("deleteProfileImage", form.deleteProfileImage);
const res = await networkService.updateUser({
userId: user._id,
form: fd,
});
return res.data;
@@ -77,10 +75,8 @@ export const update = createAsyncThunk("auth/update", async (data, thunkApi) =>
});
export const deleteUser = createAsyncThunk("auth/delete", async (_, thunkApi) => {
const user = thunkApi.getState().auth.user;
try {
const res = await networkService.deleteUser({ userId: user._id });
const res = await networkService.deleteUser();
return res.data;
} catch (error) {
if (error.response && error.response.data) {
Loaded 100 of 550 files, more files were not shown because too many files have changed in this diff. Show more