zurb / tribute

ES6 Native @mentions
https://zurb.github.io/tribute/example/
MIT License
2.03k stars 304 forks source link

Quilljs + Tributejs - Pressing enter key doesn't select #87

Open ericbae opened 6 years ago

ericbae commented 6 years ago

How can we reproduce this bug?

I have created a JSFiddle for this issue here. https://jsfiddle.net/chphr0ab/3/

The issue is when you press "enter", it actually goes to the new line in the editor. Instead of creating a newline, it should actually select an item from the tribute.

You can still select the item using "tab" or a "mouse". It's just the "enter" key which doesn't work.

mrsweaters commented 6 years ago

Maybe Quilljs is capturing the enter event? I'll play around with it and let you know what I find.

go2sujeet commented 6 years ago

@mrsweaters can you please look into this, we are waiting on the implementation with this combination.

Thanks in advance :D

mrsweaters commented 6 years ago

@sujeetbuddiga The selection offset is being miscalculated in the context of the Quill editor. https://github.com/zurb/tribute/blob/quilljs/src/TributeRange.js#L232

If we can figure out why this is incorrect, we can fix the problem.

oliveratgithub commented 6 years ago

So regarding the 2nd issue with Quill+Tribute - the Tab-key - there's a way to disable it in Quill. But then again, it also stops working for Tribute as well...

var quill = new Quill('#quilleditor', {
    modules: {
        toolbar: {
            container:
            [
              [{ 'header': [1, 2, 3, 4, 5, 6, false] }],
              [{ 'size': ['small', false, 'large', 'huge'] }],
              ['bold', 'italic', 'underline', 'strike',],
              [{ list: 'ordered' }, { list: 'bullet' }],
              ['link', 'image', 'blockquote', 'code-block']
            ],
            handlers: {
            }
        },
        keyboard: {
            bindings: { tab: false }
        }
    },
    theme: 'snow',
});

However, Quill's keyboard module might be a starting point to get them to play along nicely? Probably trigger a Tribute function with a specific binding in Quill on Enter & Tab key? http://quilljs.com/docs/modules/keyboard/

mrsweaters commented 6 years ago

@oliveratgithub They must stop event bubbling on Tab when it is disabled. I think your right about using the keyboard module. Let me know if I need to expose some tribute-specific methods for Enter and Tab.

evansims commented 6 years ago

Here's a JSFiddle demoing how you might use Quill's keyboard module to override the default enter key behavior when Tribute is active.

The relevant code in the Quill initializer:

modules: {
  keyboard: {
    bindings: {
      tributeSelectOnEnter: {
        key: 13,
        shortKey: false,
        handler: (event) => {
          if (tribute.isActive) {
            tribute.selectItemAtIndex(tribute.menuSelected, event);
            tribute.hideMenu();
            return false;
          }

          return true;
        }
      },
    }
  }
}
ericbae commented 6 years ago

@evansims Thank you for your solution. Works very well for me.

allaud commented 5 years ago

@evansims this does not seem to be working anymore, can you please take a look?

filipjuza commented 5 years ago

@allaud seems like hideMenu() and selectItemAtIndex() are not available anymore, at least from what I can tell based on the type declaration file https://github.com/zurb/tribute/blob/master/tributejs.d.ts.

I was able to get it working like this:

keyboard: {
    bindings: {
        tributeSelectOnEnter: {
            key: 13,
            shortKey: false,
            handler: () => {
                if (tribute.isActive) {
                    return false;
                }

                return true;
            }
        }
    }
}

When tribute is active, pressing enter inserts the selected item and closes the menu automatically. Otherwise you get the default Quill behaviour (newline is inserted).

allaud commented 5 years ago

Whoever gets into this issue I found it easier to use https://github.com/afconsult/quill-mention instead in this particular case