Compare commits

..

1 Commits

Author SHA1 Message Date
Crowdin Bot
3c06c39eac New Crowdin translations by GitHub Action 2025-10-14 12:14:41 +00:00
18 changed files with 121 additions and 132 deletions

View File

@@ -38,7 +38,7 @@ jobs:
run_install: false run_install: false
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@v6 uses: actions/setup-node@v5
with: with:
node-version: 20 node-version: 20
cache: 'pnpm' cache: 'pnpm'
@@ -96,7 +96,7 @@ jobs:
run_install: false run_install: false
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@v6 uses: actions/setup-node@v5
with: with:
node-version: 20 node-version: 20
cache: 'pnpm' cache: 'pnpm'

View File

@@ -271,4 +271,4 @@ You can show the docker stats by clicking the status indicator but this can also
showStats: true showStats: true
``` ```
Also see the settings for [show docker stats](settings.md#show-container-stats). Also see the settings for [show docker stats](settings.md#show-docker-stats).

View File

@@ -500,9 +500,9 @@ logpath: /logfile/path
By default, logs are sent both to `stdout` and to a file at the path specified. This can be changed by setting the `LOG_TARGETS` environment variable to one of `both` (default), `stdout` or `file`. By default, logs are sent both to `stdout` and to a file at the path specified. This can be changed by setting the `LOG_TARGETS` environment variable to one of `both` (default), `stdout` or `file`.
## Show Container Stats ## Show Docker Stats
You can show all docker or proxmox stats expanded in `settings.yaml`: You can show all docker stats expanded in `settings.yaml`:
```yaml ```yaml
showStats: true showStats: true

View File

@@ -62,4 +62,3 @@ To ensure cohesiveness of various widgets, the following should be used as a gui
- Minimize the number of API calls - Minimize the number of API calls
- Avoid the use of custom proxy unless absolutely necessary - Avoid the use of custom proxy unless absolutely necessary
- Widgets should be 'read-only', as in they should not make write changes using the relevant tool's API. Homepage widgets are designed to surface information, not to be a (usually worse) replacement for the tool itself. - Widgets should be 'read-only', as in they should not make write changes using the relevant tool's API. Homepage widgets are designed to surface information, not to be a (usually worse) replacement for the tool itself.
- Widgets should not allow manually overriding the "refresh interval" setting, as misconfigured refresh intervals can easily lead to performance issues for users.

View File

@@ -10,11 +10,11 @@ The Unraid widget allows you to monitor the resources of an Unraid server.
**Minimum Requirements:** **Minimum Requirements:**
- Unraid 7.2 -or- Unraid Connect plugin 2025.08.19.1850 - Unraid 7.2 -or- Unraid Connect plugin 2025.08.19.1850
- API key with the **ADMIN** role: [Managing API Keys](https://docs.unraid.net/go/managing-api-keys) - API key with the **GUEST** (read only) role: [Managing API Keys](https://docs.unraid.net/go/managing-api-keys)
The widget can display metrics for selected Unraid pools. If using one of the "pool" fields, you must also add the pool name to the settings. The widget can display metrics for selected Unraid pools. If using one of the "pool" fields, you must also add the pool name to the settings.
**Allowed fields:** `["cpu","memoryPercent","memoryAvailable","memoryUsed","notifications","arrayFree","arrayUsedSpace","arrayUsedPercent","status","pool1UsedSpace","pool1FreeSpace","pool1UsedPercent","pool2UsedSpace","pool2FreeSpace","pool2UsedPercent","pool3UsedSpace","pool3FreeSpace","pool3UsedPercent","pool4UsedSpace","pool4FreeSpace","pool4UsedPercent"]` **Allowed fields:** `["cpu","memoryPercent","memoryAvailable","memoryUsed","notifications","arrayFreeSpace","arrayUsedSpace","arrayUsedPercent","status","pool1UsedSpace","pool1FreeSpace","pool1UsedPercent","pool2UsedSpace","pool2FreeSpace","pool2UsedPercent","pool3UsedSpace","pool3FreeSpace","pool3UsedPercent","pool4UsedSpace","pool4FreeSpace","pool4UsedPercent"]`
```yaml ```yaml
widget: widget:

View File

@@ -1,6 +1,6 @@
{ {
"name": "homepage", "name": "homepage",
"version": "1.6.1", "version": "1.5.0",
"private": true, "private": true,
"scripts": { "scripts": {
"preinstall": "npx only-allow pnpm", "preinstall": "npx only-allow pnpm",
@@ -11,7 +11,7 @@
"telemetry": "next telemetry disable" "telemetry": "next telemetry disable"
}, },
"dependencies": { "dependencies": {
"@headlessui/react": "^2.2.9", "@headlessui/react": "^2.2.7",
"@kubernetes/client-node": "^1.0.0", "@kubernetes/client-node": "^1.0.0",
"classnames": "^2.5.1", "classnames": "^2.5.1",
"compare-versions": "^6.1.1", "compare-versions": "^6.1.1",
@@ -28,7 +28,7 @@
"next": "^15.5.2", "next": "^15.5.2",
"next-i18next": "^12.1.0", "next-i18next": "^12.1.0",
"ping": "^0.4.4", "ping": "^0.4.4",
"pretty-bytes": "^7.1.0", "pretty-bytes": "^6.1.1",
"raw-body": "^3.0.1", "raw-body": "^3.0.1",
"react": "^18.3.1", "react": "^18.3.1",
"react-dom": "^18.3.1", "react-dom": "^18.3.1",
@@ -47,7 +47,7 @@
"@tailwindcss/postcss": "^4.1.14", "@tailwindcss/postcss": "^4.1.14",
"eslint": "^9.25.1", "eslint": "^9.25.1",
"eslint-config-next": "^15.2.4", "eslint-config-next": "^15.2.4",
"eslint-config-prettier": "^10.1.8", "eslint-config-prettier": "^10.1.1",
"eslint-plugin-import": "^2.32.0", "eslint-plugin-import": "^2.32.0",
"eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-jsx-a11y": "^6.10.2",
"eslint-plugin-prettier": "^5.5.4", "eslint-plugin-prettier": "^5.5.4",
@@ -55,7 +55,7 @@
"eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-hooks": "^5.2.0",
"postcss": "^8.5.6", "postcss": "^8.5.6",
"prettier": "^3.6.2", "prettier": "^3.6.2",
"prettier-plugin-organize-imports": "^4.3.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",
"typescript": "^5.7.3" "typescript": "^5.7.3"

111
pnpm-lock.yaml generated
View File

@@ -9,8 +9,8 @@ importers:
.: .:
dependencies: dependencies:
'@headlessui/react': '@headlessui/react':
specifier: ^2.2.9 specifier: ^2.2.7
version: 2.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) version: 2.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@kubernetes/client-node': '@kubernetes/client-node':
specifier: ^1.0.0 specifier: ^1.0.0
version: 1.0.0 version: 1.0.0
@@ -60,8 +60,8 @@ importers:
specifier: ^0.4.4 specifier: ^0.4.4
version: 0.4.4 version: 0.4.4
pretty-bytes: pretty-bytes:
specifier: ^7.1.0 specifier: ^6.1.1
version: 7.1.0 version: 6.1.1
raw-body: raw-body:
specifier: ^3.0.1 specifier: ^3.0.1
version: 3.0.1 version: 3.0.1
@@ -112,8 +112,8 @@ importers:
specifier: ^15.2.4 specifier: ^15.2.4
version: 15.2.4(eslint@9.25.1(jiti@2.6.1))(typescript@5.7.3) version: 15.2.4(eslint@9.25.1(jiti@2.6.1))(typescript@5.7.3)
eslint-config-prettier: eslint-config-prettier:
specifier: ^10.1.8 specifier: ^10.1.1
version: 10.1.8(eslint@9.25.1(jiti@2.6.1)) version: 10.1.1(eslint@9.25.1(jiti@2.6.1))
eslint-plugin-import: eslint-plugin-import:
specifier: ^2.32.0 specifier: ^2.32.0
version: 2.32.0(@typescript-eslint/parser@8.29.0(eslint@9.25.1(jiti@2.6.1))(typescript@5.7.3))(eslint-import-resolver-typescript@3.10.0)(eslint@9.25.1(jiti@2.6.1)) version: 2.32.0(@typescript-eslint/parser@8.29.0(eslint@9.25.1(jiti@2.6.1))(typescript@5.7.3))(eslint-import-resolver-typescript@3.10.0)(eslint@9.25.1(jiti@2.6.1))
@@ -122,7 +122,7 @@ importers:
version: 6.10.2(eslint@9.25.1(jiti@2.6.1)) version: 6.10.2(eslint@9.25.1(jiti@2.6.1))
eslint-plugin-prettier: eslint-plugin-prettier:
specifier: ^5.5.4 specifier: ^5.5.4
version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.25.1(jiti@2.6.1)))(eslint@9.25.1(jiti@2.6.1))(prettier@3.6.2) version: 5.5.4(eslint-config-prettier@10.1.1(eslint@9.25.1(jiti@2.6.1)))(eslint@9.25.1(jiti@2.6.1))(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.6.1)) version: 7.37.4(eslint@9.25.1(jiti@2.6.1))
@@ -136,8 +136,8 @@ importers:
specifier: ^3.6.2 specifier: ^3.6.2
version: 3.6.2 version: 3.6.2
prettier-plugin-organize-imports: prettier-plugin-organize-imports:
specifier: ^4.3.0 specifier: ^4.1.0
version: 4.3.0(prettier@3.6.2)(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)
@@ -257,8 +257,8 @@ packages:
engines: {node: '>=6'} engines: {node: '>=6'}
hasBin: true hasBin: true
'@headlessui/react@2.2.9': '@headlessui/react@2.2.7':
resolution: {integrity: sha512-Mb+Un58gwBn0/yWZfyrCh0TJyurtT+dETj7YHleylHk5od3dv2XqETPGWMyQ5/7sYN7oWdyM1u9MvC0OC8UmzQ==} resolution: {integrity: sha512-WKdTymY8Y49H8/gUc/lIyYK1M+/6dq0Iywh4zTZVAaiTDprRfioxSgD0wnXTQTBpjpGJuTL1NO/mqEvc//5SSg==}
engines: {node: '>=10'} engines: {node: '>=10'}
peerDependencies: peerDependencies:
react: ^18 || ^19 || ^19.0.0-rc react: ^18 || ^19 || ^19.0.0-rc
@@ -559,14 +559,14 @@ packages:
'@protobufjs/utf8@1.1.0': '@protobufjs/utf8@1.1.0':
resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==}
'@react-aria/focus@3.21.2': '@react-aria/focus@3.21.1':
resolution: {integrity: sha512-JWaCR7wJVggj+ldmM/cb/DXFg47CXR55lznJhZBh4XVqJjMKwaOOqpT5vNN7kpC1wUpXicGNuDnJDN1S/+6dhQ==} resolution: {integrity: sha512-hmH1IhHlcQ2lSIxmki1biWzMbGgnhdxJUM0MFfzc71Rv6YAzhlx4kX3GYn4VNcjCeb6cdPv4RZ5vunV4kgMZYQ==}
peerDependencies: peerDependencies:
react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
'@react-aria/interactions@3.25.6': '@react-aria/interactions@3.25.5':
resolution: {integrity: sha512-5UgwZmohpixwNMVkMvn9K1ceJe6TzlRlAfuYoQDUuOkk62/JVJNDLAPKIf5YMRc7d2B0rmfgaZLMtbREb0Zvkw==} resolution: {integrity: sha512-EweYHOEvMwef/wsiEqV73KurX/OqnmbzKQa2fLxdULbec5+yDj6wVGaRHIzM4NiijIDe+bldEl5DG05CAKOAHA==}
peerDependencies: peerDependencies:
react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
@@ -577,8 +577,8 @@ packages:
peerDependencies: peerDependencies:
react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
'@react-aria/utils@3.31.0': '@react-aria/utils@3.30.1':
resolution: {integrity: sha512-ABOzCsZrWzf78ysswmguJbx3McQUja7yeGj6/vZo4JVsZNlxAN+E9rs381ExBRI0KzVo6iBTeX5De8eMZPJXig==} resolution: {integrity: sha512-zETcbDd6Vf9GbLndO6RiWJadIZsBU2MMm23rBACXLmpRztkrIqPEb2RVdlLaq1+GklDx0Ii6PfveVjx+8S5U6A==}
peerDependencies: peerDependencies:
react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
@@ -591,8 +591,8 @@ packages:
peerDependencies: peerDependencies:
react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
'@react-types/shared@3.32.1': '@react-types/shared@3.32.0':
resolution: {integrity: sha512-famxyD5emrGGpFuUlgOP6fVW2h/ZaF405G5KDi3zPHzyjAWys/8W6NAVJtNbkCkhedmvL0xOhvt8feGXyXaw5w==} resolution: {integrity: sha512-t+cligIJsZYFMSPFMvsJMjzlzde06tZMOIOFa1OV5Z0BcMowrb2g4mB57j/9nP28iJIRYn10xCniQts+qadrqQ==}
peerDependencies: peerDependencies:
react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
@@ -1411,8 +1411,8 @@ packages:
typescript: typescript:
optional: true optional: true
eslint-config-prettier@10.1.8: eslint-config-prettier@10.1.1:
resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} resolution: {integrity: sha512-4EQQr6wXwS+ZJSzaR5ZCrYgLxqvUjdXctaEtBqHcbkW944B1NQyO4qpdHQbXBONfwxXdkAY81HH4+LUfrg+zPw==}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
eslint: '>=7.0.0' eslint: '>=7.0.0'
@@ -2361,12 +2361,12 @@ packages:
resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
engines: {node: '>=6.0.0'} engines: {node: '>=6.0.0'}
prettier-plugin-organize-imports@4.3.0: prettier-plugin-organize-imports@4.1.0:
resolution: {integrity: sha512-FxFz0qFhyBsGdIsb697f/EkvHzi5SZOhWAjxcx2dLt+Q532bAlhswcXGYB1yzjZ69kW8UoadFBw7TyNwlq96Iw==} resolution: {integrity: sha512-5aWRdCgv645xaa58X8lOxzZoiHAldAPChljr/MT0crXVOWTZ+Svl4hIWlz+niYSlO6ikE5UXkN1JrRvIP2ut0A==}
peerDependencies: peerDependencies:
prettier: '>=2.0' prettier: '>=2.0'
typescript: '>=2.9' typescript: '>=2.9'
vue-tsc: ^2.1.0 || 3 vue-tsc: ^2.1.0
peerDependenciesMeta: peerDependenciesMeta:
vue-tsc: vue-tsc:
optional: true optional: true
@@ -2376,9 +2376,9 @@ packages:
engines: {node: '>=14'} engines: {node: '>=14'}
hasBin: true hasBin: true
pretty-bytes@7.1.0: pretty-bytes@6.1.1:
resolution: {integrity: sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw==} resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==}
engines: {node: '>=20'} engines: {node: ^14.13.1 || >=16.0.0}
prism-react-renderer@2.4.1: prism-react-renderer@2.4.1:
resolution: {integrity: sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==} resolution: {integrity: sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==}
@@ -2782,8 +2782,8 @@ packages:
os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android]
hasBin: true hasBin: true
tabbable@6.3.0: tabbable@6.2.0:
resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==} resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==}
tailwind-scrollbar@4.0.2: tailwind-scrollbar@4.0.2:
resolution: {integrity: sha512-wAQiIxAPqk0MNTPptVe/xoyWi27y+NRGnTwvn4PQnbvB9kp8QUBiGl/wsfoVBHnQxTmhXJSNt9NHTmcz9EivFA==} resolution: {integrity: sha512-wAQiIxAPqk0MNTPptVe/xoyWi27y+NRGnTwvn4PQnbvB9kp8QUBiGl/wsfoVBHnQxTmhXJSNt9NHTmcz9EivFA==}
@@ -2930,11 +2930,6 @@ packages:
peerDependencies: peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
use-sync-external-store@1.6.0:
resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
util-deprecate@1.0.2: util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
@@ -3153,7 +3148,7 @@ snapshots:
'@floating-ui/utils': 0.2.10 '@floating-ui/utils': 0.2.10
react: 18.3.1 react: 18.3.1
react-dom: 18.3.1(react@18.3.1) react-dom: 18.3.1(react@18.3.1)
tabbable: 6.3.0 tabbable: 6.2.0
'@floating-ui/utils@0.2.10': {} '@floating-ui/utils@0.2.10': {}
@@ -3169,15 +3164,15 @@ snapshots:
protobufjs: 7.5.3 protobufjs: 7.5.3
yargs: 17.7.2 yargs: 17.7.2
'@headlessui/react@2.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': '@headlessui/react@2.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies: dependencies:
'@floating-ui/react': 0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@floating-ui/react': 0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@react-aria/focus': 3.21.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-aria/focus': 3.21.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@react-aria/interactions': 3.25.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-aria/interactions': 3.25.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@tanstack/react-virtual': 3.13.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-virtual': 3.13.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1 react: 18.3.1
react-dom: 18.3.1(react@18.3.1) react-dom: 18.3.1(react@18.3.1)
use-sync-external-store: 1.6.0(react@18.3.1) use-sync-external-store: 1.5.0(react@18.3.1)
'@humanfs/core@0.19.1': {} '@humanfs/core@0.19.1': {}
@@ -3424,22 +3419,22 @@ snapshots:
'@protobufjs/utf8@1.1.0': {} '@protobufjs/utf8@1.1.0': {}
'@react-aria/focus@3.21.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': '@react-aria/focus@3.21.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies: dependencies:
'@react-aria/interactions': 3.25.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-aria/interactions': 3.25.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@react-aria/utils': 3.31.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-aria/utils': 3.30.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@react-types/shared': 3.32.1(react@18.3.1) '@react-types/shared': 3.32.0(react@18.3.1)
'@swc/helpers': 0.5.17 '@swc/helpers': 0.5.17
clsx: 2.1.1 clsx: 2.1.1
react: 18.3.1 react: 18.3.1
react-dom: 18.3.1(react@18.3.1) react-dom: 18.3.1(react@18.3.1)
'@react-aria/interactions@3.25.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': '@react-aria/interactions@3.25.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies: dependencies:
'@react-aria/ssr': 3.9.10(react@18.3.1) '@react-aria/ssr': 3.9.10(react@18.3.1)
'@react-aria/utils': 3.31.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-aria/utils': 3.30.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@react-stately/flags': 3.1.2 '@react-stately/flags': 3.1.2
'@react-types/shared': 3.32.1(react@18.3.1) '@react-types/shared': 3.32.0(react@18.3.1)
'@swc/helpers': 0.5.17 '@swc/helpers': 0.5.17
react: 18.3.1 react: 18.3.1
react-dom: 18.3.1(react@18.3.1) react-dom: 18.3.1(react@18.3.1)
@@ -3449,12 +3444,12 @@ snapshots:
'@swc/helpers': 0.5.17 '@swc/helpers': 0.5.17
react: 18.3.1 react: 18.3.1
'@react-aria/utils@3.31.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': '@react-aria/utils@3.30.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies: dependencies:
'@react-aria/ssr': 3.9.10(react@18.3.1) '@react-aria/ssr': 3.9.10(react@18.3.1)
'@react-stately/flags': 3.1.2 '@react-stately/flags': 3.1.2
'@react-stately/utils': 3.10.8(react@18.3.1) '@react-stately/utils': 3.10.8(react@18.3.1)
'@react-types/shared': 3.32.1(react@18.3.1) '@react-types/shared': 3.32.0(react@18.3.1)
'@swc/helpers': 0.5.17 '@swc/helpers': 0.5.17
clsx: 2.1.1 clsx: 2.1.1
react: 18.3.1 react: 18.3.1
@@ -3469,7 +3464,7 @@ snapshots:
'@swc/helpers': 0.5.17 '@swc/helpers': 0.5.17
react: 18.3.1 react: 18.3.1
'@react-types/shared@3.32.1(react@18.3.1)': '@react-types/shared@3.32.0(react@18.3.1)':
dependencies: dependencies:
react: 18.3.1 react: 18.3.1
@@ -4420,7 +4415,7 @@ snapshots:
- eslint-plugin-import-x - eslint-plugin-import-x
- supports-color - supports-color
eslint-config-prettier@10.1.8(eslint@9.25.1(jiti@2.6.1)): eslint-config-prettier@10.1.1(eslint@9.25.1(jiti@2.6.1)):
dependencies: dependencies:
eslint: 9.25.1(jiti@2.6.1) eslint: 9.25.1(jiti@2.6.1)
@@ -4506,14 +4501,14 @@ 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.5.4(eslint-config-prettier@10.1.8(eslint@9.25.1(jiti@2.6.1)))(eslint@9.25.1(jiti@2.6.1))(prettier@3.6.2): eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.1(eslint@9.25.1(jiti@2.6.1)))(eslint@9.25.1(jiti@2.6.1))(prettier@3.6.2):
dependencies: dependencies:
eslint: 9.25.1(jiti@2.6.1) eslint: 9.25.1(jiti@2.6.1)
prettier: 3.6.2 prettier: 3.6.2
prettier-linter-helpers: 1.0.0 prettier-linter-helpers: 1.0.0
synckit: 0.11.11 synckit: 0.11.11
optionalDependencies: optionalDependencies:
eslint-config-prettier: 10.1.8(eslint@9.25.1(jiti@2.6.1)) eslint-config-prettier: 10.1.1(eslint@9.25.1(jiti@2.6.1))
eslint-plugin-react-hooks@5.2.0(eslint@9.25.1(jiti@2.6.1)): eslint-plugin-react-hooks@5.2.0(eslint@9.25.1(jiti@2.6.1)):
dependencies: dependencies:
@@ -5416,14 +5411,14 @@ snapshots:
dependencies: dependencies:
fast-diff: 1.3.0 fast-diff: 1.3.0
prettier-plugin-organize-imports@4.3.0(prettier@3.6.2)(typescript@5.7.3): prettier-plugin-organize-imports@4.1.0(prettier@3.6.2)(typescript@5.7.3):
dependencies: dependencies:
prettier: 3.6.2 prettier: 3.6.2
typescript: 5.7.3 typescript: 5.7.3
prettier@3.6.2: {} prettier@3.6.2: {}
pretty-bytes@7.1.0: {} pretty-bytes@6.1.1: {}
prism-react-renderer@2.4.1(react@18.3.1): prism-react-renderer@2.4.1(react@18.3.1):
dependencies: dependencies:
@@ -5509,7 +5504,7 @@ snapshots:
dependencies: dependencies:
'@types/use-sync-external-store': 0.0.6 '@types/use-sync-external-store': 0.0.6
react: 18.3.1 react: 18.3.1
use-sync-external-store: 1.6.0(react@18.3.1) use-sync-external-store: 1.5.0(react@18.3.1)
optionalDependencies: optionalDependencies:
'@types/react': 19.0.10 '@types/react': 19.0.10
redux: 5.0.1 redux: 5.0.1
@@ -5907,7 +5902,7 @@ snapshots:
systeminformation@5.27.7: {} systeminformation@5.27.7: {}
tabbable@6.3.0: {} tabbable@6.2.0: {}
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:
@@ -6094,10 +6089,6 @@ snapshots:
dependencies: dependencies:
react: 18.3.1 react: 18.3.1
use-sync-external-store@1.6.0(react@18.3.1):
dependencies:
react: 18.3.1
util-deprecate@1.0.2: {} util-deprecate@1.0.2: {}
uuid@10.0.0: {} uuid@10.0.0: {}

