[ADD] form: Basic new record support

bzr revid: fme@openerp.com-20110407130725-0o4d8j2kgko8b7jn
This commit is contained in:
Fabien Meghazi 2011-04-07 15:07:25 +02:00
parent b1310a9814
commit 2acfa4ba06
5 changed files with 79 additions and 47 deletions

View 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)

View 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;

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

View 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;

View File

@ -156,15 +156,21 @@
<!--
<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">
@ -184,9 +190,10 @@
<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>
@ -199,11 +206,6 @@
</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
@ -218,7 +220,7 @@
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>