12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- // We “inherit” the jquery-textcomplete plugin to integrate with our
- // EscapeActions system. You should always use `escapeableTextComplete` instead
- // of the vanilla `textcomplete`.
- let dropdownMenuIsOpened = false;
- $.fn.escapeableTextComplete = function(strategies, options, ...otherArgs) {
- // When the autocomplete menu is shown we want both a press of both `Tab`
- // or `Enter` to validation the auto-completion. We also need to stop the
- // event propagation to prevent EscapeActions side effect, for instance the
- // minicard submission (on `Enter`) or going on the next column (on `Tab`).
- options = {
- onKeydown(evt, commands) {
- if (evt.keyCode === 9 || evt.keyCode === 13) {
- evt.stopPropagation();
- return commands.KEY_ENTER;
- }
- return null;
- },
- ...options,
- };
- // Proxy to the vanilla jQuery component
- this.textcomplete(strategies, options, ...otherArgs);
- // Since commit d474017 jquery-textComplete automatically closes a potential
- // opened dropdown menu when the user press Escape. This behavior conflicts
- // with our EscapeActions system, but it's too complicated and hacky to
- // monkey-pach textComplete to disable it -- I tried. Instead we listen to
- // 'open' and 'hide' events, and create a ghost escapeAction when the dropdown
- // is opened (and rely on textComplete to execute the actual action).
- this.on({
- 'textComplete:show'() {
- dropdownMenuIsOpened = true;
- },
- 'textComplete:hide'() {
- Tracker.afterFlush(() => {
- // XXX Hack. We unfortunately need to set a setTimeout here to make the
- // `noClickEscapeOn` work bellow, otherwise clicking on a autocomplete
- // item will close both the autocomplete menu (as expected) but also the
- // next item in the stack (for example the minicard editor) which we
- // don't want.
- setTimeout(() => {
- dropdownMenuIsOpened = false;
- }, 100);
- });
- },
- });
- return this;
- };
- EscapeActions.register(
- 'textcomplete',
- () => {},
- () => dropdownMenuIsOpened,
- {
- noClickEscapeOn: '.textcomplete-dropdown',
- },
- );
|