summaryrefslogtreecommitdiff
path: root/addons/web_editor/static/src
diff options
context:
space:
mode:
authorChristophe Matthieu <chm@odoo.com>2015-05-27 14:49:15 +0200
committerChristophe Matthieu <chm@odoo.com>2015-07-10 17:00:14 +0200
commitff58a961e8fa5adc38dfdb3045790f6203b57b46 (patch)
tree5d023b023b9a846befe4deea0688ac6cbc7af85f /addons/web_editor/static/src
parent89d620e4eb389aa5c75939fc97613dbd2154619b (diff)
[IMP] web_editor: add modal to translate node attributes
Diffstat (limited to 'addons/web_editor/static/src')
-rw-r--r--addons/web_editor/static/src/js/editor.js4
-rw-r--r--addons/web_editor/static/src/js/translator.js124
-rw-r--r--addons/web_editor/static/src/xml/editor.xml2
-rw-r--r--addons/web_editor/static/src/xml/translator.xml19
4 files changed, 134 insertions, 15 deletions
diff --git a/addons/web_editor/static/src/js/editor.js b/addons/web_editor/static/src/js/editor.js
index b09a69e3818..2958d045d0f 100644
--- a/addons/web_editor/static/src/js/editor.js
+++ b/addons/web_editor/static/src/js/editor.js
@@ -55,7 +55,7 @@ editor.reload = function () {
/* ----- TOP EDITOR BAR FOR ADMIN ---- */
base.ready().then(function () {
- if (editor.editable && location.search.indexOf("enable_editor") >= 0 && !editor.no_editor) {
+ if (editor.editable && location.search.indexOf("enable_editor") >= 0) {
editor.editor_bar = new editor.Class();
editor.editor_bar.prependTo(document.body);
}
@@ -90,7 +90,7 @@ editor.Class = Widget.extend({
var flag = false;
window.onbeforeunload = function(event) {
- if ($('.o_editable.o_dirty').length && !flag) {
+ if (rte.history.getEditableHasUndo().length && !flag) {
flag = true;
setTimeout(function () {flag=false;},0);
return _t('This document is not saved!');
diff --git a/addons/web_editor/static/src/js/translator.js b/addons/web_editor/static/src/js/translator.js
index 190706a111c..b15e8278004 100644
--- a/addons/web_editor/static/src/js/translator.js
+++ b/addons/web_editor/static/src/js/translator.js
@@ -8,8 +8,10 @@ var Class = require('web.Class');
var Widget = require('web.Widget');
var base = require('web_editor.base');
var rte = require('web_editor.rte');
+var editor_widget = require('web_editor.widget');
var qweb = core.qweb;
+var _t = core._t;
ajax.loadXML('/web_editor/static/src/xml/translator.xml', qweb);
@@ -17,14 +19,20 @@ ajax.loadXML('/web_editor/static/src/xml/translator.xml', qweb);
var translatable = !!$('html').data('translatable');
var edit_translations = !!$('html').data('edit_translations');
-function unbind_click(event) {
- if (event.ctrlKey || !$(event.target).is(':o_editable')) {
- return;
- }
- event.preventDefault();
- event.stopPropagation();
-}
-
+$.fn.extend({
+ prependEvent: function (events, selector, data, handler) {
+ this.on(events, selector, data, handler);
+ events = events.split(' ');
+ this.each(function () {
+ var el = this;
+ _.each(events, function (event) {
+ var handler = $._data(el, 'events')[event].pop();
+ $._data(el, 'events')[event].unshift(handler);
+ });
+ });
+ return this;
+ }
+});
var RTE_Translate = rte.Class.extend({
saveElement: function ($el, context) {
@@ -49,6 +57,33 @@ var RTE_Translate = rte.Class.extend({
},
});
+var Translate_Modal = editor_widget.Dialog.extend({
+ template: 'web_editor.translator.attributes',
+ init: function (parent, node) {
+ this._super();
+ this.parent = parent;
+ this.$target = $(node);
+ this.translation = $(node).data('translation');
+ },
+ start: function () {
+ var self = this;
+ this._super();
+ var $group = this.$el.find('.form-group');
+ _.each(this.translation, function (node, attr) {
+ var $node = $(node);
+ var $label = $('<label class="control-label"></label>').text(attr);
+ var $input = $('<input class="form-control"/>').val($node.html());
+ $input.on('change keyup', function () {
+ var value = $input.val();
+ $node.html(value).trigger('change', node);
+ $node.data('$node').attr($node.data('attribute'), value).trigger('translate');
+ self.parent.rte_changed(node);
+ });
+ $group.append($label).append($input);
+ });
+ }
+});
+
var Translate = Widget.extend({
events: {
'click [data-action="save"]': 'save_and_reload',
@@ -63,14 +98,43 @@ var Translate = Widget.extend({
this._super();
this.rte = new RTE_Translate(this, this.config);
- this.rte.on('change', this, this.onChange);
+ this.rte.on('change', this, this.rte_changed);
},
start: function () {
this._super();
+ this.$('button[data-action=save]').prop('disabled', true);
return this.edit();
},
setTarget: function ($target) {
this.$target = $target.find('[data-oe-translation-id], [data-oe-model][data-oe-id][data-oe-field]');
+
+ // attributes
+
+ var attrs = ['placeholder', 'title', 'alt'];
+ _.each(attrs, function (attr) {
+ $target.find('['+attr+'*="data-oe-translation-id="]').each(function () {
+ var $node = $(this);
+ var translation = $node.data('translation') || {};
+ var trans = $node.attr(attr);
+ var match = trans.match(/<span [^>]*data-oe-translation-id="([0-9]+)"[^>]*>(.*)<\/span>/);
+ var $trans = $(trans).addClass('hidden o_editable o_editable_translatable_attribute').appendTo('body');
+ $trans.data('$node', $node).data('attribute', attr);
+ translation[attr] = $trans[0];
+ $node.attr(attr, match[2]);
+
+ var select2 = $node.data('select2');
+ if (select2) {
+ select2.blur();
+ $node.on('translate', function () {
+ select2.blur();
+ });
+ $node = select2.container.find('input');
+ }
+ $node.addClass('o_translatable_attribute').data('translation', translation);
+ });
+ });
+ this.$target_attr = $target.find('.o_translatable_attribute');
+ this.$target_attribute = $('.o_editable_translatable_attribute');
},
find: function (selector) {
return selector ? this.$target.find(selector).addBack().filter(selector) : this.$target;
@@ -94,10 +158,11 @@ var Translate = Widget.extend({
this.$el.show();
this.trigger("edit");
},
- onChange: function (node) {
+ rte_changed: function (node) {
var $node = $(node);
var trans = this.getTranlationObject($node[0]);
$node.toggleClass('o_dirty', trans.value !== $node.html().replace(/[ \t\n\r]+/, ' '));
+ this.$('button[data-action=save]').prop('disabled', !$('.o_editable.o_dirty').length);
},
getTranlationObject: function (node) {
var $node = $(node);
@@ -113,14 +178,48 @@ var Translate = Widget.extend({
}
return trans;
},
+ __unbind_click: function (event) {
+ if (event.ctrlKey || !$(event.target).is(':o_editable')) {
+ return;
+ }
+ event.preventDefault();
+ event.stopPropagation();
+ },
+ __translate_attribute: function (event) {
+ if (event.ctrlKey) {
+ return;
+ }
+ event.preventDefault();
+ event.stopPropagation();
+ if (event.type !== 'click') {
+ return;
+ }
+
+ new Translate_Modal(event.data, event.target).appendTo('body');
+ },
markTranslatableNodes: function (node) {
var self = this;
- this.$target.each(function () {
+ this.$target.add(this.$target_attribute).each(function () {
var $node = $(this);
var trans = self.getTranlationObject(this);
trans.value = (trans.value ? trans.value : $node.html() ).replace(/[ \t\n\r]+/, ' ');
});
- this.$target.parent().on('click', unbind_click);
+ this.$target.parent().prependEvent('click', this, this.__unbind_click);
+
+ // attributes
+
+ this.$target_attr.each(function () {
+ var $node = $(this);
+ var translation = $node.data('translation');
+ _.each(translation, function (node, attr) {
+ var trans = self.getTranlationObject(node);
+ trans.value = (trans.value ? trans.value : $node.html() ).replace(/[ \t\n\r]+/, ' ');
+ $node.attr('data-oe-translation-state', (trans.state || 'to_translate'));
+ });
+ });
+
+ this.$target_attr.prependEvent('mousedown click mouseup', this, this.__translate_attribute);
+
console.info('Click on CTRL when you click in an translatable area to have the default behavior');
},
unarkTranslatableNode: function () {
@@ -147,6 +246,7 @@ var Translate = Widget.extend({
this.unarkTranslatableNode();
this.trigger("cancel");
this.$el.hide();
+ window.onbeforeunload = null;
},
destroy: function () {
this.cancel();
diff --git a/addons/web_editor/static/src/xml/editor.xml b/addons/web_editor/static/src/xml/editor.xml
index b2f4d583052..7b73f9e3e16 100644
--- a/addons/web_editor/static/src/xml/editor.xml
+++ b/addons/web_editor/static/src/xml/editor.xml
@@ -11,7 +11,7 @@
</t>
<t t-name="web_editor.dialog">
- <div class="modal note-link-dialog" tabindex="-1" role="dialog" aria-hidden="true">
+ <div class="modal web_editor-dialog" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
diff --git a/addons/web_editor/static/src/xml/translator.xml b/addons/web_editor/static/src/xml/translator.xml
index 5a825d4ad0b..244fc67ec4a 100644
--- a/addons/web_editor/static/src/xml/translator.xml
+++ b/addons/web_editor/static/src/xml/translator.xml
@@ -11,4 +11,23 @@
</div>
</t>
+<t t-name="web_editor.translator.attributes">
+ <div class="modal web_editor-dialog" tabindex="-1" role="dialog" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+ <h3 class="modal-title">Translate Attribute</h3>
+ </div>
+ <div class="modal-body">
+ <div class="form-group"></div>
+ </div>
+ <div class="modal-footer">
+ <button type="button" class="btn btn-primary save">Close</button>
+ </div>
+ </div>
+ </div>
+ </div>
+</t>
+
</templates>