Commit c3e6490b64e19096f35dca81e9fbdcfac2df4e1c
Exists in
master
and in
8 other branches
Merge branch 'program'
Showing
7 changed files
with
213 additions
and
56 deletions
Show diff stats
src/app/components/programa/programa.directive.js
| ... | ... | @@ -6,43 +6,58 @@ |
| 6 | 6 | .directive('programaBox', programaBox); |
| 7 | 7 | |
| 8 | 8 | /** @ngInject */ |
| 9 | - function programaBox($log) { | |
| 9 | + function programaBox() { | |
| 10 | 10 | |
| 11 | 11 | /** @ngInject */ |
| 12 | - function ProgramaController() { | |
| 12 | + function ProgramaController($log) { | |
| 13 | 13 | $log.debug('ProgramaController'); |
| 14 | 14 | |
| 15 | 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 | 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 | 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 | 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 | 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 | 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 | 56 | var directive = { |
| 42 | 57 | restrict: 'E', |
| 43 | 58 | templateUrl: 'app/components/programa/programa.html', |
| 44 | 59 | scope: { |
| 45 | - programa: '=programa' | |
| 60 | + program: '=' | |
| 46 | 61 | }, |
| 47 | 62 | controller: ProgramaController, |
| 48 | 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 | 2 | <div class="category">{{::vm.getCategoryName()}}</div> |
| 3 | 3 | <div class="image-wrapper"> |
| 4 | 4 | <image class="img-responsive" ng-src="{{::vm.getImageUrl()}}" alt="{{::vm.getImageAlt()}}" /> |
| 5 | 5 | </div> |
| 6 | + <div class="program-title">{{::vm.program.title}}</div> | |
| 7 | + <div class="program-abstract" ng-bind-html="vm.program.abstract"></div> | |
| 6 | 8 | </div> | ... | ... |
src/app/components/programa/programa.scss
| ... | ... | @@ -3,15 +3,20 @@ $scale: 1.1; |
| 3 | 3 | $time: 0.3s; |
| 4 | 4 | |
| 5 | 5 | // sandbox |
| 6 | -.programa-box { | |
| 6 | +.program-box { | |
| 7 | 7 | cursor: pointer; |
| 8 | 8 | |
| 9 | + .category { | |
| 10 | + display: block; | |
| 11 | + height: 30px; | |
| 12 | + line-height: 30px; | |
| 13 | + } | |
| 14 | + | |
| 9 | 15 | .image-wrapper { |
| 10 | 16 | position: relative; |
| 11 | 17 | // width: 100%; |
| 12 | 18 | // width: 370px; |
| 13 | 19 | // height: 170px; |
| 14 | - background-color: red; | |
| 15 | 20 | overflow: hidden; |
| 16 | 21 | text-align: center; |
| 17 | 22 | } | ... | ... |
src/app/components/programas/programas.directive.js
| ... | ... | @@ -3,62 +3,162 @@ |
| 3 | 3 | |
| 4 | 4 | angular |
| 5 | 5 | .module('dialoga') |
| 6 | + .filter('filterByCategory', filterByCategory) | |
| 7 | + .filter('filterByCriteria', filterByCriteria) | |
| 6 | 8 | .directive('programaList', programaList); |
| 7 | 9 | |
| 8 | 10 | /** @ngInject */ |
| 9 | - function programaList($log) { | |
| 11 | + function programaList() { | |
| 10 | 12 | |
| 11 | 13 | /** @ngInject */ |
| 12 | - function ProgramaListController() { | |
| 14 | + function ProgramaListController($scope, $log) { | |
| 13 | 15 | $log.debug('ProgramaListController'); |
| 14 | 16 | |
| 17 | + // alias | |
| 15 | 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 | 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 | 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 | 87 | var directive = { |
| 49 | 88 | restrict: 'E', |
| 50 | 89 | templateUrl: 'app/components/programas/programas.html', |
| 51 | 90 | scope: { |
| 52 | - programas: '=programas', | |
| 53 | - temas: '=temas' | |
| 91 | + article: '=' | |
| 54 | 92 | }, |
| 55 | 93 | controller: ProgramaListController, |
| 56 | 94 | controllerAs: 'vm', |
| 57 | - bindToController: true | |
| 95 | + bindToController: true, | |
| 96 | + // link: ProgramaListLinker | |
| 58 | 97 | }; |
| 59 | 98 | |
| 60 | 99 | |
| 61 | 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 | 4 | <aside class="navigation"> |
| 5 | 5 | <h3 class="title"><b>Programas</b> por Tema</h3> |
| 6 | 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 | 14 | <span class="glyphicon glyphicon-chevron-right pull-right"></span> |
| 15 | + | |
| 11 | 16 | </button> |
| 12 | 17 | </div> |
| 13 | 18 | </aside> |
| ... | ... | @@ -18,15 +23,40 @@ |
| 18 | 23 | <div class="program-list"> |
| 19 | 24 | <div class="header"> |
| 20 | 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 | 27 | <span class="glyphicon glyphicon-chevron-right"></span> Ver todos os programas |
| 23 | 28 | </button> |
| 24 | 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 | 60 | </div> |
| 31 | 61 | </div> |
| 32 | 62 | </div> | ... | ... |
src/app/partials/inicio/inicio.html
src/app/partials/programas/programas.controller.js
| ... | ... | @@ -6,14 +6,19 @@ |
| 6 | 6 | .controller('ProgramasController', ProgramasController); |
| 7 | 7 | |
| 8 | 8 | /** @ngInject */ |
| 9 | - function ProgramasController(ProgramaService, $log) { | |
| 9 | + function ProgramasController(ArticleService, $log) { | |
| 10 | 10 | $log.debug('ProgramasController'); |
| 11 | 11 | |
| 12 | 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 | })(); | ... | ... |