misago-editor.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import Ember from 'ember';
  2. export default Ember.Component.extend({
  3. classNames: ['misago-editor'],
  4. _ace: null,
  5. isLoaded: false,
  6. inputHeight: 200,
  7. toolbar: true,
  8. limit: 0,
  9. value: '',
  10. setupAce: function() {
  11. var aceLoader = this.container.lookup('service:ace-editor');
  12. var self = this;
  13. aceLoader.load().then(function() {
  14. if (self.isDestroyed) { return; }
  15. self.set('isLoaded', true);
  16. Ember.run.scheduleOnce('afterRender', function() {
  17. Ember.$('#editor-input').height(self.get('inputHeight') + 'px');
  18. var editor = aceLoader.edit('editor-input');
  19. // configure ace
  20. editor.$blockScrolling = Infinity;
  21. editor.getSession().setUseSoftTabs(true);
  22. editor.getSession().setTabSize(2);
  23. editor.getSession().setUseWrapMode(true);
  24. editor.setHighlightActiveLine(false);
  25. editor.renderer.setShowGutter(false);
  26. editor.getSession().setMode("ace/mode/markdown");
  27. editor.setValue(self.get('value'), 1);
  28. // set callbacks
  29. editor.getSession().on('change', function() {
  30. self.set('value', editor.getValue());
  31. });
  32. // store ace on component
  33. self.set('_ace', editor);
  34. });
  35. });
  36. }.on('didInsertElement'),
  37. destroyAce: function() {
  38. if (this.get('_ace')) {
  39. this.get('_ace').destroy();
  40. }
  41. }.on('willDestroyElement'),
  42. showLimitNote: function() {
  43. if (!this.get('limit')) {
  44. return false;
  45. } else {
  46. var len = this.get('value').length;
  47. return this.get('limit') * 0.8 <= len;
  48. }
  49. }.property('value', 'limit'),
  50. limitExceeded: function() {
  51. if (!this.get('limit')) {
  52. return false;
  53. } else {
  54. return this.get('limit') < this.get('value').length;
  55. }
  56. }.property('value', 'limit'),
  57. limitLeft: function() {
  58. if (!this.get('limit')) {
  59. return false;
  60. } else {
  61. return this.get('limit') - this.get('value').length;
  62. }
  63. }.property('value', 'limit')
  64. });