first commit

This commit is contained in:
2023-09-12 21:41:04 +02:00
commit 3361a7f053
13284 changed files with 2116755 additions and 0 deletions

View File

@@ -0,0 +1,105 @@
/*globals labels, TaxonomyTranslation, Backbone, WPML_core, jQuery, _ */
(function () {
"use strict";
TaxonomyTranslation.views.CopyAllPopUpView = Backbone.View.extend({
tagName: 'div',
template: WPML_core[ 'templates/taxonomy-translation/copy-all-popup.html' ],
model: TaxonomyTranslation.models.TermRow,
events: {
'click .cancel': 'close',
'click .js-copy-all-ok': 'copyAll'
},
initialize: function () {
var self = this;
self.dialog = null;
return self;
},
render: function () {
var self = this,
trid = self.model.get('trid'),
originalLang = self.getOriginalLanguage(),
flagUrl = TaxonomyTranslation.data.activeLanguages[ originalLang ].flag,
langLabel = TaxonomyTranslation.data.activeLanguages[ originalLang ].label,
copyMessage = labels.copyToAllMessage.replace( '%language%', '<img src="' + flagUrl + '"> <strong>' + langLabel + '</strong>' );
self.$el.html(
this.template({
trid: trid,
lang: originalLang,
labels: labels,
copyMessage: copyMessage
})
);
self.delegateEvents();
return self;
},
open: function ( ) {
var self = this,
popUpDomEl,
trid = self.model.get( 'trid' ),
lang = self.getOriginalLanguage();
self.render();
popUpDomEl = jQuery('#' + trid + '-popup-' + lang);
popUpDomEl.append( self.$el );
self.dialog = jQuery( '#icl_tt_form_' + trid + '_' + lang );
self.dialog.dialog({
autoOpen: true,
modal: true,
minWidth: 600,
resizable: false,
draggable: false,
dialogClass: 'dialog-fixed otgs-ui-dialog'
});
self.setElement( self.dialog );
self.delegateEvents();
},
close: function () {
if ( this.dialog ) {
this.dialog.dialog( 'close' );
this.undelegateEvents();
this.remove();
this.dialog = null;
}
},
getOriginalLanguage: function () {
var trid = this.model.get( 'trid' );
return TaxonomyTranslation.classes.taxonomy.getOriginalTerm( trid ).get( 'language_code' );
},
copyAll: function () {
var self = this,
trid = self.model.get( 'trid' ),
originalTerm = TaxonomyTranslation.classes.taxonomy.getOriginalTerm( trid ),
name = originalTerm.get( 'name' ),
slug = originalTerm.get( 'slug' ),
description = originalTerm.get( 'description' ),
overwrite = self.$el.find( 'input[name="overwrite"]:checked' ).length > 0;
self.$el.find('.js-copy-all-ok').prop( 'disabled', true );
self.$el.find('.cancel').prop( 'disabled', true );
var terms = self.model.get("terms");
_.each( terms, function ( term ) {
if ( overwrite || term.get( 'name' ) === false ) {
term.save( name, slug, description );
}
});
self.close();
}
});
})(TaxonomyTranslation);

View File

@@ -0,0 +1,129 @@
/*globals TaxonomyTranslation, Backbone, WPML_core, labels, jQuery */
(function () {
"use strict";
TaxonomyTranslation.views.FilterView = Backbone.View.extend({
template: WPML_core[ 'templates/taxonomy-translation/filter.html' ],
model: TaxonomyTranslation.models.Taxonomy,
tag: "div",
untranslated: false,
parent: 0,
lang: 'all',
search: '',
updatingFilter: false,
events: {
"change #child_of": "updateFilter",
"change #status-select": "updateFilter",
"change #in-lang": "updateLangFilter",
"keyup #tax-search": "updateFilter",
"click #tax-apply": "updateTaxHierachy"
},
initialize: function () {
this.listenTo(this.model, 'newTaxonomySet', this.render);
this.listenTo(this.model, 'syncDataLoaded', this.render);
this.listenTo(this.model, 'modeChanged', this.modeChanged);
this.listenTo(TaxonomyTranslation.classes.taxonomy, 'syncDataLoaded', this.updateLangFilter);
},
render: function () {
var self = this;
if ( ! self.updatingFilter ) {
var currentTaxonomy = self.model.get("taxonomy");
if (!currentTaxonomy) {
return false;
} else {
currentTaxonomy = TaxonomyTranslation.data.taxonomies[currentTaxonomy];
}
self.$el.html(self.template({
langs: TaxonomyTranslation.data.activeLanguages,
taxonomy: currentTaxonomy,
parents: self.model.get("parents"),
mode: TaxonomyTranslation.mainView.mode
}));
}
self.updatingFilter = false;
return self;
},
updateLangFilter: function () {
var self = this;
if (TaxonomyTranslation.mainView.mode === 'sync') {
var newLang = self.selectedLang();
if (self.lang !== newLang) {
self.lang = newLang;
self.updatingFilter = true;
TaxonomyTranslation.classes.taxonomy.loadSyncData(newLang);
TaxonomyTranslation.mainView.showLoadingSpinner();
}
} else {
self.updateFilter();
}
return self;
},
updateFilter: function () {
var self = this;
var parent = self.$el.find("#child_of").val();
self.parent = parent != undefined && parent != -1 ? parent : 0;
var untranslated = self.$el.find("#status-select").val();
self.untranslated = !!(untranslated != undefined && untranslated == 1);
self.setSelectVisibility();
var search = self.$el.find("#tax-search").val();
self.search = search != undefined && search.length > 1 ? search : 0;
self.trigger("updatedFilter");
return self;
},
selectedLang: function(){
var self = this;
var inLangSelect = self.$el.find("#in-lang");
return inLangSelect.val();
},
setSelectVisibility: function(){
var self = this;
var inLangLabel = jQuery('#in-lang-label');
var inLangSelect = self.$el.find("#in-lang");
if (self.untranslated || TaxonomyTranslation.mainView.mode === 'sync') {
var lang = self.selectedLang();
self.lang = lang != undefined && lang != 'all' ? lang : 'all';
inLangSelect.show();
inLangLabel.show();
} else {
self.lang = 'all';
inLangSelect.hide();
inLangLabel.hide();
}
return self;
},
modeChanged: function() {
var self = this;
if (TaxonomyTranslation.mainView.mode === 'translate') {
self.render();
}
},
updateTaxHierachy: function () {
var self = this;
if (TaxonomyTranslation.mainView.mode === 'sync') {
TaxonomyTranslation.mainView.model.doSync(self.selectedLang());
} else {
self.updateLangFilter();
}
return self;
}
});
})(TaxonomyTranslation);

