Werte für mehrere Funktionen, und Anlegen frischt die Auswahl auf
Deploy / check (push) Has been cancelled
Deploy / deploy (push) Has been cancelled

Zwei Nachzügler zu den Modul-Seiten.

Die Thread-Archivdauer gilt für Tickets und Modmail, hing aber nur an
Tickets — auf der Modmail-Seite fehlte sie also. `module` darf jetzt eine
Liste sein; nach außen kommt immer eine, damit niemand zwischen einem und
mehreren unterscheiden muss.

Und beim Anlegen aus dem Panel wurde nur die Einstellung gesetzt, nicht die
Kanalliste nachgeladen. Der frische Kanal stand damit zwar in der
Einstellung, fehlte aber in der Auswahl — das Feld sah leer aus, obwohl es
gesetzt war. Aufgefallen im Browser-Test: „Einsatzbereit" stand da, die
Auswahl daneben war leer. Jetzt holt reloadSettings Kanäle, Rollen und
Einstellungen frisch; das gilt für den Einzelknopf, den Assistenten und die
Modul-Seiten gleichermaßen.

Nachgeprüft: Kanal über die Status-Liste anlegen, dann ohne Neuladen nach
Feeds wechseln — dort steht #dev-log.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-31 22:00:36 +02:00
co-authored by Claude Fable 5
parent c88926aba0
commit de4e812896
4 changed files with 30 additions and 14 deletions
+6 -4
View File
@@ -59,12 +59,12 @@ function Feld({ feld, value, onChange, PickSelect, channelItems, roleItems }) {
* form: object, setForm: (f: object) => void,
* PickSelect: Function, channelItems: Array, roleItems: Array,
* welcomePreviewUrl: string, flash: (msg: string) => void,
* goTab: (tab: string) => void,
* goTab: (tab: string) => void, reloadSettings: () => Promise<void>,
* }} props
*/
export default function ModulePage(props) {
const { id, onBack, onToggle, form, setForm, PickSelect, channelItems, roleItems,
welcomePreviewUrl, flash, goTab } = props;
welcomePreviewUrl, flash, goTab, reloadSettings } = props;
const [detail, setDetail] = useState(null);
const [fehler, setFehler] = useState(false);
@@ -104,7 +104,7 @@ export default function ModulePage(props) {
if (Object.keys(geaendert).length === 0) return;
try {
const res = await apiPut('/api/tuning', geaendert);
setDetail((d) => ({ ...d, werte: res.values.filter((w) => w.module === d.id) }));
setDetail((d) => ({ ...d, werte: res.values.filter((w) => w.modules.includes(d.id)) }));
setWerteEntwurf({});
flash('✓ Werte gespeichert');
} catch (error) {
@@ -115,7 +115,9 @@ export default function ModulePage(props) {
async function anlegen(setting) {
try {
const res = await apiPost('/api/setup/create', { setting });
setForm(res.settings);
// Auffrischen statt nur setzen: der neue Kanal muss auch in der
// Auswahlliste stehen, sonst wirkt das Feld leer.
await reloadSettings();
laden();
flash(res.wiederverwendet ? `✓ „${res.name}" verknüpft` : `✓ „${res.name}" angelegt`);
} catch (error) {
+15 -6
View File
@@ -542,8 +542,7 @@ export default function Settings({ me }) {
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));
await reloadSettings();
setSetupResult(res.ergebnisse);
setPlan(null);
const neu = res.ergebnisse.filter((r) => r.ok && !r.wiederverwendet).length;
@@ -555,16 +554,25 @@ export default function Settings({ me }) {
}
}
/**
* Kanäle, Rollen und Einstellungen neu holen. Nötig nach dem Anlegen: der
* frische Kanal steht sonst zwar in der Einstellung, fehlt aber in der
* Auswahlliste — das Feld sähe leer aus, obwohl es gesetzt ist.
*/
async function reloadSettings() {
const frisch = await apiGet('/api/settings').catch(() => null);
if (!frisch) return;
setData(frisch);
setForm(frisch.settings);
}
/** Fehlenden Kanal / fehlende Rolle vom Bot anlegen lassen */
async function createMissing(entry) {
setCreating(entry.setting);
try {
const res = await apiPost('/api/setup/create', { setting: entry.setting });
setModules(res.modules);
// Die neue Auswahl steht sofort im Formular — und zählt nicht als
// ungespeicherte Änderung, weil der Vergleichsstand mitwandert.
setForm(res.settings);
setData((d) => (d ? { ...d, settings: res.settings } : d));
await reloadSettings();
flash(res.wiederverwendet
? `✓ Vorhandenen ${res.art === 'rolle' ? 'Rolle' : 'Kanal'}${res.name}" verknüpft`
: `${res.art === 'rolle' ? 'Rolle' : 'Kanal'}${res.name}" angelegt`);
@@ -2378,6 +2386,7 @@ export default function Settings({ me }) {
welcomePreviewUrl={welcomePreviewUrl}
flash={flash}
goTab={setTab}
reloadSettings={reloadSettings}
/>
) : (
<div className="settings-section">