wekan/client/components/settings/translationBody.js
Harry Adel bae23f9ed8 Migrate sidebar and settings components from BlazeComponent to Template
Convert sidebar, sidebarArchives, sidebarCustomFields, sidebarFilters,
sidebarSearches, and all settings panel components to use native Meteor
Template.onCreated/helpers/events pattern.
2026-03-08 11:04:53 +02:00

211 lines
5.6 KiB
JavaScript

import { ReactiveCache } from '/imports/reactiveCache';
import { InfiniteScrolling } from '/client/lib/infiniteScrolling';
const translationsPerPage = 25;
Template.translation.onCreated(function () {
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.infiniteScrolling = new InfiniteScrolling();
this.loadNextPage = () => {
if (this.loadNextPageLocked === false) {
this.page.set(this.page.get() + 1);
this.loadNextPageLocked = true;
}
};
this.calculateNextPeak = () => {
const element = this.find('.main-body');
if (element) {
this.infiniteScrolling.setNextPeak(element.scrollHeight);
}
};
this.autorun(() => {
const limitTranslations = this.page.get() * translationsPerPage;
this.subscribe('translation', this.findTranslationsOptions.get(), 0, () => {
this.loadNextPageLocked = false;
const nextPeakBefore = this.infiniteScrolling.getNextPeak();
this.calculateNextPeak();
const nextPeakAfter = this.infiniteScrolling.getNextPeak();
if (nextPeakBefore === nextPeakAfter) {
this.infiniteScrolling.resetNextPeak();
}
});
});
});
Template.translation.helpers({
loading() {
return Template.instance().loading;
},
translationSetting() {
return Template.instance().translationSetting;
},
translationList() {
const tpl = Template.instance();
const translations = ReactiveCache.getTranslations(tpl.findTranslationsOptions.get(), {
sort: { modifiedAt: 1 },
fields: { _id: true },
});
tpl.numberTranslations.set(translations.length);
return translations;
},
translationNumber() {
return Template.instance().numberTranslations.get();
},
setError(error) {
Template.instance().error.set(error);
},
setLoading(w) {
Template.instance().loading.set(w);
},
});
Template.translation.events({
'click #searchTranslationButton'(event, tpl) {
_filterTranslation(tpl);
},
'keydown #searchTranslationInput'(event, tpl) {
if (event.keyCode === 13 && !event.shiftKey) {
_filterTranslation(tpl);
}
},
'click #newTranslationButton'() {
Popup.open('newTranslation');
},
'click a.js-translation-menu'(event, tpl) {
const target = $(event.target);
if (!target.hasClass('active')) {
$('.side-menu li.active').removeClass('active');
target.parent().addClass('active');
const targetID = target.data('id');
tpl.translationSetting.set('translation-setting' === targetID);
}
},
'scroll .main-body'(event, tpl) {
tpl.infiniteScrolling.checkScrollPosition(event.currentTarget, () => {
tpl.loadNextPage();
});
},
});
function _filterTranslation(tpl) {
const value = $('#searchTranslationInput').first().val();
if (value === '') {
tpl.findTranslationsOptions.set({});
} else {
const regex = new RegExp(value, 'i');
tpl.findTranslationsOptions.set({
$or: [
{ language: regex },
{ text: regex },
{ translationText: regex },
],
});
}
}
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();
},
});
Template.translationRow.helpers({
translation() {
return ReactiveCache.getTranslation(this.translationId);
},
});
Template.translationRow.events({
'click a.edit-translation': Popup.open('editTranslation'),
'click a.more-settings-translation': Popup.open('settingsTranslation'),
});
Template.newTranslationRow.events({
'click a.new-translation': Popup.open('newTranslation'),
});
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();
Meteor.call('deleteTranslation', this.translationId);
Popup.back();
}
});