mirror of
https://github.com/gethomepage/homepage.git
synced 2025-12-06 21:57:48 +01:00
Compare commits
30 Commits
934e43de0d
...
v1.7.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b6b428363c | ||
|
|
e707fa46cf | ||
|
|
3d040362cb | ||
|
|
57b193b037 | ||
|
|
8a75c9b6e3 | ||
|
|
0dafc792f7 | ||
|
|
afc0fe29ee | ||
|
|
817a9bbce5 | ||
|
|
3ef7031eb0 | ||
|
|
6faf32eae9 | ||
|
|
455e86571a | ||
|
|
7d1e0c087a | ||
|
|
d48ef4c038 | ||
|
|
4a2eeaa8b9 | ||
|
|
faa2e6bb36 | ||
|
|
438543d8cd | ||
|
|
5a350cc9ce | ||
|
|
529814cf03 | ||
|
|
9b5275a854 | ||
|
|
e623196ac0 | ||
|
|
973b1f7aaf | ||
|
|
81a322cc99 | ||
|
|
36e82a8b90 | ||
|
|
1383e22acd | ||
|
|
a756a01d63 | ||
|
|
937efc9f1b | ||
|
|
fe6f32f072 | ||
|
|
226603770c | ||
|
|
2f48d21bfd | ||
|
|
f7a6b7dbf4 |
4
.github/workflows/docker-publish.yml
vendored
4
.github/workflows/docker-publish.yml
vendored
@@ -35,6 +35,7 @@ jobs:
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
version: 10
|
||||
run_install: false
|
||||
|
||||
- name: Setup Node.js
|
||||
@@ -93,6 +94,7 @@ jobs:
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
version: 10
|
||||
run_install: false
|
||||
|
||||
- name: Setup Node.js
|
||||
@@ -127,7 +129,7 @@ jobs:
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
|
||||
- name: Setup QEMU
|
||||
uses: docker/setup-qemu-action@v3.6.0
|
||||
uses: docker/setup-qemu-action@v3.7.0
|
||||
|
||||
- name: Setup Docker buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
@@ -51,6 +51,8 @@ COPY --link --from=builder --chown=1000:1000 /app/.next/static/ ./.next/static
|
||||
|
||||
RUN apk add --no-cache su-exec iputils-ping shadow
|
||||
|
||||
USER root
|
||||
|
||||
ENV NODE_ENV=production
|
||||
ENV HOSTNAME=0.0.0.0
|
||||
ENV PORT=3000
|
||||
|
||||
@@ -57,8 +57,8 @@ if [ -d /app/.next ]; then
|
||||
fi
|
||||
|
||||
# Drop privileges (when asked to) if root, otherwise run as current user
|
||||
if [ "$(id -u)" == "0" ] && [ "${PUID}" != "0" ]; then
|
||||
su-exec ${PUID}:${PGID} "$@"
|
||||
if [ "$(id -u)" = "0" ] && [ "${PUID}" != "0" ]; then
|
||||
exec su-exec ${PUID}:${PGID} "$@"
|
||||
else
|
||||
exec "$@"
|
||||
fi
|
||||
|
||||
@@ -271,4 +271,4 @@ You can show the docker stats by clicking the status indicator but this can also
|
||||
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).
|
||||
|
||||
@@ -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`.
|
||||
|
||||
## 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
|
||||
showStats: true
|
||||
|
||||
@@ -62,3 +62,4 @@ To ensure cohesiveness of various widgets, the following should be used as a gui
|
||||
- Minimize the number of API calls
|
||||
- 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 not allow manually overriding the "refresh interval" setting, as misconfigured refresh intervals can easily lead to performance issues for users.
|
||||
|
||||
@@ -17,6 +17,6 @@ widget:
|
||||
url: http://komodo.hostname.or.ip:port
|
||||
key: K-xxxxxx...
|
||||
secret: S-xxxxxx...
|
||||
showSummary: true # optional, default: false
|
||||
showSummary: true # optional, default: false. Takes precedence over showStacks
|
||||
showStacks: true # optional, default: false
|
||||
```
|
||||
|
||||
@@ -3,7 +3,7 @@ title: Omada
|
||||
description: Omada Widget Configuration
|
||||
---
|
||||
|
||||
The widget supports controller versions 3, 4 and 5.
|
||||
The widget supports controller versions 3, 4, 5 and 6.
|
||||
|
||||
Allowed fields: `["connectedAp", "activeUser", "alerts", "connectedGateways", "connectedSwitches"]`.
|
||||
|
||||
|
||||
@@ -10,11 +10,11 @@ The Unraid widget allows you to monitor the resources of an Unraid server.
|
||||
**Minimum Requirements:**
|
||||
|
||||
- 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.
|
||||
|
||||
**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
|
||||
widget:
|
||||
|
||||
17
package.json
17
package.json
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "homepage",
|
||||
"version": "1.5.0",
|
||||
"version": "1.7.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"preinstall": "npx only-allow pnpm",
|
||||
@@ -11,7 +11,7 @@
|
||||
"telemetry": "next telemetry disable"
|
||||
},
|
||||
"dependencies": {
|
||||
"@headlessui/react": "^2.2.7",
|
||||
"@headlessui/react": "^2.2.9",
|
||||
"@kubernetes/client-node": "^1.0.0",
|
||||
"classnames": "^2.5.1",
|
||||
"compare-versions": "^6.1.1",
|
||||
@@ -28,7 +28,7 @@
|
||||
"next": "^15.5.2",
|
||||
"next-i18next": "^12.1.0",
|
||||
"ping": "^0.4.4",
|
||||
"pretty-bytes": "^6.1.1",
|
||||
"pretty-bytes": "^7.1.0",
|
||||
"raw-body": "^3.0.1",
|
||||
"react": "^18.3.1",
|
||||
"react-dom": "^18.3.1",
|
||||
@@ -47,7 +47,7 @@
|
||||
"@tailwindcss/postcss": "^4.1.14",
|
||||
"eslint": "^9.25.1",
|
||||
"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-jsx-a11y": "^6.10.2",
|
||||
"eslint-plugin-prettier": "^5.5.4",
|
||||
@@ -55,7 +55,7 @@
|
||||
"eslint-plugin-react-hooks": "^5.2.0",
|
||||
"postcss": "^8.5.6",
|
||||
"prettier": "^3.6.2",
|
||||
"prettier-plugin-organize-imports": "^4.1.0",
|
||||
"prettier-plugin-organize-imports": "^4.3.0",
|
||||
"tailwind-scrollbar": "^4.0.2",
|
||||
"tailwindcss": "^4.0.9",
|
||||
"typescript": "^5.7.3"
|
||||
@@ -63,13 +63,6 @@
|
||||
"optionalDependencies": {
|
||||
"osx-temperature-sensor": "^1.0.8"
|
||||
},
|
||||
"packageManager": "pnpm@10.8.1",
|
||||
"devEngines": {
|
||||
"packageManager": {
|
||||
"name": "pnpm",
|
||||
"version": "10.8.1"
|
||||
}
|
||||
},
|
||||
"pnpm": {
|
||||
"onlyBuiltDependencies": [
|
||||
"osx-temperature-sensor",
|
||||
|
||||
111
pnpm-lock.yaml
generated
111
pnpm-lock.yaml
generated
@@ -9,8 +9,8 @@ importers:
|
||||
.:
|
||||
dependencies:
|
||||
'@headlessui/react':
|
||||
specifier: ^2.2.7
|
||||
version: 2.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
specifier: ^2.2.9
|
||||
version: 2.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
'@kubernetes/client-node':
|
||||
specifier: ^1.0.0
|
||||
version: 1.0.0
|
||||
@@ -60,8 +60,8 @@ importers:
|
||||
specifier: ^0.4.4
|
||||
version: 0.4.4
|
||||
pretty-bytes:
|
||||
specifier: ^6.1.1
|
||||
version: 6.1.1
|
||||
specifier: ^7.1.0
|
||||
version: 7.1.0
|
||||
raw-body:
|
||||
specifier: ^3.0.1
|
||||
version: 3.0.1
|
||||
@@ -112,8 +112,8 @@ importers:
|
||||
specifier: ^15.2.4
|
||||
version: 15.2.4(eslint@9.25.1(jiti@2.6.1))(typescript@5.7.3)
|
||||
eslint-config-prettier:
|
||||
specifier: ^10.1.1
|
||||
version: 10.1.1(eslint@9.25.1(jiti@2.6.1))
|
||||
specifier: ^10.1.8
|
||||
version: 10.1.8(eslint@9.25.1(jiti@2.6.1))
|
||||
eslint-plugin-import:
|
||||
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))
|
||||
@@ -122,7 +122,7 @@ importers:
|
||||
version: 6.10.2(eslint@9.25.1(jiti@2.6.1))
|
||||
eslint-plugin-prettier:
|
||||
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:
|
||||
specifier: ^7.37.4
|
||||
version: 7.37.4(eslint@9.25.1(jiti@2.6.1))
|
||||
@@ -136,8 +136,8 @@ importers:
|
||||
specifier: ^3.6.2
|
||||
version: 3.6.2
|
||||
prettier-plugin-organize-imports:
|
||||
specifier: ^4.1.0
|
||||
version: 4.1.0(prettier@3.6.2)(typescript@5.7.3)
|
||||
specifier: ^4.3.0
|
||||
version: 4.3.0(prettier@3.6.2)(typescript@5.7.3)
|
||||
tailwind-scrollbar:
|
||||
specifier: ^4.0.2
|
||||
version: 4.0.2(react@18.3.1)(tailwindcss@4.0.9)
|
||||
@@ -257,8 +257,8 @@ packages:
|
||||
engines: {node: '>=6'}
|
||||
hasBin: true
|
||||
|
||||
'@headlessui/react@2.2.7':
|
||||
resolution: {integrity: sha512-WKdTymY8Y49H8/gUc/lIyYK1M+/6dq0Iywh4zTZVAaiTDprRfioxSgD0wnXTQTBpjpGJuTL1NO/mqEvc//5SSg==}
|
||||
'@headlessui/react@2.2.9':
|
||||
resolution: {integrity: sha512-Mb+Un58gwBn0/yWZfyrCh0TJyurtT+dETj7YHleylHk5od3dv2XqETPGWMyQ5/7sYN7oWdyM1u9MvC0OC8UmzQ==}
|
||||
engines: {node: '>=10'}
|
||||
peerDependencies:
|
||||
react: ^18 || ^19 || ^19.0.0-rc
|
||||
@@ -559,14 +559,14 @@ packages:
|
||||
'@protobufjs/utf8@1.1.0':
|
||||
resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==}
|
||||
|
||||
'@react-aria/focus@3.21.1':
|
||||
resolution: {integrity: sha512-hmH1IhHlcQ2lSIxmki1biWzMbGgnhdxJUM0MFfzc71Rv6YAzhlx4kX3GYn4VNcjCeb6cdPv4RZ5vunV4kgMZYQ==}
|
||||
'@react-aria/focus@3.21.2':
|
||||
resolution: {integrity: sha512-JWaCR7wJVggj+ldmM/cb/DXFg47CXR55lznJhZBh4XVqJjMKwaOOqpT5vNN7kpC1wUpXicGNuDnJDN1S/+6dhQ==}
|
||||
peerDependencies:
|
||||
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-aria/interactions@3.25.5':
|
||||
resolution: {integrity: sha512-EweYHOEvMwef/wsiEqV73KurX/OqnmbzKQa2fLxdULbec5+yDj6wVGaRHIzM4NiijIDe+bldEl5DG05CAKOAHA==}
|
||||
'@react-aria/interactions@3.25.6':
|
||||
resolution: {integrity: sha512-5UgwZmohpixwNMVkMvn9K1ceJe6TzlRlAfuYoQDUuOkk62/JVJNDLAPKIf5YMRc7d2B0rmfgaZLMtbREb0Zvkw==}
|
||||
peerDependencies:
|
||||
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
|
||||
@@ -577,8 +577,8 @@ packages:
|
||||
peerDependencies:
|
||||
react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
|
||||
|
||||
'@react-aria/utils@3.30.1':
|
||||
resolution: {integrity: sha512-zETcbDd6Vf9GbLndO6RiWJadIZsBU2MMm23rBACXLmpRztkrIqPEb2RVdlLaq1+GklDx0Ii6PfveVjx+8S5U6A==}
|
||||
'@react-aria/utils@3.31.0':
|
||||
resolution: {integrity: sha512-ABOzCsZrWzf78ysswmguJbx3McQUja7yeGj6/vZo4JVsZNlxAN+E9rs381ExBRI0KzVo6iBTeX5De8eMZPJXig==}
|
||||
peerDependencies:
|
||||
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
|
||||
@@ -591,8 +591,8 @@ packages:
|
||||
peerDependencies:
|
||||
react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
|
||||
|
||||
'@react-types/shared@3.32.0':
|
||||
resolution: {integrity: sha512-t+cligIJsZYFMSPFMvsJMjzlzde06tZMOIOFa1OV5Z0BcMowrb2g4mB57j/9nP28iJIRYn10xCniQts+qadrqQ==}
|
||||
'@react-types/shared@3.32.1':
|
||||
resolution: {integrity: sha512-famxyD5emrGGpFuUlgOP6fVW2h/ZaF405G5KDi3zPHzyjAWys/8W6NAVJtNbkCkhedmvL0xOhvt8feGXyXaw5w==}
|
||||
peerDependencies:
|
||||
react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
|
||||
|
||||
@@ -1411,8 +1411,8 @@ packages:
|
||||
typescript:
|
||||
optional: true
|
||||
|
||||
eslint-config-prettier@10.1.1:
|
||||
resolution: {integrity: sha512-4EQQr6wXwS+ZJSzaR5ZCrYgLxqvUjdXctaEtBqHcbkW944B1NQyO4qpdHQbXBONfwxXdkAY81HH4+LUfrg+zPw==}
|
||||
eslint-config-prettier@10.1.8:
|
||||
resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==}
|
||||
hasBin: true
|
||||
peerDependencies:
|
||||
eslint: '>=7.0.0'
|
||||
@@ -2361,12 +2361,12 @@ packages:
|
||||
resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
|
||||
engines: {node: '>=6.0.0'}
|
||||
|
||||
prettier-plugin-organize-imports@4.1.0:
|
||||
resolution: {integrity: sha512-5aWRdCgv645xaa58X8lOxzZoiHAldAPChljr/MT0crXVOWTZ+Svl4hIWlz+niYSlO6ikE5UXkN1JrRvIP2ut0A==}
|
||||
prettier-plugin-organize-imports@4.3.0:
|
||||
resolution: {integrity: sha512-FxFz0qFhyBsGdIsb697f/EkvHzi5SZOhWAjxcx2dLt+Q532bAlhswcXGYB1yzjZ69kW8UoadFBw7TyNwlq96Iw==}
|
||||
peerDependencies:
|
||||
prettier: '>=2.0'
|
||||
typescript: '>=2.9'
|
||||
vue-tsc: ^2.1.0
|
||||
vue-tsc: ^2.1.0 || 3
|
||||
peerDependenciesMeta:
|
||||
vue-tsc:
|
||||
optional: true
|
||||
@@ -2376,9 +2376,9 @@ packages:
|
||||
engines: {node: '>=14'}
|
||||
hasBin: true
|
||||
|
||||
pretty-bytes@6.1.1:
|
||||
resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==}
|
||||
engines: {node: ^14.13.1 || >=16.0.0}
|
||||
pretty-bytes@7.1.0:
|
||||
resolution: {integrity: sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw==}
|
||||
engines: {node: '>=20'}
|
||||
|
||||
prism-react-renderer@2.4.1:
|
||||
resolution: {integrity: sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==}
|
||||
@@ -2782,8 +2782,8 @@ packages:
|
||||
os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android]
|
||||
hasBin: true
|
||||
|
||||
tabbable@6.2.0:
|
||||
resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==}
|
||||
tabbable@6.3.0:
|
||||
resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==}
|
||||
|
||||
tailwind-scrollbar@4.0.2:
|
||||
resolution: {integrity: sha512-wAQiIxAPqk0MNTPptVe/xoyWi27y+NRGnTwvn4PQnbvB9kp8QUBiGl/wsfoVBHnQxTmhXJSNt9NHTmcz9EivFA==}
|
||||
@@ -2930,6 +2930,11 @@ packages:
|
||||
peerDependencies:
|
||||
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:
|
||||
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
|
||||
|
||||
@@ -3148,7 +3153,7 @@ snapshots:
|
||||
'@floating-ui/utils': 0.2.10
|
||||
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': {}
|
||||
|
||||
@@ -3164,15 +3169,15 @@ snapshots:
|
||||
protobufjs: 7.5.3
|
||||
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:
|
||||
'@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/interactions': 3.25.5(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.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)
|
||||
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': {}
|
||||
|
||||
@@ -3419,22 +3424,22 @@ snapshots:
|
||||
|
||||
'@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:
|
||||
'@react-aria/interactions': 3.25.5(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.0(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.31.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
'@react-types/shared': 3.32.1(react@18.3.1)
|
||||
'@swc/helpers': 0.5.17
|
||||
clsx: 2.1.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:
|
||||
'@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-types/shared': 3.32.0(react@18.3.1)
|
||||
'@react-types/shared': 3.32.1(react@18.3.1)
|
||||
'@swc/helpers': 0.5.17
|
||||
react: 18.3.1
|
||||
react-dom: 18.3.1(react@18.3.1)
|
||||
@@ -3444,12 +3449,12 @@ snapshots:
|
||||
'@swc/helpers': 0.5.17
|
||||
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:
|
||||
'@react-aria/ssr': 3.9.10(react@18.3.1)
|
||||
'@react-stately/flags': 3.1.2
|
||||
'@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
|
||||
clsx: 2.1.1
|
||||
react: 18.3.1
|
||||
@@ -3464,7 +3469,7 @@ snapshots:
|
||||
'@swc/helpers': 0.5.17
|
||||
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:
|
||||
react: 18.3.1
|
||||
|
||||
@@ -4415,7 +4420,7 @@ snapshots:
|
||||
- eslint-plugin-import-x
|
||||
- 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:
|
||||
eslint: 9.25.1(jiti@2.6.1)
|
||||
|
||||
@@ -4501,14 +4506,14 @@ snapshots:
|
||||
safe-regex-test: 1.1.0
|
||||
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:
|
||||
eslint: 9.25.1(jiti@2.6.1)
|
||||
prettier: 3.6.2
|
||||
prettier-linter-helpers: 1.0.0
|
||||
synckit: 0.11.11
|
||||
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)):
|
||||
dependencies:
|
||||
@@ -5411,14 +5416,14 @@ snapshots:
|
||||
dependencies:
|
||||
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:
|
||||
prettier: 3.6.2
|
||||
typescript: 5.7.3
|
||||
|
||||
prettier@3.6.2: {}
|
||||
|
||||
pretty-bytes@6.1.1: {}
|
||||
pretty-bytes@7.1.0: {}
|
||||
|
||||
prism-react-renderer@2.4.1(react@18.3.1):
|
||||
dependencies:
|
||||
@@ -5504,7 +5509,7 @@ snapshots:
|
||||
dependencies:
|
||||
'@types/use-sync-external-store': 0.0.6
|
||||
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:
|
||||
'@types/react': 19.0.10
|
||||
redux: 5.0.1
|
||||
@@ -5902,7 +5907,7 @@ snapshots:
|
||||
|
||||
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):
|
||||
dependencies:
|
||||
@@ -6089,6 +6094,10 @@ snapshots:
|
||||
dependencies:
|
||||
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: {}
|
||||
|
||||
uuid@10.0.0: {}
|
||||
|
||||
@@ -1093,7 +1093,7 @@
|
||||
"DISABLE_DISK": "Skyf Gedeaktiveer",
|
||||
"SWAP_DSBL": "Ruil Gedeaktiveer",
|
||||
"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",
|
||||
"NEW_DISK_TOO_SMALL": "Nuwe Skyf te Klein",
|
||||
"NO_DATA_DISKS": "Geen Data Skywe",
|
||||
|
||||
@@ -93,8 +93,8 @@
|
||||
"http_status": "HTTP-Status",
|
||||
"error": "Fehler",
|
||||
"response": "Antwort",
|
||||
"down": "Online",
|
||||
"up": "Offline",
|
||||
"down": "Offline",
|
||||
"up": "Online",
|
||||
"not_available": "Nicht verfügbar"
|
||||
},
|
||||
"emby": {
|
||||
|
||||
@@ -276,7 +276,7 @@
|
||||
"pending": "Pendiente",
|
||||
"approved": "Aprobado",
|
||||
"available": "Disponible",
|
||||
"issues": "Open Issues"
|
||||
"issues": "Issues Abiertos"
|
||||
},
|
||||
"overseerr": {
|
||||
"pending": "Pendiente",
|
||||
@@ -1108,16 +1108,16 @@
|
||||
"poolFree": "{{pool}} Libre"
|
||||
},
|
||||
"backrest": {
|
||||
"num_plans": "Plans",
|
||||
"num_success_30": "Successes",
|
||||
"num_failure_30": "Failures",
|
||||
"num_success_latest": "Succeeding",
|
||||
"num_failure_latest": "Failing",
|
||||
"bytes_added_30": "Bytes Added"
|
||||
"num_plans": "Planes",
|
||||
"num_success_30": "Éxitos",
|
||||
"num_failure_30": "Fallos",
|
||||
"num_success_latest": "Exitosa",
|
||||
"num_failure_latest": "Fallida",
|
||||
"bytes_added_30": "Bytes Añadidos"
|
||||
},
|
||||
"yourspotify": {
|
||||
"songs": "Songs",
|
||||
"time": "Time",
|
||||
"artists": "Artists"
|
||||
"songs": "Canciones",
|
||||
"time": "Tiempo",
|
||||
"artists": "Artistas"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -276,7 +276,7 @@
|
||||
"pending": "En attente",
|
||||
"approved": "Approuvé",
|
||||
"available": "Disponible",
|
||||
"issues": "Open Issues"
|
||||
"issues": "Problèmes non résolus"
|
||||
},
|
||||
"overseerr": {
|
||||
"pending": "En attente",
|
||||
@@ -1086,34 +1086,34 @@
|
||||
"nextRenewingSubscription": "Prochain paiement"
|
||||
},
|
||||
"unraid": {
|
||||
"STARTED": "Started",
|
||||
"STOPPED": "Stopped",
|
||||
"NEW_ARRAY": "New Array",
|
||||
"RECON_DISK": "Reconstructing Disk",
|
||||
"DISABLE_DISK": "Disk Disabled",
|
||||
"STARTED": "Commencé",
|
||||
"STOPPED": "Arrêté",
|
||||
"NEW_ARRAY": "Nouveau tableau",
|
||||
"RECON_DISK": "Reconstruction du disque",
|
||||
"DISABLE_DISK": "Disque désactivé",
|
||||
"SWAP_DSBL": "Swap Disable",
|
||||
"INVALID_EXPANSION": "Invalid Expansion",
|
||||
"PARITY_NOT_BIGGEST": "Parity Not Biggest",
|
||||
"TOO_MANY_MISSING_DISKS": "Too Many Missing Disks",
|
||||
"NEW_DISK_TOO_SMALL": "New Disk Too Small",
|
||||
"NO_DATA_DISKS": "No Data Disks",
|
||||
"INVALID_EXPANSION": "Extension invalide",
|
||||
"PARITY_NOT_BIGGEST": "La parité n'est pas la plus grande",
|
||||
"TOO_MANY_MISSING_DISKS": "Trop de disques manquants",
|
||||
"NEW_DISK_TOO_SMALL": "Nouveau disque trop petit",
|
||||
"NO_DATA_DISKS": "Aucun disque de données",
|
||||
"notifications": "Notifications",
|
||||
"status": "État",
|
||||
"cpu": "UCT",
|
||||
"memoryUsed": "Mémoire Utilisé",
|
||||
"memoryAvailable": "Mémoire Disponible",
|
||||
"arrayUsed": "Array Used",
|
||||
"arrayFree": "Array Free",
|
||||
"poolUsed": "{{pool}} Used",
|
||||
"poolFree": "{{pool}} Free"
|
||||
"arrayUsed": "RAID utilisé",
|
||||
"arrayFree": "RAID libre",
|
||||
"poolUsed": "{{pool}} Utilisé",
|
||||
"poolFree": "{{pool}} Libre"
|
||||
},
|
||||
"backrest": {
|
||||
"num_plans": "Plans",
|
||||
"num_success_30": "Successes",
|
||||
"num_failure_30": "Failures",
|
||||
"num_success_latest": "Succeeding",
|
||||
"num_failure_latest": "Failing",
|
||||
"bytes_added_30": "Bytes Added"
|
||||
"num_plans": "Abonnements",
|
||||
"num_success_30": "Succès",
|
||||
"num_failure_30": "Échecs",
|
||||
"num_success_latest": "Réussi",
|
||||
"num_failure_latest": "Échoué",
|
||||
"bytes_added_30": "Octets ajoutés"
|
||||
},
|
||||
"yourspotify": {
|
||||
"songs": "Musiques",
|
||||
|
||||
@@ -200,10 +200,10 @@
|
||||
"rutorrent": {
|
||||
"active": "活动中",
|
||||
"upload": "Upload",
|
||||
"download": "Download"
|
||||
"download": "下载"
|
||||
},
|
||||
"transmission": {
|
||||
"download": "Download",
|
||||
"download": "下载",
|
||||
"upload": "",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
@@ -223,8 +223,8 @@
|
||||
"invalid": "Invalid"
|
||||
},
|
||||
"deluge": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"download": "下载",
|
||||
"upload": "上传",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
},
|
||||
|
||||
@@ -55,8 +55,7 @@ export default function Version({ disableUpdateCheck = false }) {
|
||||
</span>
|
||||
{!validate(version)
|
||||
? null
|
||||
: releaseData &&
|
||||
latestRelease &&
|
||||
: latestRelease &&
|
||||
compareVersions(latestRelease.tag_name, version) > 0 && (
|
||||
<a
|
||||
href={latestRelease.html_url}
|
||||
|
||||
@@ -113,7 +113,7 @@ export default function Widget({ options }) {
|
||||
<Resource
|
||||
icon={FaMemory}
|
||||
value={t("common.bytes", {
|
||||
value: data.mem.free,
|
||||
value: data.mem.available,
|
||||
maximumFractionDigits: 1,
|
||||
binary: true,
|
||||
})}
|
||||
|
||||
@@ -425,7 +425,7 @@ function Home({ initialSettings }) {
|
||||
<div
|
||||
className={classNames(
|
||||
settings.fullWidth ? "" : "container",
|
||||
"relative m-auto flex flex-col justify-start z-10 h-full",
|
||||
"relative m-auto flex flex-col justify-start z-10 h-full min-h-screen",
|
||||
)}
|
||||
>
|
||||
<QuickLaunch
|
||||
|
||||
@@ -106,13 +106,19 @@ export default function Integration({ config, params, setEvents, hideErrors, tim
|
||||
};
|
||||
|
||||
const eventsToAdd = [];
|
||||
events.forEach((event, index) => {
|
||||
events.forEach((event) => {
|
||||
const occurrences = getOcurrencesFromRange(event);
|
||||
|
||||
occurrences.forEach((icalDate) => {
|
||||
const date = icalDate.toJSDate();
|
||||
|
||||
const hash = simpleHash(`${event.id}-${event.title}-${index}-${date.toString()}`);
|
||||
const occurrenceTimestamp = date.getTime();
|
||||
const eventIdentifier =
|
||||
event.id ??
|
||||
simpleHash(
|
||||
`${event.title ?? ""}-${event.type ?? ""}-${event.status ?? ""}-${event.url ?? ""}-${event.location ?? ""}`,
|
||||
);
|
||||
const hash = simpleHash(`${eventIdentifier}-${occurrenceTimestamp}`);
|
||||
|
||||
let title = event.title;
|
||||
if (showName) {
|
||||
|
||||
@@ -205,13 +205,14 @@ export default function Component({ service }) {
|
||||
const { t } = useTranslation();
|
||||
|
||||
const { widget } = service;
|
||||
const enableNowPlaying = service.widget?.enableNowPlaying ?? true;
|
||||
|
||||
const {
|
||||
data: sessionsData,
|
||||
error: sessionsError,
|
||||
mutate: sessionMutate,
|
||||
} = useWidgetAPI(widget, "Sessions", {
|
||||
refreshInterval: 5000,
|
||||
} = useWidgetAPI(widget, enableNowPlaying ? "Sessions" : "", {
|
||||
refreshInterval: enableNowPlaying ? 5000 : undefined,
|
||||
});
|
||||
|
||||
const { data: countData, error: countError } = useWidgetAPI(widget, "Count", {
|
||||
@@ -239,13 +240,12 @@ export default function Component({ service }) {
|
||||
}
|
||||
|
||||
const enableBlocks = service.widget?.enableBlocks;
|
||||
const enableNowPlaying = service.widget?.enableNowPlaying ?? true;
|
||||
const enableMediaControl = service.widget?.enableMediaControl !== false; // default is true
|
||||
const enableUser = !!service.widget?.enableUser; // default is false
|
||||
const expandOneStreamToTwoRows = service.widget?.expandOneStreamToTwoRows !== false; // default is true
|
||||
const showEpisodeNumber = !!service.widget?.showEpisodeNumber; // default is false
|
||||
|
||||
if (!sessionsData || !countData) {
|
||||
if ((enableNowPlaying && !sessionsData) || !countData) {
|
||||
return (
|
||||
<>
|
||||
{enableBlocks && <CountBlocks service={service} countData={null} />}
|
||||
|
||||
@@ -14,6 +14,12 @@ export default function Component({ service }) {
|
||||
return <Container service={service} error={resultError} />;
|
||||
}
|
||||
|
||||
if (!widget.fields || widget.fields.length === 0) {
|
||||
widget.fields = ["online", "offline", "offline_alt", "total"];
|
||||
} else if (widget.fields.length > 4) {
|
||||
widget.fields = widget.fields.slice(0, 4);
|
||||
}
|
||||
|
||||
if (!resultData) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
|
||||
@@ -27,7 +27,7 @@ export default function Component({ service }) {
|
||||
useEffect(() => {
|
||||
if (data) {
|
||||
setDataPoints((prevDataPoints) => {
|
||||
const newDataPoints = [...prevDataPoints, { a: data.used, b: data.free }];
|
||||
const newDataPoints = [...prevDataPoints, { a: data.used, b: data.available }];
|
||||
if (newDataPoints.length > pointsLimit) {
|
||||
newDataPoints.shift();
|
||||
}
|
||||
@@ -67,10 +67,10 @@ export default function Component({ service }) {
|
||||
|
||||
{data && !error && (
|
||||
<Block position="bottom-3 left-3">
|
||||
{data.free && chart && (
|
||||
{data.available && chart && (
|
||||
<div className="text-xs opacity-50">
|
||||
{t("common.bytes", {
|
||||
value: data.free,
|
||||
value: data.available,
|
||||
maximumFractionDigits: 1,
|
||||
binary: true,
|
||||
})}{" "}
|
||||
@@ -93,10 +93,10 @@ export default function Component({ service }) {
|
||||
|
||||
{!chart && (
|
||||
<Block position="top-3 right-3">
|
||||
{data.free && (
|
||||
{data.available && (
|
||||
<div className="text-xs opacity-50">
|
||||
{t("common.bytes", {
|
||||
value: data.free,
|
||||
value: data.available,
|
||||
maximumFractionDigits: 1,
|
||||
binary: true,
|
||||
})}{" "}
|
||||
|
||||
@@ -32,7 +32,7 @@ export default function Component({ service }) {
|
||||
|
||||
if (
|
||||
(!widget.showStacks && !containersData) ||
|
||||
(widget.showSummary && (!stacksData || !serversData)) ||
|
||||
(widget.showSummary && (!containersData || !stacksData || !serversData)) ||
|
||||
(widget.showStacks && !stacksData)
|
||||
) {
|
||||
return widget.showSummary ? (
|
||||
|
||||
@@ -33,14 +33,6 @@ export default function Component({ service }) {
|
||||
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block
|
||||
label="myspeed.ping"
|
||||
value={t("common.ms", {
|
||||
value: data[0].ping,
|
||||
style: "unit",
|
||||
unit: "millisecond",
|
||||
})}
|
||||
/>
|
||||
<Block
|
||||
label="myspeed.download"
|
||||
value={t("common.bitrate", {
|
||||
@@ -55,6 +47,14 @@ export default function Component({ service }) {
|
||||
decimals: 2,
|
||||
})}
|
||||
/>
|
||||
<Block
|
||||
label="myspeed.ping"
|
||||
value={t("common.ms", {
|
||||
value: data[0].ping,
|
||||
style: "unit",
|
||||
unit: "millisecond",
|
||||
})}
|
||||
/>
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -66,7 +66,7 @@ export default async function omadaProxyHandler(req, res) {
|
||||
|
||||
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 } });
|
||||
}
|
||||
|
||||
@@ -80,6 +80,7 @@ export default async function omadaProxyHandler(req, res) {
|
||||
loginUrl = `${url}/api/v2/login`;
|
||||
break;
|
||||
case 5:
|
||||
case 6:
|
||||
loginUrl = `${url}/${cId}/api/v2/login`;
|
||||
break;
|
||||
default:
|
||||
@@ -122,6 +123,7 @@ export default async function omadaProxyHandler(req, res) {
|
||||
sitesUrl = `${url}/api/v2/sites?token=${token}¤tPage=1¤tPageSize=1000`;
|
||||
break;
|
||||
case 5:
|
||||
case 6:
|
||||
sitesUrl = `${url}/${cId}/api/v2/sites?token=${token}¤tPage=1¤tPageSize=1000`;
|
||||
break;
|
||||
default:
|
||||
@@ -207,8 +209,8 @@ export default async function omadaProxyHandler(req, res) {
|
||||
connectedAp = siteResponseData.result.connectedAp;
|
||||
activeUser = siteResponseData.result.activeUser;
|
||||
alerts = siteResponseData.result.alerts;
|
||||
} else if (controllerVersionMajor === 4 || controllerVersionMajor === 5) {
|
||||
const siteName = controllerVersionMajor === 5 ? site.id : site.key;
|
||||
} else if ([4, 5, 6].includes(controllerVersionMajor)) {
|
||||
const siteName = controllerVersionMajor > 4 ? site.id : site.key;
|
||||
const siteStatsUrl =
|
||||
controllerVersionMajor === 4
|
||||
? `${url}/api/v2/sites/${siteName}/dashboard/overviewDiagram?token=${token}¤tPage=1¤tPageSize=1000`
|
||||
|
||||
Reference in New Issue
Block a user