From 22e81838461bca224165c634a970ad9dfe9804fb Mon Sep 17 00:00:00 2001 From: Albrecht Degering Date: Wed, 22 Jul 2026 08:48:42 +0200 Subject: [PATCH] fix(webui): translate MetricCard content --- webui/package.json | 1 + webui/src/components/MetricCard.tsx | 11 ++++++++--- webui/tests/metric-card.test.tsx | 26 ++++++++++++++++++++++++++ webui/tsconfig.component-tests.json | 2 ++ 4 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 webui/tests/metric-card.test.tsx diff --git a/webui/package.json b/webui/package.json index 6f3f711..dfc2a72 100644 --- a/webui/package.json +++ b/webui/package.json @@ -29,6 +29,7 @@ "test:module-capabilities": "rm -rf .module-test-build && mkdir -p .module-test-build && printf '{\"type\":\"commonjs\"}\n' > .module-test-build/package.json && tsc -p tsconfig.module-tests.json && node .module-test-build/tests/module-capabilities.test.js && node .module-test-build/tests/privacy-policy.test.js && node .module-test-build/tests/help-context.test.js", "test:module-permutations": "node scripts/test-module-permutations.mjs", "test:mail-components": "rm -rf .component-test-build && mkdir -p .component-test-build && printf '{\"type\":\"commonjs\"}\\n' > .component-test-build/package.json && tsc -p tsconfig.component-tests.json && node .component-test-build/tests/mail-components.test.js", + "test:metric-card": "rm -rf .component-test-build && mkdir -p .component-test-build && printf '{\"type\":\"commonjs\"}\\n' > .component-test-build/package.json && tsc -p tsconfig.component-tests.json && node .component-test-build/tests/metric-card.test.js", "test:people-picker": "rm -rf .component-test-build && mkdir -p .component-test-build && printf '{\"type\":\"commonjs\"}\\n' > .component-test-build/package.json && tsc -p tsconfig.component-tests.json && node .component-test-build/tests/people-picker.test.js", "test:resource-access": "rm -rf .component-test-build && mkdir -p .component-test-build && printf '{\"type\":\"commonjs\"}\\n' > .component-test-build/package.json && tsc -p tsconfig.component-tests.json && node .component-test-build/tests/resource-access-explanation.test.js", "test:selection-list": "rm -rf .component-test-build && mkdir -p .component-test-build && printf '{\"type\":\"commonjs\"}\\n' > .component-test-build/package.json && tsc -p tsconfig.component-tests.json && node .component-test-build/tests/selection-list.test.js" diff --git a/webui/src/components/MetricCard.tsx b/webui/src/components/MetricCard.tsx index b8293d1..870eebc 100644 --- a/webui/src/components/MetricCard.tsx +++ b/webui/src/components/MetricCard.tsx @@ -1,9 +1,14 @@ +import { usePlatformLanguage } from "../i18n/LanguageContext"; + export default function MetricCard({ label, value, tone = "neutral", detail }: { label: string; value: string | number; tone?: "neutral" | "good" | "warning" | "danger" | "info"; detail?: string }) { + const { translateText } = usePlatformLanguage(); + const renderedValue = typeof value === "string" ? translateText(value) : value; + return (
-
{label}
-
{value}
- {detail &&
{detail}
} +
{translateText(label)}
+
{renderedValue}
+ {detail &&
{translateText(detail)}
}
); } diff --git a/webui/tests/metric-card.test.tsx b/webui/tests/metric-card.test.tsx new file mode 100644 index 0000000..0891f7d --- /dev/null +++ b/webui/tests/metric-card.test.tsx @@ -0,0 +1,26 @@ +function assert(condition: unknown, message = "assertion failed"): void { + if (!condition) throw new Error(message); +} + +import { renderToStaticMarkup } from "react-dom/server"; +import MetricCard from "../src/components/MetricCard"; +import { PlatformLanguageProvider } from "../src/i18n/LanguageContext"; + +const translatedMarkup = renderToStaticMarkup( + + + +); + +assert(translatedMarkup.includes('class="metric-card metric-info"'), "the visual tone is preserved"); +assert(translatedMarkup.includes('class="metric-label">Installed modules'), "the label is translated"); +assert(translatedMarkup.includes('class="metric-value">Core only'), "a string value is translated"); +assert(!translatedMarkup.includes("i18n:govoplan-core."), "translation keys never leak into visible card text"); + +const numericMarkup = renderToStaticMarkup(); +assert(numericMarkup.includes('class="metric-value">7'), "numeric values are preserved"); diff --git a/webui/tsconfig.component-tests.json b/webui/tsconfig.component-tests.json index 0e41d2b..71bed4f 100644 --- a/webui/tsconfig.component-tests.json +++ b/webui/tsconfig.component-tests.json @@ -23,6 +23,7 @@ "tests/explorer-tree.test.tsx", "tests/icon-button.test.tsx", "tests/mail-components.test.tsx", + "tests/metric-card.test.tsx", "tests/people-picker.test.tsx", "tests/resource-access-explanation.test.tsx", "tests/selection-list.test.tsx", @@ -30,6 +31,7 @@ "src/components/email/EmailAddressInput.tsx", "src/components/PasswordField.tsx", "src/components/MessageDisplayPanel.tsx", + "src/components/MetricCard.tsx", "src/components/people/PeoplePicker.tsx", "src/components/people/peoplePickerTypes.ts", "src/components/ResourceAccessExplanation.tsx",