Valentin Lab has proposed merging 
lp:~vaab/openerp-web/mobile-client-imp-use-main-formview into 
lp:~openerp-dev/openerp-web/mobile-client.

Requested reviews:
  OpenERP R&D Team (openerp-dev)

For more details, see:
https://code.launchpad.net/~vaab/openerp-web/mobile-client-imp-use-main-formview/+merge/77886

This is big rewrite of the mobile FormView widget to rely heavily on the legacy 
web's FormView. This was necessary to get access to the "save" feature in the 
mobile version. While this feature is not implemented in this branch, it's only 
matter of linking a button to the "do_save()" method now.

This is a big rewrite and as such it needs a thorough review, and I'm open to 
all comments.

Main points are:
- the template and the widget for the form is not anymore mono-block, it calls 
subwidget's template and classes
- it's using the same registry system to get widget's class
- Some huge part of the code (templates and javascript) is inherited from 
FormView.
- the resulting code is slightly smaller than precedent
- rendered HTML is very close to the rendered HTML of previous implementation
- More field's type are supported to be rendered.
- widget's can now give their values and are ready for the do_save() method...


Parts that should be extensively reviewed:
- Support of "new" widgets
- is it at least at iso-functionality with previous implementation
- rendered HTML has small differences, does this fits needs ?

Please take a look.

WARNING: this branch needs the 4 commits on openerp-web/addons/web/* I've 
proposed in lp:~vaab/openerp-web/imp-allow-mobile-subclassing (especially, the 
notebook one and the "id" selector bug-fix.)


-- 
https://code.launchpad.net/~vaab/openerp-web/mobile-client-imp-use-main-formview/+merge/77886
Your team OpenERP R&D Team is requested to review the proposed merge of 
lp:~vaab/openerp-web/mobile-client-imp-use-main-formview into 
lp:~openerp-dev/openerp-web/mobile-client.
=== modified file 'addons/web_mobile/static/src/js/chrome_mobile.js'
--- addons/web_mobile/static/src/js/chrome_mobile.js	2011-09-29 09:48:06 +0000
+++ addons/web_mobile/static/src/js/chrome_mobile.js	2011-10-03 10:00:32 +0000
@@ -20,6 +20,8 @@
         if(document.URL.length>59){
             window.location.replace('/mobile');
         }
+        // XXXvlab: isn't an "t-include" statement exists in t-... ?
+        openerp.web.qweb.add_template("/web/static/src/xml/base.xml");
         openerp.web.qweb.add_template("xml/web_mobile.xml");
         var params = {};
         this.$element.html(this.render());

=== modified file 'addons/web_mobile/static/src/js/form_mobile.js'
--- addons/web_mobile/static/src/js/form_mobile.js	2011-09-29 09:48:06 +0000
+++ addons/web_mobile/static/src/js/form_mobile.js	2011-10-03 10:00:32 +0000
@@ -4,248 +4,71 @@
 
 openerp.web_mobile.form_mobile = function (openerp) {
 
-openerp.web_mobile.FormView = openerp.web.Widget.extend({
-
-    template: 'FormView',
+openerp.web_mobile.FormView = openerp.web.FormView.extend({
 
     init: function(session, element_id, list_id, action, head_title, resmodel, viewid) {
-        this._super(session, element_id);
+        this._super(session, /* dataset */ {}, viewid, /* options */ {});
+
         this.list_id = list_id;
         this.action = action;
         this.head_title = head_title;
         this.resmodel = resmodel;
         this.viewid = viewid;
