소스 검색

Abstract the jquery-textcomplete integration with EscapeActions

We now can re-use this integration in multiple places, this will be
useful for #342 for instance.
Maxime Quandalle 9 년 전
부모
커밋
8bbc69616f
3개의 변경된 파일32개의 추가작업 그리고 26개의 파일을 삭제
  1. 1 1
      .meteor/versions
  2. 1 25
      client/components/main/editor.js
  3. 30 0
      client/lib/textComplete.js

+ 1 - 1
.meteor/versions

@@ -89,7 +89,7 @@ mquandalle:autofocus@1.0.0
 mquandalle:collection-mutations@0.1.0
 mquandalle:jade@0.4.3_1
 mquandalle:jade-compiler@0.4.3
-mquandalle:jquery-textcomplete@0.3.9_1
+mquandalle:jquery-textcomplete@0.8.0_1
 mquandalle:jquery-ui-drag-drop-sort@0.1.0
 mquandalle:moment@1.0.0
 mquandalle:mousetrap-bindglobal@0.0.1

+ 1 - 25
client/components/main/editor.js

@@ -1,11 +1,9 @@
-let dropdownMenuIsOpened = false;
-
 Template.editor.onRendered(() => {
   const $textarea = this.$('textarea');
 
   autosize($textarea);
 
-  $textarea.textcomplete([
+  $textarea.escapeableTextComplete([
     // Emojies
     {
       match: /\B:([\-+\w]*)$/,
@@ -44,30 +42,8 @@ Template.editor.onRendered(() => {
       index: 1,
     },
   ]);
-
-  // 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).
-  $textarea.on({
-    'textComplete:show'() {
-      dropdownMenuIsOpened = true;
-    },
-    'textComplete:hide'() {
-      Tracker.afterFlush(() => {
-        dropdownMenuIsOpened = false;
-      });
-    },
-  });
 });
 
-EscapeActions.register('textcomplete',
-  () => {},
-  () => dropdownMenuIsOpened
-);
-
 // XXX I believe we should compute a HTML rendered field on the server that
 // would handle markdown, emojies and user mentions. We can simply have two
 // fields, one source, and one compiled version (in HTML) and send only the

+ 30 - 0
client/lib/textComplete.js

@@ -0,0 +1,30 @@
+// 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(...args) {
+  this.textcomplete(...args);
+
+  // 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(() => {
+        dropdownMenuIsOpened = false;
+      });
+    },
+  });
+};
+
+EscapeActions.register('textcomplete',
+  () => {},
+  () => dropdownMenuIsOpened
+);