{"id":701,"date":"2019-05-24T12:00:47","date_gmt":"2019-05-24T16:30:47","guid":{"rendered":"http:\/\/gregorgonzalez.com.ve\/blog\/?p=701"},"modified":"2021-05-31T19:02:03","modified_gmt":"2021-05-31T23:32:03","slug":"angularjs-simple-ordenamiento-de-tabla-con-buscador","status":"publish","type":"post","link":"http:\/\/gregorgonzalez.com.ve\/blog\/angularjs-simple-ordenamiento-de-tabla-con-buscador\/","title":{"rendered":"AngularJs &#8211; Simple ordenamiento de tabla con buscador"},"content":{"rendered":"<p>Aunque prefiero utilizar plugins, herramientas o fabricar mis propios buscadores, paginadores y ordenamientos, a veces solo necesitamos con cumplir con un requerimiento sencillo. En este caso necesitaba ordenar una simple tabla con pocos datos y permitir que el usuario eligiera por cual columna ordenar.\u00a0Adicional se agreg\u00f3 un filtro de b\u00fasqueda para poder encontrar alg\u00fan registro f\u00e1cilmente.<\/p>\n<p>Suponiendo que tenemos un array de listado de clientes :<\/p>\n<pre class=\"lang:js decode:true\">angular.module('miApp', [])\r\n.controller('mainController', function($scope) {\r\n  $scope.sortType = 'nombre';\r\n  $scope.sortReverse = false;\r\n  $scope.buscar = '';\r\n  \r\n  $scope.clientes = [\r\n    { id: 1, nombre: 'Gr\u00e9gor', apellido: 'Goz\u00e1lez', fecha: '22\/05\/2019' },\r\n    { id: 2, nombre: 'Maria', apellido: 'Sulbaran', fecha: '20\/05\/2019' },\r\n    { id: 3, nombre: 'Juan', apellido: 'Cede\u00f1o', fecha: '30\/05\/2019' },\r\n    { id: 4, nombre: 'Carlos', apellido: 'Perez', fecha: '31\/05\/2019' }\r\n  ];  \r\n});<\/pre>\n<p>Angular nos provee de directivas, filtros y al momento de mostrar la informaci\u00f3n con la directiva ng-repeat, pasamos los par\u00e1metros necesarios para indicar el ordenamiento con \u00aborderBy\u00bb, la columna por la cual ordenar \u00absortType\u00bb y el tipo de ordenamiento, si ser\u00e1 al rev\u00e9s \u00absortType\u00bb. Adicional se utiliza el filtro de busqueda \u00abfilter\u00bb\u00a0 y la variable para usar de criterio.<\/p>\n<pre class=\"lang:xhtml decode:true\">&lt;tr ng-repeat=\"cliente in clientes | orderBy:sortType:sortReverse | filter:buscar\"&gt;\r\n    &lt;td&gt;{{ cliente.id }}&lt;\/td&gt;\r\n    &lt;td&gt;{{ cliente.nombre }}&lt;\/td&gt;\r\n    &lt;td&gt;{{ cliente.apellido }}&lt;\/td&gt;\r\n    &lt;td&gt;{{ cliente.fecha }}&lt;\/td&gt;\r\n&lt;\/tr&gt;<\/pre>\n<p>En el header de la tabla, incluimos una funci\u00f3n para el momento de hacer click, ordenamos por dicha columna y para mostrar una fecha que indica el tipo de ordenamiento, usamos una clase con ng-class y estableciendola con if ternarios:<\/p>\n<pre class=\"lang:default decode:true\">&lt;thead&gt;\r\n    &lt;tr&gt;\r\n        &lt;td&gt;\r\n            &lt;a href=\"#\" ng-click=\"sortType = 'id'; sortReverse = !sortReverse\"&gt;\r\n                Id \r\n                &lt;span ng-class=\"sortType == 'id' &amp;&amp; !sortReverse ? 'arrow arrow-down' : sortType == 'id' &amp;&amp; sortReverse ? 'arrow arrow-up': ''\"&gt;&lt;\/span&gt;\r\n            &lt;\/a&gt;\r\n        &lt;\/td&gt;\r\n    &lt;\/tr&gt;\r\n&lt;\/thead&gt;\r\n<\/pre>\n<p>Para probar puedes agregar este c\u00f3digo completo y guardarlo como un archivo .html:<\/p>\n<pre class=\"lang:xhtml decode:true \">&lt;style&gt;\r\n.arrow {\r\n  border: solid black;\r\n  border-width: 0 2px 2px 0;\r\n  display: inline-block;\r\n  padding: 3px;\r\n}\r\n\r\n.arrow-up {\r\n  transform: rotate(-135deg);\r\n  -webkit-transform: rotate(-135deg);\r\n}\r\n\r\n.arrow-down {\r\n  transform: rotate(45deg);\r\n  -webkit-transform: rotate(45deg);\r\n}\r\n&lt;\/style&gt;\r\n\r\n&lt;div class=\"container\" ng-app=\"miApp\" ng-controller=\"mainController\"&gt;\r\n  \r\n  &lt;div class=\"alert alert-info\"&gt;\r\n    &lt;p&gt;Ordenado Por: {{ sortType }}&lt;\/p&gt;\r\n    &lt;p&gt;Ordenado Reversa: {{ sortReverse }}&lt;\/p&gt;\r\n    &lt;p&gt;Buscando por: {{ buscar }}&lt;\/p&gt;\r\n  &lt;\/div&gt;\r\n  \r\n  &lt;form&gt;\r\n\t&lt;input type=\"text\" class=\"form-control\" placeholder=\"Busqueda\" ng-model=\"buscar\"&gt;\r\n  &lt;\/form&gt;\r\n  \r\n  &lt;table class=\"table table-bordered table-striped\"&gt;\r\n    \r\n    &lt;thead&gt;\r\n      &lt;tr&gt;\r\n        &lt;td&gt;\r\n          &lt;a href=\"#\" ng-click=\"sortType = 'id'; sortReverse = !sortReverse\"&gt;\r\n          Id \r\n            &lt;span ng-class=\"sortType == 'id' &amp;&amp; !sortReverse ? 'arrow arrow-down' : sortType == 'id' &amp;&amp; sortReverse ? 'arrow arrow-up': ''\"&gt;&lt;\/span&gt;\r\n          &lt;\/a&gt;\r\n        &lt;\/td&gt;\r\n        &lt;td&gt;\r\n          &lt;a href=\"#\" ng-click=\"sortType = 'nombre'; sortReverse = !sortReverse\"&gt;\r\n            Nombre\r\n            &lt;span ng-class=\"sortType == 'nombre' &amp;&amp; !sortReverse ? 'arrow arrow-down' : sortType == 'nombre' &amp;&amp; sortReverse ? 'arrow arrow-up': ''\"&gt;&lt;\/span&gt;\r\n          &lt;\/a&gt;\r\n        &lt;\/td&gt;\r\n        &lt;td&gt;\r\n          &lt;a href=\"#\" ng-click=\"sortType = 'apellido'; sortReverse = !sortReverse\"&gt;\r\n          Apellido \r\n            &lt;span ng-class=\"sortType == 'apellido' &amp;&amp; !sortReverse ? 'arrow arrow-down' : sortType == 'apellido' &amp;&amp; sortReverse ? 'arrow arrow-up': ''\"&gt;&lt;\/span&gt;\r\n          &lt;\/a&gt;\r\n        &lt;\/td&gt;\r\n        &lt;td&gt;\r\n          &lt;a href=\"#\" ng-click=\"sortType = 'fecha'; sortReverse = !sortReverse\"&gt;\r\n          Fecha\r\n            &lt;span ng-class=\"sortType == 'fecha' &amp;&amp; !sortReverse ? 'arrow arrow-down' : sortType == 'fecha' &amp;&amp; sortReverse ? 'arrow arrow-up': ''\"&gt;&lt;\/span&gt;\r\n          &lt;\/a&gt;\r\n        &lt;\/td&gt;\r\n      &lt;\/tr&gt;\r\n    &lt;\/thead&gt;\r\n    \r\n    &lt;tbody&gt;\r\n      &lt;tr ng-repeat=\"cliente in clientes | orderBy:sortType:sortReverse | filter:buscar\"&gt;\r\n\t&lt;td&gt;{{ cliente.id }}&lt;\/td&gt;\r\n        &lt;td&gt;{{ cliente.nombre }}&lt;\/td&gt;\r\n        &lt;td&gt;{{ cliente.apellido }}&lt;\/td&gt;\r\n        &lt;td&gt;{{ cliente.fecha }}&lt;\/td&gt;\r\n      &lt;\/tr&gt;\r\n    &lt;\/tbody&gt;\r\n    \r\n  &lt;\/table&gt;  \r\n&lt;\/div&gt;\r\n\r\n\r\n&lt;script src=\"https:\/\/ajax.googleapis.com\/ajax\/libs\/angularjs\/1.7.8\/angular.min.js\"&gt;&lt;\/script&gt;\r\n\r\n&lt;script&gt;\r\nangular.module('miApp', [])\r\n.controller('mainController', function($scope) {\r\n  $scope.sortType = 'nombre';\r\n  $scope.sortReverse = false;\r\n  $scope.buscar = '';\r\n  \r\n  $scope.clientes = [\r\n    { id: 1, nombre: 'Gr\u00e9gor', apellido: 'Goz\u00e1lez', fecha: '22\/05\/2019' },\r\n    { id: 2, nombre: 'Maria', apellido: 'Sulbaran', fecha: '20\/05\/2019' },\r\n    { id: 3, nombre: 'Juan', apellido: 'Cede\u00f1o', fecha: '30\/05\/2019' },\r\n    { id: 4, nombre: 'Carlos', apellido: 'Perez', fecha: '31\/05\/2019' }\r\n  ];\r\n  \r\n});\r\n&lt;\/script&gt;<\/pre>\n<p>O ver una vista previa en este jsfiddle:<\/p>\n<iframe style=\"width: 100%; height: 500px\" src=\"https:\/\/jsfiddle.net\/ENSASKE\/9pz6n12s\/embedded\/result,js,css,html\/\" allowfullscreen=\"allowfullscreen\" frameborder=\"0\"><\/iframe>\n","protected":false},"excerpt":{"rendered":"<p>Aunque prefiero utilizar plugins, herramientas o fabricar mis propios buscadores, paginadores y ordenamientos, a veces solo necesitamos con cumplir con un requerimiento sencillo. En este caso necesitaba ordenar una simple tabla con pocos datos y permitir que el usuario eligiera por cual columna ordenar.\u00a0Adicional se agreg\u00f3 un filtro de b\u00fasqueda para poder encontrar alg\u00fan registro [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":691,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[232,34],"tags":[256,255,257,100,253,254],"_links":{"self":[{"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/posts\/701"}],"collection":[{"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/comments?post=701"}],"version-history":[{"count":4,"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/posts\/701\/revisions"}],"predecessor-version":[{"id":802,"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/posts\/701\/revisions\/802"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/media\/691"}],"wp:attachment":[{"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/media?parent=701"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/categories?post=701"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/tags?post=701"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}