diff options
| author | Christophe Matthieu <chm@odoo.com> | 2015-07-07 16:02:53 +0200 |
|---|---|---|
| committer | Christophe Matthieu <chm@odoo.com> | 2015-07-10 17:00:11 +0200 |
| commit | 8c559044a5e1be111dcb577ad7e5ab462c1002a0 (patch) | |
| tree | ba1602e15b2bca38babd6cca63a41da1d05b4321 /addons/web/static/src/js | |
| parent | a616c57c609da0e5e56835dcb45e1c05590d25b8 (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.js | 34 | ||||
| -rw-r--r-- | addons/web/static/src/js/tour.js | 24 | ||||
| -rw-r--r-- | addons/web/static/src/js/views/form_common.js | 6 | ||||
| -rw-r--r-- | addons/web/static/src/js/views/form_view.js | 128 |
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")]; |
