Commit 3cd6b93a32abcdf2ef6851b6d98831734f7049cb

Authored by Leonardo Merlin
2 parents 0de0ac1d 621fc752

Merge branch 'merlin' into rafael

.gitignore
... ... @@ -5,4 +5,6 @@ bower_components/
5 5 .tmp/
6 6 dist/
7 7 .editorconfig
8   -.gitignore
  8 +
  9 +# ignore generated sprite
  10 +src/assets/images/icons/sprite.png
9 11 \ No newline at end of file
... ...
gulp/server.js
... ... @@ -16,7 +16,7 @@ function browserSyncInit(baseDir, browser) {
16 16 browser = browser === undefined ? 'default' : browser;
17 17  
18 18 var routes = null;
19   - if(baseDir === conf.paths.src || (util.isArray(baseDir) && baseDir.indexOf(conf.paths.src) !== -1)) {
  19 + if (baseDir === conf.paths.src || (util.isArray(baseDir) && baseDir.indexOf(conf.paths.src) !== -1)) {
20 20 routes = {
21 21 '/bower_components': 'bower_components'
22 22 };
... ... @@ -34,29 +34,48 @@ function browserSyncInit(baseDir, browser) {
34 34 *
35 35 * For more details and option, https://github.com/chimurai/http-proxy-middleware/blob/v0.0.5/README.md
36 36 */
37   - if(gutil.env.target) {
38   - server.middleware = proxyMiddleware(['/api/**', '/image_uploads/**'], {
39   - target: gutil.env.target,
40   - changeOrigin: true,
41   - proxyTable: {
42   - 'localhost:3000' : gutil.env.target
43   - }
44   -
45   - });
46   - } else {
47   - // no target! Point to localhost
  37 + if (gutil.env.local) {
  38 + // no target env. Point to localhost
48 39 server.middleware = proxyMiddleware('/api', {
49 40 target: 'http://0.0.0.0:9000/',
50 41 pathRewrite: {
51   - // rewrite paths
52   - '^/api/v1/articles' : '/articles'
  42 + // rewrite paths
  43 + '^/api/v1/articles': '/articles'
53 44 },
54 45 proxyTable: {
55 46 // when request.headers.host == 'dev.localhost:3000',
56 47 // override target 'http://www.example.org' to 'http://localhost:8000'
57 48 // 'dev.localhost:3000' : 'http://localhost:8000'
58   - 'hom.dialoga.gov.br' : 'http://localhost:9000',
59   - 'login.dialoga.gov.br' : 'http://localhost:9000'
  49 + 'hom.dialoga.gov.br': 'http://localhost:9000',
  50 + 'login.dialoga.gov.br': 'http://localhost:9000'
  51 + }
  52 + });
  53 + }
  54 +
  55 + if (gutil.env.production) {
  56 + var host_production = 'http://login.dialoga.gov.br/';
  57 + server.middleware = proxyMiddleware([
  58 + '/api/**',
  59 + '/image_uploads/**'
  60 + ], {
  61 + target: host_production,
  62 + changeOrigin: true,
  63 + proxyTable: {
  64 + 'localhost:3000': host_production
  65 + }
  66 + });
  67 + }
  68 +
  69 + if (gutil.env.staging) {
  70 + var host_staging = 'http://hom.login.dialoga.gov.br/';
  71 + server.middleware = proxyMiddleware([
  72 + '/api/**',
  73 + '/image_uploads/**'
  74 + ], {
  75 + target: host_staging,
  76 + changeOrigin: true,
  77 + proxyTable: {
  78 + 'localhost:3000': host_staging
60 79 }
61 80 });
62 81 }
... ... @@ -73,18 +92,18 @@ browserSync.use(browserSyncSpa({
73 92 selector: '[ng-app]'// Only needed for angular apps
74 93 }));
75 94  
76   -gulp.task('serve', ['watch'], function () {
  95 +gulp.task('serve', ['watch'], function() {
77 96 browserSyncInit([path.join(conf.paths.tmp, '/serve'), conf.paths.src]);
78 97 });
79 98  
80   -gulp.task('serve:dist', ['build'], function () {
  99 +gulp.task('serve:dist', ['build'], function() {
81 100 browserSyncInit(conf.paths.dist);
82 101 });
83 102  
84   -gulp.task('serve:e2e', ['inject'], function () {
  103 +gulp.task('serve:e2e', ['inject'], function() {
85 104 browserSyncInit([conf.paths.tmp + '/serve', conf.paths.src], []);
86 105 });
87 106  
88   -gulp.task('serve:e2e-dist', ['build'], function () {
  107 +gulp.task('serve:e2e-dist', ['build'], function() {
89 108 browserSyncInit(conf.paths.dist, []);
90 109 });
... ...
src/app/components/app-footer/app-footer.directive.js 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +(function() {
  2 + 'use strict';
  3 +
  4 + angular
  5 + .module('dialoga')
  6 + .directive('appFooter', appFooter);
  7 +
  8 + /** @ngInject */
  9 + function appFooter() {
  10 + var directive = {
  11 + restrict: 'E',
  12 + templateUrl: 'app/components/app-footer/app-footer.html'
  13 + };
  14 +
  15 + return directive;
  16 + }
  17 +})();
... ...
src/app/components/app-footer/app-footer.html 0 → 100644
... ... @@ -0,0 +1,10 @@
  1 +<div id="footer">
  2 + <div class="container">
  3 + <div class="row">
  4 + <div class="col-xs-12 text-center">
  5 + <a id="termos-de-uso" ui-sref="termos-de-uso">Termos de uso</a>
  6 + <a href="#header" style="position:absolute;right:0;top:-10px;" ng-click="scrollTo('#header')">Voltar para o topo</a>
  7 + </div>
  8 + </div>
  9 + </div>
  10 +</div>
... ...
src/app/components/app-footer/app-footer.scss 0 → 100644
... ... @@ -0,0 +1,21 @@
  1 +$barra-theme: ("green": #00420c, "yellow": #2c66ce, "blue": #0042b1);
  2 +
  3 +#footer-brasil {
  4 + background: none repeat scroll 0% 0% map-get($barra-theme, "blue");
  5 + padding: 1em 0px;
  6 + max-width: 100%;
  7 +}
  8 +
  9 +#footer {
  10 + padding: 20px 0;
  11 + a {
  12 + margin: 10px auto;
  13 + }
  14 +
  15 + .contraste & {
  16 + background-color: #000;
  17 + a {
  18 + color: #fff;
  19 + }
  20 + }
  21 +}
... ...
src/app/components/app-header/app-header.directive.js 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +(function() {
  2 + 'use strict';
  3 +
  4 + angular
  5 + .module('dialoga')
  6 + .directive('appHeader', appHeader);
  7 +
  8 + /** @ngInject */
  9 + function appHeader() {
  10 + var directive = {
  11 + restrict: 'E',
  12 + templateUrl: 'app/components/app-header/app-header.html'
  13 + };
  14 +
  15 + return directive;
  16 + }
  17 +})();
... ...
src/app/components/app-header/app-header.html 0 → 100644
... ... @@ -0,0 +1,15 @@
  1 +<header id="header" class="container">
  2 +
  3 + <div class="row hidden-xs">
  4 + <div class="col-sm-12">
  5 + <auth-user></auth-user>
  6 + </div>
  7 + </div>
  8 +
  9 + <div class="row">
  10 + <div class="col-sm-12">
  11 + <app-navbar></app-navbar>
  12 + </div>
  13 + </div>
  14 +
  15 +</header>
... ...
src/app/components/app-header/app-header.scss 0 → 100644
... ... @@ -0,0 +1,6 @@
  1 +// #header {
  2 +
  3 +// @media (max-width: $screen-md) {
  4 +
  5 +// }
  6 +// }
0 7 \ No newline at end of file
... ...
src/app/components/auth/auth.service.js
... ... @@ -8,10 +8,10 @@
8 8 .factory('AuthInterceptor', AuthInterceptor);
9 9  
10 10 /** @ngInject */
11   - function AuthService($http, $rootScope, Session, AUTH_EVENTS, API, $log) {
  11 + function AuthService($q, $http, $rootScope, Session, AUTH_EVENTS, API, PATH, $log) {
12 12  
13 13 function register (data){
14   - var url = API.host + '/api/v1/register';
  14 + var url = PATH.host + '/api/v1/register';
15 15 $log.debug('data', data);
16 16 // var encodedData = data;
17 17 var encodedData = '';
... ... @@ -22,6 +22,8 @@
22 22 encodedData += '&password=' + data.password;
23 23 encodedData += '&password_confirmation=' + data.password_confirmation;
24 24 encodedData += '&user_terms_accepted=' + data.user_terms_accepted;
  25 + encodedData += '&captcha_text=' + data.captcha_text;
  26 + encodedData += '&txtToken_captcha_serpro_gov_br=' + data.txtToken_captcha_serpro_gov_br;
25 27  
26 28 // var encodedData = _encodeObj(data);
27 29 // var encodedData = angular.element.param(data);
... ... @@ -44,8 +46,8 @@
44 46 }, function(response) {
45 47 $log.debug('AuthService.register [FAIL] response', response);
46 48  
47   - $rootScope.$broadcast(AUTH_EVENTS.registerFailed);
48   - return response;
  49 + $rootScope.$broadcast(AUTH_EVENTS.registerFailed, response);
  50 + return $q.reject(response);
49 51 });
50 52 }
51 53  
... ...
src/app/components/navbar/navbar.html
1 1 <div class="app-navbar">
  2 + <div id="dialoga-nas-redes">
  3 + <div class="text text-right">
  4 + <p>Dialoga<br>Nas Redes</p>
  5 + </div>
  6 + <social-share></social-share>
  7 + </div>
2 8 <nav id="navigation" class="header-navbar navbar navbar-static-top" role="navigation">
3 9 <div class="navbar-header">
4 10 <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar-collapse" aria-expanded="false">
... ...
src/app/components/navbar/navbar.scss
... ... @@ -103,3 +103,17 @@
103 103 }
104 104 }
105 105 }
  106 +
  107 +#dialoga-nas-redes {
  108 + position: absolute;
  109 + right: 0;
  110 + top: 0;
  111 + z-index: 1000;
  112 +
  113 + .text {
  114 + position: absolute;
  115 + top: 5px;
  116 + right: 210px;
  117 + width: 100px;
  118 + }
  119 +}
106 120 \ No newline at end of file
... ...
src/app/components/proposal-carousel/proposal-carousel.html
... ... @@ -24,7 +24,7 @@
24 24 </div>
25 25 </div>
26 26 <div class="proposal-carousel-bottom color-theme-common-bg" ng-click="vm.showProposalsList()">
27   - <div>Veja as propostas mais vortadas</div>
  27 + <div>Veja as propostas mais votadas</div>
28 28 <div class="proposal-carousel-bottom-icon">
29 29 <span class="glyphicon glyphicon-chevron-down pull-right color-theme-common-fg"></span>
30 30 </div>
... ...
src/app/components/proposal-list/proposal-list.directive.js
... ... @@ -33,8 +33,8 @@
33 33 throw { name: 'NotDefined', message: 'The attribute "proposals" is undefined.'};
34 34 }
35 35  
36   - if(!vm.per_page){
37   - vm.per_page = 5;
  36 + if(!vm.perPage){
  37 + vm.perPage = 5;
38 38 }
39 39  
40 40 vm.initPorposalList();
... ... @@ -50,10 +50,10 @@
50 50 vm.proposalsLength = vm.proposals.length;
51 51  
52 52  
53   - if ((vm.proposalsLength % vm.per_page) === 0) {
54   - vm.pages = vm.proposalsLength / vm.per_page;
  53 + if ((vm.proposalsLength % vm.perPage) === 0) {
  54 + vm.pages = vm.proposalsLength / vm.perPage;
55 55 } else{
56   - vm.pages = (vm.proposalsLength / vm.per_page) + 1;
  56 + vm.pages = (vm.proposalsLength / vm.perPage) + 1;
57 57 }
58 58  
59 59 // vm.arraypages = new Array(Math.ceil(vm.pages));
... ... @@ -81,8 +81,8 @@
81 81 ProposalListController.prototype.getProposalsPerPage = function (pageIndex) {
82 82 var vm = this;
83 83  
84   - var initialIndex = pageIndex * vm.per_page;
85   - var finalIndex = initialIndex + vm.per_page;
  84 + var initialIndex = pageIndex * vm.perPage;
  85 + var finalIndex = initialIndex + vm.perPage;
86 86  
87 87 return vm.proposals.slice(initialIndex, finalIndex);
88 88 };
... ... @@ -132,7 +132,7 @@
132 132 templateUrl: 'app/components/proposal-list/proposal-list.html',
133 133 scope: {
134 134 proposals: '=',
135   - per_page: '='
  135 + perPage: '='
136 136 },
137 137 controller: ProposalListController,
138 138 controllerAs: 'vm',
... ...
src/app/components/proposal-list/proposal-list.html
... ... @@ -27,8 +27,7 @@
27 27 <div class="row row-actions">
28 28 <div class="col-sm-8">
29 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>
  30 + Participe
32 31 </button>
33 32 </div>
34 33 <div class="col-sm-4">
... ...
src/app/components/social-share/social-share.scss
1 1 .social-share {
  2 + min-width: 200px;
  3 + padding: 5px;
  4 + height: 47px;
  5 +
  6 + &:after {
  7 + clear: both;
  8 + }
  9 +
2 10 &.list-inline {
3 11 margin: 0;
4 12 }
  13 + li {
  14 + float: left;
  15 + padding: 0;
  16 + margin: 0;
  17 + width: 45px;
  18 + text-align: center;
  19 +
  20 + & > a {
  21 + padding: 0;
  22 + }
  23 +
  24 + &:first-child {
  25 + // margin-left: 5px;
  26 + }
  27 + }
5 28 }
  29 +
... ...
src/app/index.route.js
... ... @@ -13,65 +13,55 @@
13 13 ncyBreadcrumb: {label: 'Home'},
14 14 reloadOnSearch: false,
15 15 views: {
16   - 'header': { templateUrl: 'app/pages/header/header.html' },
17 16 'main': {
18 17 templateUrl: 'app/pages/inicio/inicio.html',
19 18 controller: 'InicioPageController',
20 19 controllerAs: 'pageInicio'
21   - },
22   - 'footer': { templateUrl: 'app/pages/footer/footer.html' }
  20 + }
23 21 }
24 22 })
25 23 .state('entrar', {
26 24 url: '/entrar?redirect_uri&message',
27 25 ncyBreadcrumb: {label: 'Entrar'},
28 26 views: {
29   - 'header': { templateUrl: 'app/pages/header/header.html' },
30 27 'main': {
31 28 templateUrl: 'app/pages/auth/signin.html',
32 29 controller: 'AuthPageController',
33 30 controllerAs: 'pageSignin'
34   - },
35   - 'footer': { templateUrl: 'app/pages/footer/footer.html' }
  31 + }
36 32 }
37 33 })
38 34 .state('recuperar', {
39 35 url: '/recuperar',
40 36 ncyBreadcrumb: {label: 'Recuperar'},
41 37 views: {
42   - 'header': { templateUrl: 'app/pages/header/header.html' },
43 38 'main': {
44 39 templateUrl: 'app/pages/auth/recover.html',
45 40 controller: 'AuthPageController',
46 41 controllerAs: 'pageSignin'
47   - },
48   - 'footer': { templateUrl: 'app/pages/footer/footer.html' }
  42 + }
49 43 }
50 44 })
51 45 .state('alterar', {
52 46 url: '/alterar',
53 47 ncyBreadcrumb: {label: 'Alterar'},
54 48 views: {
55   - 'header': { templateUrl: 'app/pages/header/header.html' },
56 49 'main': {
57 50 templateUrl: 'app/pages/auth/change.html',
58 51 controller: 'AuthPageController',
59 52 controllerAs: 'pageSignin'
60   - },
61   - 'footer': { templateUrl: 'app/pages/footer/footer.html' }
  53 + }
62 54 }
63 55 })
64 56 .state('cadastrar', {
65 57 url: '/cadastrar',
66 58 ncyBreadcrumb: {label: 'Cadastrar'},
67 59 views: {
68   - 'header': { templateUrl: 'app/pages/header/header.html' },
69 60 'main': {
70 61 templateUrl: 'app/pages/auth/signup.html',
71 62 controller: 'AuthPageController',
72 63 controllerAs: 'pageSignup'
73   - },
74   - 'footer': { templateUrl: 'app/pages/footer/footer.html' }
  64 + }
75 65 }
76 66 })
77 67 .state('programas', {
... ... @@ -79,13 +69,11 @@
79 69 reloadOnSearch: false,
80 70 ncyBreadcrumb: {label: 'Programas'},
81 71 views: {
82   - 'header': { templateUrl: 'app/pages/header/header.html' },
83 72 'main': {
84 73 templateUrl: 'app/pages/programas/programas.html',
85 74 controller: 'ProgramasPageController',
86 75 controllerAs: 'pageProgramas'
87   - },
88   - 'footer': { templateUrl: 'app/pages/footer/footer.html' }
  76 + }
89 77 }
90 78 })
91 79 .state('programa', {
... ... @@ -96,13 +84,11 @@
96 84 parent: 'programas'
97 85 },
98 86 views: {
99   - 'header': { templateUrl: 'app/pages/header/header.html' },
100 87 'main': {
101 88 templateUrl: 'app/pages/programas/programa.html',
102 89 controller: 'ProgramaPageController',
103 90 controllerAs: 'pagePrograma'
104   - },
105   - 'footer': { templateUrl: 'app/pages/footer/footer.html' }
  91 + }
106 92 }
107 93 })
108 94 .state('propostas', {
... ... @@ -110,13 +96,11 @@
110 96 reloadOnSearch: false,
111 97 ncyBreadcrumb: {label: 'Propostas'},
112 98 views: {
113   - 'header': { templateUrl: 'app/pages/header/header.html' },
114 99 'main': {
115 100 templateUrl: 'app/pages/propostas/propostas.html',
116 101 controller: 'PropostasPageController',
117 102 controllerAs: 'pagePropostas'
118   - },
119   - 'footer': { templateUrl: 'app/pages/footer/footer.html' }
  103 + }
120 104 }
121 105 })
122 106 .state('ranking', {
... ... @@ -124,13 +108,11 @@
124 108 reloadOnSearch: false,
125 109 ncyBreadcrumb: {label: 'Propostas'},
126 110 views: {
127   - 'header': { templateUrl: 'app/pages/header/header.html' },
128 111 'main': {
129 112 templateUrl: 'app/pages/propostas/ranking.html',
130 113 controller: 'PropostasPageController',
131 114 controllerAs: 'pagePropostas'
132   - },
133   - 'footer': { templateUrl: 'app/pages/footer/footer.html' }
  115 + }
134 116 }
135 117 })
136 118 .state('propostas-conteudo', {
... ... @@ -140,39 +122,33 @@
140 122 parent: 'propostas'
141 123 },
142 124 views: {
143   - 'header': { templateUrl: 'app/pages/header/header.html' },
144 125 'main': {
145 126 templateUrl: 'app/pages/propostas/proposta.html',
146 127 controller: 'PropostasPageController',
147 128 controllerAs: 'pagePropostas'
148   - },
149   - 'footer': { templateUrl: 'app/pages/footer/footer.html' }
  129 + }
150 130 }
151 131 })
152 132 .state('duvidas', {
153 133 url: '/duvidas',
154 134 ncyBreadcrumb: {label: 'Dúvidas'},
155 135 views: {
156   - 'header': { templateUrl: 'app/pages/header/header.html' },
157 136 'main': {
158 137 templateUrl: 'app/pages/duvidas/duvidas.html',
159 138 controller: 'DuvidasPageController',
160 139 controllerAs: 'pageDuvidas'
161   - },
162   - 'footer': { templateUrl: 'app/pages/footer/footer.html' }
  140 + }
163 141 }
164 142 })
165 143 .state('sobre', {
166 144 url: '/sobre',
167 145 ncyBreadcrumb: {label: 'Sobre'},
168 146 views: {
169   - 'header': { templateUrl: 'app/pages/header/header.html' },
170 147 'main': {
171 148 templateUrl: 'app/pages/article/article.html',
172 149 controller: 'ArticlePageController',
173 150 controllerAs: 'pageArticle'
174   - },
175   - 'footer': { templateUrl: 'app/pages/footer/footer.html' }
  151 + }
176 152 }
177 153 })
178 154 .state('termos-de-uso', {
... ... @@ -180,35 +156,29 @@
180 156 ncyBreadcrumb: {label: 'Termos de Uso'},
181 157 controller: 'ArticlePageController',
182 158 views: {
183   - 'header': { templateUrl: 'app/pages/header/header.html' },
184 159 'main': {
185 160 templateUrl: 'app/pages/article/article.html',
186 161 controller: 'ArticlePageController',
187 162 controllerAs: 'pageArticle'
188   - },
189   - 'footer': { templateUrl: 'app/pages/footer/footer.html' }
  163 + }
190 164 }
191 165 })
192 166 .state('mapa-do-site', {
193 167 url: '/mapa-do-site',
194 168 ncyBreadcrumb: {label: 'Mapa do Site'},
195 169 views: {
196   - 'header': { templateUrl: 'app/pages/header/header.html' },
197 170 'main': {
198 171 templateUrl: 'app/pages/mapa-do-site/mapa-do-site.html',
199 172 controller: 'SitemapPageController',
200 173 controllerAs: 'sitemap'
201   - },
202   - 'footer': { templateUrl: 'app/pages/footer/footer.html' }
  174 + }
203 175 }
204 176 })
205 177 .state('erro', {
206 178 url: '/erro',
207 179 ncyBreadcrumb: {label: 'Erro'},
208 180 views: {
209   - 'header': { templateUrl: 'app/pages/header/header.html' },
210   - 'main': { templateUrl: 'app/pages/erro/erro.html' },
211   - 'footer': { templateUrl: 'app/pages/footer/footer.html' }
  181 + 'main': { templateUrl: 'app/pages/erro/erro.html' }
212 182 }
213 183 })
214 184 ;
... ...
src/app/index.run.js
... ... @@ -4,12 +4,13 @@
4 4  
5 5 angular
6 6 .module('dialoga')
7   - .run(runAuth)
8   - .run(runSocialAuth)
9 7 .run(runAccessibility)
  8 + .run(runAuth)
  9 + .run(runCaptcha)
  10 + .run(runColorUtils)
