From 19eda68547917cfabe923ea41edb8ac7beb141b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Tue, 26 May 2015 17:35:29 +0200 Subject: [PATCH] [IMP] web, point_of_sale: basic implementation of the cordova integration. This time without a new js file --- addons/point_of_sale/static/src/js/widgets.js | 4 + addons/web/static/src/js/chrome.js | 76 +++++++++++++++++++ 2 files changed, 80 insertions(+) diff --git a/addons/point_of_sale/static/src/js/widgets.js b/addons/point_of_sale/static/src/js/widgets.js index 6aaf7329446..2ff1a53f47c 100644 --- a/addons/point_of_sale/static/src/js/widgets.js +++ b/addons/point_of_sale/static/src/js/widgets.js @@ -972,6 +972,7 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa $('.oe_web_client').off(); $('.openerp_webclient_container').off(); + self.renderElement(); self.$('.neworder-button').click(function(){ @@ -1017,6 +1018,8 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa instance.webclient.set_content_full_screen(true); self.$('.loader').animate({opacity:0},1500,'swing',function(){self.$('.loader').addClass('oe_hidden');}); + + instance.web.cordova.send('posready'); self.pos.push_order(); @@ -1231,6 +1234,7 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa function close(){ self.pos.push_order().then(function(){ + instance.web.cordova.send('poslogout'); return new instance.web.Model("ir.model.data").get_func("search_read")([['name', '=', 'action_client_pos_menu']], ['res_id']).pipe(function(res) { window.location = '/web#action=' + res[0]['res_id']; },function(err,event) { diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js index 0a35bfd1244..83c2ea63dae 100644 --- a/addons/web/static/src/js/chrome.js +++ b/addons/web/static/src/js/chrome.js @@ -1202,6 +1202,7 @@ instance.web.WebClient = instance.web.Client.extend({ this.on("change:title_part", this, this._title_changed); this._title_changed(); + return $.when(this._super()).then(function() { if (jQuery.deparam !== undefined && jQuery.deparam(jQuery.param.querystring()).kitten !== undefined) { self.to_kitten(); @@ -1213,6 +1214,10 @@ instance.web.WebClient = instance.web.Client.extend({ self.action_manager.do_action(self.client_options.action); delete(self.client_options.action); } + instance.web.cordova.ready(); + instance.web.cordova.on('back', self, function() { + self.do_action('history_back'); + }); }); }, to_kitten: function() { @@ -1368,6 +1373,7 @@ instance.web.WebClient = instance.web.Client.extend({ on_logout: function() { var self = this; if (!this.has_uncommitted_changes()) { + instance.web.cordova.logout(); self.action_manager.do_action('logout'); } }, @@ -1529,6 +1535,76 @@ instance.web.embed = function (origin, dbname, login, key, action, options) { client.insertAfter(currentScript); }; + + +/* + * The Android/iPhone App is a JS/HTML app that launches the + * Odoo webclient in an iframe, using the Cordova framework. + * + * This class acts as a link between the webclient and the + * Odoo Android/iPhone App implemented with cordova. + */ +instance.web.Cordova = instance.web.Class.extend({}, instance.web.PropertiesMixin, { + init: function(parent) { + var self = this; + instance.web.PropertiesMixin.init.call(this, parent); + + window.addEventListener('message', function(event) { + self.receive(event); + }, false); + + }, + // odoo.send('foobar') in cordova will call messages.foobar() + messages: { + // launch the POS ! + pos: function() { + if (window.location.href.indexOf('/pos/web') < 0) { + window.location.href = "/pos/web"; + } + }, + }, + // what happens when we receive an event from cordova + // -> call messages[event.data]() + // -> selfs trigger(event.data) + receive: function(event) { + if (event.origin !== 'file://') { + return; + } + + if (typeof event.data === 'string') { + this.trigger(event.data); + if (this.messages[event.data]) { + this.messages[event.data].call(this); + } + } + }, + // send a message to cordova + send: function(message) { + function inIframe(){ + try { + return window.self !== window.top; + } catch (e) { + return true; + } + } + if (inIframe()) { + window.parent.postMessage(message,'file://'); + } + }, + + + // notifies cordova that the webclient is ready. + ready: function() { this.send('ready'); }, + // notifies cordova that we want to exit the app. + logout: function() { this.send('logout'); }, + // asks cordova to emit a beep. + beep: function() { this.send('beep'); }, + // ask cordova to vibrate the phone. + vibrate: function() { this.send('vibrate'); }, +}); + +instance.web.cordova = new instance.web.Cordova(); + })(); // vim:et fdc=0 fdl=0 foldnestmax=3 fdm=syntax: