[WIP]barcode interface: rework of interface and refactor of code
authorCedric Snauwaert <csn@openerp.com>
Fri, 21 Mar 2014 15:34:05 +0000 (16:34 +0100)
committerCedric Snauwaert <csn@openerp.com>
Fri, 21 Mar 2014 15:34:05 +0000 (16:34 +0100)
bzr revid: csn@openerp.com-20140321153405-12s6amuyrh5t75vi

addons/stock/static/src/js/widgets.js
addons/stock/static/src/xml/picking.xml

index a93610a..0012207 100644 (file)
@@ -25,6 +25,7 @@ function openerp_picking_widgets(instance){
         template: 'PickingEditorWidget',
         init: function(parent,options){
             this._super(parent,options);
+            var self = this;
             this.rows = [];
             this.search_filter = "";
             jQuery.expr[":"].Contains = jQuery.expr.createPseudo(function(arg) {
@@ -33,6 +34,9 @@ function openerp_picking_widgets(instance){
                 };
             });
         },
+        get_header: function(){
+            return this.getParent().get_header();
+        },
         get_location: function(){
             var model = this.getParent();
             var locations = [];
@@ -69,7 +73,7 @@ function openerp_picking_widgets(instance){
                                     head_container: true,
                                     processed: packopline.processed,
                             },
-                            classes: ('active container_head ') + (packopline.processed === "true" ? 'processed hidden ':''),
+                            classes: ('success container_head ') + (packopline.processed === "true" ? 'processed hidden ':''),
                         });
                         pack_created.push(packopline.result_package_id[0]);
                     }
@@ -90,7 +94,7 @@ function openerp_picking_widgets(instance){
                                 head_container: false,
                                 processed: packopline.processed,
                         },
-                        classes: ((packopline.product_qty <= packopline.qty_done) ? 'active ' : '') + (packopline.result_package_id[1] !== undefined ? 'in_container_hidden ' : '') + (packopline.processed === "true" ? 'processed hidden ':''),
+                        classes: ((packopline.product_qty <= packopline.qty_done) ? 'success ' : '') + (packopline.result_package_id[1] !== undefined ? 'in_container_hidden ' : '') + (packopline.processed === "true" ? 'processed hidden ':''),
                     });
             });
             //sort element by things to do, then things done, then grouped by packages