View File

@@ -0,0 +1,148 @@
(function () {
TaxonomyTranslation.views.LabelPopUpView = Backbone.View.extend({
tagName: "div",
template: WPML_core[ 'templates/taxonomy-translation/label-popup.html' ],
model: TaxonomyTranslation.models.Taxonomy,
events: {
"click .cancel": "close",
"click .js-label-save": "saveLabel",
"click .js-button-copy": "copyOriginal",
"keydown" : "handleEnter",
"input .js-translation": "updateUI"
},
initialize: function (data, options) {
var self = this;
self.lang = options.lang;
self.defLang = options.defLang;
self.listenTo(self.model, 'labelTranslationSaved', self.close);
self.listenTo(self.model, 'saveFailed', self.render);
return self;
},
open: function ( lang ) {
var self = this;
self.render();
var popUpDomEl = jQuery( '#popup-' + lang );
popUpDomEl.append( self.$el );
self.dialog = jQuery( "#icl_tt_form_" + self.model.get( "taxonomy" ) );
self.dialog.dialog({
autoOpen: true,
modal: true,
minWidth: 800,
resizable: false,
draggable: false,
dialogClass: 'dialog-fixed otgs-ui-dialog'
});
self.setElement( self.dialog );
self.delegateEvents();
self.updateUI();
},
close: function () {
if ( this.dialog ) {
this.dialog.dialog( 'close' );
this.undelegateEvents();
this.remove();
this.dialog = null;
}
},
render: function () {
var self = this;
var taxonomy = self.model.get("taxonomy");
var labels = TaxonomyTranslation.data.translatedTaxonomyLabels[self.lang];
var originalLabels = TaxonomyTranslation.data.translatedTaxonomyLabels[self.model.get('stDefaultLang')];
var slugTranslationEnabled = originalLabels['globalSlugTranslationEnabled']
&& self.model.get('showSlugTranslationField');
if (!labels) {
labels = {
singular: undefined,
general: undefined
};
}
this.$el.html(
self.template({
langs: TaxonomyTranslation.data.allLanguages,
lang: self.lang,
source_lang: self.model.get('stDefaultLang'),
originalLabels: originalLabels,
translatedLabels: labels,
taxonomy: taxonomy,
slugTranslationEnabled: slugTranslationEnabled
})
);
self.delegateEvents();
return self;
},
handleEnter: function(e){
var self = this;
if(self.$el.find('input:focus').length !== 0 && e.keyCode == 13){
self.saveLabel(e);
}
return self;
},
updateUI: function ( e ) {
var self = this,
translationsEntered = true;
self.$el.find( '.js-required-translation' ).each( function () {
if ( jQuery( this ).val() === '' ) {
translationsEntered = false;
}
});
self.$el.find( '.js-label-save' ).prop( 'disabled', !translationsEntered );
},
saveLabel: function (e) {
var singularValueField, pluralValueField, slugValueField, singularValue, pluralValue, slugValue, self, inputPrefix;
self = this;
e.preventDefault();
inputPrefix = '#' + self.model.get("taxonomy") + '-';
singularValueField = self.$el.find(inputPrefix + 'singular');
pluralValueField = self.$el.find(inputPrefix + 'plural');
slugValueField = self.$el.find(inputPrefix + 'slug');
if (singularValueField.length > 0 && pluralValueField.length > 0) {
singularValue = singularValueField.val();
pluralValue = pluralValueField.val();
}
if (slugValueField.length > 0) {
slugValue = slugValueField.val();
}
if (singularValue && pluralValue) {
self.undelegateEvents();
self.$el.find(".spinner").show();
self.$el.find(".js-label-save").prop( 'disabled', true );
self.$el.find(".cancel").prop( 'disabled', true );
self.model.saveLabel(singularValue, pluralValue, slugValue, self.lang);
}
return self;
},
copyOriginal: function ( e ) {
var self = this,
original = jQuery( e.currentTarget ).prev().val();
jQuery( e.currentTarget ).next().val( original );
self.updateUI();
}
});
})(TaxonomyTranslation);

