Commit 3d623c6f84709c00edfa48ec563939de9b1ec134
Exists in
master
and in
8 other branches
Merge branch 'merlin' into staging
Showing
30 changed files
with
759 additions
and
202 deletions
Show diff stats
src/app/components/article-service/article.service.js
@@ -19,6 +19,7 @@ | @@ -19,6 +19,7 @@ | ||
19 | getTopics: getTopics, | 19 | getTopics: getTopics, |
20 | getTopicById: getTopicById, | 20 | getTopicById: getTopicById, |
21 | getProposals: getProposals, | 21 | getProposals: getProposals, |
22 | + getProposalById: getProposalById, | ||
22 | getProposalsByTopicId: getProposalsByTopicId, | 23 | getProposalsByTopicId: getProposalsByTopicId, |
23 | getEvents: getEvents, | 24 | getEvents: getEvents, |
24 | subscribeToEvent: subscribeToEvent, | 25 | subscribeToEvent: subscribeToEvent, |
@@ -108,26 +109,18 @@ | @@ -108,26 +109,18 @@ | ||
108 | // }); | 109 | // }); |
109 | 110 | ||
110 | // | 111 | // |
111 | - searchTopics(params, cbSuccess, cbError); | 112 | + searchProposals({ |
113 | + query: '' | ||
114 | + }, cbSuccess, cbError); | ||
112 | } | 115 | } |
113 | 116 | ||
114 | - /** | ||
115 | - * Ex.: /api/v1/articles/[article_id]/children?[params]content_type=ProposalsDiscussionPlugin::Proposal | ||
116 | - * Ex.: /api/v1/articles/103644/children?limit=20&fields=id,name,slug,abstract,created_by&content_type=ProposalsDiscussionPlugin::Proposal | ||
117 | - * | ||
118 | - * @param {Integer} topicId topic where has those proposals | ||
119 | - * @param {Object} params params for pagination ant others | ||
120 | - * @param {Function} cbSuccess callback for success | ||
121 | - * @param {Function} cbError callback for error | ||
122 | - * @return {Array} [description] | ||
123 | - */ | ||
124 | - function getProposalsByTopicId (topicId, params, cbSuccess, cbError) { | ||
125 | - var url = service.apiArticles + topicId + '/children'; | 117 | + function getProposalById (proposalId, params, cbSuccess, cbError) { |
118 | + var url = service.apiArticles + proposalId; | ||
126 | 119 | ||
127 | var paramsExtended = angular.extend({ | 120 | var paramsExtended = angular.extend({ |
128 | // 'fields[]': ['id', 'title', 'abstract', 'children', 'children_count', 'ranking_position', 'hits', 'votes_for', 'votes_against'], | 121 | // 'fields[]': ['id', 'title', 'abstract', 'children', 'children_count', 'ranking_position', 'hits', 'votes_for', 'votes_against'], |
129 | - // 'limit':'20', | ||
130 | // 'per_page':'1', | 122 | // 'per_page':'1', |
123 | + 'limit':'1', | ||
131 | 'content_type':'ProposalsDiscussionPlugin::Proposal' | 124 | 'content_type':'ProposalsDiscussionPlugin::Proposal' |
132 | }, params); | 125 | }, params); |
133 | 126 | ||
@@ -137,6 +130,21 @@ | @@ -137,6 +130,21 @@ | ||
137 | }).catch(function(error){ | 130 | }).catch(function(error){ |
138 | cbError(error); | 131 | cbError(error); |
139 | }); | 132 | }); |
133 | + | ||
134 | + } | ||
135 | + | ||
136 | + /** | ||
137 | + * Ex.: /api/v1/articles/[article_id]/children?[params]content_type=ProposalsDiscussionPlugin::Proposal | ||
138 | + * Ex.: /api/v1/articles/103644/children?limit=20&fields=id,name,slug,abstract,created_by&content_type=ProposalsDiscussionPlugin::Proposal | ||
139 | + * | ||
140 | + * @param {Integer} topicId topic where has those proposals | ||
141 | + * @param {Object} params params for pagination ant others | ||
142 | + * @param {Function} cbSuccess callback for success | ||
143 | + * @param {Function} cbError callback for error | ||
144 | + * @return {Array} [description] | ||
145 | + */ | ||
146 | + function getProposalsByTopicId (topicId, params, cbSuccess, cbError) { | ||
147 | + getProposalById(topicId + '/children', params, cbSuccess, cbError); | ||
140 | } | 148 | } |
141 | 149 | ||
142 | function getEvents (community_id, params, cbSuccess, cbError) { | 150 | function getEvents (community_id, params, cbSuccess, cbError) { |
@@ -156,19 +164,36 @@ | @@ -156,19 +164,36 @@ | ||
156 | }); | 164 | }); |
157 | } | 165 | } |
158 | 166 | ||
159 | - function subscribeToEvent (event_id, params, cbSuccess, cbError) { | ||
160 | - var url = service.apiArticles + event_id + '/follow'; | 167 | + function getSubscribers (event_id, params, cbSuccess, cbError) { |
168 | + var url = service.apiArticles + event_id + '/followers?_=' + new Date().getTime(); | ||
161 | var paramsExtended = angular.extend({ | 169 | var paramsExtended = angular.extend({ |
162 | - private_token: API.token | 170 | + // 'fields[]': ['id', 'slug', 'title', 'abstract', 'body', 'categories', 'created_at', 'start_date', 'end_date', 'hits'], |
171 | + 'content_type':'Event' | ||
163 | }, params); | 172 | }, params); |
164 | 173 | ||
165 | - UtilService.post(url, {params: paramsExtended}).then(function(data){ | 174 | + UtilService.get(url, {params: paramsExtended}).then(function(data){ |
166 | cbSuccess(data.articles); | 175 | cbSuccess(data.articles); |
167 | }).catch(function(error){ | 176 | }).catch(function(error){ |
168 | cbError(error); | 177 | cbError(error); |
169 | }); | 178 | }); |
170 | } | 179 | } |
171 | 180 | ||
181 | + function subscribeToEvent (event_id, params, cbSuccess, cbError) { | ||
182 | + | ||
183 | + if(!$rootScope.currentUser){ | ||
184 | + cbError({message: 'Usuário não logado.'}); | ||
185 | + } | ||
186 | + | ||
187 | + var url = service.apiArticles + event_id + '/follow'; | ||
188 | + var encodedParams = 'private_token=' + $rootScope.currentUser.private_token; | ||
189 | + | ||
190 | + UtilService.post(url, encodedParams).then(function(response){ | ||
191 | + cbSuccess(response); | ||
192 | + }).catch(function(error){ | ||
193 | + cbError(error); | ||
194 | + }); | ||
195 | + } | ||
196 | + | ||
172 | function searchTopics (params, cbSuccess, cbError) { | 197 | function searchTopics (params, cbSuccess, cbError) { |
173 | // Ex.: /api/v1/search/article?type=ProposalsDiscussionPlugin::Topic&query=cisternas | 198 | // Ex.: /api/v1/search/article?type=ProposalsDiscussionPlugin::Topic&query=cisternas |
174 | var url = '/api/v1/search/article'; | 199 | var url = '/api/v1/search/article'; |
@@ -188,11 +213,13 @@ | @@ -188,11 +213,13 @@ | ||
188 | // Ex.: /api/v1/search/article?type=ProposalsDiscussionPlugin::Proposal&query=cisternas | 213 | // Ex.: /api/v1/search/article?type=ProposalsDiscussionPlugin::Proposal&query=cisternas |
189 | var url = '/api/v1/search/article'; | 214 | var url = '/api/v1/search/article'; |
190 | var paramsExtended = angular.extend({ | 215 | var paramsExtended = angular.extend({ |
191 | - 'fields[]': ['id', 'title', 'slug', 'abstract', 'categories', 'setting', 'children_count', 'hits'], | 216 | + // 'fields[]': ['id', 'title', 'slug', 'abstract', 'categories', 'setting', 'children_count', 'hits'], |
192 | 'type': 'ProposalsDiscussionPlugin::Proposal' | 217 | 'type': 'ProposalsDiscussionPlugin::Proposal' |
193 | }, params); | 218 | }, params); |
194 | 219 | ||
195 | UtilService.get(url, {params: paramsExtended}).then(function(data){ | 220 | UtilService.get(url, {params: paramsExtended}).then(function(data){ |
221 | + _pipeInjectSlugIntoParentProgram(data); | ||
222 | + _pipeSortByRankinPosition(data); | ||
196 | cbSuccess(data); | 223 | cbSuccess(data); |
197 | }).catch(function(error){ | 224 | }).catch(function(error){ |
198 | cbError(error); | 225 | cbError(error); |
@@ -200,6 +227,9 @@ | @@ -200,6 +227,9 @@ | ||
200 | } | 227 | } |
201 | 228 | ||
202 | function _pipeInjectSlugIntoParentProgram(data){ | 229 | function _pipeInjectSlugIntoParentProgram(data){ |
230 | + if(!data.articles && data.article){ | ||
231 | + data.articles = [data.article]; | ||
232 | + } | ||
203 | var proposals = data.articles; | 233 | var proposals = data.articles; |
204 | for (var i = proposals.length - 1; i >= 0; i--) { | 234 | for (var i = proposals.length - 1; i >= 0; i--) { |
205 | var proposal = proposals[i]; | 235 | var proposal = proposals[i]; |
@@ -208,5 +238,14 @@ | @@ -208,5 +238,14 @@ | ||
208 | } | 238 | } |
209 | } | 239 | } |
210 | } | 240 | } |
241 | + | ||
242 | + function _pipeSortByRankinPosition(data){ | ||
243 | + if(!data.articles && data.article){ | ||
244 | + data.articles = [data.article]; | ||
245 | + } | ||
246 | + data.articles = data.articles.sort(function(pA, pB){ | ||
247 | + return pA.ranking_position - pB.ranking_position; | ||
248 | + }); | ||
249 | + } | ||
211 | } | 250 | } |
212 | })(); | 251 | })(); |
src/app/components/auth-user/auth-user.directive.js
src/app/components/auth/auth.service.js
@@ -130,6 +130,7 @@ | @@ -130,6 +130,7 @@ | ||
130 | $log.debug('AuthService.login [SUCCESS] response', response); | 130 | $log.debug('AuthService.login [SUCCESS] response', response); |
131 | 131 | ||
132 | var currentUser = Session.create(response.data); | 132 | var currentUser = Session.create(response.data); |
133 | + $rootScope.currentUser = currentUser; | ||
133 | 134 | ||
134 | $rootScope.$broadcast(AUTH_EVENTS.loginSuccess, currentUser); | 135 | $rootScope.$broadcast(AUTH_EVENTS.loginSuccess, currentUser); |
135 | return currentUser; | 136 | return currentUser; |
@@ -142,7 +143,7 @@ | @@ -142,7 +143,7 @@ | ||
142 | function logout () { | 143 | function logout () { |
143 | 144 | ||
144 | Session.destroy(); | 145 | Session.destroy(); |
145 | - | 146 | + $rootScope.currentUser = null; |
146 | $rootScope.$broadcast(AUTH_EVENTS.logoutSuccess); | 147 | $rootScope.$broadcast(AUTH_EVENTS.logoutSuccess); |
147 | } | 148 | } |
148 | 149 |
src/app/components/category-list/category-list.directive.js
@@ -65,7 +65,7 @@ | @@ -65,7 +65,7 @@ | ||
65 | templateUrl: 'app/components/category-list/category-list.html', | 65 | templateUrl: 'app/components/category-list/category-list.html', |
66 | scope: { | 66 | scope: { |
67 | categories: '=', | 67 | categories: '=', |
68 | - selectedCategory: '@' | 68 | + selectedCategory: '=' |
69 | }, | 69 | }, |
70 | controller: CategoryListController, | 70 | controller: CategoryListController, |
71 | controllerAs: 'vm', | 71 | controllerAs: 'vm', |
src/app/components/category-list/category-list.html
@@ -15,7 +15,8 @@ | @@ -15,7 +15,8 @@ | ||
15 | <span class="category-list--icon-circle" aria-hidden="true" ng-class="category.slug"></span> | 15 | <span class="category-list--icon-circle" aria-hidden="true" ng-class="category.slug"></span> |
16 | <span class="category-list--icon icon" aria-hidden="true" ng-class="'icon-tema-' + category.slug"></span> | 16 | <span class="category-list--icon icon" aria-hidden="true" ng-class="'icon-tema-' + category.slug"></span> |
17 | <span class="category-list--label">{{::category.name}}</span> | 17 | <span class="category-list--label">{{::category.name}}</span> |
18 | - <span class="category-list--icon--right glyphicon glyphicon-chevron-right hidden-xs"></span> | 18 | + <span class="category-list--icon--right glyphicon glyphicon-chevron-right hidden-xs" ng-hide="vm.selectedCategory.slug === category.slug"></span> |
19 | + <span class="category-list--icon--right glyphicon glyphicon-remove hidden-xs" ng-show="vm.selectedCategory.slug === category.slug"></span> | ||
19 | </button> | 20 | </button> |
20 | </div> | 21 | </div> |
21 | </nav> | 22 | </nav> |
src/app/components/event-list/event-list.directive.js
@@ -8,11 +8,12 @@ | @@ -8,11 +8,12 @@ | ||
8 | /** @ngInject */ | 8 | /** @ngInject */ |
9 | function eventList() { | 9 | function eventList() { |
10 | /** @ngInject */ | 10 | /** @ngInject */ |
11 | - function EventListController($scope, $rootScope, $state, $log) { | 11 | + function EventListController(ArticleService, $scope, $rootScope, $state, $log) { |
12 | $log.debug('EventListController'); | 12 | $log.debug('EventListController'); |
13 | 13 | ||
14 | var vm = this; | 14 | var vm = this; |
15 | 15 | ||
16 | + vm.ArticleService = ArticleService; | ||
16 | vm.$scope = $scope; | 17 | vm.$scope = $scope; |
17 | vm.$rootScope = $rootScope; | 18 | vm.$rootScope = $rootScope; |
18 | vm.$state = $state; | 19 | vm.$state = $state; |
@@ -39,10 +40,26 @@ | @@ -39,10 +40,26 @@ | ||
39 | vm.isCollapsed = !vm.isCollapsed; | 40 | vm.isCollapsed = !vm.isCollapsed; |
40 | }; | 41 | }; |
41 | 42 | ||
42 | - EventListController.prototype.subscribe = function (data) { | 43 | + EventListController.prototype.subscribe = function (event_id) { |
43 | var vm = this; | 44 | var vm = this; |
44 | 45 | ||
45 | - vm.$log.debug('data', data); | 46 | + vm.$log.debug('event_id', event_id); |
47 | + | ||
48 | + if(!vm.$rootScope.currentUser){ | ||
49 | + vm.$log.warn('User is not logged in. Redirect to Auth page.'); | ||
50 | + vm.$state.go('entrar',{ | ||
51 | + redirect_uri: 'state=inicio&task=subscribe&event_id=' + event_id | ||
52 | + },{ | ||
53 | + location: true | ||
54 | + }); | ||
55 | + }else{ | ||
56 | + vm.ArticleService.subscribeToEvent(event_id, {}, function(response){ | ||
57 | + vm.$log.debug('response', response); | ||
58 | + }, function(error){ | ||
59 | + vm.$log.debug('error', error); | ||
60 | + }) | ||
61 | + } | ||
62 | + | ||
46 | }; | 63 | }; |
47 | 64 | ||
48 | var directive = { | 65 | var directive = { |
src/app/components/event-list/event-list.html
@@ -59,12 +59,14 @@ | @@ -59,12 +59,14 @@ | ||
59 | <span class="theme">{{::event.categories[0].name}}</span> | 59 | <span class="theme">{{::event.categories[0].name}}</span> |
60 | </td> | 60 | </td> |
61 | <td align="right"> | 61 | <td align="right"> |
62 | - <b>(?)</b> | ||
63 | - <br/> | ||
64 | - <span>Inscritos</span> | 62 | + <div ng-if="event.followers_count > 0"> |
63 | + <b>{{::event.followers_count}}</b> | ||
64 | + <br/> | ||
65 | + <span>Inscritos</span> | ||
66 | + </div> | ||
65 | </td> | 67 | </td> |
66 | <td align="left"> | 68 | <td align="left"> |
67 | - <button type="button" class="btn color-theme-common-bg" ng-click="vm.subscribe('EVENT_ID')"> | 69 | + <button type="button" class="btn color-theme-common-bg" ng-click="vm.subscribe(event.id)"> |
68 | Inscreva-se | 70 | Inscreva-se |
69 | <span class="sr-only">no bate-papo com (ministro) no dia {event.start_date | date : "dd/MM/yyyy"}} as {{event.start_date | date : "HH:mm"}} horas</span> | 71 | <span class="sr-only">no bate-papo com (ministro) no dia {event.start_date | date : "dd/MM/yyyy"}} as {{event.start_date | date : "HH:mm"}} horas</span> |
70 | </button> | 72 | </button> |
src/app/components/navbar/navbar.html
@@ -22,7 +22,7 @@ | @@ -22,7 +22,7 @@ | ||
22 | <li ui-sref-active="active"><a ui-sref="duvidas">Dúvidas</a></li> | 22 | <li ui-sref-active="active"><a ui-sref="duvidas">Dúvidas</a></li> |
23 | <li role="separator" class="divider hidden-xs hidden-sm"><span>|</span></li> | 23 | <li role="separator" class="divider hidden-xs hidden-sm"><span>|</span></li> |
24 | <li class="dropdown"> | 24 | <li class="dropdown"> |
25 | - <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Compartilhar <span class="icon icon-social-share-small"></span></a> | 25 | + <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Compartilhar <span aria-hidden="true" class="icon icon-social-share-small"></span></a> |
26 | <social-share class="dropdown-menu dropdown-menu-right"></social-share> | 26 | <social-share class="dropdown-menu dropdown-menu-right"></social-share> |
27 | <!-- <ul class="dropdown-menu dropdown-menu-right dropdown-menu-social"> | 27 | <!-- <ul class="dropdown-menu dropdown-menu-right dropdown-menu-social"> |
28 | <li> | 28 | <li> |
src/app/components/proposal-box/proposal-box.directive.js
@@ -24,14 +24,16 @@ | @@ -24,14 +24,16 @@ | ||
24 | var vm = this; | 24 | var vm = this; |
25 | 25 | ||
26 | if (!vm.vote) { vm.vote = false; } | 26 | if (!vm.vote) { vm.vote = false; } |
27 | + if (!vm.focus) { vm.focus = false; } | ||
27 | 28 | ||
28 | }; | 29 | }; |
29 | 30 | ||
30 | - ProposalBoxController.prototype.showContent2 = function (topic) { | 31 | + ProposalBoxController.prototype.showContent = function (slug) { |
31 | var vm = this; | 32 | var vm = this; |
32 | 33 | ||
33 | vm.$state.go('programa-conteudo', { | 34 | vm.$state.go('programa-conteudo', { |
34 | - slug: topic.slug | 35 | + slug: slug, |
36 | + proposal_id: vm.proposal.id | ||
35 | }, { | 37 | }, { |
36 | location: true | 38 | location: true |
37 | }); | 39 | }); |
@@ -44,7 +46,11 @@ | @@ -44,7 +46,11 @@ | ||
44 | proposal: '=', | 46 | proposal: '=', |
45 | topic: '=', | 47 | topic: '=', |
46 | category: '=', | 48 | category: '=', |
47 | - vote: '=' | 49 | + vote: '=', |
50 | + focus: '@' | ||
51 | + // @ -> Text binding / one-way binding | ||
52 | + // = -> Direct model binding / two-way binding | ||
53 | + // & -> Behaviour binding / Method binding | ||
48 | }, | 54 | }, |
49 | controller: ProposalBoxController, | 55 | controller: ProposalBoxController, |
50 | controllerAs: 'vm', | 56 | controllerAs: 'vm', |
src/app/components/proposal-box/proposal-box.html
1 | -<div class="proposal-box" ng-class="[{'focus': vm.isFocused}, vm.category.slug]"> | 1 | +<div class="proposal-box" ng-class="[{'focus': vm.focus}, vm.category.slug]"> |
2 | <div class="proposal-box--top"> | 2 | <div class="proposal-box--top"> |
3 | <div class="proposal-box--theme color-theme-bg-darker">{{::vm.category.name}}</div> | 3 | <div class="proposal-box--theme color-theme-bg-darker">{{::vm.category.name}}</div> |
4 | <div class="proposal-box--program color-theme-bg">{{::vm.topic.title}}</div> | 4 | <div class="proposal-box--program color-theme-bg">{{::vm.topic.title}}</div> |
5 | </div> | 5 | </div> |
6 | <div class="proposal-box--middle"> | 6 | <div class="proposal-box--middle"> |
7 | <div class="proposal-box--content"> | 7 | <div class="proposal-box--content"> |
8 | - <div class="proposal-box--content-inner" ng-bind-html="vm.proposal.abstract"></div> | 8 | + <div class="proposal-box--content-inner">{{::vm.proposal.abstract}}</div> |
9 | </div> | 9 | </div> |
10 | - <div ng-show="!vm.vote" class="proposal-box--join"> | ||
11 | - <button class="btn btn-link" ng-click="vm.showContent2(vm.topic)">Participe</button> | 10 | + <div ng-hide="vm.vote" class="proposal-box--join"> |
11 | + <button class="btn btn-link color-theme-common-fg" ng-click="vm.showContent(vm.topic.slug)"> | ||
12 | + Participe | ||
13 | + <span class="glyphicon glyphicon-menu-right color-theme-common-fg" aria-hidde="true"></span> | ||
14 | + </button> | ||
12 | </div> | 15 | </div> |
13 | <div ng-show="vm.vote"class="proposal-box--actions text-center"> | 16 | <div ng-show="vm.vote"class="proposal-box--actions text-center"> |
14 | <div class="row"> | 17 | <div class="row"> |
@@ -43,7 +46,7 @@ | @@ -43,7 +46,7 @@ | ||
43 | <div class="proposal-box--share"> | 46 | <div class="proposal-box--share"> |
44 | <span>COMPARTILHE ESSA <b>PROPOSTA</b></span> | 47 | <span>COMPARTILHE ESSA <b>PROPOSTA</b></span> |
45 | <div class="dropdown"> | 48 | <div class="dropdown"> |
46 | - <button id="dropdown-share-btn" class="btn btn-link dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span class="icon icon-social-share-small" aria-hidden="true"></span></button> | 49 | + <button id="dropdown-share-btn" class="btn btn-link dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" aria-label="Mostrar ou esconder a lista redes sociais para compartilhamento"><span class="icon icon-social-share-small" aria-hidden="true"></span></button> |
47 | <social-share class="dropdown-menu dropdown-menu-right"></social-share> | 50 | <social-share class="dropdown-menu dropdown-menu-right"></social-share> |
48 | </div> | 51 | </div> |
49 | </div> | 52 | </div> |
src/app/components/proposal-box/proposal-box.scss
@@ -2,6 +2,7 @@ | @@ -2,6 +2,7 @@ | ||
2 | background-color: #f1f1f1; | 2 | background-color: #f1f1f1; |
3 | border-radius: 5px; | 3 | border-radius: 5px; |
4 | // overflow: hidden; | 4 | // overflow: hidden; |
5 | + margin-bottom: 20px; | ||
5 | 6 | ||
6 | &.focus { | 7 | &.focus { |
7 | border: 7px solid #000; | 8 | border: 7px solid #000; |
@@ -20,6 +21,14 @@ | @@ -20,6 +21,14 @@ | ||
20 | 21 | ||
21 | &--middle { | 22 | &--middle { |
22 | padding: 30px; | 23 | padding: 30px; |
24 | + min-height: 180px; | ||
25 | + | ||
26 | + // position: relative; | ||
27 | + // .proposal-box--join { | ||
28 | + // position: absolute; | ||
29 | + // bottom: 10px; | ||
30 | + // left: 30px; | ||
31 | + // } | ||
23 | } | 32 | } |
24 | 33 | ||
25 | &--bottom { | 34 | &--bottom { |
@@ -56,17 +65,27 @@ | @@ -56,17 +65,27 @@ | ||
56 | margin-top: 10px; | 65 | margin-top: 10px; |
57 | } | 66 | } |
58 | 67 | ||
68 | + .proposal-box--join { | ||
69 | + .btn { | ||
70 | + font-weight: bold; | ||
71 | + } | ||
72 | + } | ||
73 | + | ||
74 | + .action { | ||
75 | + .glyphicon { | ||
76 | + color: #fff; | ||
77 | + } | ||
78 | + } | ||
79 | + | ||
59 | .dropdown { | 80 | .dropdown { |
60 | display: inline-block; | 81 | display: inline-block; |
61 | } | 82 | } |
83 | + | ||
62 | .dropdown-menu { | 84 | .dropdown-menu { |
63 | padding: 0; | 85 | padding: 0; |
64 | margin: 0; | 86 | margin: 0; |
65 | } | 87 | } |
66 | 88 | ||
67 | - .glyphicon { | ||
68 | - color: #fff; | ||
69 | - } | ||
70 | .icon-circle { | 89 | .icon-circle { |
71 | cursor: pointer; | 90 | cursor: pointer; |
72 | 91 |
src/app/components/proposal-grid/proposal-grid.directive.js
@@ -22,7 +22,6 @@ | @@ -22,7 +22,6 @@ | ||
22 | vm.$location = $location; | 22 | vm.$location = $location; |
23 | vm.$filter = $filter; | 23 | vm.$filter = $filter; |
24 | vm.$log = $log; | 24 | vm.$log = $log; |
25 | - vm.defaultLimit = 6; | ||
26 | 25 | ||
27 | // initialization | 26 | // initialization |
28 | vm.init(); | 27 | vm.init(); |
@@ -30,8 +29,7 @@ | @@ -30,8 +29,7 @@ | ||
30 | } | 29 | } |
31 | 30 | ||
32 | ProposalGridController.prototype.init = function() { | 31 | ProposalGridController.prototype.init = function() { |
33 | - // var vm = this; | ||
34 | - // vm.programs = null; // scope var | 32 | + var vm = this; |
35 | }; | 33 | }; |
36 | 34 | ||
37 | ProposalGridController.prototype.attachListeners = function() { | 35 | ProposalGridController.prototype.attachListeners = function() { |
src/app/components/proposal-list/proposal-list.directive.js
@@ -2,26 +2,27 @@ | @@ -2,26 +2,27 @@ | ||
2 | 'use strict'; | 2 | 'use strict'; |
3 | 3 | ||
4 | angular | 4 | angular |
5 | - .module('dialoga') | ||
6 | - .directive('proposalList', proposalList); | 5 | + .module('dialoga') |
6 | + .directive('proposalList', proposalList); | ||
7 | 7 | ||
8 | /** @ngInject */ | 8 | /** @ngInject */ |
9 | function proposalList() { | 9 | function proposalList() { |
10 | 10 | ||
11 | /** @ngInject */ | 11 | /** @ngInject */ |
12 | - function ProposalListController(ArticleService, $scope, $element, $timeout, $log) { | 12 | + function ProposalListController(ArticleService, $state, $scope, $element, $timeout, $log) { |
13 | $log.debug('ProposalListController'); | 13 | $log.debug('ProposalListController'); |
14 | 14 | ||
15 | var vm = this; | 15 | var vm = this; |
16 | vm.ArticleService = ArticleService; | 16 | vm.ArticleService = ArticleService; |
17 | + vm.$state = $state; | ||
17 | vm.$scope = $scope; | 18 | vm.$scope = $scope; |
18 | vm.$element = $element; | 19 | vm.$element = $element; |
19 | vm.$timeout = $timeout; | 20 | vm.$timeout = $timeout; |
20 | vm.$log = $log; | 21 | vm.$log = $log; |
21 | 22 | ||
22 | vm.init(); | 23 | vm.init(); |
23 | - | ||
24 | vm.loadData(); | 24 | vm.loadData(); |
25 | + vm.attachListeners(); | ||
25 | } | 26 | } |
26 | 27 | ||
27 | ProposalListController.prototype.init = function () { | 28 | ProposalListController.prototype.init = function () { |
@@ -36,9 +37,27 @@ | @@ -36,9 +37,27 @@ | ||
36 | vm.per_page = 5; | 37 | vm.per_page = 5; |
37 | } | 38 | } |
38 | 39 | ||
40 | + vm.initPorposalList(); | ||
41 | + }; | ||
42 | + | ||
43 | + ProposalListController.prototype.initPorposalList = function () { | ||
44 | + var vm = this; | ||
45 | + | ||
46 | + vm.currentPageIndex = 0; | ||
47 | + | ||
39 | vm.proposalsPerPage = vm.getProposalsPerPage(0); | 48 | vm.proposalsPerPage = vm.getProposalsPerPage(0); |
40 | 49 | ||
41 | vm.proposalsLength = vm.proposals.length; | 50 | vm.proposalsLength = vm.proposals.length; |
51 | + | ||
52 | + | ||
53 | + if ((vm.proposalsLength % vm.per_page) === 0) { | ||
54 | + vm.pages = vm.proposalsLength / vm.per_page; | ||
55 | + } else{ | ||
56 | + vm.pages = (vm.proposalsLength / vm.per_page) + 1; | ||
57 | + } | ||
58 | + | ||
59 | + // vm.arraypages = new Array(Math.ceil(vm.pages)); | ||
60 | + vm.arraypages = new Array(Math.floor(vm.pages)); | ||
42 | }; | 61 | }; |
43 | 62 | ||
44 | ProposalListController.prototype.loadData = function () { | 63 | ProposalListController.prototype.loadData = function () { |
@@ -51,6 +70,14 @@ | @@ -51,6 +70,14 @@ | ||
51 | }, 1000); | 70 | }, 1000); |
52 | }; | 71 | }; |
53 | 72 | ||
73 | + ProposalListController.prototype.attachListeners = function () { | ||
74 | + var vm = this; | ||
75 | + | ||
76 | + vm.$scope.$watch('vm.proposals', function(/*newValue, oldValue*/) { | ||
77 | + vm.initPorposalList(); | ||
78 | + }); | ||
79 | + }; | ||
80 | + | ||
54 | ProposalListController.prototype.getProposalsPerPage = function (pageIndex) { | 81 | ProposalListController.prototype.getProposalsPerPage = function (pageIndex) { |
55 | var vm = this; | 82 | var vm = this; |
56 | 83 | ||
@@ -62,7 +89,28 @@ | @@ -62,7 +89,28 @@ | ||
62 | 89 | ||
63 | ProposalListController.prototype.showPage = function (pageIndex) { | 90 | ProposalListController.prototype.showPage = function (pageIndex) { |
64 | var vm = this; | 91 | var vm = this; |
92 | + | ||
93 | + if (pageIndex < 0) { | ||
94 | + pageIndex = 0; | ||
95 | + } | ||
96 | + | ||
97 | + if (pageIndex > (vm.arraypages.length-1)) { | ||
98 | + pageIndex = vm.arraypages.length-1; | ||
99 | + } | ||
100 | + | ||
65 | vm.proposalsPerPage = vm.getProposalsPerPage(pageIndex); | 101 | vm.proposalsPerPage = vm.getProposalsPerPage(pageIndex); |
102 | + vm.currentPageIndex = pageIndex; | ||
103 | + }; | ||
104 | + | ||
105 | + ProposalListController.prototype.showContent = function (proposal) { | ||
106 | + var vm = this; | ||
107 | + | ||
108 | + vm.$state.go('programa-conteudo', { | ||
109 | + slug: proposal.parent.slug, | ||
110 | + proposal_id: proposal.id | ||
111 | + }, { | ||
112 | + location: true | ||
113 | + }); | ||
66 | }; | 114 | }; |
67 | 115 | ||
68 | function attachPopover(){ | 116 | function attachPopover(){ |
src/app/components/proposal-list/proposal-list.html
1 | <div class="proposal-list"> | 1 | <div class="proposal-list"> |
2 | - <div class="table-responsive" ng-if="vm.loading"> | ||
3 | - <div class="table-responsive">Carregando...</div> | ||
4 | - </div> | ||
5 | - <div class="table-responsive" ng-if="!vm.loading && vm.proposalsPerPage"> | ||
6 | - <table class="table table-striped"> | ||
7 | - <thead> | ||
8 | - <tr> | ||
9 | - <th> | ||
10 | - Colocação | ||
11 | - <a tabindex="0" class="btn btn-link btn-question" role="button" data-toggle="popover" data-trigger="focus">?</a> | ||
12 | - </th> | ||
13 | - <th>{{vm.proposals.length}} PROPOSTAS</th> | ||
14 | - </tr> | ||
15 | - </thead> | ||
16 | - <tbody> | ||
17 | - <tr ng-repeat="proposal in vm.proposalsPerPage"> | ||
18 | - <td class="color-theme-fg"> | ||
19 | - <span class="position">{{::($index+1)}}º</span> | ||
20 | - </td> | ||
21 | - <td> | ||
22 | - <div class="row"> | ||
23 | - <div class="col-xs-12"> | ||
24 | - <div class="abstract" ng-bind-html="proposal.abstract"></div> | ||
25 | - </div> | ||
26 | - </div> | ||
27 | - <div class="row row-actions"> | ||
28 | - <div class="col-md-9"> | ||
29 | - <button type="button" class="btn btn-link btn-rate color-theme-common-fg"> | ||
30 | - Avalie esta proposta | ||
31 | - <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span> | ||
32 | - </button> | ||
33 | - </div> | ||
34 | - <div class="col-md-3"> | ||
35 | - <proposal-stats views="{{::proposal.hits}}" up="{{::proposal.votes_for}}" down="{{::proposal.votes_against}}"></proposal-stats> | ||
36 | - </div> | ||
37 | - </div> | ||
38 | - </td> | ||
39 | - </tr> | ||
40 | - </tbody> | ||
41 | - </table> | ||
42 | - <nav> | ||
43 | - <ul class="pagination"> | ||
44 | - <li> | ||
45 | - <a href="#" aria-label="Previous"> | ||
46 | - <span aria-hidden="true">«</span> | ||
47 | - </a> | ||
48 | - </li> | ||
49 | - <li><a href="#" ng-click="vm.showPage(1)">1</a></li> | ||
50 | - <li><a href="#" ng-click="vm.showPage(2)">2</a></li> | ||
51 | - <li><a href="#" ng-click="vm.showPage(3)">3</a></li> | ||
52 | - <li><a href="#" ng-click="vm.showPage(4)">4</a></li> | ||
53 | - <li><a href="#" ng-click="vm.showPage(5)">5</a></li> | ||
54 | - <li> | ||
55 | - <a href="#" aria-label="Next"> | ||
56 | - <span aria-hidden="true">»</span> | ||
57 | - </a> | ||
58 | - </li> | ||
59 | - </ul> | ||
60 | - </nav> | ||
61 | - </div> | 2 | + <div class="table-responsive" ng-if="vm.loading"> |
3 | + <div class="table-responsive">Carregando...</div> | ||
4 | + </div> | ||
5 | + <div class="table-responsive" ng-if="!vm.loading && vm.proposalsPerPage"> | ||
6 | + <table class="table table-striped"> | ||
7 | + <thead> | ||
8 | + <tr> | ||
9 | + <th> | ||
10 | + Colocação | ||
11 | + <a tabindex="0" class="btn btn-link btn-question" role="button" data-toggle="popover" data-trigger="focus">?</a> | ||
12 | + </th> | ||
13 | + <th>{{vm.proposals.length}} PROPOSTAS</th> | ||
14 | + </tr> | ||
15 | + </thead> | ||
16 | + <tbody> | ||
17 | + <tr ng-repeat="proposal in vm.proposalsPerPage"> | ||
18 | + <td class="color-theme-fg"> | ||
19 | + <span class="position">{{::proposal.ranking_position}}º</span> | ||
20 | + </td> | ||
21 | + <td> | ||
22 | + <div class="row"> | ||
23 | + <div class="col-xs-12"> | ||
24 | + <div class="abstract" ng-bind-html="proposal.abstract"></div> | ||
25 | + </div> | ||
26 | + </div> | ||
27 | + <div class="row row-actions"> | ||
28 | + <div class="col-md-8"> | ||
29 | + <button type="button" class="btn btn-link btn-rate color-theme-common-fg" ng-click="vm.showContent(proposal)"> | ||
30 | + Avalie esta proposta | ||
31 | + <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span> | ||
32 | + </button> | ||
33 | + </div> | ||
34 | + <div class="col-md-4"> | ||
35 | + <proposal-stats class="text-right" views="{{::proposal.hits}}" up="{{::proposal.votes_for}}" down="{{::proposal.votes_against}}"></proposal-stats> | ||
36 | + </div> | ||
37 | + </div> | ||
38 | + </td> | ||
39 | + </tr> | ||
40 | + </tbody> | ||
41 | + </table> | ||
42 | + <nav> | ||
43 | + <ul class="pagination"> | ||
44 | + <li ng-class="{ 'disabled' : vm.currentPageIndex == 0}"> | ||
45 | + <a class="btn-pagination" href="#" aria-label="Previous" ng-click="vm.showPage(vm.currentPageIndex-1)"> | ||
46 | + <span aria-hidden="true" class="glyphicon glyphicon-chevron-left pagination-icon"></span> | ||
47 | + </a> | ||
48 | + </li> | ||
49 | + <li ng-repeat="paginas in vm.arraypages track by $index" ng-class="{ 'active' : ($index) == vm.currentPageIndex }" > | ||
50 | + <a class="btn-pagination" href="#" ng-click="vm.showPage($index)">{{::($index)+1}}</a> | ||
51 | + </li> | ||
52 | + <li ng-class="{ 'disabled' : vm.currentPageIndex == (vm.arraypages.length -1)}"> | ||
53 | + <a class="btn-pagination" href="#" aria-label="Next" ng-click="vm.showPage(vm.currentPageIndex+1)"> | ||
54 | + <span aria-hidden="true" class="glyphicon glyphicon-chevron-right pagination-icon"></span> | ||
55 | + </a> | ||
56 | + </li> | ||
57 | + </ul> | ||
58 | + </nav> | ||
59 | + </div> | ||
62 | </div> | 60 | </div> |
src/app/components/proposal-list/proposal-list.scss
@@ -79,4 +79,42 @@ | @@ -79,4 +79,42 @@ | ||
79 | background-color: #eaeaea; | 79 | background-color: #eaeaea; |
80 | } | 80 | } |
81 | } | 81 | } |
82 | + | ||
83 | + .btn-pagination { | ||
84 | + background-color: transparent; | ||
85 | + border: none; | ||
86 | + border-radius: 100%; | ||
87 | + font-weight: bold; | ||
88 | + font-size: 20px; | ||
89 | + padding: 0px 8px; | ||
90 | + width: 28px; | ||
91 | + height: 28px; | ||
92 | + text-decoration: underline; | ||
93 | + color: $defaultblue; | ||
94 | + } | ||
95 | + | ||
96 | + .pagination-icon { | ||
97 | + color: $defaultblue; | ||
98 | + } | ||
99 | + | ||
100 | + .pagination > .active > a, | ||
101 | + .pagination > .active > a:hover, | ||
102 | + .pagination > .active > a:focus, | ||
103 | + .pagination > .active > span, | ||
104 | + .pagination > .active > span:hover, | ||
105 | + .pagination > .active > span:focus { | ||
106 | + background-color: $defaultblue; | ||
107 | + text-decoration: none; | ||
108 | + | ||
109 | + } | ||
110 | + | ||
111 | + .pagination > .disabled > span, | ||
112 | + .pagination > .disabled > span:hover, | ||
113 | + .pagination > .disabled > span:focus, | ||
114 | + .pagination > .disabled > a, | ||
115 | + .pagination > .disabled > a:hover, | ||
116 | + .pagination > .disabled > a:focus { | ||
117 | + background-color: transparent; | ||
118 | + } | ||
119 | + | ||
82 | } | 120 | } |
src/app/components/social-share/social-share.html
1 | <ul class="social-share list-inline"> | 1 | <ul class="social-share list-inline"> |
2 | <li> | 2 | <li> |
3 | - <a socialshare | 3 | + <a href="#" role="button" |
4 | + socialshare | ||
4 | socialshare-provider="facebook" | 5 | socialshare-provider="facebook" |
5 | socialshare-url="http://dialoga.gov.br" | 6 | socialshare-url="http://dialoga.gov.br" |
6 | socialshare-text="Conheça o Dialoga Brasil. Dialoga Brasil | O País fica melhor quando VOCÊ PARTICIPA." | 7 | socialshare-text="Conheça o Dialoga Brasil. Dialoga Brasil | O País fica melhor quando VOCÊ PARTICIPA." |
7 | title="Compartilhar no Facebook"> | 8 | title="Compartilhar no Facebook"> |
8 | - <span class="icon-circle icon-small icon-circle-social-facebook"><span class="icon icon-social-facebook"></span></span> | 9 | + <span aria-hidden="true" class="icon-circle icon-small icon-circle-social-facebook"><span class="icon icon-social-facebook"></span></span> |
9 | <span class="sr-only">Compartilhar no Facebook</span> | 10 | <span class="sr-only">Compartilhar no Facebook</span> |
10 | </a> | 11 | </a> |
11 | </li> | 12 | </li> |
12 | <li> | 13 | <li> |
13 | - <a socialshare | 14 | + <a href="#" role="button" |
15 | + socialshare | ||
14 | socialshare-provider="twitter" | 16 | socialshare-provider="twitter" |
15 | socialshare-url="http://dialoga.gov.br" | 17 | socialshare-url="http://dialoga.gov.br" |
16 | socialshare-text="Conheça o Dialoga Brasil. Dialoga Brasil | O País fica melhor quando VOCÊ PARTICIPA." | 18 | socialshare-text="Conheça o Dialoga Brasil. Dialoga Brasil | O País fica melhor quando VOCÊ PARTICIPA." |
17 | socialshare-hastags="dialogabrasil" | 19 | socialshare-hastags="dialogabrasil" |
18 | title="Compartilhar no Twitter"> | 20 | title="Compartilhar no Twitter"> |
19 | - <span class="icon-circle icon-small icon-circle-social-twitter"><span class="icon icon-social-twitter"></span></span> | 21 | + <span aria-hidden="true" class="icon-circle icon-small icon-circle-social-twitter"><span class="icon icon-social-twitter"></span></span> |
20 | <span class="sr-only">Compartilhar no Twitter</span> | 22 | <span class="sr-only">Compartilhar no Twitter</span> |
21 | </a> | 23 | </a> |
22 | </li> | 24 | </li> |
23 | <li> | 25 | <li> |
24 | - <a socialshare | ||
25 | - socialshare-provider="gplus" | 26 | + <a href="#" role="button" |
27 | + socialshare | ||
28 | + socialshare-provider="google+" | ||
26 | socialshare-url="http://dialoga.gov.br" | 29 | socialshare-url="http://dialoga.gov.br" |
27 | socialshare-text="Conheça o Dialoga Brasil. Dialoga Brasil | O País fica melhor quando VOCÊ PARTICIPA." | 30 | socialshare-text="Conheça o Dialoga Brasil. Dialoga Brasil | O País fica melhor quando VOCÊ PARTICIPA." |
28 | title="Compartilhar no Google Plus"> | 31 | title="Compartilhar no Google Plus"> |
29 | - <span class="icon-circle icon-small icon-circle-social-googleplus"><span class="icon icon-social-googleplus"></span></span> | 32 | + <span aria-hidden="true" class="icon-circle icon-small icon-circle-social-googleplus"><span class="icon icon-social-googleplus"></span></span> |
30 | <span class="sr-only">Compartilhar no Google Plus</span> | 33 | <span class="sr-only">Compartilhar no Google Plus</span> |
31 | </a> | 34 | </a> |
32 | </li> | 35 | </li> |
33 | <li> | 36 | <li> |
34 | - <a href="mailto:contato@dialoga.gov.br?subject=Conheça o Dialoga Brasil" title="Enviar por email"> | ||
35 | - <span class="icon-circle icon-small icon-circle-social-whatsapp"><span class="icon icon-social-whatsapp"></span></span> | 37 | + <a href="whatsapp://send?text=Aqui suas ideias viram propostas e você ajuda a melhorar as ações do governo http://dialoga.gov.br/" title="Compartilhar no WhatsApp"> |
38 | + <span aria-hidden="true" class="icon-circle icon-small icon-circle-social-whatsapp"><span class="icon icon-social-whatsapp"></span></span> | ||
36 | <span class="sr-only">Enviar por email</span> | 39 | <span class="sr-only">Enviar por email</span> |
37 | </a> | 40 | </a> |
38 | </li> | 41 | </li> |
src/app/index.route.js
@@ -23,7 +23,7 @@ | @@ -23,7 +23,7 @@ | ||
23 | } | 23 | } |
24 | }) | 24 | }) |
25 | .state('entrar', { | 25 | .state('entrar', { |
26 | - url: '/entrar', | 26 | + url: '/entrar?redirect_uri', |
27 | ncyBreadcrumb: {label: 'Entrar'}, | 27 | ncyBreadcrumb: {label: 'Entrar'}, |
28 | views: { | 28 | views: { |
29 | 'header': { templateUrl: 'app/pages/header/header.html' }, | 29 | 'header': { templateUrl: 'app/pages/header/header.html' }, |
@@ -75,7 +75,7 @@ | @@ -75,7 +75,7 @@ | ||
75 | } | 75 | } |
76 | }) | 76 | }) |
77 | .state('programas', { | 77 | .state('programas', { |
78 | - url: '/programas', | 78 | + url: '/programas?tema', |
79 | ncyBreadcrumb: {label: 'Programas'}, | 79 | ncyBreadcrumb: {label: 'Programas'}, |
80 | views: { | 80 | views: { |
81 | 'header': { templateUrl: 'app/pages/header/header.html' }, | 81 | 'header': { templateUrl: 'app/pages/header/header.html' }, |
@@ -88,7 +88,7 @@ | @@ -88,7 +88,7 @@ | ||
88 | } | 88 | } |
89 | }) | 89 | }) |
90 | .state('programa-conteudo', { | 90 | .state('programa-conteudo', { |
91 | - url: '/programa/:slug', | 91 | + url: '/programa/:slug?proposal_id', |
92 | ncyBreadcrumb: { | 92 | ncyBreadcrumb: { |
93 | label: '{{$parent.$root.contentTitle}}', | 93 | label: '{{$parent.$root.contentTitle}}', |
94 | parent: 'programas' | 94 | parent: 'programas' |
@@ -104,7 +104,7 @@ | @@ -104,7 +104,7 @@ | ||
104 | } | 104 | } |
105 | }) | 105 | }) |
106 | .state('propostas', { | 106 | .state('propostas', { |
107 | - url: '/propostas', | 107 | + url: '/propostas?tema', |
108 | ncyBreadcrumb: {label: 'Propostas'}, | 108 | ncyBreadcrumb: {label: 'Propostas'}, |
109 | views: { | 109 | views: { |
110 | 'header': { templateUrl: 'app/pages/header/header.html' }, | 110 | 'header': { templateUrl: 'app/pages/header/header.html' }, |
@@ -117,14 +117,14 @@ | @@ -117,14 +117,14 @@ | ||
117 | } | 117 | } |
118 | }) | 118 | }) |
119 | .state('ranking', { | 119 | .state('ranking', { |
120 | - url: '/ranking', | 120 | + url: '/ranking?tema', |
121 | ncyBreadcrumb: {label: 'Propostas'}, | 121 | ncyBreadcrumb: {label: 'Propostas'}, |
122 | views: { | 122 | views: { |
123 | 'header': { templateUrl: 'app/pages/header/header.html' }, | 123 | 'header': { templateUrl: 'app/pages/header/header.html' }, |
124 | 'main': { | 124 | 'main': { |
125 | templateUrl: 'app/pages/propostas/ranking.html', | 125 | templateUrl: 'app/pages/propostas/ranking.html', |
126 | controller: 'PropostasPageController', | 126 | controller: 'PropostasPageController', |
127 | - controllerAs: 'pageRanking' | 127 | + controllerAs: 'pagePropostas' |
128 | }, | 128 | }, |
129 | 'footer': { templateUrl: 'app/pages/footer/footer.html' } | 129 | 'footer': { templateUrl: 'app/pages/footer/footer.html' } |
130 | } | 130 | } |
@@ -203,6 +203,15 @@ | @@ -203,6 +203,15 @@ | ||
203 | 'footer': { templateUrl: 'app/pages/footer/footer.html' } | 203 | 'footer': { templateUrl: 'app/pages/footer/footer.html' } |
204 | } | 204 | } |
205 | }) | 205 | }) |
206 | + .state('mapa', { | ||
207 | + url: '/mapa', | ||
208 | + ncyBreadcrumb: {label: 'Mapa'}, | ||
209 | + views: { | ||
210 | + 'header': { templateUrl: 'app/pages/header/header.html' }, | ||
211 | + 'main': { templateUrl: 'app/pages/mapa/mapa.html' }, | ||
212 | + 'footer': { templateUrl: 'app/pages/footer/footer.html' } | ||
213 | + } | ||
214 | + }) | ||
206 | ; | 215 | ; |
207 | 216 | ||
208 | $urlRouterProvider.otherwise('/erro'); | 217 | $urlRouterProvider.otherwise('/erro'); |
src/app/pages/article/article.html
@@ -26,9 +26,15 @@ | @@ -26,9 +26,15 @@ | ||
26 | <article> | 26 | <article> |
27 | <header class="container"> | 27 | <header class="container"> |
28 | <div class="row"> | 28 | <div class="row"> |
29 | - <h1>{{::pageArticle.article.title}}</h1> | 29 | + <div class="col-sm-12"> |
30 | + <h1>{{::pageArticle.article.title}}</h1> | ||
31 | + </div> | ||
30 | </div> | 32 | </div> |
31 | </header> | 33 | </header> |
32 | - <div ng-bind-html="pageArticle.article.body"></div> | 34 | + <article> |
35 | + <div class="container"> | ||
36 | + <div ng-bind-html="pageArticle.article.body"></div> | ||
37 | + </div> | ||
38 | + </article> | ||
33 | </article> | 39 | </article> |
34 | </div> | 40 | </div> |
src/app/pages/auth/auth.controller.js
@@ -6,13 +6,13 @@ | @@ -6,13 +6,13 @@ | ||
6 | .controller('AuthPageController', AuthPageController); | 6 | .controller('AuthPageController', AuthPageController); |
7 | 7 | ||
8 | /** @ngInject */ | 8 | /** @ngInject */ |
9 | - function AuthPageController($scope, $rootScope, AUTH_EVENTS, AuthService, DialogaService, Session, $log) { | ||
10 | - $log.debug('AuthPageController'); | ||
11 | - | 9 | + function AuthPageController($scope, $rootScope, $location, $state, AUTH_EVENTS, AuthService, DialogaService, Session, $log) { |
12 | var vm = this; | 10 | var vm = this; |
13 | 11 | ||
14 | - vm.$rootScope = $rootScope; | ||
15 | vm.$scope = $scope; | 12 | vm.$scope = $scope; |
13 | + vm.$rootScope = $rootScope; | ||
14 | + vm.$location = $location; | ||
15 | + vm.$state = $state; | ||
16 | vm.AUTH_EVENTS = AUTH_EVENTS; | 16 | vm.AUTH_EVENTS = AUTH_EVENTS; |
17 | vm.AuthService = AuthService; | 17 | vm.AuthService = AuthService; |
18 | vm.DialogaService = DialogaService; | 18 | vm.DialogaService = DialogaService; |
@@ -21,6 +21,8 @@ | @@ -21,6 +21,8 @@ | ||
21 | 21 | ||
22 | vm.init(); | 22 | vm.init(); |
23 | vm.loadData(); | 23 | vm.loadData(); |
24 | + | ||
25 | + vm.$log.debug('AuthPageController'); | ||
24 | } | 26 | } |
25 | 27 | ||
26 | AuthPageController.prototype.init = function() { | 28 | AuthPageController.prototype.init = function() { |
@@ -32,6 +34,12 @@ | @@ -32,6 +34,12 @@ | ||
32 | vm.terms = null; | 34 | vm.terms = null; |
33 | vm.loadingTerms = null; | 35 | vm.loadingTerms = null; |
34 | 36 | ||
37 | + vm.search = vm.$location.search(); | ||
38 | + var redirect = vm.search.redirect_uri || ''; | ||
39 | + if(redirect && redirect.length > 0){ | ||
40 | + vm.params = JSON.parse('{"' + decodeURI(redirect).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g,'":"') + '"}'); | ||
41 | + } | ||
42 | + | ||
35 | // attach events | 43 | // attach events |
36 | vm.currentUser = vm.Session.getCurrentUser(); | 44 | vm.currentUser = vm.Session.getCurrentUser(); |
37 | 45 | ||
@@ -78,6 +86,8 @@ | @@ -78,6 +86,8 @@ | ||
78 | // 'Cadastro efetuado com sucesso.' | 86 | // 'Cadastro efetuado com sucesso.' |
79 | // 'Verifique seu email para confirmar o cadastro.' | 87 | // 'Verifique seu email para confirmar o cadastro.' |
80 | 88 | ||
89 | + // TODO: show messagens and redirect timeout | ||
90 | + vm.redirectBack(); | ||
81 | }, function(response){ | 91 | }, function(response){ |
82 | vm.$log.debug('register error.response', response); | 92 | vm.$log.debug('register error.response', response); |
83 | 93 | ||
@@ -92,9 +102,28 @@ | @@ -92,9 +102,28 @@ | ||
92 | vm.AuthService.login(credentials).then(function(user) { | 102 | vm.AuthService.login(credentials).then(function(user) { |
93 | // handle view | 103 | // handle view |
94 | vm.$log.debug('user', user); | 104 | vm.$log.debug('user', user); |
105 | + vm.redirectBack(); | ||
95 | }, function() { | 106 | }, function() { |
96 | // handle view | 107 | // handle view |
97 | }); | 108 | }); |
98 | }; | 109 | }; |
99 | 110 | ||
111 | + AuthPageController.prototype.redirectBack = function(){ | ||
112 | + var vm = this; | ||
113 | + | ||
114 | + if(!vm.params){ | ||
115 | + vm.$log.warn('No redirect params defined.'); | ||
116 | + return; | ||
117 | + } | ||
118 | + var state = vm.params.state; | ||
119 | + switch(state){ | ||
120 | + case 'inicio': | ||
121 | + vm.$state.go(state, { | ||
122 | + event_id: vm.params.event_id, | ||
123 | + task: vm.params.task | ||
124 | + }); | ||
125 | + break; | ||
126 | + } | ||
127 | + } | ||
128 | + | ||
100 | })(); | 129 | })(); |
src/app/pages/inicio/inicio.controller.js
@@ -33,6 +33,18 @@ | @@ -33,6 +33,18 @@ | ||
33 | vm.query = null; | 33 | vm.query = null; |
34 | vm.search = vm.$location.search(); | 34 | vm.search = vm.$location.search(); |
35 | 35 | ||
36 | + if (vm.search.tema) { | ||
37 | + vm._filtredByThemeSlug = vm.search.tema; | ||
38 | + } | ||
39 | + | ||
40 | + if (vm.search.filtro) { | ||
41 | + vm._filtredByQuery = vm.search.filtro; | ||
42 | + } | ||
43 | + | ||
44 | + if (vm.search.tema || vm.search.filtro) { | ||
45 | + vm.loadingFilter = true; | ||
46 | + } | ||
47 | + | ||
36 | vm.error = null; | 48 | vm.error = null; |
37 | 49 | ||
38 | vm.loadData(); | 50 | vm.loadData(); |
@@ -42,7 +54,6 @@ | @@ -42,7 +54,6 @@ | ||
42 | InicioPageController.prototype.loadData = function() { | 54 | InicioPageController.prototype.loadData = function() { |
43 | var vm = this; | 55 | var vm = this; |
44 | 56 | ||
45 | - | ||
46 | // Load main content | 57 | // Load main content |
47 | vm.loading = true; | 58 | vm.loading = true; |
48 | vm.DialogaService.getHome(function(data) { | 59 | vm.DialogaService.getHome(function(data) { |
@@ -77,6 +88,8 @@ | @@ -77,6 +88,8 @@ | ||
77 | vm.DialogaService.getThemes(function(data) { | 88 | vm.DialogaService.getThemes(function(data) { |
78 | vm.themes = data; | 89 | vm.themes = data; |
79 | vm.loadingThemes = false; | 90 | vm.loadingThemes = false; |
91 | + | ||
92 | + vm.filter(); | ||
80 | }, function(error) { | 93 | }, function(error) { |
81 | vm.$log.error('Error on getThemes.', error); | 94 | vm.$log.error('Error on getThemes.', error); |
82 | }); | 95 | }); |
@@ -87,13 +100,38 @@ | @@ -87,13 +100,38 @@ | ||
87 | vm.programs = vm.article.children; | 100 | vm.programs = vm.article.children; |
88 | vm.filtredPrograms = data.articles; | 101 | vm.filtredPrograms = data.articles; |
89 | vm.loadingPrograms = false; | 102 | vm.loadingPrograms = false; |
103 | + | ||
104 | + vm.filter(); | ||
90 | }, function(error) { | 105 | }, function(error) { |
91 | vm.$log.error('Error on getPrograms.', error); | 106 | vm.$log.error('Error on getPrograms.', error); |
92 | }); | 107 | }); |
93 | - | ||
94 | - vm.filter(); | ||
95 | } | 108 | } |
109 | + }; | ||
110 | + | ||
111 | + InicioPageController.prototype.attachListeners = function() { | ||
112 | + var vm = this; | ||
113 | + | ||
114 | + vm.$scope.$on('change-selectedCategory', function(event, selectedCategory) { | ||
115 | + vm.selectedTheme = selectedCategory; | ||
116 | + }); | ||
117 | + | ||
118 | + vm.$scope.$watch('pageInicio.selectedTheme', function(newValue/*, oldValue*/) { | ||
119 | + vm.search.tema = newValue ? newValue.slug : null; | ||
120 | + vm.$location.search('tema', vm.search.tema); | ||
96 | 121 | ||
122 | + if (!vm.loadingFilter) { | ||
123 | + vm.filtredPrograms = vm.getFiltredPrograms(); | ||
124 | + } | ||
125 | + }); | ||
126 | + | ||
127 | + vm.$scope.$watch('pageInicio.query', function(newValue/*, oldValue*/) { | ||
128 | + vm.search.filtro = newValue ? newValue : null; | ||
129 | + vm.$location.search('filtro', vm.search.filtro); | ||
130 | + | ||
131 | + if (!vm.loadingFilter) { | ||
132 | + vm.filtredPrograms = vm.getFiltredPrograms(); | ||
133 | + } | ||
134 | + }); | ||
97 | }; | 135 | }; |
98 | 136 | ||
99 | InicioPageController.prototype.showVideo = function() { | 137 | InicioPageController.prototype.showVideo = function() { |
@@ -114,41 +152,32 @@ | @@ -114,41 +152,32 @@ | ||
114 | vm.article.videoIsLoaded = true; | 152 | vm.article.videoIsLoaded = true; |
115 | }; | 153 | }; |
116 | 154 | ||
117 | - InicioPageController.prototype.attachListeners = function() { | ||
118 | - var vm = this; | ||
119 | - | ||
120 | - vm.$scope.$on('change-selectedCategory', function (event, selectedCategory) { | ||
121 | - vm.selectedTheme = selectedCategory; | ||
122 | - }); | ||
123 | - | ||
124 | - vm.$scope.$watch('pageInicio.selectedTheme', function(newValue/*, oldValue*/) { | ||
125 | - vm.search.tema = newValue ? newValue.slug : null; | ||
126 | - vm.$location.search('tema', vm.search.tema); | ||
127 | - vm.filtredPrograms = vm.getFiltredPrograms(); | ||
128 | - }); | ||
129 | - | ||
130 | - vm.$scope.$watch('pageInicio.query', function(newValue/*, oldValue*/) { | ||
131 | - vm.search.filtro = newValue ? newValue : null; | ||
132 | - vm.$location.search('filtro', vm.search.filtro); | ||
133 | - vm.filtredPrograms = vm.getFiltredPrograms(); | ||
134 | - }); | ||
135 | - }; | ||
136 | - | ||
137 | InicioPageController.prototype.filter = function() { | 155 | InicioPageController.prototype.filter = function() { |
138 | var vm = this; | 156 | var vm = this; |
139 | 157 | ||
140 | - if (vm.search && vm.search.tema) { | ||
141 | - var slug = vm.search.tema; | ||
142 | - vm.$log.debug('filter by theme', slug); | 158 | + if (vm.loadingThemes || vm.loadingPrograms) { |
159 | + vm.$log.info('No programs or themes loaded yet. Abort.'); | ||
160 | + return; | ||
161 | + } | ||
143 | 162 | ||
144 | - vm.DialogaService.getThemeBySlug(slug, function(theme){ | 163 | + if (vm._filtredByThemeSlug) { |
164 | + var slug = vm._filtredByThemeSlug; | ||
165 | + | ||
166 | + vm.DialogaService.getThemeBySlug(slug, function(theme) { | ||
145 | vm.selectedTheme = theme; | 167 | vm.selectedTheme = theme; |
146 | - vm.$log.debug('getThemeBySlug.slug', slug); | ||
147 | - vm.$log.debug('getThemeBySlug.selectedTheme', theme); | ||
148 | - }, function(error){ | 168 | + }, function(error) { |
149 | vm.$log.error('Error when try to "getThemeBySlug"', error); | 169 | vm.$log.error('Error when try to "getThemeBySlug"', error); |
150 | }); | 170 | }); |
151 | } | 171 | } |
172 | + | ||
173 | + if (vm._filtredByQuery) { | ||
174 | + vm.query = vm._filtredByQuery; | ||
175 | + } | ||
176 | + | ||
177 | + if (vm._filtredByThemeSlug || vm._filtredByQuery) { | ||
178 | + vm.filtredPrograms = vm.getFiltredPrograms(); | ||
179 | + vm.loadingFilter = false; | ||
180 | + } | ||
152 | }; | 181 | }; |
153 | 182 | ||
154 | InicioPageController.prototype.showAllPrograms = function($event) { | 183 | InicioPageController.prototype.showAllPrograms = function($event) { |
@@ -170,7 +199,7 @@ | @@ -170,7 +199,7 @@ | ||
170 | InicioPageController.prototype.getFiltredPrograms = function() { | 199 | InicioPageController.prototype.getFiltredPrograms = function() { |
171 | var vm = this; | 200 | var vm = this; |
172 | 201 | ||
173 | - if(!vm.programs){ | 202 | + if (!vm.programs) { |
174 | vm.$log.warn('No programs loaded yet. Abort.'); | 203 | vm.$log.warn('No programs loaded yet. Abort.'); |
175 | return null; | 204 | return null; |
176 | } | 205 | } |
@@ -179,9 +208,9 @@ | @@ -179,9 +208,9 @@ | ||
179 | var output = input; | 208 | var output = input; |
180 | var query = vm.query; | 209 | var query = vm.query; |
181 | var selectedTheme = vm.selectedTheme; | 210 | var selectedTheme = vm.selectedTheme; |
182 | - | 211 | + |
183 | var filter = vm.$filter('filter'); | 212 | var filter = vm.$filter('filter'); |
184 | - | 213 | + |
185 | if (selectedTheme) { | 214 | if (selectedTheme) { |
186 | output = _filterByCategory(output, selectedTheme); | 215 | output = _filterByCategory(output, selectedTheme); |
187 | } | 216 | } |
@@ -190,7 +219,7 @@ | @@ -190,7 +219,7 @@ | ||
190 | output = filter(output, query, false); | 219 | output = filter(output, query, false); |
191 | } | 220 | } |
192 | 221 | ||
193 | - if(!query && !selectedTheme){ | 222 | + if (!query && !selectedTheme) { |
194 | output = _balanceByCategory(output); | 223 | output = _balanceByCategory(output); |
195 | } | 224 | } |
196 | 225 |
src/app/pages/inicio/inicio.html
1 | -<div class="page--inicio"> | ||
2 | - <section class="section-video" role="main"> | 1 | +<div class="page--inicio" role="main"> |
2 | + <section class="section-video"> | ||
3 | <div class="container"> | 3 | <div class="container"> |
4 | <div class="row"> | 4 | <div class="row"> |
5 | <div class="col-sm-10 col-sm-offset-1"> | 5 | <div class="col-sm-10 col-sm-offset-1"> |
@@ -80,7 +80,7 @@ | @@ -80,7 +80,7 @@ | ||
80 | <br/> | 80 | <br/> |
81 | </div> | 81 | </div> |
82 | </div> | 82 | </div> |
83 | - <div ng-if="pageInicio.themes"> | 83 | + <div ng-if="pageInicio.themes && !vm.loadingFilter"> |
84 | <category-list categories="pageInicio.themes" selected-category="pageInicio.selectedTheme"></category-list> | 84 | <category-list categories="pageInicio.themes" selected-category="pageInicio.selectedTheme"></category-list> |
85 | </div> | 85 | </div> |
86 | <div ng-if="!pageInicio.themes && pageInicio.loadingThemes"> | 86 | <div ng-if="!pageInicio.themes && pageInicio.loadingThemes"> |
@@ -123,7 +123,7 @@ | @@ -123,7 +123,7 @@ | ||
123 | </div> | 123 | </div> |
124 | 124 | ||
125 | <div class="row"> | 125 | <div class="row"> |
126 | - <div class="col-sm-12" ng-if="pageInicio.programs"> | 126 | + <div class="col-sm-12" ng-if="pageInicio.filtredPrograms && !vm.loadingFilter"> |
127 | <article-grid articles="pageInicio.filtredPrograms"></article-grid> | 127 | <article-grid articles="pageInicio.filtredPrograms"></article-grid> |
128 | </div> | 128 | </div> |
129 | <div ng-if="!pageInicio.programs && pageInicio.loadingPrograms"> | 129 | <div ng-if="!pageInicio.programs && pageInicio.loadingPrograms"> |
@@ -0,0 +1,136 @@ | @@ -0,0 +1,136 @@ | ||
1 | +<div class="container"> | ||
2 | + <div class="row"> | ||
3 | + <div class="col-sm-11 col-sm-offset-1"> | ||
4 | + <h2>Mapa do Site</h2> | ||
5 | + <p>Uma visão geral do conteúdo disponível no site.</p> | ||
6 | + </div> | ||
7 | + </div> | ||
8 | +</div> | ||
9 | + | ||
10 | +<div class="page--mapa"> | ||
11 | + <div class="container"> | ||
12 | + <div class="row margin-mapa"> | ||
13 | + <div class="col-sm-11 col-sm-offset-1"> | ||
14 | + <h3 class="font-mapa">Sobre o Dialoga</h3> | ||
15 | + | ||
16 | + <div class="row margin-mapa"> | ||
17 | + <h3 class="font-mapa">Programas</h3> | ||
18 | + <div class="col-sm-6"> | ||
19 | + <h4 class="font-mapa">Ttulo do tema</h4> | ||
20 | + <ul> | ||
21 | + <li>Titulo do programa</li> | ||
22 | + <li>Titulo do programa</li> | ||
23 | + <li>Titulo do programa</li> | ||
24 | + <li>Titulo do programa</li> | ||
25 | + </ul> | ||
26 | + <h4 class="font-mapa">Ttulo do tema</h4> | ||
27 | + <ul> | ||
28 | + <li>Titulo do programa</li> | ||
29 | + <li>Titulo do programa</li> | ||
30 | + <li>Titulo do programa</li> | ||
31 | + <li>Titulo do programa</li> | ||
32 | + </ul> | ||
33 | + <h4 class="font-mapa">Ttulo do tema</h4> | ||
34 | + <ul> | ||
35 | + <li>Titulo do programa</li> | ||
36 | + <li>Titulo do programa</li> | ||
37 | + <li>Titulo do programa</li> | ||
38 | + <li>Titulo do programa</li> | ||
39 | + </ul> | ||
40 | + </div> | ||
41 | + </div> | ||
42 | + <div class="row margin-mapa"> | ||
43 | + <h3 class="font-mapa">Propostas</h3> | ||
44 | + <div class="col-sm-6"> | ||
45 | + <h4 class="font-mapa"></h4> | ||
46 | + <ul> | ||
47 | + <li></li> | ||
48 | + </ul> | ||
49 | + <h4 class="font-mapa"></h4> | ||
50 | + <ul> | ||
51 | + <li></li> | ||
52 | + </ul> | ||
53 | + <h4 class="font-mapa"></h4> | ||
54 | + <ul> | ||
55 | + <li></li> | ||
56 | + </ul> | ||
57 | + </div> | ||
58 | + </div> | ||
59 | + <div class="row margin-mapa"> | ||
60 | + <h3 class="font-mapa">Ranking</h3> | ||
61 | + <div class="col-sm-6"> | ||
62 | + <h4 class="font-mapa"></h4> | ||
63 | + <ul> | ||
64 | + <li></li> | ||
65 | + </ul> | ||
66 | + <h4 class="font-mapa"></h4> | ||
67 | + <ul> | ||
68 | + <li></li> | ||
69 | + </ul> | ||
70 | + <h4 class="font-mapa"></h4> | ||
71 | + <ul> | ||
72 | + <li></li> | ||
73 | + </ul> | ||
74 | + </div> | ||
75 | + </div> | ||
76 | + <div class="row margin-mapa"> | ||
77 | + <h3 class="font-mapa">Dúvidas e sugestões</h3> | ||
78 | + <div class="col-sm-6"> | ||
79 | + <h4 class="font-mapa"></h4> | ||
80 | + <ol> | ||
81 | + <li>O que é o Dialoga Brasil?</li> | ||
82 | + <li>O que são Programas?</li> | ||
83 | + <li>O que são Propostas</li> | ||
84 | + <li>Quem pode criar propostas e votar nelas?</li> | ||
85 | + <li>O que acontece com as melhores propostas?</li> | ||
86 | + </ol> | ||
87 | + </div> | ||
88 | + </div> | ||
89 | + <div class="row margin-mapa"> | ||
90 | + <h3 class="font-mapa">Entrar</h3> | ||
91 | + <div class="col-sm-6"> | ||
92 | + <h4 class="font-mapa"></h4> | ||
93 | + <ul> | ||
94 | + <li></li> | ||
95 | + </ul> | ||
96 | + <h4 class="font-mapa"></h4> | ||
97 | + <ul> | ||
98 | + <li></li> | ||
99 | + </ul> | ||
100 | + <h4 class="font-mapa"></h4> | ||
101 | + <ul> | ||
102 | + <li></li> | ||
103 | + </ul> | ||
104 | + </div> | ||
105 | + </div> | ||
106 | + <div class="row margin-mapa"> | ||
107 | + | ||
108 | + | ||
109 | + <h3 class="font-mapa">Dialoga nas redes</h3> | ||
110 | + <div class="col-sm-6"> | ||
111 | + <h4 class="font-mapa"></h4> | ||
112 | + <ul> | ||
113 | + <li>Rede 1</li> | ||
114 | + <li>Rede 2</li> | ||
115 | + <li>Rede 3</li> | ||
116 | + <li>Rede 4</li> | ||
117 | + </ul> | ||
118 | + </div> | ||
119 | + </div> | ||
120 | + <div class="row margin-mapa"> | ||
121 | + | ||
122 | + <h3 class="font-mapa">Compartilhar</h3> | ||
123 | + <div class="col-sm-6"> | ||
124 | + <h4 class="font-mapa"></h4> | ||
125 | + <ul> | ||
126 | + <li>Rede 1</li> | ||
127 | + <li>Rede 2</li> | ||
128 | + <li>Rede 3</li> | ||
129 | + <li>Rede 4</li> | ||
130 | + </ul> | ||
131 | + </div> | ||
132 | + </div> | ||
133 | + | ||
134 | + </div> | ||
135 | + </div> | ||
136 | + <button type="button" class="btn btn-link" ui-sref="inicio">retornar à página inicial</button> |
src/app/pages/programas/programa-content.controller.js
@@ -6,13 +6,14 @@ | @@ -6,13 +6,14 @@ | ||
6 | .controller('ProgramaContentPageController', ProgramaContentPageController); | 6 | .controller('ProgramaContentPageController', ProgramaContentPageController); |
7 | 7 | ||
8 | /** @ngInject */ | 8 | /** @ngInject */ |
9 | - function ProgramaContentPageController(DialogaService, $state, $scope, $rootScope, $element, $log) { | 9 | + function ProgramaContentPageController(DialogaService, $state, $location, $scope, $rootScope, $element, $log) { |
10 | $log.debug('ProgramaContentPageController'); | 10 | $log.debug('ProgramaContentPageController'); |
11 | 11 | ||
12 | var vm = this; | 12 | var vm = this; |
13 | 13 | ||
14 | vm.DialogaService = DialogaService; | 14 | vm.DialogaService = DialogaService; |
15 | vm.$state = $state; | 15 | vm.$state = $state; |
16 | + vm.$location = $location; | ||
16 | vm.$scope = $scope; | 17 | vm.$scope = $scope; |
17 | vm.$rootScope = $rootScope; | 18 | vm.$rootScope = $rootScope; |
18 | vm.$element = $element; | 19 | vm.$element = $element; |
@@ -28,6 +29,7 @@ | @@ -28,6 +29,7 @@ | ||
28 | 29 | ||
29 | vm.article = null; | 30 | vm.article = null; |
30 | vm.category = null; | 31 | vm.category = null; |
32 | + vm.search = vm.$location.search(); | ||
31 | 33 | ||
32 | vm.error = false; | 34 | vm.error = false; |
33 | }; | 35 | }; |
@@ -68,15 +70,33 @@ | @@ -68,15 +70,33 @@ | ||
68 | vm.$log.error(error); | 70 | vm.$log.error(error); |
69 | }); | 71 | }); |
70 | 72 | ||
71 | - // get random proposal | ||
72 | - vm.DialogaService.getProposalsByTopicId(vm.article.id, { | ||
73 | - 'order': 'random()', | ||
74 | - 'limit': '1' | ||
75 | - }, function(data){ | ||
76 | - vm.randomProposal = data.articles[0]; | ||
77 | - }, function (error) { | 73 | + if(vm.search.proposal_id){ |
74 | + var proposalUrlId = vm.search.proposal_id; | ||
75 | + vm.DialogaService.getProposalById(proposalUrlId, { | ||
76 | + 'limit': '1' | ||
77 | + }, _handleSuccessGetProposal, _handleErrorGetProposal); | ||
78 | + | ||
79 | + }else{ | ||
80 | + // get random proposal | ||
81 | + vm.DialogaService.getProposalsByTopicId(vm.article.id, { | ||
82 | + 'order': 'random()', | ||
83 | + 'limit': '1' | ||
84 | + }, _handleSuccessGetProposal, _handleErrorGetProposal); | ||
85 | + } | ||
86 | + | ||
87 | + function _handleSuccessGetProposal(data){ | ||
88 | + if(data && data.articles){ | ||
89 | + vm.randomProposal = data.articles[0]; | ||
90 | + } | ||
91 | + | ||
92 | + if(data && data.article){ | ||
93 | + vm.randomProposal = data.article; | ||
94 | + } | ||
95 | + } | ||
96 | + | ||
97 | + function _handleErrorGetProposal(error){ | ||
78 | vm.$log.error(error); | 98 | vm.$log.error(error); |
79 | - }); | 99 | + } |
80 | 100 | ||
81 | vm.loading = false; | 101 | vm.loading = false; |
82 | }, function(error) { | 102 | }, function(error) { |
src/app/pages/programas/programa.html
@@ -64,7 +64,7 @@ | @@ -64,7 +64,7 @@ | ||
64 | </div> | 64 | </div> |
65 | <div class="col-xs-12" ng-if="pageProgramaContent.randomProposal"> | 65 | <div class="col-xs-12" ng-if="pageProgramaContent.randomProposal"> |
66 | <h3 class="color-theme-fg">Propostas nesse programa</h3> | 66 | <h3 class="color-theme-fg">Propostas nesse programa</h3> |
67 | - <proposal-box proposal="pageProgramaContent.randomProposal" topic="pageProgramaContent.article" category="pageProgramaContent.category" vote="false" ></proposal-box> | 67 | + <proposal-box proposal="pageProgramaContent.randomProposal" topic="pageProgramaContent.article" category="pageProgramaContent.category" vote="true" focus="{{pageProgramaContent.search.proposal_id}}" ></proposal-box> |
68 | </div> | 68 | </div> |
69 | <div class="col-xs-12" ng-if="!pageProgramaContent.randomProposal && !(pageProgramaContent.proposalsTopRated && pageProgramaContent.proposalsTopRated.length > 0)"> | 69 | <div class="col-xs-12" ng-if="!pageProgramaContent.randomProposal && !(pageProgramaContent.proposalsTopRated && pageProgramaContent.proposalsTopRated.length > 0)"> |
70 | <h3>Programas sem propostas</h3> | 70 | <h3>Programas sem propostas</h3> |
src/app/pages/programas/programas.scss
src/app/pages/propostas/propostas.controller.js
@@ -11,33 +11,36 @@ | @@ -11,33 +11,36 @@ | ||
11 | .controller('PropostasPageController', PropostasPageController); | 11 | .controller('PropostasPageController', PropostasPageController); |
12 | 12 | ||
13 | /** @ngInject */ | 13 | /** @ngInject */ |
14 | - function PropostasPageController(DialogaService, $log) { | 14 | + function PropostasPageController(DialogaService, $scope, $location, $filter, $log) { |
15 | var vm = this; | 15 | var vm = this; |
16 | 16 | ||
17 | vm.DialogaService = DialogaService; | 17 | vm.DialogaService = DialogaService; |
18 | + vm.$scope = $scope; | ||
19 | + vm.$location = $location; | ||
20 | + vm.$filter = $filter; | ||
18 | vm.$log = $log; | 21 | vm.$log = $log; |
19 | 22 | ||
20 | vm.init(); | 23 | vm.init(); |
24 | + vm.loadData(); | ||
25 | + vm.attachListeners(); | ||
26 | + | ||
21 | $log.debug('PropostasPageController'); | 27 | $log.debug('PropostasPageController'); |
22 | } | 28 | } |
23 | 29 | ||
24 | PropostasPageController.prototype.init = function () { | 30 | PropostasPageController.prototype.init = function () { |
25 | var vm = this; | 31 | var vm = this; |
26 | 32 | ||
27 | - vm.article = null; | ||
28 | vm.themes = null; | 33 | vm.themes = null; |
29 | vm.selectedTheme = null; | 34 | vm.selectedTheme = null; |
30 | vm.proposals = null; | 35 | vm.proposals = null; |
31 | vm.filtredProposals = null; | 36 | vm.filtredProposals = null; |
32 | vm.query = null; | 37 | vm.query = null; |
38 | + vm.search = vm.$location.search(); | ||
33 | 39 | ||
34 | vm.loading = null; | 40 | vm.loading = null; |
35 | vm.error = null; | 41 | vm.error = null; |
36 | - | ||
37 | - vm.loadData(); | ||
38 | }; | 42 | }; |
39 | 43 | ||
40 | - | ||
41 | PropostasPageController.prototype.loadData = function () { | 44 | PropostasPageController.prototype.loadData = function () { |
42 | var vm = this; | 45 | var vm = this; |
43 | 46 | ||
@@ -49,10 +52,12 @@ | @@ -49,10 +52,12 @@ | ||
49 | vm.proposals = data.articles; | 52 | vm.proposals = data.articles; |
50 | vm.filtredProposals = vm.proposals; | 53 | vm.filtredProposals = vm.proposals; |
51 | vm.loadingProposals = false; | 54 | vm.loadingProposals = false; |
55 | + vm.loading = false; | ||
52 | }, function (error) { | 56 | }, function (error) { |
53 | vm.error = error; | 57 | vm.error = error; |
54 | vm.$log.error(error); | 58 | vm.$log.error(error); |
55 | vm.loadingProposals = false; | 59 | vm.loadingProposals = false; |
60 | + vm.loading = false; | ||
56 | }); | 61 | }); |
57 | 62 | ||
58 | // load themes | 63 | // load themes |
@@ -60,10 +65,117 @@ | @@ -60,10 +65,117 @@ | ||
60 | vm.DialogaService.getThemes(function(themes){ | 65 | vm.DialogaService.getThemes(function(themes){ |
61 | vm.themes = themes; | 66 | vm.themes = themes; |
62 | vm.loadingThemes = false; | 67 | vm.loadingThemes = false; |
68 | + vm.loading = false; | ||
63 | }, function (error) { | 69 | }, function (error) { |
64 | vm.error = error; | 70 | vm.error = error; |
65 | vm.$log.error(error); | 71 | vm.$log.error(error); |
66 | vm.loadingThemes = false; | 72 | vm.loadingThemes = false; |
73 | + vm.loading = false; | ||
74 | + }); | ||
75 | + }; | ||
76 | + | ||
77 | + PropostasPageController.prototype.attachListeners = function() { | ||
78 | + var vm = this; | ||
79 | + | ||
80 | + vm.$scope.$on('change-selectedCategory', function (event, selectedCategory) { | ||
81 | + vm.selectedTheme = selectedCategory; | ||
82 | + }); | ||
83 | + | ||
84 | + vm.$scope.$watch('pagePropostas.selectedTheme', function(newValue/*, oldValue*/) { | ||
85 | + vm.search.tema = newValue ? newValue.slug : null; | ||
86 | + vm.$location.search('tema', vm.search.tema); | ||
87 | + vm.filtredProposals = vm.getFiltredProposals(); | ||
67 | }); | 88 | }); |
89 | + | ||
90 | + vm.$scope.$watch('pagePropostas.query', function(newValue/*, oldValue*/) { | ||
91 | + vm.search.filtro = newValue ? newValue : null; | ||
92 | + vm.$location.search('filtro', vm.search.filtro); | ||
93 | + vm.filtredProposals = vm.getFiltredProposals(); | ||
94 | + }); | ||
95 | + }; | ||
96 | + | ||
97 | + PropostasPageController.prototype.filter = function() { | ||
98 | + var vm = this; | ||
99 | + | ||
100 | + if (vm.search && vm.search.tema) { | ||
101 | + var slug = vm.search.tema; | ||
102 | + vm.$log.debug('filter by theme', slug); | ||
103 | + | ||
104 | + vm.DialogaService.getThemeBySlug(slug, function(theme){ | ||
105 | + vm.selectedTheme = theme; | ||
106 | + vm.$log.debug('getThemeBySlug.slug', slug); | ||
107 | + vm.$log.debug('getThemeBySlug.selectedTheme', theme); | ||
108 | + }, function(error){ | ||
109 | + vm.$log.error('Error when try to "getThemeBySlug"', error); | ||
110 | + }); | ||
111 | + } | ||
68 | }; | 112 | }; |
113 | + | ||
114 | + PropostasPageController.prototype.showAllPrograms = function($event) { | ||
115 | + var vm = this; | ||
116 | + $event.stopPropagation(); | ||
117 | + | ||
118 | + vm.resetFilterValues(); | ||
119 | + | ||
120 | + vm._showAllFlag = true; | ||
121 | + | ||
122 | + vm.filtredPrograms = vm.getFiltredPrograms(); | ||
123 | + }; | ||
124 | + | ||
125 | + PropostasPageController.prototype.resetFilterValues = function() { | ||
126 | + var vm = this; | ||
127 | + | ||
128 | + vm.query = null; | ||
129 | + vm.selectedTheme = null; | ||
130 | + }; | ||
131 | + | ||
132 | + PropostasPageController.prototype.getFiltredProposals = function() { | ||
133 | + var vm = this; | ||
134 | + | ||
135 | + if(!vm.proposals){ | ||
136 | + vm.$log.warn('No proposals loaded yet. Abort.'); | ||
137 | + return null; | ||
138 | + } | ||
139 | + | ||
140 | + var input = vm.proposals; | ||
141 | + var output = input; | ||
142 | + var query = vm.query; | ||
143 | + var selectedTheme = vm.selectedTheme; | ||
144 | + | ||
145 | + var filter = vm.$filter('filter'); | ||
146 | + | ||
147 | + if (selectedTheme) { | ||
148 | + output = _filterByCategory(output, selectedTheme); | ||
149 | + } | ||
150 | + | ||
151 | + if (query) { | ||
152 | + output = filter(output, query, false); | ||
153 | + } | ||
154 | + | ||
155 | + // if(!query && !selectedTheme && vm._showAllFlag){ | ||
156 | + // output = _balanceByCategory(output); | ||
157 | + // } | ||
158 | + | ||
159 | + return output; | ||
160 | + }; | ||
161 | + | ||
162 | + function _filterByCategory (input, category) { | ||
163 | + input = input || []; | ||
164 | + | ||
165 | + if (!category) { | ||
166 | + // no filter | ||
167 | + return input; | ||
168 | + } | ||
169 | + | ||
170 | + var out = []; | ||
171 | + for (var i = 0; i < input.length; i++) { | ||
172 | + var proposal = input[i]; | ||
173 | + if (proposal.parent.categories[0].slug === category.slug) { | ||
174 | + out.push(proposal); | ||
175 | + } | ||
176 | + } | ||
177 | + | ||
178 | + return out; | ||
179 | + } | ||
180 | + | ||
69 | })(); | 181 | })(); |
src/app/pages/propostas/propostas.html
@@ -7,7 +7,26 @@ | @@ -7,7 +7,26 @@ | ||
7 | </div> | 7 | </div> |
8 | 8 | ||
9 | <div class="page--propostas"> | 9 | <div class="page--propostas"> |
10 | - <section class="section--info"> | 10 | + |
11 | + <section class="section-info" ng-if="pagePropostas.loading || pagePropostas.error"> | ||
12 | + <div class="container"> | ||
13 | + <div class="row"> | ||
14 | + <div class="col-md-12"> | ||
15 | + <div ng-if="pagePropostas.loading && !pagePropostas.error"> | ||
16 | + <div class="alert alert-info" role="alert">Carregando conteúdo...</div> | ||
17 | + </div> | ||
18 | + | ||
19 | + <div ng-if="pagePropostas.error"> | ||
20 | + <div class="alert alert-danger" role="alert"> | ||
21 | + Erro ao carregar o conteúdo principal. | ||
22 | + </div> | ||
23 | + </div> | ||
24 | + </div> | ||
25 | + </div> | ||
26 | + </div> | ||
27 | + </section> | ||
28 | + | ||
29 | + <section class="section--header" ng-if="pagePropostas.proposals || pagePropostas.themes"> | ||
11 | <div class="container"> | 30 | <div class="container"> |
12 | <div class="row"> | 31 | <div class="row"> |
13 | <div class="col-sm-12"> | 32 | <div class="col-sm-12"> |
@@ -16,7 +35,8 @@ | @@ -16,7 +35,8 @@ | ||
16 | </div> | 35 | </div> |
17 | </div> | 36 | </div> |
18 | </section> | 37 | </section> |
19 | - <section class="section--articles section-gray section-space-up" ng-if="pagePropostas.proposals"> | 38 | + |
39 | + <section class="section--articles section-gray section-space-up" ng-if="pagePropostas.proposals || pagePropostas.themes"> | ||
20 | <div class="container"> | 40 | <div class="container"> |
21 | <div id="lista-de-propostas" class="row"> | 41 | <div id="lista-de-propostas" class="row"> |
22 | <div class="col-sm-4 col-md-3"> | 42 | <div class="col-sm-4 col-md-3"> |
@@ -52,7 +72,7 @@ | @@ -52,7 +72,7 @@ | ||
52 | </div> | 72 | </div> |
53 | </div> | 73 | </div> |
54 | <div class="col-sm-8 col-md-9"> | 74 | <div class="col-sm-8 col-md-9"> |
55 | - <div class="row hidden-xs"> | 75 | + <div class="row hidden-xs" ng-if="pagePropostas.proposals"> |
56 | <div class="col-xs-12"> | 76 | <div class="col-xs-12"> |
57 | <div class="input-group input-group-lg input-group-search"> | 77 | <div class="input-group input-group-lg input-group-search"> |
58 | <label for="articleQueryFilter" class="control-label sr-only">Buscar propostas:</label> | 78 | <label for="articleQueryFilter" class="control-label sr-only">Buscar propostas:</label> |
@@ -68,10 +88,11 @@ | @@ -68,10 +88,11 @@ | ||
68 | </div> | 88 | </div> |
69 | </div> | 89 | </div> |
70 | </div> | 90 | </div> |
71 | - <div class="row"> | 91 | + |
92 | + <div class="row" ng-if="pagePropostas.proposals"> | ||
72 | <div class="col-sm-12"> | 93 | <div class="col-sm-12"> |
73 | <header class="header"> | 94 | <header class="header"> |
74 | - <h2>Total de Propostas as propostas: "<span>{{::pagePropostas.proposals.length}} propostas</span>"</h2> | 95 | + <h2>Total de Propostas: "<b>{{pagePropostas.filtredProposals.length}} propostas</b>"</h2> |
75 | </header> | 96 | </header> |
76 | </div> | 97 | </div> |
77 | </div> | 98 | </div> |
src/app/pages/propostas/ranking.html
@@ -16,7 +16,7 @@ | @@ -16,7 +16,7 @@ | ||
16 | </div> | 16 | </div> |
17 | </div> | 17 | </div> |
18 | </section> | 18 | </section> |
19 | - <section class="section--articles section-gray section-space-up" ng-if="pageRanking.proposals"> | 19 | + <section class="section--articles section-gray section-space-up" ng-if="pagePropostas.proposals"> |
20 | <div class="container"> | 20 | <div class="container"> |
21 | <div id="lista-de-propostas" class="row"> | 21 | <div id="lista-de-propostas" class="row"> |
22 | <div class="col-sm-4 col-md-3"> | 22 | <div class="col-sm-4 col-md-3"> |
@@ -24,9 +24,9 @@ | @@ -24,9 +24,9 @@ | ||
24 | <div class="col-xs-12"> | 24 | <div class="col-xs-12"> |
25 | <div class="input-group input-group-lg input-group-search"> | 25 | <div class="input-group input-group-lg input-group-search"> |
26 | <label for="articleQueryFilter" class="control-label sr-only">Buscar propostas:</label> | 26 | <label for="articleQueryFilter" class="control-label sr-only">Buscar propostas:</label> |
27 | - <input id="articleQueryFilter" type="search" class="form-control input-search" ng-model="pageRanking.query" placeholder="Buscar propostas" aria-label="Buscar propostas" > | 27 | + <input id="articleQueryFilter" type="search" class="form-control input-search" ng-model="pagePropostas.query" placeholder="Buscar propostas" aria-label="Buscar propostas" > |
28 | <span class="input-group-btn"> | 28 | <span class="input-group-btn"> |
29 | - <button type="button" class="btn btn-default" ng-click="pageRanking.search()"> | 29 | + <button type="button" class="btn btn-default" ng-click="pagePropostas.search()"> |
30 | <span class="icon-circle icon-small color-theme-common-bg"> | 30 | <span class="icon-circle icon-small color-theme-common-bg"> |
31 | <span class="glyphicon glyphicon-search"></span> | 31 | <span class="glyphicon glyphicon-search"></span> |
32 | </span> | 32 | </span> |
@@ -37,15 +37,15 @@ | @@ -37,15 +37,15 @@ | ||
37 | <br/> | 37 | <br/> |
38 | </div> | 38 | </div> |
39 | </div> | 39 | </div> |
40 | - <div ng-if="pageRanking.themes"> | ||
41 | - <category-list categories="pageRanking.themes" selected-category="pageRanking.selectedTheme"></category-list> | 40 | + <div ng-if="pagePropostas.themes"> |
41 | + <category-list categories="pagePropostas.themes" selected-category="pagePropostas.selectedTheme"></category-list> | ||
42 | </div> | 42 | </div> |
43 | - <div ng-if="!pageRanking.themes && pageRanking.loadingThemes"> | 43 | + <div ng-if="!pagePropostas.themes && pagePropostas.loadingThemes"> |
44 | <div class="alert alert-info" role="alert"> | 44 | <div class="alert alert-info" role="alert"> |
45 | Carregando temas. | 45 | Carregando temas. |
46 | </div> | 46 | </div> |
47 | </div> | 47 | </div> |
48 | - <div ng-if="!pageRanking.themes && pageRanking.themesError"> | 48 | + <div ng-if="!pagePropostas.themes && pagePropostas.themesError"> |
49 | <div class="alert alert-danger" role="alert"> | 49 | <div class="alert alert-danger" role="alert"> |
50 | Não foi possível carregar a lista de temas neste momento. | 50 | Não foi possível carregar a lista de temas neste momento. |
51 | </div> | 51 | </div> |
@@ -56,9 +56,9 @@ | @@ -56,9 +56,9 @@ | ||
56 | <div class="col-xs-12"> | 56 | <div class="col-xs-12"> |
57 | <div class="input-group input-group-lg input-group-search"> | 57 | <div class="input-group input-group-lg input-group-search"> |
58 | <label for="articleQueryFilter" class="control-label sr-only">Buscar propostas:</label> | 58 | <label for="articleQueryFilter" class="control-label sr-only">Buscar propostas:</label> |
59 | - <input id="articleQueryFilter" type="search" class="form-control input-search" ng-model="pageRanking.query" placeholder="Buscar propostas" aria-label="Buscar propostas" > | 59 | + <input id="articleQueryFilter" type="search" class="form-control input-search" ng-model="pagePropostas.query" placeholder="Buscar propostas" aria-label="Buscar propostas" > |
60 | <span class="input-group-btn"> | 60 | <span class="input-group-btn"> |
61 | - <button type="button" class="btn btn-default" ng-click="pageRanking.search()"> | 61 | + <button type="button" class="btn btn-default" ng-click="pagePropostas.search()"> |
62 | <span class="icon-circle icon-small color-theme-common-bg"> | 62 | <span class="icon-circle icon-small color-theme-common-bg"> |
63 | <span class="glyphicon glyphicon-search"></span> | 63 | <span class="glyphicon glyphicon-search"></span> |
64 | </span> | 64 | </span> |
@@ -71,21 +71,21 @@ | @@ -71,21 +71,21 @@ | ||
71 | <div class="row"> | 71 | <div class="row"> |
72 | <div class="col-sm-12"> | 72 | <div class="col-sm-12"> |
73 | <header class="header"> | 73 | <header class="header"> |
74 | - <h2>Total de Propostas as propostas: "<span>{{::pageRanking.proposals.length}} propostas</span>"</h2> | 74 | + <h2>Total de Propostas: "<span>{{pagePropostas.filtredProposals.length}} propostas</span>"</h2> |
75 | </header> | 75 | </header> |
76 | </div> | 76 | </div> |
77 | </div> | 77 | </div> |
78 | 78 | ||
79 | <div class="row"> | 79 | <div class="row"> |
80 | - <div class="col-sm-12" ng-if="pageRanking.proposals"> | ||
81 | - <proposal-list proposals="pageRanking.filtredProposals"></proposal-list> | 80 | + <div class="col-sm-12" ng-if="pagePropostas.proposals"> |
81 | + <proposal-list proposals="pagePropostas.filtredProposals"></proposal-list> | ||
82 | </div> | 82 | </div> |
83 | - <div ng-if="!pageRanking.proposals && pageRanking.loadingProposals"> | 83 | + <div ng-if="!pagePropostas.proposals && pagePropostas.loadingProposals"> |
84 | <div class="alert alert-info" role="alert"> | 84 | <div class="alert alert-info" role="alert"> |
85 | Carregando propostas. | 85 | Carregando propostas. |
86 | </div> | 86 | </div> |
87 | </div> | 87 | </div> |
88 | - <div ng-if="!pageRanking.proposals && pageRanking.proposalsError"> | 88 | + <div ng-if="!pagePropostas.proposals && pagePropostas.proposalsError"> |
89 | <div class="alert alert-danger" role="alert"> | 89 | <div class="alert alert-danger" role="alert"> |
90 | Não foi possível carregar a lista de propostas neste momento. | 90 | Não foi possível carregar a lista de propostas neste momento. |
91 | </div> | 91 | </div> |