summaryrefslogtreecommitdiff
path: root/addons/base
diff options
context:
space:
mode:
authorFabien Meghazi <fme@openerp.com>2011-08-24 17:13:57 +0200
committerFabien Meghazi <fme@openerp.com>2011-08-24 17:13:57 +0200
commitffeff63fb69e64ecdb62810c5c1d7d4fc9d80239 (patch)
tree29836ab9fc85a542a52e844d99875e6b7ded800d /addons/base
parent88200c8bbfe252b5ec8ce8f41e137eb8a289c244 (diff)
[ADD] Translate dialog (WIP)
bzr revid: fme@openerp.com-20110824151357-nln9mnkw13uyng32
Diffstat (limited to 'addons/base')
-rw-r--r--addons/base/static/src/css/base.css9
-rw-r--r--addons/base/static/src/js/form.js13
-rw-r--r--addons/base/static/src/js/views.js111
-rw-r--r--addons/base/static/src/xml/base.xml42
4 files changed, 170 insertions, 5 deletions
diff --git a/addons/base/static/src/css/base.css b/addons/base/static/src/css/base.css
index 242167480f3..cd420ea8c0d 100644
--- a/addons/base/static/src/css/base.css
+++ b/addons/base/static/src/css/base.css
@@ -878,13 +878,20 @@ label.error {
position: relative;
vertical-align: top;
}
-.openerp img.ui-datepicker-trigger, .openerp img.ui-datepicker-trigger {
+.openerp img.ui-datepicker-trigger {
margin-left: -20px;
vertical-align: middle;
cursor: pointer;
position: relative;
top: -1px;
}
+.openerp img.oe_field_translate {
+ margin-left: -21px;
+ vertical-align: top;
+ cursor: pointer;
+ position: relative;
+ top: 4px;
+}
/* http://www.quirksmode.org/dom/inputfile.html
* http://stackoverflow.com/questions/2855589/replace-input-type-file-by-an-image
diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js
index 5da048a17b9..7a4d3c92d89 100644
--- a/addons/base/static/src/js/form.js
+++ b/addons/base/static/src/js/form.js
@@ -38,6 +38,7 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormVi
this.registry = openerp.base.form.widgets;
this.has_been_loaded = $.Deferred();
this.$form_header = null;
+ this.translatable_fields = [];
_.defaults(this.options, {"always_show_new_button": true});
},
start: function() {
@@ -461,7 +462,7 @@ openerp.base.form.SidebarAttachments = openerp.base.Widget.extend({
['res_model', '=', this.view.dataset.model],
['res_id', '=', this.view.datarecord.id],
['type', 'in', ['binary', 'url']]
- ])).read_slice(['name', 'url', 'type'], this.on_attachments_loaded);
+ ])).read_slice(['name', 'url', 'type'], {}, this.on_attachments_loaded);
}
},
on_attachments_loaded: function(attachments) {
@@ -839,6 +840,13 @@ openerp.base.form.Field = openerp.base.form.Widget.extend({
this.invalid = false;
this.dirty = false;
},
+ start: function() {
+ this._super.apply(this, arguments);
+ if (this.field.translate) {
+ this.view.translatable_fields.push(this);
+ this.$element.find('.oe_field_translate').click(this.on_translate);
+ }
+ },
set_value: function(value) {
this.value = value;
this.invalid = false;
@@ -850,6 +858,9 @@ openerp.base.form.Field = openerp.base.form.Widget.extend({
},
on_value_changed: function() {
},
+ on_translate: function() {
+ this.view.open_translate_dialog(this);
+ },
get_value: function() {
return this.value;
},
diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js
index cb9b7d364cf..c6782150297 100644
--- a/addons/base/static/src/js/views.js
+++ b/addons/base/static/src/js/views.js
@@ -4,6 +4,8 @@
openerp.base.views = function(openerp) {
+var _t = openerp.base._t;
+
/**
* Registry for all the client actions key: tag value: widget
*/
@@ -450,6 +452,106 @@ openerp.base.Sidebar = openerp.base.Widget.extend({
}
});
+openerp.base.TranslateDialog = openerp.base.Dialog.extend({
+ dialog_title: _t("Translations"),
+ init: function(view) {
+ this['on_button' + _t("Save")] = this.on_button_Save;
+ this['on_button' + _t("Close")] = this.on_button_Close;
+ this._super(view, {
+ width: '80%',
+ height: '80%'
+ });
+ this.view = view;
+ this.view_type = view.fields_view.type || '';
+ this.$fields_form = null;
+ this.$view_form = null;
+ this.$sidebar_form = null;
+ this.translatable_fields_keys = _.map(this.view.translatable_fields || [], function(i) { return i.name });
+ this.languages = null;
+ this.languages_loaded = $.Deferred();
+ (new openerp.base.DataSetSearch(this, 'res.lang', this.view.dataset.get_context(),
+ [['translatable', '=', '1']])).read_slice(['code', 'name'], { sort: 'id' }, this.on_languages_loaded);
+ },
+ start: function() {
+ var self = this;
+ this._super();
+ $.when(this.languages_loaded).then(function() {
+ self.$element.html(QWeb.render('TranslateDialog', { widget: self }));
+ self.$element.tabs();
+ if (!(self.view.translatable_fields && self.view.translatable_fields.length)) {
+ self.hide_tabs('fields');
+ self.select_tab('view');
+ }
+ self.$fields_form = self.$element.find('.oe_translation_form');
+ });
+ return this;
+ },
+ on_languages_loaded: function(langs) {
+ this.languages = langs;
+ this.languages_loaded.resolve();
+ },
+ do_load_fields_values: function(callback) {
+ var self = this,
+ deffered = [];
+ this.$fields_form.find('.oe_trad_field').val('').removeClass('touched');
+ _.each(self.languages, function(lg) {
+ var deff = $.Deferred();
+ deffered.push(deff);
+ self.rpc('/base/dataset/get', {
+ model: self.view.dataset.model,
+ ids: [self.view.datarecord.id],
+ fields: self.translatable_fields_keys,
+ context: self.view.dataset.get_context({
+ 'lang': lg.code
+ })
+ }, function(values) {
+ _.each(self.translatable_fields_keys, function(f) {
+ self.$fields_form.find('.oe_trad_field[name="' + lg.code + '-' + f + '"]').val(values[0][f] || '');
+ });
+ deff.resolve();
+ });
+ });
+ $.when.apply(null, deffered).then(callback);
+ },
+ show_tabs: function() {
+ for (var i = 0; i < arguments.length; i++) {
+ this.$element.find('ul.oe_translate_tabs li a[href$="' + arguments[i] + '"]').parent().show();
+ }
+ },
+ hide_tabs: function() {
+ for (var i = 0; i < arguments.length; i++) {
+ this.$element.find('ul.oe_translate_tabs li a[href$="' + arguments[i] + '"]').parent().hide();
+ }
+ },
+ select_tab: function(name) {
+ this.show_tabs(name);
+ var index = this.$element.find('ul.oe_translate_tabs li a[href$="' + arguments[i] + '"]').parent().index() - 1;
+ this.$element.tabs('select', index);
+ },
+ open: function(field) {
+ var self = this,
+ super = this._super;
+ $.when(this.languages_loaded).then(function() {
+ if (self.view.translatable_fields && self.view.translatable_fields.length) {
+ self.do_load_fields_values(function() {
+ super.call(self);
+ if (field) {
+ // TODO: focus and scroll to field
+ }
+ });
+ } else {
+ super.call(self);
+ }
+ });
+ },
+ on_button_Save: function() {
+ this.close();
+ },
+ on_button_Close: function() {
+ this.close();
+ }
+});
+
openerp.base.View = openerp.base.Widget.extend({
set_default_options: function(options) {
this.options = options || {};
@@ -461,6 +563,12 @@ openerp.base.View = openerp.base.Widget.extend({
action_views_ids: {}
});
},
+ open_translate_dialog: function(field) {
+ if (!this.translate_dialog) {
+ this.translate_dialog = new openerp.base.TranslateDialog(this).start();
+ }
+ this.translate_dialog.open(field);
+ },
/**
* Fetches and executes the action identified by ``action_data``.
*
@@ -542,7 +650,7 @@ openerp.base.View = openerp.base.Widget.extend({
}, {
label: "Translate",
callback: this.on_sidebar_translate,
- classname: 'oe_hide oe_sidebar_translate'
+ classname: 'oe_sidebar_translate'
}, {
label: "View Log",
callback: this.on_sidebar_view_log,
@@ -570,6 +678,7 @@ openerp.base.View = openerp.base.Widget.extend({
export_view.start();
},
on_sidebar_translate: function() {
+ this.open_translate_dialog();
},
on_sidebar_view_log: function() {
}
diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml
index 879d98d15a6..69aac831386 100644
--- a/addons/base/static/src/xml/base.xml
+++ b/addons/base/static/src/xml/base.xml
@@ -453,6 +453,40 @@
</ul>
</div>
</t>
+<t t-name="TranslateDialog">
+ <ul class="oe_translate_tabs">
+ <li><a t-attf-href="##{widget.element_id}_fields">Fields</a></li>
+ <li><a t-attf-href="##{widget.element_id}_view">View labels</a></li>
+ <li><a t-attf-href="##{widget.element_id}_sidebar">Sidebar Relates</a></li>
+ </ul>
+ <div t-attf-id="#{widget.element_id}_fields">
+ <table t-if="widget.view.translatable_fields" class="oe_frame oe_forms oe_translation_form" border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr>
+ <td class="oe_form_separator" width="1%" nowrap="nowrap">
+ <div class="separator horizontal">Field</div>
+ </td>
+ <th t-foreach="widget.languages" align="left">
+ <div class="separator horizontal"><t t-esc="name"/></div>
+ </th>
+ </tr>
+ <tr t-foreach="widget.view.translatable_fields" t-as="field">
+ <td class="oe_form_frame_cell" width="1%" nowrap="nowrap">
+ <label class="oe_form_label"><t t-esc="field.string"/>:</label>
+ </td>
+ <td t-foreach="widget.languages" t-as="lg" class="oe_form_frame_cell">
+ <input t-if="field.type == 'char'" type="text" t-attf-name="#{lg.code}-#{field.name}" value="" class="oe_trad_field" style="width: 100%"/>
+ <textarea t-if="field.type == 'text'" t-attf-name="#{lg.code}-#{field.name}" class="oe_trad_field" style="width: 100%"></textarea>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div t-attf-id="#{widget.element_id}_view">
+ Translate view
+ </div>
+ <div t-attf-id="#{widget.element_id}_sidebar">
+ Translate sidebar
+ </div>
+</t>
<t t-name="TreeView">
<h2 class="oe_view_title"><t t-esc="title"/></h2>
<select t-if="toolbar" style="width: 30%">
@@ -702,8 +736,10 @@
<input type="text" size="1"
t-att-name="widget.name"
t-att-id="widget.element_id + '_field'"
- t-att-class="'field_' + widget.type" style="width: 100%"
+ t-att-class="'field_' + widget.type"
+ t-attf-style="width: #{widget.field.translate ? '99' : '100'}%"
/>
+ <img class="oe_field_translate" t-if="widget.field.translate" src="/base/static/src/img/icons/terp-translate.png" width="16" height="16" border="0"/>
</t>
<t t-name="FieldEmail">
<table cellpadding="0" cellspacing="0" border="0" width="100%">
@@ -734,11 +770,13 @@
</table>
</t>
<t t-name="FieldText">
- <textarea rows="6" style="width: 100%;"
+ <textarea rows="6"
t-att-name="widget.name"
t-att-id="widget.element_id + '_field'"
t-att-class="'field_' + widget.type"
+ t-attf-style="width: #{widget.field.translate ? '99' : '100'}%"
></textarea>
+ <img class="oe_field_translate" t-if="widget.field.translate" src="/base/static/src/img/icons/terp-translate.png" width="16" height="16" border="0"/>
</t>
<t t-name="FieldDate">
<input type="text" size="1" style="width: 100%"