-    },
-    start: function() {
-        var self = this;
-        var id = this.list_id;
-        var model = this.action.res_model || this.resmodel;
+
+        this.model = this.action.res_model || this.resmodel;
+
         if(this.action){
-            var view_id = this.action.views[1][0];
+            this.view_id = this.action.views[1][0];
         }else{
-            var view_id = this.viewid;
+            this.view_id = this.viewid;
         }
-        this.dataset = new openerp.web.DataSetSearch(this, model, null, null);
-        var context = new openerp.web.CompoundContext(this.dataset.get_context());
+
+        this.registry = openerp.web_mobile.form.widgets;
+
+        // XXXvlab: to remove somehow (comes from Widget.init obsoleted code)
+        this.element_id = element_id;
+        this.element_id = this.element_id || _.uniqueId(this.identifier_prefix);
+        var tmp = document.getElementById(this.element_id);
+        this.$element = tmp ? $(tmp) : undefined;
+
+
+    },
+    start: function() {
+        var self = this;
+
+        // mobile specific
+        $.when(this.has_been_loaded).then(function() {
+            self.do_show().then(function() {
+                $.mobile.changePage("#"+self.element_id, "slide", false, true);
+              })
+          });
+
+        this.dataset = new openerp.web.DataSetSearch(this, this.model, null, null);
         this.dataset.read_slice([],{}, function (result) {
             for (var i = 0; i < result.length; i++) {
-                if (result[i].id == id) {
-                    self.datarecord = result[i];
-                }
-            }
-            self.rpc("/web/view/load", {"model": model, "view_id": view_id, "view_type": "form", context: context}, self.on_loaded)
-        });
-    },
-    on_loaded: function(result) {
-        var self = this;
-        var fields = result.fields;
-        var view_fields = result.arch.children;
-        var get_fields = this.get_fields(view_fields);
-        for (var j = 0; j < view_fields.length; j++) {
-            if (view_fields[j].tag == 'notebook') {
-                var notebooks = view_fields[j];
-            }
-        }
-        self.$element.html(self.render({'get_fields': get_fields, 'notebooks': notebooks || false, 'fields' : fields, 'values' : self.datarecord ,'temp_flag':'1'}));
-        for(var i=0;i<get_fields.length;i++) {
-            if (get_fields[i].attrs.widget=="progressbar") {
-                $("#progress").progressbar({value:self.datarecord[get_fields[i].attrs.name]})
-            }
-        }
-        self.$element.find("[data-role=header]").find('h1').html(self.head_title);
-        self.$element.find("[data-role=header]").find('#home').click(function(){
-            $.mobile.changePage("#oe_menu", "slide", false, true);
-        });
-        self.$element.find("[data-role=footer]").find('#shrotcuts').click(function(){
-            if(!$('#oe_shortcuts').html().length){
-                this.shortcuts = new openerp.web_mobile.Shortcuts(self, "oe_shortcuts");
-                this.shortcuts.start();
-            }else{
-                $.mobile.changePage("#oe_shortcuts", "slide", false, true);
-            }
-        });
-        self.$element.find("[data-role=footer]").find('#preference').click(function(){
-            if(!$('#oe_options').html().length){
-                this.options = new openerp.web_mobile.Options(self, "oe_options");
-                this.options.start();
-            }else{
-                $.mobile.changePage("#oe_options", "slide", false, true);
-            }
-        });
-        self.$element.find('#formbutton').click(function(){
-            var head = $(this).prev().find('select').find("option:selected").text();
-            var selected_id = $(this).prev().find('select').val();
-            var select_model = $(this).prev().find('select').attr('for');
-            if(selected_id!="false"){
-                if(!$('[id^="oe_form_'+selected_id+select_model+'"]').html()){
-                    $('<div id="oe_form_'+selected_id+select_model+'" data-role="page" data-url="oe_form_'+selected_id+select_model+'"> </div>').appendTo('#moe');
-                        this.formview = new openerp.web_mobile.FormView(self, "oe_form_"+selected_id+select_model, selected_id, '', head, select_model, false);
-                        this.formview.start();
-                }else{
-                    $.mobile.changePage('#oe_form_'+selected_id+select_model, "slide", false, true);
-                }
-            }
-        });
-        self.$element.find('[data-role=collapsible-set]').find('[data-role=collapsible]').each(function(i){
-            for (var k = 0; k < notebooks.children.length; k++) {
-                if (notebooks.children[k].attrs.string == $(this).attr('id')) {
-                    get_fields = self.get_fields(notebooks.children[k].children);
-                    for (var i = 0; i < get_fields.length; i++) {
-                        if (fields[get_fields[i].attrs.name].type == 'one2many'){
-                            self.relational_fields = get_fields[i].attrs.name;
-                            if(fields[get_fields[i].attrs.name].views.form){
-                                var get_fields_test = self.get_fields(fields[get_fields[i].attrs.name].views.form.arch.children);
-                                var fields_test = fields[get_fields[i].attrs.name]['views'].form.fields;
-                                var notebook=fields[get_fields[i].attrs.name].views.form.arch;
-                            }
-                        }
-                    }
-                }
-                if(notebook){
-                    $(this).find('div#page_content').html(self.render({'get_fields': get_fields,'fields' : result.fields, 'values' : self.datarecord,'til': notebook.attrs.string }));
-                }else{
-                    $(this).find('div#page_content').html(self.render({'get_fields': get_fields,'fields' : result.fields, 'values' : self.datarecord}));
-                }
-                $(this).find('div#page_content').find('#formbutton').click(function(){
-                    var head = $(this).prev().find('select').find("option:selected").text();
-                    var selected_id = $(this).prev().find('select').val();
-                    var select_model = $(this).prev().find('select').attr('for');
-                    if(selected_id!="false"){
-                        if(!$('[id^="oe_form_'+selected_id+select_model+'"]').html()){
-                            $('<div id="oe_form_'+selected_id+select_model+'" data-role="page" data-url="oe_form_'+selected_id+select_model+'"> </div>').appendTo('#moe');
-                            this.formview = new openerp.web_mobile.FormView(self, "oe_form_"+selected_id+select_model, selected_id, '', head, select_model, false);
-                            this.formview.start();
-                        }else{
-                            $.mobile.changePage('#oe_form_'+selected_id+select_model, "slide", false, true);
-                        }
-                    }
-                });
-            }
-        });
-        self.$element.find('[data-role=collapsible-set]').find('[data-role=collapsible]').find('div#page_content').find('[data-role=content]').find('ul').find('li').click(function(ev){
-            ev.preventDefault();
-            ev.stopPropagation();
-            var latid,lastid;
-            $(this).parents().each(function(){
-                latid = $(this).attr('id');
-                self.$element.find('[data-role=collapsible-set]').find('[data-role=collapsible]').each(function(){
-                    if(latid==$(this).attr('id')){
-                        lastid = $(this).attr('id');
-                    }
-                });
-            });
-            var relational = $(this).attr('for');
-            if(result.fields[relational]){
-                var head = $.trim($(this).text());
-                var dataset = new openerp.web.DataSetStatic(self, result.fields[relational].relation, result.fields[relational].context);
-                dataset.domain=[['id', 'in', self.datarecord[relational]]];
-                dataset.name_search('', dataset.domain, 'in',false ,function(res){
-                    for(var i=0;i<res.length;i++){
-                        var splited_data = res[i][1].split(',');
-                        res[i][1] = splited_data[0];
-                    }
-                    if(!$('[id^="oe_list_'+relational+'_'+self.element_id+'"]').html()){
-                        $('<div id="oe_list_'+relational+'_'+self.element_id+'" data-role="page" data-url="oe_list_'+relational+'_'+self.element_id+'"> </div>').appendTo('#moe');
-                        $('[id^="oe_list_'+relational+'_'+self.element_id+'"]').html(openerp.web.qweb.render("ListView", {'records' : res}));
-                        $('[id^="oe_list_'+relational+'_'+self.element_id+'"]').find("[data-role=header]").find('h1').html(head);
-                        $('[id^="oe_list_'+relational+'_'+self.element_id+'"]').find("[data-role=header]").find('#home').click(function(){
-                            $.mobile.changePage("#oe_menu", "slide", false, true);
-                        });
-                        $('[id^="oe_list_'+relational+'_'+self.element_id+'"]').find("[data-role=footer]").find('#shrotcuts').click(function(){
-                            if(!$('#oe_shortcuts').html().length){
-                                this.shortcuts = new openerp.web_mobile.Shortcuts(self, "oe_shortcuts");
-                                this.shortcuts.start();
-                            }else{
-                                $.mobile.changePage("#oe_shortcuts", "slide", false, true);
-                            }
-                        });
-                        $('[id^="oe_list_'+relational+'_'+self.element_id+'"]').find("[data-role=footer]").find('#preference').click(function(){
-                            if(!$('#oe_options').html().length){
-                                this.options = new openerp.web_mobile.Options(self, "oe_options");
-                                this.options.start();
-                            }else{
-                                $.mobile.changePage("#oe_options", "slide", false, true);
-                            }
-                        });
-                        $('[id^="oe_list_'+relational+'_'+self.element_id+'"]').find("a#list-id").click(function(ev){
-                            ev.preventDefault();
-                            ev.stopPropagation();
-                            var head_title = $(this).text();
-                            var listid = $(ev.currentTarget).data('id');
-                            dataset = new openerp.web.DataSetSearch(self, dataset.model, null, null);
-                            dataset.read_slice([],{}, function (result_relational) {
-                                for (var i = 0; i < result_relational.length; i++) {
-                                    if (result_relational[i].id == listid) {
-                                        var data_relational = result_relational[i];
-                                    }
-                                }
-                                if(!$('[id^="oe_form_'+listid+result.fields[relational].relation+'"]').html()){
-                                    $('<div id="oe_form_'+listid+result.fields[relational].relation+'" data-role="page" data-url="oe_form_'+listid+result.fields[relational].relation+'"> </div>').appendTo('#moe');
-                                    for (var k = 0; k < notebooks.children.length; k++) {
-                                        if (notebooks.children[k].attrs.string == lastid) {
-                                            get_fields = self.get_fields(notebooks.children[k].children);
-                                            for (var i = 0; i < get_fields.length; i++) {
-                                                if (fields[get_fields[i].attrs.name].type == 'one2many'){
-                                                    self.relational_fields = get_fields[i].attrs.name;
-                                                    if(fields[get_fields[i].attrs.name].views.form){
-                                                        var get_fields_test = self.get_fields(fields[get_fields[i].attrs.name].views.form.arch.children);
-                                                        var fields_test = fields[get_fields[i].attrs.name]['views'].form.fields;
-                                                        var notebook=fields[get_fields[i].attrs.name].views.form.arch;
-                                                    }
-                                                }
-                                            }
-                                        }
-                                    }
-                                    $('[id^="oe_form_'+listid+result.fields[relational].relation+'"]').html(self.render({'get_fields': get_fields_test, 'notebooks': false, 'fields' : fields_test, 'values' : data_relational, 'temp_flag':'1' }));
-                                    $('[id^="oe_form_'+listid+result.fields[relational].relation+'"]').find("[data-role=header]").find('h1').html(head_title);
-                                    $('[id^="oe_form_'+listid+result.fields[relational].relation+'"]').find("[data-role=header]").find('#home').click(function(){
-                                        $.mobile.changePage("#oe_menu", "slide", false, true);
-                                    });
-                                    $('[id^="oe_form_'+listid+result.fields[relational].relation+'"]').find("[data-role=footer]").find('#shrotcuts').click(function(){
-                                        if(!$('#oe_shortcuts').html().length){
-                                            this.shortcuts = new openerp.web_mobile.Shortcuts(self, "oe_shortcuts");
-                                            this.shortcuts.start();
-                                        }else{
-                                            $.mobile.changePage("#oe_shortcuts", "slide", false, true);
-                                        }
-                                    });
-                                    $('[id^="oe_form_'+listid+result.fields[relational].relation+'"]').find("[data-role=footer]").find('#preference').click(function(){
-                                        if(!$('#oe_options').html().length){
-                                            this.options = new openerp.web_mobile.Options(self, "oe_options");
-                                            this.options.start();
-                                        }else{
-                                            $.mobile.changePage("#oe_options", "slide", false, true);
-                                        }
-                                    });
-                                    $('[id^="oe_form_'+listid+result.fields[relational].relation+'"]').find('#formbutton').click(function(){
-                                        var head = $(this).prev().find('select').find("option:selected").text();
-                                        var selected_id = $(this).prev().find('select').val();
-                                        var select_model = $(this).prev().find('select').attr('for');
-                                        if(selected_id!="false"){
-                                            if(!$('[id^="oe_form_'+selected_id+select_model+'"]').html()){
-                                                $('<div id="oe_form_'+selected_id+select_model+'" data-role="page" data-url="oe_form_'+selected_id+select_model+'"> </div>').appendTo('#moe');
-                                                this.formview = new openerp.web_mobile.FormView(self, "oe_form_"+selected_id+select_model, selected_id, '', head, select_model, false);
-                                                this.formview.start();
-                                            }else{
-                                                $.mobile.changePage('#oe_form_'+selected_id+select_model, "slide", false, true);
-                                            }
-                                        }
-                                    });
-                                    $.mobile.changePage('#oe_form_'+listid+result.fields[relational].relation, "slide", false, true);
-                                }else{
-                                    $.mobile.changePage('#oe_form_'+listid+result.fields[relational].relation, "slide", false, true);
-                                }
-                            });
-                        });
-                        $.mobile.changePage("#oe_list_"+relational+"_"+self.element_id, "slide", false, true);
-                    }else{
-                        $.mobile.changePage("#oe_list_"+relational+"_"+self.element_id, "slide", false, true);
-                    }
-                });
-            }
-        });
-        $.mobile.changePage("#"+self.element_id, "slide", false, true);
-    },
+                if (result[i].id == self.list_id) {
+                    // this is done by views in openerp-web classic
+                    self.dataset.index = i;
+                }
+            }
+            self.init_view();
+        });
+    },
+
+    // XXXvlab: this method does not "show" ! it loads data into fields.
+    // it differs from super method in the way that it doesn't call show() method
+    // on "this.$element".
+    do_show: function () {
+        var promise;
+        if (this.dataset.index === null) {
+          // null index means we should start a new record
+            promise = this.on_button_new();
+        } else {
+            promise = this.dataset.read_index(_.keys(this.fields_view.fields), this.on_record_loaded);
+        }
+        return promise;
+    },
+
     get_fields: function(view_fields, fields) {
         this.fields = fields || [];
         for (var i=0; i < view_fields.length; i++){
@@ -260,4 +83,151 @@
     }
 });
 
