Move Wettkampf question count to admin-configured setting per set

This commit is contained in:
2026-04-26 11:22:08 +02:00
parent 7b886c4355
commit 5980aaab41
3 changed files with 41 additions and 30 deletions
+26 -5
View File
@@ -59,19 +59,22 @@ function LoginPage({ onLogin }) {
function ConfigPage({ config, setConfig, saveConfig }) {
const [newSetName, setNewSetName] = useState('');
const [newSetTableId, setNewSetTableId] = useState('');
const [newSetWettkampfCount, setNewSetWettkampfCount] = useState('');
const [msg, setMsg] = useState('');
const [debugResult, setDebugResult] = useState(null);
const addSet = () => {
if (!newSetName || !newSetTableId) return;
const wkCount = parseInt(newSetWettkampfCount) || null;
const updated = {
...config,
sets: [...(config.sets || []), { id: Date.now().toString(36), name: newSetName, tableId: parseInt(newSetTableId) }],
sets: [...(config.sets || []), { id: Date.now().toString(36), name: newSetName, tableId: parseInt(newSetTableId), wettkampfCount: wkCount }],
};
setConfig(updated);
saveConfig(updated);
setNewSetName('');
setNewSetTableId('');
setNewSetWettkampfCount('');
setMsg('Fragenset hinzugefügt!');
setTimeout(() => setMsg(''), 3000);
};
@@ -82,6 +85,16 @@ function ConfigPage({ config, setConfig, saveConfig }) {
saveConfig(updated);
};
const updateSetWettkampfCount = (setId, val) => {
const wkCount = parseInt(val) || null;
const updated = {
...config,
sets: config.sets.map((s) => s.id === setId ? { ...s, wettkampfCount: wkCount } : s),
};
setConfig(updated);
saveConfig(updated);
};
const updateAnswersTable = (val) => {
const updated = { ...config, answersTableId: val ? parseInt(val) : null };
setConfig(updated);
@@ -104,14 +117,22 @@ function ConfigPage({ config, setConfig, saveConfig }) {
<h2 className="text-xl font-bold mb-4">📋 Fragensets</h2>
{(config.sets || []).length === 0 && <p className="text-gray-500 mb-3">Noch keine Fragensets konfiguriert.</p>}
{(config.sets || []).map((s) => (
<div key={s.id} className="flex items-center justify-between py-2 border-b last:border-0">
<div><span className="font-semibold">{s.name}</span> <span className="text-gray-400 text-sm">(Table ID: {s.tableId})</span></div>
<button onClick={() => removeSet(s.id)} className="text-red-500 hover:text-red-700 text-sm">Entfernen</button>
<div key={s.id} className="py-3 border-b last:border-0">
<div className="flex items-center justify-between">
<div><span className="font-semibold">{s.name}</span> <span className="text-gray-400 text-sm">(Table ID: {s.tableId})</span></div>
<button onClick={() => removeSet(s.id)} className="text-red-500 hover:text-red-700 text-sm">Entfernen</button>
</div>
<div className="flex items-center gap-2 mt-2">
<span className="text-sm text-gray-500"> Wettkampf-Fragen:</span>
<input className="w-20 p-1 border rounded text-center text-sm focus:border-emerald-500 outline-none" type="number" min="1" placeholder="—" value={s.wettkampfCount || ''} onChange={(e) => updateSetWettkampfCount(s.id, e.target.value)} />
{s.wettkampfCount ? <span className="text-xs text-emerald-600"> aktiv</span> : <span className="text-xs text-gray-400">nicht konfiguriert</span>}
</div>
</div>
))}
<div className="mt-4 flex gap-2 flex-wrap">
<input className="flex-1 min-w-0 p-2 border rounded-lg focus:border-red-500 outline-none" placeholder="Name" value={newSetName} onChange={(e) => setNewSetName(e.target.value)} />
<input className="w-32 p-2 border rounded-lg focus:border-red-500 outline-none" placeholder="Table ID" type="number" value={newSetTableId} onChange={(e) => setNewSetTableId(e.target.value)} />
<input className="w-28 p-2 border rounded-lg focus:border-red-500 outline-none" placeholder="Table ID" type="number" value={newSetTableId} onChange={(e) => setNewSetTableId(e.target.value)} />
<input className="w-20 p-2 border rounded-lg focus:border-emerald-500 outline-none" placeholder="⚔️ Anz." type="number" min="1" value={newSetWettkampfCount} onChange={(e) => setNewSetWettkampfCount(e.target.value)} />
<button onClick={addSet} className="px-4 py-2 bg-red-600 text-white rounded-lg font-bold hover:bg-red-700">+</button>
</div>
{msg && <p className="text-green-600 text-sm mt-2">{msg}</p>}