View File

@@ -0,0 +1,108 @@
(function () {
TaxonomyTranslation.views.LabelRowView = Backbone.View.extend({
tagName: 'tbody',
model: TaxonomyTranslation.models.Taxonomy,
events: {
'click .icl_tt_label': 'openPopUPLabel',
'click .js-show-lang-selector': 'showLanguageSelector',
'change .js-tax-lang-selector': 'changeTaxStringsLanguage'
},
initialize: function () {
var self = this;
self.listenTo(self.model, 'labelTranslationSaved', self.render);
},
showLanguageSelector: function(e) {
e.preventDefault();
this.render( true );
if ( WPML_Core.SimpleLanguageSelector ) {
new WPML_Core.SimpleLanguageSelector();
}
},
render: function ( withLangSelector ) {
var self = this,
taxLabels = TaxonomyTranslation.data.translatedTaxonomyLabels,
langs = TaxonomyTranslation.util.langCodes,
taxonomy = self.model.get( 'taxonomy' ),
labelLang = TaxonomyTranslation.classes.taxonomy.get( 'stDefaultLang' ),
langSelector = withLangSelector ? TaxonomyTranslation.data.langSelector : '',
html = '<tr>';
html += WPML_core[ 'templates/taxonomy-translation/original-label.html' ](
{
taxLabel : taxLabels[labelLang],
flag : TaxonomyTranslation.data.allLanguages[labelLang].flag,
langSelector: langSelector
}
);
html += '<td class="wpml-col-languages">';
_.each(langs, function(lang, code) {
if( ! taxLabels[lang] ) {
html += WPML_core[ 'templates/taxonomy-translation/not-translated-label.html' ](
{
taxonomy: taxonomy,
lang : lang,
langs : TaxonomyTranslation.data.activeLanguages
}
);
} else {
if( taxLabels[lang].original ) {
html += WPML_core[ 'templates/taxonomy-translation/original-label-disabled.html' ](
{
lang : lang,
langs: TaxonomyTranslation.data.activeLanguages
}
);
} else {
html += WPML_core[ 'templates/taxonomy-translation/individual-label.html' ](
{
taxonomy: taxonomy,
lang : lang,
langs : TaxonomyTranslation.data.activeLanguages
}
);
}
}
});
html += '</td>';
html += '</tr>';
self.$el.html( html );
self.delegateEvents();
return self;
},
openPopUPLabel: function (e) {
e.preventDefault();
var link = e.target.closest( '.icl_tt_label' ),
id = jQuery( link ).attr( 'id' ),
lang = id.split( '_' ).pop();
if (TaxonomyTranslation.classes.labelPopUpView && typeof TaxonomyTranslation.classes.labelPopUpView !== 'undefined') {
TaxonomyTranslation.classes.labelPopUpView.close();
}
TaxonomyTranslation.classes.labelPopUpView = new TaxonomyTranslation.views.LabelPopUpView({model: TaxonomyTranslation.classes.taxonomy}, {
lang: lang,
defLang: TaxonomyTranslation.classes.taxonomy.get( 'defaultLang' )
});
TaxonomyTranslation.classes.labelPopUpView.open( lang );
},
changeTaxStringsLanguage: function(e) {
var sourceLang = e.target.value;
this.$el.find('.js-tax-lang-selector').prepend( '<span class="spinner is-active">' );
this.model.changeTaxStringsLanguage(sourceLang);
}
});
}(TaxonomyTranslation));

View File

@@ -0,0 +1,73 @@
(function () {
TaxonomyTranslation.views.NavView = Backbone.View.extend({
template: WPML_core[ 'templates/taxonomy-translation/nav.html' ],
model: TaxonomyTranslation.models.taxonomy,
events: {
"change .current-page": 'goToPage',
"click .next-page": 'nextPage',
"click .prev-page": 'prevPage',
"click .first-page": 'firstPage',
"click .last-page": 'lastPage'
},
initialize: function (data, options) {
this.page = 1;
this.perPage = options.perPage;
},
goToPage: function () {
var self = this;
var currentPageField = jQuery(".current-page");
var page = currentPageField.val();
if (page > 0 && page <= self.pages) {
self.page = parseInt(page);
self.trigger("newPage");
} else {
currentPageField.val(self.page);
}
return self;
},
nextPage: function(){
var self = this;
self.$el.find('.current-page').val(self.page + 1).change();
},
prevPage: function(){
var self = this;
self.$el.find('.current-page').val(self.page - 1).change();
},
firstPage: function(){
var self = this;
self.$el.find('.current-page').val(1).change();
},
lastPage: function(){
var self = this;
self.$el.find('.current-page').val(self.pages).change();
},
setCounts: function(){
var self = this;
var rows = TaxonomyTranslation.data.termRowsCollection.length;
var displayedCount = TaxonomyTranslation.mainView.termRowsView.getDisplayCount();
rows = displayedCount >= 0 ? displayedCount : rows;
rows = rows ? rows : 0;
self.rows = rows;
self.pages = Math.ceil(rows / self.perPage);
},
render: function () {
var self = this;
self.setCounts();
if (self.pages > 1) {
self.$el.html(self.template({
page: self.page,
pages: self.pages,
items: self.rows
}));
self.$el.show();
} else {
self.$el.hide();
}
return self;
}
});
})(TaxonomyTranslation);

