mirror of
https://github.com/gethomepage/homepage.git
synced 2026-01-02 21:22:11 +08:00
Compare commits
14 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7426a12cdf | ||
|
|
cbf2e1a509 | ||
|
|
d0165326a6 | ||
|
|
dba3a1f893 | ||
|
|
f5ecd6d787 | ||
|
|
1d990ef7c7 | ||
|
|
767e7c58b4 | ||
|
|
c393982e84 | ||
|
|
927b943fa4 | ||
|
|
50f6d5f0e7 | ||
|
|
0482bf7b17 | ||
|
|
e215e7d70e | ||
|
|
352c54ecc4 | ||
|
|
1147fc858f |
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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"]`
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
12
package.json
12
package.json
@@ -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
104
pnpm-lock.yaml
generated
@@ -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:
|
||||||
|
|||||||
@@ -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) => (
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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}>
|
||||||
|
|||||||
@@ -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" />
|
||||||
|
|||||||
@@ -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: {
|
||||||
|
|||||||
@@ -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 (
|
||||||
<>
|
<>
|
||||||
|
|||||||
Reference in New Issue
Block a user