+/** @namespace */
+openerp.web_mobile.form = {};
+
+openerp.web_mobile.form.FieldBoolean = openerp.web.form.Field.extend({
+
+    template: "FieldBoolean",
+
+    // XXXvlab: could try to keep the reference of
+    // this.$element.find('option[value="on"]') in the object to go faster...
+
+    get_value_from_ui: function () {
+        return this.$element.find('option[value="on"]').is(":selected");
+    },
+
+    start: function() {
+        var self = this;
+        this._super.apply(this, arguments);
+        this.$element.find('select').change(function() {
+            if (self.get_value_from_ui() != self.value) {
+                self.on_ui_change();
+          }
+        });
+    },
+    set_value: function(value) {
+        this._super.apply(this, arguments);
+        this.$element.find('option[value="on"]')[0].selected = value;
+        this.$element.find('option[value="off"]')[0].selected = !value;
+    },
+    set_value_from_ui: function() {
+        this.value = this.get_value_from_ui();
+        this._super();
+    },
+    update_dom: function() {
+        this._super.apply(this, arguments);
+        this.$element.find('select').attr('disabled', this.readonly);
+    },
+    validate: function() {
+        this.invalid = this.required && !this.get_value_from_ui();
+    },
+    focus: function() {
+        this.$element.find('select').focus();
+    }
+});
+
+
+openerp.web_mobile.form.WidgetFrame = openerp.web.form.Widget.extend({
+
+    template: "WidgetFrame",
+
+    init: function(view, node) {
+        this._super(view, node);
+
+        this.widgets = [];
+        for (var i = 0; i < node.children.length; i++) {
+            var n = node.children[i];
+            if (n.tag == "newline") {
+              // XXXvlab: Not implemented
+              //this.add_separator();
+            } else {
+                this.handle_node(n);
+            }
+        }
+    },
+    handle_node: function(node) {
+      try {
+        var type = {};
+        if (node.tag == 'field') {
+            type = (this.view.fields_view.fields[node.attrs.name] || {}).type;
+        }
+        var Class = this.view.registry.get_any([node.attrs.widget, type, node.tag]);
+        var widget = new Class(this.view, node);
+        if (node.tag == 'field') {
+
+            if (!this.view.default_focus_field || node.attrs.default_focus == '1') {
+                this.view.default_focus_field = widget;
+            }
+
+            if (node.attrs.nolabel != '1') {
+                // We will add a dummy label Widget
+                var label = new (this.view.registry.get_object('label')) (this.view, node);
+                label["for"] = widget;
+                widget.label_widget = label;
+            }
+            // XXXvlab: no better way to get the info in templates that this is a 'field' ?
+            widget.tag = 'field';
+        }
+        this.widgets.push(widget);
+      } catch(e) {
+        console.log(e);
+      }
+    },
+});
+
+openerp.web_mobile.form.WidgetNotebookPage = openerp.web_mobile.form.WidgetFrame.extend({});
+
+openerp.web_mobile.form.WidgetButton = openerp.web.form.WidgetButton.extend({
+    jquery_mobile_icon_map: {
+        'stage_previous': 'arrow-l',
+        'stage_next': 'arrow-r',
+        // 'case_cancel': 'delete',
+        // 'case_open': 'forward',
+        // 'case_mark_lost': 'delete',
+        // 'case_pending': 'alert',
+    },
+    init: function(view, node) {
+        this._super(view, node);
+        this.jqm_icon = this.jquery_mobile_icon_map[this.node.attrs.name];
+    },
+});
+
+
+/**
+ * Registry of form widgets, called by :js:`openerp.web.FormView`
+ */
+openerp.web_mobile.form.widgets = new openerp.web.Registry({
+    'boolean' : 'openerp.web_mobile.form.FieldBoolean',
+    'frame' : 'openerp.web_mobile.form.WidgetFrame',
+    'group' : 'openerp.web_mobile.form.WidgetFrame',
+    'notebookpage' : 'openerp.web_mobile.form.WidgetNotebookPage',
+    'button' : 'openerp.web_mobile.form.WidgetButton',
+
+    'char' : 'openerp.web.form.FieldChar',
+    'label' : 'openerp.web.form.WidgetLabel',
+    'notebook' : 'openerp.web.form.WidgetNotebook',
+    'separator' : 'openerp.web.form.WidgetSeparator',
+    'email' : 'openerp.web.form.FieldEmail',
+    'url' : 'openerp.web.form.FieldUrl',
+    'text' : 'openerp.web.form.FieldText',
+    'text_wiki' : 'openerp.web.form.FieldText',
+      // 'date' : 'openerp.web.form.FieldDate',
+      // 'datetime' : 'openerp.web.form.FieldDatetime',
+    'selection' : 'openerp.web.form.FieldSelection',
+      // 'many2one' : 'openerp.web.form.FieldMany2One',
+      // 'many2many' : 'openerp.web.form.FieldMany2Many',
+      // 'one2many' : 'openerp.web.form.FieldOne2Many',
+    'one2many_list' : 'openerp.web.form.FieldOne2Many',
+    'reference' : 'openerp.web.form.FieldReference',
+    'float' : 'openerp.web.form.FieldFloat',
+    'integer': 'openerp.web.form.FieldFloat',
+    'float_time': 'openerp.web.form.FieldFloat',
+    'progressbar': 'openerp.web.form.FieldProgressBar',
+    'image': 'openerp.web.form.FieldBinaryImage',
+    'binary': 'openerp.web.form.FieldBinaryFile',
+    'statusbar': 'openerp.web.form.FieldStatus'
+});
+
+
 };