View File

@@ -0,0 +1,11 @@
/*globals labels */
(function () {
TaxonomyTranslation.views.OriginalTermPopUpView = TaxonomyTranslation.views.TermPopUpView.extend({
template: WPML_core[ 'templates/taxonomy-translation/original-term-popup.html' ],
getMinDialogWidth: function ( ) {
return 400;
}
});
})(TaxonomyTranslation);

View File

@@ -0,0 +1,48 @@
/*globals labels */
(function () {
TaxonomyTranslation.views.TableView = Backbone.View.extend({
template: WPML_core[ 'templates/taxonomy-translation/table.html' ],
tag: 'div',
termsView: {},
model: TaxonomyTranslation.models.Taxonomy,
initialize: function ( data, options ) {
this.type = options.type;
},
render: function () {
if ( ! TaxonomyTranslation.classes.taxonomy.get( "taxonomy" ) ) {
return false;
}
var self = this,
langs = TaxonomyTranslation.data.activeLanguages,
count = self.isTermTable() ? TaxonomyTranslation.data.termRowsCollection.length : 1,
tax = self.model.get( 'taxonomy' ),
firstColumnHeading = self.isTermTable() ? labels.firstColumnHeading.replace( '%taxonomy%', TaxonomyTranslation.data.taxonomies[ tax ].singularLabel ) : '';
this.$el.html(self.template({
langs: langs,
tableType: self.type,
count: count,
firstColumnHeading: firstColumnHeading,
mode: TaxonomyTranslation.mainView.mode
}));
return self;
},
isTermTable: function () {
return this.type === 'terms';
},
clear: function () {
}
});
})(TaxonomyTranslation);

View File

