+ {t("admin.section.encryption.loadError")} +
+ ); + } + + const s = statusQuery.data; + const running = s.rotation.state === "running" || rotate.isPending; + // Only the rows that share a coverage view need the per-column table; sort + // stale-first so an operator sees what still needs rotating. + const columns = [...s.columns].sort((a, b) => b.legacy - a.legacy); + + return ( ++ {t("admin.section.encryption.rotationState")}:{" "} + + {t(`admin.section.encryption.state.${s.rotation.state}`)} + +
+ {s.rotation.lastResult && ( ++ {t("admin.section.encryption.lastRun", { + scanned: s.rotation.lastResult.scanned, + rotated: s.rotation.lastResult.rotated, + errors: s.rotation.lastResult.errors, + })} +
+ )} ++ {t("admin.section.encryption.cliNote")} +
+| + {t("admin.section.encryption.colColumn")} + | ++ {t("admin.section.encryption.colTotal")} + | ++ {t("admin.section.encryption.colActive")} + | ++ {t("admin.section.encryption.colStale")} + | +
|---|---|---|---|
| + {c.model}.{c.field} + | +{c.total.toLocaleString()} | +{active.toLocaleString()} | +
+ {stale > 0 ? (
+ |
+
{label}
+{value}
+