Плагин: доступ к toolbarEvent из модального окна

Мой плагин добавляет кнопку в панель инструментов редактора. Эта панель открывает модальное окно, и после закрытия модального окна я хочу добавить текст в пост. Всё работает отлично, кроме последнего шага, так как у меня возникают трудности с предоставлением модальному окну доступа к редактору.

Если я размещу кнопку в меню на панели инструментов, всё работает корректно:

      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"
        };
      });

Но если я размещу её на верхнем уровне, у меня, похоже, нет доступа к toolbarEvent, который нужно передать в модальное окно:

      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'
        });
      });

Есть какие-нибудь советы?

Событие toolbarEvent должно быть доступно в вашем контроллере модального окна (discourse-n8n-wf), передавать его не нужно. Вы также можете посмотреть, как это реализовано в других модальных окнах, например, в файле discourse-post-event-builder.js.es6 в плагине poll.

Спасибо, Пенар! Но я пока ещё не совсем добрался до этого:

Я нашёл файл, на который вы ссылаетесь, в плагине discourse-calendar (в плагине опросов найти его не удалось), но там, похоже, toolbarEvent действительно передаётся в действие (через setProperties())?

Просто хотел узнать, есть ли у вас какие-то дополнительные мысли по этому поводу, @pmusaraj?

Привет, @sirdavidoff

Не уверен, что ты всё ещё застрял на этом, но я тоже углубился в изучение того, как получить доступ к событию панели инструментов из модального окна. Оказалось, что событие можно передать как параметр следующим образом:

action: (event) =>

Я использовал это так:

  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'),
    });
  });

А затем ты можешь использовать его в своём методе action: {} вот так:

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

Хочу присоединиться к обсуждению — спустя годы у меня возникла та же проблема (не было доступа к toolbarEvent внутри модального окна), и это решение также сработало для меня.

      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,
              },
            });
          },
        },
      });

Спасибо за помощь, Киган.