@@ -0,0 +1,266 @@
/*globals WPML_core, TaxonomyTranslation, Backbone, labels, jQuery, document */
(function () {
"use strict";
TaxonomyTranslation.views.TaxonomyView = Backbone.View.extend({
el: "#taxonomy-translation",
model: TaxonomyTranslation.models.Taxonomy,
tag: "div",
termRowsView: {},
mode: 'translate',
initialMode: 'translate',
perPage: 10,
events: {
"click #term-table-sync-header": "setToSync",
"click #term-table-header": "setToTranslate",
"click #tax-apply": "doSync"
},
syncedLabel: labels.hieraAlreadySynced,
initialize: function (model, options) {
var self = this;
self.perPage = jQuery( '#wpml_tt_taxonomy_translation_wrap' ).data( 'items_per_page' );
self.initialMode = options.sync === true ? 'sync' : 'translate';
self.navView = new TaxonomyTranslation.views.NavView({model: self.model}, {perPage: self.perPage});
self.filterView = new TaxonomyTranslation.views.FilterView({model: self.model});
self.listenTo(self.filterView, 'updatedFilter', function () {
self.navView.page = 1;
self.renderRows();
});
self.termTableView = new TaxonomyTranslation.views.TableView({model: self.model}, {type: "terms"});
self.labelTableView = new TaxonomyTranslation.views.TableView({model: self.model}, {type: "labels"});
self.termRowsView = new TaxonomyTranslation.views.TermRowsView({collection: TaxonomyTranslation.data.termRowsCollection}, {
start: 0,
end: self.perPage
});
self.listenTo(self.model, 'newTaxonomySet', self.renderNewTaxonomy);
self.listenTo(self.model, 'syncDataLoaded', self.renderNewTaxonomy);
return self;
},
changeMode: function (mode) {
var self = this;
self.mode = mode === 'translate' || ( mode === 'sync' && self.model.isHierarchical() ) ? mode : 'translate';
self.navView.off();
self.navView = new TaxonomyTranslation.views.NavView({model: self.model}, {perPage: self.perPage});
self.listenTo(self.navView, 'newPage', self.render);
if (self.mode === "sync") {
self.model.loadSyncData(self.filterView.selectedLang());
} else {
self.renderRows();
self.render();
}
self.model.trigger('modeChanged');
self.syncedLabel = labels.hieraAlreadySynced;
return self;
},
setToTranslate: function () {
var self = this;
if (self.mode !== 'translate') {
self.changeMode('translate');
}
return self;
},
setToSync: function () {
var self = this;
if (self.mode !== 'sync') {
self.changeMode('sync');
TaxonomyTranslation.mainView.showLoadingSpinner();
}
return self;
},
setLabels: function () {
var self = this,
tax = self.model.get("taxonomy"),
taxonomyPluralLabel = TaxonomyTranslation.data.taxonomies[tax].label,
taxonomySingularLabel = TaxonomyTranslation.data.taxonomies[tax].singularLabel;
self.headerTerms = labels.translate.replace( '%taxonomy%', taxonomySingularLabel );
self.summaryTerms = labels.summaryTerms.replace( '%taxonomy%', '<strong>' + taxonomyPluralLabel + '</strong>' );
self.resultsTruncated = labels.resultsTruncated.replace( '%taxonomy%', '<strong>' + taxonomyPluralLabel + '</strong>' );
self.labelSummary = labels.summaryLabels.replace( '%taxonomy%', '<strong>' + taxonomySingularLabel + '</strong>' );
return self;
},
renderRows: function () {
var self = this;
if (TaxonomyTranslation.data.termRowsCollection.length > 0) {
self.termRowsView.start = (self.navView.page - 1 ) * self.perPage;
self.termRowsView.end = self.termRowsView.start + self.perPage;
var termRowsFragment = self.termRowsView.render().el;
jQuery("#tax-table-terms").first('tbody').append(termRowsFragment);
}
self.navView.render();
return self;
},
renderNewTaxonomy: function(){
var self = this;
self.navView.off();
self.navView = undefined;
self.navView = new TaxonomyTranslation.views.NavView({model: self.model}, {perPage: self.perPage});
this.listenTo(this.navView, 'newPage', this.render);
self.renderRows();
self.render();
if (self.initialMode === 'sync') {
self.initialMode = false;
self.setToSync();
}
return self;
},
getMainFragment: function () {
var self = this;
var mainFragment = document.createElement("div"),
mainTemplate = WPML_core[ 'templates/taxonomy-translation/taxonomy-main-wrap.html' ],
tabsTemplate = WPML_core[ 'templates/taxonomy-translation/tabs.html' ],
taxonomy = TaxonomyTranslation.data.taxonomies[ self.model.get( "taxonomy" ) ],
htmlTabs = tabsTemplate( {
taxonomy: taxonomy,
headerTerms: self.headerTerms,
syncLabel: labels.Synchronize,
mode: self.mode
}),
hasContent = self.termRowsView && self.termRowsView.getDisplayCount() !== 0,
htmlMain = mainTemplate({
taxonomy: taxonomy,
langs: TaxonomyTranslation.data.activeLanguages,
summaryTerms: self.summaryTerms,
resultsTruncated: self.resultsTruncated,
labelSummary: self.labelSummary,
mode: self.mode,
hasContent: hasContent,
labelSynced: self.syncedLabel
});
mainFragment.innerHTML = htmlTabs + htmlMain;
mainFragment = self.addMainElements( mainFragment, hasContent );
return mainFragment;
},
addMainElements: function ( mainFragment, hasContent ) {
var self = this;
self.filterFragment = self.filterFragment ? self.filterFragment : self.filterView.render().el;
mainFragment.querySelector("#wpml-taxonomy-translation-filters").appendChild(self.filterFragment);
if ( hasContent || self.mode === 'translate' ) {
var termTableFragment = self.termTableView.render().el;
mainFragment.querySelector("#wpml-taxonomy-translation-terms-table").appendChild(termTableFragment);
mainFragment = self.addTableRows(mainFragment);
}
var bottomContent = self.model.get( "bottomContent" );
if( typeof bottomContent != 'undefined' ){
mainFragment.appendChild( jQuery( bottomContent )[0] );
}
return mainFragment;
},
render: function () {
var self = this;
self.setLabels();
var renderedFragment = document.createDocumentFragment();
var mainFragment = self.getMainFragment();
renderedFragment.appendChild(mainFragment);
if (TaxonomyTranslation.data.termRowsCollection.length > self.perPage &&
renderedFragment.querySelector("#wpml-taxonomy-translation-terms-nav")) {
var navFragment = self.navView.render().el;
renderedFragment.querySelector("#wpml-taxonomy-translation-terms-nav").appendChild(navFragment);
}
self.addLabelTranslation(mainFragment, renderedFragment);
self.$el.html(renderedFragment);
jQuery(".icl_tt_label").on("click", self.openPopUPLabel);
self.showLoadingSpinner( false );
self.isRendered = true;
self.filterView.delegateEvents();
self.delegateEvents();
self.maybeHideHeader();
jQuery('.icl_tt_main_bottom').show();
var loading = jQuery( '.wpml-loading-taxonomy' );
if ( loading.length ) {
loading.hide();
var loaded = jQuery( '.wpml_taxonomy_loaded' );
if ( loaded.length ) {
loaded.show();
loaded.parent().children( '.wpml-loading-taxonomy' ).remove();
}
}
return self;
},
addLabelTranslation: function (mainFragment, renderedFragment) {
var self = this;
if (TaxonomyTranslation.data.translatedTaxonomyLabels && self.mode !== 'sync') {
var labelTableFragment = self.labelTableView.render().el;
mainFragment.querySelector("#wpml-taxonomy-translation-labels-table").appendChild(labelTableFragment);
if (renderedFragment.querySelector("#tax-table-labels")) {
var labelRowFragment = new TaxonomyTranslation.views.LabelRowView(({model: self.model})).render().el;
mainFragment.querySelector("#tax-table-labels").appendChild(labelRowFragment);
}
}
return mainFragment;
},
addTableRows: function (mainFragment) {
var self = this;
var termRowsFragment;
self.termRowsView.start = (self.navView.page - 1 ) * self.perPage;
self.termRowsView.end = self.termRowsView.start + self.perPage;
termRowsFragment = self.termRowsView.render().el;
mainFragment.querySelector("#tax-table-terms").appendChild(termRowsFragment);
return mainFragment;
},
/**
* Used by WCML to hide the controls for changing the taxonomy
*/
maybeHideHeader: function () {
var taxonomySwitcher = jQuery("#icl_tt_tax_switch");
var potentialHiddenSelectInput = jQuery('#tax-selector-hidden');
var potentialHiddenTaxInput = jQuery('#tax-preselected');
if (potentialHiddenSelectInput.length !== 0 &&
potentialHiddenSelectInput.val() &&
potentialHiddenTaxInput.length !== 0 &&
potentialHiddenTaxInput.val()) {
taxonomySwitcher.closest('label').hide();
jQuery('[id="term-table-summary"]').hide();
}
},
selectTaxonomy: function () {
var self = this,
tax = jQuery("#icl_tt_tax_switch").val();
if (tax !== undefined) {
self.mode = 'translate';
self.model.setTaxonomy(tax);
}
},
doSync: function () {
var self = this;
self.$el.find( '#tax-apply' ).prop( 'disabled', true );
TaxonomyTranslation.mainView.model.doSync( self.$el.find("#in-lang").val() );
self.syncedLabel = labels.hieraSynced;
},
showLoadingSpinner: function( state ) {
if ( state === undefined || state ) {
jQuery('.wpml-loading-taxonomy').show();
} else {
jQuery('.wpml-loading-taxonomy').hide();
}
}
});
})(TaxonomyTranslation);

