Commit ef3b9ec3b257ed53bca8ab9d142144893a45da25

Authored by Leonardo Merlin
1 parent 2e71444d

Sync - merlin

src/app/components/app-paginator/app-paginator.directive.js 0 → 100644
... ... @@ -0,0 +1,67 @@
  1 +(function() {
  2 + 'use strict';
  3 +
  4 + angular
  5 + .module('dialoga')
  6 + .directive('appPaginator', appPaginator);
  7 +
  8 + /** @ngInject */
  9 + function appPaginator() {
  10 +
  11 + /** @ngInject */
  12 + function AppPaginatorController($log) {
  13 + var vm = this;
  14 +
  15 + vm.$log = $log;
  16 +
  17 + vm.init();
  18 +
  19 + $log.debug('AppPaginatorController');
  20 + }
  21 +
  22 + AppPaginatorController.prototype.init = function () {
  23 + var vm = this;
  24 +
  25 + vm.page = vm.page || 1;
  26 + vm.perPage = vm.perPage || 20;
  27 + vm.total = vm.total || 0;
  28 + };
  29 +
  30 + AppPaginatorController.prototype.showPage = function (pageIndex) {
  31 + var vm = this;
  32 +
  33 + if (pageIndex < 0) {
  34 + pageIndex = 0;
  35 + }
  36 +
  37 + if (pageIndex > (vm.arraypages.length-1)) {
  38 + pageIndex = vm.arraypages.length-1;
  39 + }
  40 +
  41 + if(vm.changePage){
  42 + vm.changePage({pageIndex: (pageIndex + 1 )});
  43 + }else{
  44 + vm.proposalsPerPage = vm.getProposalsPerPage(pageIndex);
  45 + }
  46 + vm.currentPageIndex = pageIndex;
  47 + };
  48 +
  49 + var directive = {
  50 + restrict: 'E',
  51 + templateUrl: 'app/components/app-paginator/app-paginator.html',
  52 + scope: {
  53 + page: '=',
  54 + perPage: '=',
  55 + total: '=',
  56 + changePage: '&'
  57 + },
  58 + controller: AppPaginatorController,
  59 + controllerAs: 'vm',
  60 + bindToController: true
  61 + };
  62 +
  63 +
  64 + return directive;
  65 + }
  66 +
  67 +})();
... ...
src/app/components/app-paginator/app-paginator.html 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +<nav ng-if="vm.arraypages.length > 1">
  2 + <ul class="pagination">
  3 + <li ng-style="{'visibility': (vm.currentPageIndex === 0) ? 'hidden' : 'visible'}">
  4 + <a class="btn-pagination" href="#" aria-label="Previous" ng-click="vm.showPage(vm.currentPageIndex-1)">
  5 + <span aria-hidden="true" class="glyphicon glyphicon-chevron-left pagination-icon"></span>
  6 + </a>
  7 + </li>
  8 + <li ng-repeat="paginas in vm.arraypages track by $index" ng-class="{ 'active' : ($index) == vm.currentPageIndex }" >
  9 + <a class="btn-pagination" href="#" ng-click="vm.showPage($index)">{{::($index)+1}}</a>
  10 + </li>
  11 + <li ng-style="{'visibility': (vm.currentPageIndex === (vm.arraypages.length -1)) ? 'hidden' : 'visible'}">
  12 + <a class="btn-pagination" href="#" aria-label="Next" ng-click="vm.showPage(vm.currentPageIndex+1)">
  13 + <span aria-hidden="true" class="glyphicon glyphicon-chevron-right pagination-icon"></span>
  14 + </a>
  15 + </li>
  16 + </ul>
  17 +</nav>
