Commit 4eebd767d381b30d11ba938f7f899ff86498adbe
1 parent
9350010b10
Exists in
master
WIP: Modal de busqueda de producto con tabla y filtro
Showing
5 changed files
with
174 additions
and
18 deletions
 
Show diff stats
README.md
| 1 | # Busqueda de productos en modal para Debo Suite | 1 | # Busqueda de productos en modal para Debo Suite | 
| 2 | 2 | ||
| 3 | Para ser utilizado en otro modulo debe iniciarse con este codigo ejemplo: | 3 | Para ser utilizado en otro modulo debe iniciarse con este codigo ejemplo: | 
| 4 | <pre> | 4 | <pre> | 
| 5 | var modalInstance = $uibModal.open( | 5 | var modalInstance = $uibModal.open( | 
| 6 | { | 6 | { | 
| 7 | ariaLabelledBy: 'Busqueda de Productos', | 7 | ariaLabelledBy: 'Busqueda de Productos', | 
| 8 | templateUrl: 'src/views/modal-busqueda-productos.html', | 8 | templateUrl: 'src/views/modal-busqueda-productos.html', | 
| 9 | controller: 'modalBusquedaProductosCtrl', | 9 | controller: 'modalBusquedaProductosCtrl', | 
| 10 | size: 'md' | 10 | size: 'md' | 
| 11 | } | 11 | } | 
| 12 | ); | 12 | ); | 
| 13 | </pre> | ||
| 14 | |||
| 15 | Y despues consiguiendo el resultado de esta forma: | ||
| 16 | <pre> | ||
| 17 | modalInstance.result.then( | ||
| 18 | function (producto) { | ||
| 19 | console.info(producto); | ||
| 20 | // variable producto tiene el producto seleccionado en el modal | ||
| 21 | }, function () { | ||
| 22 | // funcion ejecutada cuando se cancela el modal | ||
| 23 | } | ||
| 24 | ); | ||
| 13 | </pre> | 25 | </pre> | 
index.html
| 1 | <html ng-app="focaBusquedaProductos"> | 1 | <html ng-app="focaBusquedaProductos"> | 
| 2 | <head> | 2 | <head> | 
| 3 | <meta charset="UTF-8"/> | 3 | <meta charset="UTF-8"/> | 
| 4 | <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> | 4 | <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> | 
| 5 | 5 | ||
| 6 | <!--CSS--> | 6 | <!--CSS--> | 
| 7 | <link href="node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet"/> | 7 | <link href="node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet"/> | 
| 8 | <link href="node_modules/font-awesome/css/font-awesome.min.css" rel="stylesheet"/> | 8 | <link href="node_modules/font-awesome/css/font-awesome.min.css" rel="stylesheet"/> | 
| 9 | 9 | ||
| 10 | <!--VENDOR JS--> | 10 | <!--VENDOR JS--> | 
| 11 | <script src="node_modules/jquery/dist/jquery.min.js"></script> | 11 | <script src="node_modules/jquery/dist/jquery.min.js"></script> | 
| 12 | <script src="node_modules/bootstrap/dist/js/bootstrap.min.js"></script> | 12 | <script src="node_modules/bootstrap/dist/js/bootstrap.min.js"></script> | 
| 13 | <script src="node_modules/angular/angular.min.js"></script> | 13 | <script src="node_modules/angular/angular.min.js"></script> | 
| 14 | <script src="node_modules/ui-bootstrap4/dist/ui-bootstrap-tpls.js"></script> | 14 | <script src="node_modules/ui-bootstrap4/dist/ui-bootstrap-tpls.js"></script> | 
| 15 | 15 | ||
| 16 | <!-- BUILD --> | 16 | <!-- BUILD --> | 
| 17 | <script src="src/js/app.js"></script> | 17 | <script src="src/js/app.js"></script> | 
| 18 | <script src="src/js/controller.js"></script> | 18 | <script src="src/js/controller.js"></script> | 
| 19 | <script src="src/js/service.js"></script> | ||
| 19 | 20 | ||
| 20 | <!-- /BUILD --> | 21 | <!-- /BUILD --> | 
| 21 | 22 | ||
| 22 | <!-- CONFIG PARA DEVELOP --> | 23 | <!-- CONFIG PARA DEVELOP --> | 
| 23 | <script src="src/etc/develop.js"></script> | 24 | <script src="src/etc/develop.js"></script> | 
| 24 | <script type="text/javascript"> | 25 | <script type="text/javascript"> | 
| 25 | angular.module('focaBusquedaProductos') | 26 | angular.module('focaBusquedaProductos') | 
| 26 | .controller('controller', ['$uibModal', function($uibModal) { | 27 | .controller('controller', [ | 
| 27 | var modalInstance = $uibModal.open( | 28 | '$scope', | 
| 28 | { | 29 | '$uibModal', | 
| 29 | ariaLabelledBy: 'Busqueda de Productos', | 30 | '$timeout', | 
| 30 | templateUrl: 'src/views/modal-busqueda-productos.html', | 31 | function($scope, $uibModal, $timeout) { | 
| 31 | controller: 'modalBusquedaProductosCtrl', | 32 | openModal(); | 
| 32 | size: 'md' | 33 | |
| 34 | function openModal() { | ||
| 35 | var modalInstance = $uibModal.open( | ||
| 36 | { | ||
| 37 | ariaLabelledBy: 'Busqueda de Productos', | ||
| 38 | templateUrl: 'src/views/modal-busqueda-productos.html', | ||
| 39 | controller: 'modalBusquedaProductosCtrl', | ||
| 40 | size: 'lg' | ||
| 41 | } | ||
| 42 | ); | ||
| 43 | |||
| 44 | modalInstance.result.then( | ||
| 45 | function (selectedItem) { | ||
| 46 | console.info(selectedItem); | ||
| 47 | $timeout(openModal,500); | ||
| 48 | }, function () { | ||
| 49 | console.info('modal-component dismissed at: ' + new Date()); | ||
| 50 | $timeout(openModal,500); | ||
| 51 | } | ||
| 52 | ); | ||
| 33 | } | 53 | } | 
| 34 | ); | 54 | } | 
| 35 | }]); | 55 | ]); | 
| 36 | </script> | 56 | </script> | 
| 37 | </head> | 57 | </head> | 
| 38 | <body ng-controller="controller"> | 58 | <body ng-controller="controller"> | 
| 59 | <style> | ||
| 60 | .p-5 { | ||
| 61 | padding: 5px !important; | ||
| 62 | } | ||
| 63 | </style> | ||
| 39 | </body> | 64 | </body> | 
| 40 | </html> | 65 | </html> | 
| 41 | 66 | 
src/js/controller.js
| 1 | angular.module('focaBusquedaProductos') | 1 | angular.module('focaBusquedaProductos') | 
| 2 | .controller('modalBusquedaProductosCtrl', | ||
| 3 | ['$uibModalInstance', function($uibModalInstance) { | ||
| 4 | |||
| 5 | }] | ||
| 6 | ) | ||
| 2 | .controller('modalBusquedaProductosCtrl', | ||
| 3 | [ | ||
| 4 | '$filter', | ||
| 5 | '$scope', | ||
| 6 | '$uibModalInstance', | ||
| 7 | 'focaBusquedaProductosService', | ||
| 8 | function($filter, $scope, $uibModalInstance, focaBusquedaProductosService) { | ||
| 9 | focaBusquedaProductosService.getProductos().then( | ||
| 10 | function(res) { | ||
| 11 | $scope.productos = res; | ||
| 12 | $scope.search(); | ||
| 13 | } | ||
| 14 | ); | ||
| 15 | |||
| 16 | // pagination | ||
| 17 | $scope.numPerPage = 10; | ||
| 18 | $scope.currentPage = 1; | ||
| 19 | $scope.filteredProductos = []; | ||
| 20 | $scope.currentPageProductos = []; | ||
| 21 | $scope.selectProducto = 0; | ||
| 22 | |||
| 23 | |||
| 24 | //METODOS | ||
| 25 | $scope.search = function() { | ||
| 26 | $scope.filteredProductos = $filter('filter')($scope.productos, {$: $scope.filters}); | ||
| 27 | $scope.resetPage(); | ||
| 28 | } | ||
| 29 | |||
| 30 | $scope.resetPage = function() { | ||
| 31 | $scope.currentPage = 1; | ||
| 32 | $scope.selectPage(1); | ||
| 33 | } | ||
| 34 | |||
| 35 | $scope.selectPage = function(page) { | ||
| 36 | var start = (page - 1) * $scope.numPerPage; | ||
| 37 | var end = start + $scope.numPerPage; | ||
| 38 | $scope.currentPageProductos = $scope.filteredProductos.slice(start, end); | ||
| 39 | } | ||
| 40 | |||
| 41 | $scope.select = function(producto) { | ||
| 42 | $uibModalInstance.close(producto); | ||
| 43 | } | ||
| 44 | |||
| 45 | $scope.cancel = function() { | ||
| 46 | $uibModalInstance.dismiss('cancel'); | ||
| 47 | } | ||
| 48 | |||
| 49 | $scope.enter = function(key) { | ||
| 50 | if (key === 13) { | ||
| 51 | console.table($scope.currentPageProductos); | 
src/js/service.js
| 1 | angular.module('focaBusquedaProductos') | ||
| 2 | .service('focaBusquedaProductosService', ['$q', function($q) { | ||
| 3 | return { | ||
| 4 | getProductos: function(filtro) { | ||
| 5 | var deferred = $q.defer(); | ||
| 6 | |||
| 7 | deferred.resolve([ | ||
| 8 | { | ||
| 9 | idProducto: 1, | ||
| 10 | codigo: 1, | ||
| 11 | sector: 1, | ||
| 12 | descripcion: 'Nafta Comun', | ||
| 13 | codsecfilter: '1-1', | ||
| 14 | precio: 35 | ||
| 15 | }, | ||
| 16 | { | ||
| 17 | idProducto: 2, | ||
| 18 | codigo: 2, | ||
| 19 | sector: 1, | ||
| 20 | descripcion: 'Diesel', | ||
| 21 | codsecfilter: '1-2', | ||
| 22 | precio: 40 | ||
| 23 | }, | ||
| 24 | { | ||
| 25 | idProducto: 3, | ||
| 26 | codigo: 1, | ||
| 27 | sector: 2, | ||
| 28 | descripcion: 'Aceite', | ||
| 29 | codsecfilter: '2-1', | ||
| 30 | precio: 95 | ||
| 31 | } | ||
| 32 | ]); | ||
| 33 | |||
| 34 | return deferred.promise; | ||
| 35 | } | ||
| 36 | } | ||
| 37 | }]) | 
src/views/modal-busqueda-productos.html
| 1 | <div class="modal-header"> | 1 | <div class="modal-header"> | 
| 2 | <h3 class="modal-title" id="modal-title">I'm a modal!</h3> | 2 | <h3 class="modal-title">Busqueda de Productos</h3> | 
| 3 | </div> | 3 | </div> | 
| 4 | <div class="modal-body" id="modal-body"> | 4 | <div class="modal-body" id="modal-body"> | 
| 5 | Esto es una prueba espero que funcione | 5 | <div class="input-group mb-3"> | 
| 6 | <input | ||
| 7 | type="text" | ||
| 8 | class="form-control" | ||
| 9 | placeholder="Busqueda" | ||
| 10 | ng-model="filters" | ||
| 11 | ng-change="search()" | ||
| 12 | ng-keypress="enter($event.keyCode)" | ||
| 13 | > | ||
| 14 | <table class="table table-striped table-sm"> | ||
| 15 | <thead> | ||
| 16 | <tr> | ||
| 17 | <th>Sec.</th> | ||
| 18 | <th>Cod.</th> | ||
| 19 | <th>Descripción</th> | ||
| 20 | <th>P. Base</th> | ||
| 21 | <th></th> | ||
| 22 | </tr> | ||
| 23 | </thead> | ||
| 24 | <tbody> | ||
| 25 | <tr ng-repeat="producto in filteredProductos"> | ||
| 26 | <td ng-bind="producto.sector"></td> | ||
| 27 | <td ng-bind="producto.codigo"></td> | ||
| 28 | <td ng-bind="producto.descripcion"></td> | ||
| 29 | <td ng-bind="producto.precio | currency"></td> | ||
| 30 | <td> | ||
| 31 | <button type="button" class="btn btn-secondary p-5 float-right mr-1" ng-click="select(producto)"> | ||
| 32 | <i class="fa fa-check" aria-hidden="true"></i> | ||
| 33 | </button> | ||
| 34 | </td> | ||
| 35 | </tr> | ||
| 36 | </tbody> | ||
| 37 | </table> | ||
| 38 | </div> | ||
| 6 | </div> | 39 | </div> | 
| 7 | <div class="modal-footer"> | 40 | <div class="modal-footer"> | 
| 8 | <button class="btn btn-primary" type="button">OK</button> | 41 | <button class="btn btn-secondary" type="button" ng-click="cancel()">Cancelar</button> | 
| 9 | <button class="btn btn-warning" type="button">Cancel</button> | ||
| 10 | </div> | 42 | </div> |