View File

@@ -0,0 +1,30 @@
/*globals labels */
(function () {
TaxonomyTranslation.views.TermOriginalView = TaxonomyTranslation.views.TermView.extend({
tagName: "td",
className: "wpml-col-title wpml-col-title-flag",
template: WPML_core[ 'templates/taxonomy-translation/original-term.html' ],
render: function () {
var self = this;
self.needsCorrection = false;
self.$el.html(
self.template({
trid: self.model.get("trid"),
lang: self.model.get("language_code"),
name: self.model.get("name"),
level: self.model.get("level"),
correctedLevel: self.model.get("level"),
langs: TaxonomyTranslation.data.activeLanguages
})
);
self.delegateEvents();
return self;
}
});
})(TaxonomyTranslation);

View File

@@ -0,0 +1,156 @@
/*globals labels */
(function () {
TaxonomyTranslation.views.TermPopUpView = Backbone.View.extend({
tagName: 'div',
template: WPML_core[ 'templates/taxonomy-translation/term-popup.html' ],
model: TaxonomyTranslation.models.Term,
events: {
'click .cancel': 'close',
'click .term-save': 'saveTerm',
'click .js-button-copy': 'copyOriginal',
'keydown': 'handleEnter',
'input #term-name': 'updateUI',
'focusout input#term-name': 'generateSlug'
},
initialize: function () {
var self = this;
self.listenTo(self.model, 'translationSaved', self.close);
self.listenTo(self.model, 'saveFailed', self.render);
self.dialog = null;
return self;
},
render: function () {
var self = this,
trid = self.model.get('trid'),
term = self.model.getNameSlugAndDescription(),
term_meta = self.model.getMetaData(),
original_term_meta = TaxonomyTranslation.classes.taxonomy.getOriginalTermMeta( trid ),
original_term = TaxonomyTranslation.classes.taxonomy.getOriginalTerm( trid );
self.$el.html(
this.template({
trid: trid,
lang: self.model.get('language_code'),
source_lang: original_term.get( 'language_code' ),
langs: TaxonomyTranslation.data.activeLanguages,
ttid: self.model.get('term_taxonomy_id'),
term: term,
original_term: original_term.getNameSlugAndDescription(),
term_meta: term_meta,
original_term_meta: original_term_meta
})
);
self.delegateEvents();
return self;
},
handleEnter: function (e) {
var self = this;
if (self.$el.find('input:focus').length !== 0 && e.keyCode == 13) {
self.saveTerm(e);
}
return self;
},
saveTerm: function (e) {
var self = this,
meta_data = {};
self.undelegateEvents();
e.preventDefault();
var name = self.$el.find('#term-name').val(),
slug = self.$el.find('#term-slug').val(),
description = self.$el.find('#term-description').val();
var term_metas = self.$el.find('.term-meta');
_.each( term_metas, function ( meta_object ) {
meta_data[ meta_object.dataset.metaKey ] = meta_object.value;
});
if (name) {
self.$el.find('.spinner').show();
self.$el.find('.term-save').prop( 'disabled', true );
self.$el.find('.cancel').prop( 'disabled', true );
self.model.save(name, slug, description, meta_data);
}
return self;
},
open: function ( trid, lang ) {
var self = this;
self.render();
var popUpDomEl = jQuery('#' + trid + '-popup-' + lang);
popUpDomEl.append( self.$el );
self.dialog = jQuery( '#icl_tt_form_' + trid + '_' + lang );
self.dialog.dialog({
autoOpen: true,
modal: true,
minWidth: self.getMinDialogWidth(),
resizable: false,
draggable: false,
dialogClass: 'dialog-fixed otgs-ui-dialog'
});
self.setElement( self.dialog );
self.delegateEvents();
self.updateUI();
},
getMinDialogWidth: function ( ) {
return 800;
},
close: function () {
if ( this.dialog ) {
this.dialog.dialog( 'close' );
this.undelegateEvents();
this.remove();
this.dialog = null;
}
},
copyOriginal: function ( e ) {
var self = this,
original = jQuery( e.currentTarget ).prev().val();
jQuery( e.currentTarget ).next().val( original );
self.generateSlug();
self.updateUI();
},
updateUI: function ( ) {
var self = this;
self.$el.find( '.term-save' ).prop( 'disabled', self.$el.find( '#term-name').val() === '' );
},
generateSlug: function() {
var self = this,
term_slug = self.$el.find( '#term-slug' ),
term_name = self.$el.find( '#term-name' );
if ('' === term_slug.val() && '' !== term_name.val()) {
term_slug.prop('disabled', true);
term_slug.css('background', 'url(' + window.icl_ajxloaderimg_src + ') no-repeat left center');
jQuery.ajax({
url: ajaxurl,
type: "POST",
data: {
action: 'wpml_generate_term_slug',
term: term_name.val(),
nonce: labels.wpml_generate_unique_slug_nonce,
language_code: self.model.get('language_code'),
taxonomy: TaxonomyTranslation.classes.taxonomy.get("taxonomy"),
},
success: function(response) {
if( true === response.success ) {
term_slug.val( response.data.slug );
}
term_slug.prop('disabled', false);
term_slug.css('background', '');
}
});
}
}
});
})(TaxonomyTranslation);