=== modified file 'addons/web_mobile/static/src/js/web_mobile.js'
--- addons/web_mobile/static/src/js/web_mobile.js	2011-08-18 13:24:18 +0000
+++ addons/web_mobile/static/src/js/web_mobile.js	2011-10-03 10:00:32 +0000
@@ -5,5 +5,11 @@
 openerp.web_mobile = function(instance) {
     openerp.web_mobile.chrome_mobile(instance);
     openerp.web_mobile.list_mobile(instance);
+
+    // from web javascript
+    openerp.web.views(instance);
+    openerp.web.list(instance);
+    openerp.web.form(instance);
+
     openerp.web_mobile.form_mobile(instance);
 };

=== modified file 'addons/web_mobile/static/src/web_mobile.html'
--- addons/web_mobile/static/src/web_mobile.html	2011-09-23 09:05:38 +0000
+++ addons/web_mobile/static/src/web_mobile.html	2011-10-03 10:00:32 +0000
@@ -21,6 +21,9 @@
     <script type="text/javascript" src="/web/static/src/js/chrome.js"></script>
     <script type="text/javascript" src="/web/static/src/js/data.js"></script>
     <script type="text/javascript" src="/web/static/src/js/formats.js"></script>
+    <script type="text/javascript" src="/web/static/src/js/views.js"></script>
+    <script type="text/javascript" src="/web/static/src/js/view_list.js"></script>
+    <script type="text/javascript" src="/web/static/src/js/view_form.js"></script>
 
     <script type="text/javascript" src="/web_mobile/static/src/js/web_mobile.js"></script>
     <script type="text/javascript" src="/web_mobile/static/src/js/chrome_mobile.js"></script>

