From d0274674a0c75e290a2eace23ce0d3483acf4a2e Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Thu, 21 May 2026 22:42:52 +0200 Subject: [PATCH] =?UTF-8?q?feat(licenses):=20Task=20#25=20step=201=20?= =?UTF-8?q?=E2=80=94=20SourceBadge=20in=20atomic-controls=20+=20correct=20?= =?UTF-8?q?LicenseRuleBadge=20labels?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Per the SDK-Modul Attribution-Matrix (project_sdk_module_attribution_matrix.md), the controls/atomic-controls listings render canonical_controls directly and are the highest-audit-visibility integration point for Stufe 3. Two changes: 1. atomic-controls/page.tsx: embed next to the existing badge row in each control item. The badge fetches /api/compliance/licenses/source-info/{uuid} on first hover and reveals the source regulation, license type, and attribution text in a tooltip. 2. control-library/components/helpers.tsx: fix LicenseRuleBadge labels. The existing pill said "Free Use / Zitation / Reformuliert" — exactly the inverted understanding of the rules that Task #21 surfaced. Corrected to R1 (verbatim, Hoheitsrecht/PD), R2 (verbatim + attribution), R3 (identifier only). Added native title attribute for hover-explanation; the existing ControlListItem in control-library now shows the right semantics without any other code change. Next module per matrix: VVT (Bundeslaender-Vorlagen) and DSFA. --- .../app/sdk/atomic-controls/page.tsx | 2 ++ .../control-library/components/helpers.tsx | 21 ++++++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/admin-compliance/app/sdk/atomic-controls/page.tsx b/admin-compliance/app/sdk/atomic-controls/page.tsx index 7e21afc6..a19432ba 100644 --- a/admin-compliance/app/sdk/atomic-controls/page.tsx +++ b/admin-compliance/app/sdk/atomic-controls/page.tsx @@ -13,6 +13,7 @@ import { CATEGORY_OPTIONS, } from '../control-library/components/helpers' import { ControlDetail } from '../control-library/components/ControlDetail' +import { SourceBadge } from '@/components/sdk/SourceBadge' // ============================================================================= // TYPES @@ -310,6 +311,7 @@ export default function AtomicControlsPage() { +

{ctrl.title}

{ctrl.objective}

diff --git a/admin-compliance/app/sdk/control-library/components/helpers.tsx b/admin-compliance/app/sdk/control-library/components/helpers.tsx index 2495a2d1..43be2a7e 100644 --- a/admin-compliance/app/sdk/control-library/components/helpers.tsx +++ b/admin-compliance/app/sdk/control-library/components/helpers.tsx @@ -232,14 +232,25 @@ export function StateBadge({ state }: { state: string }) { export function LicenseRuleBadge({ rule }: { rule: number | null | undefined }) { if (!rule) return null - const config: Record = { - 1: { bg: 'bg-green-100 text-green-700', label: 'Free Use' }, - 2: { bg: 'bg-blue-100 text-blue-700', label: 'Zitation' }, - 3: { bg: 'bg-amber-100 text-amber-700', label: 'Reformuliert' }, + // Corrected labels per Task #21 LICENSE_RULES.md mapping: + // R1 = woertlich (Hoheitsrecht/Public Domain, no attribution required) + // R2 = woertlich + Attribution-Pflicht (CC-BY, OWASP, OECD, ENISA) + // R3 = nur Identifier zitieren (DIN/ANSI/IEC/DGUV/proprietary — pipeline drops full text) + const config: Record = { + 1: { bg: 'bg-emerald-100 text-emerald-800', label: 'R1', title: 'Woertlich uebernehmbar (Hoheitsrecht/Public Domain)' }, + 2: { bg: 'bg-amber-100 text-amber-800', label: 'R2', title: 'Woertlich mit Attribution (CC-BY/OWASP/OECD/ENISA)' }, + 3: { bg: 'bg-slate-100 text-slate-700', label: 'R3', title: 'Nur Identifier-Verweis (DIN/ANSI/IEC/proprietaer)' }, } const c = config[rule] if (!c) return null - return {c.label} + return ( + + {c.label} + + ) } export function VerificationMethodBadge({ method }: { method: string | null }) {