View File

@@ -0,0 +1,100 @@
/*globals _, TaxonomyTranslation, document, Backbone, jQuery */
(function () {
"use strict";
TaxonomyTranslation.views.TermRowView = Backbone.View.extend({
tagName: "tr",
model: TaxonomyTranslation.models.TermRow,
termViews: {},
className: '',
events: {
'click .js-copy-to-all-langs': 'copyToAllLangs'
},
initialize: function () {
var self = this;
self.listenTo(TaxonomyTranslation.classes.taxonomy, 'syncDataLoaded', self.maybeHide);
},
maybeHide: function () {
var self = this;
var visible = false;
var terms = self.model.get("terms");
_.each(TaxonomyTranslation.data.syncData, function (correction) {
_.each(terms, function (term) {
if (correction.translated_id == term.get("term_taxonomy_id")) {
visible = true;
}
});
});
if (visible) {
self.$el.show();
} else {
self.$el.hide();
}
},
render: function () {
var termsFragments = {};
var self = this;
var langs = TaxonomyTranslation.util.langCodes;
var terms = self.model.get("terms");
var originalTerm = null;
_.each(langs, function (lang) {
var term = terms[lang];
if (term === undefined) {
term = new TaxonomyTranslation.models.Term({language_code: lang, trid: self.model.get("trid")});
terms[lang] = term;
self.model.set("terms", terms, {silent: true});
}
if ( term.isOriginal() ) {
originalTerm = term;
}
var newView = new TaxonomyTranslation.views.TermView({model: term});
self.termViews[lang] = newView;
if (TaxonomyTranslation.mainView.mode === 'sync') {
termsFragments[lang] = newView.loadSyncData().el;
} else {
termsFragments[lang] = newView.render().el;
}
});
if ( originalTerm ) {
var newRowFragment = document.createDocumentFragment();
if ( TaxonomyTranslation.mainView.mode !== 'sync' ) {
var originalView = new TaxonomyTranslation.views.TermOriginalView({model: originalTerm });
newRowFragment.appendChild( originalView.render().el );
var newRowLangs = document.createElement( 'td' );
jQuery( newRowLangs ).addClass( 'wpml-col-languages' );
_.each(langs, function(lang){
newRowLangs.appendChild(termsFragments[lang]);
});
newRowFragment.appendChild( newRowLangs );
} else {
_.each(langs, function(lang){
var newRowTD = document.createElement( 'td' );
newRowTD.appendChild(termsFragments[lang]);
newRowFragment.appendChild( newRowTD );
});
}
self.$el.html(newRowFragment);
}
return self;
},
copyToAllLangs: function () {
var self = this;
TaxonomyTranslation.classes.copyAllPopUpView = new TaxonomyTranslation.views.CopyAllPopUpView( { model: self.model } );
TaxonomyTranslation.classes.copyAllPopUpView.open( );
}
});
}(TaxonomyTranslation));

View File

@@ -0,0 +1,113 @@
(function () {
TaxonomyTranslation.views.TermRowsView = Backbone.View.extend({
tagName: 'tbody',
collection: TaxonomyTranslation.data.termRowsCollection,
rowViews: [],
start: 0,
end: 10,
count: -1,
initialize: function (data, options) {
var self = this;
self.end = options.end;
self.start = options.start;
},
getDisplayedRows: function () {
var self = this;
var displayedRows = self.collection;
if (!displayedRows) {
self.count = -1;
return false;
}
if (TaxonomyTranslation.mainView.mode === 'sync') {
displayedRows = displayedRows.filter(function (row) {
"use strict";
return row.unSyncFilter();
});
}
var parentFilter = TaxonomyTranslation.mainView.filterView.parent ? TaxonomyTranslation.mainView.filterView.parent : false;
if (parentFilter) {
displayedRows = displayedRows.filter(function (row) {
return row.parentOf(parentFilter);
});
}
var untranslatedFilter = TaxonomyTranslation.mainView.filterView.untranslated ? TaxonomyTranslation.mainView.filterView.untranslated : false;
if (untranslatedFilter) {
displayedRows = displayedRows.filter(function (row) {
return !row.allTermsTranslated();
});
}
var langFilter = TaxonomyTranslation.mainView.filterView.lang && TaxonomyTranslation.mainView.filterView.lang !== 'all' ? TaxonomyTranslation.mainView.filterView.lang : false;
if (langFilter && langFilter != 'all' && (untranslatedFilter || parentFilter)) {
displayedRows = displayedRows.filter(function (row) {
return !row.translatedIn(langFilter);
});
}
var searchFilter = false;
if (TaxonomyTranslation.mainView.filterView.search && TaxonomyTranslation.mainView.filterView.search !== '') {
searchFilter = TaxonomyTranslation.mainView.filterView.search;
}
if (searchFilter) {
displayedRows = displayedRows.filter(function (row) {
if (langFilter && langFilter !== 'all') {
return row.matchesInLang(searchFilter, langFilter);
} else {
return row.matches(searchFilter);
}
});
}
self.count = displayedRows.length;
return displayedRows;
},
getDisplayCount: function(){
return this.count;
},
render: function () {
var self = this,
output = document.createDocumentFragment(),
displayedRows = self.getDisplayedRows();
self.rowViews = [];
if ( displayedRows && displayedRows.length > 0 ) {
displayedRows = displayedRows.slice(self.start, self.end);
displayedRows.forEach(function (row) {
var newView = new TaxonomyTranslation.views.TermRowView({model: row });
self.rowViews.push(newView);
output.appendChild(newView.render().el);
newView.delegateEvents();
});
self.$el.html(output);
} else {
var taxonomy = TaxonomyTranslation.classes.taxonomy.get("taxonomy"),
taxonomyPluralLabel = TaxonomyTranslation.data.taxonomies[taxonomy].label,
message = labels.noTermsFound.replace( '%taxonomy%', taxonomyPluralLabel );
self.$el.html(
WPML_core[ 'templates/taxonomy-translation/no-terms-found.html' ] ({
message: message
})
);
}
return self;
}
});
})(TaxonomyTranslation);

