Merge branch 'dev'

pull/4144/head v0.9.11
shamoon 1 month ago
commit 2245cdda55

@ -5,7 +5,7 @@ body:
### ⚠️ Before opening a discussion: ### ⚠️ Before opening a discussion:
- [Check the troubleshooting guide](https://gethomepage.dev/troubleshooting/). - [Check the troubleshooting guide](https://gethomepage.dev/troubleshooting/).
- [Search existing issues](https://github.com/gethomepage/homepage/search?q=&type=issues) [and discussions](https://github.com/gethomepage/homepage/search?q=&type=discussions). - [Search existing issues](https://github.com/gethomepage/homepage/search?q=&type=issues) [and discussions](https://github.com/gethomepage/homepage/search?q=&type=discussions) (including closed ones!).
- type: textarea - type: textarea
id: description id: description
attributes: attributes:

@ -5,6 +5,11 @@ description: Immich Widget Configuration
Learn more about [Immich](https://github.com/immich-app/immich). Learn more about [Immich](https://github.com/immich-app/immich).
| Immich Version | Homepage Widget Version |
| -------------- | ----------------------- |
| < v1.118 | 1 (default) |
| >= v1.118 | 2 |
Find your API key under `Account Settings > API Keys`. Find your API key under `Account Settings > API Keys`.
Allowed fields: `["users" ,"photos", "videos", "storage"]`. Allowed fields: `["users" ,"photos", "videos", "storage"]`.
@ -16,4 +21,5 @@ widget:
type: immich type: immich
url: http://immich.host.or.ip url: http://immich.host.or.ip
key: adminapikeyadminapikeyadminapikey key: adminapikeyadminapikeyadminapikey
version: 2 # optional, default is 1
``` ```

@ -128,6 +128,7 @@ You can also find a list of all available service widgets in the sidebar navigat
- [Uptime Kuma](uptime-kuma.md) - [Uptime Kuma](uptime-kuma.md)
- [UptimeRobot](uptimerobot.md) - [UptimeRobot](uptimerobot.md)
- [UrBackup](urbackup.md) - [UrBackup](urbackup.md)
- [Vikunja](vikunja.md)
- [Watchtower](watchtower.md) - [Watchtower](watchtower.md)
- [WGEasy](wgeasy.md) - [WGEasy](wgeasy.md)
- [WhatsUpDocker](whatsupdocker.md) - [WhatsUpDocker](whatsupdocker.md)

@ -9,8 +9,11 @@ _Note that the project was renamed from PiAlert to NetAlertX._
Allowed fields: `["total", "connected", "new_devices", "down_alerts"]`. Allowed fields: `["total", "connected", "new_devices", "down_alerts"]`.
If you have enabled a password on your NetAlertX instance, you will need to provide the `SYNC_api_token` as the `key` in your config.
```yaml ```yaml
widget: widget:
type: netalertx type: netalertx
url: http://ip:port url: http://ip:port
key: netalertxsyncapitoken # optional, only if password is enabled
``` ```

@ -7,7 +7,7 @@ Learn more about [Unifi Controller](https://ui.com/).
_(Find the Unifi Controller information widget [here](../info/unifi_controller.md))_ _(Find the Unifi Controller information widget [here](../info/unifi_controller.md))_
You can display general connectivity status from your Unifi (Network) Controller. When authenticating you will want to use an account that has at least read privileges. You can display general connectivity status from your Unifi (Network) Controller. When authenticating you will want to use a local account that has at least read privileges.
An optional 'site' parameter can be supplied, if it is not the widget will use the default site for the controller. An optional 'site' parameter can be supplied, if it is not the widget will use the default site for the controller.

@ -0,0 +1,18 @@
---
title: Vikunja
description: Vikunja Widget Configuration
---
Learn more about [Vikunja](https://vikunja.io).
Allowed fields: `["projects", "tasks7d", "tasksOverdue", "tasksInProgress"]`.
A list of the next 5 tasks ordered by due date is disabled by default, but can be enabled with the `enableTaskList` option.
```yaml
widget:
type: vikunja
url: http[s]://vikunja.host.or.ip[:port]
key: vikunjaapikey
enableTaskList: true # optional, defaults to false
```

@ -151,6 +151,7 @@ nav:
- widgets/services/uptime-kuma.md - widgets/services/uptime-kuma.md
- widgets/services/uptimerobot.md - widgets/services/uptimerobot.md
- widgets/services/urbackup.md - widgets/services/urbackup.md
- widgets/services/vikunja.md
- widgets/services/watchtower.md - widgets/services/watchtower.md
- widgets/services/wgeasy.md - widgets/services/wgeasy.md
- widgets/services/whatsupdocker.md - widgets/services/whatsupdocker.md

78
package-lock.json generated

@ -14,7 +14,7 @@
"classnames": "^2.5.1", "classnames": "^2.5.1",
"compare-versions": "^6.1.0", "compare-versions": "^6.1.0",
"dockerode": "^4.0.2", "dockerode": "^4.0.2",
"follow-redirects": "^1.15.6", "follow-redirects": "^1.15.9",
"gamedig": "^5.1.2", "gamedig": "^5.1.2",
"i18next": "^21.10.0", "i18next": "^21.10.0",
"js-yaml": "^4.1.0", "js-yaml": "^4.1.0",
@ -43,20 +43,20 @@
"devDependencies": { "devDependencies": {
"@tailwindcss/forms": "^0.5.8", "@tailwindcss/forms": "^0.5.8",
"autoprefixer": "^10.4.20", "autoprefixer": "^10.4.20",
"eslint": "^8.57.0", "eslint": "^8.57.1",
"eslint-config-airbnb": "^19.0.4", "eslint-config-airbnb": "^19.0.4",
"eslint-config-next": "^14.2.3", "eslint-config-next": "^14.2.3",
"eslint-config-prettier": "^9.1.0", "eslint-config-prettier": "^9.1.0",
"eslint-plugin-import": "^2.29.1", "eslint-plugin-import": "^2.29.1",
"eslint-plugin-jsx-a11y": "^6.8.0", "eslint-plugin-jsx-a11y": "^6.8.0",
"eslint-plugin-prettier": "^5.2.1", "eslint-plugin-prettier": "^5.2.1",
"eslint-plugin-react": "^7.36.1", "eslint-plugin-react": "^7.37.1",
"eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-react-hooks": "^4.6.2",
"postcss": "^8.4.38", "postcss": "^8.4.47",
"prettier": "^3.2.5", "prettier": "^3.2.5",
"tailwind-scrollbar": "^3.0.5", "tailwind-scrollbar": "^3.0.5",
"tailwindcss": "^3.4.13", "tailwindcss": "^3.4.13",
"typescript": "^5.4.5" "typescript": "^5.6.2"
}, },
"optionalDependencies": { "optionalDependencies": {
"osx-temperature-sensor": "^1.0.8" "osx-temperature-sensor": "^1.0.8"
@ -164,11 +164,10 @@
} }
}, },
"node_modules/@eslint/js": { "node_modules/@eslint/js": {
"version": "8.57.0", "version": "8.57.1",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
"integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
"dev": true, "dev": true,
"license": "MIT",
"engines": { "engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0" "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
} }
@ -191,14 +190,13 @@
} }
}, },
"node_modules/@humanwhocodes/config-array": { "node_modules/@humanwhocodes/config-array": {
"version": "0.11.14", "version": "0.13.0",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
"integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
"deprecated": "Use @eslint/config-array instead", "deprecated": "Use @eslint/config-array instead",
"dev": true, "dev": true,
"license": "Apache-2.0",
"dependencies": { "dependencies": {
"@humanwhocodes/object-schema": "^2.0.2", "@humanwhocodes/object-schema": "^2.0.3",
"debug": "^4.3.1", "debug": "^4.3.1",
"minimatch": "^3.0.5" "minimatch": "^3.0.5"
}, },
@ -225,8 +223,7 @@
"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
"integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
"deprecated": "Use @eslint/object-schema instead", "deprecated": "Use @eslint/object-schema instead",
"dev": true, "dev": true
"license": "BSD-3-Clause"
}, },
"node_modules/@isaacs/cliui": { "node_modules/@isaacs/cliui": {
"version": "8.0.2", "version": "8.0.2",
@ -2942,17 +2939,16 @@
} }
}, },
"node_modules/eslint": { "node_modules/eslint": {
"version": "8.57.0", "version": "8.57.1",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
"integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1", "@eslint-community/regexpp": "^4.6.1",
"@eslint/eslintrc": "^2.1.4", "@eslint/eslintrc": "^2.1.4",
"@eslint/js": "8.57.0", "@eslint/js": "8.57.1",
"@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/config-array": "^0.13.0",
"@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8", "@nodelib/fs.walk": "^1.2.8",
"@ungap/structured-clone": "^1.2.0", "@ungap/structured-clone": "^1.2.0",
@ -3285,9 +3281,9 @@
} }
}, },
"node_modules/eslint-plugin-react": { "node_modules/eslint-plugin-react": {
"version": "7.36.1", "version": "7.37.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.36.1.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.1.tgz",
"integrity": "sha512-/qwbqNXZoq+VP30s1d4Nc1C5GTxjJQjk4Jzs4Wq2qzxFM7dSmuG2UkIjg2USMLh3A/aVcUNrK7v0J5U1XEGGwA==", "integrity": "sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"array-includes": "^3.1.8", "array-includes": "^3.1.8",
@ -3658,16 +3654,15 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/follow-redirects": { "node_modules/follow-redirects": {
"version": "1.15.8", "version": "1.15.9",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.8.tgz", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
"integrity": "sha512-xgrmBhBToVKay1q2Tao5LI26B83UhrB/vM1avwVSDzt8rx3rO6AizBAaF46EgksTVr+rFTQaqZZ9MVBfUe4nig==", "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
"funding": [ "funding": [
{ {
"type": "individual", "type": "individual",
"url": "https://github.com/sponsors/RubenVerborgh" "url": "https://github.com/sponsors/RubenVerborgh"
} }
], ],
"license": "MIT",
"engines": { "engines": {
"node": ">=4.0" "node": ">=4.0"
}, },
@ -6192,9 +6187,9 @@
} }
}, },
"node_modules/postcss": { "node_modules/postcss": {
"version": "8.4.45", "version": "8.4.47",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
"integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==", "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
"dev": true, "dev": true,
"funding": [ "funding": [
{ {
@ -6210,11 +6205,10 @@
"url": "https://github.com/sponsors/ai" "url": "https://github.com/sponsors/ai"
} }
], ],
"license": "MIT",
"dependencies": { "dependencies": {
"nanoid": "^3.3.7", "nanoid": "^3.3.7",
"picocolors": "^1.0.1", "picocolors": "^1.1.0",
"source-map-js": "^1.2.0" "source-map-js": "^1.2.1"
}, },
"engines": { "engines": {
"node": "^10 || ^12 || >=14" "node": "^10 || ^12 || >=14"
@ -7188,10 +7182,9 @@
} }
}, },
"node_modules/source-map-js": { "node_modules/source-map-js": {
"version": "1.2.0", "version": "1.2.1",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
"integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"license": "BSD-3-Clause",
"engines": { "engines": {
"node": ">=0.10.0" "node": ">=0.10.0"
} }
@ -8109,11 +8102,10 @@
} }
}, },
"node_modules/typescript": { "node_modules/typescript": {
"version": "5.5.4", "version": "5.6.2",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz",
"integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==",
"dev": true, "dev": true,
"license": "Apache-2.0",
"bin": { "bin": {
"tsc": "bin/tsc", "tsc": "bin/tsc",
"tsserver": "bin/tsserver" "tsserver": "bin/tsserver"

@ -16,7 +16,7 @@
"classnames": "^2.5.1", "classnames": "^2.5.1",
"compare-versions": "^6.1.0", "compare-versions": "^6.1.0",
"dockerode": "^4.0.2", "dockerode": "^4.0.2",
"follow-redirects": "^1.15.6", "follow-redirects": "^1.15.9",
"gamedig": "^5.1.2", "gamedig": "^5.1.2",
"i18next": "^21.10.0", "i18next": "^21.10.0",
"js-yaml": "^4.1.0", "js-yaml": "^4.1.0",
@ -45,20 +45,20 @@
"devDependencies": { "devDependencies": {
"@tailwindcss/forms": "^0.5.8", "@tailwindcss/forms": "^0.5.8",
"autoprefixer": "^10.4.20", "autoprefixer": "^10.4.20",
"eslint": "^8.57.0", "eslint": "^8.57.1",
"eslint-config-airbnb": "^19.0.4", "eslint-config-airbnb": "^19.0.4",
"eslint-config-next": "^14.2.3", "eslint-config-next": "^14.2.3",
"eslint-config-prettier": "^9.1.0", "eslint-config-prettier": "^9.1.0",
"eslint-plugin-import": "^2.29.1", "eslint-plugin-import": "^2.29.1",
"eslint-plugin-jsx-a11y": "^6.8.0", "eslint-plugin-jsx-a11y": "^6.8.0",
"eslint-plugin-prettier": "^5.2.1", "eslint-plugin-prettier": "^5.2.1",
"eslint-plugin-react": "^7.36.1", "eslint-plugin-react": "^7.37.1",
"eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-react-hooks": "^4.6.2",
"postcss": "^8.4.38", "postcss": "^8.4.47",
"prettier": "^3.2.5", "prettier": "^3.2.5",
"tailwind-scrollbar": "^3.0.5", "tailwind-scrollbar": "^3.0.5",
"tailwindcss": "^3.4.13", "tailwindcss": "^3.4.13",
"typescript": "^5.4.5" "typescript": "^5.6.2"
}, },
"optionalDependencies": { "optionalDependencies": {
"osx-temperature-sensor": "^1.0.8" "osx-temperature-sensor": "^1.0.8"

@ -27,8 +27,8 @@ importers:
specifier: ^4.0.2 specifier: ^4.0.2
version: 4.0.2 version: 4.0.2
follow-redirects: follow-redirects:
specifier: ^1.15.6 specifier: ^1.15.9
version: 1.15.8 version: 1.15.9
gamedig: gamedig:
specifier: ^5.1.2 specifier: ^5.1.2
version: 5.1.3 version: 5.1.3
@ -111,37 +111,37 @@ importers:
version: 0.5.9(tailwindcss@3.4.13) version: 0.5.9(tailwindcss@3.4.13)
autoprefixer: autoprefixer:
specifier: ^10.4.20 specifier: ^10.4.20
version: 10.4.20(postcss@8.4.45) version: 10.4.20(postcss@8.4.47)
eslint: eslint:
specifier: ^8.57.0 specifier: ^8.57.1
version: 8.57.0 version: 8.57.1
eslint-config-airbnb: eslint-config-airbnb:
specifier: ^19.0.4 specifier: ^19.0.4
version: 19.0.4(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint-plugin-jsx-a11y@6.10.0(eslint@8.57.0))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.0))(eslint-plugin-react@7.36.1(eslint@8.57.0))(eslint@8.57.0) version: 19.0.4(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint-plugin-jsx-a11y@6.10.0(eslint@8.57.1))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.1))(eslint-plugin-react@7.37.1(eslint@8.57.1))(eslint@8.57.1)
eslint-config-next: eslint-config-next:
specifier: ^14.2.3 specifier: ^14.2.3
version: 14.2.8(eslint@8.57.0)(typescript@5.5.4) version: 14.2.8(eslint@8.57.1)(typescript@5.6.2)
eslint-config-prettier: eslint-config-prettier:
specifier: ^9.1.0 specifier: ^9.1.0
version: 9.1.0(eslint@8.57.0) version: 9.1.0(eslint@8.57.1)
eslint-plugin-import: eslint-plugin-import:
specifier: ^2.29.1 specifier: ^2.29.1
version: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) version: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
eslint-plugin-jsx-a11y: eslint-plugin-jsx-a11y:
specifier: ^6.8.0 specifier: ^6.8.0
version: 6.10.0(eslint@8.57.0) version: 6.10.0(eslint@8.57.1)
eslint-plugin-prettier: eslint-plugin-prettier:
specifier: ^5.2.1 specifier: ^5.2.1
version: 5.2.1(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.3) version: 5.2.1(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.3.3)
eslint-plugin-react: eslint-plugin-react:
specifier: ^7.36.1 specifier: ^7.37.1
version: 7.36.1(eslint@8.57.0) version: 7.37.1(eslint@8.57.1)
eslint-plugin-react-hooks: eslint-plugin-react-hooks:
specifier: ^4.6.2 specifier: ^4.6.2
version: 4.6.2(eslint@8.57.0) version: 4.6.2(eslint@8.57.1)
postcss: postcss:
specifier: ^8.4.38 specifier: ^8.4.47
version: 8.4.45 version: 8.4.47
prettier: prettier:
specifier: ^3.2.5 specifier: ^3.2.5
version: 3.3.3 version: 3.3.3
@ -152,8 +152,8 @@ importers:
specifier: ^3.4.13 specifier: ^3.4.13
version: 3.4.13 version: 3.4.13
typescript: typescript:
specifier: ^5.4.5 specifier: ^5.6.2
version: 5.5.4 version: 5.6.2
packages: packages:
@ -189,8 +189,8 @@ packages:
resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
'@eslint/js@8.57.0': '@eslint/js@8.57.1':
resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
'@headlessui/react@1.7.19': '@headlessui/react@1.7.19':
@ -200,8 +200,8 @@ packages:
react: ^16 || ^17 || ^18 react: ^16 || ^17 || ^18
react-dom: ^16 || ^17 || ^18 react-dom: ^16 || ^17 || ^18
'@humanwhocodes/config-array@0.11.14': '@humanwhocodes/config-array@0.13.0':
resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==}
engines: {node: '>=10.10.0'} engines: {node: '>=10.10.0'}
deprecated: Use @eslint/config-array instead deprecated: Use @eslint/config-array instead
@ -1134,8 +1134,8 @@ packages:
peerDependencies: peerDependencies:
eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
eslint-plugin-react@7.36.1: eslint-plugin-react@7.37.1:
resolution: {integrity: sha512-/qwbqNXZoq+VP30s1d4Nc1C5GTxjJQjk4Jzs4Wq2qzxFM7dSmuG2UkIjg2USMLh3A/aVcUNrK7v0J5U1XEGGwA==} resolution: {integrity: sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg==}
engines: {node: '>=4'} engines: {node: '>=4'}
peerDependencies: peerDependencies:
eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7
@ -1148,8 +1148,8 @@ packages:
resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
eslint@8.57.0: eslint@8.57.1:
resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
hasBin: true hasBin: true
@ -1239,10 +1239,9 @@ packages:
fn.name@1.1.0: fn.name@1.1.0:
resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==}
follow-redirects@1.15.8: follow-redirects@1.15.9:
resolution: {integrity: sha512-xgrmBhBToVKay1q2Tao5LI26B83UhrB/vM1avwVSDzt8rx3rO6AizBAaF46EgksTVr+rFTQaqZZ9MVBfUe4nig==} resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
engines: {node: '>=4.0'} engines: {node: '>=4.0'}
deprecated: Browser detection issues fixed in v1.15.9
peerDependencies: peerDependencies:
debug: '*' debug: '*'
peerDependenciesMeta: peerDependenciesMeta:
@ -2096,8 +2095,8 @@ packages:
resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==}
engines: {node: ^10 || ^12 || >=14} engines: {node: ^10 || ^12 || >=14}
postcss@8.4.45: postcss@8.4.47:
resolution: {integrity: sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==} resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==}
engines: {node: ^10 || ^12 || >=14} engines: {node: ^10 || ^12 || >=14}
prelude-ls@1.2.1: prelude-ls@1.2.1:
@ -2372,6 +2371,10 @@ packages:
resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
source-map-js@1.2.1:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
split-ca@1.0.1: split-ca@1.0.1:
resolution: {integrity: sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==} resolution: {integrity: sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==}
@ -2621,8 +2624,8 @@ packages:
resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
typescript@5.5.4: typescript@5.6.2:
resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==}
engines: {node: '>=14.17'} engines: {node: '>=14.17'}
hasBin: true hasBin: true
@ -2785,9 +2788,9 @@ snapshots:
enabled: 2.0.0 enabled: 2.0.0
kuler: 2.0.0 kuler: 2.0.0
'@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': '@eslint-community/eslint-utils@4.4.0(eslint@8.57.1)':
dependencies: dependencies:
eslint: 8.57.0 eslint: 8.57.1
eslint-visitor-keys: 3.4.3 eslint-visitor-keys: 3.4.3
'@eslint-community/regexpp@4.11.0': {} '@eslint-community/regexpp@4.11.0': {}
@ -2806,7 +2809,7 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@eslint/js@8.57.0': {} '@eslint/js@8.57.1': {}
'@headlessui/react@1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': '@headlessui/react@1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies: dependencies:
@ -2815,7 +2818,7 @@ snapshots:
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)
'@humanwhocodes/config-array@0.11.14': '@humanwhocodes/config-array@0.13.0':
dependencies: dependencies:
'@humanwhocodes/object-schema': 2.0.3 '@humanwhocodes/object-schema': 2.0.3
debug: 4.3.6 debug: 4.3.6
@ -3012,36 +3015,36 @@ snapshots:
'@types/triple-beam@1.3.5': {} '@types/triple-beam@1.3.5': {}
'@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': '@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2)':
dependencies: dependencies:
'@eslint-community/regexpp': 4.11.0 '@eslint-community/regexpp': 4.11.0
'@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/parser': 7.2.0(eslint@8.57.1)(typescript@5.6.2)
'@typescript-eslint/scope-manager': 7.2.0 '@typescript-eslint/scope-manager': 7.2.0
'@typescript-eslint/type-utils': 7.2.0(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/type-utils': 7.2.0(eslint@8.57.1)(typescript@5.6.2)
'@typescript-eslint/utils': 7.2.0(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/utils': 7.2.0(eslint@8.57.1)(typescript@5.6.2)
'@typescript-eslint/visitor-keys': 7.2.0 '@typescript-eslint/visitor-keys': 7.2.0
debug: 4.3.6 debug: 4.3.6
eslint: 8.57.0 eslint: 8.57.1
graphemer: 1.4.0 graphemer: 1.4.0
ignore: 5.3.2 ignore: 5.3.2
natural-compare: 1.4.0 natural-compare: 1.4.0
semver: 7.6.3 semver: 7.6.3
ts-api-utils: 1.3.0(typescript@5.5.4) ts-api-utils: 1.3.0(typescript@5.6.2)
optionalDependencies: optionalDependencies:
typescript: 5.5.4 typescript: 5.6.2
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4)': '@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2)':
dependencies: dependencies:
'@typescript-eslint/scope-manager': 7.2.0 '@typescript-eslint/scope-manager': 7.2.0
'@typescript-eslint/types': 7.2.0 '@typescript-eslint/types': 7.2.0
'@typescript-eslint/typescript-estree': 7.2.0(typescript@5.5.4) '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.6.2)
'@typescript-eslint/visitor-keys': 7.2.0 '@typescript-eslint/visitor-keys': 7.2.0
debug: 4.3.6 debug: 4.3.6
eslint: 8.57.0 eslint: 8.57.1
optionalDependencies: optionalDependencies:
typescript: 5.5.4 typescript: 5.6.2
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -3050,21 +3053,21 @@ snapshots:
'@typescript-eslint/types': 7.2.0 '@typescript-eslint/types': 7.2.0
'@typescript-eslint/visitor-keys': 7.2.0 '@typescript-eslint/visitor-keys': 7.2.0
'@typescript-eslint/type-utils@7.2.0(eslint@8.57.0)(typescript@5.5.4)': '@typescript-eslint/type-utils@7.2.0(eslint@8.57.1)(typescript@5.6.2)':
dependencies: dependencies:
'@typescript-eslint/typescript-estree': 7.2.0(typescript@5.5.4) '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.6.2)
'@typescript-eslint/utils': 7.2.0(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/utils': 7.2.0(eslint@8.57.1)(typescript@5.6.2)
debug: 4.3.6 debug: 4.3.6
eslint: 8.57.0 eslint: 8.57.1
ts-api-utils: 1.3.0(typescript@5.5.4) ts-api-utils: 1.3.0(typescript@5.6.2)
optionalDependencies: optionalDependencies:
typescript: 5.5.4 typescript: 5.6.2
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/types@7.2.0': {} '@typescript-eslint/types@7.2.0': {}
'@typescript-eslint/typescript-estree@7.2.0(typescript@5.5.4)': '@typescript-eslint/typescript-estree@7.2.0(typescript@5.6.2)':
dependencies: dependencies:
'@typescript-eslint/types': 7.2.0 '@typescript-eslint/types': 7.2.0
'@typescript-eslint/visitor-keys': 7.2.0 '@typescript-eslint/visitor-keys': 7.2.0
@ -3073,21 +3076,21 @@ snapshots:
is-glob: 4.0.3 is-glob: 4.0.3
minimatch: 9.0.3 minimatch: 9.0.3
semver: 7.6.3 semver: 7.6.3
ts-api-utils: 1.3.0(typescript@5.5.4) ts-api-utils: 1.3.0(typescript@5.6.2)
optionalDependencies: optionalDependencies:
typescript: 5.5.4 typescript: 5.6.2
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/utils@7.2.0(eslint@8.57.0)(typescript@5.5.4)': '@typescript-eslint/utils@7.2.0(eslint@8.57.1)(typescript@5.6.2)':
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1)
'@types/json-schema': 7.0.15 '@types/json-schema': 7.0.15
'@types/semver': 7.5.8 '@types/semver': 7.5.8
'@typescript-eslint/scope-manager': 7.2.0 '@typescript-eslint/scope-manager': 7.2.0
'@typescript-eslint/types': 7.2.0 '@typescript-eslint/types': 7.2.0
'@typescript-eslint/typescript-estree': 7.2.0(typescript@5.5.4) '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.6.2)
eslint: 8.57.0 eslint: 8.57.1
semver: 7.6.3 semver: 7.6.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -3221,14 +3224,14 @@ snapshots:
asynckit@0.4.0: {} asynckit@0.4.0: {}
autoprefixer@10.4.20(postcss@8.4.45): autoprefixer@10.4.20(postcss@8.4.47):
dependencies: dependencies:
browserslist: 4.23.3 browserslist: 4.23.3
caniuse-lite: 1.0.30001657 caniuse-lite: 1.0.30001657
fraction.js: 4.3.7 fraction.js: 4.3.7
normalize-range: 0.1.2 normalize-range: 0.1.2
picocolors: 1.1.0 picocolors: 1.1.0
postcss: 8.4.45 postcss: 8.4.47
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
available-typed-arrays@1.0.7: available-typed-arrays@1.0.7:
@ -3756,49 +3759,49 @@ snapshots:
escape-string-regexp@4.0.0: {} escape-string-regexp@4.0.0: {}
eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint@8.57.0): eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1):
dependencies: dependencies:
confusing-browser-globals: 1.0.11 confusing-browser-globals: 1.0.11
eslint: 8.57.0 eslint: 8.57.1
eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
object.assign: 4.1.5 object.assign: 4.1.5
object.entries: 1.1.8 object.entries: 1.1.8
semver: 6.3.1 semver: 6.3.1
eslint-config-airbnb@19.0.4(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint-plugin-jsx-a11y@6.10.0(eslint@8.57.0))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.0))(eslint-plugin-react@7.36.1(eslint@8.57.0))(eslint@8.57.0): eslint-config-airbnb@19.0.4(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint-plugin-jsx-a11y@6.10.0(eslint@8.57.1))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.1))(eslint-plugin-react@7.37.1(eslint@8.57.1))(eslint@8.57.1):
dependencies: dependencies:
eslint: 8.57.0 eslint: 8.57.1
eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint@8.57.0) eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1)
eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.1)
eslint-plugin-react: 7.36.1(eslint@8.57.0) eslint-plugin-react: 7.37.1(eslint@8.57.1)
eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1)
object.assign: 4.1.5 object.assign: 4.1.5
object.entries: 1.1.8 object.entries: 1.1.8
eslint-config-next@14.2.8(eslint@8.57.0)(typescript@5.5.4): eslint-config-next@14.2.8(eslint@8.57.1)(typescript@5.6.2):
dependencies: dependencies:
'@next/eslint-plugin-next': 14.2.8 '@next/eslint-plugin-next': 14.2.8
'@rushstack/eslint-patch': 1.10.4 '@rushstack/eslint-patch': 1.10.4
'@typescript-eslint/eslint-plugin': 7.2.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/eslint-plugin': 7.2.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2)
'@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/parser': 7.2.0(eslint@8.57.1)(typescript@5.6.2)
eslint: 8.57.0 eslint: 8.57.1
eslint-import-resolver-node: 0.3.9 eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0) eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1)
eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.1)
eslint-plugin-react: 7.36.1(eslint@8.57.0) eslint-plugin-react: 7.37.1(eslint@8.57.1)
eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1)
optionalDependencies: optionalDependencies:
typescript: 5.5.4 typescript: 5.6.2
transitivePeerDependencies: transitivePeerDependencies:
- eslint-import-resolver-webpack - eslint-import-resolver-webpack
- eslint-plugin-import-x - eslint-plugin-import-x
- supports-color - supports-color
eslint-config-prettier@9.1.0(eslint@8.57.0): eslint-config-prettier@9.1.0(eslint@8.57.1):
dependencies: dependencies:
eslint: 8.57.0 eslint: 8.57.1
eslint-import-resolver-node@0.3.9: eslint-import-resolver-node@0.3.9:
dependencies: dependencies:
@ -3808,37 +3811,37 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0): eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1):
dependencies: dependencies:
'@nolyfill/is-core-module': 1.0.39 '@nolyfill/is-core-module': 1.0.39
debug: 4.3.6 debug: 4.3.6
enhanced-resolve: 5.17.1 enhanced-resolve: 5.17.1
eslint: 8.57.0 eslint: 8.57.1
eslint-module-utils: 2.9.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0) eslint-module-utils: 2.9.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1)
fast-glob: 3.3.2 fast-glob: 3.3.2
get-tsconfig: 4.8.0 get-tsconfig: 4.8.0
is-bun-module: 1.1.0 is-bun-module: 1.1.0
is-glob: 4.0.3 is-glob: 4.0.3
optionalDependencies: optionalDependencies:
eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
transitivePeerDependencies: transitivePeerDependencies:
- '@typescript-eslint/parser' - '@typescript-eslint/parser'
- eslint-import-resolver-node - eslint-import-resolver-node
- eslint-import-resolver-webpack - eslint-import-resolver-webpack
- supports-color - supports-color
eslint-module-utils@2.9.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0): eslint-module-utils@2.9.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1):
dependencies: dependencies:
debug: 3.2.7 debug: 3.2.7
optionalDependencies: optionalDependencies:
'@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/parser': 7.2.0(eslint@8.57.1)(typescript@5.6.2)
eslint: 8.57.0 eslint: 8.57.1
eslint-import-resolver-node: 0.3.9 eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0) eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0): eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1):
dependencies: dependencies:
'@rtsao/scc': 1.1.0 '@rtsao/scc': 1.1.0
array-includes: 3.1.8 array-includes: 3.1.8
@ -3847,9 +3850,9 @@ snapshots:
array.prototype.flatmap: 1.3.2 array.prototype.flatmap: 1.3.2
debug: 3.2.7 debug: 3.2.7
doctrine: 2.1.0 doctrine: 2.1.0
eslint: 8.57.0 eslint: 8.57.1
eslint-import-resolver-node: 0.3.9 eslint-import-resolver-node: 0.3.9
eslint-module-utils: 2.9.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0) eslint-module-utils: 2.9.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1)
hasown: 2.0.2 hasown: 2.0.2
is-core-module: 2.15.1 is-core-module: 2.15.1
is-glob: 4.0.3 is-glob: 4.0.3
@ -3860,13 +3863,13 @@ snapshots:
semver: 6.3.1 semver: 6.3.1
tsconfig-paths: 3.15.0 tsconfig-paths: 3.15.0
optionalDependencies: optionalDependencies:
'@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/parser': 7.2.0(eslint@8.57.1)(typescript@5.6.2)
transitivePeerDependencies: transitivePeerDependencies:
- eslint-import-resolver-typescript - eslint-import-resolver-typescript
- eslint-import-resolver-webpack - eslint-import-resolver-webpack
- supports-color - supports-color
eslint-plugin-jsx-a11y@6.10.0(eslint@8.57.0): eslint-plugin-jsx-a11y@6.10.0(eslint@8.57.1):
dependencies: dependencies:
aria-query: 5.1.3 aria-query: 5.1.3
array-includes: 3.1.8 array-includes: 3.1.8
@ -3877,7 +3880,7 @@ snapshots:
damerau-levenshtein: 1.0.8 damerau-levenshtein: 1.0.8
emoji-regex: 9.2.2 emoji-regex: 9.2.2
es-iterator-helpers: 1.0.19 es-iterator-helpers: 1.0.19
eslint: 8.57.0 eslint: 8.57.1
hasown: 2.0.2 hasown: 2.0.2
jsx-ast-utils: 3.3.5 jsx-ast-utils: 3.3.5
language-tags: 1.0.9 language-tags: 1.0.9
@ -3886,20 +3889,20 @@ snapshots:
safe-regex-test: 1.0.3 safe-regex-test: 1.0.3
string.prototype.includes: 2.0.0 string.prototype.includes: 2.0.0
eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.3): eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.3.3):
dependencies: dependencies:
eslint: 8.57.0 eslint: 8.57.1
prettier: 3.3.3 prettier: 3.3.3
prettier-linter-helpers: 1.0.0 prettier-linter-helpers: 1.0.0
synckit: 0.9.1 synckit: 0.9.1
optionalDependencies: optionalDependencies:
eslint-config-prettier: 9.1.0(eslint@8.57.0) eslint-config-prettier: 9.1.0(eslint@8.57.1)
eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): eslint-plugin-react-hooks@4.6.2(eslint@8.57.1):
dependencies: dependencies:
eslint: 8.57.0 eslint: 8.57.1
eslint-plugin-react@7.36.1(eslint@8.57.0): eslint-plugin-react@7.37.1(eslint@8.57.1):
dependencies: dependencies:
array-includes: 3.1.8 array-includes: 3.1.8
array.prototype.findlast: 1.2.5 array.prototype.findlast: 1.2.5
@ -3907,7 +3910,7 @@ snapshots:
array.prototype.tosorted: 1.1.4 array.prototype.tosorted: 1.1.4
doctrine: 2.1.0 doctrine: 2.1.0
es-iterator-helpers: 1.0.19 es-iterator-helpers: 1.0.19
eslint: 8.57.0 eslint: 8.57.1
estraverse: 5.3.0 estraverse: 5.3.0
hasown: 2.0.2 hasown: 2.0.2
jsx-ast-utils: 3.3.5 jsx-ast-utils: 3.3.5
@ -3928,13 +3931,13 @@ snapshots:
eslint-visitor-keys@3.4.3: {} eslint-visitor-keys@3.4.3: {}
eslint@8.57.0: eslint@8.57.1:
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1)
'@eslint-community/regexpp': 4.11.0 '@eslint-community/regexpp': 4.11.0
'@eslint/eslintrc': 2.1.4 '@eslint/eslintrc': 2.1.4
'@eslint/js': 8.57.0 '@eslint/js': 8.57.1
'@humanwhocodes/config-array': 0.11.14 '@humanwhocodes/config-array': 0.13.0
'@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/module-importer': 1.0.1
'@nodelib/fs.walk': 1.2.8 '@nodelib/fs.walk': 1.2.8
'@ungap/structured-clone': 1.2.0 '@ungap/structured-clone': 1.2.0
@ -4056,7 +4059,7 @@ snapshots:
fn.name@1.1.0: {} fn.name@1.1.0: {}
follow-redirects@1.15.8: {} follow-redirects@1.15.9: {}
for-each@0.3.3: for-each@0.3.3:
dependencies: dependencies:
@ -4855,28 +4858,28 @@ snapshots:
possible-typed-array-names@1.0.0: {} possible-typed-array-names@1.0.0: {}
postcss-import@15.1.0(postcss@8.4.45): postcss-import@15.1.0(postcss@8.4.47):
dependencies: dependencies:
postcss: 8.4.45 postcss: 8.4.47
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
read-cache: 1.0.0 read-cache: 1.0.0
resolve: 1.22.8 resolve: 1.22.8
postcss-js@4.0.1(postcss@8.4.45): postcss-js@4.0.1(postcss@8.4.47):
dependencies: dependencies:
camelcase-css: 2.0.1 camelcase-css: 2.0.1
postcss: 8.4.45 postcss: 8.4.47
postcss-load-config@4.0.2(postcss@8.4.45): postcss-load-config@4.0.2(postcss@8.4.47):
dependencies: dependencies:
lilconfig: 3.1.2 lilconfig: 3.1.2
yaml: 2.5.1 yaml: 2.5.1
optionalDependencies: optionalDependencies:
postcss: 8.4.45 postcss: 8.4.47
postcss-nested@6.2.0(postcss@8.4.45): postcss-nested@6.2.0(postcss@8.4.47):
dependencies: dependencies:
postcss: 8.4.45 postcss: 8.4.47
postcss-selector-parser: 6.1.2 postcss-selector-parser: 6.1.2
postcss-selector-parser@6.1.2: postcss-selector-parser@6.1.2:
@ -4892,11 +4895,11 @@ snapshots:
picocolors: 1.1.0 picocolors: 1.1.0
source-map-js: 1.2.0 source-map-js: 1.2.0
postcss@8.4.45: postcss@8.4.47:
dependencies: dependencies:
nanoid: 3.3.7 nanoid: 3.3.7
picocolors: 1.1.0 picocolors: 1.1.0
source-map-js: 1.2.0 source-map-js: 1.2.1
prelude-ls@1.2.1: {} prelude-ls@1.2.1: {}
@ -5202,6 +5205,8 @@ snapshots:
source-map-js@1.2.0: {} source-map-js@1.2.0: {}
source-map-js@1.2.1: {}
split-ca@1.0.1: {} split-ca@1.0.1: {}
ssh2@1.15.0: ssh2@1.15.0:
@ -5370,11 +5375,11 @@ snapshots:
normalize-path: 3.0.0 normalize-path: 3.0.0
object-hash: 3.0.0 object-hash: 3.0.0
picocolors: 1.1.0 picocolors: 1.1.0
postcss: 8.4.45 postcss: 8.4.47
postcss-import: 15.1.0(postcss@8.4.45) postcss-import: 15.1.0(postcss@8.4.47)
postcss-js: 4.0.1(postcss@8.4.45) postcss-js: 4.0.1(postcss@8.4.47)
postcss-load-config: 4.0.2(postcss@8.4.45) postcss-load-config: 4.0.2(postcss@8.4.47)
postcss-nested: 6.2.0(postcss@8.4.45) postcss-nested: 6.2.0(postcss@8.4.47)
postcss-selector-parser: 6.1.2 postcss-selector-parser: 6.1.2
resolve: 1.22.8 resolve: 1.22.8
sucrase: 3.35.0 sucrase: 3.35.0
@ -5449,9 +5454,9 @@ snapshots:
triple-beam@1.4.1: {} triple-beam@1.4.1: {}
ts-api-utils@1.3.0(typescript@5.5.4): ts-api-utils@1.3.0(typescript@5.6.2):
dependencies: dependencies:
typescript: 5.5.4 typescript: 5.6.2
ts-interface-checker@0.1.13: {} ts-interface-checker@0.1.13: {}
@ -5510,7 +5515,7 @@ snapshots:
is-typed-array: 1.1.13 is-typed-array: 1.1.13
possible-typed-array-names: 1.0.0 possible-typed-array-names: 1.0.0
typescript@5.5.4: {} typescript@5.6.2: {}
unbox-primitive@1.0.2: unbox-primitive@1.0.2:
dependencies: dependencies:

@ -953,5 +953,11 @@
"reminders": "Reminders", "reminders": "Reminders",
"nextReminder": "Next Reminder", "nextReminder": "Next Reminder",
"none": "None" "none": "None"
},
"vikunja": {
"projects": "Active Projects",
"tasks7d": "Tasks Due This Week",
"tasksOverdue": "Overdue Tasks",
"tasksInProgress": "Tasks In Progress"
} }
} }

@ -13,6 +13,7 @@ export default function Item({ bookmark }) {
<a <a
href={bookmark.href} href={bookmark.href}
title={bookmark.name} title={bookmark.name}
rel="noreferrer"
target={bookmark.target ?? settings.target ?? "_blank"} target={bookmark.target ?? settings.target ?? "_blank"}
className={classNames( className={classNames(
settings.cardBlur !== undefined && `backdrop-blur${settings.cardBlur.length ? "-" : ""}${settings.cardBlur}`, settings.cardBlur !== undefined && `backdrop-blur${settings.cardBlur.length ? "-" : ""}${settings.cardBlur}`,

@ -21,7 +21,7 @@ export default async function handler(req, res) {
if (!widget) { if (!widget) {
logger.debug("Unknown proxy service type: %s", type); logger.debug("Unknown proxy service type: %s", type);
return res.status(403).json({ error: "Unkown proxy service type" }); return res.status(403).json({ error: "Unknown proxy service type" });
} }
const serviceProxyHandler = widget.proxyHandler || genericProxyHandler; const serviceProxyHandler = widget.proxyHandler || genericProxyHandler;
@ -107,7 +107,7 @@ export default async function handler(req, res) {
} }
logger.debug("Unknown proxy service type: %s", type); logger.debug("Unknown proxy service type: %s", type);
return res.status(403).json({ error: "Unkown proxy service type" }); return res.status(403).json({ error: "Unknown proxy service type" });
} catch (e) { } catch (e) {
if (e) logger.error(e); if (e) logger.error(e);
return res.status(500).send({ error: "Unexpected error" }); return res.status(500).send({ error: "Unexpected error" });

@ -406,7 +406,7 @@ export function cleanServiceGroups(groups) {
// frigate // frigate
enableRecentEvents, enableRecentEvents,
// glances, mealie, pihole, pfsense // glances, immich, mealie, pihole, pfsense
version, version,
// glances // glances
@ -478,6 +478,9 @@ export function cleanServiceGroups(groups) {
// unifi // unifi
site, site,
// vikunja
enableTaskList,
// wgeasy // wgeasy
threshold, threshold,
@ -568,8 +571,8 @@ export function cleanServiceGroups(groups) {
if (snapshotHost) cleanedService.widget.snapshotHost = snapshotHost; if (snapshotHost) cleanedService.widget.snapshotHost = snapshotHost;
if (snapshotPath) cleanedService.widget.snapshotPath = snapshotPath; if (snapshotPath) cleanedService.widget.snapshotPath = snapshotPath;
} }
if (["glances", "mealie", "pfsense", "pihole"].includes(type)) { if (["glances", "immich", "mealie", "pfsense", "pihole"].includes(type)) {
if (version) cleanedService.widget.version = version; if (version) cleanedService.widget.version = parseInt(version, 10);
} }
if (type === "glances") { if (type === "glances") {
if (metric) cleanedService.widget.metric = metric; if (metric) cleanedService.widget.metric = metric;
@ -631,7 +634,10 @@ export function cleanServiceGroups(groups) {
if (range !== undefined) cleanedService.widget.range = range; if (range !== undefined) cleanedService.widget.range = range;
} }
if (type === "lubelogger") { if (type === "lubelogger") {
if (vehicleID !== undefined) cleanedService.widget.vehicleID = vehicleID; if (vehicleID !== undefined) cleanedService.widget.vehicleID = parseInt(vehicleID, 10);
}
if (type === "vikunja") {
if (enableTaskList !== undefined) cleanedService.widget.enableTaskList = !!enableTaskList;
} }
} }

@ -41,9 +41,11 @@ export default async function credentialedProxyHandler(req, res, map) {
"ghostfolio", "ghostfolio",
"linkwarden", "linkwarden",
"mealie", "mealie",
"netalertx",
"tailscale", "tailscale",
"tandoor", "tandoor",
"pterodactyl", "pterodactyl",
"vikunja",
].includes(widget.type) ].includes(widget.type)
) { ) {
headers.Authorization = `Bearer ${widget.key}`; headers.Authorization = `Bearer ${widget.key}`;

@ -125,6 +125,7 @@ const components = {
uptimekuma: dynamic(() => import("./uptimekuma/component")), uptimekuma: dynamic(() => import("./uptimekuma/component")),
uptimerobot: dynamic(() => import("./uptimerobot/component")), uptimerobot: dynamic(() => import("./uptimerobot/component")),
urbackup: dynamic(() => import("./urbackup/component")), urbackup: dynamic(() => import("./urbackup/component")),
vikunja: dynamic(() => import("./vikunja/component")),
watchtower: dynamic(() => import("./watchtower/component")), watchtower: dynamic(() => import("./watchtower/component")),
wgeasy: dynamic(() => import("./wgeasy/component")), wgeasy: dynamic(() => import("./wgeasy/component")),
whatsupdocker: dynamic(() => import("./whatsupdocker/component")), whatsupdocker: dynamic(() => import("./whatsupdocker/component")),

@ -8,11 +8,19 @@ export default function Component({ service }) {
const { t } = useTranslation(); const { t } = useTranslation();
const { widget } = service; const { widget } = service;
const { data: versionData, error: versionError } = useWidgetAPI(widget, "version"); const { version = 1 } = widget;
const versionEndpoint = version === 2 ? "version_v2" : "version";
const { data: versionData, error: versionError } = useWidgetAPI(widget, versionEndpoint);
let statsEndpoint = version === 2 ? "statistics_v2" : "stats";
if (version === 1) {
// see https://github.com/gethomepage/homepage/issues/2282 // see https://github.com/gethomepage/homepage/issues/2282
const endpoint = statsEndpoint =
versionData?.major > 1 || (versionData?.major === 1 && versionData?.minor > 84) ? "statistics" : "stats"; versionData?.major > 1 || (versionData?.major === 1 && versionData?.minor > 84) ? "statistics" : "stats";
const { data: immichData, error: immichError } = useWidgetAPI(widget, endpoint); }
const { data: immichData, error: immichError } = useWidgetAPI(widget, statsEndpoint);
if (immichError || versionError || immichData?.statusCode === 401) { if (immichError || versionError || immichData?.statusCode === 401) {
return <Container service={service} error={immichData ?? immichError ?? versionError} />; return <Container service={service} error={immichData ?? immichError ?? versionError} />;

@ -1,18 +1,24 @@
import credentialedProxyHandler from "utils/proxy/handlers/credentialed"; import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
const widget = { const widget = {
api: "{url}/api/server-info/{endpoint}", api: "{url}/api/{endpoint}",
proxyHandler: credentialedProxyHandler, proxyHandler: credentialedProxyHandler,
mappings: { mappings: {
version: { version: {
endpoint: "version", endpoint: "server-info/version",
}, },
statistics: { statistics: {
endpoint: "statistics", endpoint: "server-info/statistics",
}, },
stats: { stats: {
endpoint: "stats", endpoint: "server-info/stats",
},
version_v2: {
endpoint: "server/version",
},
statistics_v2: {
endpoint: "server/statistics",
}, },
}, },
}; };

@ -25,9 +25,9 @@ export default function Component({ service }) {
} }
const domains = resultData.length; const domains = resultData.length;
const mailboxes = resultData.reduce((acc, val) => acc + val.mboxes_in_domain, 0); const mailboxes = resultData.reduce((acc, val) => acc + parseInt(val.mboxes_in_domain, 10), 0);
const mails = resultData.reduce((acc, val) => acc + val.msgs_total, 0); const mails = resultData.reduce((acc, val) => acc + parseInt(val.msgs_total, 10), 0);
const storage = resultData.reduce((acc, val) => acc + val.bytes_total, 0); const storage = resultData.reduce((acc, val) => acc + parseInt(val.bytes_total, 10), 0);
return ( return (
<Container service={service}> <Container service={service}>

@ -1,8 +1,8 @@
import genericProxyHandler from "utils/proxy/handlers/generic"; import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
const widget = { const widget = {
api: "{url}/php/server/devices.php?action=getDevicesTotals", api: "{url}/php/server/devices.php?action=getDevicesTotals",
proxyHandler: genericProxyHandler, proxyHandler: credentialedProxyHandler,
mappings: { mappings: {
data: { data: {

@ -0,0 +1,68 @@
import { useTranslation } from "next-i18next";
import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
import useWidgetAPI from "utils/proxy/use-widget-api";
export default function Component({ service }) {
const { t } = useTranslation();
const { widget } = service;
const { data: projectsData, error: projectsError } = useWidgetAPI(widget, "projects");
const { data: tasksData, error: tasksError } = useWidgetAPI(widget, "tasks");
if (projectsError || tasksError) {
return <Container service={service} error={projectsError ?? tasksError} />;
}
if (!projectsData || !tasksData) {
return (
<Container service={service}>
<Block label="vikunja.projects" />
<Block label="vikunja.tasks7d" />
<Block label="vikunja.tasksOverdue" />
<Block label="vikunja.tasksInProgress" />
</Container>
);
}
const projects = projectsData.filter((project) => project.id > 0); // saved filters have id < 0
const oneWeekFromNow = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000);
const tasksWithDueDate = tasksData.filter((task) => !task.dueDateIsDefault);
const tasks7d = tasksWithDueDate.filter((task) => new Date(task.dueDate) <= oneWeekFromNow);
const tasksOverdue = tasksWithDueDate.filter((task) => new Date(task.dueDate) <= new Date(Date.now()));
const tasksInProgress = tasksData.filter((task) => task.inProgress);
return (
<>
<Container service={service}>
<Block label="vikunja.projects" value={t("common.number", { value: projects.length })} />
<Block label="vikunja.tasks7d" value={t("common.number", { value: tasks7d.length })} />
<Block label="vikunja.tasksOverdue" value={t("common.number", { value: tasksOverdue.length })} />
<Block label="vikunja.tasksInProgress" value={t("common.number", { value: tasksInProgress.length })} />
</Container>
{widget.enableTaskList &&
tasksData.slice(0, 5).map((task) => (
<div
key={task.id}
className="text-theme-700 dark:text-theme-200 relative h-5 rounded-md bg-theme-200/50 dark:bg-theme-900/20 m-1 px-1 flex"
>
<div className="text-xs z-10 self-center ml-2 relative h-4 grow mr-2">
<div className="absolute w-full h-4 whitespace-nowrap text-ellipsis overflow-hidden text-left">
{task.title}
</div>
</div>
{!task.dueDateIsDefault && (
<div className="self-center text-xs flex justify-end mr-1.5 pl-1 z-10 text-ellipsis overflow-hidden whitespace-nowrap">
{t("common.relativeDate", {
value: task.dueDate,
formatParams: { value: { style: "narrow", numeric: "auto" } },
})}
</div>
)}
</div>
))}
</>
);
}

@ -0,0 +1,27 @@
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
import { asJson } from "utils/proxy/api-helpers";
const widget = {
api: `{url}/api/v1/{endpoint}`,
proxyHandler: credentialedProxyHandler,
mappings: {
projects: {
endpoint: "projects",
},
tasks: {
endpoint: "tasks/all?filter=done%3Dfalse&sort_by=due_date",
map: (data) =>
asJson(data).map((task) => ({
id: task.id,
title: task.title,
priority: task.priority,
dueDate: task.due_date,
dueDateIsDefault: task.due_date === "0001-01-01T00:00:00Z",
inProgress: task.percent_done > 0 && task.percent_done < 1,
})),
},
},
};
export default widget;

@ -38,7 +38,7 @@ export default function Component({ service }) {
<Container service={service}> <Container service={service}>
<Block label="wgeasy.connected" value={connected} /> <Block label="wgeasy.connected" value={connected} />
<Block label="wgeasy.enabled" value={enabled} /> <Block label="wgeasy.enabled" value={enabled} />
<Block label="wgeasy.diabled" value={disabled} /> <Block label="wgeasy.disabled" value={disabled} />
<Block label="wgeasy.total" value={infoData.length} /> <Block label="wgeasy.total" value={infoData.length} />
</Container> </Container>
); );

@ -115,6 +115,7 @@ import unifi from "./unifi/widget";
import unmanic from "./unmanic/widget"; import unmanic from "./unmanic/widget";
import uptimekuma from "./uptimekuma/widget"; import uptimekuma from "./uptimekuma/widget";
import uptimerobot from "./uptimerobot/widget"; import uptimerobot from "./uptimerobot/widget";
import vikunja from "./vikunja/widget";
import watchtower from "./watchtower/widget"; import watchtower from "./watchtower/widget";
import wgeasy from "./wgeasy/widget"; import wgeasy from "./wgeasy/widget";
import whatsupdocker from "./whatsupdocker/widget"; import whatsupdocker from "./whatsupdocker/widget";
@ -246,6 +247,7 @@ const widgets = {
uptimekuma, uptimekuma,
uptimerobot, uptimerobot,
urbackup, urbackup,
vikunja,
watchtower, watchtower,
wgeasy, wgeasy,
whatsupdocker, whatsupdocker,

Loading…
Cancel
Save