10 11 .run(runHistory)
11 12 .run(runPath)
12   - .run(runColorUtils)
  13 + .run(runSocialAuth)
13 14 .run(runUtils)
14 15 .run(runBlock);
15 16  
... ... @@ -45,18 +46,53 @@
45 46 }
46 47  
47 48 /** @ngInject */
  49 + function runCaptcha($window, $log, GUID) {
  50 + var serpro_captcha_clienteId = 'fdbcdc7a0b754ee7ae9d865fda740f17';
  51 +
  52 + $window.initCaptcha = function(element) {
  53 + var $element = angular.element(element);
  54 +
  55 + // already have a started captcha
  56 + if ($element.data('captcha')) {
  57 + $log.info('Captcha already initialized. Abort.');
  58 + return;
  59 + }
  60 +
  61 + // Create a new instance of Captcha
  62 + var oCaptcha_serpro_gov_br = new $window.captcha_serpro_gov_br();
  63 +
  64 + // Set the initial data
  65 + $element.val('');
  66 + $element.data('captcha', oCaptcha_serpro_gov_br);
  67 + oCaptcha_serpro_gov_br.clienteId = serpro_captcha_clienteId;
  68 + // oCaptcha_serpro_gov_br.url = "/serprocaptcha";
  69 + oCaptcha_serpro_gov_br.criarUI(element, 'css', 'serpro_captcha_component_', GUID.generate());
  70 + };
  71 +
  72 + $window.reloadCaptcha = function(element) {
  73 + var $element = angular.element(element);
  74 +
  75 + if ($element.data('captcha')) {
  76 + $element.data('captcha').recarregar();
  77 + }
  78 + };
  79 +
  80 + $log.debug('runCaptcha');
  81 + }
  82 +
  83 + /** @ngInject */