View File

@@ -0,0 +1,119 @@
/*globals labels, TaxonomyTranslation, _, jQuery, WPML_core */
(function () {
TaxonomyTranslation.views.TermView = Backbone.View.extend({
tagName: 'span',
template: WPML_core[ "templates/taxonomy-translation/term-translated.html" ],
model: TaxonomyTranslation.models.Term,
popUpView: false,
needsCorrection: false,
events: {
"click .icl_tt_term_name": "openPopUpTerm"
},
initialize: function () {
var self = this;
self.listenTo(self.model, 'translationSaved', self.render);
self.listenTo(self.model, 'translationSaved', function () {
jQuery('#tax-apply').prop('disabled', false);
});
},
loadSyncData: function () {
"use strict";
var self = this;
var syncData = TaxonomyTranslation.data.syncData;
var ttid = self.model.get('term_taxonomy_id');
var parent = self.model.get('parent');
var found = false;
var needsCorrection = false;
var correctParentText = false;
var parentName = TaxonomyTranslation.classes.taxonomy.getTermName(parent);
_.each(syncData, function (correction) {
if (correction.translated_id == ttid) {
found = true;
var oldParent = '';
if (parent !== 0) {
oldParent = '<span style="background-color:#F55959;">-' + TaxonomyTranslation.classes.taxonomy.getTermName(parent) + '</span>';
jQuery('.wpml-parent-removed').show();
}
var newParent = '';
if (correction.correct_parent !== 0) {
newParent = '<span style="background-color:#CCFF99;">+' + TaxonomyTranslation.classes.taxonomy.getTermName(correction.correct_parent) + '</span>';
jQuery('.wpml-parent-added').show();
}
parentName = oldParent + ' ' + newParent;
needsCorrection = true;
}
});
if (needsCorrection === true) {
self.template = WPML_core[ 'templates/taxonomy-translation/term-not-synced.html' ];
} else {
self.template = WPML_core[ 'templates/taxonomy-translation/term-synced.html' ];
}
self.$el.html(
self.template({
trid: self.model.get("trid"),
lang: self.model.get("language_code"),
name: self.model.get("name"),
level: self.model.get("level"),
correctedLevel: self.model.get("level"),
correctParent: correctParentText,
parent: parentName
})
);
self.needsCorrection = needsCorrection;
return self;
},
render: function () {
var self = this;
self.needsCorrection = false;
if ( ! self.model.get( "name" ) ) {
self.template = WPML_core[ "templates/taxonomy-translation/term-not-translated.html" ];
} else if ( self.model.isOriginal() ) {
self.template = WPML_core[ "templates/taxonomy-translation/term-original-disabled.html" ];
} else {
self.template = WPML_core[ "templates/taxonomy-translation/term-translated.html" ];
}
var html = self.template({
trid: self.model.get("trid"),
lang: self.model.get("language_code"),
name: self.model.get("name"),
level: self.model.get("level"),
correctedLevel: self.model.get("level"),
langs: TaxonomyTranslation.data.activeLanguages
});
self.$el.html( html );
return self;
},
openPopUpTerm: function (e) {
var self = this;
e.preventDefault();
var trid = self.model.get("trid");
var lang = self.model.get("language_code");
if (trid && lang) {
if (TaxonomyTranslation.classes.termPopUpView && typeof TaxonomyTranslation.classes.termPopUpView !== 'undefined') {
TaxonomyTranslation.classes.termPopUpView.close();
}
if ( self.model.isOriginal() ) {
TaxonomyTranslation.classes.termPopUpView = new TaxonomyTranslation.views.OriginalTermPopUpView( { model: self.model } );
} else {
TaxonomyTranslation.classes.termPopUpView = new TaxonomyTranslation.views.TermPopUpView( { model: self.model } );
}
TaxonomyTranslation.classes.termPopUpView.open( trid, lang );
}
}
});
})(TaxonomyTranslation);