View File

@@ -1093,7 +1093,7 @@
"DISABLE_DISK": "Skyf Gedeaktiveer", "DISABLE_DISK": "Skyf Gedeaktiveer",
"SWAP_DSBL": "Ruil Gedeaktiveer", "SWAP_DSBL": "Ruil Gedeaktiveer",
"INVALID_EXPANSION": "Ongeldige Uitbreiding", "INVALID_EXPANSION": "Ongeldige Uitbreiding",
"PARITY_NOT_BIGGEST": "Pariteit nie die Grootste nie", "PARITY_NOT_BIGGEST": "Pariteit nie die grootste nie",
"TOO_MANY_MISSING_DISKS": "Te Veel Ontbrekende Skywe", "TOO_MANY_MISSING_DISKS": "Te Veel Ontbrekende Skywe",
"NEW_DISK_TOO_SMALL": "Nuwe Skyf te Klein", "NEW_DISK_TOO_SMALL": "Nuwe Skyf te Klein",
"NO_DATA_DISKS": "Geen Data Skywe", "NO_DATA_DISKS": "Geen Data Skywe",

View File

@@ -93,8 +93,8 @@
"http_status": "HTTP-Status", "http_status": "HTTP-Status",
"error": "Fehler", "error": "Fehler",
"response": "Antwort", "response": "Antwort",
"down": "Offline", "down": "Online",
"up": "Online", "up": "Offline",
"not_available": "Nicht verfügbar" "not_available": "Nicht verfügbar"
}, },
"emby": { "emby": {

View File

@@ -276,7 +276,7 @@
"pending": "Pendiente", "pending": "Pendiente",
"approved": "Aprobado", "approved": "Aprobado",
"available": "Disponible", "available": "Disponible",
"issues": "Issues Abiertos" "issues": "Open Issues"
}, },
"overseerr": { "overseerr": {
"pending": "Pendiente", "pending": "Pendiente",
@@ -1108,16 +1108,16 @@
"poolFree": "{{pool}} Libre" "poolFree": "{{pool}} Libre"
}, },
"backrest": { "backrest": {
"num_plans": "Planes", "num_plans": "Plans",
"num_success_30": "Éxitos", "num_success_30": "Successes",
"num_failure_30": "Fallos", "num_failure_30": "Failures",
"num_success_latest": "Exitosa", "num_success_latest": "Succeeding",
"num_failure_latest": "Fallida", "num_failure_latest": "Failing",
"bytes_added_30": "Bytes Añadidos" "bytes_added_30": "Bytes Added"
}, },
"yourspotify": { "yourspotify": {
"songs": "Canciones", "songs": "Songs",
"time": "Tiempo", "time": "Time",
"artists": "Artistas" "artists": "Artists"
} }
} }

