The Open Source kanban (built with Meteor). Keep variable/table/field names camelCase. For translations, only add Pull Request changes to wekan/i18n/en.i18n.json , other translations are done at https://transifex.com/wekan/wekan only.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
wekan/client/components/settings/translationBody.js

214 lines
5.6 KiB

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();
}
});