From 99743cae437d60220b475030e4f206f8709d535c Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 31 Jan 2014 12:07:48 +0100 Subject: [PATCH 01/24] [REM] useless comment the database password is necessary to duplicate databases bzr revid: xmo@openerp.com-20140131110748-nfguxwjysgbn6y3y --- addons/web/tests/test_js.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/addons/web/tests/test_js.py b/addons/web/tests/test_js.py index b37c082739f..a126ce4b2f3 100644 --- a/addons/web/tests/test_js.py +++ b/addons/web/tests/test_js.py @@ -10,12 +10,6 @@ class WebSuite(QUnitSuite): '/web/tests', 'mod=*&source={db}&supadmin={supadmin}&password={password}'.format( db=tools.config['db_name'], - # al: i dont understand why both are needed, db_password is the - # password for postgres and should not appear here of that i'm - # sure - # - # But runbot provides it with this wrong key so i let it here - # until it's fixed supadmin=tools.config['db_password'] or 'admin', password=tools.config['admin_passwd'] or 'admin'), '' From b78703c12200facabef2cad3e4fa5ec4eb9d57e3 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 31 Jan 2014 16:26:12 +0100 Subject: [PATCH 02/24] [IMP] console.log js output should be piped to stdout during JS tests bzr revid: xmo@openerp.com-20140131152612-rqxkge24w6p95q10 --- addons/web/tests/qunitsuite/suite.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/web/tests/qunitsuite/suite.py b/addons/web/tests/qunitsuite/suite.py index 3aed7b133f1..84092c687b4 100644 --- a/addons/web/tests/qunitsuite/suite.py +++ b/addons/web/tests/qunitsuite/suite.py @@ -110,6 +110,8 @@ class QUnitSuite(unittest.TestSuite): self._test.failed = True result.addFailure( self._test, self.failure_to_str(*args[2:])) + elif event_name == 'console': + print args[1] return False From ae3223907b5d33f95c2215824cce1d5a179f6f29 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 31 Jan 2014 16:26:40 +0100 Subject: [PATCH 03/24] [FIX] modules initialization when testing broken "adaptation" to single-instance openerp would only initialize the first set of dependencies, any further module would see its test runs without itself or its dependencies being guaranteed to be initialized/installed into the current openerp instance. bzr revid: xmo@openerp.com-20140131152640-coxqulkdb0xupbvq --- addons/web/static/src/js/testing.js | 38 ++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/addons/web/static/src/js/testing.js b/addons/web/static/src/js/testing.js index f607b278437..c4f5aeebd60 100644 --- a/addons/web/static/src/js/testing.js +++ b/addons/web/static/src/js/testing.js @@ -15,6 +15,37 @@ openerp.testing = {}; list_editable: ['list', 'form', 'data'], }; + var initialized = []; + /** + * openerp.init is a broken-ass piece of shit, makes it impossible to + * progressively add modules, using it, retarded openerp_inited flag + * means the first tests being run get their dependencies loaded + * (basically just base and web), and for *every other module* the tests + * run without the dependencies being correctly loaded + */ + function init(modules) { + if (!initialized.length) { + openerp.init(modules); + initialized = openerp._modules.slice(); + return; + } + var to_initialize = _.difference(modules, initialized); + for (var i = 0; i < to_initialize.length; i++) { + var modname = to_initialize[i]; + var fct = openerp[modname]; + if (typeof fct === 'function') { + var module = openerp[modname] = {}; + for(var k in fct) { + if (!fct.hasOwnProperty(k)) { continue; } + module[k] = fct[k]; + } + fct(openerp, module) + } + initialized.push(modname); + openerp._modules.push(modname); + } + } + testing.dependencies = window['oe_all_dependencies'] || []; testing.current_module = null; testing.templates = { }; @@ -165,8 +196,6 @@ openerp.testing = {}; }); }; - var openerp_inited = false; - var db = window['oe_db_info']; testing.section = function (name, options, body) { if (_.isFunction(options)) { @@ -243,10 +272,7 @@ openerp.testing = {}; QUnit.test(name, function () { var instance = openerp; - if (!openerp_inited) { - openerp.init(module_deps); - openerp_inited = true; - } + init(module_deps); instance.session = new instance.web.Session(); instance.session.uid = 42; if (_.isNumber(opts.asserts)) { From 8be916910e29975439c3eef24fcfbe4089c71530 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 31 Jan 2014 16:27:53 +0100 Subject: [PATCH 04/24] [FIX] re-enable web_tests_demo tests bzr revid: xmo@openerp.com-20140131152753-81418oy8wjzxkgmt --- addons/web_tests_demo/static/test/demo.js | 34 +++++++++++------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/addons/web_tests_demo/static/test/demo.js b/addons/web_tests_demo/static/test/demo.js index 0ca10ba642c..2ead2902828 100644 --- a/addons/web_tests_demo/static/test/demo.js +++ b/addons/web_tests_demo/static/test/demo.js @@ -1,7 +1,5 @@ -// niv: I desactivate these until the testing framework has been adapted to better use -// the new way to declare JavaScript modules -/*openerp.testing.section('basic section', function (test) { +openerp.testing.section('basic section', function (test) { test('my first test', function () { ok(true, "this test has run"); }); @@ -88,18 +86,18 @@ }); }); -// test('actual RPC', {rpc: 'rpc', asserts: 4}, function (instance) { -// var Model = new instance.web.Model('web_tests_demo.model'); -// return Model.call('create', [{name: "Bob"}]) -// .then(function (id) { -// return Model.call('read', [[id]]); -// }).then(function (records) { -// strictEqual(records.length, 1); -// var record = records[0]; -// strictEqual(record.name, "Bob"); -// strictEqual(record.thing, false); -// // default value -// strictEqual(record.other, 'bob'); -// }); -// }); -});*/ + test('actual RPC', {rpc: 'rpc', asserts: 4}, function (instance) { + var Model = new instance.web.Model('web_tests_demo.model'); + return Model.call('create', [{name: "Bob"}]) + .then(function (id) { + return Model.call('read', [[id]]); + }).then(function (records) { + strictEqual(records.length, 1); + var record = records[0]; + strictEqual(record.name, "Bob"); + strictEqual(record.thing, false); + // default value + strictEqual(record.other, 'bob'); + }); + }); +}); From e9a3d8bcec151937fd983b0d658a1ed9144d7ff4 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 31 Jan 2014 16:41:47 +0100 Subject: [PATCH 05/24] [FIX] enable jsonrpc-auth tests, remove stray log bzr revid: xmo@openerp.com-20140131154147-oi30v8u8h3c3htx7 --- addons/web/static/test/jsonrpc.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/addons/web/static/test/jsonrpc.js b/addons/web/static/test/jsonrpc.js index ef0c1fbc44c..96b10f0fee1 100644 --- a/addons/web/static/test/jsonrpc.js +++ b/addons/web/static/test/jsonrpc.js @@ -156,7 +156,6 @@ ropenerp.testing.section('jsonrpc-auth', { rpc: "rpc", }, function (test) { - return; test('basic-auth', {asserts: 3}, function () { var db = ropenerp.session.db; var session = new openerp.Session(null, null, {override_session: true}); @@ -182,7 +181,6 @@ function (test) { session2 = new openerp.Session(null, null, {session_id: session.session_id}); equal(session2.uid, undefined, "uid should be undefined"); equal(session2.override_session, true, "overwrite_session should be true"); - console.log("session_id", session.session_id); return session2.session_reload(); }).then(function() { equal(session2.uid, session.uid); From d23f8425ad65fcfcbc087892dc6038be7a5ae13c Mon Sep 17 00:00:00 2001 From: Christophe Matthieu Date: Mon, 3 Feb 2014 12:28:16 +0100 Subject: [PATCH 06/24] [FIX] website tour: flickering; banner auto run; work with different language bzr revid: chm@openerp.com-20140203112816-c350lxr5pgo9x2li --- addons/website/data/website_data.xml | 2 +- .../static/src/js/website.tour.banner.js | 4 +- addons/website/static/src/js/website.tour.js | 39 +++++++++++-------- .../website_blog/data/website_blog_data.xml | 2 +- .../static/src/js/website.tour.blog.js | 2 +- .../static/src/js/website.tour.event.js | 2 +- .../tests/ui_suite/event_test.js | 2 +- .../website_sale/data/website_sale_data.xml | 2 +- .../static/src/js/website.tour.shop.js | 8 ++-- 9 files changed, 35 insertions(+), 28 deletions(-) diff --git a/addons/website/data/website_data.xml b/addons/website/data/website_data.xml index 50f2d8e381e..4eff1b8a60d 100644 --- a/addons/website/data/website_data.xml +++ b/addons/website/data/website_data.xml @@ -59,7 +59,7 @@ Website With Tutorial - /?tutorial.banner=true + /#tutorial.banner=true self diff --git a/addons/website/static/src/js/website.tour.banner.js b/addons/website/static/src/js/website.tour.banner.js index 2c26ae34e98..b079c4a670c 100644 --- a/addons/website/static/src/js/website.tour.banner.js +++ b/addons/website/static/src/js/website.tour.banner.js @@ -13,7 +13,7 @@ website.BannerTour = website.Tour.extend({ id: 'banner', name: "Insert a banner", - path: '/page/website.homepage', + path: '/', init: function (editor) { var self = this; self.steps = [ @@ -52,9 +52,9 @@ placement: 'top', title: "Customize banner's text", content: "Click in the text and start editing it. Click continue once it's done.", + template: self.popover({ next: "Continue" }), }, { - waitNot: '#wrap [data-snippet-id=carousel]:first .carousel-caption:contains("Your Banner Title")', element: '.oe_overlay_options .oe_options', placement: 'left', title: "Customize the banner", diff --git a/addons/website/static/src/js/website.tour.js b/addons/website/static/src/js/website.tour.js index 39eaa5b7279..1db813e4cd4 100644 --- a/addons/website/static/src/js/website.tour.js +++ b/addons/website/static/src/js/website.tour.js @@ -7,10 +7,6 @@ website.add_template_file('/website/static/src/xml/website.tour.xml'); website.EditorBar.include({ tours: [], start: function () { - // $('.tour-backdrop').click(function (e) { - // e.stopImmediatePropagation(); - // e.preventDefault(); - // }); var self = this; var menu = $('#help-menu'); _.each(this.tours, function (tour) { @@ -113,11 +109,13 @@ website.Tour = openerp.Class.extend({ this.localStorage.setItem("tour-"+this.id+"-test-automatic", true); } - // redirect to begin of the tour if (this.path) { - var path = this.path.split('?'); - window.location.href = path[0] + "?tutorial."+this.id+"=true" + path.slice(1, path.length).join("?"); - return; + // redirect to begin of the tour in function of the language + if (!this.testUrl(this.path+"(#.*)?$")) { + var path = this.path.split('#'); + window.location.href = "/"+this.getLang()+path[0] + "#tutorial."+this.id+"=true&" + path.slice(1, path.length).join("#"); + return; + } } var self = this; @@ -125,12 +123,12 @@ website.Tour = openerp.Class.extend({ website.Tour.waitReady.call(this, function () {self._running();}); }, running: function () { - if (+this.localStorage.getItem("tour-"+this.id+"-test") >= this.steps.length) { + if (+this.localStorage.getItem("tour-"+this.id+"-test") >= this.steps.length-1) { this.endTour(); return; } - if (website.Tour.is_busy() || !this.testUrl()) return; + if (website.Tour.is_busy() || !this.testPathUrl()) return; // launch tour with url this.checkRunningUrl(); @@ -143,7 +141,6 @@ website.Tour = openerp.Class.extend({ var self = this; website.Tour.waitReady.call(this, function () {self._running();}); }, - _running: function () { var stepId = this.localStorage.getItem("tour-"+this.id+"-test"); var automatic = !!this.localStorage.getItem("tour-"+this.id+"-test-automatic"); @@ -174,13 +171,19 @@ website.Tour = openerp.Class.extend({ $('.popover.tour').remove(); }, - testUrl: function () { - return !this.testPath || this.testPath.test(window.location.href); + getLang: function () { + return $("html").attr("lang").replace(/-/, '_'); + }, + testUrl: function (url) { + return new RegExp("(/"+this.getLang()+")?"+url, "i").test(window.location.href); + }, + testPathUrl: function () { + if (!this.testPath || this.testUrl(this.testPath)) return true; }, checkRunningUrl: function () { - if (window.location.search.indexOf("tutorial."+this.id+"=true") > -1) { + if (window.location.hash.indexOf("tutorial."+this.id+"=true") > -1) { this.localStorage.setItem("tour-"+this.id+"-test", 0); - window.location.href = window.location.href.replace(/tutorial.+=true&?/, ''); + window.location.hash = window.location.hash.replace(/tutorial.+=true&?/, ''); } }, @@ -315,7 +318,11 @@ website.Tour = openerp.Class.extend({ } }, endTour: function () { - console.log('{ "event": "success" }'); + if (parseInt(this.localStorage.getItem("tour-"+this.id+"-test"),10) >= this.steps.length-1) { + console.log('{ "event": "success" }'); + } else { + console.log('{ "event": "canceled" }'); + } this.reset(); }, autoNextStep: function () { diff --git a/addons/website_blog/data/website_blog_data.xml b/addons/website_blog/data/website_blog_data.xml index 4eb70186d52..a5a3aa3d8c9 100644 --- a/addons/website_blog/data/website_blog_data.xml +++ b/addons/website_blog/data/website_blog_data.xml @@ -20,7 +20,7 @@ Website Blogs self - + diff --git a/addons/website_blog/static/src/js/website.tour.blog.js b/addons/website_blog/static/src/js/website.tour.blog.js index 1bd9f22fa31..ffbd6e7ecc8 100644 --- a/addons/website_blog/static/src/js/website.tour.blog.js +++ b/addons/website_blog/static/src/js/website.tour.blog.js @@ -13,7 +13,7 @@ website.BlogTour = website.Tour.extend({ id: 'blog', name: "Create a blog post", - testPath: /\/(blog|blogpost)\/[0-9]+\//, + testPath: '/(blog|blogpost)', init: function (editor) { var self = this; self.steps = [ diff --git a/addons/website_event/static/src/js/website.tour.event.js b/addons/website_event/static/src/js/website.tour.event.js index c449c4209d1..05de73ceffb 100644 --- a/addons/website_event/static/src/js/website.tour.event.js +++ b/addons/website_event/static/src/js/website.tour.event.js @@ -13,7 +13,7 @@ website.EventTour = website.Tour.extend({ id: 'event', name: "Create an event", - testPath: /\/event\/[0-9]+\/register/, + testPath: '/event(/[0-9]+/register)?', init: function (editor) { var self = this; self.steps = [ diff --git a/addons/website_event/tests/ui_suite/event_test.js b/addons/website_event/tests/ui_suite/event_test.js index 12110e11546..06d6dc12b5f 100644 --- a/addons/website_event/tests/ui_suite/event_test.js +++ b/addons/website_event/tests/ui_suite/event_test.js @@ -11,7 +11,7 @@ testRunner.run(function eventTest (page, timeout) { }); }, function executeTest () { page.evaluate(function () { - window.openerp.website.Tour.run_test('event'); + window.openerp.website.Tour.get('event').run(true); }); }, timeout); }); diff --git a/addons/website_sale/data/website_sale_data.xml b/addons/website_sale/data/website_sale_data.xml index 3658ea7bdc6..c2f9144d7e4 100644 --- a/addons/website_sale/data/website_sale_data.xml +++ b/addons/website_sale/data/website_sale_data.xml @@ -16,7 +16,7 @@ Website Shop self - /shop?tutorial.shop=true + /shop#tutorial.shop=true diff --git a/addons/website_sale/static/src/js/website.tour.shop.js b/addons/website_sale/static/src/js/website.tour.shop.js index ebf5c9d00ec..a141e991661 100644 --- a/addons/website_sale/static/src/js/website.tour.shop.js +++ b/addons/website_sale/static/src/js/website.tour.shop.js @@ -14,7 +14,7 @@ website.EditorShopTour = website.Tour.extend({ id: 'shop', name: "Create a product", - testPath: /\/shop\/.*/, + testPath: '/shop', init: function (editor) { var self = this; self.steps = [ @@ -145,7 +145,7 @@ id: 'shop_buy_product', name: "Try to buy products", path: '/shop', - testPath: /\/shop/, + testPath: '/shop', init: function (editor) { var self = this; self.steps = [ @@ -217,10 +217,10 @@ }, { title: "select acquirer", - element: 'input[name="acquirer"]', + element: 'input[name="acquirer"]:first', }, { - title: "confirm", + title: "Pay Now", element: 'button:contains("Pay Now")', }, { From 0aa0bbd539be03b90670906d8e21f2cc45f8e72f Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 3 Feb 2014 12:56:33 +0100 Subject: [PATCH 07/24] [FIX] add warning when dbfilter logs out current session bzr revid: xmo@openerp.com-20140203115633-es2o542ywg85d46i --- openerp/http.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/openerp/http.py b/openerp/http.py index 8e82beac43e..999a51dfe38 100644 --- a/openerp/http.py +++ b/openerp/http.py @@ -972,9 +972,12 @@ class Root(object): def setup_db(self, httprequest): db = httprequest.session.db # Check if session.db is legit - if db and db not in db_filter([db], httprequest=httprequest): - httprequest.session.logout() - db = None + if db: + if db not in db_filter([db], httprequest=httprequest): + _logger.warn("Logged into database '%s', but dbfilter " + "rejects it; logging session out.", db) + httprequest.session.logout() + db = None if not db: httprequest.session.db = db_monodb(httprequest) From 4bf0284d4be510e9822fc28a36552ee957e31c6d Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Mon, 3 Feb 2014 13:23:00 +0100 Subject: [PATCH 08/24] [IMP] Cosmetic change for easier debugging bzr revid: fme@openerp.com-20140203122300-pduwmt5z5cprehey --- addons/auth_signup/controllers/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/auth_signup/controllers/main.py b/addons/auth_signup/controllers/main.py index 2db1e3dff65..d4232282279 100644 --- a/addons/auth_signup/controllers/main.py +++ b/addons/auth_signup/controllers/main.py @@ -30,7 +30,7 @@ from openerp.tools import exception_to_unicode _logger = logging.getLogger(__name__) -class Home(openerp.addons.web.controllers.main.Home): +class AuthSignup(openerp.addons.web.controllers.main.Home): @http.route() def web_login(self, *args, **kw): From 967c9db196100e0aa132bec6c8214c4b547b6bc3 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Mon, 3 Feb 2014 13:45:16 +0100 Subject: [PATCH 09/24] [FIX] never let me commit in saas-3 again bzr revid: fme@openerp.com-20140203124516-l8wwu9vdyo2nu2s0 --- addons/auth_signup/controllers/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/auth_signup/controllers/main.py b/addons/auth_signup/controllers/main.py index d4232282279..06c916d9580 100644 --- a/addons/auth_signup/controllers/main.py +++ b/addons/auth_signup/controllers/main.py @@ -60,7 +60,7 @@ class AuthSignup(openerp.addons.web.controllers.main.Home): qcontext.update(config) if 'error' in qcontext or mode not in ('reset', 'signup') or (not token and not config[mode]): - response = super(Home, self).web_login(*args, **kw) + response = super(AuthSignup, self).web_login(*args, **kw) if isinstance(response, LazyResponse): response.params['values'].update(config) return response @@ -86,7 +86,7 @@ class AuthSignup(openerp.addons.web.controllers.main.Home): request.cr.commit() except SignupError, e: qcontext['error'] = exception_to_unicode(e) - return super(Home, self).web_login(*args, **kw) + return super(AuthSignup, self).web_login(*args, **kw) return response From 85579973a5505a7aab02cf0bdecf43a2e6b3cadc Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 3 Feb 2014 17:02:37 +0100 Subject: [PATCH 10/24] [ADD] large throbber bzr revid: xmo@openerp.com-20140203160237-jlvp70gnkny2fx98 --- addons/web/static/src/img/throbber-large.gif | Bin 0 -> 28519 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 addons/web/static/src/img/throbber-large.gif diff --git a/addons/web/static/src/img/throbber-large.gif b/addons/web/static/src/img/throbber-large.gif new file mode 100644 index 0000000000000000000000000000000000000000..453b272979d50554ac932fcd0c556283c1ee3ec4 GIT binary patch literal 28519 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 gorMdxG$_|(Q Date: Mon, 3 Feb 2014 15:15:06 +0100 Subject: [PATCH 11/24] [FIX] tests: pass correct passwords to js bzr revid: chs@openerp.com-20140203141506-zmfhd7g0zorveb5v --- addons/web/tests/test_js.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/web/tests/test_js.py b/addons/web/tests/test_js.py index a126ce4b2f3..5d3d4ed21b7 100644 --- a/addons/web/tests/test_js.py +++ b/addons/web/tests/test_js.py @@ -10,8 +10,8 @@ class WebSuite(QUnitSuite): '/web/tests', 'mod=*&source={db}&supadmin={supadmin}&password={password}'.format( db=tools.config['db_name'], - supadmin=tools.config['db_password'] or 'admin', - password=tools.config['admin_passwd'] or 'admin'), + supadmin=tools.config['admin_passwd'], + password='admin'), '' ]) super(WebSuite, self).__init__(url, 50000) From 7c12d5d200141907e5f3b7492e958c3c8c83b6f5 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 3 Feb 2014 17:03:31 +0100 Subject: [PATCH 12/24] [IMP] clearer indication that images are being up/downloaded bzr revid: xmo@openerp.com-20140203160331-04h1erlunelb9kkn --- addons/website/static/src/css/common.sass | 44 +++++++++++++++++++ addons/website/static/src/css/editor.css | 14 ++++-- addons/website/static/src/css/editor.sass | 13 ++++-- addons/website/static/src/css/website.css | 1 - .../website/static/src/js/website.editor.js | 16 +++++-- .../website/static/src/xml/website.editor.xml | 4 ++ 6 files changed, 79 insertions(+), 13 deletions(-) diff --git a/addons/website/static/src/css/common.sass b/addons/website/static/src/css/common.sass index 86e1f6655ef..4d5f0673e33 100644 --- a/addons/website/static/src/css/common.sass +++ b/addons/website/static/src/css/common.sass @@ -1,6 +1,7 @@ @import "compass/css3" @import "compass/css3/user-interface" @import "compass/css3/transition" +@import "compass/support" //smartphones, iPhone, portrait 480x320 phones $smart_phone: 320px @@ -23,3 +24,46 @@ $desktop: 1025px @content ::selection @content + +// Lifted from compass-animation +// LICENSED UNDER THE MIT LICENSE (MIT) +// +// Copyright (c) 2012 Eric Meyer +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +@mixin set-experimental-support($moz: false, $webkit: false, $ms: false, $o: false, $khtml: false) + $experimental-support-for-mozilla: $moz + $experimental-support-for-webkit: $webkit + $experimental-support-for-microsoft: $ms + $experimental-support-for-opera: $o + $experimental-support-for-khtml: $khtml + +@mixin with-only-support-for($moz: false, $webkit: false, $ms: false, $o: false, $khtml: false) + // Capture the current state + $original-moz: $experimental-support-for-mozilla + $original-webkit: $experimental-support-for-webkit + $original-o: $experimental-support-for-opera + $original-ms: $experimental-support-for-microsoft + $original-khtml: $experimental-support-for-khtml + + @include set-experimental-support($moz, $webkit, $ms, $o, $khtml) + @content + @include set-experimental-support($original-moz, $original-webkit, $original-ms, $original-o, $original-khtml) + +@mixin keyframes($name) + @-moz-keyframes #{$name} + +with-only-support-for($moz: true) + @content + @-webkit-keyframes #{$name} + +with-only-support-for($webkit: true) + @content + @-o-keyframes #{$name} + +with-only-support-for($o: true) + @content + @keyframes #{$name} + +with-only-support-for + @content diff --git a/addons/website/static/src/css/editor.css b/addons/website/static/src/css/editor.css index 1c54d6f47dd..4fb4496e692 100644 --- a/addons/website/static/src/css/editor.css +++ b/addons/website/static/src/css/editor.css @@ -195,13 +195,19 @@ ul.oe_menu_editor .disclose { text-align: left; } -.modal.nosave .modal-footer button.save { - display: none; -} -.modal.nosave .modal-footer button.wait { +.modal.nosave .wait { display: inline-block !important; visibility: visible !important; } +.modal.nosave .modal-body .filepicker, .modal.nosave .modal-body .image-preview { + display: none; +} +.modal.nosave .modal-body .wait { + width: 100%; +} +.modal.nosave .modal-footer .save { + display: none; +} .modal .font-icons-icons { font-size: 2em; diff --git a/addons/website/static/src/css/editor.sass b/addons/website/static/src/css/editor.sass index 3abfa4cff05..2e6513f7c1d 100644 --- a/addons/website/static/src/css/editor.sass +++ b/addons/website/static/src/css/editor.sass @@ -162,12 +162,17 @@ ul.oe_menu_editor .modal-footer text-align: left -.modal.nosave .modal-footer - button.save - display: none - button.wait +.modal.nosave + .wait display: inline-block !important visibility: visible !important + .modal-body + .filepicker, .image-preview + display: none + .wait + width: 100% + .modal-footer .save + display: none // fontawesome modal .modal diff --git a/addons/website/static/src/css/website.css b/addons/website/static/src/css/website.css index 27c74508e7f..6610a98d0f1 100644 --- a/addons/website/static/src/css/website.css +++ b/addons/website/static/src/css/website.css @@ -1,4 +1,3 @@ -@charset "utf-8"; /* THIS CSS FILE IS FOR WEBSITE THEMING CUSTOMIZATION ONLY * * css for editor buttons, openerp widget included in the website and other diff --git a/addons/website/static/src/js/website.editor.js b/addons/website/static/src/js/website.editor.js index ab97ee2bcf9..43b2025e191 100644 --- a/addons/website/static/src/js/website.editor.js +++ b/addons/website/static/src/js/website.editor.js @@ -1265,7 +1265,7 @@ }), start: function () { - this.$('.modal-footer [disabled]').text("Uploading…"); + this.$('button.wait').text("Uploading…"); var $options = this.$('.image-style').children(); this.image_styles = $options.map(function () { return this.value; }).get(); @@ -1327,14 +1327,22 @@ this.set_image(url); }, preview_image: function () { - this.$el.removeClass('nosave'); + var loaded = function () { + this.$el.removeClass('nosave'); + }.bind(this); var image = this.$('input.url').val(); - if (!image) { return; } + if (!image) { loaded(); return; } - this.$('img.image-preview') + var $img = this.$('img.image-preview') .attr('src', image) .removeClass(this.image_styles.join(' ')) .addClass(this.$('select.image-style').val()); + + if ($img.prop('complete')) { + loaded(); + } else { + $img.load(loaded) + } }, browse_existing: function (e) { e.preventDefault(); diff --git a/addons/website/static/src/xml/website.editor.xml b/addons/website/static/src/xml/website.editor.xml index 448c615bb07..1a860ec5f77 100644 --- a/addons/website/static/src/xml/website.editor.xml +++ b/addons/website/static/src/xml/website.editor.xml @@ -101,6 +101,7 @@ +