diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js
index 7cd5f3dcb51..ffde8481c53 100644
--- a/addons/web/static/src/js/view_form.js
+++ b/addons/web/static/src/js/view_form.js
@@ -98,10 +98,9 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
}
this.fields_order = [];
this.fields_view = data;
- this.arch = this.preprocess_arch(data);
- var html_view = openerp.web.xml_to_str(this.arch);
- this.$element.find('.oe_form_content').append(html_view);
+ var $form = this.create_view(data);
+ this.$element.find('.oe_form_content').appendTo(this.$form);
//this.root_frame = instanciate_widget(this.registry.get_object('frame'), this, this.fields_view.arch);
//var to_append = $(".oe_form_header", this.$element);
@@ -136,75 +135,64 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
}
this.has_been_loaded.resolve();
},
- preprocess_arch: function(data) {
+ create_view: function(fvg) {
// TODO: extract embeded views before preprocessing
// Cut down this function into rendering API amongst form, page and kanban
//
// OpenERP views spec :
// - @width is obsolete ?
- var self = this,
- baseclass = 'oe_layout_',
- fields = data.fields,
- arch = $.parseXML(data.arch_string);
+ var view = this,
+ fields = fvg.fields,
+ $form = $(fvg.arch_string)
+ field_prefix = view.dataset ? view.dataset.model : '';
// Step #1:
// - If field has no @string, fetch it from fvg.fields.
// - If field has no label, create one.
// - Unless @nolabel, create unique @id and @for pair
- $(arch).find('field').each(function() {
+ $form.find('field').each(function() {
var $field = $(this),
name = $field.attr('name'),
field_orm = fields[name],
- field_id = _.uniqueId([self.dataset.model, name, '#'].join('.'));
+ field_id = _.uniqueId([field_prefix, name, '#'].join('.'));
if (!field_orm) {
throw new Error("Field '" + name + "' specified in view could not be found.");
}
- var $label = $(arch).find('label[for="' + name + '"]'),
+ // TODO: manage @nolabel
+ var $label = $form.find('label[for="' + name + '"]'),
label_string = $field.attr('string') || field_orm.string || '';
if ($label.length) {
label_string = $label.attr('string') || $label.text();
} else {
- // TODO: find a way to prevent @xmlns.
$label = $('').insertBefore($field);
}
- $field.attr('id', field_id);
- $label.attr('for', field_id).text(label_string);
-
- // debug
- $field.text('INPUT: ' + name)
+ $field.attr({
+ 'id' : field_id,
+ 'data-widget' : $field.attr('widget') || field_orm.widget
+ });
+ $label.attr({
+ 'for' : field_id,
+ 'string' : label_string,
+ 'help' : $field.attr('help') || field_orm.help || '',
+ 'data-widget' : 'label'
+ });
+ // TODO: Add custom attribute in orer to differenciate from a real label
});
- // Step #2:
- // - Convert groups to tables
- var $group, $table, $tr, $td, $child, cols, row_cols, colspan;
- while (true) {
- $group = $(arch).find('group:first');
- if (!$group.length) {
- break;
+ // TODO: modifiers invisible. Add a special attribute, eg: data-invisible that should be used in order to create openerp.form.InvisibleWidgetG
+ // TODO: split registry ? tags and fields types ?
+
+ $form.find('*').each(function() {
+ var $elem = $(this),
+ key = $elem.attr('data-widget') || $elem[0].tagName.toLowerCase();
+ if (view.registry.contains(key)) {
+ var obj = view.registry.get_object(key);
+ var w = new (obj)(view, $elem[0]);
+ w.replace($elem);
}
+ });
- $table = $('
').addClass(baseclass + 'group');
- $tr = null;
- cols = parseInt($group.attr('col') || 4, 10);
- row_cols = cols;
-
- $group.children().each(function() {
- $child = $(this);
- colspan = parseInt($child.attr('colspan') || 1, 10);
- if ($child[0].tagName === 'newline') {
- $tr = null;
- return;
- }
- if (!$tr || row_cols < colspan) {
- $tr = $('
').addClass(baseclass + 'group_row').appendTo($table);
- row_cols = cols;
- }
- row_cols -= colspan;
- $td = $(' | ').addClass(baseclass + 'group_cell');
- $tr.append($td.append($child));
- });
- $group.replaceWith($table);
- }
+return $form
// Step #3:
// - Process