Roberto López López (OpenERP) has proposed merging 
lp:~openerp-dev/openerp-web/trunk-page-view-rlo into lp:openerp-web.

Requested reviews:
  Fabien Meghazi (OpenERP) (fme)

For more details, see:
https://code.launchpad.net/~openerp-dev/openerp-web/trunk-page-view-rlo/+merge/84095

[WIP] add support for page view
-- 
https://code.launchpad.net/~openerp-dev/openerp-web/trunk-page-view-rlo/+merge/84095
Your team OpenERP R&D Team is subscribed to branch 
lp:~openerp-dev/openerp-web/trunk-page-view-rlo.
=== modified file 'addons/web/__openerp__.py'
--- addons/web/__openerp__.py	2011-11-28 13:37:18 +0000
+++ addons/web/__openerp__.py	2011-12-01 12:39:40 +0000
@@ -47,6 +47,7 @@
         "static/src/js/data_import.js",
         "static/src/js/search.js",
         "static/src/js/view_form.js",
+        "static/src/js/view_page.js",
         "static/src/js/view_list.js",
         "static/src/js/view_list_editable.js",
         "static/src/js/view_tree.js",

=== modified file 'addons/web/controllers/main.py'
--- addons/web/controllers/main.py	2011-12-01 09:28:23 +0000
+++ addons/web/controllers/main.py	2011-12-01 12:39:40 +0000
@@ -605,6 +605,14 @@
     if 'views' not in action:
         generate_views(action)
 
+    id_form = None
+    for index, (id, mode) in enumerate(action['views']):
+        if mode == 'form':
+            id_form = id
+            break
+    if id_form is not None:
+        action['views'].insert(index + 1, (id_form, 'page'))
+
     if action.pop('view_type', 'form') != 'form':
         return action
 

=== modified file 'addons/web/static/src/js/boot.js'
--- addons/web/static/src/js/boot.js	2011-11-09 14:59:02 +0000
+++ addons/web/static/src/js/boot.js	2011-12-01 12:39:40 +0000
@@ -59,7 +59,7 @@
     openerp.web.formats(instance);
     openerp.web.chrome(instance);
     openerp.web.data(instance);
