123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- import { ReactiveCache } from '/imports/reactiveCache';
- const translationsPerPage = 25;
- BlazeComponent.extendComponent({
- mixins() {
- return [Mixins.InfiniteScrolling];
- },
- onCreated() {
- this.error = new ReactiveVar('');
- this.loading = new ReactiveVar(false);
- this.translationSetting = new ReactiveVar(true);
- this.findTranslationsOptions = new ReactiveVar({});
- this.numberTranslations = new ReactiveVar(0);
- this.page = new ReactiveVar(1);
- this.loadNextPageLocked = false;
- this.callFirstWith(null, 'resetNextPeak');
- this.autorun(() => {
- const limitTranslations = this.page.get() * translationsPerPage;
- this.subscribe('translation', this.findTranslationsOptions.get(), 0, () => {
- this.loadNextPageLocked = false;
- const nextPeakBefore = this.callFirstWith(null, 'getNextPeak');
- this.calculateNextPeak();
- const nextPeakAfter = this.callFirstWith(null, 'getNextPeak');
- if (nextPeakBefore === nextPeakAfter) {
- this.callFirstWith(null, 'resetNextPeak');
- }
- });
- });
- },
- events() {
- return [
- {
- 'click #searchTranslationButton'() {
- this.filterTranslation();
- },
- 'keydown #searchTranslationInput'(event) {
- if (event.keyCode === 13 && !event.shiftKey) {
- this.filterTranslation();
- }
- },
- 'click #newTranslationButton'() {
- Popup.open('newTranslation');
- },
- 'click a.js-translation-menu': this.switchMenu,
- },
- ];
- },
- filterTranslation() {
- const value = $('#searchTranslationInput').first().val();
- if (value === '') {
- this.findTranslationsOptions.set({});
- } else {
- const regex = new RegExp(value, 'i');
- this.findTranslationsOptions.set({
- $or: [
- { language: regex },
- { text: regex },
- { translationText: regex },
- ],
- });
- }
- },
- loadNextPage() {
- if (this.loadNextPageLocked === false) {
- this.page.set(this.page.get() + 1);
- this.loadNextPageLocked = true;
- }
- },
- calculateNextPeak() {
- const element = this.find('.main-body');
- if (element) {
- const altitude = element.scrollHeight;
- this.callFirstWith(this, 'setNextPeak', altitude);
- }
- },
- reachNextPeak() {
- this.loadNextPage();
- },
- setError(error) {
- this.error.set(error);
- },
- setLoading(w) {
- this.loading.set(w);
- },
- translationList() {
- const translations = ReactiveCache.getTranslations(this.findTranslationsOptions.get(), {
- sort: { modifiedAt: 1 },
- fields: { _id: true },
- });
- this.numberTranslations.set(translations.length);
- return translations;
- },
- translationNumber() {
- return this.numberTranslations.get();
- },
- switchMenu(event) {
- const target = $(event.target);
- if (!target.hasClass('active')) {
- $('.side-menu li.active').removeClass('active');
- target.parent().addClass('active');
- const targetID = target.data('id');
- this.translationSetting.set('translation-setting' === targetID);
- }
- },
- }).register('translation');
- Template.translationRow.helpers({
- translationData() {
- return ReactiveCache.getTranslation(this.translationId);
- },
- });
- Template.editTranslationPopup.helpers({
- translation() {
- return ReactiveCache.getTranslation(this.translationId);
- },
- errorMessage() {
- return Template.instance().errorMessage.get();
- },
- });
- Template.newTranslationPopup.onCreated(function () {
- this.errorMessage = new ReactiveVar('');
- });
- Template.newTranslationPopup.helpers({
- translation() {
- return ReactiveCache.getTranslation(this.translationId);
- },
- errorMessage() {
- return Template.instance().errorMessage.get();
- },
- });
- BlazeComponent.extendComponent({
- onCreated() {},
- translation() {
- return ReactiveCache.getTranslation(this.translationId);
- },
- events() {
- return [
- {
- 'click a.edit-translation': Popup.open('editTranslation'),
- 'click a.more-settings-translation': Popup.open('settingsTranslation'),
- },
- ];
- },
- }).register('translationRow');
- BlazeComponent.extendComponent({
- events() {
- return [
- {
- 'click a.new-translation': Popup.open('newTranslation'),
- },
- ];
- },
- }).register('newTranslationRow');
- Template.editTranslationPopup.events({
- submit(event, templateInstance) {
- event.preventDefault();
- const translation = ReactiveCache.getTranslation(this.translationId);
- const translationText = templateInstance.find('.js-translation-translation-text').value.trim();
- Meteor.call(
- 'setTranslationText',
- translation,
- translationText
- );
- Popup.back();
- },
- });
- Template.newTranslationPopup.events({
- submit(event, templateInstance) {
- event.preventDefault();
- const language = templateInstance.find('.js-translation-language').value.trim();
- const text = templateInstance.find('.js-translation-text').value.trim();
- const translationText = templateInstance.find('.js-translation-translation-text').value.trim();
- Meteor.call(
- 'setCreateTranslation',
- language,
- text,
- translationText,
- function(error) {
- const textMessageElement = templateInstance.$('.text-taken');
- if (error) {
- const errorElement = error.error;
- if (errorElement === 'text-already-taken') {
- textMessageElement.show();
- }
- } else {
- textMessageElement.hide();
- Popup.back();
- }
- },
- );
- Popup.back();
- },
- });
- Template.settingsTranslationPopup.events({
- 'click #deleteButton'(event) {
- event.preventDefault();
- Translation.remove(this.translationId);
- Popup.back();
- }
- });
|