[ADD] Translate dialog (WIP)

bzr revid: fme@openerp.com-20110824151357-nln9mnkw13uyng32
This commit is contained in:
Fabien Meghazi 2011-08-24 17:13:57 +02:00
parent 88200c8bbf
commit ffeff63fb6
4 changed files with 170 additions and 5 deletions

View File

@ -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

View File

@ -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;
},

View File

@ -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() {
}

View File

@ -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%"