=== modified file 'addons/web_mobile/static/src/xml/web_mobile.xml'
--- addons/web_mobile/static/src/xml/web_mobile.xml	2011-09-28 06:58:42 +0000
+++ addons/web_mobile/static/src/xml/web_mobile.xml	2011-10-03 10:00:32 +0000
@@ -144,160 +144,171 @@
 </t>
 
 <t t-name="FormView">
-    <t t-if="temp_flag">
-        <t t-call="Header" />
-    </t>
-    <div data-role="content">
-        <form>
-            <t t-foreach="get_fields" t-as="field">
-                <div data-role="fieldcontain">
-                    <t t-if="fields[field.attrs.name].type == 'char'">
-                        <label for="">
-                            <t t-if="!(field.attrs.string)" t-esc="fields[field.attrs.name].string"></t>
-                            <t t-if="field.attrs.string" t-esc="field.attrs.string"></t>:
-                        </label>
-                        <t t-if="values[field.attrs.name]">
-                            <input type="text" id="" t-att-value="values[field.attrs.name]"/>
-                        </t>
-                        <t t-if="!(values[field.attrs.name])">
-                            <input type="text" value="" id=""/>
-                        </t>
-                        <t t-if="(field.attrs.name == 'email' or field.attrs.name == 'email_from') and values[field.attrs.name]">
-                            <a t-att-href="'mailto:'+values[field.attrs.name]"><img src="/web/static/src/img/icons/terp-mail-message-new.png" /></a>
-                        </t>
-                        <t t-if="field.attrs.name == 'website' and values[field.attrs.name]">
-                            <a t-att-href="values[field.attrs.name]"><img src="/web/static/src/img/icons/gtk-ok.png" title="Open this resource"/></a>
-                        </t>
-                    </t>
-                    <t t-if="fields[field.attrs.name].type == 'text'">
-                        <label for="">
-                            <t t-if="!(field.attrs.string)" t-esc="fields[field.attrs.name].string"></t>
-                            <t t-if="field.attrs.string" t-esc="field.attrs.string"></t>:
-                        </label>
-                        <textarea name="" id=""></textarea>
-                    </t>
-                    <t t-if="fields[field.attrs.name].type == 'float'">
-                        <label for="">
-                            <t t-if="!(field.attrs.string)" t-esc="fields[field.attrs.name].string"></t>
-                            <t t-if="field.attrs.string" t-esc="field.attrs.string"></t>:
-                        </label>
-                        <t t-if="values[field.attrs.name] and field.attrs.name=='progress_rate'">
-                            <div id="progress" value="" title="Percent of tasks closed according to total of tasks to do..."></div>
-                        </t>
-                        <t t-if="!(values[field.attrs.name]) and field.attrs.name=='progress_rate'">
-                            <div id="progress" value="" title="Percent of tasks closed according to total of tasks to do..."></div>
-                        </t>
-                         <t t-if="values[field.attrs.name] and field.attrs.name!='progress_rate'">
-                            <input id="" type="text" t-att-value="values[field.attrs.name]"/>
-                        </t>
-                        <t t-if="!values[field.attrs.name] and field.attrs.name!='progress_rate'">
-                            <input id="" type="text" value=""/>
-                         </t>
-                    </t>
-                    <t t-if="fields[field.attrs.name].type == 'date'">
-                        <label for="">
-                            <t t-if="!(field.attrs.string)" t-esc="fields[field.attrs.name].string"></t>
-                            <t t-if="field.attrs.string" t-esc="field.attrs.string"></t>:
-                        </label>
-                        <t t-if="values[field.attrs.name]">
-                            <input id="" type="text" t-att-value="values[field.attrs.name]"/>
-                        </t>
-                        <t t-if="!(values[field.attrs.name])">
-                            <input id="" type="text" value=""/>
-                        </t>
-                    </t>
-                    <t t-if="fields[field.attrs.name].type == 'datetime'">
-                        <label for="">
-                            <t t-if="!(field.attrs.string)" t-esc="fields[field.attrs.name].string"></t>
-                            <t t-if="field.attrs.string" t-esc="field.attrs.string"></t>:
-                        </label>
-                        <t t-if="values[field.attrs.name]">
-                            <input id="" type="text" t-att-value="values[field.attrs.name]"/>
-                        </t>
-                        <t t-if="!(values[field.attrs.name])">
-                            <input id="" type="text" value=""/>
-                        </t>
-                    </t>
-                    <t t-if="fields[field.attrs.name].type == 'boolean'">
-                        <div data-role="fieldcontain">
-                            <label for="slider"><t t-esc="fields[field.attrs.name].string" /> :</label>
-                            <select name="slider" id="slider" data-role="slider">
-                                <t t-if="values[field.attrs.name]">
-                                    <option value="on" selected="true">On</option>
-                                    <option value="off">Off</option>
-                                </t>
-                                <t t-if="!values[field.attrs.name]">
-                                    <option value="on">On</option>
-                                    <option value="off" selected="true">Off</option>
-                                </t>
-                            </select>
-                        </div>
-                    </t>
-                    <t t-if="fields[field.attrs.name].type == 'selection'">
-                        <label for="" class="select">
-                            <t t-if="!(field.attrs.string)" t-esc="fields[field.attrs.name].string"></t>
-                            <t t-if="field.attrs.string" t-esc="field.attrs.string"></t>:
-                        </label>
-                        <select id="" data-native-menu="false">
-                            <t t-foreach="fields[field.attrs.name].selection" t-as="opt">
-                                <option t-att-value="opt[0]"><t t-esc="opt[1]"/></option>
-                            </t>
-                        </select>
-                    </t>
-                    <t t-if="fields[field.attrs.name].type == 'many2one'">
-                        <label for="" class="select">
-                            <t t-if="!(field.attrs.string)" t-esc="fields[field.attrs.name].string"></t>
-                            <t t-if="field.attrs.string" t-esc="field.attrs.string"></t>:
-                        </label>
-                        <select id="" data-native-menu="false" t-att-for="fields[field.attrs.name].relation">
-                            <t t-if="fields[field.attrs.name].selection">
-                                <t t-foreach="fields[field.attrs.name].selection" t-as="opt">
-                                    <t t-if="values[field.attrs.name]==opt[0]">
-                                        <option t-att-value="opt[0]" selected="true" ><t t-esc="opt[1]"/></option>
-                                    </t>
-                                    <t t-if="values[field.attrs.name]!=opt[0]">
-                                        <option t-att-value="opt[0]" ><t t-esc="opt[1]"/></option>
-                                    </t>
-                                </t>
-                            </t>
-                        </select>
-                        <t t-if="fields[field.attrs.name].selection">
-                            <a id="formbutton" href="#" title="Form View"><img src="/web/static/src/img/icons/gtk-index.png" /></a>
-                        </t>
-                    </t>
-                    <t t-if="fields[field.attrs.name].type == 'one2many'">
-                        <ul data-role="listview" data-inset="true" data-theme="d">
-                            <li data-theme="c" t-att-for="field.attrs.name">
-                                <a href="">
-                                    <t t-esc="til"/>
-                                </a>
-                             </li>
-                         </ul>
-                     </t>
-                </div>
-            </t>
-            <t t-if="notebooks">
-                <div data-role="collapsible-set">
-                    <t t-foreach="notebooks.children" t-as="page">
-                        <t t-if="page.attrs.invisible">
-                            <div style="display:none;" data-collapsed="true" data-role="collapsible" t-att-id="page.attrs.string">
-                                <h3><t t-esc="page.attrs.string"></t></h3>
-                                <div id="page_content" />
-                            </div>
-                        </t>
-                        <t t-if="!page.attrs.invisible">
-                            <div data-collapsed="true" data-role="collapsible" t-att-id="page.attrs.string">
-                                <h3><t t-esc="page.attrs.string"></t></h3>
-                                <div id="page_content" />
-                            </div>
-                        </t>
-                    </t>
-                </div>
-            </t>
-        </form>
-    </div>
-    <t t-if="temp_flag">
-        <t t-call="Footer" />
-    </t>
-</t>
+  <t t-call="Header" />
+  <div id="content" data-role="content">
+    <form>
+      <t t-raw="frame.render()"/>
+    </form>
+  </div>
+  <t t-call="Footer" />
+</t>
+
+<t t-name="FieldBoolean">
+  <select name="widget.name" data-role="slider">
+    <option value="on">On</option>
+    <option value="off">Off</option>
+  </select>
+</t>
+
+<t t-name="FieldChar">
+  <t t-if="widget.value">
+    <input type="text" id="" t-att-value="widget.value"/>
+  </t>
+  <t t-if="!(widget.value)">
+    <input type="text" value="" id=""/>
+  </t>
+  <t t-if="(widget.name == 'email' or widget.name == 'email_from') and widget.value">
+    <a t-att-href="'mailto:'+widget.value"><img src="/web/static/src/img/icons/terp-mail-message-new.png" /></a>
+  </t>
+  <t t-if="widget.name == 'website' and widget.value">
+    <a t-att-href="widget.value"><img src="/web/static/src/img/icons/gtk-ok.png" title="Open this resource"/></a>
+  </t>
+</t>
+
+<t t-name="FieldText">
+  <textarea name="" id=""></textarea>
+</t>
+
+<t t-name="FieldFloat">
+  <t t-if="widget.value and widget.name=='progress_rate'">
+    <div id="progress" value=""
+         title="Percent of tasks closed according to total of tasks to do..."></div>
+  </t>
+  <t t-if="!(widget.value) and widget.name=='progress_rate'">
+    <div id="progress" value=""
+         title="Percent of tasks closed according to total of tasks to do..."></div>
+  </t>
+  <t t-if="widget.value and widget.name!='progress_rate'">
+    <input id="" type="text" t-att-value="widget.value"/>
+  </t>
+  <t t-if="!widget.value and widget.name!='progress_rate'">
+    <input id="" type="text" value=""/>
+  </t>
+</t>
+
+<t t-name="FieldDate">
+  <t t-if="widget.value">
+    <input id="" type="text" t-att-value="widget.value"/>
+  </t>
+  <t t-if="!(widget.value)">
+    <input id="" type="text" value=""/>
+  </t>
+</t>
+
+<t t-name="FieldDateTime">
+  <t t-if="widget.value">
+    <input id="" type="text" t-att-value="widget.value"/>
+  </t>
+  <t t-if="!(widget.value)">
+    <input id="" type="text" value=""/>
+  </t>
+</t>
+
+<t t-name="FieldSelection">
+  <select id="" data-native-menu="false">
+    <t t-foreach="widget.values" t-as="option">
+      <option t-att-value="option[0]"><t t-esc="option[1]"/></option>
+    </t>
+  </select>
+</t>
+
+
+<t t-name="FieldMany2One">
+  <select id="" data-native-menu="false" t-att-for="widget.relation">
+    <t t-if="widget.selection">
+      <t t-foreach="widget.selection" t-as="opt">
+        <t t-if="widget.value==opt[0]">
+          <option t-att-value="opt[0]" selected="true" ><t t-esc="opt[1]"/></option>
+        </t>
+        <t t-if="widget.value!=opt[0]">
+          <option t-att-value="opt[0]" ><t t-esc="opt[1]"/></option>
+        </t>
+      </t>
+    </t>
+  </select>
+  <t t-if="widget.selection">
+    <a id="formbutton" href="#" title="Form View"><img src="/web/static/src/img/icons/gtk-index.png" /></a>
+  </t>
+</t>
+
+<t t-name="FieldOne2Many">
+  <ul data-role="listview" data-inset="true" data-theme="d">
+    <li data-theme="c" t-att-for="widget.name">
+      <a href="">
+        <t t-esc="til"/>
+      </a>
+    </li>
+  </ul>
+</t>
+
+<t t-name="WidgetFrame">
+  <t t-foreach="widget.widgets" t-as="w">
+    <div t-if="w.tag == 'field'" t-att-id="w.element_id" data-role="fieldcontain">
+        <t t-if="w.label_widget" t-raw="w.label_widget.render()" />
+        <t t-raw="w.render()" />
+    </div>
+    <t t-if="w.tag != 'field'" t-raw="w.render()" />
+  </t>
+</t>
+
+<t t-name="WidgetLabel">
+    <label t-att-title="widget.help" for="">
+        <t t-esc="widget.string"/>
+        <span t-if="widget.help">?</span>
+        <t t-if="widget.string and widget.node.tag != 'label'">:</t>
+    </label>
+</t>
+
+<t t-name="WidgetNotebook">
+  <div data-role="collapsible-set">
+    <t t-foreach="widget.pages" t-as="page">
+      <t t-if="page.invisible">
+        <div style="display:none;" data-collapsed="true" data-role="collapsible" t-att-id="page.string">
+          <h3><t t-esc="page.string"></t></h3>
+          <t t-raw="page.render()"/>
+        </div>
+      </t>
+      <t t-if="!page.invisible">
+        <div data-collapsed="true" data-role="collapsible" t-att-id="page.string">
+          <h3><t t-esc="page.string"></t></h3>
+          <t t-raw="page.render()"/>
+        </div>
+      </t>
+    </t>
+  </div>
+</t>
+
+<t t-name="WidgetButton">
+  <button type="button"
+          t-att-id="widget.element_id + '_button'"
+          t-att-title="widget.help"
+          t-att-data-icon="widget.jqm_icon"
+          style="width: 100%"
+          class="button">
+    <img t-if="widget.node.attrs.icon" t-att-src="'/web/static/src/img/icons/' + widget.node.attrs.icon + '.png'" width="16" height="16"/>
+    <span t-if="widget.string"><t t-esc="widget.string"/></span>
+  </button>
+</t>
+
+<t t-name="WidgetSeparator">
+    <div t-if="widget.orientation !== 'vertical'" t-att-class="'separator ' + widget.orientation">
+        <h4 t-if="widget.string" ><t t-esc="widget.string" /></h4>
+    </div>
+</t>
+
+<t t-name="Widget">
+    Unhandled widget
+    <t t-raw="widget.node.tag" />
+</t>
+
 </templates>

_______________________________________________
Mailing list: https://launchpad.net/~openerp-dev-gtk
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~openerp-dev-gtk
More help   : https://help.launchpad.net/ListHelp

Reply via email to