... ...
src/app/components/dialoga-service/dialoga.service.js
... ... @@ -160,7 +160,7 @@
160 160 var result = CACHE.programs.filter(function filterProgramBySlug (program) {
161 161 var category = program.categories[0];
162 162  
163   - if(angular.equals(category.id, themeId)) {
  163 + if(category && angular.equals(category.id, themeId)) {
164 164 return true;
165 165 }
166 166 return false;
... ... @@ -226,8 +226,8 @@
226 226 ArticleService.searchTopics({query: query}, cbSuccess, cbError);
227 227 }
228 228  
229   - function searchProposals (query, cbSuccess, cbError) {
230   - ArticleService.searchProposals({query: query}, cbSuccess, cbError);
  229 + function searchProposals (params, cbSuccess, cbError) {
  230 + ArticleService.searchProposals(params, cbSuccess, cbError);
231 231 }
232 232  
233 233 function _pipeHandleYoutube (data) {
... ...
src/app/components/proposal-list/proposal-list.directive.js
... ... @@ -44,16 +44,13 @@
44 44 var vm = this;
45 45  
46 46 vm.currentPageIndex = 0;
47   -
48 47 vm.proposalsPerPage = vm.getProposalsPerPage(0);
49   -
50   - vm.proposalsLength = vm.proposals.length;
51   -
  48 + vm.proposalsLength = vm.total || vm.proposals.length;
52 49  
53 50 if ((vm.proposalsLength % vm.perPage) === 0) {
54   - vm.pages = vm.proposalsLength / vm.perPage;
  51 + vm.pages = vm.proposalsLength / vm.perPage;
55 52 } else{
56   - vm.pages = (vm.proposalsLength / vm.perPage) + 1;
  53 + vm.pages = (vm.proposalsLength / vm.perPage) + 1;
57 54 }
58 55  
59 56 // vm.arraypages = new Array(Math.ceil(vm.pages));
... ... @@ -98,7 +95,11 @@
98 95 pageIndex = vm.arraypages.length-1;
99 96 }
100 97  
101   - vm.proposalsPerPage = vm.getProposalsPerPage(pageIndex);
  98 + if(vm.changePage){
  99 + vm.changePage({pageIndex: (pageIndex + 1 )});
  100 + }else{
  101 + vm.proposalsPerPage = vm.getProposalsPerPage(pageIndex);
  102 + }
102 103 vm.currentPageIndex = pageIndex;
103 104 };
104 105  
... ... @@ -132,7 +133,10 @@
132 133 templateUrl: 'app/components/proposal-list/proposal-list.html',
133 134 scope: {
134 135 proposals: '=',
135   - perPage: '='
  136 + page: '=',
  137 + perPage: '=',
  138 + total: '=',
  139 + changePage: '&'
136 140 },
137 141 controller: ProposalListController,
138 142 controllerAs: 'vm',
... ...
src/app/components/util-service/utils.service.js
... ... @@ -48,6 +48,7 @@
48 48 */
49 49 function handleSuccess (response) {
50 50 $log.debug('[SUCCESS]', response);
  51 + response.data._obj = response;
51 52 return response.data;
52 53 }
53 54  
... ...
src/app/index.route.js
... ... @@ -106,12 +106,12 @@
106 106 .state('ranking', {
107 107 url: '/ranking?tema&programa&filtro',
108 108 reloadOnSearch: false,
109   - ncyBreadcrumb: {label: 'Propostas'},
  109 + ncyBreadcrumb: {label: 'Ranking'},
110 110 views: {
111 111 'main': {
112   - templateUrl: 'app/pages/propostas/ranking.html',
113   - controller: 'PropostasPageController',
114   - controllerAs: 'pagePropostas'
  112 + templateUrl: 'app/pages/ranking/ranking.html',
  113 + controller: 'RankingPageController',
  114 + controllerAs: 'pageRanking'
115 115 }
116 116 }
117 117 })
... ...
src/app/pages/propostas/propostas.controller.js
1   -/**
2   - * Controlador das páginas:
3   - * - Propostas
4   - * - Ranking
5   - */
6 1 (function() {
7 2 'use strict';
8 3  
... ... @@ -50,10 +45,7 @@
50 45  
51 46 // Behaviour:
52 47 // 1. Load themes
53   - // 2. Select a Random Theme (T)
54   - // 3. Load programs of T
55   - // 4. Select a random program of T
56   - // 5. Filter the list of proposals
  48 + // 1. Load Proposals per_page
57 49 // END.
58 50  
59 51 // 1. Load themes
... ... @@ -63,30 +55,8 @@
63 55 vm.loadingThemes = false;
64 56 vm.loading = false;
65 57  
66   - // 2. Select a Random Theme (T)
67   - var selectedTheme = null;
68   - if(vm.search.tema){
69   -
70   - // vanilla filter
71   - var results = vm.themes.filter(function(t){
72   - return t.slug === vm.search.tema;
73   - });
74   -
75   - if(results && results.length > 0){
76   - selectedTheme = results[0];
77   - vm.selectedTheme = selectedTheme;
78   - }
79   - }
80   -
81   - if(!selectedTheme){
82   - vm.selectedTheme = vm.themes[Math.floor(Math.random() * vm.themes.length)];
83   - }
84   -
85   - // 3. Load programs of T
86   - // (AND 4)
87   - var themeId = vm.selectedTheme.id;
88   - vm.loadPrograms(themeId, function(){
89   - vm.loadProposals();
  58 + vm.loadProposals(function (){
  59 + vm.attachListeners();
90 60 });
91 61 }, function (error) {
92 62 vm.error = error;
... ... @@ -96,44 +66,7 @@
96 66 });
97 67 };
98 68  
99   - PropostasPageController.prototype.loadPrograms = function (themeId, cb) {
100   - var vm = this;
101   -
102   - vm.DialogaService.getProgramsByThemeId(themeId, function (programs){
103   -
104   - vm.filtredPrograms = programs;
105   -
106   - // 4. Select a random program of T
107   - var selectedProgram = null;
108   - if(vm.search.programa){
109   -
110   - // vanilla filter
111   - var results = vm.filtredPrograms.filter(function(p){
112   - return p.slug === vm.search.programa;
113   - });
114   -
115   - if(results && results.length > 0){
116   - selectedProgram = results[0];
117   - vm.selectedProgram = selectedProgram;
118   - }
119   - }
120   -
121   - if(!selectedProgram){
122   - vm.selectedProgram = vm.filtredPrograms[Math.floor(Math.random() * vm.filtredPrograms.length)];
123   - }
124   -
125   - if(cb){
126   - cb();
127   - }
128   - }, function(error){
129   - vm.$log.error(error);
130   - if(cb){
131   - cb();
132   - }
133   - });
134   - };
135   -
136   - PropostasPageController.prototype.loadProposals = function () {
  69 + PropostasPageController.prototype.loadProposals = function (cb) {
137 70 var vm = this;
138 71  
139 72 // load Proposals
... ... @@ -144,7 +77,9 @@
144 77 vm.loadingProposals = false;
145 78 vm.loading = false;
146 79  
147   - vm.attachListeners();
  80 + if(cb){
  81 + cb();
  82 + }
148 83 }, function (error) {
149 84 vm.error = error;
150 85 vm.$log.error(error);
... ... @@ -163,12 +98,7 @@
163 98 vm.$scope.$watch('pagePropostas.selectedTheme', function(newValue, oldValue) {
164 99 vm.search.tema = newValue ? newValue.slug : null;
165 100 vm.$location.search('tema', vm.search.tema);
166   -
167   - if(vm.selectedTheme && vm.selectedTheme.id){
168   - vm.loadPrograms(vm.selectedTheme.id, function(){
169   - vm.filtredProposals = vm.getFiltredProposals();
170   - });
171   - }
  101 + vm.filtredProposals = vm.getFiltredProposals();
172 102 });
173 103  
174 104 vm.$scope.$on('change-selectedTopic', function (event, selectedTopic) {
... ... @@ -188,17 +118,6 @@
188 118 });
189 119 };
190 120  
191   - PropostasPageController.prototype.showAllPrograms = function($event) {
192   - var vm = this;
193   - $event.stopPropagation();
194   -
195   - vm.resetFilterValues();
196   -
197   - vm._showAllFlag = true;
198   -
199   - vm.filtredPrograms = vm.getFiltredPrograms();
200   - };
201   -
202 121 PropostasPageController.prototype.resetFilterValues = function() {
203 122 var vm = this;
204 123  
... ...
src/app/pages/propostas/ranking.html
... ... @@ -1,68 +0,0 @@
1   -<div class="container">
2   - <div class="row">
3   - <div class="col-sm-12">
4   - <div ncy-breadcrumb></div>
5   - </div>
6   - </div>
7   -</div>
8   -
9   -<div class="page--propostas">
10   - <section class="section--info">
11   - <div class="container">
12   - <div class="row">
13   - <div class="col-sm-12">
14   - <h1>Ranking</h1>
15   - </div>
16   - </div>
17   - </div>
18   - </section>
19   - <section class="section--articles section-gray section-space-up" ng-if="pagePropostas.proposals">
20   - <div class="container">
21   - <div id="lista-de-propostas" class="row">
22   - <div class="col-sm-4 col-md-3">
23   - <div ng-if="pagePropostas.themes">
24   - <category-list categories="pagePropostas.themes" selected-category="pagePropostas.selectedTheme" disable-unselect="true"></category-list>
25   - </div>
26   - <div ng-if="pagePropostas.filtredPrograms && pagePropostas.selectedProgram" class="topics-select--wrapper">
27   - <topics-select topics="pagePropostas.filtredPrograms" selected-topic="pagePropostas.selectedProgram"></topics-select>
28   - </div>
29   - <div ng-if="!pagePropostas.themes && pagePropostas.loadingThemes">
30   - <div class="alert alert-info" role="alert">
31   - Carregando temas.
32   - </div>
33   - </div>
34   - <div ng-if="!pagePropostas.themes && pagePropostas.themesError">
35   - <div class="alert alert-danger" role="alert">
36   - Não foi possível carregar a lista de temas neste momento.
37   - </div>
38   - </div>
39   - </div>
40   - <div class="col-sm-8 col-md-9">
41   - <div class="row">
42   - <div class="col-sm-12">
43   - <header class="header">
44   - <h2 style="margin-top:0;">Total de Propostas: "<span>{{pagePropostas.filtredProposals.length}} propostas</span>"</h2>
45   - </header>
46   - </div>
47   - </div>
48   -
49   - <div class="row">
50   - <div class="col-sm-12" ng-if="pagePropostas.proposals">
51   - <proposal-list proposals="pagePropostas.filtredProposals" per-page="10"></proposal-list>
52   - </div>
53   - <div ng-if="!pagePropostas.proposals && pagePropostas.loadingProposals">
54   - <div class="alert alert-info" role="alert">
55   - Carregando propostas.
56   - </div>
57   - </div>
58   - <div ng-if="!pagePropostas.proposals && pagePropostas.proposalsError">
59   - <div class="alert alert-danger" role="alert">
60   - Não foi possível carregar a lista de propostas neste momento.
61   - </div>
62   - </div>
63   - </div>
64   - </div>
65   - </div>
66   - </div>
67   - </section>
68   -</div>
src/app/pages/ranking/ranking.controller.js 0 → 100644
... ... @@ -0,0 +1,240 @@
  1 +(function() {
  2 + 'use strict';
  3 +
  4 + angular
  5 + .module('dialoga')
  6 + .controller('RankingPageController', RankingPageController);
  7 +
  8 + /** @ngInject */
  9 + function RankingPageController(DialogaService, $scope, $location, $filter, $log) {
  10 + var vm = this;
  11 +
  12 + vm.DialogaService = DialogaService;
  13 + vm.$scope = $scope;
  14 + vm.$location = $location;
  15 + vm.$filter = $filter;
  16 + vm.$log = $log;
  17 +
  18 + vm.init();
  19 + vm.loadData();
  20 + // vm.attachListeners(); // attach listeners after load data (SYNC)
  21 +
  22 + $log.debug('RankingPageController');
  23 + }
  24 +
  25 + RankingPageController.prototype.init = function () {
  26 + var vm = this;
  27 +
  28 + vm.page = 1;
  29 + vm.per_page = 3;
  30 + vm.themes = null;
  31 + vm.selectedTheme = null;
  32 + vm.filtredPrograms = null;
  33 + vm.selectedProgram = null;
  34 + vm.proposals = null;
  35 + vm.filtredProposals = null;
  36 + vm.query = null;
  37 + vm.search = vm.$location.search();
  38 +
  39 + vm.loading = null;
  40 + vm.error = null;
  41 + };
  42 +
  43 + RankingPageController.prototype.loadData = function () {
  44 + var vm = this;
  45 +
  46 + vm.loading = true;
  47 +
  48 + // Behaviour:
  49 + // 1. Load themes
  50 + // 2. Select a Random Theme (T)
  51 + // 3. Load programs of T
  52 + // 4. Select a random program of T
  53 + // 5. Filter the list of proposals
  54 + // END.
  55 +
  56 + // 1. Load themes
  57 + vm.loadingThemes = true;
  58 + vm.DialogaService.getThemes(function(themes){
  59 + vm.themes = themes;
  60 + vm.loadingThemes = false;
  61 +
  62 + // 2. Select a Random Theme (T)
  63 + var selectedTheme = null;
  64 + if(vm.search.tema){
  65 +
  66 + // vanilla filter
  67 + var results = vm.themes.filter(function(t){
  68 + return t.slug === vm.search.tema;
  69 + });
  70 +
  71 + if(results && results.length > 0){
  72 + selectedTheme = results[0];
  73 + vm.selectedTheme = selectedTheme;
  74 + }
  75 + }
  76 +
  77 + if(!selectedTheme){
  78 + vm.selectedTheme = vm.themes[Math.floor(Math.random() * vm.themes.length)];
  79 + }
  80 +
  81 + // 3. Load programs of T
  82 + // (AND 4)
  83 + var themeId = vm.selectedTheme.id;
  84 + vm.loadPrograms(themeId, function(){
  85 + vm.loadProposals();
  86 + vm.loading = false;
  87 + });
  88 + }, function (error) {
  89 + vm.error = error;
  90 + vm.$log.error(error);
  91 + vm.loadingThemes = false;
  92 + vm.loading = false;
  93 + });
  94 + };
  95 +
  96 + RankingPageController.prototype.loadPrograms = function (themeId, cb) {
  97 + var vm = this;
  98 +
  99 + vm.DialogaService.getProgramsByThemeId(themeId, function (programs){
  100 +
  101 + vm.filtredPrograms = programs;
  102 +
  103 + // 4. Select a random program of T
  104 + var selectedProgram = null;
  105 + if(vm.search.programa){
  106 +
  107 + // vanilla filter
  108 + var results = vm.filtredPrograms.filter(function(p){
  109 + return p.slug === vm.search.programa;
  110 + });
  111 +
  112 + if(results && results.length > 0){
  113 + selectedProgram = results[0];
  114 + vm.selectedProgram = selectedProgram;
  115 + }
  116 + }
  117 +
  118 + if(!selectedProgram){
  119 + vm.selectedProgram = vm.filtredPrograms[Math.floor(Math.random() * vm.filtredPrograms.length)];
  120 + }
  121 +
  122 + if(cb){
  123 + cb();
  124 + }
  125 + }, function(error){
  126 + vm.$log.error(error);
  127 + if(cb){
  128 + cb();
  129 + }
  130 + });
  131 + };
  132 +
  133 + RankingPageController.prototype.loadProposals = function () {
  134 + var vm = this;
  135 +
  136 + // load Proposals
  137 + vm.loadingProposals = true;
  138 + vm.DialogaService.getProposals({}, function(data){
  139 + vm.proposals = data.articles;
  140 + vm.filtredProposals = vm.proposals;
  141 + vm.loadingProposals = false;
  142 +
  143 + vm.attachListeners();
  144 + }, function (error) {
  145 + vm.error = error;
  146 + vm.$log.error(error);
  147 + vm.loadingProposals = false;
  148 + });
  149 + };
  150 +
  151 + RankingPageController.prototype.attachListeners = function() {
  152 + var vm = this;
  153 +
  154 + vm.$scope.$on('change-selectedCategory', function (event, selectedCategory) {
  155 + vm.selectedTheme = selectedCategory;
  156 + });
  157 +
  158 + vm.$scope.$watch('pageRanking.selectedTheme', function(newValue, oldValue) {
  159 + vm.search.tema = newValue ? newValue.slug : null;
  160 + vm.$location.search('tema', vm.search.tema);
  161 +
  162 + if(vm.selectedTheme && vm.selectedTheme.id){
  163 + vm.loadPrograms(vm.selectedTheme.id, function(){
  164 + vm.filterProposals();
  165 + });
  166 + }
  167 + });
  168 +
  169 + vm.$scope.$on('change-selectedTopic', function (event, selectedTopic) {
  170 + vm.selectedProgram = selectedTopic;
  171 + });
  172 +
  173 + vm.$scope.$watch('pageRanking.selectedProgram', function(newValue, oldValue) {
  174 + vm.search.programa = newValue ? newValue.slug : null;
  175 + vm.$location.search('programa', vm.search.programa);
  176 + vm.filterProposals();
  177 + });
  178 +
  179 + vm.$scope.$watch('pageRanking.query', function(newValue/*, oldValue*/) {
  180 + vm.search.filtro = newValue ? newValue : null;
  181 + vm.$location.search('filtro', vm.search.filtro);
  182 + vm.filterProposals();
  183 + });
  184 + };
  185 +
  186 + RankingPageController.prototype.resetFilterValues = function() {
  187 + var vm = this;
  188 +
  189 + vm.query = null;
  190 + vm.selectedTheme = null;
  191 + };
  192 +
  193 + RankingPageController.prototype.changePage = function(pageIndex) {
  194 + var vm = this;
  195 +
  196 + vm.filterProposals(pageIndex);
  197 + };
  198 +
  199 + RankingPageController.prototype.filterProposals = function(_page, _per_page) {
  200 + var vm = this;
  201 +
  202 + if (vm.loadingProposals){
  203 + vm.$log.debug('Content is not loaded yet.');
  204 + return;
  205 + }
  206 +
  207 + var page = _page || vm.page;
  208 + var per_page = _per_page || vm.per_page;
  209 + var input = vm.proposals;
  210 + var output = input;
  211 + var query = vm.query;
  212 + var selectedTheme = vm.selectedTheme;
  213 + var selectedProgram = vm.selectedProgram;
  214 +
  215 + var filter = vm.$filter('filter');
  216 +
  217 + if (selectedProgram) {
  218 + var params = {
  219 + page: page,
  220 + per_page: per_page,
  221 + parent_id: selectedProgram.id
  222 + };
  223 +
  224 + if (query) {params.query = query; }
  225 +
  226 + vm.loadingProposals = true;
  227 + vm.DialogaService.searchProposals(params, function(data){
  228 + vm.total_proposals = data._obj.headers('total');
  229 + vm.filtredProposals = data.articles;
  230 + vm.loadingProposals = false;
  231 + }, function (error) {
  232 + vm.error = error;
  233 + vm.$log.error(error);
  234 + vm.loadingProposals = false;
  235 + });
  236 + } else {
  237 + vm.filtredProposals = [];
  238 + }
  239 + };
  240 +})();
... ...
src/app/pages/ranking/ranking.html 0 → 100644
... ... @@ -0,0 +1,68 @@
  1 +<div class="container">
  2 + <div class="row">
  3 + <div class="col-sm-12">
  4 + <div ncy-breadcrumb></div>
  5 + </div>
  6 + </div>
  7 +</div>
  8 +
  9 +<div class="page--propostas">
  10 + <section class="section--info">
  11 + <div class="container">
  12 + <div class="row">
  13 + <div class="col-sm-12">
  14 + <h1>Ranking</h1>
  15 + </div>
  16 + </div>
  17 + </div>
  18 + </section>
  19 + <section class="section--articles section-gray section-space-up" ng-if="pageRanking.proposals">
  20 + <div class="container">
  21 + <div id="lista-de-propostas" class="row">
  22 + <div class="col-sm-4 col-md-3">
  23 + <div ng-if="pageRanking.themes">
  24 + <category-list categories="pageRanking.themes" selected-category="pageRanking.selectedTheme" disable-unselect="true"></category-list>
  25 + </div>
  26 + <div ng-if="pageRanking.filtredPrograms && pageRanking.selectedProgram" class="topics-select--wrapper">
  27 + <topics-select topics="pageRanking.filtredPrograms" selected-topic="pageRanking.selectedProgram"></topics-select>
  28 + </div>
  29 + <div ng-if="!pageRanking.themes && pageRanking.loadingThemes">
  30 + <div class="alert alert-info" role="alert">
  31 + Carregando temas.
  32 + </div>
  33 + </div>
  34 + <div ng-if="!pageRanking.themes && pageRanking.themesError">
  35 + <div class="alert alert-danger" role="alert">
  36 + Não foi possível carregar a lista de temas neste momento.
  37 + </div>
  38 + </div>
  39 + </div>
  40 + <div class="col-sm-8 col-md-9">
  41 + <div class="row">
  42 + <div class="col-sm-12">
  43 + <header class="header">
  44 + <h2 style="margin-top:0;">Total de Propostas: "<span>{{pageRanking.total_proposals}} propostas</span>"</h2>
  45 + </header>
  46 + </div>
  47 + </div>
  48 +
  49 + <div class="row">
  50 + <div class="col-sm-12" ng-if="pageRanking.proposals">
  51 + <proposal-list proposals="pageRanking.filtredProposals" per-page="pageRanking.per_page" total="pageRanking.total_proposals" change-page="pageRanking.changePage(pageIndex)"></proposal-list>
  52 + </div>
  53 + <div class="col-sm-12" ng-if="pageRanking.loadingProposals">
  54 + <div class="alert alert-info" role="alert">
  55 + Carregando propostas.
  56 + </div>
  57 + </div>
  58 + <div class="col-sm-12" ng-if="pageRanking.proposalsError">
  59 + <div class="alert alert-danger" role="alert">
  60 + Não foi possível carregar a lista de propostas neste momento.
  61 + </div>
  62 + </div>
  63 + </div>
  64 + </div>
  65 + </div>
  66 + </div>
  67 + </section>
  68 +</div>
... ...
src/assets/images/icons/tema-reducao-da-pobreza-small.png

1.32 KB | W: | H:

1.33 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
src/assets/images/icons/tema-reducao-da-pobreza.png

2.75 KB | W: | H:

2.55 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin