summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/views
diff options
context:
space:
mode:
authorChristophe Matthieu <chm@odoo.com>2015-07-07 16:02:53 +0200
committerChristophe Matthieu <chm@odoo.com>2015-07-10 17:00:11 +0200
commit8c559044a5e1be111dcb577ad7e5ab462c1002a0 (patch)
treeba1602e15b2bca38babd6cca63a41da1d05b4321 /addons/web/static/src/js/views
parenta616c57c609da0e5e56835dcb45e1c05590d25b8 (diff)
[IMP] web_editor: split website into web_editor (to use editor in backend for html field) and website
Diffstat (limited to 'addons/web/static/src/js/views')
-rw-r--r--addons/web/static/src/js/views/form_common.js6
-rw-r--r--addons/web/static/src/js/views/form_view.js128
2 files changed, 82 insertions, 52 deletions
diff --git a/addons/web/static/src/js/views/form_common.js b/addons/web/static/src/js/views/form_common.js
index 19737746b4a..4d8a302882d 100644
--- a/addons/web/static/src/js/views/form_common.js
+++ b/addons/web/static/src/js/views/form_common.js
@@ -630,6 +630,12 @@ var FieldInterface = {
the field to save its value before reading it using get_value(). Must return a promise.
*/
commit_value: function() {},
+ /*
+ The form view call before_save before save data and if before_save return a deferred,
+ the form view wait that all deferred are resolve or fail.
+ If the deferred is rejected, the field is invalidate
+ */
+ before_save: function() {},
};
/**
diff --git a/addons/web/static/src/js/views/form_view.js b/addons/web/static/src/js/views/form_view.js
index fd024ae0f75..3286f34eff4 100644
--- a/addons/web/static/src/js/views/form_view.js
+++ b/addons/web/static/src/js/views/form_view.js
@@ -837,68 +837,92 @@ var FormView = View.extend(common.FieldManagerMixin, {
_process_save: function(save_obj) {
var self = this;
var prepend_on_create = save_obj.prepend_on_create;
+ var def_process_save = $.Deferred();
try {
var form_invalid = false,
values = {},
first_invalid_field = null,
- readonly_values = {};
- for (var f in self.fields) {
- if (!self.fields.hasOwnProperty(f)) { continue; }
- f = self.fields[f];
- if (!f.is_valid()) {
- form_invalid = true;
- if (!first_invalid_field) {
- first_invalid_field = f;
- }
- } else if (f.name !== 'id' && (!self.datarecord.id || f._dirty_flag)) {
- // Special case 'id' field, do not save this field
- // on 'create' : save all non readonly fields
- // on 'edit' : save non readonly modified fields
- if (!f.get("readonly")) {
- values[f.name] = f.get_value(true);
- } else {
- readonly_values[f.name] = f.get_value(true);
+ readonly_values = {},
+ deferred = [];
+
+ _.each(self.fields, function (f) {
+ var res = f.before_save();
+ if (res) {
+ deferred.push(res);
+ res.fail(function () {
+ form_invalid = true;
+ if (!first_invalid_field) {
+ first_invalid_field = f;
+ }
+ });
+ }
+ });
+
+ $.when.apply($, deferred).always(function () {
+
+ _.each(self.fields, function (f) {
+ if (!f.is_valid()) {
+ form_invalid = true;
+ if (!first_invalid_field) {
+ first_invalid_field = f;
+ }
+ } else if (f.name !== 'id' && (!self.datarecord.id || f._dirty_flag)) {
+ // Special case 'id' field, do not save this field
+ // on 'create' : save all non readonly fields
+ // on 'edit' : save non readonly modified fields
+ if (!f.get("readonly")) {
+ values[f.name] = f.get_value(true);
+ } else {
+ readonly_values[f.name] = f.get_value(true);
+ }
}
+
+ });
+
+ // Heuristic to assign a proper sequence number for new records that
+ // are added in a dataset containing other lines with existing sequence numbers
+ if (!self.datarecord.id && self.fields.sequence &&
+ !_.has(values, 'sequence') && !_.isEmpty(self.dataset.cache)) {
+ // Find current max or min sequence (editable top/bottom)
+ var current = _[prepend_on_create ? "min" : "max"](
+ _.map(self.dataset.cache, function(o){return o.values.sequence})
+ );
+ values['sequence'] = prepend_on_create ? current - 1 : current + 1;
}
- }
- // Heuristic to assign a proper sequence number for new records that
- // are added in a dataset containing other lines with existing sequence numbers
- if (!self.datarecord.id && self.fields.sequence &&
- !_.has(values, 'sequence') && !_.isEmpty(self.dataset.cache)) {
- // Find current max or min sequence (editable top/bottom)
- var current = _[prepend_on_create ? "min" : "max"](
- _.map(self.dataset.cache, function(o){return o.values.sequence})
- );
- values['sequence'] = prepend_on_create ? current - 1 : current + 1;
- }
- if (form_invalid) {
- self.set({'display_invalid_fields': true});
- first_invalid_field.focus();
- self.on_invalid();
- return $.Deferred().reject();
- } else {
- self.set({'display_invalid_fields': false});
- var save_deferral;
- if (!self.datarecord.id) {
- // Creation save
- save_deferral = self.dataset.create(values, {readonly_fields: readonly_values}).then(function(r) {
- return self.record_created(r, prepend_on_create);
- }, null);
- } else if (_.isEmpty(values)) {
- // Not dirty, noop save
- save_deferral = $.Deferred().resolve({}).promise();
+ if (form_invalid) {
+ self.set({'display_invalid_fields': true});
+ first_invalid_field.focus();
+ self.on_invalid();
+ def_process_save.reject();
} else {
- // Write save
- save_deferral = self.dataset.write(self.datarecord.id, values, {readonly_fields: readonly_values}).then(function(r) {
- return self.record_saved(r);
- }, null);
+ self.set({'display_invalid_fields': false});
+ var save_deferral;
+ if (!self.datarecord.id) {
+ // Creation save
+ save_deferral = self.dataset.create(values, {readonly_fields: readonly_values}).then(function(r) {
+ return self.record_created(r, prepend_on_create);
+ }, null);
+ } else if (_.isEmpty(values)) {
+ // Not dirty, noop save
+ save_deferral = $.Deferred().resolve({}).promise();
+ } else {
+ // Write save
+ save_deferral = self.dataset.write(self.datarecord.id, values, {readonly_fields: readonly_values}).then(function(r) {
+ return self.record_saved(r);
+ }, null);
+ }
+ save_deferral.then(function(result) {
+ def_process_save.resolve(result);
+ }).fail(function() {
+ def_process_save.reject();
+ });
}
- return save_deferral;
- }
+ });
} catch (e) {
console.error(e);
- return $.Deferred().reject();
+ return def_process_save.reject();
}
+ return def_process_save;
},
on_invalid: function() {
var warnings = _(this.fields).chain()
@@ -1266,7 +1290,7 @@ var FormRenderingEngine = FormRenderingEngineInterface.extend({
}
var obj = self.fields_registry.get_any([$elem.attr('widget'), self.fvg.fields[name].type]);
if (!obj) {
- throw new Error(_.str.sprintf(_t("Widget type '%s' is not implemented"), $elem.attr('widget')));
+ throw new Error(_.str.sprintf(_t("Widget type '%s' is not implemented"), $elem.attr('widget') || self.fvg.fields[name].type ));
}
var w = new (obj)(self.view, utils.xml_to_json($elem[0]));
var $label = self.labels[$elem.attr("name")];