diff --git a/addons/point_of_sale/static/src/js/pos_devices.js b/addons/point_of_sale/static/src/js/pos_devices.js
index de036e8a9bc..53b72dfb765 100644
--- a/addons/point_of_sale/static/src/js/pos_devices.js
+++ b/addons/point_of_sale/static/src/js/pos_devices.js
@@ -31,9 +31,9 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal
},
message : function(name,params,callback){
- var success_callback = function(result){ console.log('PROXY SUCCESS:'+name+': ',result); }
- var error_callback = function(result){ console.log('PROXY ERROR:'+name+': ',result); }
- console.log('PROXY: '+name);
+ var success_callback = function(result){}; //console.log('PROXY SUCCESS:'+name+': ',result); }
+ var error_callback = function(result){}; // console.log('PROXY ERROR:'+name+': ',result); }
+ //console.log('PROXY: '+name);
this.connection.rpc('/pos/'+name, params || {}, callback || success_callback, error_callback);
},
diff --git a/addons/point_of_sale/static/src/js/pos_models.js b/addons/point_of_sale/static/src/js/pos_models.js
index 8e8af120e56..8d11a20967a 100644
--- a/addons/point_of_sale/static/src/js/pos_models.js
+++ b/addons/point_of_sale/static/src/js/pos_models.js
@@ -61,7 +61,7 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal
this.dao = new module.LocalStorageDAO(); // used to store the order's data on the Hard Drive
this.ready = $.Deferred(); // used to notify the GUI that the PosModel has loaded all resources
this.flush_mutex = new $.Mutex(); // used to make sure the orders are sent to the server once at time
- this.build_tree = _.bind(this.build_tree, this); // ???
+ //this.build_tree = _.bind(this.build_tree, this); // ???
this.session = session;
this.categories = {};
this.root_category = null;
@@ -212,7 +212,7 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal
// when all the data has loaded, we compute some stuff, and declare the Pos ready to be used.
$.when(cat_def, prod_def, session_def, tax_def, prod_process_def, this.get_app_data(), this.flush())
.then(function(){
- self.build_tree();
+ //self.build_tree();
self.build_categories();
self.set({'cashRegisters' : new module.CashRegisterCollection(self.get('bank_statements'))});
console.log('cashRegisters:',self.get('cashRegisters'));
@@ -335,6 +335,10 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal
});
});
},
+
+ // this adds several properties to the categories in order to make it easier to diplay them
+ // fields added include the list of product relevant to each category, list of child categories,
+ // list of ancestors, etc.
build_categories : function(){
var categories = this.get('categories');
var products = this.get('product_list');
@@ -356,6 +360,7 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal
for(var i = 0; i < categories.length; i++){
categories_by_id[categories[i].id] = categories[i];
}
+ this.categories_by_id = categories_by_id;
var root_category = {
name : 'Root',
@@ -390,9 +395,6 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal
cat.product_set = {}; // [product.id] === true if product is in category
cat.weightable_product_list = [];
cat.weightable_product_set = {};
- cat.regular_product_list = []; //not weightable
- cat.regular_product_set = {};
- cat.progeny = [];
}
this.root_category = root_category;
@@ -409,9 +411,6 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal
if(product.weightable){
cat.weightable_product_list.push(product);
cat.weightable_product_set[product.id] = true;
- }else{
- cat.regular_product_list.push(product);
- cat.regular_product_set[product.id] = true;
}
}
}
@@ -426,15 +425,6 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal
}
}
- // add progeny field to categories, contains all subcategories of a category
- function make_progeny(cat){
- for(var i = 0; i < cat.childrens.length; i++){
- make_progeny(cat.childrens[i]);
- cat.progeny.push(cat.childrens[i]);
- append(cat.progeny,cat.childrens[i].progeny);
- }
- }
-
//add the products of the subcategories to the parent categories
function make_products(cat){
for(var i = 0; i < cat.childrens.length; i++){
@@ -442,83 +432,15 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal
append(cat.product_list, cat.childrens[i].product_list);
append(cat.weightable_product_list, cat.childrens[i].weightable_product_list);
- append(cat.regular_product_list, cat.childrens[i].regular_product_list);
appendSet(cat.product_set, cat.childrens[i].product_set);
appendSet(cat.weightable_product_set, cat.childrens[i].weightable_product_set);
- appendSet(cat.regular_product_set, cat.childrens[i].regular_product_set);
}
}
make_ancestors(root_category,[]);
- make_progeny(root_category);
make_products(root_category);
},
-
- build_tree: function() {
- var c, id, _i, _len, _ref, _ref2;
- _ref = this.get('categories');
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- c = _ref[_i];
- this.categories[c.id] = {
- id: c.id,
- name: c.name,
- children: c.child_id,
- parent: c.parent_id[0],
- ancestors: [c.id],
- subtree: [c.id]
- };
- }
- _ref2 = this.categories;
- for (id in _ref2) {
- c = _ref2[id];
- this.current_category = c;
- this.build_ancestors(c.parent);
- this.build_subtree(c);
- }
- this.categories[0] = {
- ancestors: [],
- children: (function() {
- var _j, _len2, _ref3, _results;
- _ref3 = this.get('categories');
- _results = [];
- for (_j = 0, _len2 = _ref3.length; _j < _len2; _j++) {
- c = _ref3[_j];
- if (!(c.parent_id[0] != null)) {
- _results.push(c.id);
- }
- }
- return _results;
- }).call(this),
- subtree: (function() {
- var _j, _len2, _ref3, _results;
- _ref3 = this.get('categories');
- _results = [];
- for (_j = 0, _len2 = _ref3.length; _j < _len2; _j++) {
- c = _ref3[_j];
- _results.push(c.id);
- }
- return _results;
- }).call(this)
- };
- },
- build_ancestors: function(parent) {
- if (parent != null) {
- this.current_category.ancestors.unshift(parent);
- return this.build_ancestors(this.categories[parent].parent);
- }
- },
- build_subtree: function(category) {
- var c, _i, _len, _ref, _results;
- _ref = category.children;
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- c = _ref[_i];
- this.current_category.subtree.push(c);
- _results.push(this.build_subtree(this.categories[c]));
- }
- return _results;
- }
});
module.CashRegister = Backbone.Model.extend({
diff --git a/addons/point_of_sale/static/src/js/pos_screens.js b/addons/point_of_sale/static/src/js/pos_screens.js
index 58b6ddab99e..e4b36f79a8f 100644
--- a/addons/point_of_sale/static/src/js/pos_screens.js
+++ b/addons/point_of_sale/static/src/js/pos_screens.js
@@ -307,8 +307,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa
this.product_categories_widget.replace($('.placeholder-ProductCategoriesWidget'));
this.product_list_widget = new module.ProductListWidget(this,{
- only_weightable: true,
- weight: this.pos.proxy.weighting_read_kg(),
+ show_scale: true,
});
this.product_list_widget.replace($('.placeholder-ProductListWidget'));
},
@@ -322,7 +321,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa
this.pos_widget.action_bar.set_total_visible(true);
this.pos_widget.action_bar.set_help_visible(true,function(){self.pos_widget.screen_selector.show_popup('help');});
this.pos_widget.action_bar.set_logout_visible(false);
- this.pos_widget.onscreen_keyboard.connect();
+ //this.pos_widget.onscreen_keyboard.connect();
this.product_categories_widget.reset_category();
@@ -357,7 +356,9 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa
this.pos_widget.set_cashier_controls_visible(true);
this.pos_widget.action_bar.set_total_visible(true);
this.pos_widget.action_bar.set_help_visible(false);
- this.pos_widget.onscreen_keyboard.connect();
+ //this.pos_widget.onscreen_keyboard.connect();
+
+ this.product_categories_widget.reset_category();
this.pos_widget.order_widget.set_numpad_state(this.pos_widget.numpad.state);
this.pos_widget.action_bar.add_new_button(
@@ -564,7 +565,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa
module.SearchProductScreenWidget = module.ScreenWidget.extend({
template:'SearchProductScreenWidget',
start: function(){
- this.product_categories_widget = new module.ProductCategoriesWidget2(this,{});
+ this.product_categories_widget = new module.ProductCategoriesWidget(this,{});
this.product_categories_widget.replace($('.placeholder-ProductCategoriesWidget'));
this.product_list_widget = new module.ProductListWidget(this,{});
@@ -583,7 +584,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa
self.pos_widget.screen_selector.set_user_mode('client');
});
this.product_categories_widget.reset_category();
- this.pos_widget.onscreen_keyboard.connect();
+ //this.pos_widget.onscreen_keyboard.connect();
this.pos_widget.order_widget.set_numpad_state(this.pos_widget.numpad.state);
this.pos_widget.action_bar.add_new_button(
diff --git a/addons/point_of_sale/static/src/js/pos_widgets.js b/addons/point_of_sale/static/src/js/pos_widgets.js
index ef6a901ffb1..b7db970891d 100644
--- a/addons/point_of_sale/static/src/js/pos_widgets.js
+++ b/addons/point_of_sale/static/src/js/pos_widgets.js
@@ -396,143 +396,131 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa
});
module.ProductCategoriesWidget = module.PosBaseWidget.extend({
+ template: 'ProductCategoriesWidget',
init: function(parent, options){
- this._super(parent,options);
- this.on_change_category.add_last(_.bind(this.search_and_categories, this));
- this.search_and_categories();
- },
- start: function() {
- this.search_and_categories();
- },
- template:'ProductCategoriesWidget',
- renderElement: function() {
var self = this;
- var c;
- this.$element.empty();
- this.$element.html(QWeb.render(this.template, {
- breadcrumb: (function() {
- var _i, _len, _results;
- _results = [];
- for (_i = 0, _len = self.ancestors.length; _i < _len; _i++) {
- c = self.ancestors[_i];
- _results.push(self.pos.categories[c]);
- }
- return _results;
- })(),
- categories: (function() {
- var _i, _len, _results;
- _results = [];
- for (_i = 0, _len = self.children.length; _i < _len; _i++) {
- c = self.children[_i];
- _results.push(self.pos.categories[c]);
- }
- return _results;
- })()
- }));
- this.$element.find(".oe-pos-categories-list a").click(_.bind(this.change_category, this));
- },
- reset_category: function(){
- this.on_change_category(0);
- },
- change_category: function(a) {
- var id = $(a.target).data("category-id");
- this.on_change_category(id);
- },
- search_and_categories: function(id){
- var self = this,
- c,
- product_list,
- allProducts,
- allPackages;
-
- id = id || 0;
-
- c = this.pos.categories[id];
- this.ancestors = c.ancestors;
- this.children = c.children;
- this.renderElement();
-
- allProducts = this.pos.get('product_list');
-
- allPackages = this.pos.get('product.packaging');
-
- product_list = this.pos.get('product_list').filter( function(p){
- var _ref = p.pos_categ_id[0];
- return _.indexOf(c.subtree, _ref) >= 0;
- });
-
- this.pos.get('products').reset(product_list);
-
- this.$element.find('.searchbox input').keyup(function(){
- var results, search_str;
- search_str = $(this).val().toLowerCase();
- if(search_str){
- results = product_list.filter( function(p){
- return p.name.toLowerCase().indexOf(search_str) != -1;
- });
- self.$element.find('.search-clear').fadeIn();
- }else{
- results = product_list;
- self.$element.find('.search-clear').fadeOut();
- }
- self.pos.get('products').reset(results);
- });
-
- this.$element.find('.search-clear').click(function(){
- self.pos.get('products').reset(product_list);
- self.$element.find('.searchbox input').val('').focus();
- self.$element.find('.search-clear').fadeOut();
- });
- },
- on_change_category: function(id) {},
- });
-
- module.ProductCategoriesWidget2 = module.PosBaseWidget.extend({
- template: 'ProductCategoriesWidget2',
- init: function(parent, options){
this._super(parent,options);
- this.onlyWeightable = false;
+ this.onlyWeightable = options.onlyWeightable || false;
this.category = this.pos.root_category;
this.breadcrumb = [];
this.subcategories = [];
this.set_category();
},
+
+ start: function(){
+ this.search_and_categories();
+ },
+
+ // changes the category. if undefined, sets to root category
set_category : function(category){
if(!category){
this.category = this.pos.root_category;
}else{
this.category = category;
}
+ this.breadcrumb = [];
for(var i = 1; i < this.category.ancestors.length; i++){
- this.breadcrumb.push(this.category.ancestor[i]);
+ this.breadcrumb.push(this.category.ancestors[i]);
+ }
+ if(this.category !== this.pos.root_category){
+ this.breadcrumb.push(this.category);
+ }
+ if(this.onlyWeightable){
+ this.subcategories = [];
+ for(var i = 0; i < this.category.childrens.length; i++){
+ if(this.category.childrens[i].weightable_product_list.length > 0){
+ this.subcategories.push( this.category.childrens[i]);
+ }
+ }
+ }else{
+ this.subcategories = this.category.childrens || [];
}
- this.subcategories = this.category.childrens || [];
},
+
renderElement: function(){
var self = this;
this._super();
- this.$element.empty();
+ this.$element.find(".oe-pos-categories-list a").click(function(event){
+ var id = $(event.target).data("category-id");
+ var category = self.pos.categories_by_id[id];
+ self.set_category(category);
+ self.renderElement();
+ self.search_and_categories(category);
+ });
},
+
+ // resets the current category to the root category
reset_category: function(){
this.set_category();
+ this.renderElement();
+ this.search_and_categories();
},
- on_change_category: function(id){},
- search_and_categories: function(id){},
- change_category: function(a){
+
+ // filters the products, and sets up the search callbacks
+ search_and_categories: function(category){
+ var self = this;
+
+ var all_products = this.pos.get('product_list');
+ var all_packages = this.pos.get('product.packaging');
+
+ // find all products belonging to the current category
+ var products = [];
+ if(this.onlyWeightable){
+ products = all_products.filter( function(product){
+ return self.category.weightable_product_set[product.id];
+ });
+ }else{
+ products = all_products.filter( function(product){
+ return self.category.product_set[product.id];
+ });
+ }
+
+ // product lists watch for reset events on 'products' to re-render.
+ // FIXME that means all productlist widget re-render... even the hidden ones !
+ this.pos.get('products').reset(products);
+
+ // find all the products whose name match the query in the searchbox
+ this.$('.searchbox input').keyup(function(){
+ var results, search_str;
+ search_str = $(this).val().toLowerCase();
+ if(search_str){
+ results = products.filter( function(p){
+ return p.name.toLowerCase().indexOf(search_str) != -1 ||
+ (p.ean13 && p.ean13.indexOf(search_str) != -1);
+ });
+ self.$element.find('.search-clear').fadeIn();
+ }else{
+ results = products;
+ self.$element.find('.search-clear').fadeOut();
+ }
+ self.pos.get('products').reset(results);
+ });
+ this.$('.searchbox input').click(function(){
+ });
+
+ //reset the search when clicking on reset
+ this.$('.search-clear').click(function(){
+ self.pos.get('products').reset(products);
+ self.$('.searchbox input').val('').focus();
+ self.$('.search-clear').fadeOut();
+ });
},
});
module.ProductListWidget = module.ScreenWidget.extend({
template:'ProductListWidget',
init: function(parent, options) {
+ var self = this;
this._super(parent,options);
- console.log('ProductListWidget:',this);
this.model = options.model;
- this.pos.get('products').bind('reset', this.renderElement, this);
this.product_list = [];
- this.weight = options.weight;
- this.only_weightable = options.only_weightable || false;
+ this.weight = options.weight || 0;
+ this.show_scale = options.show_scale || false;
this.next_screen = options.next_screen || false;
+
+ this.pos.get('products').bind('reset', function(){
+ self.renderElement();
+ });
},
set_weight: function(weight){
for(var i = 0; i < this.product_list.length; i++){
@@ -550,10 +538,6 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa
this.product_list = [];
this.pos.get('products')
.chain()
- .filter(function(product){
- // if only weightable, only keeps those with a to_weight category, keep all otherwise
- return !self.only_weightable || (product.get('pos_category') && product.get('pos_category').to_weight);
- })
.map(function(product) {
var product = new module.ProductWidget(self, {
model: product,
@@ -604,6 +588,7 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa
},
connect : function(){
+ var self = this;
$(this.input_selector).focus(function(){self.show();});
},
@@ -913,10 +898,10 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa
this.order_widget = new module.OrderWidget(this, {});
this.order_widget.replace($('#placeholder-OrderWidget'));
- this.onscreen_keyboard = new module.OnscreenKeyboardWidget(this, {
+ /*this.onscreen_keyboard = new module.OnscreenKeyboardWidget(this, {
'keyboard_model': 'simple'
});
- this.onscreen_keyboard.appendTo($(".point-of-sale #content"));
+ this.onscreen_keyboard.appendTo($(".point-of-sale #content")); */
// -------- Screen Selector ---------
diff --git a/addons/point_of_sale/static/src/xml/pos.xml b/addons/point_of_sale/static/src/xml/pos.xml
index 02ef0097f7b..4a016d1b4f2 100644
--- a/addons/point_of_sale/static/src/xml/pos.xml
+++ b/addons/point_of_sale/static/src/xml/pos.xml
@@ -125,41 +125,6 @@
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-