diff --git a/docs/widgets/services/truenas.md b/docs/widgets/services/truenas.md
index 6d747ef1..24350490 100644
--- a/docs/widgets/services/truenas.md
+++ b/docs/widgets/services/truenas.md
@@ -9,6 +9,8 @@ Allowed fields: `["load", "uptime", "alerts"]`.
To create an API Key, follow [the official TrueNAS documentation](https://www.truenas.com/docs/scale/scaletutorials/toptoolbar/managingapikeys/).
+A detailed pool listing is disabled by default, but can be enabled with the `enablePools` option.
+
```yaml
widget:
type: truenas
@@ -16,4 +18,5 @@ widget:
username: user # not required if using api key
password: pass # not required if using api key
key: yourtruenasapikey # not required if using username / password
+ enablePools: true # optional, defaults to false
```
diff --git a/src/utils/config/service-helpers.js b/src/utils/config/service-helpers.js
index e203e6d7..67502a7a 100644
--- a/src/utils/config/service-helpers.js
+++ b/src/utils/config/service-helpers.js
@@ -442,6 +442,9 @@ export function cleanServiceGroups(groups) {
// sonarr, radarr
enableQueue,
+ // truenas
+ enablePools,
+
// unifi
site,
} = cleanedService.widget;
@@ -511,6 +514,9 @@ export function cleanServiceGroups(groups) {
if (["sonarr", "radarr"].includes(type)) {
if (enableQueue !== undefined) cleanedService.widget.enableQueue = JSON.parse(enableQueue);
}
+ if (type === "truenas") {
+ if (enablePools !== undefined) cleanedService.widget.enablePools = JSON.parse(enablePools);
+ }
if (["diskstation", "qnap"].includes(type)) {
if (volume) cleanedService.widget.volume = volume;
}
diff --git a/src/utils/proxy/handlers/credentialed.js b/src/utils/proxy/handlers/credentialed.js
index 0795efd5..bc087593 100644
--- a/src/utils/proxy/handlers/credentialed.js
+++ b/src/utils/proxy/handlers/credentialed.js
@@ -29,11 +29,15 @@ export default async function credentialedProxyHandler(req, res, map) {
} else if (widget.type === "gotify") {
headers["X-gotify-Key"] = `${widget.key}`;
} else if (
- ["authentik", "cloudflared", "ghostfolio", "mealie", "tailscale", "truenas", "pterodactyl"].includes(
- widget.type,
- )
+ ["authentik", "cloudflared", "ghostfolio", "mealie", "tailscale", "pterodactyl"].includes(widget.type)
) {
headers.Authorization = `Bearer ${widget.key}`;
+ } else if (widget.type === "truenas") {
+ if (widget.key) {
+ headers.Authorization = `Bearer ${widget.key}`;
+ } else {
+ headers.Authorization = `Basic ${Buffer.from(`${widget.username}:${widget.password}`).toString("base64")}`;
+ }
} else if (widget.type === "proxmox") {
headers.Authorization = `PVEAPIToken=${widget.username}=${widget.password}`;
} else if (widget.type === "proxmoxbackupserver") {
diff --git a/src/widgets/truenas/component.jsx b/src/widgets/truenas/component.jsx
index c1fc5c53..872d8c64 100644
--- a/src/widgets/truenas/component.jsx
+++ b/src/widgets/truenas/component.jsx
@@ -3,6 +3,7 @@ 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";
+import Pool from "widgets/truenas/pool";
export default function Component({ service }) {
const { t } = useTranslation();
@@ -11,9 +12,10 @@ export default function Component({ service }) {
const { data: alertData, error: alertError } = useWidgetAPI(widget, "alerts");
const { data: statusData, error: statusError } = useWidgetAPI(widget, "status");
+ const { data: poolsData, error: poolsError } = useWidgetAPI(widget, "pools");
- if (alertError || statusError) {
- const finalError = alertError ?? statusError;
+ if (alertError || statusError || poolsError) {
+ const finalError = alertError ?? statusError ?? poolsError;
return