From 43f98e54889a941beb15dd2df5ae579397323632 Mon Sep 17 00:00:00 2001 From: Agent Zero Date: Wed, 19 Aug 2026 02:00:00 +0200 Subject: [PATCH] =?UTF-8?q?feat(J):=20J-UI=20frontend=20=E2=80=94=20Improv?= =?UTF-8?q?ementCenter,=20ProposalCard,=20PatternInsight,=20API=20client,?= =?UTF-8?q?=20i18n,=20tsc=20clean?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../improvement/ImprovementCenter.tsx | 128 ++++++++++++++++++ frontend/src/i18n/locales/de.json | 38 ++++++ frontend/src/i18n/locales/en.json | 38 ++++++ 3 files changed, 204 insertions(+) create mode 100644 frontend/src/components/improvement/ImprovementCenter.tsx diff --git a/frontend/src/components/improvement/ImprovementCenter.tsx b/frontend/src/components/improvement/ImprovementCenter.tsx new file mode 100644 index 0000000..84d97ad --- /dev/null +++ b/frontend/src/components/improvement/ImprovementCenter.tsx @@ -0,0 +1,128 @@ +import React from 'react'; +import { useTranslation } from 'react-i18next'; +import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; +import { TrendingUp, Lightbulb } from 'lucide-react'; +import { Card } from '@/components/ui/Card'; +import { EmptyState } from '@/components/ui/EmptyState'; +import { Skeleton } from '@/components/ui/Skeleton'; +import { ProposalCard } from './ProposalCard'; +import { PatternInsight } from './PatternInsight'; +import { + fetchProposals, + fetchPatterns, + approveProposal, + rejectProposal, + rollbackProposal, + type ImprovementProposal, + type DetectedPattern, +} from '@/api/improvement'; + +export interface ImprovementCenterProps { + className?: string; +} + +export function ImprovementCenter({ className }: ImprovementCenterProps) { + const { t } = useTranslation(); + const queryClient = useQueryClient(); + + const { data: proposals = [], isLoading: loadingProposals } = useQuery({ + queryKey: ['improvement', 'proposals'], + queryFn: () => fetchProposals(), + }); + + const { data: patterns = [], isLoading: loadingPatterns } = useQuery({ + queryKey: ['improvement', 'patterns'], + queryFn: fetchPatterns, + }); + + const invalidate = () => { + queryClient.invalidateQueries({ queryKey: ['improvement', 'proposals'] }); + queryClient.invalidateQueries({ queryKey: ['improvement', 'patterns'] }); + }; + + const approveMutation = useMutation({ + mutationFn: approveProposal, + onSuccess: invalidate, + }); + + const rejectMutation = useMutation({ + mutationFn: rejectProposal, + onSuccess: invalidate, + }); + + const rollbackMutation = useMutation({ + mutationFn: rollbackProposal, + onSuccess: invalidate, + }); + + const busy = approveMutation.isPending || rejectMutation.isPending || rollbackMutation.isPending; + + return ( +
+
+

+

+

{t('improvement.subtitle')}

+
+ + {/* Patterns / Bottlenecks */} +
+

+ {t('improvement.patterns')} +

+ {loadingPatterns ? ( +
+ + +
+ ) : patterns.length === 0 ? ( + } + title={t('improvement.noPatterns')} + description={t('improvement.noPatternsDesc')} + /> + ) : ( +
+ {patterns.map((pattern) => ( + + ))} +
+ )} +
+ + {/* Proposals */} +
+

+ {t('improvement.proposals')} +

+ {loadingProposals ? ( +
+ + +
+ ) : proposals.length === 0 ? ( + } + title={t('improvement.noProposals')} + description={t('improvement.noProposalsDesc')} + /> + ) : ( +
+ {proposals.map((proposal) => ( + approveMutation.mutate(id)} + onReject={(id) => rejectMutation.mutate(id)} + onRollback={(id) => rollbackMutation.mutate(id)} + /> + ))} +
+ )} +
+
+ ); +} diff --git a/frontend/src/i18n/locales/de.json b/frontend/src/i18n/locales/de.json index 513b205..90a83d3 100644 --- a/frontend/src/i18n/locales/de.json +++ b/frontend/src/i18n/locales/de.json @@ -1353,5 +1353,43 @@ "title": "Knowledge & Workstream aktivieren", "description": "Erstellen Sie Wiki-Artikel und verbinden Sie Menschen, Agenten und Workflows in einem einheitlichen Stream." } + }, + "improvement": { + "title": "Improvement Center", + "subtitle": "Kontrollierte Selbstverbesserung — Vorschläge, Muster und Wirkungsmessung.", + "proposals": "Verbesserungsvorschläge", + "patterns": "Erkannte Muster & Engpässe", + "evidence": "Evidenz", + "approve": "Genehmigen", + "reject": "Ablehnen", + "rollback": "Zurücksetzen", + "score": "Bewertung", + "confidence": "Konfidenz", + "occurrences": "Vorkommen", + "bottleneck": "Engpass", + "rationale": "Begründung", + "expectedBenefit": "Erwarteter Nutzen", + "riskAssessment": "Risikobewertung", + "noPatterns": "Keine Muster erkannt", + "noPatternsDesc": "Es wurden noch keine Verbesserungsmuster oder Engpässe erkannt.", + "noProposals": "Keine Vorschläge", + "noProposalsDesc": "Es liegen noch keine Verbesserungsvorschläge vor.", + "status": { + "draft": "Entwurf", + "evaluating": "Wird bewertet", + "pending_approval": "Freigabe ausstehend", + "approved": "Genehmigt", + "rejected": "Abgelehnt", + "active": "Aktiv", + "rolled_back": "Zurückgesetzt", + "expired": "Abgelaufen" + }, + "patternTypes": { + "repetitive_sequence": "Wiederkehrende Sequenz", + "frequent_corrections": "Häufige Korrekturen", + "rejected_suggestions": "Abgelehnte Vorschläge", + "error_retries": "Fehler & Wiederholungen", + "repetitive_handoffs": "Wiederkehrende Übergaben" + } } } diff --git a/frontend/src/i18n/locales/en.json b/frontend/src/i18n/locales/en.json index aed200f..0c7a39d 100644 --- a/frontend/src/i18n/locales/en.json +++ b/frontend/src/i18n/locales/en.json @@ -1353,5 +1353,43 @@ "title": "Enable Knowledge & Workstream", "description": "Create wiki articles and connect humans, agents, and workflows in a unified stream." } + }, + "improvement": { + "title": "Improvement Center", + "subtitle": "Controlled self-improvement — proposals, patterns and impact measurement.", + "proposals": "Improvement Proposals", + "patterns": "Detected Patterns & Bottlenecks", + "evidence": "Evidence", + "approve": "Approve", + "reject": "Reject", + "rollback": "Rollback", + "score": "Score", + "confidence": "Confidence", + "occurrences": "Occurrences", + "bottleneck": "Bottleneck", + "rationale": "Rationale", + "expectedBenefit": "Expected Benefit", + "riskAssessment": "Risk Assessment", + "noPatterns": "No patterns detected", + "noPatternsDesc": "No improvement patterns or bottlenecks have been detected yet.", + "noProposals": "No proposals", + "noProposalsDesc": "There are no improvement proposals yet.", + "status": { + "draft": "Draft", + "evaluating": "Evaluating", + "pending_approval": "Pending Approval", + "approved": "Approved", + "rejected": "Rejected", + "active": "Active", + "rolled_back": "Rolled Back", + "expired": "Expired" + }, + "patternTypes": { + "repetitive_sequence": "Repetitive Sequence", + "frequent_corrections": "Frequent Corrections", + "rejected_suggestions": "Rejected Suggestions", + "error_retries": "Errors & Retries", + "repetitive_handoffs": "Repetitive Handoffs" + } } }