TypeError durante l'invio di un flag con contenuto personalizzato (flag require_message)

Descrizione del Bug

Quando un utente seleziona un tipo di segnalazione che richiede un messaggio personalizzato (ad esempio notify_moderators, notify_user o qualsiasi segnalazione personalizzata creata dall’amministratore con “Richiedi messaggio” abilitato), compila il messaggio e invia il modulo, il browser genera un TypeError non catturato e la segnalazione non viene mai inviata.

Passaggi per Riprodurre

  1. Visita qualsiasi post di un argomento
  2. Clicca sul pulsante di segnalazione per aprire la finestra modale delle segnalazioni
  3. Seleziona un tipo di segnalazione che richiede un messaggio (ad esempio “Qualcos’altro” / notify_moderators, o qualsiasi segnalazione personalizzata creata in Amministrazione → Segnalazioni con “Richiedi messaggio” abilitato)
  4. Digita un messaggio nell’area di testo (abbastanza lungo da superare la lunghezza minima)
  5. Clicca sul pulsante Invia

Comportamento Atteso

La segnalazione viene inviata con successo.

Comportamento Effettivo

La finestra modale delle segnalazioni si chiude, ma la segnalazione non viene inviata. La console del browser mostra:

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)
    ...

Analisi della Causa Radice

Il crash ha origine in Flag#create (flag.js:24):

create(flagModal, opts) {
  const postAction = this.postActionFor(flagModal); // restituisce undefined
  // ...
  postAction.act(...) // ← TypeError: Cannot read properties of undefined
}

postActionFor in PostFlag cerca la segnalazione selezionata tramite l’id numerico all’interno di actions_summary:

// post-flag.js
postActionFor(flagModal) {
  return flagModal.args.model.flagModel.actions_summary.find(
    (item) => item.id === flagModal.selected.id
  );
}

Il PostSerializer backend include una voce di segnalazione in actions_summary solo se almeno uno tra can_act, count o acted è truthy:

result << summary if summary[:can_act] || summary[:count] || summary[:acted]

Per le segnalazioni con require_message: true (che sono tutte notify_type: true), post_can_act? imposta can_act: false quando already_did_flagging è vero — cioè quando l’utente ha già inviato una segnalazione di tipo notifica su quel post. In tal caso, la voce è assente da actions_summary, postActionFor restituisce undefined e si verifica il crash.

Nel frattempo, Post#flagsAvailable (che controlla cosa l’utente può selezionare nell’interfaccia) utilizza la mappa actionByName costruita al caricamento della pagina, quindi la segnalazione può comunque apparire selezionabile anche dopo che actions_summary non la contiene più.

Bug Secondario

C’è anche un confronto errato in flag.gjs:

const NOTIFY_MODERATORS_KEY = "notify_moderators"; // string

get notifyModeratorsFlag() {
  return this.flagsAvailable.find((f) => f.id === NOTIFY_MODERATORS_KEY);
  //                                      ^ number   ^ string — sempre falso
}

f.id è un numero ma NOTIFY_MODERATORS_KEY è una stringa, quindi === restituisce sempre false e notifyModeratorsFlag è sempre undefined. Questo rompe la logica del pulsante “Segnala per revisione” in flagForReview().

Soluzione Suggerita

PostFlag#postActionFor dovrebbe utilizzare la mappa actionByName (indicizzata per name_key) invece di cercare in actions_summary per id, in modo coerente con il funzionamento già esistente di TopicFlag#postActionFor:

// post-flag.js
postActionFor(flagModal) {
  return flagModal.args.model.flagModel.actionByName[
    flagModal.selected.name_key
  ];
}

E notifyModeratorsFlag dovrebbe confrontare per name_key invece che per id:

get notifyModeratorsFlag() {
  return this.flagsAvailable.find((f) => f.name_key === NOTIFY_MODERATORS_KEY);
}

Versione di Discourse

2026.5.0-latest

Riproducibile su

  • Ultimo ramo main
2 Mi Piace

Grazie per la segnalazione, daremo un’occhiata. Se vuoi, sentiti libero di inviare anche una PR.

Ho provato a riprodurlo localmente senza successo. Riesci a riprodurlo se attivi la modalità sicura?

1 Mi Piace

Penso che segnalare l’argomento una volta non causi questo problema, perché in quel caso already_did_flagging dovrebbe essere false. Di solito non è possibile segnalare nuovamente lo stesso post. Tuttavia, dopo averlo segnalato come “altro”, è ancora possibile segnalarlo come “illegale”. Il risultato in questo caso è:

1 Mi Piace

Ora ho ottenuto una riproducibilità riuscita:

Sebbene segnalare due volte lo stesso post di solito non sia possibile, sembra che nei topic nidificati la situazione sia diversa. Quindi:

  1. Crea un topic con alcune risposte nidificate
  2. Segnala la risposta come «altro» e invia la segnalazione
  3. Fai di nuovo clic sull’icona della segnalazione
    Risultato atteso: è disponibile solo «È illegale», proprio come nei post dei topic senza modalità nidificata.
    Risultato effettivo: Sono disponibili tutti i motivi di segnalazione tranne «altro».
  4. Scegli un altro motivo, invia la segnalazione e controlla la console del browser
1 Mi Piace

In ritardo, ma sto lavorando su questo ora.

Quello che non vedo è “È illegale” nemmeno per la modalità non annidata. Ho aggiornato la modalità annidata per corrispondere al comportamento delle discussioni non annidate, ma entrambe finiscono per apparire così quando si tenta di segnalare di nuovo:

1 Mi Piace

Ho appena seguito i passaggi indicati sopra in un argomento senza risposte annidate.

Come si può vedere sotto la finestra modale, il post è già stato segnalato per la moderazione dall’utente e facendo di nuovo clic sulla finestra di segnalazione si ottiene:


Controllando le impostazioni del mio sito, sembra che allow_all_users_to_flag_illegal_content consenta agli utenti di segnalare ancora come “illegale” dopo aver scelto un’altra opzione.

1 Mi Piace

Ah, questo ha risolto il problema, grazie! La correzione dovrebbe essere disponibile a breve.

1 Mi Piace

La correzione per il bug principale è ora in latest e dovrebbe risolvere il problema. Cioè, dovrebbe essere identica alle risposte ai topic non annidati.


Ho deciso di separare questo perché non si tratta dello stesso comportamento, e lo correggerò anch’esso a breve.

1 Mi Piace

Il follow-up è stato anche unito. Il confronto errato stava effettivamente lavorando a nostro vantaggio: se il confronto fosse stato corretto correttamente, avrebbe consentito agli amministratori/moderatori di inviare segnalazioni senza una motivazione. Vorremmo che fosse richiesta una motivazione per inviare segnalazioni, quindi ho rimosso il codice invece di correggerlo per evitare future confusione.