Fehlerbeschreibung
Wenn ein Benutzer einen Flaggen-Typ auswählt, der eine benutzerdefinierte Nachricht erfordert (z. B. notify_moderators, notify_user oder eine benutzerdefinierte Flagge, die von einem Administrator erstellt wurde und bei der „Nachricht erforderlich“ aktiviert ist), die Nachricht eingibt und absendet, wirft der Browser einen nicht abgefangenen TypeError, und die Flagge wird nie übermittelt.
Schritte zur Reproduktion
- Besuchen Sie einen beliebigen Themenbeitrag.
- Klicken Sie auf die Flaggen-Schaltfläche, um das Flaggen-Modal zu öffnen.
- Wählen Sie einen Flaggen-Typ aus, der eine Nachricht erfordert (z. B. „Sonstiges“ /
notify_moderatorsoder eine benutzerdefinierte Flagge, die unter Admin → Flaggen erstellt wurde und bei der „Nachricht erforderlich“ aktiviert ist). - Geben Sie eine Nachricht im Textfeld ein (lang genug, um die Mindestlänge zu erfüllen).
- Klicken Sie auf die Schaltfläche „Absenden“.
Erwartetes Verhalten
Die Flagge wird erfolgreich übermittelt.
Tatsächliches Verhalten
Das Flaggen-Modal schließt sich, aber die Flagge wird nicht übermittelt. In der Browserkonsole wird Folgendes angezeigt:
Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'act')
at n.create (flag.js:24:8)
at S.createFlag (flag.gjs:205:32)
at S.takeAction (flag.gjs:196:12)
at m.perform (reviewable-bundled-action.gjs:47:17)
at ej._boundaryActionHandler (select-kit.js:685:34)
...
Analyse der Ursache
Der Absturz stammt aus Flag#create (flag.js:24):
create(flagModal, opts) {
const postAction = this.postActionFor(flagModal); // gibt undefined zurück
// ...
postAction.act(...) // ← TypeError: Cannot read properties of undefined
}
postActionFor in PostFlag sucht die ausgewählte Flagge nach numerischer id innerhalb von actions_summary:
// post-flag.js
postActionFor(flagModal) {
return flagModal.args.model.flagModel.actions_summary.find(
(item) => item.id === flagModal.selected.id
);
}
Der Backend-PostSerializer fügt nur dann einen Flaggen-Eintrag in actions_summary hinzu, wenn mindestens einer der Werte can_act, count oder acted truthy ist:
result << summary if summary[:can_act] || summary[:count] || summary[:acted]
Bei Flaggen mit require_message: true (die alle notify_type: true sind) setzt post_can_act? can_act: false, wenn already_did_flagging true ist – d. h., der Benutzer hat zuvor eine beliebige Benachrichtigungs-Flagge für diesen Beitrag eingereicht. In diesem Fall fehlt der Eintrag in actions_summary, postActionFor gibt undefined zurück, und der Absturz folgt.
Inzwischen verwendet Post#flagsAvailable (das steuert, was der Benutzer in der Benutzeroberfläche auswählen kann) die bei Laden der Seite erstellte actionByName-Karte. Daher kann die Flagge weiterhin als auswählbar erscheinen, auch wenn sie nicht mehr in actions_summary enthalten ist.
Sekundärer Fehler
Es gibt zudem einen fehlerhaften Vergleich in flag.gjs:
const NOTIFY_MODERATORS_KEY = "notify_moderators"; // String
get notifyModeratorsFlag() {
return this.flagsAvailable.find((f) => f.id === NOTIFY_MODERATORS_KEY);
// ^ Zahl ^ String — immer false
}
f.id ist eine Zahl, aber NOTIFY_MODERATORS_KEY ist ein String, sodass === immer false zurückgibt und notifyModeratorsFlag immer undefined ist. Dies unterbricht die Logik der Schaltfläche „Zur Prüfung melden“ in flagForReview().
Vorgeschlagene Lösung
PostFlag#postActionFor sollte die actionByName-Karte (schlüsselbasiert nach name_key) verwenden, anstatt in actions_summary nach id zu suchen, konsistent mit der Funktionsweise von TopicFlag#postActionFor:
// post-flag.js
postActionFor(flagModal) {
return flagModal.args.model.flagModel.actionByName[
flagModal.selected.name_key
];
}
Und notifyModeratorsFlag sollte nach name_key statt nach id vergleichen:
get notifyModeratorsFlag() {
return this.flagsAvailable.find((f) => f.name_key === NOTIFY_MODERATORS_KEY);
}
Discourse-Version
2026.5.0-latest
Reproduzierbar auf
- Latest
mainbranch