48 84 function runSocialAuth($window, $rootScope, $interval, $log) {
49 85  
50   - $window.oauthClientAction = function (url){
  86 + $window.oauthClientAction = function(url) {
51 87 var child = $window.open(url, '_blank');
52 88 var interval = $interval(function() {
53 89 try {
54   - if(!child.closed) {
  90 + if (!child.closed) {
55 91 child.postMessage({
56 92 message: 'requestOauthClientPluginResult'
57 93 }, '*');
58 94 }
59   - } catch(e) {
  95 + } catch (e) {
60 96 // we're here when the child window has been navigated away or closed
61 97 if (child.closed) {
62 98 $interval.cancel(interval);
... ... @@ -118,7 +154,7 @@
118 154 // prevent skip link from redirecting
119 155 if ($event) { $event.preventDefault(); }
120 156  
121   - if(angular.isString(target)){
  157 + if (angular.isString(target)) {
122 158 target = angular.element(target);
123 159 }
124 160  
... ... @@ -137,7 +173,7 @@
137 173 $rootScope.$previousState.splice(-MAX_HISTORY, MAX_HISTORY);
138 174 });
139 175  
140   - $rootScope.goBack = $rootScope.goBack || function () {
  176 + $rootScope.goBack = $rootScope.goBack || function() {
141 177 return $rootScope.$previousState.pop();
142 178 };
143 179 }
... ... @@ -178,7 +214,7 @@
178 214  
179 215 /** @ngInject */
180 216 function runUtils($rootScope) {
181   - $rootScope.stripHtml = function (text) {
  217 + $rootScope.stripHtml = function(text) {
182 218 return String(text).replace(/<[^>]+>/gm, '');
183 219 };
184 220 }
... ...
src/app/index.scss
... ... @@ -155,34 +155,6 @@ body {
155 155 }
156 156 }
157 157  
158   -
159   -.social-share {
160   - min-width: 200px;
161   - background-color: #eee;
162   - padding: 5px;
163   - height: 47px;
164   -
165   - &:after {
166   - clear: both;
167   - }
168   -
169   - li {
170   - float: left;
171   - padding: 0;
172   - margin: 0;
173   - width: 45px;
174   - text-align: center;
175   -
176   - & > a {
177   - padding: 0;
178   - }
179   -
180   - &:first-child {
181   - // margin-left: 5px;
182   - }
183   - }
184   -}
185   -
186 158 .icon {
187 159 display: inline-block;
188 160 vertical-align: middle;
... ...
src/app/pages/auth/auth.controller.js
... ... @@ -6,7 +6,7 @@
6 6 .controller('AuthPageController', AuthPageController);
7 7  
8 8 /** @ngInject */
9   - function AuthPageController($scope, $rootScope, $window, $location, $state, $timeout, AUTH_EVENTS, AuthService, DialogaService, Session, $log) {
  9 + function AuthPageController($scope, $rootScope, $window, $location, $state, $timeout, $interval, AUTH_EVENTS, AuthService, DialogaService, Session, $log) {
10 10 var vm = this;
11 11  
12 12 vm.$scope = $scope;
... ... @@ -15,6 +15,7 @@
15 15 vm.$location = $location;
16 16 vm.$state = $state;
17 17 vm.$timeout = $timeout;
  18 + vm.$interval = $interval;
18 19 vm.AUTH_EVENTS = AUTH_EVENTS;
19 20 vm.AuthService = AuthService;
20 21 vm.DialogaService = DialogaService;
... ... @@ -78,14 +79,38 @@
78 79 AuthPageController.prototype.attachListeners = function() {
79 80 var vm = this;
80 81  
  82 + vm.$scope.$on(vm.AUTH_EVENTS.registerSuccess, function(event, response) {
  83 + vm.$log.debug('TODO: handle register success');
  84 + vm.$log.debug('[register success] response', response);
  85 + });
  86 +
  87 + vm.$scope.$on(vm.AUTH_EVENTS.registerFailed, function(event, response) {
  88 + vm.$log.debug('TODO: handle register error');
  89 + vm.$log.debug('[register error] response', response);
  90 +
  91 + var reason = response.data.message;
  92 + vm.errorMessage = reason;
  93 + });
  94 +
81 95 vm.$scope.$on('oauthClientPluginResult', function(event, response) {
82 96 vm.$log.debug('response', response);
83 97  
84 98 // var logged_id = response.data.logged_id;
85 99 // var private_token = response.data.private_token;
86 100 // var user = response.data.user;
87   -
88 101 });
  102 +
  103 + var stop = null;
  104 + stop = vm.$interval(function(){
  105 + var $el = angular.element('#serpro_captcha');
  106 +
  107 + if ($el && $el.length > 0 ){
  108 + vm.$window.initCaptcha($el[0]);
  109 + vm.$interval.cancel(stop);
  110 + stop = undefined;
  111 + }
  112 +
  113 + }, 200);
89 114 };
90 115  
91 116 AuthPageController.prototype.onClickLogout = function() {
... ... @@ -94,7 +119,7 @@
94 119 vm.AuthService.logout();
95 120 };
96 121  
97   - AuthPageController.prototype.submitSigup = function(credentials) {
  122 + AuthPageController.prototype.submitSingup = function(credentials) {
98 123 var vm = this;
99 124  
100 125 vm.AuthService.register(credentials).then(function(response) {
... ... @@ -108,8 +133,19 @@
108 133 }, function(response) {
109 134 vm.$log.debug('register error.response', response);
110 135  
  136 + var message = response.data.message;
  137 + vm.errorMessage = message;
  138 +
  139 + if(response.data.code === 500){
  140 + vm.internalError = true;
  141 + }
  142 +
  143 +
111 144 // TODO: mensagens de erro
112 145 // TODO: tratar multiplos erros
  146 +
  147 + // javascript_console_message: "Unable to reach Serpro's Captcha validation service"
  148 + // message: "Internal captcha validation error"
113 149 });
114 150 };
115 151  
... ... @@ -137,15 +173,14 @@
137 173  
138 174 // start countdown
139 175 vm.countdown = vm.delay;
140   - (function countdown() {
141   - vm.$timeout(function() {
142   - vm.countdown--;
143   - vm.$log.debug('vm.countdown', vm.countdown);
144   - if (vm.countdown > 0) {
145   - countdown();
146   - }
147   - }, 1000);
148   - })();
  176 + var stop = null;
  177 + stop = vm.$interval(function() {
  178 + vm.countdown--;
  179 + if (vm.countdown <= 0) {
  180 + vm.$interval.cancel(stop);
  181 + stop = undefined;
  182 + }
  183 + }, 1000);
149 184  
150 185 vm.$timeout(function() {
151 186 var state = vm.params.state;
... ...
src/app/pages/auth/signin.html
... ... @@ -82,92 +82,87 @@
82 82 </p>
83 83 </div>
84 84 </div>
85   - <div class="row">
86   - <div class="col-xs-6">
87   - <button type="button" ng-click="pageSignin.authWithFacebook()" class="btn btn-lg btn-block btn-social btn-facebook">
88   - <span aria-hidden="true" class="icon-circle icon-small icon-circle-social-facebook">
89   - <span class="icon icon-social-facebook"></span>
90   - </span>
91   - <span class="text">Entrar com Facebook</span>
92   - </button>
93   - </div>
94   - <div class="col-xs-6">
95   - <button type="button" ng-click="pageSignin.authWithGooglePlus()" class="btn btn-lg btn-block btn-social btn-google-plus">
96   - <span aria-hidden="true" class="icon-circle icon-small icon-circle-social-googleplus">
97   - <span class="icon icon-social-googleplus"></span>
98   - </span>
99   - <span class="text">Entrar com Google+</span>
100   - </button>
  85 + <div class="row" ng-if="pageSignin.errorMessage">
  86 + <div class="col-sm-12">
  87 + <div class="alert alert-danger">
  88 + {{pageSignin.errorMessage}}
  89 + </div>
  90 + <div ng-if="vm.internalError">
  91 + <p>Este erro parece ser um problema interno.<br/>Por favor, tente novamente mais tarde.</p>
  92 + <p>Caso o problema persista, entre em contato!</p>
  93 + <p><a ui-sref="duvidas">Ir para página de contato</a></p>
  94 + </div>
101 95 </div>
102 96 </div>
103 97 <div class="row">
104 98 <div class="col-sm-12">
105   - <hr class="separator separator-cadastro"></hr>
106   - </div>
107   - <div class="row">
108   - <div class="col-sm-12">
109   - <form name="signupForm" ng-submit="pageSignin.submitSigup(pageSignin.signup)">
110   - <div class="form-group">
111   - <label for="signup-form--name">Nome*:</label>
112   - <span class="pull-right">*Dados obrigatórios</span>
113   - <input type="text" id="signup-form--name" name="name" class="form-control input-lg" ng-class="{ 'has-error' : signupForm.name.$invalid && signupForm.name.$touched }" ng-model="pageSignin.signup.name" ng-minlength="" ng-maxlength="" required>
114   - <validation-messages field="signupForm.name"/>
115   - </div>
116   - <div class="form-group">
117   - <label for="signup-form--email">E-mail*:</label>
118   - <input type="email" id="signup-form--email" name="email" class="form-control input-lg" ng-class="{ 'has-error' : signupForm.email.$invalid && signupForm.email.$touched }" ng-model="pageSignin.signup.email" ng-minlength="" ng-maxlength="" required>
119   - <validation-messages field="signupForm.email"/>
  99 + <form name="signupForm" ng-submit="pageSignin.submitSigup(pageSignin.signup)">
  100 + <div class="form-group">
  101 + <label for="signup-form--name">Nome*:</label>
  102 + <span class="pull-right">*Dados obrigatórios</span>
  103 + <input type="text" id="signup-form--name" name="name" class="form-control input-lg" ng-class="{ 'has-error' : signupForm.name.$invalid && signupForm.name.$touched }" ng-model="pageSignin.signup.name" ng-minlength="" ng-maxlength="" required>
  104 + <validation-messages field="signupForm.name"/>
  105 + </div>
  106 + <div class="form-group">
  107 + <label for="signup-form--email">E-mail*:</label>
  108 + <input type="email" id="signup-form--email" name="email" class="form-control input-lg" ng-class="{ 'has-error' : signupForm.email.$invalid && signupForm.email.$touched }" ng-model="pageSignin.signup.email" ng-minlength="" ng-maxlength="" required>
  109 + <validation-messages field="signupForm.email"/>
  110 + </div>
  111 + <div class="row">
  112 + <div class="col-sm-6">
  113 + <div class="form-group">
  114 + <label for="signup-form--password">Senha*:</label>
  115 + <input type="password" id="signup-form--password" name="password" class="form-control input-lg" ng-class="{ 'has-error' : signupForm.password.$invalid && signupForm.password.$touched }" ng-model="pageSignin.signup.password" ng-minlength="" ng-maxlength="" required>
  116 + <validation-messages field="signupForm.password"/>
  117 + </div>
120 118 </div>
121   - <div class="row">
122   - <div class="col-sm-6">
123   - <div class="form-group">
124   - <label for="signup-form--password">Senha*:</label>
125   - <input type="password" id="signup-form--password" name="password" class="form-control input-lg" ng-class="{ 'has-error' : signupForm.password.$invalid && signupForm.password.$touched }" ng-model="pageSignin.signup.password" ng-minlength="" ng-maxlength="" required>
126   - <validation-messages field="signupForm.password"/>
127   - </div>
  119 + <div class="col-sm-6">
  120 + <div class="form-group">
  121 + <label for="signup-form--password-confirmation">Confirmar Senha*:</label>
  122 + <input type="password" id="signup-form--password-confirmation" name="password_confirmation" class="form-control input-lg" ng-class="{ 'has-error' : signupForm.password_confirmation.$invalid && signupForm.password_confirmation.$touched }" ng-model="pageSignin.signup.password_confirmation" ng-minlength="" ng-maxlength="" required>
  123 + <validation-messages field="signupForm.password_confirmation"/>
128 124 </div>
129   - <div class="col-sm-6">
130   - <div class="form-group">
131   - <label for="signup-form--password-confirmation">Confirmar Senha*:</label>
132   - <input type="password" id="signup-form--password-confirmation" name="password_confirmation" class="form-control input-lg" ng-class="{ 'has-error' : signupForm.password_confirmation.$invalid && signupForm.password_confirmation.$touched }" ng-model="pageSignin.signup.password_confirmation" ng-minlength="" ng-maxlength="" required>
133   - <validation-messages field="signupForm.password_confirmation"/>
134   - </div>
  125 + </div>
  126 + </div>
  127 + <div class="row">
  128 + <div class="col-sm-12" ng-show="(signupForm.password.$viewValue.length > 0 && signupForm.password_confirmation.$viewValue.length > 0) && (signupForm.password.$viewValue !== signupForm.password_confirmation.$viewValue)">
  129 + <div class="error-message">
  130 + As senhas estão diferentes.
135 131 </div>
136 132 </div>
137   - <div class="row">
138   - <div class="col-sm-12" ng-show="(signupForm.password.$viewValue.length > 0 && signupForm.password_confirmation.$viewValue.length > 0) && (signupForm.password.$viewValue !== signupForm.password_confirmation.$viewValue)">
  133 + <div class="col-sm-12">
  134 + <span class="text" ng-show="signupForm.password.$viewValue.length > 0 && signupForm.password.$viewValue.length < 6">
139 135 <div class="error-message">
140   - As senhas estão diferentes.
  136 + A senha deve ter 6 ou mais caracteres e conter números e letras.
141 137 </div>
142   - </div>
143   - <div class="col-sm-12">
144   - <span class="text" ng-show="signupForm.password.$viewValue.length > 0 && signupForm.password.$viewValue.length < 6">
145   - <div class="error-message">
146   - A senha deve ter 6 ou mais caracteres e conter números e letras.
147   - </div>
148   - </span>
149   - </div>
  138 + </span>
150 139 </div>
151   - <div class="form-group">
152   - <div class="checkbox">
153   - <label for="user_terms_accepted">
154   - <input type="checkbox" id="user_terms_accepted" name="user_terms_accepted" value="aceito" ng-model="pageSignin.signup.user_terms_accepted" required>
155   - Já li e concordo com os
156   - <button type="button" class="btn btn-link" style="padding:0 0 4px 0;" data-toggle="modal" data-target="#modalTermosDeUso">Termos de Uso</button>
157   - </label>
158   - </div>
159   - </input>
160   - <validation-messages field="signupForm.user_terms_accepted"/>
161 140 </div>
162 141 <div class="form-group">
163   - <span>Digite o texto da imagem</span>
164   - <p>O Captcha vai aqui</p>
  142 + <div class="checkbox">
  143 + <label for="user_terms_accepted">
  144 + <input type="checkbox" id="user_terms_accepted" name="user_terms_accepted" value="aceito" ng-model="pageSignin.signup.user_terms_accepted" required>
  145 + Já li e concordo com os
  146 + <button type="button" class="btn btn-link" style="padding:0 0 4px 0;" data-toggle="modal" data-target="#modalTermosDeUso">Termos de Uso</button>
  147 + </label>
  148 + </div>
  149 + </input>
  150 + <validation-messages field="signupForm.user_terms_accepted"/>
  151 + </div>
  152 + <div class="form-group">
  153 + <div id="serpro_captcha" class="captcha">
165 154 </div>
166   - <div class="form-group">
167   - <button class="btn btn-lg btn-block btn-submit" ng-class=" {'disabled' : !pageSignin.signup.user_terms_accepted }" type="submit">Cadastrar</button>
  155 + <div class="captcha">
  156 + Digite os caracteres acima:
168 157 </div>
169   - </form>
170   - </div>
  158 + <div class="captcha">
  159 + <input type="text" name="captcha_text" id="captcha_text" aria-label="Escreva os caracteres do captcha aqui" ng-model="pageSignin.signup.captcha_text">
  160 + </div>
  161 + </div>
  162 + <div class="form-group">
  163 + <button class="btn btn-lg btn-block btn-submit" ng-class=" {'disabled' : !pageSignin.signup.user_terms_accepted }" type="submit">Cadastrar</button>
  164 + </div>
  165 + </form>
171 166 </div>
172 167 </div>
173 168 </div>
... ...
src/app/pages/footer/footer.html
... ... @@ -1,10 +0,0 @@
1   -<div id="footer">
2   - <div class="container">
3   - <div class="row">
4   - <div class="col-xs-12 text-center">
5   - <a id="termos-de-uso" ui-sref="termos-de-uso">Termos de uso</a>
6   - <a href="#header" style="position:absolute;right:0;top:-10px;" ng-click="scrollTo('#header')">Voltar para o topo</a>
7   - </div>
8   - </div>
9   - </div>
10   -</div>
src/app/pages/footer/footer.scss
... ... @@ -1,21 +0,0 @@
1   -$barra-theme: ("green": #00420c, "yellow": #2c66ce, "blue": #0042b1);
2   -
3   -#footer-brasil {
4   - background: none repeat scroll 0% 0% map-get($barra-theme, "blue");
5   - padding: 1em 0px;
6   - max-width: 100%;
7   -}
8   -
9   -#footer {
10   - padding: 20px 0;
11   - a {
12   - margin: 10px auto;
13   - }
14   -
15   - .contraste & {
16   - background-color: #000;
17   - a {
18   - color: #fff;
19   - }
20   - }
21   -}
src/app/pages/header/header.html
... ... @@ -1,20 +0,0 @@
1   -<header id="header" class="container">
2   -
3   - <div class="row hidden-xs">
4   - <div class="col-sm-12">
5   - <auth-user></auth-user>
6   - </div>
7   - </div>
8   -
9   - <div class="row">
10   - <div class="col-sm-12">
11   - <app-navbar></app-navbar>
12   - </div>
13   - </div>
14   -
15   - <!-- <div class="row">
16   - <div class="col-sm-12">
17   - <div ncy-breadcrumb></div>
18   - </div>
19   - </div> -->
20   -</header>
src/app/pages/header/header.scss
... ... @@ -1,6 +0,0 @@
1   -#header {
2   -
3   - @media (max-width: $screen-md) {
4   -
5   - }
6   -}
7 0 \ No newline at end of file
src/app/pages/programas/programa.controller.js
... ... @@ -76,6 +76,7 @@
76 76 vm.loadingTopProposals = true;
77 77 vm.DialogaService.getProposalsByTopicId(vm.article.id, {}, function(data) {
78 78 vm.proposals = data.articles;
  79 + vm.proposalsTopFive = vm.proposals.slice(0, 5);
79 80 vm.proposalsTopRated = vm.proposals.slice(0, 3);
80 81 vm.loadingTopProposals = false;
81 82 }, function(error) {
... ...
src/app/pages/programas/programa.html
... ... @@ -111,7 +111,7 @@
111 111 </div>
112 112 </section>
113 113  
114   - <section id="section-proposal-list" class="proposal-extended-section" style="display:none;" ng-if="pagePrograma.proposals && pagePrograma.proposals.length > 0">
  114 + <section id="section-proposal-list" class="proposal-extended-section" style="display:none;" ng-if="pagePrograma.proposalsTopFive && pagePrograma.proposalsTopFive.length > 0">
115 115 <div class="container">
116 116 <div class="proposal-extended-section-header">
117 117 <h3 class="color-theme-fg">Resultados de propostas mais votadas</h3>
... ... @@ -120,7 +120,7 @@
120 120 </button>
121 121 </div>
122 122 <div class="proposal-extended-section-content">
123   - <proposal-list proposals="pagePrograma.proposals"></proposal-list>
  123 + <proposal-list proposals="pagePrograma.proposalsTopFive"></proposal-list>
124 124 </div>
125 125 </div>
126 126 </section>
... ...
src/app/pages/propostas/ranking.html
... ... @@ -78,7 +78,7 @@
78 78  
79 79 <div class="row">
80 80 <div class="col-sm-12" ng-if="pagePropostas.proposals">
81   - <proposal-list proposals="pagePropostas.filtredProposals"></proposal-list>
  81 + <proposal-list proposals="pagePropostas.filtredProposals" per-page="10"></proposal-list>
82 82 </div>
83 83 <div ng-if="!pagePropostas.proposals && pagePropostas.loadingProposals">
84 84 <div class="alert alert-info" role="alert">
... ...
src/assets/images/icons/sprite.png

107 KB

src/index.html
... ... @@ -37,7 +37,8 @@
37 37 <p class="browsehappy">Você está usando um navegador <strong>antigo</strong>. Por favor, <a href="http://browsehappy.com/">atualize o navegador</a> para melhorar a experiência de uso.</p>
38 38 <![endif]-->
39 39  
40   - <div ui-view="header"></div>
  40 + <app-header></app-header>
  41 +
41 42 <div id="content" ui-view="main"></div>
42 43 <div ui-view="footer"></div>
43 44  
... ... @@ -59,5 +60,6 @@
59 60 <!-- endinject -->
60 61 <!-- endbuild -->
61 62 <script defer="defer" src="http://barra.brasil.gov.br/barra.js" type="text/javascript"></script>
  63 + <script defer="defer" src="http://captcha2.servicoscorporativos.serpro.gov.br/js/captcha.serpro.gov.br.js"></script>
62 64 </body>
63 65 </html>
... ...