import { useState } from 'react'; import axios from '../services/api'; const sectionBox = { marginTop: '14px', padding: '14px', background: 'var(--surface-2)', border: '1px solid var(--border)', borderRadius: '12px', }; const EXAMPLES = [ { label: '* * * * *', value: '* * * * *' }, { label: '0 9 * * 1-5', value: '0 9 * * 1-5' }, { label: '0 0 1 * *', value: '0 0 1 * *' }, { label: '*/15 * * * *', value: '*/15 * * * *' }, ]; const FIELD_LABELS = [ { key: 'minute', label: 'Minute' }, { key: 'hour', label: 'Stunde' }, { key: 'day', label: 'Tag' }, { key: 'month', label: 'Monat' }, { key: 'weekday', label: 'Wochentag' }, ]; function CronExplainerTool() { const [expression, setExpression] = useState(''); const [result, setResult] = useState(null); const [error, setError] = useState(''); const explain = async (expr) => { const val = expr !== undefined ? expr : expression; setError(''); setResult(null); if (!val.trim()) { setError('Bitte Cron-Ausdruck eingeben.'); return; } try { const res = await axios.post('/api/cron/explain', { expression: val }); setResult(res.data); } catch (err) { setError(err.response?.data?.error || err.response?.data?.message || 'Ungültiger Cron-Ausdruck'); } }; const useExample = (val) => { setExpression(val); setError(''); setResult(null); explain(val); }; const formatDate = (iso) => { const d = new Date(iso); return d.toLocaleString('de-DE', { weekday: 'short', day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit', }); }; return (

Cron Erklärer

Cron-Ausdrücke (5 Felder) analysieren und auf Deutsch erklären.

{EXAMPLES.map(({ label, value }) => ( ))}
{ setExpression(e.target.value); setResult(null); setError(''); }} placeholder="z.B. 0 9 * * 1-5" style={{ fontFamily: 'monospace', flex: 1 }} onKeyDown={(e) => e.key === 'Enter' && explain()} />
{error &&

{error}

} {result && ( <>

Erklärung

{result.explanation}

Felder

{FIELD_LABELS.map(({ key, label }, i) => ( ))}
Feld Ausdruck Bedeutung
{label} {expression.split(/\s+/)[i] || '—'} {result.fields[key]}
{result.next_runs && result.next_runs.length > 0 && (

Nächste 5 Ausführungen

{result.next_runs.map((run, i) => (
#{i + 1} {formatDate(run)}
))}
)} )}
); } export default CronExplainerTool;