[IMP] web: module can be asynchronous loaded if it return a deferred

Each module can return a deferred. In that case, the module is marked as loaded
only when the deferred is resolved, and its value is equal to the resolved value.
The module can be rejected (unloaded). This will be logged in the console as info.

Remove if_dom_contains from the website, the modules return a rejected deferred if
the DOM doesn't contains the seleted values.
This commit is contained in:
Christophe Matthieu
2015-07-22 12:15:24 +02:00
parent dfad968515
commit 71732dceb6
21 changed files with 182 additions and 128 deletions
-2
View File
@@ -46,8 +46,6 @@
});
return web_client;
});
odoo.init();
</script>
</head>
+6 -2
View File
@@ -8,7 +8,12 @@ var website = require('website.website');
* the website engine.
*/
website.if_dom_contains('.js_surveyform', function (the_form) {
var the_form = $('.js_surveyform');
if(!the_form.length) {
return $.Deferred().reject("DOM doesn't contain '.js_surveyform'");
}
console.debug("[survey] Custom JS for survey is loading...");
var prefill_controller = the_form.attr("data-prefill");
@@ -163,6 +168,5 @@ website.if_dom_contains('.js_surveyform', function (the_form) {
}
console.debug("[survey] Custom JS for survey loaded!");
});
});
+4 -2
View File
@@ -3,7 +3,10 @@ odoo.define('survey.result', function (require) {
var website = require('website.website');
website.if_dom_contains('.js_surveyresult', function () {
if(!$('.js_surveyresult').length) {
return $.Deferred().reject("DOM doesn't contain '.js_surveyresult'");
}
console.debug("[survey] Survey Result JS is loading...");
//Script For Pagination
@@ -160,6 +163,5 @@ website.if_dom_contains('.js_surveyresult', function () {
});
console.debug("[survey] Survey Result JS loaded!");
});
});
+53 -10
View File
@@ -5,6 +5,10 @@
/**
* @name openerp
* @namespace openerp
*
* Modules can return a deferred the module is mark as loaded only when
* the deferred is resolved, and the service value equal the resolved value.
* The module can be rejected (unloaded) and logged as info.
*/
(function() {
@@ -14,6 +18,7 @@
var factories = Object.create(null);
var job_names = [];
var job_deps = [];
var job_deferred = [];
var services = Object.create({
qweb: new QWeb2.Engine(),
@@ -29,6 +34,7 @@
var odoo = window.odoo = {
testing: typeof QUnit === "object",
debug: debug,
remaining_jobs: jobs,
__DEBUG__: {
get_dependencies: function (name, transitive) {
@@ -122,7 +128,11 @@
odoo.__DEBUG__.web_client = services['web.web_client'];
if (jobs.length) {
var debug_jobs = {}, job;
var debug_jobs = {};
var rejected = [];
var rejected_linked = [];
var job;
var jobdep;
for (var k=0; k<jobs.length; k++) {
debug_jobs[jobs[k].name] = job = {
@@ -133,13 +143,26 @@
if (jobs[k].error) {
job.error = jobs[k].error;
}
if (jobs[k].rejected) {
job.rejected = jobs[k].rejected;
rejected.push(job.name);
}
var deps = odoo.__DEBUG__.get_dependencies( job.name );
for (var i=0; i<deps.length; i++) {
if (job.name !== deps[i] && !(deps[i] in services)) {
if (!job.missing) {
job.missing = [];
jobdep = debug_jobs[deps[i]] || (deps[i] in factories && _.find(jobs, function (job) { return job.name === deps[i];}));
if (jobdep && jobdep.rejected) {
if (!job.rejected) {
job.rejected = [];
rejected_linked.push(job.name);
}
job.rejected.push(deps[i]);
} else {
if (!job.missing) {
job.missing = [];
}
job.missing.push(deps[i]);
}
job.missing.push(deps[i]);
}
}
}
@@ -152,20 +175,34 @@
}
},
process_jobs: function (jobs, services) {
var job, require;
while (jobs.length && (job = _.find(jobs, is_ready))) {
require = make_require(job);
var job;
var require;
var time;
function process_job (job) {
var require = make_require(job);
try {
services[job.name] = job.factory.call(null, require);
var def = $.Deferred();
$.when(job.factory.call(null, require)).then(
function (data) {
services[job.name] = data;
clearTimeout(time);
time = _.defer(odoo.process_jobs, jobs, services);
def.resolve();
}, function (e) {
job.rejected = e || true;
jobs.push(job);
def.resolve();
});
jobs.splice(jobs.indexOf(job), 1);
job_deferred.push(def);
} catch (e) {
job.error = e;
}
}
return services;
function is_ready (job) {
return !job.error && _.every(job.factory.deps, function (name) { return name in services; });
return !job.error && !job.rejected && _.every(job.factory.deps, function (name) { return name in services; });
}
function make_require (job) {
@@ -183,6 +220,12 @@
require.__require_calls = 0;
return require;
}
while (jobs.length && (job = _.find(jobs, is_ready))) {
process_job(job);
}
return services;
}
};
+10 -16
View File
@@ -6,8 +6,6 @@ var ajax = require('web.ajax');
var qweb = core.qweb;
var _t = core._t;
//////////////////////////////////////////////////////////////////////////////////////////////////////////
var get_context = function (dict) {
var html = document.documentElement;
return _.extend({
@@ -16,20 +14,23 @@ var get_context = function (dict) {
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////
/* ----------------------------------------------------
Async Ready and Template loading
---------------------------------------------------- */
var data = {
'get_context': get_context,
'url_translations': '/web/webclient/translations',
};
var dom_ready = $.Deferred();
$(document).ready(function () {
dom_ready.resolve();
dom_ready.resolve(data);
// fix for ie
if($.fn.placeholder) $('input, textarea').placeholder();
});
data.dom_ready = dom_ready;
// todo: remove and load a bundle of translated templates
var all_ready;
var ready = function() {
data.ready = function() {
if (!all_ready) {
all_ready = $.when(dom_ready, ajax.loadXML()).then(translations);
} else if(all_ready.state() === "resolved") { // can add async template
@@ -63,13 +64,6 @@ function translations() {
}
}).promise();
}
var data = {
'get_context': get_context,
'url_translations': '/web/webclient/translations',
'dom_ready': dom_ready,
'ready': ready,
};
return data;
return dom_ready;
});
@@ -19,7 +19,6 @@ editor.editable = !!$('html').data('editable');
ajax.loadXML('/web_editor/static/src/xml/editor.xml', qweb);
base.dom_ready.done(function () {
$(document).on('click', '.note-editable', function (ev) {
ev.preventDefault();
});
@@ -37,7 +36,6 @@ base.dom_ready.done(function () {
ev.preventDefault();
}
});
});
//////////////////////////////////////////////////////////////////////////////////////////////////////////
+1 -1
View File
@@ -74,5 +74,5 @@ translator.Class.include({
});
$(function () {
odoo.init();
_.delay(odoo.init, 500);
});
@@ -10,9 +10,13 @@ var base = require('web_editor.base');
var qweb = core.qweb;
if(!$('#oe_systray').length) {
return $.Deferred().reject("DOM doesn't contain '#oe_systray'");
}
var PlannerDialog = planner.PlannerDialog;
planner.WebistePlannerLauncher = Widget.extend({
planner.WebsitePlannerLauncher = Widget.extend({
template: "PlannerLauncher",
events: {
'click .o_planner_progress': 'toggle_dialog'
@@ -58,12 +62,8 @@ PlannerDialog.include({
}
});
base.dom_ready.done(function() {
if($('#oe_systray').length) {
ajax.loadXML('/web_planner/static/src/xml/web_planner.xml', qweb).then(function() {
new planner.WebistePlannerLauncher().prependTo($('#oe_systray'));
});
}
return ajax.loadXML('/web_planner/static/src/xml/web_planner.xml', qweb).then(function() {
new planner.WebsitePlannerLauncher().prependTo($('#oe_systray'));
});
});
+3 -21
View File
@@ -23,6 +23,7 @@ browser += ","+$.browser.version;
if (/android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(navigator.userAgent.toLowerCase())) browser += ",mobile";
document.documentElement.setAttribute('data-browser', browser);
/* ----------------------------------------------------
Helpers
---------------------------------------------------- */
@@ -216,22 +217,6 @@ var init_kanban = function ($kanban) {
ajax.loadXML('/website/static/src/xml/website.xml', qweb);
/**
* Execute a function if the dom contains at least one element matched
* through the given jQuery selector. Will first wait for the dom to be ready.
*
* @param {String} selector A jQuery selector used to match the element(s)
* @param {Function} fn Callback to execute if at least one element has been matched
*/
var if_dom_contains = function(selector, fn) {
base.dom_ready.then(function () {
var elems = $(selector);
if (elems.length) {
fn(elems);
}
});
};
/**
* Cancel the auto run of Tour (test) and launch the tour after tob bar all bind events
*/
@@ -249,8 +234,7 @@ base.ready().then(function () {
* Returns a deferred resolved when the templates are loaded
* and the Widgets can be instanciated.
*/
base.dom_ready.then(function () {
/* ----- PUBLISHING STUFF ---- */
$(document).on('click', '.js_publish_management .js_publish_btn', function () {
var $data = $(this).parents(".js_publish_management:first");
@@ -305,7 +289,6 @@ base.dom_ready.then(function () {
window.document.body.scrollTop = +location.hash.match(/scrollTop=([0-9]+)/)[1];
}
},0);
});
/**
@@ -329,7 +312,6 @@ var TopBar = Widget.extend({
var data = {
prompt: prompt,
form: form,
if_dom_contains: if_dom_contains,
TopBar: TopBar,
ready: function () {
console.warn("website.ready is deprecated: Please use require('web_editor.base').ready()");
@@ -341,5 +323,5 @@ return data;
});
$(function () {
odoo.init();
_.defer(odoo.init);
});
@@ -1,15 +1,11 @@
odoo.define('website_blog.editor', function (require) {
odoo.define('website_blog.new_blog_post', function (require) {
"use strict";
var ajax = require('web.ajax');
var core = require('web.core');
var Model = require('web.Model');
var base = require('web_editor.base');
var widget = require('web_editor.widget');
var options = require('web_editor.snippets.options');
var Model = require('web.Model');
var website = require('website.website');
var contentMenu = require('website.contentMenu');
var rte = require('web_editor.rte');
var _t = core._t;
@@ -35,7 +31,19 @@ contentMenu.TopBar.include({
},
});
website.if_dom_contains('.website_blog', function() {
});
odoo.define('website_blog.editor', function (require) {
"use strict";
var ajax = require('web.ajax');
var widget = require('web_editor.widget');
var options = require('web_editor.snippets.options');
var rte = require('web_editor.rte');
if(!$('.website_blog').length) {
return $.Deferred().reject("DOM doesn't contain '.website_blog'");
}
rte.Class.include({
saveElement: function ($el, context) {
@@ -99,5 +107,3 @@ website.if_dom_contains('.website_blog', function() {
});
});
});
@@ -9,7 +9,10 @@ var _t = core._t;
var lastsearch;
website.if_dom_contains('.website_forum', function () {
if(!$('.website_forum').length) {
return $.Deferred().reject("DOM doesn't contain '.website_forum'");
}
$("[data-toggle='popover']").popover();
$('.karma_required').on('click', function (ev) {
var karma = $(ev.currentTarget).data('karma');
@@ -256,6 +259,5 @@ website.if_dom_contains('.website_forum', function () {
$textarea.html($form.find('.note-editable').code());
});
});
});
});
@@ -6,11 +6,15 @@ var core = require('web.core');
var base = require('web_editor.base');
var SocialShare = require('website.share');
var website = require('website.website');
website.if_dom_contains('.website_forum', function () {
var qweb = core.qweb;
ajax.loadXML('/website_forum/static/src/xml/website_forum_share_templates.xml', qweb);
if(!$('.website_forum').length) {
return $.Deferred().reject("DOM doesn't contain '.website_forum'");
}
var ForumShare = SocialShare.extend({
init: function (parent, target_type) {
this.target_type = target_type;
@@ -61,7 +65,6 @@ base.ready().done(function() {
var $question_container = $('.oe_js_bump');
new ForumShare($question_container, 'social-alert');
}
});
});
return {};
@@ -14,7 +14,9 @@ var ZeroClipboard = window.ZeroClipboard;
var exports = {};
website.if_dom_contains('div.o_website_links_create_tracked_url', function() {
if(!$('.o_website_links_create_tracked_url').length) {
return $.Deferred().reject("DOM doesn't contain '.o_website_links_create_tracked_url'");
}
var SelectBox = Widget.extend({
init: function(obj) {
@@ -386,7 +388,6 @@ website.if_dom_contains('div.o_website_links_create_tracked_url', function() {
exports.SelectBox = SelectBox;
exports.RecentLinkBox = RecentLinkBox;
exports.RecentLinks = RecentLinks;
});
return exports;
});
@@ -8,7 +8,10 @@ var Model = require('web.Model');
var exports = {};
website.if_dom_contains('div.o_website_links_chart', function() {
if(!$('.o_website_links_chart').length) {
return $.Deferred().reject("DOM doesn't contain '.o_website_links_chart'");
}
var BarChart = Widget.extend({
init: function($element, begin_date, end_date, dates) {
this.$element = $element;
@@ -244,7 +247,6 @@ website.if_dom_contains('div.o_website_links_chart', function() {
exports.BarChart = BarChart;
exports.PieChart = PieChart;
});
return exports;
});
@@ -5,8 +5,10 @@ var ajax = require('web.ajax');
var base = require('web_editor.base');
var website = require('website.website');
base.ready().done(function() {
website.if_dom_contains('.o_website_links_edit_code', function() {
if(!$('.o_website_links_edit_code').length) {
return $.Deferred().reject("DOM doesn't contain '.o_website_links_edit_code'");
}
// Edit the short URL code
$('.o_website_links_edit_code').on('click', function(e) {
@@ -84,5 +86,3 @@ website.if_dom_contains('.o_website_links_edit_code', function() {
});
});
});
});
@@ -86,11 +86,8 @@ animation.registry.follow_alias = animation.Class.extend({
});
base.dom_ready.then(function () {
$('.js_follow_btn').on('click', function (ev) {
var email = $(ev.currentTarget).parents('.js_mg_follow_form').first().find('.js_follow_email').val();
$(document).find('.js_follow_email').val(email);
});
$('.js_follow_btn').on('click', function (ev) {
$('.js_follow_email').val($(ev.currentTarget).closest('.js_mg_follow_form').find('.js_follow_email').val());
});
});
@@ -119,7 +119,15 @@ animation.registry.newsletter_popup = animation.Class.extend({
}
});
website.if_dom_contains('div.o_unsubscribe_form', function() {
});
odoo.define('mass_mailing.unsubscribe', function (require) {
if(!$('.o_unsubscribe_form').length) {
return $.Deferred().reject("DOM doesn't contain '.o_unsubscribe_form'");
}
$('#unsubscribe_form').on('submit', function(e) {
e.preventDefault();
@@ -144,6 +152,5 @@ website.if_dom_contains('div.o_unsubscribe_form', function() {
$('.alert-info').html('You changes has not been saved, try again later.').removeClass('alert-info').addClass('alert-warning');
});
});
});
});
@@ -5,7 +5,9 @@ var ajax = require('web.ajax');
var Widget = require('web.Widget');
var website = require('website.website');
website.if_dom_contains('div.o_website_quote', function () {
if(!$('.o_website_quote').length) {
return $.Deferred().reject("DOM doesn't contain '.o_website_quote'");
}
// Add to SO button
var UpdateLineButton = Widget.extend({
@@ -159,10 +161,15 @@ website.if_dom_contains('div.o_website_quote', function () {
});
// dbo note: website_sale code for payment
// if we standardize payment somehow, this should disappear
$(document).ready(function () {
odoo.define('website_quote.payment_method', function (require) {
'use strict';
if(!$('#payment_method').length) {
return $.Deferred().reject("DOM doesn't contain '#payment_method'");
}
// dbo note: website_sale code for payment
// if we standardize payment somehow, this should disappear
// When choosing an acquirer, display its Pay Now button
var $payment = $("#payment_method");
$payment.on("click", "input[name='acquirer']", function (ev) {
@@ -188,5 +195,3 @@ $(document).ready(function () {
});
});
});
});
@@ -1,24 +1,8 @@
odoo.define('website_sale.website_sale', function (require) {
odoo.define('website_sale.cart', function (require) {
"use strict";
var ajax = require('web.ajax');
var core = require('web.core');
var _t = core._t;
var base = require('web_editor.base');
base.dom_ready.then(function () {
$('#o_shop_collapse_category').on('click', '.fa-chevron-right',function(){
$(this).parent().siblings().find('.fa-chevron-down:first').click();
$(this).parents('li').find('ul:first').show('normal');
$(this).toggleClass('fa-chevron-down fa-chevron-right');
});
$('#o_shop_collapse_category').on('click', '.fa-chevron-down',function(){
$(this).parent().find('ul:first').hide('normal');
$(this).toggleClass('fa-chevron-down fa-chevron-right');
});
var shopping_cart_link = $('ul#top_menu li a[href^="/shop/cart"]');
var shopping_cart_link_counter;
@@ -61,6 +45,31 @@ shopping_cart_link.popover({
}, 1000);
});
});
odoo.define('website_sale.website_sale', function (require) {
"use strict";
var ajax = require('web.ajax');
var core = require('web.core');
var _t = core._t;
var base = require('web_editor.base');
if(!$('#o_shop_collapse_category, .oe_website_sale').length) {
return $.Deferred().reject("DOM doesn't contain '#o_shop_collapse_category, .oe_website_sale'");
}
$('#o_shop_collapse_category').on('click', '.fa-chevron-right',function(){
$(this).parent().siblings().find('.fa-chevron-down:first').click();
$(this).parents('li').find('ul:first').show('normal');
$(this).toggleClass('fa-chevron-down fa-chevron-right');
});
$('#o_shop_collapse_category').on('click', '.fa-chevron-down',function(){
$(this).parent().find('ul:first').hide('normal');
$(this).toggleClass('fa-chevron-down fa-chevron-right');
});
$('.oe_website_sale').each(function () {
var oe_website_sale = this;
@@ -338,5 +347,3 @@ $('.oe_website_sale').each(function () {
});
});
});
@@ -4,8 +4,11 @@ odoo.define('website_sale_options.website_sale', function(require) {
var ajax = require('web.ajax');
var website = require('website.website');
var base = require('web_editor.base');
require('website_sale.website_sale');
website.if_dom_contains("ul.js_add_cart_variants[data-attribute_value_ids]", function () {
if(!$('ul.js_add_cart_variants[data-attribute_value_ids]').length) {
return $.Deferred().reject("DOM doesn't contain 'ul.js_add_cart_variants[data-attribute_value_ids]'");
}
$('.oe_website_sale #add_to_cart, .oe_website_sale #products_grid .a-submit')
.off('click')
@@ -103,6 +106,12 @@ $('.oe_website_sale #add_to_cart, .oe_website_sale #products_grid .a-submit')
return false;
});
});
odoo.define('website_sale_options.website_sale', function(require) {
"use strict";
require('website_sale.cart');
$('#cart_products input.js_quantity').change(function () {
var value = $(this).val();
@@ -114,5 +123,3 @@ $('#cart_products input.js_quantity').change(function () {
});
});
});
@@ -12,7 +12,9 @@ var website = require('website.website');
var qweb = core.qweb;
var _t = core._t;
website.if_dom_contains('.oe_slide_js_upload', function () {
if(!$('.oe_slide_js_upload').length) {
return $.Deferred().reject("DOM doesn't contain '.oe_slide_js_upload'");
}
ajax.loadXML('/website_slides/static/src/xml/website_slides.xml', qweb);
@@ -356,16 +358,10 @@ var SlideDialog = Widget.extend({
}
});
base.dom_ready.then(function () {
// bind the event to the button
$('.oe_slide_js_upload').on('click', function () {
var channel_id = $(this).attr('channel_id');
slides.page_widgets['upload_dialog'] = new SlideDialog(this, channel_id).appendTo(document.body);
});
});
});
});
});