xref: /plugin/diagrams/script/DiagramsMenuItemDispatcher.js (revision d5285d5997d36d52df94bd6170b284d5e077218a)
1class DiagramsMenuItemDispatcher extends AbstractMenuItemDispatcher {
2  static isAvailable(schema) {
3    return !!schema.nodes.diagrams;
4  }
5
6  static getMenuItem(schema) {
7    if (!this.isAvailable(schema)) {
8      throw new Error('Diagrams is missing in provided Schema!');
9    }
10
11    return new MenuItem({
12      command: (state, dispatch) => {
13        const { $from } = state.selection;
14        const index = $from.index();
15        if (!$from.parent.canReplaceWith(index, index, schema.nodes.diagrams)) {
16          return false;
17        }
18        if (dispatch) {
19          let textContent = '';
20          state.selection.content().content.descendants((node) => {
21            textContent += node.textContent;
22            return false;
23          });
24
25          const dForm = new DiagramsForm('diagrams-form');
26          if (textContent) {
27              dForm.setSource(textContent);
28          }
29
30          dForm.show();
31
32          dForm.on('submit', DiagramsForm.resolveSubmittedLinkData(
33            {},
34            dForm,
35            (newAttrs) => {
36              dispatch(state.tr.replaceSelectionWith(schema.nodes.diagrams.create(newAttrs)));
37              dForm.off('submit');
38              dForm.hide();
39              dForm.resetForm();
40            },
41          ));
42        }
43        return true;
44      },
45      icon: document.createElement('span'), // FIXME
46      label: LANG.plugins.diagrams['PMMenuItem'],
47    });
48  }
49}
50