/** * Redmine Statistics View (Phase 2 placeholder). * * Will render a ``FormGeneratorReport`` driven by ``getRedmineStatsApi`` * with a ``PeriodPicker`` and tracker-filter. For now: shows the raw * KPIs so the wiring can be verified against the local mirror. */ import React, { useCallback, useEffect, useState } from 'react'; import { useApiRequest } from '../../../hooks/useApi'; import { useInstanceId } from '../../../hooks/useCurrentInstance'; import { useLanguage } from '../../../providers/language/LanguageContext'; import { RedmineStats, getRedmineStatsApi } from '../../../api/redmineApi'; import styles from './RedmineViews.module.css'; export const RedmineStatsView: React.FC = () => { const { t } = useLanguage(); const { request } = useApiRequest(); const instanceId = useInstanceId(); const [stats, setStats] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const _load = useCallback(async () => { if (!instanceId) return; setLoading(true); setError(null); try { const result = await getRedmineStatsApi(request, instanceId, { bucket: 'week' }); setStats(result); } catch (e: any) { setError(e?.message || t('Fehler beim Laden')); } finally { setLoading(false); } }, [request, instanceId, t]); useEffect(() => { _load(); }, [_load]); if (loading) return
{t('Statistik wird geladen ...')}
; return (

{t('Redmine -- Statistik')}

{t('Aggregiert aus dem lokalen Mirror. PeriodPicker und FormGeneratorReport folgen im naechsten Schritt.')}

{error &&
{error}
} {stats && (

{t('KPIs (gesamter Mirror)')}

{t('Tickets gesamt')}:
{stats.kpis.total}
{t('Offen')}:
{stats.kpis.open}
{t('Geschlossen')}:
{stats.kpis.closed}
{t('Im Zeitraum erstellt')}:
{stats.kpis.createdInPeriod}
{t('Im Zeitraum geschlossen')}:
{stats.kpis.closedInPeriod}
{t('Orphans (ohne Userstory)')}:
{stats.kpis.orphans}
)} {stats && stats.statusByTracker.length > 0 && (

{t('Status pro Tracker')}

    {stats.statusByTracker.map(entry => (
  • {entry.trackerName} ({entry.total}):{' '} {Object.entries(entry.countsByStatus) .map(([s, n]) => `${s}: ${n}`) .join(', ')}
  • ))}
)}
); }; export default RedmineStatsView;