diff --git a/src/widgets/truenas/component.jsx b/src/widgets/truenas/component.jsx index ccdab297..e83499f9 100644 --- a/src/widgets/truenas/component.jsx +++ b/src/widgets/truenas/component.jsx @@ -12,14 +12,15 @@ 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"); + const { data: poolsData, error: poolsError } = useWidgetAPI(widget, widget?.enablePools ? "pools" : null); + const { data: datasetData, error: datasetError } = useWidgetAPI(widget, widget?.enablePools ? "dataset" : null); if (alertError || statusError || poolsError) { - const finalError = alertError ?? statusError ?? poolsError; + const finalError = alertError ?? statusError ?? poolsError ?? datasetError; return ; } - if (!alertData || !statusData) { + if (!alertData || !statusData || (widget?.enablePools && (!poolsData || !datasetData))) { return ( @@ -29,7 +30,22 @@ export default function Component({ service }) { ); } - const enablePools = widget?.enablePools && Array.isArray(poolsData) && poolsData.length > 0; + let pools = []; + const showPools = + Array.isArray(poolsData) && poolsData.length > 0 && Array.isArray(datasetData) && datasetData.length > 0; + + if (showPools) { + pools = poolsData.map((pool) => { + const dataset = datasetData.find((d) => d.pool === pool.name && d.name === pool.name); + return { + id: pool.id, + name: pool.name, + healthy: pool.healthy, + allocated: dataset?.used.parsed ?? 0, + free: dataset?.available.parsed ?? 0, + }; + }); + } return ( <> @@ -38,19 +54,11 @@ export default function Component({ service }) { - {enablePools && - poolsData + {showPools && + pools .sort((a, b) => a.name.localeCompare(b.name)) .map((pool) => ( - + ))} ); diff --git a/src/widgets/truenas/pool.jsx b/src/widgets/truenas/pool.jsx index b92ecb68..7877526e 100644 --- a/src/widgets/truenas/pool.jsx +++ b/src/widgets/truenas/pool.jsx @@ -1,19 +1,9 @@ import classNames from "classnames"; -import prettyBytes from "pretty-bytes"; +import { useTranslation } from "next-i18next"; -export default function Pool({ name, free, allocated, healthy, data, nasType }) { - let total = 0; - if (nasType === "scale") { - total = free + allocated; - } else { - allocated = 0; // eslint-disable-line no-param-reassign - for (let i = 0; i < data.length; i += 1) { - total += data[i].stats.size; - allocated += data[i].stats.allocated; // eslint-disable-line no-param-reassign - } - } - - const usedPercent = Math.round((allocated / total) * 100); +export default function Pool({ name, free, allocated, healthy }) { + const { t } = useTranslation(); + const usedPercent = Math.round((allocated / (free + allocated)) * 100); const statusColor = healthy ? "bg-green-500" : "bg-yellow-500"; return ( @@ -32,7 +22,15 @@ export default function Pool({ name, free, allocated, healthy, data, nasType })
- {prettyBytes(allocated)} / {prettyBytes(total)} + {`${t("common.bytes", { + value: allocated, + maximumFractionDigits: 1, + binary: true, + })} / ${t("common.bytes", { + value: free + allocated, + maximumFractionDigits: 1, + binary: true, + })}`} ({usedPercent}%)
diff --git a/src/widgets/truenas/widget.js b/src/widgets/truenas/widget.js index 8e50956b..d322753f 100644 --- a/src/widgets/truenas/widget.js +++ b/src/widgets/truenas/widget.js @@ -23,11 +23,11 @@ const widget = { id: entry.name, name: entry.name, healthy: entry.healthy, - allocated: entry.allocated, - free: entry.free, - data: entry.topology?.data ?? [], })), }, + dataset: { + endpoint: "pool/dataset", + }, }, };