summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js
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
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')
-rw-r--r--addons/web/static/src/js/framework/ajax.js34
-rw-r--r--addons/web/static/src/js/tour.js24
-rw-r--r--addons/web/static/src/js/views/form_common.js6
-rw-r--r--addons/web/static/src/js/views/form_view.js128
4 files changed, 118 insertions, 74 deletions
diff --git a/addons/web/static/src/js/framework/ajax.js b/addons/web/static/src/js/framework/ajax.js
index dd1eee906c1..ce61f225524 100644
--- a/addons/web/static/src/js/framework/ajax.js
+++ b/addons/web/static/src/js/framework/ajax.js
@@ -275,11 +275,45 @@ function get_file(options) {
};
+var loadXML = (function () {
+ var loading = false;
+ var urls = [];
+ var qwebs = [];
+ var templates_def = $.Deferred();
+
+ var load = function loadXML(url, qweb) {
+ if (url) {
+ urls.push(url);
+ qwebs.push(qweb);
+ }
+
+ if (!loading && urls.length) {
+ if (templates_def.state() === "resolved") {
+ templates_def = $.Deferred();
+ }
+
+ loading = true;
+ qwebs.shift().add_template(urls.shift(), function () {
+ loading = false;
+ if (!urls.length) {
+ templates_def.resolve();
+ }
+ load(null);
+ });
+ }
+
+ return templates_def;
+ };
+
+ return load;
+})();
+
return {
jsonRpc: jsonRpc,
jsonpRpc: jsonpRpc,
loadCSS: loadCSS,
loadJS: loadJS,
+ loadXML: loadXML,
get_file: get_file,
};
diff --git a/addons/web/static/src/js/tour.js b/addons/web/static/src/js/tour.js
index 234b681f7d2..585626ab4a2 100644
--- a/addons/web/static/src/js/tour.js
+++ b/addons/web/static/src/js/tour.js
@@ -6,25 +6,6 @@ var core = require('web.core');
var _t = core._t;
var qweb = core.qweb;
-// make this work
-// raise an error in test mode if openerp don't exist
-// if (typeof openerp === "undefined") {
-// var error = "openerp is undefined"
-// + "\nhref: " + window.location.href
-// + "\nreferrer: " + document.referrer
-// + "\nlocalStorage: " + window.localStorage.getItem("tour");
-// if (typeof $ !== "undefined") {
-// error += '\n\n' + $("body").html();
-// }
-// throw new Error(error);
-// }
-
-
-// // don't rewrite T in test mode
-// if (typeof openerp.Tour !== "undefined") {
-// return;
-// }
-
/////////////////////////////////////////////////
@@ -78,7 +59,7 @@ var Tour = {
defaultDelay: 50,
autoRunning: true,
retryRunningDelay: 1000,
- errorDelay: 5000,
+ errorDelay: 10000,
state: null,
$element: null,
timer: null,
@@ -700,7 +681,7 @@ var Tour = {
},
scrollIntoView: function ($element){
// if element is not on window (screen) then it scroll down to get popup visible
- if (!$element.is('body')){
+ if (!$element.is('body') && !$element.parents().filter(function () { return $(this).css("position") === "fixed";}).length){
var element_top = $element.offset().top;
var visible = ((element_top > $(window).scrollTop()) && (element_top < ($(window).scrollTop() + $(window).height())));
if (!visible) {
@@ -709,7 +690,6 @@ var Tour = {
}
}
};
-// openerp.Tour = Tour;
/////////////////////////////////////////////////
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")];