translationBody.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. import { ReactiveCache } from '/imports/reactiveCache';
  2. const translationsPerPage = 25;
  3. BlazeComponent.extendComponent({
  4. mixins() {
  5. return [Mixins.InfiniteScrolling];
  6. },
  7. onCreated() {
  8. this.error = new ReactiveVar('');
  9. this.loading = new ReactiveVar(false);
  10. this.translationSetting = new ReactiveVar(true);
  11. this.findTranslationsOptions = new ReactiveVar({});
  12. this.numberTranslations = new ReactiveVar(0);
  13. this.page = new ReactiveVar(1);
  14. this.loadNextPageLocked = false;
  15. this.callFirstWith(null, 'resetNextPeak');
  16. this.autorun(() => {
  17. const limitTranslations = this.page.get() * translationsPerPage;
  18. this.subscribe('translation', this.findTranslationsOptions.get(), 0, () => {
  19. this.loadNextPageLocked = false;
  20. const nextPeakBefore = this.callFirstWith(null, 'getNextPeak');
  21. this.calculateNextPeak();
  22. const nextPeakAfter = this.callFirstWith(null, 'getNextPeak');
  23. if (nextPeakBefore === nextPeakAfter) {
  24. this.callFirstWith(null, 'resetNextPeak');
  25. }
  26. });
  27. });
  28. },
  29. events() {
  30. return [
  31. {
  32. 'click #searchTranslationButton'() {
  33. this.filterTranslation();
  34. },
  35. 'keydown #searchTranslationInput'(event) {
  36. if (event.keyCode === 13 && !event.shiftKey) {
  37. this.filterTranslation();
  38. }
  39. },
  40. 'click #newTranslationButton'() {
  41. Popup.open('newTranslation');
  42. },
  43. 'click a.js-translation-menu': this.switchMenu,
  44. },
  45. ];
  46. },
  47. filterTranslation() {
  48. const value = $('#searchTranslationInput').first().val();
  49. if (value === '') {
  50. this.findTranslationsOptions.set({});
  51. } else {
  52. const regex = new RegExp(value, 'i');
  53. this.findTranslationsOptions.set({
  54. $or: [
  55. { language: regex },
  56. { text: regex },
  57. { translationText: regex },
  58. ],
  59. });
  60. }
  61. },
  62. loadNextPage() {
  63. if (this.loadNextPageLocked === false) {
  64. this.page.set(this.page.get() + 1);
  65. this.loadNextPageLocked = true;
  66. }
  67. },
  68. calculateNextPeak() {
  69. const element = this.find('.main-body');
  70. if (element) {
  71. const altitude = element.scrollHeight;
  72. this.callFirstWith(this, 'setNextPeak', altitude);
  73. }
  74. },
  75. reachNextPeak() {
  76. this.loadNextPage();
  77. },
  78. setError(error) {
  79. this.error.set(error);
  80. },
  81. setLoading(w) {
  82. this.loading.set(w);
  83. },
  84. translationList() {
  85. const translations = ReactiveCache.getTranslations(this.findTranslationsOptions.get(), {
  86. sort: { modifiedAt: 1 },
  87. fields: { _id: true },
  88. });
  89. this.numberTranslations.set(translations.length);
  90. return translations;
  91. },
  92. translationNumber() {
  93. return this.numberTranslations.get();
  94. },
  95. switchMenu(event) {
  96. const target = $(event.target);
  97. if (!target.hasClass('active')) {
  98. $('.side-menu li.active').removeClass('active');
  99. target.parent().addClass('active');
  100. const targetID = target.data('id');
  101. this.translationSetting.set('translation-setting' === targetID);
  102. }
  103. },
  104. }).register('translation');
  105. Template.translationRow.helpers({
  106. translationData() {
  107. return ReactiveCache.getTranslation(this.translationId);
  108. },
  109. });
  110. Template.editTranslationPopup.helpers({
  111. translation() {
  112. return ReactiveCache.getTranslation(this.translationId);
  113. },
  114. errorMessage() {
  115. return Template.instance().errorMessage.get();
  116. },
  117. });
  118. Template.newTranslationPopup.onCreated(function () {
  119. this.errorMessage = new ReactiveVar('');
  120. });
  121. Template.newTranslationPopup.helpers({
  122. translation() {
  123. return ReactiveCache.getTranslation(this.translationId);
  124. },
  125. errorMessage() {
  126. return Template.instance().errorMessage.get();
  127. },
  128. });
  129. BlazeComponent.extendComponent({
  130. onCreated() {},
  131. translation() {
  132. return ReactiveCache.getTranslation(this.translationId);
  133. },
  134. events() {
  135. return [
  136. {
  137. 'click a.edit-translation': Popup.open('editTranslation'),
  138. 'click a.more-settings-translation': Popup.open('settingsTranslation'),
  139. },
  140. ];
  141. },
  142. }).register('translationRow');
  143. BlazeComponent.extendComponent({
  144. events() {
  145. return [
  146. {
  147. 'click a.new-translation': Popup.open('newTranslation'),
  148. },
  149. ];
  150. },
  151. }).register('newTranslationRow');
  152. Template.editTranslationPopup.events({
  153. submit(event, templateInstance) {
  154. event.preventDefault();
  155. const translation = ReactiveCache.getTranslation(this.translationId);
  156. const translationText = templateInstance.find('.js-translation-translation-text').value.trim();
  157. Meteor.call(
  158. 'setTranslationText',
  159. translation,
  160. translationText
  161. );
  162. Popup.back();
  163. },
  164. });
  165. Template.newTranslationPopup.events({
  166. submit(event, templateInstance) {
  167. event.preventDefault();
  168. const language = templateInstance.find('.js-translation-language').value.trim();
  169. const text = templateInstance.find('.js-translation-text').value.trim();
  170. const translationText = templateInstance.find('.js-translation-translation-text').value.trim();
  171. Meteor.call(
  172. 'setCreateTranslation',
  173. language,
  174. text,
  175. translationText,
  176. function(error) {
  177. const textMessageElement = templateInstance.$('.text-taken');
  178. if (error) {
  179. const errorElement = error.error;
  180. if (errorElement === 'text-already-taken') {
  181. textMessageElement.show();
  182. }
  183. } else {
  184. textMessageElement.hide();
  185. Popup.back();
  186. }
  187. },
  188. );
  189. Popup.back();
  190. },
  191. });
  192. Template.settingsTranslationPopup.events({
  193. 'click #deleteButton'(event) {
  194. event.preventDefault();
  195. Translation.remove(this.translationId);
  196. Popup.back();
  197. }
  198. });