diff --git a/addons/point_of_sale/static/src/js/models.js b/addons/point_of_sale/static/src/js/models.js index e7b401e9bfa..d22c35cd036 100644 --- a/addons/point_of_sale/static/src/js/models.js +++ b/addons/point_of_sale/static/src/js/models.js @@ -447,7 +447,7 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal // order and a valid selected order on_removed_order: function(removed_order,index,reason){ var order_list = this.get_order_list(); - if( (reason === 'abandon' || removed_order.temporary) && this.order_list.length > 0){ + if( (reason === 'abandon' || removed_order.temporary) && order_list.length > 0){ // when we intentionally remove an unfinished order, and there is another existing one this.set_order(order_list[index] || order_list[order_list.length -1]); }else{ @@ -482,7 +482,10 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal //removes the current order delete_current_order: function(){ - this.get('selectedOrder').destroy({'reason':'abandon'}); + var order = this.get_order(); + if (order) { + order.destroy({'reason':'abandon'}); + } }, // saves the order locally and try to send it to the backend. diff --git a/addons/point_of_sale/static/src/js/screens.js b/addons/point_of_sale/static/src/js/screens.js index 6219969739b..46614f1e2ae 100644 --- a/addons/point_of_sale/static/src/js/screens.js +++ b/addons/point_of_sale/static/src/js/screens.js @@ -24,17 +24,12 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa module.ScreenSelector = instance.web.Class.extend({ init: function(options){ this.pos = options.pos; - - this.screen_set = options.screen_set || {}; - - this.popup_set = options.popup_set || {}; - + this.screen_set = options.screen_set || {}; + this.popup_set = options.popup_set || {}; this.default_screen = options.default_screen; - - this.current_popup = null; - - this.current_mode = options.default_mode || 'cashier'; - + this.startup_screen = options.startup_screen; + this.current_popup = null; + this.current_mode = options.default_mode || 'cashier'; this.current_screen = null; for(screen_name in this.screen_set){ @@ -45,9 +40,11 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa this.popup_set[popup_name].hide(); } - this.pos.get_order().set_screen_data({ - 'screen': this.default_screen, - }); + if (this.pos.get_order()) { + this.pos.get_order().set_screen_data({ + 'screen': this.default_screen, + }); + } this.pos.bind('change:selectedOrder', this.load_saved_screen, this); }, diff --git a/addons/point_of_sale/static/src/js/widgets.js b/addons/point_of_sale/static/src/js/widgets.js index 4f2c069d501..dba0328b3d1 100644 --- a/addons/point_of_sale/static/src/js/widgets.js +++ b/addons/point_of_sale/static/src/js/widgets.js @@ -115,7 +115,9 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa this.client_change_handler = function(event){ self.update_summary(); } - this.bind_order_events(); + if (this.pos.get_order()) { + this.bind_order_events(); + } }, enable_numpad: function(){ this.disable_numpad(); //ensure we don't register the callbacks twice @@ -133,12 +135,15 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa } }, set_editable: function(editable){ - this.editable = editable; - if(editable){ - this.enable_numpad(); - }else{ - this.disable_numpad(); - this.pos.get_order().deselectLine(); + var order = this.pos.get_order(); + if (order) { + this.editable = editable; + if (editable) { + this.enable_numpad(); + }else{ + this.disable_numpad(); + order.deselectLine(); + } } }, set_value: function(val) { @@ -215,6 +220,9 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa this.pos_widget.numpad.state.reset(); var order = this.pos.get_order(); + if (!order) { + return; + } var orderlines = order.get('orderLines').models; var el_str = openerp.qweb.render('OrderWidget',{widget:this, order:order, orderlines:orderlines}); @@ -251,6 +259,64 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa }, }); + module.OrderSelectorWidget = module.PosBaseWidget.extend({ + template: 'OrderSelectorWidget', + init: function(parent, options) { + this._super(parent, options); + this.pos.get('orders').bind('add remove change',this.renderElement,this); + this.pos.bind('change:selectedOrder',this.renderElement,this); + }, + get_order_by_uid: function(uid) { + var orders = this.pos.get_order_list(); + for (var i = 0; i < orders.length; i++) { + if (orders[i].uid === uid) { + return orders[i]; + } + } + return undefined; + }, + order_click_handler: function(event,$el) { + var order = this.get_order_by_uid($el.data('uid')); + if (order) { + this.pos.set_order(order); + } + }, + neworder_click_handler: function(event, $el) { + this.pos.add_new_order(); + }, + deleteorder_click_handler: function(event, $el) { + var self = this; + var order = this.pos.get_order(); + if (!order) { + return; + } else if ( !order.is_empty() ){ + this.screen_selector.show_popup('confirm',{ + message: _t('Destroy Current Order ?'), + comment: _t('You will lose any data associated with the current order'), + confirm: function(){ + self.pos.delete_current_order(); + }, + }); + } else { + this.pos.delete_current_order(); + } + }, + renderElement: function(){ + var self = this; + console.log('Re-Rendering Orders...',this.pos.get_order_list()); + this._super(); + this.$('.order-button.select-order').click(function(event){ + self.order_click_handler(event,$(this)); + }); + this.$('.neworder-button').click(function(event){ + self.neworder_click_handler(event,$(this)); + }); + this.$('.deleteorder-button').click(function(event){ + self.deleteorder_click_handler(event,$(this)); + }); + }, + }); + module.OrderButtonWidget = module.PosBaseWidget.extend({ template:'OrderButtonWidget', init: function(parent, options) { @@ -864,34 +930,6 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa self.renderElement(); - self.$('.neworder-button').click(function(){ - self.pos.add_new_order(); - }); - - self.$('.deleteorder-button').click(function(){ - if( !self.pos.get_order().is_empty() ){ - self.screen_selector.show_popup('confirm',{ - message: _t('Destroy Current Order ?'), - comment: _t('You will lose any data associated with the current order'), - confirm: function(){ - self.pos.delete_current_order(); - }, - }); - }else{ - self.pos.delete_current_order(); - } - }); - - //when a new order is created, add an order button widget - self.pos.get('orders').bind('add', function(new_order){ - var new_order_button = new module.OrderButtonWidget(null, { - order: new_order, - pos: self.pos - }); - new_order_button.appendTo(this.$('.orders')); - new_order_button.selectOrder(); - }, self); - self.pos.add_new_order(); self.build_widgets(); @@ -1018,6 +1056,9 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa // -------- Misc --------- + this.order_selector = new module.OrderSelectorWidget(this,{}); + this.order_selector.replace(this.$('.placeholder-OrderSelectorWidget')); + this.notification = new module.SynchNotificationWidget(this,{}); this.notification.appendTo(this.$('.pos-rightheader')); diff --git a/addons/point_of_sale/static/src/xml/pos.xml b/addons/point_of_sale/static/src/xml/pos.xml index 85f6badec96..c98c9eb0fed 100644 --- a/addons/point_of_sale/static/src/xml/pos.xml +++ b/addons/point_of_sale/static/src/xml/pos.xml @@ -11,11 +11,7 @@