Compare commits

...

14 Commits

Author SHA1 Message Date
shamoon
438543d8cd Bump version to 1.6.0 2025-11-04 08:07:34 -08:00
shamoon
5a350cc9ce Merge branch 'dev' 2025-11-04 08:07:14 -08:00
shamoon
9b5275a854 Enhancement: support omada controller v6 (#5926) 2025-11-04 06:17:00 -08:00
dependabot[bot]
e623196ac0 Chore(deps): Bump pretty-bytes from 6.1.1 to 7.1.0 (#5917)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-04 00:31:10 +00:00
dependabot[bot]
973b1f7aaf Chore(deps): Bump @headlessui/react from 2.2.7 to 2.2.9 (#5919)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-04 00:18:52 +00:00
dependabot[bot]
81a322cc99 Chore(deps-dev): Bump eslint-config-prettier from 10.1.1 to 10.1.8 (#5918)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-04 00:02:46 +00:00
dependabot[bot]
36e82a8b90 Chore(deps-dev): Bump prettier-plugin-organize-imports from 4.1.0 to 4.3.0 (#5915)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-03 23:53:02 +00:00
shamoon
1383e22acd Change: use glances memory available instead of free (#5923) 2025-11-03 15:32:36 -08:00
Charles Ng
a756a01d63 Documentation: correct Unraid widget allowed fields (#5908) 2025-10-29 18:52:15 -07:00
oharvey2090
937efc9f1b Performance: emby widget prevent sessions query if now playing disabled (#5907) 2025-10-29 18:50:08 -07:00
shamoon
fe6f32f072 Update getting-started.md 2025-10-29 14:29:17 -07:00
shamoon
226603770c Rename docker stats to container 2025-10-23 14:33:20 -07:00
Darkangeel_hd
2f48d21bfd Change: adjust MySpeed blocks order (#5881) 2025-10-16 18:42:33 -07:00
shamoon
f7a6b7dbf4 Documentation: clarify Unraid widget API key requirement, for now 2025-09-23 08:48:53 -07:00
11 changed files with 94 additions and 82 deletions

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-docker-stats). Also see the settings for [show docker stats](settings.md#show-container-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 Docker Stats ## Show Container Stats
You can show all docker stats expanded in `settings.yaml`: You can show all docker or proxmox stats expanded in `settings.yaml`:
```yaml ```yaml
showStats: true showStats: true

View File

@@ -62,3 +62,4 @@ 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 **GUEST** (read only) role: [Managing API Keys](https://docs.unraid.net/go/managing-api-keys) - API key with the **ADMIN** 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","arrayFreeSpace","arrayUsedSpace","arrayUsedPercent","status","pool1UsedSpace","pool1FreeSpace","pool1UsedPercent","pool2UsedSpace","pool2FreeSpace","pool2UsedPercent","pool3UsedSpace","pool3FreeSpace","pool3UsedPercent","pool4UsedSpace","pool4FreeSpace","pool4UsedPercent"]` **Allowed fields:** `["cpu","memoryPercent","memoryAvailable","memoryUsed","notifications","arrayFree","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.5.0", "version": "1.6.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.7", "@headlessui/react": "^2.2.9",
"@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": "^6.1.1", "pretty-bytes": "^7.1.0",
"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.1", "eslint-config-prettier": "^10.1.8",
"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.1.0", "prettier-plugin-organize-imports": "^4.3.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.7 specifier: ^2.2.9
version: 2.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) version: 2.2.9(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: ^6.1.1 specifier: ^7.1.0
version: 6.1.1 version: 7.1.0
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.1 specifier: ^10.1.8
version: 10.1.1(eslint@9.25.1(jiti@2.6.1)) version: 10.1.8(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.1(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.8(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.1.0 specifier: ^4.3.0
version: 4.1.0(prettier@3.6.2)(typescript@5.7.3) version: 4.3.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.7': '@headlessui/react@2.2.9':
resolution: {integrity: sha512-WKdTymY8Y49H8/gUc/lIyYK1M+/6dq0Iywh4zTZVAaiTDprRfioxSgD0wnXTQTBpjpGJuTL1NO/mqEvc//5SSg==} resolution: {integrity: sha512-Mb+Un58gwBn0/yWZfyrCh0TJyurtT+dETj7YHleylHk5od3dv2XqETPGWMyQ5/7sYN7oWdyM1u9MvC0OC8UmzQ==}
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.1': '@react-aria/focus@3.21.2':
resolution: {integrity: sha512-hmH1IhHlcQ2lSIxmki1biWzMbGgnhdxJUM0MFfzc71Rv6YAzhlx4kX3GYn4VNcjCeb6cdPv4RZ5vunV4kgMZYQ==} resolution: {integrity: sha512-JWaCR7wJVggj+ldmM/cb/DXFg47CXR55lznJhZBh4XVqJjMKwaOOqpT5vNN7kpC1wUpXicGNuDnJDN1S/+6dhQ==}
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.5': '@react-aria/interactions@3.25.6':
resolution: {integrity: sha512-EweYHOEvMwef/wsiEqV73KurX/OqnmbzKQa2fLxdULbec5+yDj6wVGaRHIzM4NiijIDe+bldEl5DG05CAKOAHA==} resolution: {integrity: sha512-5UgwZmohpixwNMVkMvn9K1ceJe6TzlRlAfuYoQDUuOkk62/JVJNDLAPKIf5YMRc7d2B0rmfgaZLMtbREb0Zvkw==}
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.30.1': '@react-aria/utils@3.31.0':
resolution: {integrity: sha512-zETcbDd6Vf9GbLndO6RiWJadIZsBU2MMm23rBACXLmpRztkrIqPEb2RVdlLaq1+GklDx0Ii6PfveVjx+8S5U6A==} resolution: {integrity: sha512-ABOzCsZrWzf78ysswmguJbx3McQUja7yeGj6/vZo4JVsZNlxAN+E9rs381ExBRI0KzVo6iBTeX5De8eMZPJXig==}
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.0': '@react-types/shared@3.32.1':
resolution: {integrity: sha512-t+cligIJsZYFMSPFMvsJMjzlzde06tZMOIOFa1OV5Z0BcMowrb2g4mB57j/9nP28iJIRYn10xCniQts+qadrqQ==} resolution: {integrity: sha512-famxyD5emrGGpFuUlgOP6fVW2h/ZaF405G5KDi3zPHzyjAWys/8W6NAVJtNbkCkhedmvL0xOhvt8feGXyXaw5w==}
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.1: eslint-config-prettier@10.1.8:
resolution: {integrity: sha512-4EQQr6wXwS+ZJSzaR5ZCrYgLxqvUjdXctaEtBqHcbkW944B1NQyO4qpdHQbXBONfwxXdkAY81HH4+LUfrg+zPw==} resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==}
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.1.0: prettier-plugin-organize-imports@4.3.0:
resolution: {integrity: sha512-5aWRdCgv645xaa58X8lOxzZoiHAldAPChljr/MT0crXVOWTZ+Svl4hIWlz+niYSlO6ikE5UXkN1JrRvIP2ut0A==} resolution: {integrity: sha512-FxFz0qFhyBsGdIsb697f/EkvHzi5SZOhWAjxcx2dLt+Q532bAlhswcXGYB1yzjZ69kW8UoadFBw7TyNwlq96Iw==}
peerDependencies: peerDependencies:
prettier: '>=2.0' prettier: '>=2.0'
typescript: '>=2.9' typescript: '>=2.9'
vue-tsc: ^2.1.0 vue-tsc: ^2.1.0 || 3
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@6.1.1: pretty-bytes@7.1.0:
resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} resolution: {integrity: sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw==}
engines: {node: ^14.13.1 || >=16.0.0} engines: {node: '>=20'}
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.2.0: tabbable@6.3.0:
resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==}
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,6 +2930,11 @@ 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==}
@@ -3148,7 +3153,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.2.0 tabbable: 6.3.0
'@floating-ui/utils@0.2.10': {} '@floating-ui/utils@0.2.10': {}
@@ -3164,15 +3169,15 @@ snapshots:
protobufjs: 7.5.3 protobufjs: 7.5.3
yargs: 17.7.2 yargs: 17.7.2
'@headlessui/react@2.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': '@headlessui/react@2.2.9(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.1(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/interactions': 3.25.5(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)
'@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.5.0(react@18.3.1) use-sync-external-store: 1.6.0(react@18.3.1)
'@humanfs/core@0.19.1': {} '@humanfs/core@0.19.1': {}
@@ -3419,22 +3424,22 @@ snapshots:
'@protobufjs/utf8@1.1.0': {} '@protobufjs/utf8@1.1.0': {}
'@react-aria/focus@3.21.1(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)':
dependencies: dependencies:
'@react-aria/interactions': 3.25.5(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/utils': 3.30.1(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-types/shared': 3.32.0(react@18.3.1) '@react-types/shared': 3.32.1(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.5(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)':
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.30.1(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-stately/flags': 3.1.2 '@react-stately/flags': 3.1.2
'@react-types/shared': 3.32.0(react@18.3.1) '@react-types/shared': 3.32.1(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)
@@ -3444,12 +3449,12 @@ snapshots:
'@swc/helpers': 0.5.17 '@swc/helpers': 0.5.17
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-aria/utils@3.31.0(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.0(react@18.3.1) '@react-types/shared': 3.32.1(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
@@ -3464,7 +3469,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.0(react@18.3.1)': '@react-types/shared@3.32.1(react@18.3.1)':
dependencies: dependencies:
react: 18.3.1 react: 18.3.1
@@ -4415,7 +4420,7 @@ snapshots:
- eslint-plugin-import-x - eslint-plugin-import-x
- supports-color - supports-color
eslint-config-prettier@10.1.1(eslint@9.25.1(jiti@2.6.1)): eslint-config-prettier@10.1.8(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)
@@ -4501,14 +4506,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.1(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.8(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.1(eslint@9.25.1(jiti@2.6.1)) eslint-config-prettier: 10.1.8(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:
@@ -5411,14 +5416,14 @@ snapshots:
dependencies: dependencies:
fast-diff: 1.3.0 fast-diff: 1.3.0
prettier-plugin-organize-imports@4.1.0(prettier@3.6.2)(typescript@5.7.3): prettier-plugin-organize-imports@4.3.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@6.1.1: {} pretty-bytes@7.1.0: {}
prism-react-renderer@2.4.1(react@18.3.1): prism-react-renderer@2.4.1(react@18.3.1):
dependencies: dependencies:
@@ -5504,7 +5509,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.5.0(react@18.3.1) use-sync-external-store: 1.6.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
@@ -5902,7 +5907,7 @@ snapshots:
systeminformation@5.27.7: {} systeminformation@5.27.7: {}
tabbable@6.2.0: {} tabbable@6.3.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:
@@ -6089,6 +6094,10 @@ 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

@@ -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.free, value: data.mem.available,
maximumFractionDigits: 1, maximumFractionDigits: 1,
binary: true, binary: true,
})} })}

View File

@@ -205,13 +205,14 @@ 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, "Sessions", { } = useWidgetAPI(widget, enableNowPlaying ? "Sessions" : "", {
refreshInterval: 5000, refreshInterval: enableNowPlaying ? 5000 : undefined,
}); });
const { data: countData, error: countError } = useWidgetAPI(widget, "Count", { const { data: countData, error: countError } = useWidgetAPI(widget, "Count", {
@@ -239,13 +240,12 @@ 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 (!sessionsData || !countData) { if ((enableNowPlaying && !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.free }]; const newDataPoints = [...prevDataPoints, { a: data.used, b: data.available }];
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.free && chart && ( {data.available && chart && (
<div className="text-xs opacity-50"> <div className="text-xs opacity-50">
{t("common.bytes", { {t("common.bytes", {
value: data.free, value: data.available,
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.free && ( {data.available && (
<div className="text-xs opacity-50"> <div className="text-xs opacity-50">
{t("common.bytes", { {t("common.bytes", {
value: data.free, value: data.available,
maximumFractionDigits: 1, maximumFractionDigits: 1,
binary: true, binary: true,
})}{" "} })}{" "}

View File

@@ -33,14 +33,6 @@ 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", {
@@ -55,6 +47,14 @@ 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].includes(controllerVersionMajor)) { if (![3, 4, 5, 6].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,6 +80,7 @@ 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:
@@ -122,6 +123,7 @@ 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:
@@ -207,8 +209,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 (controllerVersionMajor === 4 || controllerVersionMajor === 5) { } else if ([4, 5, 6].includes(controllerVersionMajor)) {
const siteName = controllerVersionMajor === 5 ? site.id : site.key; const siteName = controllerVersionMajor > 4 ? 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`