@@ -118,8 +122,20 @@ function openerp_picking_widgets(instance){
         renderElement: function(){
             var self = this;
             this._super();
+            this.$('.js_pick_done').click(function(){ self.getParent().done(); });
+            this.$('.js_pick_print').click(function(){ self.getParent().print_picking(); });
+            this.$('.oe_pick_app_header').text(self.get_header());
+            this.$('.oe_searchbox').keyup(function(event){
+                self.on_searchbox($(this).val());
+            });
+            this.$('.js_pick_pack').click(function(){ self.getParent().pack(); });
+            this.$('.js_drop_down').click(function(){ self.getParent().drop_down();});
+            this.$('.js_clear_search').click(function(){ 
+                self.on_searchbox(''); 
+                self.$('.oe_searchbox').val('');
+            });
             this.$('#js_select').change(function(){
-                var selection = $(this)[0].value
+                var selection = self.$('#js_select option:selected').attr('value');
                 if (selection === "ToDo"){
                     self.getParent().$('.js_pick_pack').removeClass('hidden')
                     self.getParent().$('.js_drop_down').removeClass('hidden')
@@ -135,18 +151,18 @@ function openerp_picking_widgets(instance){
                 self.on_searchbox(self.search_filter);
             });
             this.$('.js_plus').click(function(){
-                var id = parseInt($(this).attr('op-id'));
+                var id = $(this).data('product-id');
                 self.getParent().scan_product_id(id,true);
             });
             this.$('.js_minus').click(function(){
-                var id = parseInt($(this).attr('op-id'));
+                var id = $(this).data('product-id');
                 self.getParent().scan_product_id(id,false);
             });
             this.$('.js_unfold').click(function(){
-                var op_id = $(this).parent()[0].attributes.getNamedItem('data-id').value;
+                var op_id = $(this).parent().data('id');
                 var line = $(this).parent();
                 //select all js_pack_op_line with class in_container_hidden and correct container-id
-                select = self.$('.js_pack_op_line.in_container_hidden[container-id='+op_id+']')
+                select = self.$('.js_pack_op_line.in_container_hidden[data-container-id='+op_id+']')
                 if (select.length > 0){
                     //we unfold
                     line.addClass('warning');
@@ -156,63 +172,77 @@ function openerp_picking_widgets(instance){
                 else{
                     //we fold
                     line.removeClass('warning');
-                    select = self.$('.js_pack_op_line.in_container[container-id='+op_id+']')
+                    select = self.$('.js_pack_op_line.in_container[data-container-id='+op_id+']')
                     select.removeClass('in_container');
                     select.addClass('in_container_hidden'); 
                 }
             });
             this.$('.js_create_lot').click(function(){
-                var op_id = this.attributes.getNamedItem('product_id').value;
+                var op_id = $(this).parents("[data-id]:first").data('id');
                 self.getParent().create_lot(op_id);
             });
             this.$('.js_delete_pack').click(function(){
-                var pack_id = parseInt(this.attributes.getNamedItem('pack_id').value);
+                var pack_id = $(this).parents("[data-id]:first").data('id');
                 self.getParent().delete_package_op(pack_id);
             });
             this.$('.js_print_pack').click(function(){
-                var pack_id = parseInt(this.attributes.getNamedItem('pack_id').value);
+                var pack_id = $(this).parents("[data-id]:first").data('id');
+                // $(this).parents("[data-id]:first").data('id')
                 self.getParent().print_package(pack_id);
             });
             this.$('.js_submit_value').submit(function(event){
-                var op_id = parseInt(this.attributes.getNamedItem('data-id').value);
-                var value = parseInt(event.srcElement[0].value);
+                var op_id = $(this).parents("[data-id]:first").data('id');
+                var value = parseInt($("input", this).val());
                 if (value>=0){
                     self.getParent().set_operation_quantity(value, op_id);
                 }
-                self.$('.js_qty[data-id='+op_id+']')[0].value = "";
+                $("input", this).val("");
             });
             this.$('.js_qty').blur(function(){
                 this.value = "";
             });
             this.$('.js_change_src').click(function(){
-                var op_id = $(this)[0].attributes.getNamedItem('op_id').value;
+                var op_id = $(this).parents("[data-id]:first").data('id');//data('op_id');
                 self.$('#js_loc_select').addClass('source');
-                self.$('#js_loc_select').attr('op_id',op_id);
+                self.$('#js_loc_select').data('op-id',op_id);
                 self.$el.siblings('#js_LocationChooseModal').modal();
             });
             this.$('.js_change_dst').click(function(){
-                var op_id = $(this)[0].attributes.getNamedItem('op_id').value;
-                self.$('#js_loc_select').attr('op_id',op_id);
+                var op_id = $(this).parents("[data-id]:first").data('id');
+                self.$('#js_loc_select').data('op-id',op_id);
+                self.$el.siblings('#js_LocationChooseModal').modal();
+            });
+            this.$('.js_pack_change_dst').click(function(){
+                var op_id = $(this).parents("[data-id]:first").data('id');
+                self.$('#js_loc_select').addClass('pack');
+                self.$('#js_loc_select').data('op-id',op_id);
                 self.$el.siblings('#js_LocationChooseModal').modal();
             });
             this.$('.js_validate_location').click(function(){
                 //get current selection
                 var select_dom_element = self.$('#js_loc_select');
-                var selected = self.$('#js_loc_select option:selected')[0].attributes.getNamedItem('loc_id').value;
+                var loc_id = self.$('#js_loc_select option:selected').data('loc-id');
                 var src_dst = false;
-                var op_id = parseInt(select_dom_element[0].attributes.getNamedItem('op_id').value);
-                if (select_dom_element[0].classList.contains('source')){
+                var op_id = select_dom_element.data('op-id');
+                if (select_dom_element.hasClass('pack')){
+                    select_dom_element.removeClass('source');
+                    op_ids = [];
+                    self.$('.js_pack_op_line[data-container-id='+op_id+']').each(function(){
+                        op_ids.push($(this).data('id'));
+                    });
+                    op_id = op_ids;
+                }
+                else if (select_dom_element.hasClass('source')){
                     src_dst = true;
                     select_dom_element.removeClass('source');
                 }
-                if (selected === "false"){
+                if (loc_id === false){
                     //close window
                     self.$el.siblings('#js_LocationChooseModal').modal('hide');
                 }
                 else{
-                    loc_id = parseInt(selected);
                     self.$el.siblings('#js_LocationChooseModal').modal('hide');
-                    self.getParent().change_location(op_id, loc_id, src_dst);
+                    self.getParent().change_location(op_id, parseInt(loc_id), src_dst);
 
                 }
             });
@@ -223,7 +253,7 @@ function openerp_picking_widgets(instance){
             //hide line that has no location matching the query and highlight location that match the query
             this.search_filter = query;
             var processed = ".processed";
-            if (this.$('#js_select')[0].value == "ToDo"){
+            if (this.$('#js_select option:selected').attr('value') == "ToDo"){
                 processed = ":not(.processed)";
             }
             if (query !== '') {
@@ -242,7 +272,7 @@ function openerp_picking_widgets(instance){
             //get ids of visible on the screen
             pack_op_ids = []
             this.$('.js_pack_op_line:not(.processed):not(.js_pack_op_line.hidden):not(.container_head)').each(function(){
-                cur_id = this.attributes.getNamedItem('data-id').value;
+                cur_id = $(this).data('id');
                 pack_op_ids.push(parseInt(cur_id));
             });
             //get list of element in this.rows where rem > 0 and container is empty is specified
@@ -261,6 +291,18 @@ function openerp_picking_widgets(instance){
         blink: function(op_id){
             this.$('.js_pack_op_line[data-id="'+op_id+'"]').addClass('blink_me');
         },
+        check_done: function(){
+            var model = this.getParent();
+            var self = this;
+            var done = true;
+            _.each( model.packoplines, function(packopline){
+                if (packopline.processed === "false"){
+                    done = false;
+                    return done;
+                }
+            });
+            return done;
+        }
     });
 
     module.PickingMenuWidget = module.MobileWidget.extend({
@@ -532,22 +574,10 @@ function openerp_picking_widgets(instance){
                 self.scan(ean);
             });
             
-
             this.$('.js_pick_quit').click(function(){ self.quit(); });
-            this.$('.js_pick_pack').click(function(){ self.pack(); });
-            this.$('.js_drop_down').click(function(){ self.drop_down();});
-            this.$('.js_pick_done').click(function(){ self.done(); });
-            this.$('.js_pick_print').click(function(){ self.print_picking(); });
             this.$('.js_pick_prev').click(function(){ self.picking_prev(); });
             this.$('.js_pick_next').click(function(){ self.picking_next(); });
             this.$('.js_pick_menu').click(function(){ self.menu(); });
-            this.$('.oe_searchbox').keyup(function(event){
-                self.on_searchbox($(this).val());
-            });
-            this.$('.js_clear_search').click(function(){ 
-                self.on_searchbox(''); 
-                self.$('.oe_searchbox').val('');
-            });
 
             this.hotkey_handler = function(event){
                 if(event.keyCode === 37 ){  // Left Arrow
@@ -575,8 +605,6 @@ function openerp_picking_widgets(instance){
                     self.$('.js_pick_next').removeClass('disabled');
                 }
 
-                self.$('.oe_pick_app_header').text(self.get_header());
-
             }).fail(function(error) {console.log(error);});
 
         },
@@ -596,7 +624,6 @@ function openerp_picking_widgets(instance){
                 .then(function(){
                     self.picking_editor.remove_blink();
                     self.picking_editor.renderElement();
-                    // self.$('#js_select')[0].value = "ToDo";
 
                     if( self.picking.id === self.pickings[0]){
                         self.$('.js_pick_prev').addClass('disabled');
@@ -609,7 +636,6 @@ function openerp_picking_widgets(instance){
                     }else{
                         self.$('.js_pick_next').removeClass('disabled');
                     }
-                    self.$('.oe_pick_app_header').text(self.get_header());
                     if (remove_search_filter){
                         self.$('.oe_searchbox').val('');
                         self.on_searchbox('');
@@ -644,9 +670,9 @@ function openerp_picking_widgets(instance){
                     if (result.filter_loc !== false){
                         //check if we have receive a location as answer
                         if (result.filter_loc !== undefined){
-                            var modal_loc_hidden = self.$('#js_LocationChooseModal')[0].attributes.getNamedItem('aria-hidden').value;
+                            var modal_loc_hidden = self.$('#js_LocationChooseModal').attr('aria-hidden');
                             if (modal_loc_hidden === "false"){
-                                var line = self.$('#js_LocationChooseModal .js_loc_option[loc_id='+result.filter_loc_id+']').attr('selected','selected');
+                                var line = self.$('#js_LocationChooseModal .js_loc_option[data-loc-id='+result.filter_loc_id+']').attr('selected','selected');
                             }
                             else{
                                 self.$('.oe_searchbox').val(result.filter_loc);
@@ -688,7 +714,11 @@ function openerp_picking_widgets(instance){
                 new instance.web.Model('stock.pack.operation')
                     .call('action_drop_down', [pack_op_ids])
                     .then(function(){
-                        return self.refresh_ui(self.picking.id);
+                            return self.refresh_ui(self.picking.id).then(function(){
+                                if (self.picking_editor.check_done()){
+                                    return self.done();
+                                }
+                            });
                     });
             }
         },
index 6fc2828..ac2eaca 100644 (file)
                     <div class="modal-body">
                         <p>Scan a location or select it in the list below</p>
                         <select id="js_loc_select" class="form-control">
-                            <option class="js_loc_option" loc_id="false"></option>
+                            <option class="js_loc_option" data-loc-id="false"></option>
                             <t t-foreach="widget.get_location()" t-as="loc">
-                                <option class="js_loc_option" t-att-loc_id="loc.id"><t t-esc="loc.name"/></option>
+                                <option class="js_loc_option" t-att-data-loc-id="loc.id"><t t-esc="loc.name"/></option>
                             </t>
                         </select>
                     </div>
                     <div class="modal-footer">
                         <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
-                        <button type="button" class="btn btn-primary js_validate_location">Ok</button>
+                        <button type="button" class="btn btn-primary js_validate_location">Change Location</button>
                     </div>
                 </div>
             </div>
         </div>
 
+        <div class="row">
+                <div>
+                    <div class="col-sm-4 col-xs-6">
+                        <h2 class="oe_pick_app_header" />
+                    </div>
+                    <div class="col-sm-8 col-xs⁻6 text-right">
+                        
+                    <button type="button" class='btn btn-default js_pick_done'> Create backorder </button>
+                    <button type="button" class='btn btn-default js_pick_print'> Print </button>
+                        
+                    </div>
+                </div>
+        </div>
 
-
-        <div>
-            <h3><strong>Operations
-            <select id="js_select">
-                <option id="js_select_todo">ToDo</option>
-                <option id="js_select_processed">Processed</option>
-            </select> 
-            </strong></h3>
+        <div class="row">
+            <div>
+                <div class="col-md-3 col-sm-4 col-xs-6">
+                    <h3><strong>
+                        <select id="js_select" class="form-control">
+                            <option value="ToDo" id="js_select_todo">Operations ToDo</option>
+                            <option value="Processed" id="js_select_processed">Operations Processed</option>
+                        </select> 
+                    </strong>
+                    </h3>
+                </div>
+                <div class="col-md-3 col-sm-4 col-xs-6">
+                    <h2>
+                        <div class="input-group">
+                            <input type="text" class="form-control oe_searchbox" placeholder="Filter by location..."/>
+                            <span class="input-group-btn">
+                                <button class="btn btn-danger js_clear_search" type="button">x</button>
+                            </span>
+                        </div>
+                    </h2>
+                </div>
+                <div class="col-md-6 col-sm-4 col-xs-12 text-right">
+                    <h3>
+                        <button type="button" class='btn btn-danger js_drop_down'> Process </button>
+                        <button type="button" class='btn btn-default js_pick_pack'> Put in Pack </button>
+                    </h3>
+                </div>
+            </div>
         </div>
-            
-        <div>
-            
+
+        <div>  
             <table class='table table-condensed js_op_table_todo'>
                 <thead>
                     <tr>
                         <th class="text-left">Product</th> 
-                        <th class='text-center' width="200">Quantity</th> 
+                        <th class='text-center' width="150">Scanned</th>
+                        <th class='text-center'>Todo</th>
                         <th>From</th>
                         <th>To</th>
                     </tr>
 
                 <tbody>
                     <t t-foreach="widget.get_rows()" t-as="row">
-                        <tr t-att-class="row.classes + 'js_pack_op_line'" t-att-data-id="row.cols.id" t-att-container-id="row.cols.container_id">
+                        <tr t-att-class="row.classes + 'js_pack_op_line'" t-att-data-id="row.cols.id" t-att-data-container-id="row.cols.container_id">
                             <td t-att-class="!row.cols.head_container &amp;&amp; row.cols.container ? 'text-center' : 'text-left' + row.cols.head_container ? ' js_unfold' : ''"> 
                                 <t t-if="!row.cols.head_container &amp;&amp; row.cols.container"><span class="fa fa-level-up fa-rotate-90"></span></t>
                                 <t t-esc="row.cols.product" /> 
                             <td class='text-center js_row_qty'>
                                 <t t-if="row.cols.qty &amp;&amp; row.cols.processed == 'false' &amp;&amp; !row.cols.container">
                                     <div class="input-group">
-                                        <span class="input-group-addon js_minus" t-att-op-id='row.cols.product_id'><a href="#"><i class="fa fa-minus"></i></a></span>
-                                        <form class="js_submit_value" t-att-data-id="row.cols.id">
-                                            <input type="text" class="form-control text-center js_qty" t-att-placeholder="row.cols.rem + '/' + row.cols.qty" t-att-data-id="row.cols.id"></input>
-                                            <input type="submit" class="hidden"></input>
+                                        <span class="input-group-addon js_minus" t-att-data-product-id='row.cols.product_id'><a href="#"><i class="fa fa-minus"></i></a></span>
+                                        <form class="js_submit_value">
+                                            <input type="text" class="form-control text-center js_qty" t-att-placeholder="row.cols.rem"></input>
+                                            <!-- <input type="submit" class="hidden"></input> -->
                                         </form>
-                                        <span class="input-group-addon js_plus" t-att-op-id='row.cols.product_id'><a href="#"><i class="fa fa-plus"></i></a></span>
-                                    </div>
-                                    <div>
-                                        <t t-esc="row.cols.uom" />
+                                        <span class="input-group-addon js_plus" t-att-data-product-id='row.cols.product_id'><a href="#"><i class="fa fa-plus"></i></a></span>
                                     </div>
                                 </t>
                                 <t t-if="row.cols.qty &amp;&amp; (row.cols.processed == 'true' || row.cols.container)">
-                                    <t t-esc="row.cols.rem" /> / <t t-esc="row.cols.qty" /> <t t-esc="row.cols.uom" />
+                                    <t t-esc="row.cols.rem" />
                                 </t>
-                            
+                            </td>
+                            <td class="text-center">
+                                <t t-esc="row.cols.qty"/> <t t-esc="row.cols.uom" />
                             </td>
                             <td class="js_loc">
                                 <t t-esc="row.cols.loc" />
                                     </button>
                                     <ul class="dropdown-menu" role="menu">
                                         <t t-if="!row.cols.lot &amp;&amp; row.cols.product_id">
-                                            <li><a class="js_create_lot" t-att-product_id="row.cols.id" href="#">Create Lot</a></li>
+                                            <li><a class="js_create_lot" href="#">Create Lot</a></li>
                                         </t>
-                                        <t t-if="!row.cols.head_container">
-                                            <li><a class="js_change_src" t-att-op_id="row.cols.id" href="#">Change source location</a></li>
-                                            <li><a class="js_change_dst" t-att-op_id="row.cols.id" href="#">Change destination location</a></li>
+                                        <t t-if="!row.cols.head_container &amp;&amp; !row.cols.container">
+                                            <li><a class="js_change_src" href="#">Change source location</a></li>
+                                            <li><a class="js_change_dst" href="#">Change destination location</a></li>
                                         </t>
                                         <t t-if="row.cols.head_container">
-                                            <li><a class="js_delete_pack" t-att-pack_id="row.cols.id" href="#">Remove from package</a></li>
-                                            <li><a class="js_print_pack" t-att-pack_id="row.cols.id" href="#">Print package label</a></li>
+                                            <li><a class="js_pack_change_dst" href="#">Change destination location</a></li>
+                                            <li class="divider"></li>
+                                            <li><a class="js_delete_pack" href="#">Remove from package</a></li>
+                                            <li><a class="js_print_pack" href="#">Print package label</a></li>
                                         </t>
                                     </ul>
                                 </div>
     <t t-name="PickingMenuWidget">
         <div class="navbar navbar-inverse navbar-static-top" role="navigation">
             <div class="container">
-                <!-- <div class="navbar-header navbar-form"> -->
                 <div class="navbar-header navbar-form navbar-left">
                     <input type='text' class="oe_searchbox form-control pull-left" placeholder='Search'/>
                 </div>
                 <div class="navbar-header navbar-form navbar-right">
-                    <!-- <div class='form-group'> -->
-                        <button type="button" class="btn btn-danger js_pick_quit pull-right">Quit</button>
+                    <button type="button" class="btn btn-danger js_pick_quit pull-right">Quit</button>
                 </div>
                     
             </div>
-            <!-- </div> -->
         </div>
         <div class="container">
             
     <t t-name="PickingMainWidget">
         <div class="navbar navbar-inverse navbar-static-top" role="navigation">
             <div class="container">
+                <div class="navbar-left">
+                    <button type="button" class="btn btn-primary navbar-btn js_pick_menu">Menu</button>
+                </div>
                 <div class="navbar-right">
                     <button type="button" class="btn btn-default navbar-btn js_pick_prev">&lt; Previous</button>
                     <button type="button" class="btn btn-default navbar-btn js_pick_next">Next &gt;</button>
-                    
-                </div>
-                <div class="navbar-header">
-                    <button type="button" class="btn btn-primary navbar-btn js_pick_menu">Menu</button>
                 </div>
             </div>
         </div>
 
         <div class="container">
-            <div class="row">
-                <div class="col-md-12">
-                    <div class="pull-right">
-                            <button type="button" class='btn btn-danger js_pick_done'> Done </button>
-                            <button type="button" class='btn btn-info js_pick_print'> Print </button>
-                    </div>
-                    <h2 class="oe_pick_app_header" t-esc='widget.get_header()' />
-                    <div class="input-group col-md-2">
-                        <input type="text" class="form-control oe_searchbox" placeholder="Filter by location..."/>
-                        <span class="input-group-btn">
-                            <button class="btn btn-danger js_clear_search" type="button">x</button>
-                        </span>
-                    </div>
-                    <button type="button" class='btn btn-default js_pick_pack pull-right'> Put in Pack </button>
-                    <button type="button" class='btn btn-default js_drop_down pull-right'> Process </button>
-                    <div class='oe_placeholder_picking_editor'/>
-                </div>
-            </div>
+            <div class='oe_placeholder_picking_editor'/>
         </div>
     </t>