Compare commits

...

14 Commits
gui ... v1.4.0

Author SHA1 Message Date
shamoon
7426a12cdf Bump version to 1.4.0
Some checks failed
Docker CI / Linting Checks (push) Has been cancelled
Docker CI / Docker Build & Push (push) Has been cancelled
Docs / Linting Checks (push) Has been cancelled
Docs / Test Build Docs (push) Has been cancelled
Docs / Build & Deploy Docs (push) Has been cancelled
2025-07-15 09:38:15 -07:00
shamoon
cbf2e1a509 Merge branch 'dev' 2025-07-15 09:32:52 -07:00
shamoon
d0165326a6 Tweak: Improve ownership check and chown handling for .next dir (#5513)
Some checks failed
Crowdin Action / Crowdin Sync (push) Has been cancelled
Docker CI / Linting Checks (push) Has been cancelled
Docker CI / Docker Build & Push (push) Has been cancelled
Repository Maintenance / Stale (push) Has been cancelled
Repository Maintenance / Lock Old Threads (push) Has been cancelled
Repository Maintenance / Close Answered Discussions (push) Has been cancelled
Repository Maintenance / Close Outdated Discussions (push) Has been cancelled
Repository Maintenance / Close Unsupported Feature Requests (push) Has been cancelled
2025-07-15 06:56:46 -07:00
Oriano de Stefani
dba3a1f893 Enhancement: support for new grafana alerting api (#5476)
Some checks failed
Crowdin Action / Crowdin Sync (push) Has been cancelled
Docker CI / Linting Checks (push) Has been cancelled
Docker CI / Docker Build & Push (push) Has been cancelled
Repository Maintenance / Stale (push) Has been cancelled
Repository Maintenance / Lock Old Threads (push) Has been cancelled
Repository Maintenance / Close Answered Discussions (push) Has been cancelled
Repository Maintenance / Close Outdated Discussions (push) Has been cancelled
Repository Maintenance / Close Unsupported Feature Requests (push) Has been cancelled
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2025-07-12 08:36:13 -07:00
shamoon
f5ecd6d787 Fix: fix glances info when cpu = 0 (#5506)
Some checks failed
Docker CI / Linting Checks (push) Has been cancelled
Docker CI / Docker Build & Push (push) Has been cancelled
Crowdin Action / Crowdin Sync (push) Has been cancelled
2025-07-11 19:47:31 -07:00
Đức
1d990ef7c7 Fix: increase color popover z-index (#5489)
Some checks failed
Crowdin Action / Crowdin Sync (push) Has been cancelled
Docker CI / Linting Checks (push) Has been cancelled
Docker CI / Docker Build & Push (push) Has been cancelled
Repository Maintenance / Stale (push) Has been cancelled
Repository Maintenance / Lock Old Threads (push) Has been cancelled
Repository Maintenance / Close Answered Discussions (push) Has been cancelled
Repository Maintenance / Close Outdated Discussions (push) Has been cancelled
Repository Maintenance / Close Unsupported Feature Requests (push) Has been cancelled
2025-07-07 09:29:48 -07:00
dependabot[bot]
767e7c58b4 Chore(deps): Bump react-i18next from 11.18.6 to 15.5.3 (#5470)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-01 11:58:43 -07:00
dependabot[bot]
c393982e84 Chore(deps-dev): Bump eslint-plugin-prettier from 5.2.6 to 5.5.1 (#5471)
Some checks failed
Crowdin Action / Crowdin Sync (push) Has been cancelled
Docker CI / Linting Checks (push) Has been cancelled
Docker CI / Docker Build & Push (push) Has been cancelled
Repository Maintenance / Stale (push) Has been cancelled
Repository Maintenance / Lock Old Threads (push) Has been cancelled
Repository Maintenance / Close Answered Discussions (push) Has been cancelled
Repository Maintenance / Close Outdated Discussions (push) Has been cancelled
Repository Maintenance / Close Unsupported Feature Requests (push) Has been cancelled
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-01 17:26:59 +00:00
dependabot[bot]
927b943fa4 Chore(deps-dev): Bump prettier from 3.5.3 to 3.6.2 (#5468)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-01 16:59:47 +00:00
dependabot[bot]
50f6d5f0e7 Chore(deps): Bump systeminformation from 5.25.11 to 5.27.7 (#5469)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-01 16:36:48 +00:00
dependabot[bot]
0482bf7b17 Chore(deps-dev): Bump eslint-plugin-react-hooks from 5.1.0 to 5.2.0 (#5467)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-01 09:25:23 -07:00
AdamWHY2K
e215e7d70e Enhancement: sort qBittorrent leechProgress (#5456)
Some checks failed
Crowdin Action / Crowdin Sync (push) Has been cancelled
Repository Maintenance / Stale (push) Has been cancelled
Repository Maintenance / Lock Old Threads (push) Has been cancelled
Repository Maintenance / Close Answered Discussions (push) Has been cancelled
Repository Maintenance / Close Outdated Discussions (push) Has been cancelled
Repository Maintenance / Close Unsupported Feature Requests (push) Has been cancelled
Docker CI / Linting Checks (push) Has been cancelled
Docker CI / Docker Build & Push (push) Has been cancelled
2025-06-28 14:23:02 -07:00
shamoon
352c54ecc4 Remove inaccurate POST examples from authoring docs
Some checks failed
Docs / Linting Checks (push) Has been cancelled
Docker CI / Linting Checks (push) Has been cancelled
Docker CI / Docker Build & Push (push) Has been cancelled
Docs / Test Build Docs (push) Has been cancelled
Docs / Build & Deploy Docs (push) Has been cancelled
2025-06-10 13:52:08 -07:00
Jayden
1147fc858f Documentation: fix beszel documentation typo (#5400) 2025-06-09 06:34:19 -07:00
12 changed files with 164 additions and 85 deletions

View File

@@ -44,9 +44,15 @@ fi
if [ -d /app/.next ]; then if [ -d /app/.next ]; then
CURRENT_UID=$(stat -c %u /app/.next) CURRENT_UID=$(stat -c %u /app/.next)
if [ "$CURRENT_UID" -ne "$PUID" ]; then CURRENT_GID=$(stat -c %g /app/.next)
if [ "$PUID" -ne 0 ] && ([ "$CURRENT_UID" -ne "$PUID" ] || [ "$CURRENT_GID" -ne "$PGID" ]); then
echo "Fixing ownership of /app/.next" echo "Fixing ownership of /app/.next"
chown -R "$PUID:$PGID" /app/.next || echo "Warning: Could not chown /app/.next" if ! chown -R "$PUID:$PGID" /app/.next 2>/dev/null; then
echo "Warning: Could not chown /app/.next; continuing anyway"
fi
else
echo "/app/.next already owned by correct UID/GID or running as root, skipping chown"
fi fi
fi fi

View File

@@ -225,20 +225,8 @@ const widgetExample = {
#### `method` #### `method`
The `method` property is a string that represents the HTTP method that should be used to make the API request. The default value is `GET`. The `method` represents the HTTP method that should be used to make the API request. The default value is `GET`. Note that `POST` requests are not allowed via the
widget API and require the use of a custom proxy.
```js
const widgetExample = {
api: "{url}/api/{endpoint}",
mappings: {
// `/api/stats`
stats: {
endpoint: "stats",
method: "POST",
},
},
};
```
#### `headers` #### `headers`
@@ -251,7 +239,6 @@ const widgetExample = {
// `/api/stats` // `/api/stats`
stats: { stats: {
endpoint: "stats", endpoint: "stats",
method: "POST",
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
}, },
@@ -271,7 +258,6 @@ const widgetExample = {
// `/api/graphql` // `/api/graphql`
stats: { stats: {
endpoint: "graphql", endpoint: "graphql",
method: "POST",
body: { body: {
query: ` query: `
query { query {

View File

@@ -9,7 +9,7 @@ The widget has two modes, a single system with detailed info if `systemId` is pr
The `systemID` is the `id` field on the collections page of Beszel under the PocketBase admin panel. You can also use the 'nice name' from the Beszel UI. The `systemID` is the `id` field on the collections page of Beszel under the PocketBase admin panel. You can also use the 'nice name' from the Beszel UI.
A "superuser" is currently required to access the data from tbe Beszel API. A "superuser" is currently required to access the data from the Beszel API.
Allowed fields for 'overview' mode: `["systems", "up"]` Allowed fields for 'overview' mode: `["systems", "up"]`
Allowed fields for a single system: `["name", "status", "updated", "cpu", "memory", "disk", "network"]` Allowed fields for a single system: `["name", "status", "updated", "cpu", "memory", "disk", "network"]`

View File

@@ -5,11 +5,18 @@ description: Grafana Widget Configuration
Learn more about [Grafana](https://github.com/grafana/grafana). Learn more about [Grafana](https://github.com/grafana/grafana).
| Grafana Version | Homepage Widget Version |
| --------------- | ----------------------- |
| <= v10.4 | 1 (default) |
| > v10.4 | 2 |
Allowed fields: `["dashboards", "datasources", "totalalerts", "alertstriggered"]`. Allowed fields: `["dashboards", "datasources", "totalalerts", "alertstriggered"]`.
```yaml ```yaml
widget: widget:
type: grafana type: grafana
version: 2 # optional, default is 1
alerts: alertmanager # optional, default is grafana
url: http://grafana.host.or.ip:port url: http://grafana.host.or.ip:port
username: username username: username
password: password password: password

View File

@@ -1,6 +1,6 @@
{ {
"name": "homepage", "name": "homepage",
"version": "1.3.2", "version": "1.4.0",
"private": true, "private": true,
"scripts": { "scripts": {
"preinstall": "npx only-allow pnpm", "preinstall": "npx only-allow pnpm",
@@ -32,11 +32,11 @@
"raw-body": "^3.0.0", "raw-body": "^3.0.0",
"react": "^18.3.1", "react": "^18.3.1",
"react-dom": "^18.3.1", "react-dom": "^18.3.1",
"react-i18next": "^11.18.6", "react-i18next": "^15.5.3",
"react-icons": "^5.4.0", "react-icons": "^5.4.0",
"recharts": "^2.15.3", "recharts": "^2.15.3",
"swr": "^2.3.3", "swr": "^2.3.3",
"systeminformation": "^5.25.11", "systeminformation": "^5.27.7",
"tough-cookie": "^5.1.2", "tough-cookie": "^5.1.2",
"urbackup-server-api": "^0.8.9", "urbackup-server-api": "^0.8.9",
"winston": "^3.17.0", "winston": "^3.17.0",
@@ -50,11 +50,11 @@
"eslint-config-prettier": "^10.1.1", "eslint-config-prettier": "^10.1.1",
"eslint-plugin-import": "^2.31.0", "eslint-plugin-import": "^2.31.0",
"eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-jsx-a11y": "^6.10.2",
"eslint-plugin-prettier": "^5.2.6", "eslint-plugin-prettier": "^5.5.1",
"eslint-plugin-react": "^7.37.4", "eslint-plugin-react": "^7.37.4",
"eslint-plugin-react-hooks": "^5.1.0", "eslint-plugin-react-hooks": "^5.2.0",
"postcss": "^8.5.3", "postcss": "^8.5.3",
"prettier": "^3.5.3", "prettier": "^3.6.2",
"prettier-plugin-organize-imports": "^4.1.0", "prettier-plugin-organize-imports": "^4.1.0",
"tailwind-scrollbar": "^4.0.2", "tailwind-scrollbar": "^4.0.2",
"tailwindcss": "^4.0.9", "tailwindcss": "^4.0.9",

104
pnpm-lock.yaml generated
View File

@@ -72,8 +72,8 @@ importers:
specifier: ^18.3.1 specifier: ^18.3.1
version: 18.3.1(react@18.3.1) version: 18.3.1(react@18.3.1)
react-i18next: react-i18next:
specifier: ^11.18.6 specifier: ^15.5.3
version: 11.18.6(i18next@24.2.3(typescript@5.7.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) version: 15.5.3(i18next@24.2.3(typescript@5.7.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)
react-icons: react-icons:
specifier: ^5.4.0 specifier: ^5.4.0
version: 5.4.0(react@18.3.1) version: 5.4.0(react@18.3.1)
@@ -84,8 +84,8 @@ importers:
specifier: ^2.3.3 specifier: ^2.3.3
version: 2.3.3(react@18.3.1) version: 2.3.3(react@18.3.1)
systeminformation: systeminformation:
specifier: ^5.25.11 specifier: ^5.27.7
version: 5.25.11 version: 5.27.7
tough-cookie: tough-cookie:
specifier: ^5.1.2 specifier: ^5.1.2
version: 5.1.2 version: 5.1.2
@@ -121,23 +121,23 @@ importers:
specifier: ^6.10.2 specifier: ^6.10.2
version: 6.10.2(eslint@9.25.1(jiti@2.4.2)) version: 6.10.2(eslint@9.25.1(jiti@2.4.2))
eslint-plugin-prettier: eslint-plugin-prettier:
specifier: ^5.2.6 specifier: ^5.5.1
version: 5.2.6(eslint-config-prettier@10.1.1(eslint@9.25.1(jiti@2.4.2)))(eslint@9.25.1(jiti@2.4.2))(prettier@3.5.3) version: 5.5.1(eslint-config-prettier@10.1.1(eslint@9.25.1(jiti@2.4.2)))(eslint@9.25.1(jiti@2.4.2))(prettier@3.6.2)
eslint-plugin-react: eslint-plugin-react:
specifier: ^7.37.4 specifier: ^7.37.4
version: 7.37.4(eslint@9.25.1(jiti@2.4.2)) version: 7.37.4(eslint@9.25.1(jiti@2.4.2))
eslint-plugin-react-hooks: eslint-plugin-react-hooks:
specifier: ^5.1.0 specifier: ^5.2.0
version: 5.1.0(eslint@9.25.1(jiti@2.4.2)) version: 5.2.0(eslint@9.25.1(jiti@2.4.2))
postcss: postcss:
specifier: ^8.5.3 specifier: ^8.5.3
version: 8.5.3 version: 8.5.3
prettier: prettier:
specifier: ^3.5.3 specifier: ^3.6.2
version: 3.5.3 version: 3.6.2
prettier-plugin-organize-imports: prettier-plugin-organize-imports:
specifier: ^4.1.0 specifier: ^4.1.0
version: 4.1.0(prettier@3.5.3)(typescript@5.7.3) version: 4.1.0(prettier@3.6.2)(typescript@5.7.3)
tailwind-scrollbar: tailwind-scrollbar:
specifier: ^4.0.2 specifier: ^4.0.2
version: 4.0.2(react@18.3.1)(tailwindcss@4.0.9) version: 4.0.2(react@18.3.1)(tailwindcss@4.0.9)
@@ -166,8 +166,8 @@ packages:
resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
'@babel/runtime@7.27.1': '@babel/runtime@7.27.6':
resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
'@balena/dockerignore@1.0.2': '@balena/dockerignore@1.0.2':
@@ -476,8 +476,8 @@ packages:
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'} engines: {node: '>=14'}
'@pkgr/core@0.2.4': '@pkgr/core@0.2.7':
resolution: {integrity: sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==} resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==}
engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
'@protobufjs/aspromise@1.1.2': '@protobufjs/aspromise@1.1.2':
@@ -1364,8 +1364,8 @@ packages:
peerDependencies: peerDependencies:
eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9
eslint-plugin-prettier@5.2.6: eslint-plugin-prettier@5.5.1:
resolution: {integrity: sha512-mUcf7QG2Tjk7H055Jk0lGBjbgDnfrvqjhXh9t2xLMSCjZVcw9Rb1V6sVNXO0th3jgeO7zllWPTNRil3JW94TnQ==} resolution: {integrity: sha512-dobTkHT6XaEVOo8IO90Q4DOSxnm3Y151QxPJlM/vKC0bVy+d6cVWQZLlFiuZPP0wS6vZwSKeJgKkcS+KfMBlRw==}
engines: {node: ^14.18.0 || >=16.0.0} engines: {node: ^14.18.0 || >=16.0.0}
peerDependencies: peerDependencies:
'@types/eslint': '>=8.0.0' '@types/eslint': '>=8.0.0'
@@ -1378,8 +1378,8 @@ packages:
eslint-config-prettier: eslint-config-prettier:
optional: true optional: true
eslint-plugin-react-hooks@5.1.0: eslint-plugin-react-hooks@5.2.0:
resolution: {integrity: sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==} resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==}
engines: {node: '>=10'} engines: {node: '>=10'}
peerDependencies: peerDependencies:
eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0
@@ -2262,8 +2262,8 @@ packages:
vue-tsc: vue-tsc:
optional: true optional: true
prettier@3.5.3: prettier@3.6.2:
resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==}
engines: {node: '>=14'} engines: {node: '>=14'}
hasBin: true hasBin: true
@@ -2322,6 +2322,22 @@ packages:
react-native: react-native:
optional: true optional: true
react-i18next@15.5.3:
resolution: {integrity: sha512-ypYmOKOnjqPEJZO4m1BI0kS8kWqkBNsKYyhVUfij0gvjy9xJNoG/VcGkxq5dRlVwzmrmY1BQMAmpbbUBLwC4Kw==}
peerDependencies:
i18next: '>= 23.2.3'
react: '>= 16.8.0'
react-dom: '*'
react-native: '*'
typescript: ^5
peerDependenciesMeta:
react-dom:
optional: true
react-native:
optional: true
typescript:
optional: true
react-icons@5.4.0: react-icons@5.4.0:
resolution: {integrity: sha512-7eltJxgVt7X64oHh6wSWNwwbKTCtMfK35hcjvJS0yxEAhPM8oUKdS3+kqaW1vicIltw+kR2unHaa12S9pPALoQ==} resolution: {integrity: sha512-7eltJxgVt7X64oHh6wSWNwwbKTCtMfK35hcjvJS0yxEAhPM8oUKdS3+kqaW1vicIltw+kR2unHaa12S9pPALoQ==}
peerDependencies: peerDependencies:
@@ -2632,12 +2648,12 @@ packages:
peerDependencies: peerDependencies:
react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
synckit@0.11.4: synckit@0.11.8:
resolution: {integrity: sha512-Q/XQKRaJiLiFIBNN+mndW7S/RHxvwzuZS6ZwmRzUBqJBv/5QIKCEwkBC8GBf8EQJKYnaFs0wOZbKTXBPj8L9oQ==} resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==}
engines: {node: ^14.18.0 || >=16.0.0} engines: {node: ^14.18.0 || >=16.0.0}
systeminformation@5.25.11: systeminformation@5.27.7:
resolution: {integrity: sha512-jI01fn/t47rrLTQB0FTlMCC+5dYx8o0RRF+R4BPiUNsvg5OdY0s9DKMFmJGrx5SwMZQ4cag0Gl6v8oycso9b/g==} resolution: {integrity: sha512-saaqOoVEEFaux4v0K8Q7caiauRwjXC4XbD2eH60dxHXbpKxQ8kH9Rf7Jh+nryKpOUSEFxtCdBlSUx0/lO6rwRg==}
engines: {node: '>=8.0.0'} engines: {node: '>=8.0.0'}
os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android]
hasBin: true hasBin: true
@@ -2897,7 +2913,7 @@ snapshots:
dependencies: dependencies:
regenerator-runtime: 0.14.1 regenerator-runtime: 0.14.1
'@babel/runtime@7.27.1': {} '@babel/runtime@7.27.6': {}
'@balena/dockerignore@1.0.2': {} '@balena/dockerignore@1.0.2': {}
@@ -3181,7 +3197,7 @@ snapshots:
'@pkgjs/parseargs@0.11.0': '@pkgjs/parseargs@0.11.0':
optional: true optional: true
'@pkgr/core@0.2.4': {} '@pkgr/core@0.2.7': {}
'@protobufjs/aspromise@1.1.2': {} '@protobufjs/aspromise@1.1.2': {}
@@ -3929,7 +3945,7 @@ snapshots:
dom-helpers@5.2.1: dom-helpers@5.2.1:
dependencies: dependencies:
'@babel/runtime': 7.27.1 '@babel/runtime': 7.27.6
csstype: 3.1.3 csstype: 3.1.3
dom-serializer@2.0.0: dom-serializer@2.0.0:
@@ -4089,7 +4105,7 @@ snapshots:
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.29.0(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.10.0)(eslint@9.25.1(jiti@2.4.2)) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.29.0(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.10.0)(eslint@9.25.1(jiti@2.4.2))
eslint-plugin-jsx-a11y: 6.10.2(eslint@9.25.1(jiti@2.4.2)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.25.1(jiti@2.4.2))
eslint-plugin-react: 7.37.4(eslint@9.25.1(jiti@2.4.2)) eslint-plugin-react: 7.37.4(eslint@9.25.1(jiti@2.4.2))
eslint-plugin-react-hooks: 5.1.0(eslint@9.25.1(jiti@2.4.2)) eslint-plugin-react-hooks: 5.2.0(eslint@9.25.1(jiti@2.4.2))
optionalDependencies: optionalDependencies:
typescript: 5.7.3 typescript: 5.7.3
transitivePeerDependencies: transitivePeerDependencies:
@@ -4183,16 +4199,16 @@ snapshots:
safe-regex-test: 1.1.0 safe-regex-test: 1.1.0
string.prototype.includes: 2.0.1 string.prototype.includes: 2.0.1
eslint-plugin-prettier@5.2.6(eslint-config-prettier@10.1.1(eslint@9.25.1(jiti@2.4.2)))(eslint@9.25.1(jiti@2.4.2))(prettier@3.5.3): eslint-plugin-prettier@5.5.1(eslint-config-prettier@10.1.1(eslint@9.25.1(jiti@2.4.2)))(eslint@9.25.1(jiti@2.4.2))(prettier@3.6.2):
dependencies: dependencies:
eslint: 9.25.1(jiti@2.4.2) eslint: 9.25.1(jiti@2.4.2)
prettier: 3.5.3 prettier: 3.6.2
prettier-linter-helpers: 1.0.0 prettier-linter-helpers: 1.0.0
synckit: 0.11.4 synckit: 0.11.8
optionalDependencies: optionalDependencies:
eslint-config-prettier: 10.1.1(eslint@9.25.1(jiti@2.4.2)) eslint-config-prettier: 10.1.1(eslint@9.25.1(jiti@2.4.2))
eslint-plugin-react-hooks@5.1.0(eslint@9.25.1(jiti@2.4.2)): eslint-plugin-react-hooks@5.2.0(eslint@9.25.1(jiti@2.4.2)):
dependencies: dependencies:
eslint: 9.25.1(jiti@2.4.2) eslint: 9.25.1(jiti@2.4.2)
@@ -4535,7 +4551,7 @@ snapshots:
i18next@21.10.0: i18next@21.10.0:
dependencies: dependencies:
'@babel/runtime': 7.27.0 '@babel/runtime': 7.26.9
i18next@24.2.3(typescript@5.7.3): i18next@24.2.3(typescript@5.7.3):
dependencies: dependencies:
@@ -5089,12 +5105,12 @@ snapshots:
dependencies: dependencies:
fast-diff: 1.3.0 fast-diff: 1.3.0
prettier-plugin-organize-imports@4.1.0(prettier@3.5.3)(typescript@5.7.3): prettier-plugin-organize-imports@4.1.0(prettier@3.6.2)(typescript@5.7.3):
dependencies: dependencies:
prettier: 3.5.3 prettier: 3.6.2
typescript: 5.7.3 typescript: 5.7.3
prettier@3.5.3: {} prettier@3.6.2: {}
pretty-bytes@6.1.1: {} pretty-bytes@6.1.1: {}
@@ -5160,14 +5176,15 @@ snapshots:
optionalDependencies: optionalDependencies:
react-dom: 18.3.1(react@18.3.1) react-dom: 18.3.1(react@18.3.1)
react-i18next@11.18.6(i18next@24.2.3(typescript@5.7.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): react-i18next@15.5.3(i18next@24.2.3(typescript@5.7.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3):
dependencies: dependencies:
'@babel/runtime': 7.26.9 '@babel/runtime': 7.27.6
html-parse-stringify: 3.0.1 html-parse-stringify: 3.0.1
i18next: 24.2.3(typescript@5.7.3) i18next: 24.2.3(typescript@5.7.3)
react: 18.3.1 react: 18.3.1
optionalDependencies: optionalDependencies:
react-dom: 18.3.1(react@18.3.1) react-dom: 18.3.1(react@18.3.1)
typescript: 5.7.3
react-icons@5.4.0(react@18.3.1): react-icons@5.4.0(react@18.3.1):
dependencies: dependencies:
@@ -5187,7 +5204,7 @@ snapshots:
react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies: dependencies:
'@babel/runtime': 7.27.1 '@babel/runtime': 7.27.6
dom-helpers: 5.2.1 dom-helpers: 5.2.1
loose-envify: 1.4.0 loose-envify: 1.4.0
prop-types: 15.8.1 prop-types: 15.8.1
@@ -5559,12 +5576,11 @@ snapshots:
react: 18.3.1 react: 18.3.1
use-sync-external-store: 1.5.0(react@18.3.1) use-sync-external-store: 1.5.0(react@18.3.1)
synckit@0.11.4: synckit@0.11.8:
dependencies: dependencies:
'@pkgr/core': 0.2.4 '@pkgr/core': 0.2.7
tslib: 2.8.1
systeminformation@5.25.11: {} systeminformation@5.27.7: {}
tailwind-scrollbar@4.0.2(react@18.3.1)(tailwindcss@4.0.9): tailwind-scrollbar@4.0.2(react@18.3.1)(tailwindcss@4.0.9):
dependencies: dependencies:

View File

@@ -55,7 +55,7 @@ export default function ColorToggle() {
leaveFrom="opacity-100 translate-y-0" leaveFrom="opacity-100 translate-y-0"
leaveTo="opacity-0 translate-y-1" leaveTo="opacity-0 translate-y-1"
> >
<Popover.Panel className="absolute -top-[75px] left-0"> <Popover.Panel className="absolute -top-[75px] left-0 z-10">
<div className="rounded-md shadow-lg ring-1 ring-black ring-opacity-5 w-[85vw] sm:w-full"> <div className="rounded-md shadow-lg ring-1 ring-black ring-opacity-5 w-[85vw] sm:w-full">
<div className="relative grid gap-2 p-2 grid-cols-11 bg-white/50 dark:bg-white/10 shadow-black/10 dark:shadow-black/20 rounded-md shadow-md"> <div className="relative grid gap-2 p-2 grid-cols-11 bg-white/50 dark:bg-white/10 shadow-black/10 dark:shadow-black/20 rounded-md shadow-md">
{colors.map((color) => ( {colors.map((color) => (

View File

@@ -407,6 +407,9 @@ export function cleanServiceGroups(groups) {
// spoolman // spoolman
spoolIds, spoolIds,
// grafana
alerts,
} = widgetData; } = widgetData;
let fieldsList = fields; let fieldsList = fields;
@@ -514,7 +517,18 @@ export function cleanServiceGroups(groups) {
if (snapshotPath) widget.snapshotPath = snapshotPath; if (snapshotPath) widget.snapshotPath = snapshotPath;
} }
if ( if (
["beszel", "glances", "immich", "komga", "mealie", "pfsense", "pihole", "speedtest", "wgeasy"].includes(type) [
"beszel",
"glances",
"immich",
"komga",
"mealie",
"pfsense",
"pihole",
"speedtest",
"wgeasy",
"grafana",
].includes(type)
) { ) {
if (version) widget.version = parseInt(version, 10); if (version) widget.version = parseInt(version, 10);
} }
@@ -593,6 +607,9 @@ export function cleanServiceGroups(groups) {
if (type === "jellystat") { if (type === "jellystat") {
if (days !== undefined) widget.days = parseInt(days, 10); if (days !== undefined) widget.days = parseInt(days, 10);
} }
if (type === "grafana") {
if (alerts) widget.alerts = alerts;
}
return widget; return widget;
}); });
return cleanedService; return cleanedService;

View File

@@ -31,7 +31,8 @@ function CPU({ quicklookData, className = "" }) {
return ( return (
quicklookData && quicklookData &&
quicklookData.cpu && ( quicklookData.cpu !== undefined &&
quicklookData.cpu !== null && (
<div className="text-xs flex place-content-between"> <div className="text-xs flex place-content-between">
<div className={className}>{t("glances.cpu")}</div> <div className={className}>{t("glances.cpu")}</div>
<div className={className}> <div className={className}>

View File

@@ -6,27 +6,51 @@ import useWidgetAPI from "utils/proxy/use-widget-api";
export default function Component({ service }) { export default function Component({ service }) {
const { t } = useTranslation(); const { t } = useTranslation();
const { widget } = service; const { widget } = service;
const { version = 1, alerts = "grafana" } = widget;
const { data: statsData, error: statsError } = useWidgetAPI(widget, "stats"); const { data: statsData, error: statsError } = useWidgetAPI(widget, "stats");
const { data: alertsData, error: alertsError } = useWidgetAPI(widget, "alerts");
const { data: alertmanagerData, error: alertmanagerError } = useWidgetAPI(widget, "alertmanager");
let alertsInt = 0; let primaryAlertsEndpoint = "alerts";
let secondaryAlertsEndpoint = "grafana";
if (alertsError || !alertsData || alertsData.length === 0) { if (version === 2) {
if (alertmanagerData) { primaryAlertsEndpoint = alerts;
alertsInt = alertmanagerData.length; secondaryAlertsEndpoint = "";
}
} else {
alertsInt = alertsData.filter((a) => a.state === "alerting").length;
} }
if (statsError || (alertsError && alertmanagerError)) { const { data: primaryAlertsData, error: primaryAlertsError } = useWidgetAPI(widget, primaryAlertsEndpoint);
const { data: secondaryAlertsData, error: secondaryAlertsError } = useWidgetAPI(widget, secondaryAlertsEndpoint);
let alertsInt = 0;
let alertsError = null;
if (version === 1) {
if (primaryAlertsError || !primaryAlertsData || primaryAlertsData.length === 0) {
if (secondaryAlertsData) {
alertsInt = secondaryAlertsData.length;
}
} else {
alertsInt = primaryAlertsData.filter((a) => a.state === "alerting").length;
}
if (primaryAlertsError && secondaryAlertsError) {
alertsError = primaryAlertsError ?? secondaryAlertsError;
}
} else if (version === 2) {
if (primaryAlertsData) {
alertsInt = primaryAlertsData.length;
}
if (primaryAlertsError) {
alertsError = primaryAlertsError;
}
}
if (statsError || alertsError) {
return <Container service={service} error={statsError ?? alertsError} />; return <Container service={service} error={statsError ?? alertsError} />;
} }
if (!statsData || (!alertsData && !alertmanagerData)) { if (!statsData) {
return ( return (
<Container service={service}> <Container service={service}>
<Block label="grafana.dashboards" /> <Block label="grafana.dashboards" />

View File

@@ -9,6 +9,9 @@ const widget = {
endpoint: "alerts", endpoint: "alerts",
}, },
alertmanager: { alertmanager: {
endpoint: "alertmanager/alertmanager/api/v2/alerts",
},
grafana: {
endpoint: "alertmanager/grafana/api/v2/alerts", endpoint: "alertmanager/grafana/api/v2/alerts",
}, },
stats: { stats: {

View File

@@ -45,6 +45,25 @@ export default function Component({ service }) {
} }
const leech = torrentData.length - completed; const leech = torrentData.length - completed;
const statePriority = [
"downloading",
"forcedDL",
"metaDL",
"forcedMetaDL",
"checkingDL",
"stalledDL",
"queuedDL",
"pausedDL",
];
leechTorrents.sort((firstTorrent, secondTorrent) => {
const firstStateIndex = statePriority.indexOf(firstTorrent.state);
const secondStateIndex = statePriority.indexOf(secondTorrent.state);
if (firstStateIndex !== secondStateIndex) {
return firstStateIndex - secondStateIndex;
}
return secondTorrent.progress - firstTorrent.progress;
});
return ( return (
<> <>