diff --git a/README.md b/README.md index 946d684..10d335f 100644 --- a/README.md +++ b/README.md @@ -146,6 +146,11 @@ an, setzt bei privaten Kanälen die Rechte (nur Team sieht sie) und trägt die Einstellung gleich ein. Gibt es Kanal oder Rolle schon, werden sie verknüpft statt doppelt angelegt. +Daneben legt **„Alles auf einmal anlegen"** das ganze Grundgerüst an: erst eine +Vorschau (was ist neu, was ist schon da, in welche Kategorie kommt es), dann ein +Durchlauf mit Ergebnis je Zeile. Neue Kanäle landen in einer eigenen Kategorie, +und ein Fehler bei einem Kanal bricht die restlichen nicht ab. + Dafür braucht der Bot *Kanäle verwalten* bzw. *Rollen verwalten* — fehlt das Recht, sagt das Panel genau das. Die Vorlagen (Name, Thema, privat/öffentlich) stehen bei den Modulen in [`src/modules.js`](src/modules.js). Gelöscht oder diff --git a/frontend/src/pages/Settings.jsx b/frontend/src/pages/Settings.jsx index efa4545..a2eb56e 100644 --- a/frontend/src/pages/Settings.jsx +++ b/frontend/src/pages/Settings.jsx @@ -305,6 +305,10 @@ export default function Settings({ me }) { const [moduleGroups, setModuleGroups] = useState([]); const [modFilter, setModFilter] = useState('alle'); const [creating, setCreating] = useState(null); // Einstellung, die gerade angelegt wird + // Grundgerüst-Assistent + const [plan, setPlan] = useState(null); // Vorschau, null = zu + const [setupRunning, setSetupRunning] = useState(false); + const [setupResult, setSetupResult] = useState(null); // Text-Vorlagen (was der Bot nach außen schreibt) const [templates, setTemplates] = useState([]); const [templateGroups, setTemplateGroups] = useState([]); @@ -502,6 +506,35 @@ export default function Settings({ me }) { } } + /** Vorschau holen: was würde der Assistent anlegen? */ + async function loadPlan() { + try { + const res = await apiGet('/api/setup/plan'); + setPlan(res); + } catch (error) { + flash(`✗ ${error.body?.error ?? 'Vorschau fehlgeschlagen'}`); + } + } + + /** Grundgerüst anlegen — erst nach der Vorschau erreichbar */ + async function runSetup() { + setSetupRunning(true); + try { + const res = await apiPost('/api/setup/run', { kategorie: plan.kategorie }); + setModules(res.modules); + setForm(res.settings); + setData((d) => (d ? { ...d, settings: res.settings } : d)); + setSetupResult(res.ergebnisse); + setPlan(null); + const neu = res.ergebnisse.filter((r) => r.ok && !r.wiederverwendet).length; + flash(`✓ ${neu} neu angelegt`); + } catch (error) { + flash(`✗ ${error.body?.error ?? 'Fehlgeschlagen'}`); + } finally { + setSetupRunning(false); + } + } + /** Fehlenden Kanal / fehlende Rolle vom Bot anlegen lassen */ async function createMissing(entry) { setCreating(entry.setting); @@ -1037,8 +1070,70 @@ export default function Settings({ me }) { <>
Diese Module sind eingeschaltet, aber es fehlt ihnen noch etwas — - bis dahin tun sie nichts. + bis dahin tun sie nichts. Einzeln anlegen, oder alles auf einmal.
+ + {/* Grundgerüst: erst Vorschau, dann anlegen */} + {!plan && ( ++ {plan.schritte.filter((s) => !s.vorhanden).length} werden neu angelegt + {plan.schritte.some((s) => s.vorhanden) + && ` · ${plan.schritte.filter((s) => s.vorhanden).length} sind schon da und werden nur verknüpft`} + . Neue Kanäle landen in der Kategorie {plan.kategorie}. +
+Ergebnis:
+