editor.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. var dropdownMenuIsOpened = false;
  2. Template.editor.onRendered(function() {
  3. var $textarea = this.$('textarea');
  4. autosize($textarea);
  5. $textarea.textcomplete([
  6. // Emojies
  7. {
  8. match: /\B:([\-+\w]*)$/,
  9. search: function(term, callback) {
  10. callback($.map(Emoji.values, function(emoji) {
  11. return emoji.indexOf(term) === 0 ? emoji : null;
  12. }));
  13. },
  14. template: function(value) {
  15. var image = '<img src="' + Emoji.baseImagePath + value + '.png"></img>';
  16. return image + value;
  17. },
  18. replace: function(value) {
  19. return ':' + value + ':';
  20. },
  21. index: 1
  22. },
  23. // User mentions
  24. {
  25. match: /\B@(\w*)$/,
  26. search: function(term, callback) {
  27. var currentBoard = Boards.findOne(Session.get('currentBoard'));
  28. callback($.map(currentBoard.members, function(member) {
  29. var username = Users.findOne(member.userId).username;
  30. return username.indexOf(term) === 0 ? username : null;
  31. }));
  32. },
  33. template: function(value) {
  34. return value;
  35. },
  36. replace: function(username) {
  37. return '@' + username + ' ';
  38. },
  39. index: 1
  40. }
  41. ]);
  42. // Since commit d474017 jquery-textComplete automatically closes a potential
  43. // opened dropdown menu when the user press Escape. This behavior conflicts
  44. // with our EscapeActions system, but it's too complicated and hacky to
  45. // monkey-pach textComplete to disable it -- I tried. Instead we listen to
  46. // 'open' and 'hide' events, and create a ghost escapeAction when the dropdown
  47. // is opened (and rely on textComplete to execute the actual action).
  48. $textarea.on({
  49. 'textComplete:show': function() {
  50. dropdownMenuIsOpened = true;
  51. },
  52. 'textComplete:hide': function() {
  53. Tracker.afterFlush(function() {
  54. dropdownMenuIsOpened = false;
  55. });
  56. }
  57. });
  58. });
  59. EscapeActions.register('textcomplete',
  60. function() {},
  61. function() { return dropdownMenuIsOpened; }
  62. );