Commit 3cd6b93a32abcdf2ef6851b6d98831734f7049cb

Authored by Leonardo Merlin
2 parents 0de0ac1d 621fc752

Merge branch 'merlin' into rafael

@@ -5,4 +5,6 @@ bower_components/ @@ -5,4 +5,6 @@ bower_components/
5 .tmp/ 5 .tmp/
6 dist/ 6 dist/
7 .editorconfig 7 .editorconfig
8 -.gitignore 8 +
  9 +# ignore generated sprite
  10 +src/assets/images/icons/sprite.png
9 \ No newline at end of file 11 \ No newline at end of file
gulp/server.js
@@ -16,7 +16,7 @@ function browserSyncInit(baseDir, browser) { @@ -16,7 +16,7 @@ function browserSyncInit(baseDir, browser) {
16 browser = browser === undefined ? 'default' : browser; 16 browser = browser === undefined ? 'default' : browser;
17 17
18 var routes = null; 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 routes = { 20 routes = {
21 '/bower_components': 'bower_components' 21 '/bower_components': 'bower_components'
22 }; 22 };
@@ -34,29 +34,48 @@ function browserSyncInit(baseDir, browser) { @@ -34,29 +34,48 @@ function browserSyncInit(baseDir, browser) {
34 * 34 *
35 * For more details and option, https://github.com/chimurai/http-proxy-middleware/blob/v0.0.5/README.md 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 server.middleware = proxyMiddleware('/api', { 39 server.middleware = proxyMiddleware('/api', {
49 target: 'http://0.0.0.0:9000/', 40 target: 'http://0.0.0.0:9000/',
50 pathRewrite: { 41 pathRewrite: {
51 - // rewrite paths  
52 - '^/api/v1/articles' : '/articles' 42 + // rewrite paths
  43 + '^/api/v1/articles': '/articles'
53 }, 44 },
54 proxyTable: { 45 proxyTable: {
55 // when request.headers.host == 'dev.localhost:3000', 46 // when request.headers.host == 'dev.localhost:3000',
56 // override target 'http://www.example.org' to 'http://localhost:8000' 47 // override target 'http://www.example.org' to 'http://localhost:8000'
57 // 'dev.localhost:3000' : 'http://localhost:8000' 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,18 +92,18 @@ browserSync.use(browserSyncSpa({
73 selector: '[ng-app]'// Only needed for angular apps 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 browserSyncInit([path.join(conf.paths.tmp, '/serve'), conf.paths.src]); 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 browserSyncInit(conf.paths.dist); 100 browserSyncInit(conf.paths.dist);
82 }); 101 });
83 102
84 -gulp.task('serve:e2e', ['inject'], function () { 103 +gulp.task('serve:e2e', ['inject'], function() {
85 browserSyncInit([conf.paths.tmp + '/serve', conf.paths.src], []); 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 browserSyncInit(conf.paths.dist, []); 108 browserSyncInit(conf.paths.dist, []);
90 }); 109 });
src/app/components/app-footer/app-footer.directive.js 0 → 100644
@@ -0,0 +1,17 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -0,0 +1,6 @@
  1 +// #header {
  2 +
  3 +// @media (max-width: $screen-md) {
  4 +
  5 +// }
  6 +// }
0 \ No newline at end of file 7 \ No newline at end of file
src/app/components/auth/auth.service.js
@@ -8,10 +8,10 @@ @@ -8,10 +8,10 @@
8 .factory('AuthInterceptor', AuthInterceptor); 8 .factory('AuthInterceptor', AuthInterceptor);
9 9
10 /** @ngInject */ 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 function register (data){ 13 function register (data){
14 - var url = API.host + '/api/v1/register'; 14 + var url = PATH.host + '/api/v1/register';
15 $log.debug('data', data); 15 $log.debug('data', data);
16 // var encodedData = data; 16 // var encodedData = data;
17 var encodedData = ''; 17 var encodedData = '';
@@ -22,6 +22,8 @@ @@ -22,6 +22,8 @@
22 encodedData += '&password=' + data.password; 22 encodedData += '&password=' + data.password;
23 encodedData += '&password_confirmation=' + data.password_confirmation; 23 encodedData += '&password_confirmation=' + data.password_confirmation;
24 encodedData += '&user_terms_accepted=' + data.user_terms_accepted; 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 // var encodedData = _encodeObj(data); 28 // var encodedData = _encodeObj(data);
27 // var encodedData = angular.element.param(data); 29 // var encodedData = angular.element.param(data);
@@ -44,8 +46,8 @@ @@ -44,8 +46,8 @@
44 }, function(response) { 46 }, function(response) {
45 $log.debug('AuthService.register [FAIL] response', response); 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 <div class="app-navbar"> 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 <nav id="navigation" class="header-navbar navbar navbar-static-top" role="navigation"> 8 <nav id="navigation" class="header-navbar navbar navbar-static-top" role="navigation">
3 <div class="navbar-header"> 9 <div class="navbar-header">
4 <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar-collapse" aria-expanded="false"> 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,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 \ No newline at end of file 120 \ No newline at end of file
src/app/components/proposal-carousel/proposal-carousel.html
@@ -24,7 +24,7 @@ @@ -24,7 +24,7 @@
24 </div> 24 </div>
25 </div> 25 </div>
26 <div class="proposal-carousel-bottom color-theme-common-bg" ng-click="vm.showProposalsList()"> 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 <div class="proposal-carousel-bottom-icon"> 28 <div class="proposal-carousel-bottom-icon">
29 <span class="glyphicon glyphicon-chevron-down pull-right color-theme-common-fg"></span> 29 <span class="glyphicon glyphicon-chevron-down pull-right color-theme-common-fg"></span>
30 </div> 30 </div>
src/app/components/proposal-list/proposal-list.directive.js
@@ -33,8 +33,8 @@ @@ -33,8 +33,8 @@
33 throw { name: 'NotDefined', message: 'The attribute "proposals" is undefined.'}; 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 vm.initPorposalList(); 40 vm.initPorposalList();
@@ -50,10 +50,10 @@ @@ -50,10 +50,10 @@
50 vm.proposalsLength = vm.proposals.length; 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 } else{ 55 } else{
56 - vm.pages = (vm.proposalsLength / vm.per_page) + 1; 56 + vm.pages = (vm.proposalsLength / vm.perPage) + 1;
57 } 57 }
58 58
59 // vm.arraypages = new Array(Math.ceil(vm.pages)); 59 // vm.arraypages = new Array(Math.ceil(vm.pages));
@@ -81,8 +81,8 @@ @@ -81,8 +81,8 @@
81 ProposalListController.prototype.getProposalsPerPage = function (pageIndex) { 81 ProposalListController.prototype.getProposalsPerPage = function (pageIndex) {
82 var vm = this; 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 return vm.proposals.slice(initialIndex, finalIndex); 87 return vm.proposals.slice(initialIndex, finalIndex);
88 }; 88 };
@@ -132,7 +132,7 @@ @@ -132,7 +132,7 @@
132 templateUrl: 'app/components/proposal-list/proposal-list.html', 132 templateUrl: 'app/components/proposal-list/proposal-list.html',
133 scope: { 133 scope: {
134 proposals: '=', 134 proposals: '=',
135 - per_page: '=' 135 + perPage: '='
136 }, 136 },
137 controller: ProposalListController, 137 controller: ProposalListController,
138 controllerAs: 'vm', 138 controllerAs: 'vm',
src/app/components/proposal-list/proposal-list.html
@@ -27,8 +27,7 @@ @@ -27,8 +27,7 @@
27 <div class="row row-actions"> 27 <div class="row row-actions">
28 <div class="col-sm-8"> 28 <div class="col-sm-8">
29 <button type="button" class="btn btn-link btn-rate color-theme-common-fg" ng-click="vm.showContent(proposal)"> 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 </button> 31 </button>
33 </div> 32 </div>
34 <div class="col-sm-4"> 33 <div class="col-sm-4">
src/app/components/social-share/social-share.scss
1 .social-share { 1 .social-share {
  2 + min-width: 200px;
  3 + padding: 5px;
  4 + height: 47px;
  5 +
  6 + &:after {
  7 + clear: both;
  8 + }
  9 +
2 &.list-inline { 10 &.list-inline {
3 margin: 0; 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,65 +13,55 @@
13 ncyBreadcrumb: {label: 'Home'}, 13 ncyBreadcrumb: {label: 'Home'},
14 reloadOnSearch: false, 14 reloadOnSearch: false,
15 views: { 15 views: {
16 - 'header': { templateUrl: 'app/pages/header/header.html' },  
17 'main': { 16 'main': {
18 templateUrl: 'app/pages/inicio/inicio.html', 17 templateUrl: 'app/pages/inicio/inicio.html',
19 controller: 'InicioPageController', 18 controller: 'InicioPageController',
20 controllerAs: 'pageInicio' 19 controllerAs: 'pageInicio'
21 - },  
22 - 'footer': { templateUrl: 'app/pages/footer/footer.html' } 20 + }
23 } 21 }
24 }) 22 })
25 .state('entrar', { 23 .state('entrar', {
26 url: '/entrar?redirect_uri&message', 24 url: '/entrar?redirect_uri&message',
27 ncyBreadcrumb: {label: 'Entrar'}, 25 ncyBreadcrumb: {label: 'Entrar'},
28 views: { 26 views: {
29 - 'header': { templateUrl: 'app/pages/header/header.html' },  
30 'main': { 27 'main': {
31 templateUrl: 'app/pages/auth/signin.html', 28 templateUrl: 'app/pages/auth/signin.html',
32 controller: 'AuthPageController', 29 controller: 'AuthPageController',
33 controllerAs: 'pageSignin' 30 controllerAs: 'pageSignin'
34 - },  
35 - 'footer': { templateUrl: 'app/pages/footer/footer.html' } 31 + }
36 } 32 }
37 }) 33 })
38 .state('recuperar', { 34 .state('recuperar', {
39 url: '/recuperar', 35 url: '/recuperar',
40 ncyBreadcrumb: {label: 'Recuperar'}, 36 ncyBreadcrumb: {label: 'Recuperar'},
41 views: { 37 views: {
42 - 'header': { templateUrl: 'app/pages/header/header.html' },  
43 'main': { 38 'main': {
44 templateUrl: 'app/pages/auth/recover.html', 39 templateUrl: 'app/pages/auth/recover.html',
45 controller: 'AuthPageController', 40 controller: 'AuthPageController',
46 controllerAs: 'pageSignin' 41 controllerAs: 'pageSignin'
47 - },  
48 - 'footer': { templateUrl: 'app/pages/footer/footer.html' } 42 + }
49 } 43 }
50 }) 44 })
51 .state('alterar', { 45 .state('alterar', {
52 url: '/alterar', 46 url: '/alterar',
53 ncyBreadcrumb: {label: 'Alterar'}, 47 ncyBreadcrumb: {label: 'Alterar'},
54 views: { 48 views: {
55 - 'header': { templateUrl: 'app/pages/header/header.html' },  
56 'main': { 49 'main': {
57 templateUrl: 'app/pages/auth/change.html', 50 templateUrl: 'app/pages/auth/change.html',
58 controller: 'AuthPageController', 51 controller: 'AuthPageController',
59 controllerAs: 'pageSignin' 52 controllerAs: 'pageSignin'
60 - },  
61 - 'footer': { templateUrl: 'app/pages/footer/footer.html' } 53 + }
62 } 54 }
63 }) 55 })
64 .state('cadastrar', { 56 .state('cadastrar', {
65 url: '/cadastrar', 57 url: '/cadastrar',
66 ncyBreadcrumb: {label: 'Cadastrar'}, 58 ncyBreadcrumb: {label: 'Cadastrar'},
67 views: { 59 views: {
68 - 'header': { templateUrl: 'app/pages/header/header.html' },  
69 'main': { 60 'main': {
70 templateUrl: 'app/pages/auth/signup.html', 61 templateUrl: 'app/pages/auth/signup.html',
71 controller: 'AuthPageController', 62 controller: 'AuthPageController',
72 controllerAs: 'pageSignup' 63 controllerAs: 'pageSignup'
73 - },  
74 - 'footer': { templateUrl: 'app/pages/footer/footer.html' } 64 + }
75 } 65 }
76 }) 66 })
77 .state('programas', { 67 .state('programas', {
@@ -79,13 +69,11 @@ @@ -79,13 +69,11 @@
79 reloadOnSearch: false, 69 reloadOnSearch: false,
80 ncyBreadcrumb: {label: 'Programas'}, 70 ncyBreadcrumb: {label: 'Programas'},
81 views: { 71 views: {
82 - 'header': { templateUrl: 'app/pages/header/header.html' },  
83 'main': { 72 'main': {
84 templateUrl: 'app/pages/programas/programas.html', 73 templateUrl: 'app/pages/programas/programas.html',
85 controller: 'ProgramasPageController', 74 controller: 'ProgramasPageController',
86 controllerAs: 'pageProgramas' 75 controllerAs: 'pageProgramas'
87 - },  
88 - 'footer': { templateUrl: 'app/pages/footer/footer.html' } 76 + }
89 } 77 }
90 }) 78 })
91 .state('programa', { 79 .state('programa', {
@@ -96,13 +84,11 @@ @@ -96,13 +84,11 @@
96 parent: 'programas' 84 parent: 'programas'
97 }, 85 },
98 views: { 86 views: {
99 - 'header': { templateUrl: 'app/pages/header/header.html' },  
100 'main': { 87 'main': {
101 templateUrl: 'app/pages/programas/programa.html', 88 templateUrl: 'app/pages/programas/programa.html',
102 controller: 'ProgramaPageController', 89 controller: 'ProgramaPageController',
103 controllerAs: 'pagePrograma' 90 controllerAs: 'pagePrograma'
104 - },  
105 - 'footer': { templateUrl: 'app/pages/footer/footer.html' } 91 + }
106 } 92 }
107 }) 93 })
108 .state('propostas', { 94 .state('propostas', {
@@ -110,13 +96,11 @@ @@ -110,13 +96,11 @@
110 reloadOnSearch: false, 96 reloadOnSearch: false,
111 ncyBreadcrumb: {label: 'Propostas'}, 97 ncyBreadcrumb: {label: 'Propostas'},
112 views: { 98 views: {
113 - 'header': { templateUrl: 'app/pages/header/header.html' },  
114 'main': { 99 'main': {
115 templateUrl: 'app/pages/propostas/propostas.html', 100 templateUrl: 'app/pages/propostas/propostas.html',
116 controller: 'PropostasPageController', 101 controller: 'PropostasPageController',
117 controllerAs: 'pagePropostas' 102 controllerAs: 'pagePropostas'
118 - },  
119 - 'footer': { templateUrl: 'app/pages/footer/footer.html' } 103 + }
120 } 104 }
121 }) 105 })
122 .state('ranking', { 106 .state('ranking', {
@@ -124,13 +108,11 @@ @@ -124,13 +108,11 @@
124 reloadOnSearch: false, 108 reloadOnSearch: false,
125 ncyBreadcrumb: {label: 'Propostas'}, 109 ncyBreadcrumb: {label: 'Propostas'},
126 views: { 110 views: {
127 - 'header': { templateUrl: 'app/pages/header/header.html' },  
128 'main': { 111 'main': {
129 templateUrl: 'app/pages/propostas/ranking.html', 112 templateUrl: 'app/pages/propostas/ranking.html',
130 controller: 'PropostasPageController', 113 controller: 'PropostasPageController',
131 controllerAs: 'pagePropostas' 114 controllerAs: 'pagePropostas'
132 - },  
133 - 'footer': { templateUrl: 'app/pages/footer/footer.html' } 115 + }
134 } 116 }
135 }) 117 })
136 .state('propostas-conteudo', { 118 .state('propostas-conteudo', {
@@ -140,39 +122,33 @@ @@ -140,39 +122,33 @@
140 parent: 'propostas' 122 parent: 'propostas'
141 }, 123 },
142 views: { 124 views: {
143 - 'header': { templateUrl: 'app/pages/header/header.html' },  
144 'main': { 125 'main': {
145 templateUrl: 'app/pages/propostas/proposta.html', 126 templateUrl: 'app/pages/propostas/proposta.html',
146 controller: 'PropostasPageController', 127 controller: 'PropostasPageController',
147 controllerAs: 'pagePropostas' 128 controllerAs: 'pagePropostas'
148 - },  
149 - 'footer': { templateUrl: 'app/pages/footer/footer.html' } 129 + }
150 } 130 }
151 }) 131 })
152 .state('duvidas', { 132 .state('duvidas', {
153 url: '/duvidas', 133 url: '/duvidas',
154 ncyBreadcrumb: {label: 'Dúvidas'}, 134 ncyBreadcrumb: {label: 'Dúvidas'},
155 views: { 135 views: {
156 - 'header': { templateUrl: 'app/pages/header/header.html' },  
157 'main': { 136 'main': {
158 templateUrl: 'app/pages/duvidas/duvidas.html', 137 templateUrl: 'app/pages/duvidas/duvidas.html',
159 controller: 'DuvidasPageController', 138 controller: 'DuvidasPageController',
160 controllerAs: 'pageDuvidas' 139 controllerAs: 'pageDuvidas'
161 - },  
162 - 'footer': { templateUrl: 'app/pages/footer/footer.html' } 140 + }
163 } 141 }
164 }) 142 })
165 .state('sobre', { 143 .state('sobre', {
166 url: '/sobre', 144 url: '/sobre',
167 ncyBreadcrumb: {label: 'Sobre'}, 145 ncyBreadcrumb: {label: 'Sobre'},
168 views: { 146 views: {
169 - 'header': { templateUrl: 'app/pages/header/header.html' },  
170 'main': { 147 'main': {
171 templateUrl: 'app/pages/article/article.html', 148 templateUrl: 'app/pages/article/article.html',
172 controller: 'ArticlePageController', 149 controller: 'ArticlePageController',
173 controllerAs: 'pageArticle' 150 controllerAs: 'pageArticle'
174 - },  
175 - 'footer': { templateUrl: 'app/pages/footer/footer.html' } 151 + }
176 } 152 }
177 }) 153 })
178 .state('termos-de-uso', { 154 .state('termos-de-uso', {
@@ -180,35 +156,29 @@ @@ -180,35 +156,29 @@
180 ncyBreadcrumb: {label: 'Termos de Uso'}, 156 ncyBreadcrumb: {label: 'Termos de Uso'},
181 controller: 'ArticlePageController', 157 controller: 'ArticlePageController',
182 views: { 158 views: {
183 - 'header': { templateUrl: 'app/pages/header/header.html' },  
184 'main': { 159 'main': {
185 templateUrl: 'app/pages/article/article.html', 160 templateUrl: 'app/pages/article/article.html',
186 controller: 'ArticlePageController', 161 controller: 'ArticlePageController',
187 controllerAs: 'pageArticle' 162 controllerAs: 'pageArticle'
188 - },  
189 - 'footer': { templateUrl: 'app/pages/footer/footer.html' } 163 + }
190 } 164 }
191 }) 165 })
192 .state('mapa-do-site', { 166 .state('mapa-do-site', {
193 url: '/mapa-do-site', 167 url: '/mapa-do-site',
194 ncyBreadcrumb: {label: 'Mapa do Site'}, 168 ncyBreadcrumb: {label: 'Mapa do Site'},
195 views: { 169 views: {
196 - 'header': { templateUrl: 'app/pages/header/header.html' },  
197 'main': { 170 'main': {
198 templateUrl: 'app/pages/mapa-do-site/mapa-do-site.html', 171 templateUrl: 'app/pages/mapa-do-site/mapa-do-site.html',
199 controller: 'SitemapPageController', 172 controller: 'SitemapPageController',
200 controllerAs: 'sitemap' 173 controllerAs: 'sitemap'
201 - },  
202 - 'footer': { templateUrl: 'app/pages/footer/footer.html' } 174 + }
203 } 175 }
204 }) 176 })
205 .state('erro', { 177 .state('erro', {
206 url: '/erro', 178 url: '/erro',
207 ncyBreadcrumb: {label: 'Erro'}, 179 ncyBreadcrumb: {label: 'Erro'},
208 views: { 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,12 +4,13 @@
4 4
5 angular 5 angular
6 .module('dialoga') 6 .module('dialoga')
7 - .run(runAuth)  
8 - .run(runSocialAuth)  
9 .run(runAccessibility) 7 .run(runAccessibility)
  8 + .run(runAuth)
  9 + .run(runCaptcha)
  10 + .run(runColorUtils)
10 .run(runHistory) 11 .run(runHistory)
11 .run(runPath) 12 .run(runPath)
12 - .run(runColorUtils) 13 + .run(runSocialAuth)
13 .run(runUtils) 14 .run(runUtils)
14 .run(runBlock); 15 .run(runBlock);
15 16
@@ -45,18 +46,53 @@ @@ -45,18 +46,53 @@
45 } 46 }
46 47
47 /** @ngInject */ 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 function runSocialAuth($window, $rootScope, $interval, $log) { 84 function runSocialAuth($window, $rootScope, $interval, $log) {
49 85
50 - $window.oauthClientAction = function (url){ 86 + $window.oauthClientAction = function(url) {
51 var child = $window.open(url, '_blank'); 87 var child = $window.open(url, '_blank');
52 var interval = $interval(function() { 88 var interval = $interval(function() {
53 try { 89 try {
54 - if(!child.closed) { 90 + if (!child.closed) {
55 child.postMessage({ 91 child.postMessage({
56 message: 'requestOauthClientPluginResult' 92 message: 'requestOauthClientPluginResult'
57 }, '*'); 93 }, '*');
58 } 94 }
59 - } catch(e) { 95 + } catch (e) {
60 // we're here when the child window has been navigated away or closed 96 // we're here when the child window has been navigated away or closed
61 if (child.closed) { 97 if (child.closed) {
62 $interval.cancel(interval); 98 $interval.cancel(interval);
@@ -118,7 +154,7 @@ @@ -118,7 +154,7 @@
118 // prevent skip link from redirecting 154 // prevent skip link from redirecting
119 if ($event) { $event.preventDefault(); } 155 if ($event) { $event.preventDefault(); }
120 156
121 - if(angular.isString(target)){ 157 + if (angular.isString(target)) {
122 target = angular.element(target); 158 target = angular.element(target);
123 } 159 }
124 160
@@ -137,7 +173,7 @@ @@ -137,7 +173,7 @@
137 $rootScope.$previousState.splice(-MAX_HISTORY, MAX_HISTORY); 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 return $rootScope.$previousState.pop(); 177 return $rootScope.$previousState.pop();
142 }; 178 };
143 } 179 }
@@ -178,7 +214,7 @@ @@ -178,7 +214,7 @@
178 214
179 /** @ngInject */ 215 /** @ngInject */
180 function runUtils($rootScope) { 216 function runUtils($rootScope) {
181 - $rootScope.stripHtml = function (text) { 217 + $rootScope.stripHtml = function(text) {
182 return String(text).replace(/<[^>]+>/gm, ''); 218 return String(text).replace(/<[^>]+>/gm, '');
183 }; 219 };
184 } 220 }
src/app/index.scss
@@ -155,34 +155,6 @@ body { @@ -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 .icon { 158 .icon {
187 display: inline-block; 159 display: inline-block;
188 vertical-align: middle; 160 vertical-align: middle;
src/app/pages/auth/auth.controller.js
@@ -6,7 +6,7 @@ @@ -6,7 +6,7 @@
6 .controller('AuthPageController', AuthPageController); 6 .controller('AuthPageController', AuthPageController);
7 7
8 /** @ngInject */ 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 var vm = this; 10 var vm = this;
11 11
12 vm.$scope = $scope; 12 vm.$scope = $scope;
@@ -15,6 +15,7 @@ @@ -15,6 +15,7 @@
15 vm.$location = $location; 15 vm.$location = $location;
16 vm.$state = $state; 16 vm.$state = $state;
17 vm.$timeout = $timeout; 17 vm.$timeout = $timeout;
  18 + vm.$interval = $interval;
18 vm.AUTH_EVENTS = AUTH_EVENTS; 19 vm.AUTH_EVENTS = AUTH_EVENTS;
19 vm.AuthService = AuthService; 20 vm.AuthService = AuthService;
20 vm.DialogaService = DialogaService; 21 vm.DialogaService = DialogaService;
@@ -78,14 +79,38 @@ @@ -78,14 +79,38 @@
78 AuthPageController.prototype.attachListeners = function() { 79 AuthPageController.prototype.attachListeners = function() {
79 var vm = this; 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 vm.$scope.$on('oauthClientPluginResult', function(event, response) { 95 vm.$scope.$on('oauthClientPluginResult', function(event, response) {
82 vm.$log.debug('response', response); 96 vm.$log.debug('response', response);
83 97
84 // var logged_id = response.data.logged_id; 98 // var logged_id = response.data.logged_id;
85 // var private_token = response.data.private_token; 99 // var private_token = response.data.private_token;
86 // var user = response.data.user; 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 AuthPageController.prototype.onClickLogout = function() { 116 AuthPageController.prototype.onClickLogout = function() {
@@ -94,7 +119,7 @@ @@ -94,7 +119,7 @@
94 vm.AuthService.logout(); 119 vm.AuthService.logout();
95 }; 120 };
96 121
97 - AuthPageController.prototype.submitSigup = function(credentials) { 122 + AuthPageController.prototype.submitSingup = function(credentials) {
98 var vm = this; 123 var vm = this;
99 124
100 vm.AuthService.register(credentials).then(function(response) { 125 vm.AuthService.register(credentials).then(function(response) {
@@ -108,8 +133,19 @@ @@ -108,8 +133,19 @@
108 }, function(response) { 133 }, function(response) {
109 vm.$log.debug('register error.response', response); 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 // TODO: mensagens de erro 144 // TODO: mensagens de erro
112 // TODO: tratar multiplos erros 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,15 +173,14 @@
137 173
138 // start countdown 174 // start countdown
139 vm.countdown = vm.delay; 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 vm.$timeout(function() { 185 vm.$timeout(function() {
151 var state = vm.params.state; 186 var state = vm.params.state;
src/app/pages/auth/signin.html
@@ -82,92 +82,87 @@ @@ -82,92 +82,87 @@
82 </p> 82 </p>
83 </div> 83 </div>
84 </div> 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 </div> 95 </div>
102 </div> 96 </div>
103 <div class="row"> 97 <div class="row">
104 <div class="col-sm-12"> 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 </div> 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 </div> 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 </div> 131 </div>
136 </div> 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 <div class="error-message"> 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 </div> 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 </div> 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 </div> 140 </div>
162 <div class="form-group"> 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 </div> 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 </div> 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 </div> 166 </div>
172 </div> 167 </div>
173 </div> 168 </div>
src/app/pages/footer/footer.html
@@ -1,10 +0,0 @@ @@ -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,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,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,6 +0,0 @@
1 -#header {  
2 -  
3 - @media (max-width: $screen-md) {  
4 -  
5 - }  
6 -}  
7 \ No newline at end of file 0 \ No newline at end of file
src/app/pages/programas/programa.controller.js
@@ -76,6 +76,7 @@ @@ -76,6 +76,7 @@
76 vm.loadingTopProposals = true; 76 vm.loadingTopProposals = true;
77 vm.DialogaService.getProposalsByTopicId(vm.article.id, {}, function(data) { 77 vm.DialogaService.getProposalsByTopicId(vm.article.id, {}, function(data) {
78 vm.proposals = data.articles; 78 vm.proposals = data.articles;
  79 + vm.proposalsTopFive = vm.proposals.slice(0, 5);
79 vm.proposalsTopRated = vm.proposals.slice(0, 3); 80 vm.proposalsTopRated = vm.proposals.slice(0, 3);
80 vm.loadingTopProposals = false; 81 vm.loadingTopProposals = false;
81 }, function(error) { 82 }, function(error) {
src/app/pages/programas/programa.html
@@ -111,7 +111,7 @@ @@ -111,7 +111,7 @@
111 </div> 111 </div>
112 </section> 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 <div class="container"> 115 <div class="container">
116 <div class="proposal-extended-section-header"> 116 <div class="proposal-extended-section-header">
117 <h3 class="color-theme-fg">Resultados de propostas mais votadas</h3> 117 <h3 class="color-theme-fg">Resultados de propostas mais votadas</h3>
@@ -120,7 +120,7 @@ @@ -120,7 +120,7 @@
120 </button> 120 </button>
121 </div> 121 </div>
122 <div class="proposal-extended-section-content"> 122 <div class="proposal-extended-section-content">
123 - <proposal-list proposals="pagePrograma.proposals"></proposal-list> 123 + <proposal-list proposals="pagePrograma.proposalsTopFive"></proposal-list>
124 </div> 124 </div>
125 </div> 125 </div>
126 </section> 126 </section>
src/app/pages/propostas/ranking.html
@@ -78,7 +78,7 @@ @@ -78,7 +78,7 @@
78 78
79 <div class="row"> 79 <div class="row">
80 <div class="col-sm-12" ng-if="pagePropostas.proposals"> 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 </div> 82 </div>
83 <div ng-if="!pagePropostas.proposals && pagePropostas.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">
src/assets/images/icons/sprite.png

107 KB

src/index.html
@@ -37,7 +37,8 @@ @@ -37,7 +37,8 @@
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> 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 <![endif]--> 38 <![endif]-->
39 39
40 - <div ui-view="header"></div> 40 + <app-header></app-header>
  41 +
41 <div id="content" ui-view="main"></div> 42 <div id="content" ui-view="main"></div>
42 <div ui-view="footer"></div> 43 <div ui-view="footer"></div>
43 44
@@ -59,5 +60,6 @@ @@ -59,5 +60,6 @@
59 <!-- endinject --> 60 <!-- endinject -->
60 <!-- endbuild --> 61 <!-- endbuild -->
61 <script defer="defer" src="http://barra.brasil.gov.br/barra.js" type="text/javascript"></script> 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 </body> 64 </body>
63 </html> 65 </html>