-    var files = ["views","search","list","form","list_editable","web_mobile","view_tree","data_export","data_import","view_editor"];
+    var files = ["views","search","list","form", "page","list_editable","web_mobile","view_tree","data_export","data_import","view_editor"];
     for(var i=0; i<files.length; i++) {
         if(openerp.web[files[i]]) {
             openerp.web[files[i]](instance);

=== modified file 'addons/web/static/src/js/view_editor.js'
--- addons/web/static/src/js/view_editor.js	2011-11-23 10:04:52 +0000
+++ addons/web/static/src/js/view_editor.js	2011-12-01 12:39:40 +0000
@@ -960,6 +960,7 @@
         var action_manager = new openerp.web.ActionManager(self);
         $.when(action_manager.do_action(action)).then(function() {
             var controller = action_manager.dialog_viewmanager.views['form'].controller;
+            // TODO NIV: use page view
             controller.do_set_readonly.add_last(function(){
                 action_manager.stop();
                 new_fields_name = new openerp.web.DataSetSearch(self,'ir.model.fields', null, null);

=== modified file 'addons/web/static/src/js/view_form.js'
--- addons/web/static/src/js/view_form.js	2011-12-01 08:54:57 +0000
+++ addons/web/static/src/js/view_form.js	2011-12-01 12:39:40 +0000
@@ -37,7 +37,7 @@
         this.show_invalid = true;
         this.default_focus_field = null;
         this.default_focus_button = null;
-        this.registry = this.readonly ? openerp.web.form.readonly : openerp.web.form.widgets;
+        this.registry = openerp.web.form.widgets;
         this.has_been_loaded = $.Deferred();
         this.$form_header = null;
         this.translatable_fields = [];
@@ -102,10 +102,6 @@
         });
 
         this.$form_header.find('button.oe_form_button_save').click(this.on_button_save);
-        this.$form_header.find('button.oe_form_button_new').click(this.on_button_new);
-        this.$form_header.find('button.oe_form_button_duplicate').click(this.on_button_duplicate);
-        this.$form_header.find('button.oe_form_button_delete').click(this.on_button_delete);
-        this.$form_header.find('button.oe_form_button_toggle').click(this.on_toggle_readonly);
 
         if (!this.sidebar && this.options.sidebar && this.options.sidebar_id) {
             this.sidebar = new openerp.web.Sidebar(this, this.options.sidebar_id);
@@ -117,23 +113,6 @@
         }
         this.has_been_loaded.resolve();
     },
-    on_toggle_readonly: function() {
-        var self = this;
-        self.translatable_fields = [];
-        self.widgets = {};
-        self.fields = {};
-        self.$form_header.find('button').unbind('click');
-        self.readonly = !self.readonly;
-        self.registry = self.readonly ? openerp.web.form.readonly : openerp.web.form.widgets;
-        self.on_loaded(self.fields_view);
-        return self.reload();
-    },
-    do_set_readonly: function() {
-        return this.readonly ? $.Deferred().resolve() : this.on_toggle_readonly();
-    },
-    do_set_editable: function() {
-        return !this.readonly ? $.Deferred().resolve() : this.on_toggle_readonly();
-    },
     do_show: function () {
         var promise;
         if (this.dataset.index === null) {
@@ -171,8 +150,6 @@
             this.$form_header.find('.oe_form_on_update').show();
             this.$form_header.find('button.oe_form_button_new').show();
         }
-        this.$form_header.find('.oe_form_on_readonly').toggle(this.readonly);
-        this.$form_header.find('.oe_form_on_editable').toggle(!this.readonly);
         this.datarecord = record;
 
         _(this.fields).each(function (field, f) {
@@ -384,7 +361,10 @@
         }
     },
     on_button_save: function() {
-        return this.do_save().then(this.do_set_readonly);
+        var self = this;
+        return this.do_save().then(function() {
+            self.do_switch_view('page');
+        });
     },
     on_button_new: function() {
         var self = this;
@@ -392,49 +372,14 @@
         $.when(this.has_been_loaded).then(function() {
             if (self.can_be_discarded()) {
                 var keys = _.keys(self.fields_view.fields);
-                $.when(self.do_set_editable()).then(function() {
-                    if (keys.length) {
-                        self.dataset.default_get(keys).pipe(self.on_record_loaded).then(function() {
-                            def.resolve();
-                        });
-                    } else {
-                        self.on_record_loaded({}).then(function() {
-                            def.resolve();
-                        });
-                    }
-                });
-            }
-        });
-        return def.promise();
-    },
-    on_button_duplicate: function() {
-        var self = this;
-        var def = $.Deferred();
-        $.when(this.has_been_loaded).then(function() {
-            if (self.can_be_discarded()) {
-                self.dataset.call('copy', [self.datarecord.id, {}, self.dataset.context]).then(function(new_id) {
-                    return self.on_created({ result : new_id });
-                }).then(self.do_set_editable).then(function() {
-                    def.resolve();
-                });
-            }
-        });
-        return def.promise();
-    },
-    on_button_delete: function() {
-        var self = this;
-        var def = $.Deferred();
-        $.when(this.has_been_loaded).then(function() {
-            if (self.can_be_discarded() && self.datarecord.id) {
-                if (confirm(_t("Do you really want to delete this record?"))) {
-                    self.dataset.unlink([self.datarecord.id]).then(function() {
-                        self.on_pager_action('next');
+                if (keys.length) {
+                    self.dataset.default_get(keys).pipe(self.on_record_loaded).then(function() {
                         def.resolve();
                     });
                 } else {
-                    setTimeout(function () {
-                        def.reject();
-                    }, 0)
+                    self.on_record_loaded({}).then(function() {
+                        def.resolve();
+                    });
                 }
             }
         });
@@ -2133,6 +2078,7 @@
                     controller.set_editable(false);
             } else if (view_type == "form") {
                 if (self.is_readonly()) {
+                    // TODO NIV: use page view do_switch_view('page')
                     controller.on_toggle_readonly();
                     $(controller.$element.find(".oe_form_buttons")[0]).children().remove();
                 }
@@ -2771,6 +2717,7 @@
         }
         this.view_form.appendTo(this.$element.find("#" + this.element_id + "_view_form"));
         var once = $.Deferred().then(function() {
+            // TODO NIV: do_switch_view('page')
             if (self.options.readonly) {
                 self.view_form.on_toggle_readonly();
             }
@@ -3075,8 +3022,8 @@
     }
 });
 
-openerp.web.form.FieldReadonly = openerp.web.form.Field.extend({
 
+<<<<<<< TREE
 });
 openerp.web.form.WidgetFrameReadonly = openerp.web.form.WidgetFrame.extend({
     template: 'WidgetFrame.readonly'
@@ -3191,6 +3138,8 @@
         }
     }
 });
+=======
+>>>>>>> MERGE-SOURCE
 
 /**
  * Registry of form widgets, called by :js:`openerp.web.FormView`
@@ -3226,6 +3175,7 @@
     'statusbar': 'openerp.web.form.FieldStatus'
 });
 
+<<<<<<< TREE
 openerp.web.form.FieldMany2ManyReadonly = openerp.web.form.FieldMany2Many.extend({
     force_readonly: true
 });
@@ -3251,6 +3201,8 @@
     'integer': 'openerp.web.form.FieldCharReadonly',
     'float_time': 'openerp.web.form.FieldCharReadonly'
 });
+=======
+>>>>>>> MERGE-SOURCE
 
 };
 

=== added file 'addons/web/static/src/js/view_page.js'
--- addons/web/static/src/js/view_page.js	1970-01-01 00:00:00 +0000
+++ addons/web/static/src/js/view_page.js	2011-12-01 12:39:40 +0000
@@ -0,0 +1,192 @@
+openerp.web.page = function (openerp) {
+    
+    openerp.web.views.add('page', 'openerp.web.PageView');
+    openerp.web.PageView = openerp.web.FormView.extend({
+        form_template: "PageView",
+        init: function () {
+            this._super.apply(this, arguments);
+            this.registry = openerp.web.form.readonly;
+        },
+        on_loaded: function(data) {
+            this._super(data);
+            this.$form_header.find('button.oe_form_button_new').click(this.on_button_new);
+            this.$form_header.find('button.oe_form_button_duplicate').click(this.on_button_duplicate);
+            this.$form_header.find('button.oe_form_button_delete').click(this.on_button_delete);
+  
+        }, 
+        on_button_new: function() {
+            this.dataset.index = null;
+            return this.do_switch_view('form');
+        },
+        on_button_duplicate: function() {
+            var self = this;
+            var def = $.Deferred();
+            $.when(this.has_been_loaded).then(function() {
+                self.dataset.call('copy', [self.datarecord.id, {}, self.dataset.context]).then(function(new_id) {
+                    return self.on_created({ result : new_id });
+                }).then(function() {
+                    return this.do_switch_view('form');
+                }).then(function() {
+                    def.resolve();
+                });
+            });
+            return def.promise();
+        },
+        on_button_delete: function() {
+            var self = this;
+            var def = $.Deferred();
+            $.when(this.has_been_loaded).then(function() {
+                if (self.datarecord.id && confirm(_t("Do you really want to delete this record?"))) {
+                    self.dataset.unlink([self.datarecord.id]).then(function() {
+                        self.on_pager_action('next');
+                        def.resolve();
+                    });
+                } else {
+                    setTimeout(function () {
+                        def.reject();
+                    }, 0)
+                }
+            });
+            return def.promise();
+        }
+    });
+    
+    openerp.web.form.FieldReadonly = openerp.web.form.Field.extend({
+
+    });
+    openerp.web.form.FieldCharReadonly = openerp.web.form.FieldReadonly.extend({
+        template: 'FieldChar.readonly',
+        init: function(view, node) {
+            this._super(view, node);
+            this.password = this.node.attrs.password === 'True' || this.node.attrs.password === '1';
+        },
+        set_value: function (value) {
+            this._super.apply(this, arguments);
+            var show_value = openerp.web.format_value(value, this, '');
+            if (this.password) {
+                show_value = new Array(show_value.length + 1).join('*');
+            }
+            this.$element.find('div').text(show_value);
+            return show_value;
+        }
+    });
+    openerp.web.form.FieldURIReadonly = openerp.web.form.FieldCharReadonly.extend({
+        template: 'FieldURI.readonly',
+        scheme: null,
+        set_value: function (value) {
+            var displayed = this._super.apply(this, arguments);
+            this.$element.find('a')
+                    .attr('href', this.scheme + ':' + displayed)
+                    .text(displayed);
+        }
+    });
+    openerp.web.form.FieldEmailReadonly = openerp.web.form.FieldURIReadonly.extend({
+        scheme: 'mailto'
+    });
+    openerp.web.form.FieldUrlReadonly = openerp.web.form.FieldURIReadonly.extend({
+        set_value: function (value) {
+            var s = /(\w+):(.+)/.exec(value);
+            if (!s || !(s[1] === 'http' || s[1] === 'https')) { return; }
+            this.scheme = s[1];
+            this._super(s[2]);
+        }
+    });
+    openerp.web.form.FieldBooleanReadonly = openerp.web.form.FieldCharReadonly.extend({
+        set_value: function (value) {
+            this._super(value ? '\u2611' : '\u2610');
+        }
+    });
+    openerp.web.form.FieldSelectionReadonly = openerp.web.form.FieldReadonly.extend({
+        template: 'FieldChar.readonly',
+        init: function(view, node) {
+            // lifted straight from r/w version
+            var self = this;
+            this._super(view, node);
+            this.values = _.clone(this.field.selection);
+            _.each(this.values, function(v, i) {
+                if (v[0] === false && v[1] === '') {
+                    self.values.splice(i, 1);
+                }
+            });
+            this.values.unshift([false, '']);
+        },
+        set_value: function (value) {
+            value = value === null ? false : value;
+            value = value instanceof Array ? value[0] : value;
+            var option = _(this.values)
+                .detect(function (record) { return record[0] === value; });
+            this._super(value);
+            this.$element.find('div').text(option ? option[1] : this.values[0][1]);
+        }
+    });
+    openerp.web.form.FieldMany2OneReadonly = openerp.web.form.FieldURIReadonly.extend({
+        set_value: function (value) {
+            value = value || null;
+            this.invalid = false;
+            var self = this;
+            this.value = value;
+            self.update_dom();
+            self.on_value_changed();
+            var real_set_value = function(rval) {
+                self.value = rval;
+                self.$element.find('a')
+                     .unbind('click')
+                     .text(rval ? rval[1] : '')
+                     .click(function () {
+                        self.do_action({
+                            type: 'ir.actions.act_window',
+                            res_model: self.field.relation,
+                            res_id: self.value[0],
+                            context: self.build_context(),
+                            views: [[false, 'form']],
+                            target: 'current'
+                        });
+                        return false;
+                     });
+            };
+            if (value && !(value instanceof Array)) {
+                new openerp.web.DataSetStatic(
+                        this, this.field.relation, self.build_context())
+                    .name_get([value], function(data) {
+                        real_set_value(data[0]);
+                });
+            } else {
+                setTimeout(function() {real_set_value(value);}, 0);
+            }
+        },
+        get_value: function() {
+            if (!this.value) {
+                return false;
+            } else if (this.value instanceof Array) {
+                return this.value[0];
+            } else {
+                return this.value;
+            }
+        }
+    });
+    
+    openerp.web.form.FieldMany2ManyReadonly = openerp.web.form.FieldMany2Many.extend({
+        force_readonly: true
+    });
+    openerp.web.form.FieldOne2ManyReadonly = openerp.web.form.FieldOne2Many.extend({
+        force_readonly: true
+    });
+    openerp.web.form.readonly = openerp.web.form.widgets.clone({
+        'char': 'openerp.web.form.FieldCharReadonly',
+        'email': 'openerp.web.form.FieldEmailReadonly',
+        'url': 'openerp.web.form.FieldUrlReadonly',
+        'text': 'openerp.web.form.FieldCharReadonly',
+        'text_wiki' : 'openerp.web.form.FieldCharReadonly',
+        'date': 'openerp.web.form.FieldCharReadonly',
+        'datetime': 'openerp.web.form.FieldCharReadonly',
+        'selection' : 'openerp.web.form.FieldSelectionReadonly',
+        'many2one': 'openerp.web.form.FieldMany2OneReadonly',
+        'many2many' : 'openerp.web.form.FieldMany2ManyReadonly',
+        'one2many' : 'openerp.web.form.FieldOne2ManyReadonly',
+        'one2many_list' : 'openerp.web.form.FieldOne2ManyReadonly',
+        'boolean': 'openerp.web.form.FieldBooleanReadonly',
+        'float': 'openerp.web.form.FieldCharReadonly',
+        'integer': 'openerp.web.form.FieldCharReadonly',
+        'float_time': 'openerp.web.form.FieldCharReadonly'
+    });
+};
\ No newline at end of file

=== modified file 'addons/web/static/src/xml/base.xml'
--- addons/web/static/src/xml/base.xml	2011-12-01 11:00:07 +0000
+++ addons/web/static/src/xml/base.xml	2011-12-01 12:39:40 +0000
@@ -662,11 +662,7 @@
             <button type="button" class="oe_form_button_save oe_form_on_editable">Save</button>
             <button type="button" class="oe_form_button_toggle">
                 <span class="oe_form_on_editable">Cancel</span>
-                <span class="oe_form_on_readonly">Edit</span>
             </button>
-            <button type="button" class="oe_form_button_new oe_form_on_readonly">Create</button>
-            <button type="button" class="oe_form_button_duplicate oe_form_on_readonly">Duplicate</button>
-            <button type="button" class="oe_form_button_delete oe_form_on_readonly">Delete</button>
         </div>
         <div class="oe_form_pager" t-if="widget.options.pager !== false">
             <button type="button" data-pager-action="first">First</button>
@@ -680,6 +676,16 @@
     </div>
     <t t-raw="frame.render()"/>
 </t>
+<t t-name="PageView" t-extend="FormView">
+    <t t-jquery=".oe_form_buttons" t-operation="inner">
+        <button type="button" class="oe_form_button_toggle">
+            <span class="oe_form_on_readonly">Edit</span>
+        </button>
+        <button type="button" class="oe_form_button_new oe_form_on_readonly">Create</button>
+        <button type="button" class="oe_form_button_duplicate oe_form_on_readonly">Duplicate</button>
+        <button type="button" class="oe_form_button_delete oe_form_on_readonly">Delete</button>
+    </t>
+</t>
 <t t-name="FormView.sidebar.attachments">
     <div class="oe-sidebar-attachments-toolbar">
         <div class="oe-binary-file-set" style="float: right">

_______________________________________________
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