Commit d43f07ae2aa5653ebed3e456b293c21ce8cd31ce

Authored by Marcelo Puebla
1 parent e1a9b4e09f
Exists in develop

Agregada logica para mostrar todos los productos al inicio del modal.

src/js/controller.js
1 angular.module('focaBusquedaProductos') 1 angular.module('focaBusquedaProductos')
2 .controller('modalBusquedaProductosCtrl', 2 .controller('modalBusquedaProductosCtrl',
3 [ 3 [
4 '$timeout', 4 '$timeout',
5 '$filter', 5 '$filter',
6 '$scope', 6 '$scope',
7 '$uibModalInstance', 7 '$uibModalInstance',
8 'parametroProducto', 8 'parametroProducto',
9 'focaBusquedaProductosService', 9 'focaBusquedaProductosService',
10 function ($timeout, $filter, $scope, $uibModalInstance, parametroProducto, 10 function ($timeout, $filter, $scope, $uibModalInstance, parametroProducto,
11 focaBusquedaProductosService 11 focaBusquedaProductosService
12 ) { 12 ) {
13 13
14 $scope.simbolo = parametroProducto.simbolo; 14 $scope.simbolo = parametroProducto.simbolo;
15 $scope.filters = ''; 15 $scope.filters = '';
16 $scope.listaProductos = []; 16 $scope.listaProductos = [];
17 $scope.todosProductos = []; 17 $scope.todosProductos = [];
18 $scope.primerBusqueda = false; 18 $scope.primerBusqueda = false;
19 $scope.searchLoading = false; 19 $scope.searchLoading = false;
20 $scope.soloMostrar = parametroProducto.soloMostrar; 20 $scope.soloMostrar = parametroProducto.soloMostrar;
21 $scope.buscarTodos = parametroProducto.buscarTodos;
21 $scope.useAllProducts = false; 22 $scope.useAllProducts = false;
22 //#region pagination variables 23 //#region pagination variables
23 $scope.numPerPage = 10; 24 $scope.numPerPage = 10;
24 $scope.currentPage = 1; 25 $scope.currentPage = 1;
25 $scope.filteredProductos = []; 26 $scope.filteredProductos = [];
26 $scope.currentPageProductos = []; 27 $scope.currentPageProductos = [];
27 $scope.selectedProducto = -1; 28 $scope.selectedProducto = -1;
29
30 init();
31
32 function init() {
33
34 //Verifica si el modal mostrará todos los productos al abrirse.
35 if ($scope.buscarTodos) {
36 $scope.useAllProducts = !$scope.useAllProducts;
37 primera();
38 }
39 }
28 //#endregion 40 //#endregion
29 41
30 //METODOS 42 //METODOS
31 $scope.busquedaPress = function (key) { 43 $scope.busquedaPress = function (key) {
32 if (key === 13) { 44 if (key === 13) {
33 $scope.searchLoading = true; 45 $scope.searchLoading = true;
34 focaBusquedaProductosService 46 focaBusquedaProductosService
35 .getProductosByIdLista(parseInt(parametroProducto.idLista), $scope.filters) 47 .getProductosByIdLista(parseInt(parametroProducto.idLista), $scope.filters)
36 .then(function (data) { 48 .then(function (data) {
37 llenarDatos(data); 49 llenarDatos(data);
38 focaBusquedaProductosService.getProductos() 50 focaBusquedaProductosService.getProductos()
39 .then(fillAllProductos); 51 .then(fillAllProductos);
40 }) 52 })
41 .catch(function (e) { console.log(e) }); 53 .catch(function (e) { console.log(e) });
42 } 54 }
43 }; 55 };
44 function llenarDatos(res) { 56 function llenarDatos(res) {
45 for (var i = 0; i < res.data.length; i++) { 57 for (var i = 0; i < res.data.length; i++) {
46 res.data[i].precio = res.data[i].precio / parametroProducto.cotizacion; 58 res.data[i].precio = res.data[i].precio / parametroProducto.cotizacion;
47 } 59 }
48 $scope.searchLoading = false; 60 $scope.searchLoading = false;
49 $scope.primerBusqueda = true; 61 $scope.primerBusqueda = true;
50 $scope.listaProductos = res.data; 62 $scope.listaProductos = res.data;
51 $scope.search(true); 63 $scope.search(true);
52 primera(); 64 primera();
53 }; 65 };
54 function fillAllProductos(res) { 66 function fillAllProductos(res) {
55 for (var i = 0; i < res.data.length; i++) { 67 for (var i = 0; i < res.data.length; i++) {
56 var producto = $scope.listaProductos.filter(function (producto) { 68 var producto = $scope.listaProductos.filter(function (producto) {
57 return producto.id == res.data[i].id; 69 return producto.id == res.data[i].id;
58 })[0]; 70 })[0];
59 71
60 if (producto) { 72 if (producto) {
61 res.data[i].precio = producto.precio; 73 res.data[i].precio = producto.precio;
62 } 74 }
63 } 75 }
64 $scope.searchLoading = false; 76 $scope.searchLoading = false;
65 $scope.primerBusqueda = true; 77 $scope.primerBusqueda = true;
66 $scope.todosProductos = res.data; 78 $scope.todosProductos = res.data;
67 $scope.search(true); 79 $scope.search(true);
68 primera(); 80 primera();
69 }; 81 };
70 $scope.changeProductsData = function () { 82 $scope.changeProductsData = function () {
71 $scope.useAllProducts = !$scope.useAllProducts; 83 $scope.useAllProducts = !$scope.useAllProducts;
72 $scope.search(false); 84 $scope.search(false);
73 primera(); 85 primera();
74 }; 86 };
75 $scope.search = function (pressed) { 87 $scope.search = function (pressed) {
76 if ($scope.listaProductos.length > 0 || $scope.todosProductos.length > 0) { 88 if ($scope.listaProductos.length > 0 || $scope.todosProductos.length > 0) {
77 $scope.filteredProductos = $filter('filter')( 89 $scope.filteredProductos = $filter('filter')(
78 ($scope.useAllProducts ? $scope.todosProductos : $scope.listaProductos), 90 ($scope.useAllProducts ? $scope.todosProductos : $scope.listaProductos),
79 { $: $scope.filters } 91 { $: $scope.filters }
80 ); 92 );
81 93
82 $scope.lastPage = Math.ceil( 94 $scope.lastPage = Math.ceil(
83 $scope.filteredProductos.length / $scope.numPerPage 95 $scope.filteredProductos.length / $scope.numPerPage
84 ); 96 );
85 97
86 $scope.resetPage(); 98 $scope.resetPage();
87 } else if (pressed) { 99 } else if (pressed) {
88 $timeout(function () { 100 $timeout(function () {
89 angular.element('#search')[0].focus(); 101 angular.element('#search')[0].focus();
90 $scope.filters = ''; 102 $scope.filters = '';
91 }); 103 });
92 } 104 }
93 }; 105 };
94 $scope.resetPage = function () { 106 $scope.resetPage = function () {
95 $scope.currentPage = 1; 107 $scope.currentPage = 1;
96 $scope.selectPage(1); 108 $scope.selectPage(1);
97 }; 109 };
98 $scope.selectPage = function (page) { 110 $scope.selectPage = function (page) {
99 var start = (page - 1) * $scope.numPerPage; 111 var start = (page - 1) * $scope.numPerPage;
100 var end = start + $scope.numPerPage; 112 var end = start + $scope.numPerPage;
101 $scope.paginas = []; 113 $scope.paginas = [];
102 $scope.paginas = calcularPages(page); 114 $scope.paginas = calcularPages(page);
103 $scope.currentPageProductos = $scope.filteredProductos.slice(start, end); 115 $scope.currentPageProductos = $scope.filteredProductos.slice(start, end);
104 $scope.currentPage = page; 116 $scope.currentPage = page;
105 }; 117 };
106 $scope.select = function (producto) { 118 $scope.select = function (producto) {
107 $uibModalInstance.close(producto); 119 $uibModalInstance.close(producto);
108 }; 120 };
109 $scope.cancel = function () { 121 $scope.cancel = function () {
110 $uibModalInstance.dismiss('cancel'); 122 $uibModalInstance.dismiss('cancel');
111 }; 123 };
112 $scope.busquedaDown = function (key) { 124 $scope.busquedaDown = function (key) {
113 if (key === 40) { 125 if (key === 40) {
114 primera(key); 126 primera(key);
115 } 127 }
116 }; 128 };
117 $scope.itemProducto = function (key) { 129 $scope.itemProducto = function (key) {
118 if (key === 38) { 130 if (key === 38) {
119 anterior(key); 131 anterior(key);
120 } 132 }
121 133
122 if (key === 40) { 134 if (key === 40) {
123 siguiente(key); 135 siguiente(key);
124 } 136 }
125 137
126 if (key === 37) { 138 if (key === 37) {
127 retrocederPagina(); 139 retrocederPagina();
128 } 140 }
129 141
130 if (key === 39) { 142 if (key === 39) {
131 avanzarPagina(); 143 avanzarPagina();
132 } 144 }
133 }; 145 };
134 146
135 //#region Paginador 147 //#region Paginador
136 function calcularPages(paginaActual) { 148 function calcularPages(paginaActual) {
137 var paginas = []; 149 var paginas = [];
138 paginas.push(paginaActual); 150 paginas.push(paginaActual);
139 151
140 if (paginaActual - 1 > 1) { 152 if (paginaActual - 1 > 1) {
141 153
142 paginas.unshift(paginaActual - 1); 154 paginas.unshift(paginaActual - 1);
143 if (paginaActual - 2 > 1) { 155 if (paginaActual - 2 > 1) {
144 paginas.unshift(paginaActual - 2); 156 paginas.unshift(paginaActual - 2);
145 } 157 }
146 } 158 }
147 159
148 if (paginaActual + 1 < $scope.lastPage) { 160 if (paginaActual + 1 < $scope.lastPage) {
149 paginas.push(paginaActual + 1); 161 paginas.push(paginaActual + 1);
150 if (paginaActual + 2 < $scope.lastPage) { 162 if (paginaActual + 2 < $scope.lastPage) {
151 paginas.push(paginaActual + 2); 163 paginas.push(paginaActual + 2);
152 } 164 }
153 } 165 }
154 166
155 if (paginaActual !== 1) { 167 if (paginaActual !== 1) {
156 paginas.unshift(1); 168 paginas.unshift(1);
157 } 169 }
158 170
159 if (paginaActual !== $scope.lastPage) { 171 if (paginaActual !== $scope.lastPage) {
160 paginas.push($scope.lastPage); 172 paginas.push($scope.lastPage);
161 } 173 }
162 174
163 return paginas; 175 return paginas;
164 }; 176 };
165 function primera() { 177 function primera() {
166 $scope.selectedProducto = 0; 178 $scope.selectedProducto = 0;
167 }; 179 };
168 function anterior() { 180 function anterior() {
169 if ($scope.selectedProducto === 0 && $scope.currentPage > 1) { 181 if ($scope.selectedProducto === 0 && $scope.currentPage > 1) {
170 retrocederPagina(); 182 retrocederPagina();
171 } else { 183 } else {
172 $scope.selectedProducto--; 184 $scope.selectedProducto--;
173 } 185 }
174 }; 186 };
175 function siguiente() { 187 function siguiente() {
176 if ($scope.selectedProducto < $scope.currentPageProductos.length - 1) { 188 if ($scope.selectedProducto < $scope.currentPageProductos.length - 1) {
177 $scope.selectedProducto++; 189 $scope.selectedProducto++;
178 } else { 190 } else {
179 avanzarPagina(); 191 avanzarPagina();
180 } 192 }
181 }; 193 };
182 function retrocederPagina() { 194 function retrocederPagina() {
183 if ($scope.currentPage > 1) { 195 if ($scope.currentPage > 1) {
184 $scope.selectPage($scope.currentPage - 1); 196 $scope.selectPage($scope.currentPage - 1);
185 $scope.selectedProducto = $scope.numPerPage - 1; 197 $scope.selectedProducto = $scope.numPerPage - 1;
186 } 198 }
187 }; 199 };
188 function avanzarPagina() { 200 function avanzarPagina() {
189 if ($scope.currentPage < $scope.lastPage) { 201 if ($scope.currentPage < $scope.lastPage) {
190 $scope.selectPage($scope.currentPage + 1); 202 $scope.selectPage($scope.currentPage + 1);
191 $scope.selectedProducto = 0; 203 $scope.selectedProducto = 0;
192 } 204 }
193 }; 205 };
194 //#endregion 206 //#endregion
195 207
196 $scope.busquedaPress(13); 208 $scope.busquedaPress(13);
197 } 209 }
198 ] 210 ]
199 ); 211 );
200 212
src/views/modal-busqueda-productos.html
1 <div class="modal-header py-1"> 1 <div class="modal-header py-1">
2 <div class="row w-100"> 2 <div class="row w-100">
3 <div class="col-lg-6"> 3 <div class="col-lg-6">
4 <h5 class="modal-title my-1">Búsqueda de Productos</h5> 4 <h5 class="modal-title my-1">Búsqueda de Productos</h5>
5 </div> 5 </div>
6 <div class="input-group col-lg-6 pr-0 my-2"> 6 <div class="input-group col-lg-6 pr-0 my-2">
7 <input 7 <input
8 ladda="searchLoading" 8 ladda="searchLoading"
9 type="text" 9 type="text"
10 class="form-control form-control-sm" 10 class="form-control form-control-sm"
11 id="search" 11 id="search"
12 placeholder="Busqueda" 12 placeholder="Busqueda"
13 ng-model="filters" 13 ng-model="filters"
14 ng-change="search()" 14 ng-change="search()"
15 ng-keydown="busquedaDown($event.keyCode)" 15 ng-keydown="busquedaDown($event.keyCode)"
16 ng-keypress="busquedaPress($event.keyCode)" 16 ng-keypress="busquedaPress($event.keyCode)"
17 foca-focus="selectedProducto == -1" 17 foca-focus="selectedProducto == -1"
18 ng-focus="selectedProducto = -1" 18 ng-focus="selectedProducto = -1"
19 teclado-virtual 19 teclado-virtual
20 > 20 >
21 <div class="input-group-append"> 21 <div class="input-group-append">
22 <button 22 <button
23 ladda="searchLoading" 23 ladda="searchLoading"
24 data-spinner-color="#FF0000" 24 data-spinner-color="#FF0000"
25 class="btn btn-outline-secondary" 25 class="btn btn-outline-secondary"
26 type="button" 26 type="button"
27 title="Buscar" 27 title="Buscar"
28 ng-click="busquedaPress(13)" 28 ng-click="busquedaPress(13)"
29 > 29 >
30 <i class="fa fa-search" aria-hidden="true"></i> 30 <i class="fa fa-search" aria-hidden="true"></i>
31 </button> 31 </button>
32 </div> 32 </div>
33 </div> 33 </div>
34 </div> 34 </div>
35 <div class="row"> 35 <div class="row">
36 <div class="col my-1 d-flex justify-content-end"> 36 <div class="col my-1 d-flex justify-content-end">
37 <div class="custom-control custom-checkbox mt-auto"> 37 <div class="custom-control custom-checkbox mt-auto">
38 <input type="checkbox" class="custom-control-input" id="check" ng-click="changeProductsData()"> 38 <input
39 type="checkbox"
40 class="custom-control-input"
41 id="check"
42 ng-click="changeProductsData()"
43 ng-checked="buscarTodos">
39 <label class="custom-control-label disable-selection" for="check"> 44 <label class="custom-control-label disable-selection" for="check">
40 Buscar en todos los artículos disponibles 45 Buscar en todos los artículos disponibles
41 </label> 46 </label>
42 </div> 47 </div>
43 </div> 48 </div>
44 </div> 49 </div>
45 </div> 50 </div>
46 <div class="modal-body" id="modal-body"> 51 <div class="modal-body" id="modal-body">
47 52
48 <div ng-show="!primerBusqueda"> 53 <div ng-show="!primerBusqueda">
49 Debe realizar una primer búsqueda. 54 Debe realizar una primer búsqueda.
50 </div> 55 </div>
51 56
52 <table ng-show="primerBusqueda" class="table table-striped table-sm"> 57 <table ng-show="primerBusqueda" class="table table-striped table-sm">
53 <thead> 58 <thead>
54 <tr> 59 <tr>
55 <th ng-hide="soloMostrar">Código</th> 60 <th ng-hide="soloMostrar">Código</th>
56 <th>Descripción</th> 61 <th>Descripción</th>
57 <th class="text-right">P. Lista</th> 62 <th class="text-right">P. Lista</th>
58 <th class="text-right" ng-show="useAllProducts">P. Base</th> 63 <th class="text-right" ng-show="useAllProducts">P. Base</th>
59 <th ng-hide="soloMostrar"></th> 64 <th ng-hide="soloMostrar"></th>
60 </tr> 65 </tr>
61 </thead> 66 </thead>
62 <tbody> 67 <tbody>
63 <tr ng-show="currentPageProductos.length == 0 && primerBusqueda"> 68 <tr ng-show="currentPageProductos.length == 0 && primerBusqueda">
64 <td colspan="5"> 69 <td colspan="5">
65 No se encontraron resultados. 70 No se encontraron resultados.
66 </td> 71 </td>
67 </tr> 72 </tr>
68 <tr class="selectable" 73 <tr class="selectable"
69 ng-repeat="(key,producto) in currentPageProductos" 74 ng-repeat="(key,producto) in currentPageProductos"
70 ng-click="select(producto)"> 75 ng-click="select(producto)">
71 <td ng-bind="producto.sector + '-' + producto.codigo" 76 <td ng-bind="producto.sector + '-' + producto.codigo"
72 ng-hide="soloMostrar"></td> 77 ng-hide="soloMostrar"></td>
73 <td ng-bind="producto.descripcion"></td> 78 <td ng-bind="producto.descripcion"></td>
74 <td class="text-right">{{producto.precioBase == producto.precio ? '' : producto.precio}}</td> 79 <td class="text-right">{{producto.precioBase == producto.precio ? '' : producto.precio}}</td>
75 <td class="text-right" ng-bind="producto.precioBase | number: 2" ng-show="useAllProducts"></td> 80 <td class="text-right" ng-bind="producto.precioBase | number: 2" ng-show="useAllProducts"></td>
76 <td class="d-md-none text-primary"> 81 <td class="d-md-none text-primary">
77 <i class="fa fa-circle-thin" aria-hidden="true"></i> 82 <i class="fa fa-circle-thin" aria-hidden="true"></i>
78 </td> 83 </td>
79 <td class="d-none d-md-table-cell"> 84 <td class="d-none d-md-table-cell">
80 <button 85 <button
81 type="button" 86 type="button"
82 class="btn btn-xs p-1 float-right" 87 class="btn btn-xs p-1 float-right"
83 title="Seleccionar" 88 title="Seleccionar"
84 ng-class="{ 89 ng-class="{
85 'btn-secondary': selectedProducto != key, 90 'btn-secondary': selectedProducto != key,
86 'btn-primary': selectedProducto == key 91 'btn-primary': selectedProducto == key
87 }" 92 }"
88 foca-focus="selectedProducto == {{key}}" 93 foca-focus="selectedProducto == {{key}}"
89 ng-keydown="itemProducto($event.keyCode)" 94 ng-keydown="itemProducto($event.keyCode)"
90 ng-hide="soloMostrar"> 95 ng-hide="soloMostrar">
91 <i class="fa fa-circle-thin" aria-hidden="true"></i> 96 <i class="fa fa-circle-thin" aria-hidden="true"></i>
92 </button> 97 </button>
93 </td> 98 </td>
94 </tr> 99 </tr>
95 </tbody> 100 </tbody>
96 </table> 101 </table>
97 102
98 </div> 103 </div>
99 <div class="modal-footer py-1"> 104 <div class="modal-footer py-1">
100 <nav ng-show="currentPageProductos.length > 0 && primerBusqueda" class="mr-auto"> 105 <nav ng-show="currentPageProductos.length > 0 && primerBusqueda" class="mr-auto">
101 <ul class="pagination pagination-sm justify-content mb-0"> 106 <ul class="pagination pagination-sm justify-content mb-0">
102 <li class="page-item" ng-class="{'disabled': currentPage == 1}"> 107 <li class="page-item" ng-class="{'disabled': currentPage == 1}">
103 <a class="page-link" href="javascript:void();" ng-click="selectPage(currentPage - 1)"> 108 <a class="page-link" href="javascript:void();" ng-click="selectPage(currentPage - 1)">
104 <span aria-hidden="true">&laquo;</span> 109 <span aria-hidden="true">&laquo;</span>
105 <span class="sr-only">Anterior</span> 110 <span class="sr-only">Anterior</span>
106 </a> 111 </a>
107 </li> 112 </li>
108 <li 113 <li
109 class="page-item" 114 class="page-item"
110 ng-repeat="pagina in paginas" 115 ng-repeat="pagina in paginas"
111 ng-class="{'active': pagina == currentPage}" 116 ng-class="{'active': pagina == currentPage}"
112 > 117 >
113 <a 118 <a
114 class="page-link" 119 class="page-link"
115 href="javascript:void();" 120 href="javascript:void();"
116 ng-click="selectPage(pagina)" 121 ng-click="selectPage(pagina)"
117 ng-bind="pagina" 122 ng-bind="pagina"
118 ></a> 123 ></a>
119 </li> 124 </li>
120 <li class="page-item" ng-class="{'disabled': currentPage == lastPage}"> 125 <li class="page-item" ng-class="{'disabled': currentPage == lastPage}">
121 <a class="page-link" href="javascript:void();" ng-click="selectPage(currentPage + 1)"> 126 <a class="page-link" href="javascript:void();" ng-click="selectPage(currentPage + 1)">
122 <span aria-hidden="true">&raquo;</span> 127 <span aria-hidden="true">&raquo;</span>
123 <span class="sr-only">Siguiente</span> 128 <span class="sr-only">Siguiente</span>
124 </a> 129 </a>
125 </li> 130 </li>
126 </ul> 131 </ul>
127 </nav> 132 </nav>
128 <button class="btn btn-sm btn-secondary my-1" type="button" ng-click="cancel()">Volver</button> 133 <button class="btn btn-sm btn-secondary my-1" type="button" ng-click="cancel()">Volver</button>
129 </div> 134 </div>
130 135