View File

@@ -276,7 +276,7 @@
"pending": "En attente", "pending": "En attente",
"approved": "Approuvé", "approved": "Approuvé",
"available": "Disponible", "available": "Disponible",
"issues": "Problèmes non résolus" "issues": "Open Issues"
}, },
"overseerr": { "overseerr": {
"pending": "En attente", "pending": "En attente",
@@ -1086,34 +1086,34 @@
"nextRenewingSubscription": "Prochain paiement" "nextRenewingSubscription": "Prochain paiement"
}, },
"unraid": { "unraid": {
"STARTED": "Commencé", "STARTED": "Started",
"STOPPED": "Arrêté", "STOPPED": "Stopped",
"NEW_ARRAY": "Nouveau tableau", "NEW_ARRAY": "New Array",
"RECON_DISK": "Reconstruction du disque", "RECON_DISK": "Reconstructing Disk",
"DISABLE_DISK": "Disque désactivé", "DISABLE_DISK": "Disk Disabled",
"SWAP_DSBL": "Swap Disable", "SWAP_DSBL": "Swap Disable",
"INVALID_EXPANSION": "Extension invalide", "INVALID_EXPANSION": "Invalid Expansion",
"PARITY_NOT_BIGGEST": "La parité n'est pas la plus grande", "PARITY_NOT_BIGGEST": "Parity Not Biggest",
"TOO_MANY_MISSING_DISKS": "Trop de disques manquants", "TOO_MANY_MISSING_DISKS": "Too Many Missing Disks",
"NEW_DISK_TOO_SMALL": "Nouveau disque trop petit", "NEW_DISK_TOO_SMALL": "New Disk Too Small",
"NO_DATA_DISKS": "Aucun disque de données", "NO_DATA_DISKS": "No Data Disks",
"notifications": "Notifications", "notifications": "Notifications",
"status": "État", "status": "État",
"cpu": "UCT", "cpu": "UCT",
"memoryUsed": "Mémoire Utilisé", "memoryUsed": "Mémoire Utilisé",
"memoryAvailable": "Mémoire Disponible", "memoryAvailable": "Mémoire Disponible",
"arrayUsed": "RAID utilisé", "arrayUsed": "Array Used",
"arrayFree": "RAID libre", "arrayFree": "Array Free",
"poolUsed": "{{pool}} Utilisé", "poolUsed": "{{pool}} Used",
"poolFree": "{{pool}} Libre" "poolFree": "{{pool}} Free"
}, },
"backrest": { "backrest": {
"num_plans": "Abonnements", "num_plans": "Plans",
"num_success_30": "Succès", "num_success_30": "Successes",
"num_failure_30": "Échecs", "num_failure_30": "Failures",
"num_success_latest": "Réussi", "num_success_latest": "Succeeding",
"num_failure_latest": "Échoué", "num_failure_latest": "Failing",
"bytes_added_30": "Octets ajoutés" "bytes_added_30": "Bytes Added"
}, },
"yourspotify": { "yourspotify": {
"songs": "Musiques", "songs": "Musiques",

View File

@@ -55,7 +55,8 @@ export default function Version({ disableUpdateCheck = false }) {
</span> </span>
{!validate(version) {!validate(version)
? null ? null
: latestRelease && : releaseData &&
latestRelease &&
compareVersions(latestRelease.tag_name, version) > 0 && ( compareVersions(latestRelease.tag_name, version) > 0 && (
<a <a
href={latestRelease.html_url} href={latestRelease.html_url}

View File

@@ -113,7 +113,7 @@ export default function Widget({ options }) {
<Resource <Resource
icon={FaMemory} icon={FaMemory}
value={t("common.bytes", { value={t("common.bytes", {
value: data.mem.available, value: data.mem.free,
maximumFractionDigits: 1, maximumFractionDigits: 1,
binary: true, binary: true,
})} })}

View File

@@ -425,7 +425,7 @@ function Home({ initialSettings }) {
<div <div
className={classNames( className={classNames(
settings.fullWidth ? "" : "container", settings.fullWidth ? "" : "container",
"relative m-auto flex flex-col justify-start z-10 h-full min-h-screen", "relative m-auto flex flex-col justify-start z-10 h-full",
)} )}
> >
<QuickLaunch <QuickLaunch

View File

@@ -205,14 +205,13 @@ export default function Component({ service }) {
const { t } = useTranslation(); const { t } = useTranslation();
const { widget } = service; const { widget } = service;
const enableNowPlaying = service.widget?.enableNowPlaying ?? true;
const { const {
data: sessionsData, data: sessionsData,
error: sessionsError, error: sessionsError,
mutate: sessionMutate, mutate: sessionMutate,
} = useWidgetAPI(widget, enableNowPlaying ? "Sessions" : "", { } = useWidgetAPI(widget, "Sessions", {
refreshInterval: enableNowPlaying ? 5000 : undefined, refreshInterval: 5000,
}); });
const { data: countData, error: countError } = useWidgetAPI(widget, "Count", { const { data: countData, error: countError } = useWidgetAPI(widget, "Count", {
@@ -240,12 +239,13 @@ export default function Component({ service }) {
} }
const enableBlocks = service.widget?.enableBlocks; const enableBlocks = service.widget?.enableBlocks;
const enableNowPlaying = service.widget?.enableNowPlaying ?? true;
const enableMediaControl = service.widget?.enableMediaControl !== false; // default is true const enableMediaControl = service.widget?.enableMediaControl !== false; // default is true
const enableUser = !!service.widget?.enableUser; // default is false const enableUser = !!service.widget?.enableUser; // default is false
const expandOneStreamToTwoRows = service.widget?.expandOneStreamToTwoRows !== false; // default is true const expandOneStreamToTwoRows = service.widget?.expandOneStreamToTwoRows !== false; // default is true
const showEpisodeNumber = !!service.widget?.showEpisodeNumber; // default is false const showEpisodeNumber = !!service.widget?.showEpisodeNumber; // default is false
if ((enableNowPlaying && !sessionsData) || !countData) { if (!sessionsData || !countData) {
return ( return (
<> <>
{enableBlocks && <CountBlocks service={service} countData={null} />} {enableBlocks && <CountBlocks service={service} countData={null} />}

View File

@@ -27,7 +27,7 @@ export default function Component({ service }) {
useEffect(() => { useEffect(() => {
if (data) { if (data) {
setDataPoints((prevDataPoints) => { setDataPoints((prevDataPoints) => {
const newDataPoints = [...prevDataPoints, { a: data.used, b: data.available }]; const newDataPoints = [...prevDataPoints, { a: data.used, b: data.free }];
if (newDataPoints.length > pointsLimit) { if (newDataPoints.length > pointsLimit) {
newDataPoints.shift(); newDataPoints.shift();
} }
@@ -67,10 +67,10 @@ export default function Component({ service }) {
{data && !error && ( {data && !error && (
<Block position="bottom-3 left-3"> <Block position="bottom-3 left-3">
{data.available && chart && ( {data.free && chart && (
<div className="text-xs opacity-50"> <div className="text-xs opacity-50">
{t("common.bytes", { {t("common.bytes", {
value: data.available, value: data.free,
maximumFractionDigits: 1, maximumFractionDigits: 1,
binary: true, binary: true,
})}{" "} })}{" "}
@@ -93,10 +93,10 @@ export default function Component({ service }) {
{!chart && ( {!chart && (
<Block position="top-3 right-3"> <Block position="top-3 right-3">
{data.available && ( {data.free && (
<div className="text-xs opacity-50"> <div className="text-xs opacity-50">
{t("common.bytes", { {t("common.bytes", {
value: data.available, value: data.free,
maximumFractionDigits: 1, maximumFractionDigits: 1,
binary: true, binary: true,
})}{" "} })}{" "}

View File

@@ -33,6 +33,14 @@ export default function Component({ service }) {
return ( return (
<Container service={service}> <Container service={service}>
<Block
label="myspeed.ping"
value={t("common.ms", {
value: data[0].ping,
style: "unit",
unit: "millisecond",
})}
/>
<Block <Block
label="myspeed.download" label="myspeed.download"
value={t("common.bitrate", { value={t("common.bitrate", {
@@ -47,14 +55,6 @@ export default function Component({ service }) {
decimals: 2, decimals: 2,
})} })}
/> />
<Block
label="myspeed.ping"
value={t("common.ms", {
value: data[0].ping,
style: "unit",
unit: "millisecond",
})}
/>
</Container> </Container>
); );
} }

View File

@@ -66,7 +66,7 @@ export default async function omadaProxyHandler(req, res) {
const controllerVersionMajor = parseInt(controllerVersion.split(".")[0], 10); const controllerVersionMajor = parseInt(controllerVersion.split(".")[0], 10);
if (![3, 4, 5, 6].includes(controllerVersionMajor)) { if (![3, 4, 5].includes(controllerVersionMajor)) {
return res.status(500).json({ error: { message: "Error determining controller version", data } }); return res.status(500).json({ error: { message: "Error determining controller version", data } });
} }
@@ -80,7 +80,6 @@ export default async function omadaProxyHandler(req, res) {
loginUrl = `${url}/api/v2/login`; loginUrl = `${url}/api/v2/login`;
break; break;
case 5: case 5:
case 6:
loginUrl = `${url}/${cId}/api/v2/login`; loginUrl = `${url}/${cId}/api/v2/login`;
break; break;
default: default:
@@ -123,7 +122,6 @@ export default async function omadaProxyHandler(req, res) {
sitesUrl = `${url}/api/v2/sites?token=${token}&currentPage=1&currentPageSize=1000`; sitesUrl = `${url}/api/v2/sites?token=${token}&currentPage=1&currentPageSize=1000`;
break; break;
case 5: case 5:
case 6:
sitesUrl = `${url}/${cId}/api/v2/sites?token=${token}&currentPage=1&currentPageSize=1000`; sitesUrl = `${url}/${cId}/api/v2/sites?token=${token}&currentPage=1&currentPageSize=1000`;
break; break;
default: default:
@@ -209,8 +207,8 @@ export default async function omadaProxyHandler(req, res) {
connectedAp = siteResponseData.result.connectedAp; connectedAp = siteResponseData.result.connectedAp;
activeUser = siteResponseData.result.activeUser; activeUser = siteResponseData.result.activeUser;
alerts = siteResponseData.result.alerts; alerts = siteResponseData.result.alerts;
} else if ([4, 5, 6].includes(controllerVersionMajor)) { } else if (controllerVersionMajor === 4 || controllerVersionMajor === 5) {
const siteName = controllerVersionMajor > 4 ? site.id : site.key; const siteName = controllerVersionMajor === 5 ? site.id : site.key;
const siteStatsUrl = const siteStatsUrl =
controllerVersionMajor === 4 controllerVersionMajor === 4
? `${url}/api/v2/sites/${siteName}/dashboard/overviewDiagram?token=${token}&currentPage=1&currentPageSize=1000` ? `${url}/api/v2/sites/${siteName}/dashboard/overviewDiagram?token=${token}&currentPage=1&currentPageSize=1000`