Plugin: accesso all'evento toolbarEvent dal modal

Il mio plugin inserisce un pulsante nella barra degli strumenti del compositore. Questa barra apre una finestra modale e, quando la finestra modale viene chiusa, desidero aggiungere testo al post. Tutto funziona perfettamente tranne l’ultimo passaggio, perché sto faticando a fornire alla finestra modale l’accesso al compositore.

Se posiziono il pulsante sotto un menu nella barra degli strumenti, tutto funziona correttamente:

      api.modifyClass("controller:composer", {
        pluginId: "discourse-n8n-wf",
        actions: {
          showWfModal2() {
            showModal("discourse-n8n-wf").setProperties({"toolbarEvent": this.toolbarEvent});
          },
        },
      });
      api.addToolbarPopupMenuOptionsCallback(() => {
        return {
          action: "showWfModal2",
          icon: "network-wired",
          label: "n8n workflow"
        };
      });

Ma se lo posiziono a livello superiore, sembra che non abbia accesso a toolbarEvent da passare alla finestra modale

      Composer.reopen({
        actions: {
          showWfModal: function () {
            console.log(this.toolbarEvent); // undefined
            showModal('discourse-n8n-wf', {title:'Insert n8n workflow'});
          }
        }
      });

      api.onToolbarCreate(toolbar => {
        toolbar.addButton({
          id: 'discourse-n8n-wf',
          group: 'extras',
          icon: 'network-wired',
          action: 'showWfModal',
          title: 'Insert workflow'
        });
      });

Qualche consiglio?

2 Mi Piace

L’evento toolbarEvent dovrebbe essere disponibile nel tuo controller della modale (discourse-n8n-wf), quindi non è necessario passarlo. Puoi anche consultare come altre modali gestiscono questa situazione, ad esempio, vedi discourse-post-event-builder.js.es6 nel plugin poll.

Grazie, Penar! Non ci sono ancora del tutto:

Ho trovato il file a cui ti riferisci nel plugin discourse-calendar (non l’ho trovato in quello dei sondaggi), ma lì sembra che toolbarEvent venga effettivamente passato nell’azione (tramite setProperties())?

Stavo solo chiedendomi se avessi altri pensieri a riguardo, @pmusaraj?

Ciao @sirdavidoff

Non sono sicuro se sei ancora bloccato su questo, ma sono sceso nella tana del coniglio cercando di capire come accedere all’evento della barra degli strumenti da una modale, e ho scoperto che puoi passare l’evento come parametro in questo modo:

action: (event) =>

Quindi l’ho usato in questo modo:

  const composerController = api.container.lookup('controller:composer');

  api.onToolbarCreate((toolbar) => {
    toolbar.addButton({
      id: 'math-editor',
      group: 'extras',
      icon: 'square-root-alt',
      sendAction: (event) => composerController.send('showMathEditor', event),
      title: themePrefix('insert_equation'),
    });
  });

e poi puoi usarlo nel tuo metodo action: {} in questo modo:

@action
showMathEditor(event) {
   showModal('matheditor-modal').set('toolbarEvent', event);
}

2 Mi Piace

Voglio aggiungere la mia esperienza – anni dopo, ho avuto lo stesso problema (non avevo accesso a toolbarEvent all’interno di una modale) e questa soluzione ha funzionato anche per me.

      api.onToolbarCreate((toolbar) => {
        toolbar.addButton({
          ...
          sendAction: (event) =>
            toolbar.context.send("triggerMyModal", event),
          ...
        });
      });

      api.modifyClass("component:d-editor", {
        modal: service(),
        pluginId: "poll",
        actions: {
          triggerMyModal(toolbarEvent) {
            this.modal.show(MyCustomModal, {
              model: {
                toolbarEvent,
              },
            });
          },
        },
      });

Grazie per l’aiuto, Keegan.

3 Mi Piace