From e4a39223a33d4bfccb1e9b4e2c30de1376879a1d Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Wed, 5 Mar 2025 21:33:39 +0000 Subject: [PATCH 01/10] fix(deps): update dependency ioredis to v5.6.0 (#2509) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- packages/log/package.json | 2 +- packages/redis/package.json | 2 +- pnpm-lock.yaml | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/log/package.json b/packages/log/package.json index 73bef5d32..3c4c4ce3e 100644 --- a/packages/log/package.json +++ b/packages/log/package.json @@ -24,7 +24,7 @@ "prettier": "@homarr/prettier-config", "dependencies": { "@homarr/env": "workspace:^0.1.0", - "ioredis": "5.5.0", + "ioredis": "5.6.0", "superjson": "2.2.2", "winston": "3.17.0", "zod": "^3.24.2" diff --git a/packages/redis/package.json b/packages/redis/package.json index 260aa1449..e77630db6 100644 --- a/packages/redis/package.json +++ b/packages/redis/package.json @@ -26,7 +26,7 @@ "@homarr/db": "workspace:^", "@homarr/definitions": "workspace:^", "@homarr/log": "workspace:^", - "ioredis": "5.5.0", + "ioredis": "5.6.0", "superjson": "2.2.2" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3281da641..5290585e9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1332,8 +1332,8 @@ importers: specifier: workspace:^0.1.0 version: link:../env ioredis: - specifier: 5.5.0 - version: 5.5.0 + specifier: 5.6.0 + version: 5.6.0 superjson: specifier: 2.2.2 version: 2.2.2 @@ -1648,8 +1648,8 @@ importers: specifier: workspace:^ version: link:../log ioredis: - specifier: 5.5.0 - version: 5.5.0 + specifier: 5.6.0 + version: 5.6.0 superjson: specifier: 2.2.2 version: 2.2.2 @@ -6914,8 +6914,8 @@ packages: invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} - ioredis@5.5.0: - resolution: {integrity: sha512-7CutT89g23FfSa8MDoIFs2GYYa0PaNiW/OrT+nRyjRXHDZd17HmIgy+reOQ/yhh72NznNjGuS8kbCAcA4Ro4mw==} + ioredis@5.6.0: + resolution: {integrity: sha512-tBZlIIWbndeWBWCXWZiqtOF/yxf6yZX3tAlTJ7nfo5jhd6dctNxF7QnYlZLZ1a0o0pDoen7CgZqO+zjNaFbJAg==} engines: {node: '>=12.22.0'} ip-address@9.0.5: @@ -15478,7 +15478,7 @@ snapshots: dependencies: loose-envify: 1.4.0 - ioredis@5.5.0: + ioredis@5.6.0: dependencies: '@ioredis/commands': 1.2.0 cluster-key-slot: 1.1.2 From 6f8b3de903bd1825f655798603cca91fadfb6eb5 Mon Sep 17 00:00:00 2001 From: "homarr-crowdin[bot]" <190541745+homarr-crowdin[bot]@users.noreply.github.com> Date: Thu, 6 Mar 2025 00:47:27 +0000 Subject: [PATCH 02/10] chore(lang): updated translations from crowdin Co-authored-by: Crowdin Homarr <190541745+homarr-crowdin[bot]@users.noreply.github.com> --- packages/translation/src/lang/tr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/translation/src/lang/tr.json b/packages/translation/src/lang/tr.json index f82d8348f..249b746b4 100644 --- a/packages/translation/src/lang/tr.json +++ b/packages/translation/src/lang/tr.json @@ -784,7 +784,7 @@ }, "tokenId": { "label": "Token Anahtar Kimliği", - "newLabel": "Yeni Anahtar Kimliği" + "newLabel": "Yeni Token Anahtar Kimliği" }, "realm": { "label": "Erişim Alanı", From 67c739c35bcb2d537a349f0ebff080eac67e93b5 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Thu, 6 Mar 2025 06:19:00 +0000 Subject: [PATCH 03/10] fix(deps): update dependency mysql2 to v3.13.0 (#2516) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- packages/db/package.json | 2 +- pnpm-lock.yaml | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/db/package.json b/packages/db/package.json index 3e763be54..80e57f99b 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -52,7 +52,7 @@ "drizzle-kit": "^0.30.5", "drizzle-orm": "^0.40.0", "drizzle-zod": "^0.7.0", - "mysql2": "3.12.0" + "mysql2": "3.13.0" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5290585e9..5bbe04538 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1031,13 +1031,13 @@ importers: version: 0.30.5 drizzle-orm: specifier: ^0.40.0 - version: 0.40.0(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.12)(better-sqlite3@11.8.1)(gel@2.0.0)(mysql2@3.12.0) + version: 0.40.0(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.12)(better-sqlite3@11.8.1)(gel@2.0.0)(mysql2@3.13.0) drizzle-zod: specifier: ^0.7.0 - version: 0.7.0(drizzle-orm@0.40.0(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.12)(better-sqlite3@11.8.1)(gel@2.0.0)(mysql2@3.12.0))(zod@3.24.2) + version: 0.7.0(drizzle-orm@0.40.0(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.12)(better-sqlite3@11.8.1)(gel@2.0.0)(mysql2@3.13.0))(zod@3.24.2) mysql2: - specifier: 3.12.0 - version: 3.12.0 + specifier: 3.13.0 + version: 3.13.0 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -7653,8 +7653,8 @@ packages: engines: {node: '>=8', npm: '>=5'} hasBin: true - mysql2@3.12.0: - resolution: {integrity: sha512-C8fWhVysZoH63tJbX8d10IAoYCyXy4fdRFz2Ihrt9jtPILYynFEKUUzpp1U7qxzDc3tMbotvaBH+sl6bFnGZiw==} + mysql2@3.13.0: + resolution: {integrity: sha512-M6DIQjTqKeqXH5HLbLMxwcK5XfXHw30u5ap6EZmu7QVmcF/gnh2wS/EOiQ4MTbXz/vQeoXrmycPlVRM00WSslg==} engines: {node: '>= 8.0'} mz@2.7.0: @@ -14194,17 +14194,17 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.40.0(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.12)(better-sqlite3@11.8.1)(gel@2.0.0)(mysql2@3.12.0): + drizzle-orm@0.40.0(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.12)(better-sqlite3@11.8.1)(gel@2.0.0)(mysql2@3.13.0): optionalDependencies: '@libsql/client-wasm': 0.14.0 '@types/better-sqlite3': 7.6.12 better-sqlite3: 11.8.1 gel: 2.0.0 - mysql2: 3.12.0 + mysql2: 3.13.0 - drizzle-zod@0.7.0(drizzle-orm@0.40.0(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.12)(better-sqlite3@11.8.1)(gel@2.0.0)(mysql2@3.12.0))(zod@3.24.2): + drizzle-zod@0.7.0(drizzle-orm@0.40.0(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.12)(better-sqlite3@11.8.1)(gel@2.0.0)(mysql2@3.13.0))(zod@3.24.2): dependencies: - drizzle-orm: 0.40.0(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.12)(better-sqlite3@11.8.1)(gel@2.0.0)(mysql2@3.12.0) + drizzle-orm: 0.40.0(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.12)(better-sqlite3@11.8.1)(gel@2.0.0)(mysql2@3.13.0) zod: 3.24.2 dunder-proto@1.0.1: @@ -16191,7 +16191,7 @@ snapshots: '@babel/runtime': 7.25.6 global: 4.4.0 - mysql2@3.12.0: + mysql2@3.13.0: dependencies: aws-ssl-profiles: 1.1.2 denque: 2.1.0 From 98dd96f37c63fbbbaa338c793090c0556370d98b Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Thu, 6 Mar 2025 15:37:30 +0000 Subject: [PATCH 04/10] chore(deps): update vitest monorepo to ^3.0.8 (#2519) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- package.json | 6 +-- pnpm-lock.yaml | 131 ++++++++++++++++++++++++------------------------- 2 files changed, 66 insertions(+), 71 deletions(-) diff --git a/package.json b/package.json index fc58a2e09..9b798c312 100644 --- a/package.json +++ b/package.json @@ -40,8 +40,8 @@ "@semantic-release/release-notes-generator": "^14.0.3", "@turbo/gen": "^2.4.4", "@vitejs/plugin-react": "^4.3.4", - "@vitest/coverage-v8": "^3.0.7", - "@vitest/ui": "^3.0.7", + "@vitest/coverage-v8": "^3.0.8", + "@vitest/ui": "^3.0.8", "conventional-changelog-conventionalcommits": "^8.0.0", "cross-env": "^7.0.3", "jsdom": "^26.0.0", @@ -51,7 +51,7 @@ "turbo": "^2.4.4", "typescript": "^5.8.2", "vite-tsconfig-paths": "^5.1.4", - "vitest": "^3.0.7" + "vitest": "^3.0.8" }, "packageManager": "pnpm@10.5.2", "engines": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5bbe04538..91ba1d8d0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,11 +44,11 @@ importers: specifier: ^4.3.4 version: 4.3.4(vite@5.4.5(@types/node@22.13.9)(sass@1.85.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)) '@vitest/coverage-v8': - specifier: ^3.0.7 - version: 3.0.7(vitest@3.0.7) + specifier: ^3.0.8 + version: 3.0.8(vitest@3.0.8) '@vitest/ui': - specifier: ^3.0.7 - version: 3.0.7(vitest@3.0.7) + specifier: ^3.0.8 + version: 3.0.8(vitest@3.0.8) conventional-changelog-conventionalcommits: specifier: ^8.0.0 version: 8.0.0 @@ -77,8 +77,8 @@ importers: specifier: ^5.1.4 version: 5.1.4(typescript@5.8.2)(vite@5.4.5(@types/node@22.13.9)(sass@1.85.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)) vitest: - specifier: ^3.0.7 - version: 3.0.7(@types/node@22.13.9)(@vitest/ui@3.0.7)(jsdom@26.0.0)(sass@1.85.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) + specifier: ^3.0.8 + version: 3.0.8(@types/node@22.13.9)(@vitest/ui@3.0.8)(jsdom@26.0.0)(sass@1.85.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) apps/nextjs: dependencies: @@ -4831,20 +4831,20 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 - '@vitest/coverage-v8@3.0.7': - resolution: {integrity: sha512-Av8WgBJLTrfLOer0uy3CxjlVuWK4CzcLBndW1Nm2vI+3hZ2ozHututkfc7Blu1u6waeQ7J8gzPK/AsBRnWA5mQ==} + '@vitest/coverage-v8@3.0.8': + resolution: {integrity: sha512-y7SAKsQirsEJ2F8bulBck4DoluhI2EEgTimHd6EEUgJBGKy9tC25cpywh1MH4FvDGoG2Unt7+asVd1kj4qOSAw==} peerDependencies: - '@vitest/browser': 3.0.7 - vitest: 3.0.7 + '@vitest/browser': 3.0.8 + vitest: 3.0.8 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@3.0.7': - resolution: {integrity: sha512-QP25f+YJhzPfHrHfYHtvRn+uvkCFCqFtW9CktfBxmB+25QqWsx7VB2As6f4GmwllHLDhXNHvqedwhvMmSnNmjw==} + '@vitest/expect@3.0.8': + resolution: {integrity: sha512-Xu6TTIavTvSSS6LZaA3EebWFr6tsoXPetOWNMOlc7LO88QVVBwq2oQWBoDiLCN6YTvNYsGSjqOO8CAdjom5DCQ==} - '@vitest/mocker@3.0.7': - resolution: {integrity: sha512-qui+3BLz9Eonx4EAuR/i+QlCX6AUZ35taDQgwGkK/Tw6/WgwodSrjN1X2xf69IA/643ZX5zNKIn2svvtZDrs4w==} + '@vitest/mocker@3.0.8': + resolution: {integrity: sha512-n3LjS7fcW1BCoF+zWZxG7/5XvuYH+lsFg+BDwwAz0arIwHQJFUEsKBQ0BLU49fCxuM/2HSeBPHQD8WjgrxMfow==} peerDependencies: msw: ^2.4.9 vite: ^5.0.0 || ^6.0.0 @@ -4854,25 +4854,25 @@ packages: vite: optional: true - '@vitest/pretty-format@3.0.7': - resolution: {integrity: sha512-CiRY0BViD/V8uwuEzz9Yapyao+M9M008/9oMOSQydwbwb+CMokEq3XVaF3XK/VWaOK0Jm9z7ENhybg70Gtxsmg==} + '@vitest/pretty-format@3.0.8': + resolution: {integrity: sha512-BNqwbEyitFhzYMYHUVbIvepOyeQOSFA/NeJMIP9enMntkkxLgOcgABH6fjyXG85ipTgvero6noreavGIqfJcIg==} - '@vitest/runner@3.0.7': - resolution: {integrity: sha512-WeEl38Z0S2ZcuRTeyYqaZtm4e26tq6ZFqh5y8YD9YxfWuu0OFiGFUbnxNynwLjNRHPsXyee2M9tV7YxOTPZl2g==} + '@vitest/runner@3.0.8': + resolution: {integrity: sha512-c7UUw6gEcOzI8fih+uaAXS5DwjlBaCJUo7KJ4VvJcjL95+DSR1kova2hFuRt3w41KZEFcOEiq098KkyrjXeM5w==} - '@vitest/snapshot@3.0.7': - resolution: {integrity: sha512-eqTUryJWQN0Rtf5yqCGTQWsCFOQe4eNz5Twsu21xYEcnFJtMU5XvmG0vgebhdLlrHQTSq5p8vWHJIeJQV8ovsA==} + '@vitest/snapshot@3.0.8': + resolution: {integrity: sha512-x8IlMGSEMugakInj44nUrLSILh/zy1f2/BgH0UeHpNyOocG18M9CWVIFBaXPt8TrqVZWmcPjwfG/ht5tnpba8A==} - '@vitest/spy@3.0.7': - resolution: {integrity: sha512-4T4WcsibB0B6hrKdAZTM37ekuyFZt2cGbEGd2+L0P8ov15J1/HUsUaqkXEQPNAWr4BtPPe1gI+FYfMHhEKfR8w==} + '@vitest/spy@3.0.8': + resolution: {integrity: sha512-MR+PzJa+22vFKYb934CejhR4BeRpMSoxkvNoDit68GQxRLSf11aT6CTj3XaqUU9rxgWJFnqicN/wxw6yBRkI1Q==} - '@vitest/ui@3.0.7': - resolution: {integrity: sha512-bogkkSaVdSTRj02TfypjrqrLCeEc/tA5V4gAVM843Rp5JtIub3xaij+qjsSnS6CseLQJUSdDCFaFqPMmymRJKQ==} + '@vitest/ui@3.0.8': + resolution: {integrity: sha512-MfTjaLU+Gw/lYorgwFZ06Cym+Mj9hPfZh/Q91d4JxyAHiicAakPTvS7zYCSHF+5cErwu2PVBe1alSjuh6L/UiA==} peerDependencies: - vitest: 3.0.7 + vitest: 3.0.8 - '@vitest/utils@3.0.7': - resolution: {integrity: sha512-xePVpCRfooFX3rANQjwoditoXgWb1MaFbzmGuPP59MK6i13mrnDw/yEIyJudLeW6/38mCNcwCiJIGmpDPibAIg==} + '@vitest/utils@3.0.8': + resolution: {integrity: sha512-nkBC3aEhfX2PdtQI/QwAWp8qZWwzASsU4Npbcd5RdMPBSSLCpkZp52P3xku3s3uA0HIEhGvEcF8rNkBsz9dQ4Q==} '@webassemblyjs/ast@1.12.1': resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} @@ -6448,9 +6448,6 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.3.2: - resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} - flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} @@ -9884,8 +9881,8 @@ packages: videojs-vtt.js@0.15.5: resolution: {integrity: sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ==} - vite-node@3.0.7: - resolution: {integrity: sha512-2fX0QwX4GkkkpULXdT1Pf4q0tC1i1lFOyseKoonavXUNlQ77KpW2XqBGGNIm/J4Ows4KxgGJzDguYVPKwG/n5A==} + vite-node@3.0.8: + resolution: {integrity: sha512-6PhR4H9VGlcwXZ+KWCdMqbtG649xCPZqfI9j2PsK1FcXgEzro5bGHcVKFCTqPLaNKZES8Evqv4LwvZARsq5qlg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true @@ -9928,16 +9925,16 @@ packages: terser: optional: true - vitest@3.0.7: - resolution: {integrity: sha512-IP7gPK3LS3Fvn44x30X1dM9vtawm0aesAa2yBIZ9vQf+qB69NXC5776+Qmcr7ohUXIQuLhk7xQR0aSUIDPqavg==} + vitest@3.0.8: + resolution: {integrity: sha512-dfqAsNqRGUc8hB9OVR2P0w8PZPEckti2+5rdZip0WIz9WW0MnImJ8XiR61QhqLa92EQzKP2uPkzenKOAHyEIbA==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.0.7 - '@vitest/ui': 3.0.7 + '@vitest/browser': 3.0.8 + '@vitest/ui': 3.0.8 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -12993,7 +12990,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@3.0.7(vitest@3.0.7)': + '@vitest/coverage-v8@3.0.8(vitest@3.0.8)': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -13007,58 +13004,58 @@ snapshots: std-env: 3.8.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.0.7(@types/node@22.13.9)(@vitest/ui@3.0.7)(jsdom@26.0.0)(sass@1.85.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) + vitest: 3.0.8(@types/node@22.13.9)(@vitest/ui@3.0.8)(jsdom@26.0.0)(sass@1.85.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) transitivePeerDependencies: - supports-color - '@vitest/expect@3.0.7': + '@vitest/expect@3.0.8': dependencies: - '@vitest/spy': 3.0.7 - '@vitest/utils': 3.0.7 + '@vitest/spy': 3.0.8 + '@vitest/utils': 3.0.8 chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.7(vite@5.4.5(@types/node@22.13.9)(sass@1.85.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0))': + '@vitest/mocker@3.0.8(vite@5.4.5(@types/node@22.13.9)(sass@1.85.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0))': dependencies: - '@vitest/spy': 3.0.7 + '@vitest/spy': 3.0.8 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: vite: 5.4.5(@types/node@22.13.9)(sass@1.85.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) - '@vitest/pretty-format@3.0.7': + '@vitest/pretty-format@3.0.8': dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.0.7': + '@vitest/runner@3.0.8': dependencies: - '@vitest/utils': 3.0.7 + '@vitest/utils': 3.0.8 pathe: 2.0.3 - '@vitest/snapshot@3.0.7': + '@vitest/snapshot@3.0.8': dependencies: - '@vitest/pretty-format': 3.0.7 + '@vitest/pretty-format': 3.0.8 magic-string: 0.30.17 pathe: 2.0.3 - '@vitest/spy@3.0.7': + '@vitest/spy@3.0.8': dependencies: tinyspy: 3.0.2 - '@vitest/ui@3.0.7(vitest@3.0.7)': + '@vitest/ui@3.0.8(vitest@3.0.8)': dependencies: - '@vitest/utils': 3.0.7 + '@vitest/utils': 3.0.8 fflate: 0.8.2 flatted: 3.3.3 pathe: 2.0.3 sirv: 3.0.1 tinyglobby: 0.2.12 tinyrainbow: 2.0.0 - vitest: 3.0.7(@types/node@22.13.9)(@vitest/ui@3.0.7)(jsdom@26.0.0)(sass@1.85.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) + vitest: 3.0.8(@types/node@22.13.9)(@vitest/ui@3.0.8)(jsdom@26.0.0)(sass@1.85.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) - '@vitest/utils@3.0.7': + '@vitest/utils@3.0.8': dependencies: - '@vitest/pretty-format': 3.0.7 + '@vitest/pretty-format': 3.0.8 loupe: 3.1.3 tinyrainbow: 2.0.0 @@ -14940,11 +14937,9 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.3.2 + flatted: 3.3.3 keyv: 4.5.4 - flatted@3.3.2: {} - flatted@3.3.3: {} fn.name@1.1.0: {} @@ -18687,7 +18682,7 @@ snapshots: dependencies: global: 4.4.0 - vite-node@3.0.7(@types/node@22.13.9)(sass@1.85.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0): + vite-node@3.0.8(@types/node@22.13.9)(sass@1.85.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0): dependencies: cac: 6.7.14 debug: 4.4.0 @@ -18728,15 +18723,15 @@ snapshots: sugarss: 4.0.1(postcss@8.4.47) terser: 5.32.0 - vitest@3.0.7(@types/node@22.13.9)(@vitest/ui@3.0.7)(jsdom@26.0.0)(sass@1.85.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0): + vitest@3.0.8(@types/node@22.13.9)(@vitest/ui@3.0.8)(jsdom@26.0.0)(sass@1.85.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0): dependencies: - '@vitest/expect': 3.0.7 - '@vitest/mocker': 3.0.7(vite@5.4.5(@types/node@22.13.9)(sass@1.85.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)) - '@vitest/pretty-format': 3.0.7 - '@vitest/runner': 3.0.7 - '@vitest/snapshot': 3.0.7 - '@vitest/spy': 3.0.7 - '@vitest/utils': 3.0.7 + '@vitest/expect': 3.0.8 + '@vitest/mocker': 3.0.8(vite@5.4.5(@types/node@22.13.9)(sass@1.85.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)) + '@vitest/pretty-format': 3.0.8 + '@vitest/runner': 3.0.8 + '@vitest/snapshot': 3.0.8 + '@vitest/spy': 3.0.8 + '@vitest/utils': 3.0.8 chai: 5.2.0 debug: 4.4.0 expect-type: 1.1.0 @@ -18748,11 +18743,11 @@ snapshots: tinypool: 1.0.2 tinyrainbow: 2.0.0 vite: 5.4.5(@types/node@22.13.9)(sass@1.85.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) - vite-node: 3.0.7(@types/node@22.13.9)(sass@1.85.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) + vite-node: 3.0.8(@types/node@22.13.9)(sass@1.85.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.13.9 - '@vitest/ui': 3.0.7(vitest@3.0.7) + '@vitest/ui': 3.0.8(vitest@3.0.8) jsdom: 26.0.0 transitivePeerDependencies: - less From 3403579925013879c65e12f0792f23461fce2dd2 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Thu, 6 Mar 2025 17:57:48 +0100 Subject: [PATCH 05/10] chore(issue-template): add missing homarr versions until 1.9.0 --- .github/ISSUE_TEMPLATE/bug_report.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 7b1ad9bc7..fde418afc 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -31,6 +31,9 @@ body: label: Version description: What version of Homarr are you running? options: + - 1.9.0 + - 1.8.0 + - 1.7.0 - 1.6.0 - 1.5.0 - 1.4.0 From 15026afa46608176e38042f17aaf09382c449c9f Mon Sep 17 00:00:00 2001 From: "homarr-crowdin[bot]" <190541745+homarr-crowdin[bot]@users.noreply.github.com> Date: Fri, 7 Mar 2025 00:47:20 +0000 Subject: [PATCH 06/10] chore(lang): updated translations from crowdin Co-authored-by: Crowdin Homarr <190541745+homarr-crowdin[bot]@users.noreply.github.com> --- packages/translation/src/lang/cn.json | 10 +++++----- packages/translation/src/lang/he.json | 10 +++++----- packages/translation/src/lang/zh.json | 10 +++++----- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/packages/translation/src/lang/cn.json b/packages/translation/src/lang/cn.json index 73b99b8cd..458d98907 100644 --- a/packages/translation/src/lang/cn.json +++ b/packages/translation/src/lang/cn.json @@ -974,7 +974,7 @@ }, "option": { "borderColor": { - "label": "" + "label": "边界颜色" } }, "remove": { @@ -1822,10 +1822,10 @@ "available": "可用" }, "status": { - "pending": "", - "approved": "", - "declined": "", - "failed": "" + "pending": "待处理", + "approved": "已批准", + "declined": "已拒绝", + "failed": "失败" }, "toBeDetermined": "待定" }, diff --git a/packages/translation/src/lang/he.json b/packages/translation/src/lang/he.json index a7bcf29ff..e8f736f5d 100644 --- a/packages/translation/src/lang/he.json +++ b/packages/translation/src/lang/he.json @@ -974,7 +974,7 @@ }, "option": { "borderColor": { - "label": "" + "label": "צבע מסגרת" } }, "remove": { @@ -1822,10 +1822,10 @@ "available": "זמין" }, "status": { - "pending": "", - "approved": "", - "declined": "", - "failed": "" + "pending": "ממתין", + "approved": "אושר", + "declined": "נדחה", + "failed": "נכשל" }, "toBeDetermined": "ייקבע בהמשך" }, diff --git a/packages/translation/src/lang/zh.json b/packages/translation/src/lang/zh.json index 6bbf39eab..fef5b5a67 100644 --- a/packages/translation/src/lang/zh.json +++ b/packages/translation/src/lang/zh.json @@ -974,7 +974,7 @@ }, "option": { "borderColor": { - "label": "" + "label": "邊框顏色" } }, "remove": { @@ -1822,10 +1822,10 @@ "available": "待定" }, "status": { - "pending": "", - "approved": "", - "declined": "", - "failed": "" + "pending": "待處理", + "approved": "已批准", + "declined": "已拒絕", + "failed": "失敗" }, "toBeDetermined": "多媒體請求狀態" }, From 4721a97094ae1181216923c7fef7a29c343f882b Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Fri, 7 Mar 2025 10:19:12 +0000 Subject: [PATCH 07/10] fix(deps): update dependency eslint-config-prettier to ^10.1.1 (#2524) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 10 +++++----- tooling/eslint/package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 91ba1d8d0..479865112 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2167,8 +2167,8 @@ importers: specifier: 15.1.7 version: 15.1.7 eslint-config-prettier: - specifier: ^10.0.2 - version: 10.0.2(eslint@9.21.0) + specifier: ^10.1.1 + version: 10.1.1(eslint@9.21.0) eslint-config-turbo: specifier: ^2.4.4 version: 2.4.4(eslint@9.21.0)(turbo@2.4.4) @@ -6177,8 +6177,8 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-config-prettier@10.0.2: - resolution: {integrity: sha512-1105/17ZIMjmCOJOPNfVdbXafLCLj3hPmkmB7dLgt7XsQ/zkxSuDerE/xgO3RxoHysR1N1whmquY0lSn2O0VLg==} + eslint-config-prettier@10.1.1: + resolution: {integrity: sha512-4EQQr6wXwS+ZJSzaR5ZCrYgLxqvUjdXctaEtBqHcbkW944B1NQyO4qpdHQbXBONfwxXdkAY81HH4+LUfrg+zPw==} hasBin: true peerDependencies: eslint: '>=7.0.0' @@ -14597,7 +14597,7 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@10.0.2(eslint@9.21.0): + eslint-config-prettier@10.1.1(eslint@9.21.0): dependencies: eslint: 9.21.0 diff --git a/tooling/eslint/package.json b/tooling/eslint/package.json index ae078dd24..6212eb19a 100644 --- a/tooling/eslint/package.json +++ b/tooling/eslint/package.json @@ -18,7 +18,7 @@ "prettier": "@homarr/prettier-config", "dependencies": { "@next/eslint-plugin-next": "15.1.7", - "eslint-config-prettier": "^10.0.2", + "eslint-config-prettier": "^10.1.1", "eslint-config-turbo": "^2.4.4", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jsx-a11y": "^6.10.2", From a572aae887142a7e601f70dcc601bf6335e37c17 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Fri, 7 Mar 2025 11:15:49 +0000 Subject: [PATCH 08/10] fix(deps): update tanstack-query monorepo to ^5.67.2 (#2525) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- apps/nextjs/package.json | 6 ++-- pnpm-lock.yaml | 70 ++++++++++++++++++++-------------------- 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/apps/nextjs/package.json b/apps/nextjs/package.json index cdf4ece79..cb7669807 100644 --- a/apps/nextjs/package.json +++ b/apps/nextjs/package.json @@ -56,9 +56,9 @@ "@mantine/tiptap": "^7.17.1", "@million/lint": "1.0.14", "@tabler/icons-react": "^3.31.0", - "@tanstack/react-query": "^5.67.1", - "@tanstack/react-query-devtools": "^5.67.1", - "@tanstack/react-query-next-experimental": "^5.67.1", + "@tanstack/react-query": "^5.67.2", + "@tanstack/react-query-devtools": "^5.67.2", + "@tanstack/react-query-next-experimental": "^5.67.2", "@trpc/client": "next", "@trpc/next": "next", "@trpc/react-query": "next", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 479865112..ff6f275e0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -206,23 +206,23 @@ importers: specifier: ^3.31.0 version: 3.31.0(react@19.0.0) '@tanstack/react-query': - specifier: ^5.67.1 - version: 5.67.1(react@19.0.0) + specifier: ^5.67.2 + version: 5.67.2(react@19.0.0) '@tanstack/react-query-devtools': - specifier: ^5.67.1 - version: 5.67.1(@tanstack/react-query@5.67.1(react@19.0.0))(react@19.0.0) + specifier: ^5.67.2 + version: 5.67.2(@tanstack/react-query@5.67.2(react@19.0.0))(react@19.0.0) '@tanstack/react-query-next-experimental': - specifier: ^5.67.1 - version: 5.67.1(@tanstack/react-query@5.67.1(react@19.0.0))(next@15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react@19.0.0) + specifier: ^5.67.2 + version: 5.67.2(@tanstack/react-query@5.67.2(react@19.0.0))(next@15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react@19.0.0) '@trpc/client': specifier: next version: 11.0.0-rc.824(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(typescript@5.8.2) '@trpc/next': specifier: next - version: 11.0.0-rc.824(@tanstack/react-query@5.67.1(react@19.0.0))(@trpc/client@11.0.0-rc.824(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(typescript@5.8.2))(@trpc/react-query@11.0.0-rc.824(@tanstack/react-query@5.67.1(react@19.0.0))(@trpc/client@11.0.0-rc.824(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(typescript@5.8.2))(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(next@15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) + version: 11.0.0-rc.824(@tanstack/react-query@5.67.2(react@19.0.0))(@trpc/client@11.0.0-rc.824(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(typescript@5.8.2))(@trpc/react-query@11.0.0-rc.824(@tanstack/react-query@5.67.2(react@19.0.0))(@trpc/client@11.0.0-rc.824(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(typescript@5.8.2))(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(next@15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) '@trpc/react-query': specifier: next - version: 11.0.0-rc.824(@tanstack/react-query@5.67.1(react@19.0.0))(@trpc/client@11.0.0-rc.824(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(typescript@5.8.2))(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) + version: 11.0.0-rc.824(@tanstack/react-query@5.67.2(react@19.0.0))(@trpc/client@11.0.0-rc.824(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(typescript@5.8.2))(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) '@trpc/server': specifier: next version: 11.0.0-rc.824(typescript@5.8.2) @@ -583,7 +583,7 @@ importers: version: 11.0.0-rc.824(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(typescript@5.8.2) '@trpc/react-query': specifier: next - version: 11.0.0-rc.824(@tanstack/react-query@5.67.1(react@19.0.0))(@trpc/client@11.0.0-rc.824(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(typescript@5.8.2))(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) + version: 11.0.0-rc.824(@tanstack/react-query@5.67.2(react@19.0.0))(@trpc/client@11.0.0-rc.824(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(typescript@5.8.2))(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) '@trpc/server': specifier: next version: 11.0.0-rc.824(typescript@5.8.2) @@ -4256,27 +4256,27 @@ packages: resolution: {integrity: sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==} engines: {node: '>=12'} - '@tanstack/query-core@5.67.1': - resolution: {integrity: sha512-AkFmuukVejyqVIjEQoFhLb3q+xHl7JG8G9cANWTMe3s8iKzD9j1VBSYXgCjy6vm6xM8cUCR9zP2yqWxY9pTWOA==} + '@tanstack/query-core@5.67.2': + resolution: {integrity: sha512-+iaFJ/pt8TaApCk6LuZ0WHS/ECVfTzrxDOEL9HH9Dayyb5OVuomLzDXeSaI2GlGT/8HN7bDGiRXDts3LV+u6ww==} - '@tanstack/query-devtools@5.65.0': - resolution: {integrity: sha512-g5y7zc07U9D3esMdqUfTEVu9kMHoIaVBsD0+M3LPdAdD710RpTcLiNvJY1JkYXqkq9+NV+CQoemVNpQPBXVsJg==} + '@tanstack/query-devtools@5.67.2': + resolution: {integrity: sha512-O4QXFFd7xqp6EX7sdvc9tsVO8nm4lpWBqwpgjpVLW5g7IeOY6VnS/xvs/YzbRhBVkKTMaJMOUGU7NhSX+YGoNg==} - '@tanstack/react-query-devtools@5.67.1': - resolution: {integrity: sha512-a/2I8ORNalh+ek6Nyb9mEiq2u7vydjVMvaQz5ZieGq7r7DxgIFcPiMs4Ay0qkQvHfptESgXR5nImGTHmmt19yQ==} + '@tanstack/react-query-devtools@5.67.2': + resolution: {integrity: sha512-cmj2DxBc+/9btQ66n5xI8wTtAma2BLVa403K7zIYiguzJ/kV201jnGensYqJeu1Rd8uRMLLRM74jLVMLDWNRJA==} peerDependencies: - '@tanstack/react-query': ^5.67.1 + '@tanstack/react-query': ^5.67.2 react: ^18 || ^19 - '@tanstack/react-query-next-experimental@5.67.1': - resolution: {integrity: sha512-gNkIksA/jy5lLuAEzkn4aLLmGb1tPlJdbAgnm6GF29uVI4on6D0LfefenYz9Qv/Y8OfACx7XAjpRwisPJBooVQ==} + '@tanstack/react-query-next-experimental@5.67.2': + resolution: {integrity: sha512-KTYjhfx1BblTMOKQhmzdSMCkJdl8twtuDqaNeKR1KwU8qqsypXyk5lqfZ3bX5XtGOfAfrtINrVNACmE7vopDdw==} peerDependencies: - '@tanstack/react-query': ^5.67.1 + '@tanstack/react-query': ^5.67.2 next: ^13 || ^14 || ^15 react: ^18 || ^19 - '@tanstack/react-query@5.67.1': - resolution: {integrity: sha512-fH5u4JLwB6A+wLFdi8wWBWAYoJV5deYif2OveJ26ktAWjU499uvVFS1wPWnyEyq5LvZX1MZInvv9QRaIZANRaQ==} + '@tanstack/react-query@5.67.2': + resolution: {integrity: sha512-6Sa+BVNJWhAV4QHvIqM73norNeGRWGC3ftN0Ix87cmMvI215I1wyJ44KUTt/9a0V9YimfGcg25AITaYVel71Og==} peerDependencies: react: ^18 || ^19 @@ -12320,25 +12320,25 @@ snapshots: dependencies: remove-accents: 0.5.0 - '@tanstack/query-core@5.67.1': {} + '@tanstack/query-core@5.67.2': {} - '@tanstack/query-devtools@5.65.0': {} + '@tanstack/query-devtools@5.67.2': {} - '@tanstack/react-query-devtools@5.67.1(@tanstack/react-query@5.67.1(react@19.0.0))(react@19.0.0)': + '@tanstack/react-query-devtools@5.67.2(@tanstack/react-query@5.67.2(react@19.0.0))(react@19.0.0)': dependencies: - '@tanstack/query-devtools': 5.65.0 - '@tanstack/react-query': 5.67.1(react@19.0.0) + '@tanstack/query-devtools': 5.67.2 + '@tanstack/react-query': 5.67.2(react@19.0.0) react: 19.0.0 - '@tanstack/react-query-next-experimental@5.67.1(@tanstack/react-query@5.67.1(react@19.0.0))(next@15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react@19.0.0)': + '@tanstack/react-query-next-experimental@5.67.2(@tanstack/react-query@5.67.2(react@19.0.0))(next@15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react@19.0.0)': dependencies: - '@tanstack/react-query': 5.67.1(react@19.0.0) + '@tanstack/react-query': 5.67.2(react@19.0.0) next: 15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) react: 19.0.0 - '@tanstack/react-query@5.67.1(react@19.0.0)': + '@tanstack/react-query@5.67.2(react@19.0.0)': dependencies: - '@tanstack/query-core': 5.67.1 + '@tanstack/query-core': 5.67.2 react: 19.0.0 '@tanstack/react-table@8.20.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': @@ -12585,7 +12585,7 @@ snapshots: '@trpc/server': 11.0.0-rc.824(typescript@5.8.2) typescript: 5.8.2 - '@trpc/next@11.0.0-rc.824(@tanstack/react-query@5.67.1(react@19.0.0))(@trpc/client@11.0.0-rc.824(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(typescript@5.8.2))(@trpc/react-query@11.0.0-rc.824(@tanstack/react-query@5.67.1(react@19.0.0))(@trpc/client@11.0.0-rc.824(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(typescript@5.8.2))(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(next@15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2)': + '@trpc/next@11.0.0-rc.824(@tanstack/react-query@5.67.2(react@19.0.0))(@trpc/client@11.0.0-rc.824(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(typescript@5.8.2))(@trpc/react-query@11.0.0-rc.824(@tanstack/react-query@5.67.2(react@19.0.0))(@trpc/client@11.0.0-rc.824(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(typescript@5.8.2))(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(next@15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2)': dependencies: '@trpc/client': 11.0.0-rc.824(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(typescript@5.8.2) '@trpc/server': 11.0.0-rc.824(typescript@5.8.2) @@ -12594,12 +12594,12 @@ snapshots: react-dom: 19.0.0(react@19.0.0) typescript: 5.8.2 optionalDependencies: - '@tanstack/react-query': 5.67.1(react@19.0.0) - '@trpc/react-query': 11.0.0-rc.824(@tanstack/react-query@5.67.1(react@19.0.0))(@trpc/client@11.0.0-rc.824(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(typescript@5.8.2))(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) + '@tanstack/react-query': 5.67.2(react@19.0.0) + '@trpc/react-query': 11.0.0-rc.824(@tanstack/react-query@5.67.2(react@19.0.0))(@trpc/client@11.0.0-rc.824(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(typescript@5.8.2))(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) - '@trpc/react-query@11.0.0-rc.824(@tanstack/react-query@5.67.1(react@19.0.0))(@trpc/client@11.0.0-rc.824(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(typescript@5.8.2))(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2)': + '@trpc/react-query@11.0.0-rc.824(@tanstack/react-query@5.67.2(react@19.0.0))(@trpc/client@11.0.0-rc.824(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(typescript@5.8.2))(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2)': dependencies: - '@tanstack/react-query': 5.67.1(react@19.0.0) + '@tanstack/react-query': 5.67.2(react@19.0.0) '@trpc/client': 11.0.0-rc.824(@trpc/server@11.0.0-rc.824(typescript@5.8.2))(typescript@5.8.2) '@trpc/server': 11.0.0-rc.824(typescript@5.8.2) react: 19.0.0 From 9881577f47fbeacf861dd564d57fc6d7c469d27b Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Fri, 7 Mar 2025 18:14:50 +0100 Subject: [PATCH 09/10] fix(pi-hole): wrong fetch used in factory (#2527) --- .../integrations/src/pi-hole/pi-hole-integration-factory.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/integrations/src/pi-hole/pi-hole-integration-factory.ts b/packages/integrations/src/pi-hole/pi-hole-integration-factory.ts index 7970d7069..71e687927 100644 --- a/packages/integrations/src/pi-hole/pi-hole-integration-factory.ts +++ b/packages/integrations/src/pi-hole/pi-hole-integration-factory.ts @@ -1,3 +1,4 @@ +import { fetchWithTrustedCertificatesAsync } from "@homarr/certificates/server"; import { removeTrailingSlash } from "@homarr/common"; import type { IntegrationInput } from "../base/integration"; @@ -7,7 +8,7 @@ import { PiHoleIntegrationV6 } from "./v6/pi-hole-integration-v6"; export const createPiHoleIntegrationAsync = async (input: IntegrationInput) => { const baseUrl = removeTrailingSlash(input.url); const url = new URL(`${baseUrl}/api/info/version`); - const response = await fetch(url); + const response = await fetchWithTrustedCertificatesAsync(url); /** * In pi-hole 5 the api was at /admin/api.php, in pi-hole 6 it was moved to /api From 37d471457a0a2b10112b67c02923f63de479e617 Mon Sep 17 00:00:00 2001 From: Manuel <30572287+manuel-rw@users.noreply.github.com> Date: Fri, 7 Mar 2025 17:46:01 +0000 Subject: [PATCH 10/10] feat: remove cqmin system (#2407) * feat: remove cqmin system * fix: improve weather widget --------- Co-authored-by: Meier Lukas --- packages/widgets/src/app/component.tsx | 3 +- packages/widgets/src/app/ping/ping-dot.tsx | 8 +- .../widgets/src/bookmarks/bookmark.module.css | 8 + packages/widgets/src/bookmarks/component.tsx | 69 +++--- .../widgets/src/calendar/calender-day.tsx | 53 ++-- packages/widgets/src/calendar/component.tsx | 39 +-- packages/widgets/src/clock/component.tsx | 12 +- .../dns-hole/controls/component.module.css | 7 + .../src/dns-hole/controls/component.tsx | 111 ++++----- .../src/dns-hole/summary/component.tsx | 40 ++- packages/widgets/src/downloads/component.tsx | 40 +-- .../src/health-monitoring/rings/cpu-ring.tsx | 33 +++ .../health-monitoring/rings/cpu-temp-ring.tsx | 39 +++ .../health-monitoring/rings/memory-ring.tsx | 54 ++++ .../system-health.module.css | 7 + .../src/health-monitoring/system-health.tsx | 230 ++++-------------- .../src/indexer-manager/component.module.css | 7 + .../widgets/src/indexer-manager/component.tsx | 39 +-- .../src/media-requests/list/component.tsx | 54 ++-- .../media-requests/stats/component.module.css | 8 +- .../src/media-requests/stats/component.tsx | 63 +++-- .../widgets/src/media-server/component.tsx | 43 +--- .../src/minecraft/server-status/component.tsx | 17 +- packages/widgets/src/notebook/notebook.tsx | 4 +- packages/widgets/src/rssFeed/component.tsx | 22 +- packages/widgets/src/weather/component.tsx | 121 ++++----- 26 files changed, 576 insertions(+), 555 deletions(-) create mode 100644 packages/widgets/src/dns-hole/controls/component.module.css create mode 100644 packages/widgets/src/health-monitoring/rings/cpu-ring.tsx create mode 100644 packages/widgets/src/health-monitoring/rings/cpu-temp-ring.tsx create mode 100644 packages/widgets/src/health-monitoring/rings/memory-ring.tsx create mode 100644 packages/widgets/src/health-monitoring/system-health.module.css create mode 100644 packages/widgets/src/indexer-manager/component.module.css diff --git a/packages/widgets/src/app/component.tsx b/packages/widgets/src/app/component.tsx index f7fd23b33..34a8dafb6 100644 --- a/packages/widgets/src/app/component.tsx +++ b/packages/widgets/src/app/component.tsx @@ -74,12 +74,11 @@ export default function AppWidget({ options, isEditMode }: WidgetComponentProps< h="100%" w="100%" direction="column" - p="7.5cqmin" justify="center" align="center" > {options.showTitle && ( - + {app.name} )} diff --git a/packages/widgets/src/app/ping/ping-dot.tsx b/packages/widgets/src/app/ping/ping-dot.tsx index 81d3fa0ed..d728e8678 100644 --- a/packages/widgets/src/app/ping/ping-dot.tsx +++ b/packages/widgets/src/app/ping/ping-dot.tsx @@ -14,18 +14,18 @@ export const PingDot = ({ color, tooltip, ...props }: PingDotProps) => { const { pingIconsEnabled } = useSettings(); return ( - + {pingIconsEnabled ? ( - + ) : ( )} diff --git a/packages/widgets/src/bookmarks/bookmark.module.css b/packages/widgets/src/bookmarks/bookmark.module.css index b264ddd4c..c37b78242 100644 --- a/packages/widgets/src/bookmarks/bookmark.module.css +++ b/packages/widgets/src/bookmarks/bookmark.module.css @@ -2,6 +2,14 @@ background-color: var(--mantine-color-primaryColor-light-hover); } +[data-mantine-color-scheme="light"] .card-grid { + background-color: var(--mantine-color-gray-1); +} + +[data-mantine-color-scheme="dark"] .card-grid { + background-color: var(--mantine-color-dark-7); +} + .card:hover > div > div.bookmarkIcon { background-color: var(--mantine-color-iconColor-filled-hover); } diff --git a/packages/widgets/src/bookmarks/component.tsx b/packages/widgets/src/bookmarks/component.tsx index b1d15bd5c..a20093846 100644 --- a/packages/widgets/src/bookmarks/component.tsx +++ b/packages/widgets/src/bookmarks/component.tsx @@ -1,6 +1,7 @@ "use client"; import { Anchor, Box, Card, Divider, Flex, Group, Stack, Text, Title, UnstyledButton } from "@mantine/core"; +import combineClasses from "clsx"; import type { RouterOutputs } from "@homarr/api"; import { clientApi } from "@homarr/api/client"; @@ -42,9 +43,11 @@ export default function BookmarksWidget({ options, width, height, itemId }: Widg return ( - - {options.title} - + {options.title.length > 0 && ( + + {options.title} + + )} {options.layout === "grid" && ( { + const board = useRequiredBoard(); return ( - + {data.map((app, index) => (
- + {direction === "row" ? ( ) : ( @@ -134,12 +129,14 @@ const GridLayout = ({ data, width, height, hideIcon, hideHostname, openNewTab, h // Calculates the perfect number of columns for the grid layout based on the width and height in pixels and the number of items const columns = Math.ceil(Math.sqrt(data.length * (width / height))); + const board = useRequiredBoard(); + return ( @@ -152,8 +149,19 @@ const GridLayout = ({ data, width, height, hideIcon, hideHostname, openNewTab, h key={app.id} h="100%" > - - + + ))} @@ -166,15 +174,17 @@ const VerticalItem = ({ hideIcon, hideHostname, hasIconColor, + size = 30, }: { app: RouterOutputs["app"]["byIds"][number]; hideIcon: boolean; hideHostname: boolean; hasIconColor: boolean; + size?: number; }) => { return ( - - + + {app.name} {!hideIcon && ( @@ -184,16 +194,18 @@ const VerticalItem = ({ alt={app.name} className={classes.bookmarkIcon} style={{ - maxHeight: "100%", - maxWidth: "100%", + width: size, + height: size, overflow: "auto", flex: 1, scale: 0.8, + marginLeft: "auto", + marginRight: "auto", }} /> )} {!hideHostname && ( - + {app.href ? new URL(app.href).hostname : undefined} )} @@ -213,7 +225,7 @@ const HorizontalItem = ({ hasIconColor: boolean; }) => { return ( - + {!hideIcon && ( )} - + {app.name} {!hideHostname && ( - + {app.href ? new URL(app.href).hostname : undefined} )} diff --git a/packages/widgets/src/calendar/calender-day.tsx b/packages/widgets/src/calendar/calender-day.tsx index 698cfba3a..311d58049 100644 --- a/packages/widgets/src/calendar/calender-day.tsx +++ b/packages/widgets/src/calendar/calender-day.tsx @@ -1,6 +1,7 @@ import { useState } from "react"; -import { Container, Popover, useMantineTheme } from "@mantine/core"; +import { Box, Container, Flex, Popover, Text, useMantineTheme } from "@mantine/core"; +import { useRequiredBoard } from "@homarr/boards/context"; import type { CalendarEvent } from "@homarr/integrations/types"; import { CalendarEventList } from "./calendar-event-list"; @@ -9,11 +10,19 @@ interface CalendarDayProps { date: Date; events: CalendarEvent[]; disabled: boolean; + rootWidth: number; + rootHeight: number; } -export const CalendarDay = ({ date, events, disabled }: CalendarDayProps) => { - const [opened, setOpend] = useState(false); +export const CalendarDay = ({ date, events, disabled, rootHeight, rootWidth }: CalendarDayProps) => { + const [opened, setOpened] = useState(false); const { primaryColor } = useMantineTheme(); + const board = useRequiredBoard(); + const mantineTheme = useMantineTheme(); + const actualItemRadius = mantineTheme.radius[board.itemRadius]; + + const minAxisSize = Math.min(rootWidth, rootHeight); + const shouldScaleDown = minAxisSize < 350; return ( { transitionProps={{ transition: "pop", }} - onChange={setOpend} + onChange={setOpened} opened={opened} disabled={disabled} > @@ -35,30 +44,23 @@ export const CalendarDay = ({ date, events, disabled }: CalendarDayProps) => { w="100%" p={0} m={0} - bd={`1cqmin solid ${opened && !disabled ? primaryColor : "transparent"}`} + bd={`3px solid ${opened && !disabled ? primaryColor : "transparent"}`} + pos={"relative"} style={{ alignContent: "center", - borderRadius: "3.5cqmin", + borderRadius: actualItemRadius, cursor: disabled ? "default" : "pointer", }} onClick={() => { if (disabled) return; - setOpend((prev) => !prev); + setOpened((prev) => !prev); }} > -
+ {date.getDate()} -
- +
+ {rootHeight >= 350 && } @@ -75,19 +77,10 @@ interface NotificationIndicatorProps { const NotificationIndicator = ({ events }: NotificationIndicatorProps) => { const notificationEvents = [...new Set(events.map((event) => event.links[0]?.notificationColor))].filter(String); return ( - + {notificationEvents.map((notificationEvent) => { - return ( - - ); + return ; })} - + ); }; diff --git a/packages/widgets/src/calendar/component.tsx b/packages/widgets/src/calendar/component.tsx index ec14f3e11..d05bbc7d8 100644 --- a/packages/widgets/src/calendar/component.tsx +++ b/packages/widgets/src/calendar/component.tsx @@ -2,11 +2,14 @@ import { useState } from "react"; import { useParams } from "next/navigation"; +import { useMantineTheme } from "@mantine/core"; import { Calendar } from "@mantine/dates"; +import { useElementSize } from "@mantine/hooks"; import dayjs from "dayjs"; import type { RouterOutputs } from "@homarr/api"; import { clientApi } from "@homarr/api/client"; +import { useRequiredBoard } from "@homarr/boards/context"; import type { CalendarEvent } from "@homarr/integrations/types"; import { useSettings } from "@homarr/settings"; @@ -60,6 +63,10 @@ const CalendarBase = ({ isEditMode, events, month, setMonth, options }: Calendar const params = useParams(); const locale = params.locale as string; const { firstDayOfWeek } = useSettings(); + const board = useRequiredBoard(); + const mantineTheme = useMantineTheme(); + const actualItemRadius = mantineTheme.radius[board.itemRadius]; + const { ref, width, height } = useElementSize(); return ( Boolean(event.date)); return ( - + ); }} /> diff --git a/packages/widgets/src/clock/component.tsx b/packages/widgets/src/clock/component.tsx index 95c5a2af2..32cf45549 100644 --- a/packages/widgets/src/clock/component.tsx +++ b/packages/widgets/src/clock/component.tsx @@ -1,7 +1,7 @@ "use client"; import { useEffect, useMemo, useRef, useState } from "react"; -import { Stack, Text } from "@mantine/core"; +import { Stack, Text, Title } from "@mantine/core"; import dayjs from "dayjs"; import advancedFormat from "dayjs/plugin/advancedFormat"; import timezones from "dayjs/plugin/timezone"; @@ -22,19 +22,19 @@ export default function ClockWidget({ options }: WidgetComponentProps<"clock">) const timezone = options.useCustomTimezone ? options.timezone : Intl.DateTimeFormat().resolvedOptions().timeZone; const time = useCurrentTime(options); return ( - + {options.customTitleToggle && ( - + {options.customTitle} )} - + {options.customTimeFormat ? dayjs(time).tz(timezone).format(customTimeFormat) : dayjs(time).tz(timezone).format(timeFormat)} - </Text> + {options.showDate && ( - + {options.customDateFormat ? dayjs(time).tz(timezone).format(customDateFormat) : dayjs(time).tz(timezone).format(dateFormat)} diff --git a/packages/widgets/src/dns-hole/controls/component.module.css b/packages/widgets/src/dns-hole/controls/component.module.css new file mode 100644 index 000000000..1ab18a656 --- /dev/null +++ b/packages/widgets/src/dns-hole/controls/component.module.css @@ -0,0 +1,7 @@ +[data-mantine-color-scheme="light"] .card { + background-color: var(--mantine-color-gray-1); +} + +[data-mantine-color-scheme="dark"] .card { + background-color: var(--mantine-color-dark-7); +} diff --git a/packages/widgets/src/dns-hole/controls/component.tsx b/packages/widgets/src/dns-hole/controls/component.tsx index b7ad54202..7ee3576a4 100644 --- a/packages/widgets/src/dns-hole/controls/component.tsx +++ b/packages/widgets/src/dns-hole/controls/component.tsx @@ -6,6 +6,7 @@ import { useState } from "react"; import { ActionIcon, Badge, Button, Card, Flex, ScrollArea, Stack, Text, Tooltip, UnstyledButton } from "@mantine/core"; import { useDisclosure } from "@mantine/hooks"; import { IconCircleFilled, IconClockPause, IconPlayerPlay, IconPlayerStop } from "@tabler/icons-react"; +import combineClasses from "clsx"; import type { RouterOutputs } from "@homarr/api"; import { clientApi } from "@homarr/api/client"; @@ -19,6 +20,7 @@ import { MaskedOrNormalImage } from "@homarr/ui"; import type { widgetKind } from "."; import type { WidgetComponentProps } from "../../definition"; +import classes from "./component.module.css"; import TimerModal from "./TimerModal"; const dnsLightStatus = (enabled: boolean | undefined) => @@ -179,12 +181,12 @@ export default function DnsHoleControlsWidget({ className="dns-hole-controls-stack" h="100%" direction="column" - p="2.5cqmin" - gap="2.5cqmin" + p="sm" + gap="sm" style={{ pointerEvents: isEditMode ? "none" : undefined }} > {controlAllButtonsVisible && ( - + @@ -216,15 +215,12 @@ export default function DnsHoleControlsWidget({ variant="light" color="yellow" h="fit-content" - p="1.25cqmin" + p="xs" bd={0} - radius="2.5cqmin" + radius={board.itemRadius} flex={1} > - + @@ -236,15 +232,12 @@ export default function DnsHoleControlsWidget({ variant="light" color="red" h="fit-content" - p="1.25cqmin" + p="xs" bd={0} - radius="2.5cqmin" + radius={board.itemRadius} flex={1} > - + @@ -253,7 +246,7 @@ export default function DnsHoleControlsWidget({ @@ -306,34 +299,40 @@ const ControlsCard: React.FC = ({ const isInteractPermitted = integrationsWithInteractions.includes(data.integration.id); // Use all factors to infer the state of the action buttons const controlEnabled = isInteractPermitted && isEnabled !== undefined && isConnected; + const board = useRequiredBoard(); const iconUrl = integrationDefs[data.integration.kind].iconUrl; return ( - + - - + + {data.integration.name} - + = ({ > ) } @@ -374,27 +371,25 @@ const ControlsCard: React.FC = ({ )} - { - setSelectedIntegrationIds([data.integration.id]); - open(); - }} - > - - + { + setSelectedIntegrationIds([data.integration.id]); + open(); + }} + > + + ); diff --git a/packages/widgets/src/dns-hole/summary/component.tsx b/packages/widgets/src/dns-hole/summary/component.tsx index 50d06de42..239d02295 100644 --- a/packages/widgets/src/dns-hole/summary/component.tsx +++ b/packages/widgets/src/dns-hole/summary/component.tsx @@ -2,11 +2,12 @@ import { useMemo } from "react"; import type { BoxProps } from "@mantine/core"; -import { Avatar, AvatarGroup, Box, Card, Flex, Stack, Text, Tooltip, TooltipFloating } from "@mantine/core"; +import { Avatar, AvatarGroup, Card, Flex, SimpleGrid, Stack, Text, Tooltip, TooltipFloating } from "@mantine/core"; import { useElementSize } from "@mantine/hooks"; import { IconBarrierBlock, IconPercentage, IconSearch, IconWorldWww } from "@tabler/icons-react"; import { clientApi } from "@homarr/api/client"; +import { useRequiredBoard } from "@homarr/boards/context"; import { formatNumber } from "@homarr/common"; import { integrationDefs } from "@homarr/definitions"; import type { DnsHoleSummary } from "@homarr/integrations/types"; @@ -62,26 +63,26 @@ export default function DnsHoleSummaryWidget({ options, integrationIds }: Widget const data = useMemo(() => summaries.flatMap(({ summary }) => summary), [summaries]); return ( - + {data.length > 0 ? ( stats.map((item) => ( )) ) : ( - - + + {summaries.map(({ integration }) => ( - + ))} - + {t("widget.dnsHoleSummary.error.integrationsDisconnected")} )} - + ); } @@ -152,30 +153,30 @@ const StatCard = ({ item, data, usePiHoleColors, t }: StatCardProps) => { const { ref, height, width } = useElementSize(); const isLong = width > height + 20; const tooltip = item.tooltip?.(data, t); + const board = useRequiredBoard(); return ( - + { style={{ flex: isLong ? 1 : undefined, }} + mt={"xs"} w="100%" - h="100%" - gap="1cqmin" + gap={0} > - + {item.value(data)} {item.label && ( - + {translateIfNecessary(t, item.label)} )} diff --git a/packages/widgets/src/downloads/component.tsx b/packages/widgets/src/downloads/component.tsx index 39da51449..10c98ba8a 100644 --- a/packages/widgets/src/downloads/component.tsx +++ b/packages/widgets/src/downloads/component.tsx @@ -675,7 +675,7 @@ export default function DownloadClientsWidget({ void; availableStatuses: QuickFilter["statuses"]; - style?: MantineStyleProp; } -const ClientsControl = ({ clients, filters, setFilters, availableStatuses, style }: ClientsControlProps) => { +const ClientsControl = ({ clients, filters, setFilters, availableStatuses }: ClientsControlProps) => { const integrationsStatuses = clients.reduce( (acc, { status, integration: { id }, interact }) => status && interact ? (acc[status.paused ? "paused" : "active"].push(id), acc) : acc, @@ -799,33 +797,21 @@ const ClientsControl = ({ clients, filters, setFilters, availableStatuses, style clients.reduce((count, { status }) => count + (status?.rates.down ?? 0), 0), "/s", ); - const chipStyle = { - "--chip-fz": "var(--button-fz)", - "--chip-size": "calc(var(--ratio-width) * 0.9)", - "--chip-icon-size": "calc(var(--chip-fz)*2/3)", - "--chip-padding": "var(--chip-fz)", - "--chip-checked-padding": "var(--chip-icon-size)", - "--chip-spacing": "var(--space-size)", - }; + const { mutate: mutateResumeQueue } = clientApi.widget.downloads.resume.useMutation(); const { mutate: mutatePauseQueue } = clientApi.widget.downloads.pause.useMutation(); const [opened, { open, close }] = useDisclosure(false); const t = useScopedI18n("widget.downloads"); return ( - + - + - - + + {t("items.integration.columnTitle")} setFilters({ ...filters, integrationKinds: names })} > {clients.map(({ integration }) => ( - + {integration.name} ))} @@ -845,7 +831,7 @@ const ClientsControl = ({ clients, filters, setFilters, availableStatuses, style onChange={(statuses) => setFilters({ ...filters, statuses: statuses as typeof filters.statuses })} > {availableStatuses.map((status) => ( - + {t(`states.${status}`)} ))} @@ -861,7 +847,7 @@ const ClientsControl = ({ clients, filters, setFilters, availableStatuses, style {someInteract && ( { key={client.integration.id} src={getIconUrl(client.integration.kind)} style={{ filter: !isConnected ? "grayscale(100%)" : undefined }} - size="var(--image-size)" - p="calc(var(--space-size)*0.5)" + size={30} + p={5} bd={`calc(var(--space-size)*0.5) solid ${client.status ? "transparent" : "var(--mantine-color-red-filled)"}`} /> ); diff --git a/packages/widgets/src/health-monitoring/rings/cpu-ring.tsx b/packages/widgets/src/health-monitoring/rings/cpu-ring.tsx new file mode 100644 index 000000000..0069c6d96 --- /dev/null +++ b/packages/widgets/src/health-monitoring/rings/cpu-ring.tsx @@ -0,0 +1,33 @@ +import { Box, Center, RingProgress, Text } from "@mantine/core"; +import { useElementSize } from "@mantine/hooks"; +import { IconCpu } from "@tabler/icons-react"; + +import { progressColor } from "../system-health"; + +export const CpuRing = ({ cpuUtilization }: { cpuUtilization: number }) => { + const { width, ref } = useElementSize(); + const fallbackWidth = width || 1; // See https://github.com/homarr-labs/homarr/issues/2196 + + return ( + + + {`${cpuUtilization.toFixed(2)}%`} + + + } + sections={[ + { + value: Number(cpuUtilization.toFixed(2)), + color: progressColor(Number(cpuUtilization.toFixed(2))), + }, + ]} + /> + + ); +}; diff --git a/packages/widgets/src/health-monitoring/rings/cpu-temp-ring.tsx b/packages/widgets/src/health-monitoring/rings/cpu-temp-ring.tsx new file mode 100644 index 000000000..a70f26a90 --- /dev/null +++ b/packages/widgets/src/health-monitoring/rings/cpu-temp-ring.tsx @@ -0,0 +1,39 @@ +import { Box, Center, RingProgress, Text } from "@mantine/core"; +import { useElementSize } from "@mantine/hooks"; +import { IconCpu } from "@tabler/icons-react"; + +import { progressColor } from "../system-health"; + +export const CpuTempRing = ({ fahrenheit, cpuTemp }: { fahrenheit: boolean; cpuTemp: number | undefined }) => { + const { width, ref } = useElementSize(); + const fallbackWidth = width || 1; // See https://github.com/homarr-labs/homarr/issues/2196 + + if (!cpuTemp) { + return null; + } + + return ( + + + + {fahrenheit ? `${(cpuTemp * 1.8 + 32).toFixed(1)}°F` : `${cpuTemp.toFixed(1)}°C`} + + + + } + sections={[ + { + value: cpuTemp, + color: progressColor(cpuTemp), + }, + ]} + /> + + ); +}; diff --git a/packages/widgets/src/health-monitoring/rings/memory-ring.tsx b/packages/widgets/src/health-monitoring/rings/memory-ring.tsx new file mode 100644 index 000000000..2d8ce4d68 --- /dev/null +++ b/packages/widgets/src/health-monitoring/rings/memory-ring.tsx @@ -0,0 +1,54 @@ +import { Box, Center, RingProgress, Text } from "@mantine/core"; +import { useElementSize } from "@mantine/hooks"; +import { IconBrain } from "@tabler/icons-react"; + +import { progressColor } from "../system-health"; + +export const MemoryRing = ({ available, used }: { available: string; used: string }) => { + const { width, ref } = useElementSize(); + const fallbackWidth = width || 1; // See https://github.com/homarr-labs/homarr/issues/2196 + const memoryUsage = formatMemoryUsage(available, used); + + return ( + + + + {memoryUsage.memUsed.GB}GiB + + + + } + sections={[ + { + value: Number(memoryUsage.memUsed.percent), + color: progressColor(Number(memoryUsage.memUsed.percent)), + tooltip: `${memoryUsage.memUsed.percent}%`, + }, + ]} + /> + + ); +}; + +export const formatMemoryUsage = (memFree: string, memUsed: string) => { + const memFreeBytes = Number(memFree); + const memUsedBytes = Number(memUsed); + const totalMemory = memFreeBytes + memUsedBytes; + const memFreeGB = (memFreeBytes / 1024 ** 3).toFixed(2); + const memUsedGB = (memUsedBytes / 1024 ** 3).toFixed(2); + const memFreePercent = Math.round((memFreeBytes / totalMemory) * 100); + const memUsedPercent = Math.round((memUsedBytes / totalMemory) * 100); + const memTotalGB = (totalMemory / 1024 ** 3).toFixed(2); + + return { + memFree: { percent: memFreePercent, GB: memFreeGB }, + memUsed: { percent: memUsedPercent, GB: memUsedGB }, + memTotal: { GB: memTotalGB }, + }; +}; diff --git a/packages/widgets/src/health-monitoring/system-health.module.css b/packages/widgets/src/health-monitoring/system-health.module.css new file mode 100644 index 000000000..1ab18a656 --- /dev/null +++ b/packages/widgets/src/health-monitoring/system-health.module.css @@ -0,0 +1,7 @@ +[data-mantine-color-scheme="light"] .card { + background-color: var(--mantine-color-gray-1); +} + +[data-mantine-color-scheme="dark"] .card { + background-color: var(--mantine-color-dark-7); +} diff --git a/packages/widgets/src/health-monitoring/system-health.tsx b/packages/widgets/src/health-monitoring/system-health.tsx index d081132f9..82109f87a 100644 --- a/packages/widgets/src/health-monitoring/system-health.tsx +++ b/packages/widgets/src/health-monitoring/system-health.tsx @@ -1,10 +1,9 @@ "use client"; import { - Avatar, + ActionIcon, Box, Card, - Center, Divider, Flex, Group, @@ -12,12 +11,11 @@ import { List, Modal, Progress, - RingProgress, Stack, Text, Tooltip, } from "@mantine/core"; -import { useDisclosure, useElementSize } from "@mantine/hooks"; +import { useDisclosure } from "@mantine/hooks"; import { IconBrain, IconClock, @@ -29,14 +27,20 @@ import { IconTemperature, IconVersions, } from "@tabler/icons-react"; +import combineClasses from "clsx"; import dayjs from "dayjs"; import duration from "dayjs/plugin/duration"; import { clientApi } from "@homarr/api/client"; +import { useRequiredBoard } from "@homarr/boards/context"; import type { TranslationFunction } from "@homarr/translation"; import { useI18n } from "@homarr/translation/client"; import type { WidgetComponentProps } from "../definition"; +import { CpuRing } from "./rings/cpu-ring"; +import { CpuTempRing } from "./rings/cpu-temp-ring"; +import { formatMemoryUsage, MemoryRing } from "./rings/memory-ring"; +import classes from "./system-health.module.css"; dayjs.extend(duration); @@ -55,6 +59,7 @@ export const SystemHealthMonitoring = ({ options, integrationIds }: WidgetCompon ); const [opened, { open, close }] = useDisclosure(false); const utils = clientApi.useUtils(); + const board = useRequiredBoard(); clientApi.widget.healthMonitoring.subscribeSystemHealthStatus.useSubscription( { integrationIds }, @@ -75,23 +80,21 @@ export const SystemHealthMonitoring = ({ options, integrationIds }: WidgetCompon ); return ( - + {healthData.map(({ integrationId, integrationName, healthInfo, updatedAt }) => { const disksData = matchFileSystemAndSmart(healthInfo.fileSystem, healthInfo.smart); const memoryUsage = formatMemoryUsage(healthInfo.memAvailable, healthInfo.memUsed); return ( - + 0 ? "blue" : "gray"} position="top-end" - size="4cqmin" + size="md" label={healthInfo.availablePkgUpdates > 0 ? healthInfo.availablePkgUpdates : undefined} disabled={!healthInfo.rebootRequired && healthInfo.availablePkgUpdates === 0} > - - - + + + - - } - > + + }> {t("widget.healthMonitoring.popover.processor", { cpuModelName: healthInfo.cpuModelName })} - } - > + }> {t("widget.healthMonitoring.popover.memory", { memory: memoryUsage.memTotal.GB })} - } - > + }> {t("widget.healthMonitoring.popover.memoryAvailable", { memoryAvailable: memoryUsage.memFree.GB, percent: memoryUsage.memFree.percent, })} - } - > + }> {t("widget.healthMonitoring.popover.version", { version: healthInfo.version, })} - } - > + }> {formatUptime(healthInfo.uptime, t)} - } - > + }> {t("widget.healthMonitoring.popover.loadAverage")} - }> + }> {t("widget.healthMonitoring.popover.minute")} {healthInfo.loadAverage["1min"]}% @@ -184,56 +175,53 @@ export const SystemHealthMonitoring = ({ options, integrationIds }: WidgetCompon {options.memory && } { - + {t("widget.healthMonitoring.popover.lastSeen", { lastSeen: dayjs(updatedAt).fromNow() })} } - +
{options.fileSystem && disksData.map((disk) => { return ( - - - - + + + + {disk.deviceName} - - - + + + {options.fahrenheit ? `${(disk.temperature * 1.8 + 32).toFixed(1)}°F` : `${disk.temperature}°C`} - - - + + + {disk.overallStatus ? disk.overallStatus : "N/A"} - + - + {t("widget.healthMonitoring.popover.used")} @@ -251,7 +239,7 @@ export const SystemHealthMonitoring = ({ options, integrationIds }: WidgetCompon value={100 - disk.percentage} color="default" > - + {t("widget.healthMonitoring.popover.available")} @@ -314,117 +302,3 @@ export const matchFileSystemAndSmart = (fileSystems: FileSystem[], smartData: Sm }) .sort((fileSystemA, fileSystemB) => fileSystemA.deviceName.localeCompare(fileSystemB.deviceName)); }; - -const CpuRing = ({ cpuUtilization }: { cpuUtilization: number }) => { - const { width, ref } = useElementSize(); - const fallbackWidth = width || 1; // See https://github.com/homarr-labs/homarr/issues/2196 - - return ( - - - {`${cpuUtilization.toFixed(2)}%`} - - - } - sections={[ - { - value: Number(cpuUtilization.toFixed(2)), - color: progressColor(Number(cpuUtilization.toFixed(2))), - }, - ]} - /> - - ); -}; - -const CpuTempRing = ({ fahrenheit, cpuTemp }: { fahrenheit: boolean; cpuTemp: number | undefined }) => { - const { width, ref } = useElementSize(); - const fallbackWidth = width || 1; // See https://github.com/homarr-labs/homarr/issues/2196 - - if (!cpuTemp) { - return null; - } - - return ( - - - - {fahrenheit ? `${(cpuTemp * 1.8 + 32).toFixed(1)}°F` : `${cpuTemp.toFixed(1)}°C`} - - - - } - sections={[ - { - value: cpuTemp, - color: progressColor(cpuTemp), - }, - ]} - /> - - ); -}; - -const MemoryRing = ({ available, used }: { available: string; used: string }) => { - const { width, ref } = useElementSize(); - const fallbackWidth = width || 1; // See https://github.com/homarr-labs/homarr/issues/2196 - const memoryUsage = formatMemoryUsage(available, used); - - return ( - - - - {memoryUsage.memUsed.GB}GiB - - - - } - sections={[ - { - value: Number(memoryUsage.memUsed.percent), - color: progressColor(Number(memoryUsage.memUsed.percent)), - tooltip: `${memoryUsage.memUsed.percent}%`, - }, - ]} - /> - - ); -}; - -export const formatMemoryUsage = (memFree: string, memUsed: string) => { - const memFreeBytes = Number(memFree); - const memUsedBytes = Number(memUsed); - const totalMemory = memFreeBytes + memUsedBytes; - const memFreeGB = (memFreeBytes / 1024 ** 3).toFixed(2); - const memUsedGB = (memUsedBytes / 1024 ** 3).toFixed(2); - const memFreePercent = Math.round((memFreeBytes / totalMemory) * 100); - const memUsedPercent = Math.round((memUsedBytes / totalMemory) * 100); - const memTotalGB = (totalMemory / 1024 ** 3).toFixed(2); - - return { - memFree: { percent: memFreePercent, GB: memFreeGB }, - memUsed: { percent: memUsedPercent, GB: memUsedGB }, - memTotal: { GB: memTotalGB }, - }; -}; diff --git a/packages/widgets/src/indexer-manager/component.module.css b/packages/widgets/src/indexer-manager/component.module.css new file mode 100644 index 000000000..1ab18a656 --- /dev/null +++ b/packages/widgets/src/indexer-manager/component.module.css @@ -0,0 +1,7 @@ +[data-mantine-color-scheme="light"] .card { + background-color: var(--mantine-color-gray-1); +} + +[data-mantine-color-scheme="dark"] .card { + background-color: var(--mantine-color-dark-7); +} diff --git a/packages/widgets/src/indexer-manager/component.tsx b/packages/widgets/src/indexer-manager/component.tsx index 1ba4fc273..12aed440a 100644 --- a/packages/widgets/src/indexer-manager/component.tsx +++ b/packages/widgets/src/indexer-manager/component.tsx @@ -2,11 +2,14 @@ import { Anchor, Button, Card, Container, Flex, Group, ScrollArea, Text } from "@mantine/core"; import { IconCircleCheck, IconCircleX, IconReportSearch, IconTestPipe } from "@tabler/icons-react"; +import combineClasses from "clsx"; import { clientApi } from "@homarr/api/client"; +import { useRequiredBoard } from "@homarr/boards/context"; import { useI18n } from "@homarr/translation/client"; import type { WidgetComponentProps } from "../definition"; +import classes from "./component.module.css"; export default function IndexerManagerWidget({ options, integrationIds }: WidgetComponentProps<"indexerManager">) { const t = useI18n(); @@ -22,6 +25,7 @@ export default function IndexerManagerWidget({ options, integrationIds }: Widget const utils = clientApi.useUtils(); const { mutate: testAll, isPending } = clientApi.widget.indexerManager.testAllIndexers.useMutation(); + const board = useRequiredBoard(); clientApi.widget.indexerManager.subscribeIndexersStatus.useSubscription( { integrationIds }, @@ -36,21 +40,28 @@ export default function IndexerManagerWidget({ options, integrationIds }: Widget }, ); - const iconStyle = { height: "7.5cqmin", width: "7.5cqmin" }; - return ( - - - {t("widget.indexerManager.title")} - - + + + + + {t("widget.indexerManager.title")} + + + {indexersData.map(({ integrationId, indexers }) => ( {indexers.map((indexer) => ( @@ -59,7 +70,7 @@ export default function IndexerManagerWidget({ options, integrationIds }: Widget href={indexer.url} target={options.openIndexerSiteInNewTab ? "_blank" : "_self"} > - + {indexer.name} @@ -67,13 +78,13 @@ export default function IndexerManagerWidget({ options, integrationIds }: Widget ) : ( )} @@ -85,11 +96,9 @@ export default function IndexerManagerWidget({ options, integrationIds }: Widget