[ADD] form: Basic new record support
authorFabien Meghazi <fme@openerp.com>
Thu, 7 Apr 2011 13:07:25 +0000 (15:07 +0200)
committerFabien Meghazi <fme@openerp.com>
Thu, 7 Apr 2011 13:07:25 +0000 (15:07 +0200)
bzr revid: fme@openerp.com-20110407130725-0o4d8j2kgko8b7jn

addons/base/controllers/main.py
addons/base/static/src/css/base.css
addons/base/static/src/js/data.js
addons/base/static/src/js/form.js
addons/base/static/src/xml/base.xml

index 9db6663..92987ff 100644 (file)
@@ -347,6 +347,12 @@ class DataSet(openerpweb.Controller):
         r = getattr(m, method)(ids, *args)
         return {'result': r}
 
+    @openerpweb.jsonrequest
+    def default_get(self, req, model, fields, context={}):
+        m = req.session.model(model)
+        r = m.default_get(fields, context)
+        return {'result': r}
+
 class View(openerpweb.Controller):
     def fields_view_get(self, session, model, view_id, view_type, transform=True):
         Model = session.model(model)
index 61b1f68..7b686f5 100644 (file)
@@ -419,17 +419,13 @@ body.openerp {
 .openerp .required.error {
     border: 1px solid #900;
 }
-.openerp .oe_form_buttons {
+.openerp .oe_form_buttons, .openerp .oe_list_buttons {
     float: left;
 }
-.openerp .oe_form_pager {
+.openerp .oe_form_pager, .openerp .oe_list_pager {
     float: right;
 }
 
-.openerp .oe_list_pager {
-    text-align: right;
-}
-
 /* Inputs */
 .openerp input[type="text"], .openerp input[type="password"], .openerp select, .openerp textarea {
     -moz-box-sizing: border-box;
index 4dbfb47..c0187e7 100644 (file)
@@ -82,7 +82,12 @@ openerp.base.DataSet =  openerp.base.Controller.extend( /** @lends openerp.base.
             });
         }
     },
-    default_get: function() {
+    default_get: function(fields, callback) {
+        this.rpc('/base/dataset/default_get', {
+            model: this.model,
+            fields: fields,
+            context: this.context
+        }, callback);
     },
     create: function() {
     },
index a1ba84e..9bb1eda 100644 (file)
@@ -50,6 +50,7 @@ openerp.base.FormView =  openerp.base.Controller.extend( /** @lends openerp.base
         this.$element.find('div.oe_form_buttons button.oe_form_button_save').click(this.do_save);
         this.$element.find('div.oe_form_buttons button.oe_form_button_save_edit').click(this.do_save_edit);
         this.$element.find('div.oe_form_buttons button.oe_form_button_cancel').click(this.do_cancel);
+        this.$element.find('div.oe_form_buttons button.oe_form_button_new').click(this.on_button_new);
 
         // sidebar stuff
         if (this.view_manager.sidebar) {
@@ -71,6 +72,15 @@ openerp.base.FormView =  openerp.base.Controller.extend( /** @lends openerp.base
             for (var f in this.fields) {
                 this.fields[f].set_value(this.datarecord[f]);
             }
+            if (!record.id) {
+                // Second pass in order to trigger the onchanges in case of new record
+                for (var f in this.fields) {
+                    var field = this.fields[f];
+                    if (field.node.attrs.on_change) {
+                        this.do_onchange(field);
+                    }
+                }
+            }
             this.on_form_changed();
             this.ready = true;
         } else {
@@ -79,13 +89,14 @@ openerp.base.FormView =  openerp.base.Controller.extend( /** @lends openerp.base
         this.do_update_pager();
     },
     on_form_changed: function(widget) {
-        for (var w in this.widgets) {
-            w = this.widgets[w];
-            w.process_attrs();
-            w.update_dom();
-        }
         if (widget && widget.node.attrs.on_change) {
             this.do_onchange(widget);
+        } else {
+            for (var w in this.widgets) {
+                w = this.widgets[w];
+                w.process_attrs();
+                w.update_dom();
+            }
         }
     },
     on_pager_action: function(action) {
@@ -113,24 +124,29 @@ openerp.base.FormView =  openerp.base.Controller.extend( /** @lends openerp.base
         this.$element.find('span.oe_pager_count').html(this.dataset.count);
     },
     do_onchange: function(widget) {
-        var self = this;
-        this.ready = false;
-        var onchange = _.trim(widget.node.attrs.on_change);
-        var call = onchange.match(/^\s?(.*?)\((.*?)\)\s?$/);
-        if (call) {
-            var method = call[1], args = [];
-            _.each(call[2].split(','), function(a) {
-                var field = _.trim(a);
-                if (self.fields[field]) {
-                    args.push(self.fields[field].value);
-                } else {
-                    args.push(false);
-                    this.log("warning : on_change can't find field " + field, onchange);
-                }
-            });
-            this.dataset.call(method, [this.datarecord.id], args, this.on_processed_onchange);
-        } else {
-            this.log("Wrong on_change format", on_change);
+        if (widget.node.attrs.on_change) {
+            var self = this;
+            this.ready = false;
+            var onchange = _.trim(widget.node.attrs.on_change);
+            var call = onchange.match(/^\s?(.*?)\((.*?)\)\s?$/);
+            if (call) {
+                var method = call[1], args = [];
+                _.each(call[2].split(','), function(a) {
+                    var field = _.trim(a);
+                    if (self.fields[field]) {
+                        var value = self.fields[field].value;
+                        args.push(value == null ? false : value);
+                    } else {
+                        args.push(false);
+                        this.log("warning : on_change can't find field " + field, onchange);
+                    }
+                });
+                console.info("Calling onchange :", onchange);
+                // TODO: no async for onchange
+                this.dataset.call(method, (this.datarecord.id == null ? [] : [this.datarecord.id]), args, this.on_processed_onchange);
+            } else {
+                this.log("Wrong on_change format", on_change);
+            }
         }
     },
     on_processed_onchange: function(response) {
@@ -143,13 +159,13 @@ openerp.base.FormView =  openerp.base.Controller.extend( /** @lends openerp.base
                     var value = result.value[f];
                     if (field.value != value) {
                         field.set_value(value);
-                        // TODO: Recursive on_change
-                        // this.on_form_changed(field);
+                        this.do_onchange(field);
                     }
                 } else {
                     this.log("warning : on_processed_onchange can't find field " + field, result);
                 }
             }
+            this.on_form_changed();
         }
         if (result.warning) {
             $(QWeb.render("DialogWarning", result.warning)).dialog({
@@ -166,6 +182,12 @@ openerp.base.FormView =  openerp.base.Controller.extend( /** @lends openerp.base
         }
         this.ready = true;
     },
+    on_button_new: function() {
+        var self = this;
+        this.dataset.default_get(_.keys(this.fields), function(result) {
+            self.on_record_loaded(result.result);
+        });
+    },
     do_save: function() {
         if (!this.ready) {
             return false;
@@ -462,6 +484,7 @@ openerp.base.form.Field = openerp.base.form.Widget.extend({
     set_value: function(value) {
         this.value = value;
         this.invalid = false;
+        this.update_dom();
     },
     get_value: function() {
         return this.value;
@@ -710,7 +733,7 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({
         this.viewmanager = new openerp.base.form.FieldOne2ManyViewManager(this.view.session, this.element_id, this.dataset, views);
         this.viewmanager.start();
     },
-    set_value: function(value) {
+    set_value_CASSEEEEEEEEEEEEEEEEE: function(value) {
         this.value = value;
         this.log("o2m.set_value",value);
         this.viewmanager.dataset.ids = value;
index 7a982e6..9866521 100644 (file)
     <!--
     <h3><t t-esc="fields_view.arch['@string']"/></h3>
     -->
-    <div class="oe_list_pager">
-        <button type="button" data-pager-action="first">First</button>
-        <button type="button" data-pager-action="previous">&lt;&lt;</button>
+    <div class="oe_list_header">
+        <div class="oe_list_buttons">
+            <!--<button type="button" class="oe_list_button_new">New</button>-->
+        </div>
+        <div class="oe_list_pager">
+            <button type="button" data-pager-action="first">First</button>
+            <button type="button" data-pager-action="previous">&lt;&lt;</button>
 
-        <span class="oe_pager_index">0</span> / <span class="oe_pager_count">0</span>
+            <span class="oe_pager_index">0</span> / <span class="oe_pager_count">0</span>
 
-        <button type="button" data-pager-action="next">&gt;&gt;</button>
-        <button type="button" data-pager-action="last">Last</button>
+            <button type="button" data-pager-action="next">&gt;&gt;</button>
+            <button type="button" data-pager-action="last">Last</button>
+        </div>
     </div>
+    <br style="clear: both;"/>
     <table id="todo_use_unique_id" class="jqGrid"></table>
 </t>
 <t t-name="GanttView">
     <h2 class="oe_view_title"><t t-esc="view.fields_view.arch.attrs.string"/></h2>
     <div class="oe_form_header">
         <div class="oe_form_buttons">
-            <button type="button" class="oe_form_button_save">Save</button>
+            <!--<button type="button" class="oe_form_button_save">Save</button>-->
             <button type="button" class="oe_form_button_save_edit">Save &amp; Edit</button>
-            <button type="button" class="oe_form_button_cancel">Cancel</button>
+            <!--<button type="button" class="oe_form_button_cancel">Cancel</button>-->
+            <button type="button" class="oe_form_button_new">New</button>
         </div>
         <div class="oe_form_pager">
             <button type="button" data-pager-action="first">First</button>
         </div>
     </div>
     <t t-raw="frame.render()"/>
-    <div style="text-align:right;">
-        <button type="button" class="form_save">
-            Save
-        </button>
-    </div>
 </t>
 <t t-name="Widget">
     Unhandled widget
                 t-att-nowrap="td.is_field_label ? 'true' : undefined"
                 t-att-valign="td.table ? 'top' : undefined"
                 t-att-id="td.element_id"
-                t-att-class="'container_' + td.type"
+                t-att-class="'oe_form_' + (td.is_field_label ? 'label' : (td.field ? 'field_' + td.type : td.type))"
             >
                 <t t-raw="td.render()"/>
             </td>