Commit 8ed1ad5aafcbcfae311d36c68c101a0a41a90156

Authored by Leonardo Merlin
1 parent 406a1e4f

Add initial filter to program list

src/app/components/programa/programa.directive.js
@@ -6,43 +6,58 @@ @@ -6,43 +6,58 @@
6 .directive('programaBox', programaBox); 6 .directive('programaBox', programaBox);
7 7
8 /** @ngInject */ 8 /** @ngInject */
9 - function programaBox($log) { 9 + function programaBox() {
10 10
11 /** @ngInject */ 11 /** @ngInject */
12 - function ProgramaController() { 12 + function ProgramaController($log) {
13 $log.debug('ProgramaController'); 13 $log.debug('ProgramaController');
14 14
15 var vm = this; 15 var vm = this;
  16 + vm.$log = $log;
16 17
17 - $log.debug('this.programa', vm.programa);  
18 - vm.program = vm.programa; 18 + vm.init();
19 } 19 }
20 20
  21 + ProgramaController.prototype.init = function () {
  22 +
  23 + };
  24 +
21 ProgramaController.prototype.getCategory = function () { 25 ProgramaController.prototype.getCategory = function () {
22 - // return this.program.categories[0];  
23 - return 'category-object'; 26 + var vm = this;
  27 +
  28 + return vm.program.categories[0];
24 }; 29 };
  30 +
25 ProgramaController.prototype.getCategoryName = function () { 31 ProgramaController.prototype.getCategoryName = function () {
26 - // return this.getCategory().name;  
27 - return 'category-name'; 32 + var vm = this;
  33 +
  34 + return vm.getCategory().name;
28 }; 35 };
29 36
30 ProgramaController.prototype.getImageUrl = function () { 37 ProgramaController.prototype.getImageUrl = function () {
31 - return 'http://login.dialoga.gov.br/image_uploads/dialoga/0000/0053/requalif_redim.jpg'; 38 + var vm = this;
  39 +
  40 + return 'http://login.dialoga.gov.br/' + vm.program.image.url;
32 }; 41 };
  42 +
33 ProgramaController.prototype.getImageAlt = function () { 43 ProgramaController.prototype.getImageAlt = function () {
34 - return 'TODO: descrição da imagem.'; 44 + var vm = this;
  45 +
  46 + vm.$log.warn('image is not accessible.');
  47 + return 'TODO: create image alt on server-side.';
35 }; 48 };
36 49
37 ProgramaController.prototype.showContent = function () { 50 ProgramaController.prototype.showContent = function () {
38 - $log.debug('TODO: showContent()', this.program); 51 + var vm = this;
  52 +
  53 + vm.$log.debug('TODO: showContent()', vm.program);
39 }; 54 };
40 55
41 var directive = { 56 var directive = {
42 restrict: 'E', 57 restrict: 'E',
43 templateUrl: 'app/components/programa/programa.html', 58 templateUrl: 'app/components/programa/programa.html',
44 scope: { 59 scope: {
45 - programa: '=programa' 60 + program: '='
46 }, 61 },
47 controller: ProgramaController, 62 controller: ProgramaController,
48 controllerAs: 'vm', 63 controllerAs: 'vm',
src/app/components/programa/programa.html
1 -<div class="programa-box" ng-if="vm.program" ng-click="vm.showContent()"> 1 +<div class="program-box" ng-if="vm.program" ng-click="vm.showContent()">
2 <div class="category">{{::vm.getCategoryName()}}</div> 2 <div class="category">{{::vm.getCategoryName()}}</div>
3 <div class="image-wrapper"> 3 <div class="image-wrapper">
4 <image class="img-responsive" ng-src="{{::vm.getImageUrl()}}" alt="{{::vm.getImageAlt()}}" /> 4 <image class="img-responsive" ng-src="{{::vm.getImageUrl()}}" alt="{{::vm.getImageAlt()}}" />
5 </div> 5 </div>
  6 + <div class="program-title">{{::vm.program.title}}</div>
  7 + <div class="program-abstract" ng-bind-html="vm.program.abstract"></div>
6 </div> 8 </div>
src/app/components/programa/programa.scss
@@ -3,15 +3,20 @@ $scale: 1.1; @@ -3,15 +3,20 @@ $scale: 1.1;
3 $time: 0.3s; 3 $time: 0.3s;
4 4
5 // sandbox 5 // sandbox
6 -.programa-box { 6 +.program-box {
7 cursor: pointer; 7 cursor: pointer;
8 8
  9 + .category {
  10 + display: block;
  11 + height: 30px;
  12 + line-height: 30px;
  13 + }
  14 +
9 .image-wrapper { 15 .image-wrapper {
10 position: relative; 16 position: relative;
11 // width: 100%; 17 // width: 100%;
12 // width: 370px; 18 // width: 370px;
13 // height: 170px; 19 // height: 170px;
14 - background-color: red;  
15 overflow: hidden; 20 overflow: hidden;
16 text-align: center; 21 text-align: center;
17 } 22 }
src/app/components/programas/programas.directive.js
@@ -3,62 +3,162 @@ @@ -3,62 +3,162 @@
3 3
4 angular 4 angular
5 .module('dialoga') 5 .module('dialoga')
  6 + .filter('filterByCategory', filterByCategory)
  7 + .filter('filterByCriteria', filterByCriteria)
6 .directive('programaList', programaList); 8 .directive('programaList', programaList);
7 9
8 /** @ngInject */ 10 /** @ngInject */
9 - function programaList($log) { 11 + function programaList() {
10 12
11 /** @ngInject */ 13 /** @ngInject */
12 - function ProgramaListController() { 14 + function ProgramaListController($scope, $log) {
13 $log.debug('ProgramaListController'); 15 $log.debug('ProgramaListController');
14 16
  17 + // alias
15 var vm = this; 18 var vm = this;
16 - vm.filter = false;  
17 - vm.categories = [  
18 - {  
19 - name: 'Saúde',  
20 - slug: 'saude'  
21 - },  
22 - {  
23 - name: 'Educação',  
24 - slug: 'educacao'  
25 - } 19 +
  20 + // dependencies
  21 + vm.$scope = $scope;
  22 + vm.$log = $log;
  23 +
  24 + // initialization
  25 + vm.init();
  26 + }
  27 +
  28 + ProgramaListController.prototype.init = function () {
  29 + var vm = this;
  30 +
  31 + vm.query = null;
  32 + vm.categoryFilter = null;
  33 + vm.orderCriteries = [
  34 + { label: 'Título', name: 'title' },
  35 + { label: 'Tema', name: 'category' },
  36 + { label: 'Mais participações', name: 'more_participants' }
26 ]; 37 ];
27 38
28 - for (var i = vm.categories.length - 1; i >= 0; i--) {  
29 - var category = vm.categories[i];  
30 - category.iconClass = vm.getIconClasses(category); 39 + if(!vm.article){
  40 + vm.$log.warn('no article to display. Tip: use a ng-if before use this directive');
  41 + return;
31 } 42 }
32 - }  
33 43
34 - ProgramaListController.prototype.getIconClasses = function (tema) {  
35 - $log.debug('[TODO] getIconClasses of tema:', tema); 44 + vm.categories = vm.article.categories;
  45 + vm.programs = vm.article.children;
  46 + vm.filtredProgramList = [];
  47 + };
  48 +
  49 + ProgramaListController.prototype.getIconClasses = function (category) {
  50 + var vm = this;
  51 +
  52 + vm.$log.debug('[TODO] getIconClasses of category:', category);
36 return 'glyphicon glyphicon-exclamation-sign'; 53 return 'glyphicon glyphicon-exclamation-sign';
37 }; 54 };
38 55
39 - ProgramaListController.prototype.filterByTema = function (tema) {  
40 - this.filter = tema.slug;  
41 - $log.debug('[TODO] Filterting by tema:', this.filter); 56 + ProgramaListController.prototype.filterByCategory = function (category) {
  57 + var vm = this;
  58 +
  59 + if(category !== vm.categoryFilter){
  60 + // selected new filter
  61 + vm.categoryFilter = category;
  62 + }else{
  63 + // already selected. Unselect.
  64 + vm.showAll();
  65 + }
42 }; 66 };
  67 +
43 ProgramaListController.prototype.showAll = function () { 68 ProgramaListController.prototype.showAll = function () {
44 - this.filter = null;  
45 - $log.debug('[TODO] Filterting by tema:', this.filter); 69 + var vm = this;
  70 +
  71 + vm.query = null;
  72 + vm.categoryFilter = null;
  73 + vm.$log.debug('[TODO] showAll, no filter? ', vm.categoryFilter);
46 }; 74 };
47 75
  76 + // function ProgramaListLinker (scope, element, attrs) {
  77 +
  78 + // scope.$watch('article', function(newValue, oldValue){
  79 + // if(!newValue){
  80 + // return;
  81 + // }
  82 + // scope.vm.categories = scope.vm.article.categories;
  83 + // scope.vm.programs = scope.vm.article.children;
  84 + // });
  85 + // }
  86 +
48 var directive = { 87 var directive = {
49 restrict: 'E', 88 restrict: 'E',
50 templateUrl: 'app/components/programas/programas.html', 89 templateUrl: 'app/components/programas/programas.html',
51 scope: { 90 scope: {
52 - programas: '=programas',  
53 - temas: '=temas' 91 + article: '='
54 }, 92 },
55 controller: ProgramaListController, 93 controller: ProgramaListController,
56 controllerAs: 'vm', 94 controllerAs: 'vm',
57 - bindToController: true 95 + bindToController: true,
  96 + // link: ProgramaListLinker
58 }; 97 };
59 98
60 99
61 return directive; 100 return directive;
62 } 101 }
63 102
  103 + function filterByCategory(){
  104 + return function (input, category){
  105 + input = input || [];
  106 +
  107 + if(!category){
  108 + // no filter
  109 + return input;
  110 + }
  111 +
  112 + var out = [];
  113 + for (var i = 0; i < input.length; i++) {
  114 + var program = input[i];
  115 + if(program.categories[0].slug === category.slug){
  116 + out.push(program);
  117 + }
  118 + }
  119 +
  120 + return out;
  121 + };
  122 + }
  123 +
  124 + /** @ngInject */
  125 + function filterByCriteria($filter, $log){
  126 + var orderBy = $filter('orderBy');
  127 +
  128 + return function (input, criteria, reverse){
  129 + input = input || [];
  130 + reverse = reverse || false;
  131 +
  132 + if( !criteria ){
  133 + return input;
  134 + }
  135 +
  136 + var out = [];
  137 + // for (var i = 0; i < input.length; i++) {
  138 + // var program = input[i];
  139 +
  140 + // // todo ordering
  141 + // out.push(program);
  142 + // }
  143 +
  144 + switch(criteria.name){
  145 + case 'title':
  146 + out = orderBy(input, 'title', reverse);
  147 + break;
  148 + case 'category':
  149 + out = orderBy(input, 'categories[0].name', reverse);
  150 + break;
  151 + case 'more_participants':
  152 + // break;
  153 + default:
  154 + $log.info('Criteria not handled yet: ', criteria);
  155 + out = input;
  156 + break;
  157 + }
  158 +
  159 + return out;
  160 + };
  161 + }
  162 +
  163 +
64 })(); 164 })();
src/app/components/programas/programas.html
@@ -4,10 +4,15 @@ @@ -4,10 +4,15 @@
4 <aside class="navigation"> 4 <aside class="navigation">
5 <h3 class="title"><b>Programas</b> por Tema</h3> 5 <h3 class="title"><b>Programas</b> por Tema</h3>
6 <div class="list-group category-list"> 6 <div class="list-group category-list">
7 - <button type="button" class="list-group-item category-item" ng-repeat="tema in vm.categories" ng-click="vm.filterByTema(tema)">  
8 - <span ng-class="[tema.iconClass]"></span>  
9 - <span>{{::tema.name}}</span> 7 + <button type="button" class="list-group-item category-item"
  8 + ng-repeat="category in vm.categories"
  9 + ng-class="{active: vm.categoryFilter.slug === category.slug}"
  10 + ng-click="vm.filterByCategory(category)">
  11 +
  12 + <span ng-class="[category.iconClass]"></span>
  13 + <span>{{::category.name}}</span>
10 <span class="glyphicon glyphicon-chevron-right pull-right"></span> 14 <span class="glyphicon glyphicon-chevron-right pull-right"></span>
  15 +
11 </button> 16 </button>
12 </div> 17 </div>
13 </aside> 18 </aside>
@@ -18,15 +23,40 @@ @@ -18,15 +23,40 @@
18 <div class="program-list"> 23 <div class="program-list">
19 <div class="header"> 24 <div class="header">
20 <h2>Programas</h2> 25 <h2>Programas</h2>
21 - <button type="button" ng-click="vm.showAll()" class="btn btn-link"> 26 + <button type="button" class="btn btn-link" ng-click="vm.showAll()">
22 <span class="glyphicon glyphicon-chevron-right"></span> Ver todos os programas 27 <span class="glyphicon glyphicon-chevron-right"></span> Ver todos os programas
23 </button> 28 </button>
24 </div> 29 </div>
25 - <div class="row">  
26 - <programa-box programa="{}" class="col-sm-12 col-md-6"></programa-box>  
27 - <programa-box programa="{}" class="col-sm-12 col-md-6"></programa-box>  
28 - <programa-box programa="{}" class="col-sm-12 col-md-6"></programa-box>  
29 - <programa-box programa="{}" class="col-sm-12 col-md-6"></programa-box> 30 + <div>
  31 + <div class="col-sm-12">
  32 + <div class="form-inline">
  33 + <div class="form-group">
  34 + <label for="programListFilter" class="control-label sr-only">Filtrar programas:</label>
  35 + <input id="programListFilter" type="search" class="form-control" ng-model="vm.query" placeholder="Filtrar programas" aria-label="Filtrar programas" >
  36 +
  37 + <select class="form-control" ng-model="vm.categoryFilter" ng-options="category.name for category in vm.categories track by category.slug">
  38 + <option value="">-- Filtrar por tema --</option>
  39 + </select>
  40 +
  41 + <select class="form-control" ng-model="vm.orderCriteria" ng-options="orderCriteria.label for orderCriteria in vm.orderCriteries">
  42 + <option value="">-- Ordernar por: --</option>
  43 + </select>
  44 +
  45 + <div class="checkbox">
  46 + <label>
  47 + <input type="checkbox" ng-model="orderReverse"> Reverso
  48 + </label>
  49 + </div>
  50 + </div>
  51 + </div>
  52 + </div>
  53 + <div ng-repeat="program in vm.programs | filterByCategory:vm.categoryFilter | filterByCriteria:vm.orderCriteria:orderReverse | filter:vm.query as results">
  54 + <programa-box program="program" class="col-sm-12 col-md-6"></programa-box>
  55 + <div ng-if="$odd" class="clearfix"></div>
  56 + </div>
  57 + <div class="animate-repeat" ng-if="results.length == 0">
  58 + Nenhum programa encontrado.
  59 + </div>
30 </div> 60 </div>
31 </div> 61 </div>
32 </div> 62 </div>
src/app/partials/inicio/inicio.html
@@ -12,5 +12,5 @@ @@ -12,5 +12,5 @@
12 </div> 12 </div>
13 </section> 13 </section>
14 <section class="container-fluid section-programas"> 14 <section class="container-fluid section-programas">
15 - <programa-list></programa-list> 15 + <programa-list ng-if="inicio.article" article="inicio.article"></programa-list>
16 </section> 16 </section>
src/app/partials/programas/programas.controller.js
@@ -6,14 +6,19 @@ @@ -6,14 +6,19 @@
6 .controller('ProgramasController', ProgramasController); 6 .controller('ProgramasController', ProgramasController);
7 7
8 /** @ngInject */ 8 /** @ngInject */
9 - function ProgramasController(ProgramaService, $log) { 9 + function ProgramasController(ArticleService, $log) {
10 $log.debug('ProgramasController'); 10 $log.debug('ProgramasController');
11 11
12 var vm = this; 12 var vm = this;
13 13
14 - vm.programaList = [  
15 - ProgramaService.mockPrograma(),  
16 - ProgramaService.mockPrograma()  
17 - ]; 14 + vm.ArticleService = ArticleService;
  15 + vm.$log = $log;
  16 +
  17 + vm.init();
18 } 18 }
  19 +
  20 + ProgramasController.prototype.init = function () {
  21 +
  22 + vm.programaList = [];
  23 + };
19 })(); 24 })();