282 lines
9.4 KiB
JavaScript
282 lines
9.4 KiB
JavaScript
|
/*
|
||
|
* Builder Index controller Localization entity controller
|
||
|
*/
|
||
|
+function ($) { "use strict";
|
||
|
|
||
|
if ($.oc.builder === undefined)
|
||
|
$.oc.builder = {}
|
||
|
|
||
|
if ($.oc.builder.entityControllers === undefined)
|
||
|
$.oc.builder.entityControllers = {}
|
||
|
|
||
|
var Base = $.oc.builder.entityControllers.base,
|
||
|
BaseProto = Base.prototype
|
||
|
|
||
|
var Localization = function(indexController) {
|
||
|
Base.call(this, 'localization', indexController)
|
||
|
}
|
||
|
|
||
|
Localization.prototype = Object.create(BaseProto)
|
||
|
Localization.prototype.constructor = Localization
|
||
|
|
||
|
// PUBLIC METHODS
|
||
|
// ============================
|
||
|
|
||
|
Localization.prototype.cmdCreateLanguage = function(ev) {
|
||
|
this.indexController.openOrLoadMasterTab($(ev.target), 'onLanguageCreateOrOpen', this.newTabId())
|
||
|
}
|
||
|
|
||
|
Localization.prototype.cmdOpenLanguage = function(ev) {
|
||
|
var language = $(ev.currentTarget).data('id'),
|
||
|
pluginCode = $(ev.currentTarget).data('pluginCode')
|
||
|
|
||
|
this.indexController.openOrLoadMasterTab($(ev.target), 'onLanguageCreateOrOpen', this.makeTabId(pluginCode+'-'+language), {
|
||
|
original_language: language
|
||
|
})
|
||
|
}
|
||
|
|
||
|
Localization.prototype.cmdSaveLanguage = function(ev) {
|
||
|
var $target = $(ev.currentTarget),
|
||
|
$form = $target.closest('form')
|
||
|
|
||
|
$target.request('onLanguageSave').done(
|
||
|
this.proxy(this.saveLanguageDone)
|
||
|
)
|
||
|
}
|
||
|
|
||
|
Localization.prototype.cmdDeleteLanguage = function(ev) {
|
||
|
var $target = $(ev.currentTarget)
|
||
|
$.oc.confirm($target.data('confirm'), this.proxy(this.deleteConfirmed))
|
||
|
}
|
||
|
|
||
|
Localization.prototype.cmdCopyMissingStrings = function(ev) {
|
||
|
var $form = $(ev.currentTarget),
|
||
|
language = $form.find('select[name=language]').val(),
|
||
|
$masterTabPane = this.getMasterTabsActivePane()
|
||
|
|
||
|
$form.trigger('close.oc.popup')
|
||
|
|
||
|
$.oc.stripeLoadIndicator.show()
|
||
|
$masterTabPane.find('form').request('onLanguageCopyStringsFrom', {
|
||
|
data: {
|
||
|
copy_from: language
|
||
|
}
|
||
|
}).always(
|
||
|
$.oc.builder.indexController.hideStripeIndicatorProxy
|
||
|
).done(
|
||
|
this.proxy(this.copyStringsFromDone)
|
||
|
)
|
||
|
}
|
||
|
|
||
|
// EVENT HANDLERS
|
||
|
// ============================
|
||
|
|
||
|
// INTERNAL BUILDER API
|
||
|
// ============================
|
||
|
|
||
|
Localization.prototype.languageUpdated = function(plugin) {
|
||
|
var languageForm = this.findDefaultLanguageForm(plugin)
|
||
|
|
||
|
if (!languageForm) {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
var $languageForm = $(languageForm)
|
||
|
|
||
|
if (!$languageForm.hasClass('oc-data-changed')) {
|
||
|
this.updateLanguageFromServer($languageForm)
|
||
|
}
|
||
|
else {
|
||
|
// If there are changes - merge language from server
|
||
|
// in the background. As this operation is not 100%
|
||
|
// reliable, it could be a good idea to display a
|
||
|
// warning when the user navigates to the tab.
|
||
|
|
||
|
this.mergeLanguageFromServer($languageForm)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Localization.prototype.updateOnScreenStrings = function(plugin) {
|
||
|
var stringElements = document.body.querySelectorAll('span[data-localization-key][data-plugin="'+plugin+'"]')
|
||
|
|
||
|
$.oc.builder.dataRegistry.get($('#builder-plugin-selector-panel form'), plugin, 'localization', null, function(data){
|
||
|
for (var i=stringElements.length-1; i>=0; i--) {
|
||
|
var stringElement = stringElements[i],
|
||
|
stringKey = stringElement.getAttribute('data-localization-key')
|
||
|
|
||
|
if (data[stringKey] !== undefined) {
|
||
|
stringElement.textContent = data[stringKey]
|
||
|
}
|
||
|
else {
|
||
|
stringElement.textContent = stringKey
|
||
|
}
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
|
||
|
// INTERNAL METHODS
|
||
|
// ============================
|
||
|
|
||
|
Localization.prototype.saveLanguageDone = function(data) {
|
||
|
if (data['builderResponseData'] === undefined) {
|
||
|
throw new Error('Invalid response data')
|
||
|
}
|
||
|
|
||
|
var $masterTabPane = this.getMasterTabsActivePane()
|
||
|
|
||
|
$masterTabPane.find('input[name=original_language]').val(data.builderResponseData.language)
|
||
|
this.updateMasterTabIdAndTitle($masterTabPane, data.builderResponseData)
|
||
|
this.unhideFormDeleteButton($masterTabPane)
|
||
|
|
||
|
this.getLanguageList().fileList('markActive', data.builderResponseData.tabId)
|
||
|
this.getIndexController().unchangeTab($masterTabPane)
|
||
|
|
||
|
if (data.builderResponseData.registryData !== undefined) {
|
||
|
var registryData = data.builderResponseData.registryData
|
||
|
|
||
|
$.oc.builder.dataRegistry.set(registryData.pluginCode, 'localization', null, registryData.strings, {suppressLanguageEditorUpdate: true})
|
||
|
$.oc.builder.dataRegistry.set(registryData.pluginCode, 'localization', 'sections', registryData.sections)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Localization.prototype.getLanguageList = function() {
|
||
|
return $('#layout-side-panel form[data-content-id=localization] [data-control=filelist]')
|
||
|
}
|
||
|
|
||
|
Localization.prototype.getCodeEditor = function($tab) {
|
||
|
return $tab.find('div[data-field-name=strings] div[data-control=codeeditor]').data('oc.codeEditor').editor
|
||
|
}
|
||
|
|
||
|
Localization.prototype.deleteConfirmed = function() {
|
||
|
var $masterTabPane = this.getMasterTabsActivePane(),
|
||
|
$form = $masterTabPane.find('form')
|
||
|
|
||
|
$.oc.stripeLoadIndicator.show()
|
||
|
$form.request('onLanguageDelete').always(
|
||
|
$.oc.builder.indexController.hideStripeIndicatorProxy
|
||
|
).done(
|
||
|
this.proxy(this.deleteDone)
|
||
|
)
|
||
|
}
|
||
|
|
||
|
Localization.prototype.deleteDone = function() {
|
||
|
var $masterTabPane = this.getMasterTabsActivePane()
|
||
|
|
||
|
this.getIndexController().unchangeTab($masterTabPane)
|
||
|
this.forceCloseTab($masterTabPane)
|
||
|
}
|
||
|
|
||
|
Localization.prototype.copyStringsFromDone = function(data) {
|
||
|
if (data['builderResponseData'] === undefined) {
|
||
|
throw new Error('Invalid response data')
|
||
|
}
|
||
|
|
||
|
var responseData = data.builderResponseData,
|
||
|
$masterTabPane = this.getMasterTabsActivePane(),
|
||
|
$form = $masterTabPane.find('form'),
|
||
|
codeEditor = this.getCodeEditor($masterTabPane),
|
||
|
newStringMessage = $form.data('newStringMessage'),
|
||
|
mismatchMessage = $form.data('structureMismatch')
|
||
|
|
||
|
codeEditor.getSession().setValue(responseData.strings)
|
||
|
|
||
|
var annotations = []
|
||
|
for (var i=responseData.updatedLines.length-1; i>=0; i--) {
|
||
|
var line = responseData.updatedLines[i]
|
||
|
|
||
|
annotations.push({
|
||
|
row: line,
|
||
|
column: 0,
|
||
|
text: newStringMessage,
|
||
|
type: 'warning'
|
||
|
})
|
||
|
}
|
||
|
|
||
|
codeEditor.getSession().setAnnotations(annotations)
|
||
|
|
||
|
if (responseData.mismatch) {
|
||
|
$.oc.alert(mismatchMessage)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Localization.prototype.findDefaultLanguageForm = function(plugin) {
|
||
|
var forms = document.body.querySelectorAll('form[data-entity=localization]')
|
||
|
|
||
|
for (var i=forms.length-1; i>=0; i--) {
|
||
|
var form = forms[i],
|
||
|
pluginInput = form.querySelector('input[name=plugin_code]'),
|
||
|
languageInput = form.querySelector('input[name=original_language]')
|
||
|
|
||
|
if (!pluginInput || pluginInput.value != plugin) {
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
if (!languageInput) {
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
if (form.getAttribute('data-default-language') == languageInput.value) {
|
||
|
return form
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return null
|
||
|
}
|
||
|
|
||
|
Localization.prototype.updateLanguageFromServer = function($languageForm) {
|
||
|
var self = this
|
||
|
|
||
|
$languageForm.request('onLanguageGetStrings').done(function(data) {
|
||
|
self.updateLanguageFromServerDone($languageForm, data)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
Localization.prototype.updateLanguageFromServerDone = function($languageForm, data) {
|
||
|
if (data['builderResponseData'] === undefined) {
|
||
|
throw new Error('Invalid response data')
|
||
|
}
|
||
|
|
||
|
var responseData = data.builderResponseData,
|
||
|
$tabPane = $languageForm.closest('.tab-pane'),
|
||
|
codeEditor = this.getCodeEditor($tabPane)
|
||
|
|
||
|
if (!responseData.strings) {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
codeEditor.getSession().setValue(responseData.strings)
|
||
|
this.unmodifyTab($tabPane)
|
||
|
}
|
||
|
|
||
|
Localization.prototype.mergeLanguageFromServer = function($languageForm) {
|
||
|
var language = $languageForm.find('input[name=original_language]').val(),
|
||
|
self = this
|
||
|
|
||
|
$languageForm.request('onLanguageCopyStringsFrom', {
|
||
|
data: {
|
||
|
copy_from: language
|
||
|
}
|
||
|
}).done(function(data) {
|
||
|
self.mergeLanguageFromServerDone($languageForm, data)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
Localization.prototype.mergeLanguageFromServerDone = function($languageForm, data) {
|
||
|
if (data['builderResponseData'] === undefined) {
|
||
|
throw new Error('Invalid response data')
|
||
|
}
|
||
|
|
||
|
var responseData = data.builderResponseData,
|
||
|
$tabPane = $languageForm.closest('.tab-pane'),
|
||
|
codeEditor = this.getCodeEditor($tabPane)
|
||
|
|
||
|
codeEditor.getSession().setValue(responseData.strings)
|
||
|
codeEditor.getSession().setAnnotations([])
|
||
|
}
|
||
|
|
||
|
// REGISTRATION
|
||
|
// ============================
|
||
|
|
||
|
$.oc.builder.entityControllers.localization = Localization;
|
||
|
|
||
|
}(window.jQuery);
|