My plugin inserts a button in the composer toolbar. This toolbar opens a modal, and when the modal is closed I want to add text to the post. Everything works perfectly except the last step, because I’m struggling to give the modal access to the composer.
If I put the button under a menu in the toolbar, everything works fine :
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"
};
});
But if I put it on the top level, I don’t seem to have access to the toolbarEvent to pass to the modal
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'
});
});
Any tips?
2 个赞
pmusaraj
(Penar Musaraj)
2021 年10 月 19 日 14:28
2
The toolbarEvent should be available in your modal controller (discourse-n8n-wf), you don’t need to pass it. You can also look at how other modals do this, for example, see discourse-post-event-builder.js.es6 in the poll plugin.
Thanks, Penar! I’m not quite there yet though:
I found the file you referenced in the discourse-calendar plugin (couldn’t find it in the poll one), but there it seems like the toolbarEvent is indeed being passed in the action (through setProperties())?
pluginId: "discourse-calendar",
actions: {
insertEvent() {
const eventModel = this.store.createRecord(
"discourse-post-event-event"
);
eventModel.set("status", "public");
eventModel.set("custom_fields", {});
showModal("discourse-post-event-builder").setProperties({
toolbarEvent: this.toolbarEvent,
model: { eventModel },
});
},
},
});
}
export default {
name: "add-discourse-post-event-builder",
Was just wondering whether you had any more thoughts here, @pmusaraj ?
keegan
(Keegan George)
2022 年3 月 14 日 17:30
5
嘿 @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);
}
2 个赞
多年后,我也遇到了同样的问题(在模态框中无法访问 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,
},
});
},
},
});
感谢 Keegan 的帮助。
3 个赞