Commit 2de2dbb581e74e3f54a0085d989e752dd915bb54

Authored by Leandro Santos
2 parents 22605e44 36ca8cfd

Merge branch 'master' of gitlab.com:participa/proposal-app

Showing 1 changed file with 130 additions and 100 deletions   Show diff stats
js/main.js
... ... @@ -3,20 +3,20 @@ define(['handlebars'], function(Handlebars){
3 3 /* global Handlebars, $ */
4 4 // The template code
5 5 var templateSource = document.getElementById('proposal-template').innerHTML;
6   -
  6 +
7 7 // compile the template
8 8 var template = Handlebars.compile(templateSource);
9 9 var supportProposalTemplate = Handlebars.compile(document.getElementById('support-proposal-template').innerHTML);
10 10 var loginTemplate = Handlebars.compile(document.getElementById('login').innerHTML);
11 11 var resultsTemplate = Handlebars.compile(document.getElementById('results').innerHTML);
12   -
  12 +
13 13 // The div/container that we are going to display the results in
14 14 var resultsPlaceholder = document.getElementById('proposal-result');
15   -
  15 +
16 16 var logged_in = false;
17   -
  17 +
18 18 var loginButton;
19   -
  19 +
20 20 var participa = true;
21 21 if(participa){
22 22 var host = 'http://www.participa.br';
... ... @@ -29,10 +29,10 @@ define(['handlebars'], function(Handlebars){
29 29 var proposal_discussion = '632'; //local serpro
30 30 //var proposal_discussion = '401'; //casa
31 31 }
32   -
  32 +
33 33 // Load data from localhost when it is dev env.
34 34 var noosferoAPI = host + '/api/v1/articles/' + proposal_discussion + '?private_token=' + private_token + '&fields=id,children,categories,abstract,body,title,image,url';
35   -
  35 +
36 36 $.getJSON(noosferoAPI)
37 37 .done(function( data ) {
38 38 data.host = host;
... ... @@ -40,66 +40,66 @@ define(['handlebars'], function(Handlebars){
40 40 resultsPlaceholder.innerHTML = template(data);
41 41 $('.login-container').html(loginTemplate());
42 42 $('.countdown').maxlength({text: '%left caracteres restantes'});
43   -
  43 +
44 44 navigateTo(window.location.hash);
45   -
  45 +
46 46 //Actions for links
47 47 $( '#nav-proposal-categories a' ).on('click touchstart', function(e){
48 48 e.preventDefault();
49   -
  49 +
50 50 var $link = $(this);
51   -
  51 +
52 52 // Update URL and Navigate
53 53 updateHash($link.attr('href'));
54 54 });
55   -
  55 +
56 56 $( '#nav-proposal-group a' ).on('click touchstart', function(e){
57 57 e.preventDefault();
58   -
  58 +
59 59 var $link = $(this);
60   -
  60 +
61 61 // Update URL and Navigate
62 62 updateHash($link.attr('href'));
63 63 });
64   -
  64 +
65 65 $( '.proposal-item a' ).on('click touchstart', function(e){
66 66 e.preventDefault();
67   -
  67 +
68 68 var $link = $(this);
69   -
  69 +
70 70 // Update URL and Navigate
71 71 updateHash($link.attr('href'));
72 72 });
73   -
  73 +
74 74 $( '.proposal-category a' ).on('click touchstart', function(e){
75 75 e.preventDefault();
76   -
  76 +
77 77 var $link = $(this);
78   -
  78 +
79 79 // Update URL and Navigate
80 80 updateHash($link.attr('href'));
81 81 });
82   -
  82 +
83 83 $( '.proposal-category .go-back' ).on('click touchstart', function(e){
84 84 e.preventDefault();
85   -
  85 +
86 86 var oldHash = window.location.hash;
87 87 var regexSubpages = /sobre-o-programa$/;
88 88 var isSubpage = regexSubpages.exec(oldHash) !== null;
89 89 var newHash = '#/temas'; // default page
90   -
  90 +
91 91 if(isSubpage){
92 92 // return to proposal page
93 93 newHash = oldHash.split('/sobre-o-programa')[0];
94 94 }
95   -
  95 +
96 96 // Update URL and Navigate
97 97 updateHash(newHash);
98 98 });
99   -
  99 +
100 100 $( '.send-button a' ).on('click touchstart', function(e){
101 101 e.preventDefault();
102   -
  102 +
103 103 //display form to send proposal (or login form for non-logged users)
104 104 var $this = $(this);
105 105 loginButton = $this.parents('.send-button');
... ... @@ -107,41 +107,41 @@ define(['handlebars'], function(Handlebars){
107 107 $this.parents('.success-proposal-sent').hide();
108 108 loginCallback(logged_in);
109 109 });
110   -
  110 +
111 111 $( '#display-contrast' ).on('click touchstart', function(e){
112 112 e.preventDefault();
113 113 $('#proposal-result').toggleClass('contrast');
114 114 });
115   -
  115 +
116 116 $( '.show_body a' ).on('click touchstart', function(e){
117 117 e.preventDefault();
118   -
  118 +
119 119 var $link = $(this);
120   -
  120 +
121 121 // Update URL and Navigate
122 122 updateHash($link.attr('href'));
123 123 });
124   -
  124 +
125 125 $( '.go-to-proposal-button a' ).on('click touchstart', function(e){
126 126 e.preventDefault();
127   -
  127 +
128 128 var $link = $(this);
129   -
  129 +
130 130 // Update URL and Navigate
131 131 updateHash($link.attr('href'));
132 132 });
133   -
  133 +
134 134 $( '.proposal-selection' ).change(function(e){
135 135 e.preventDefault();
136   -
  136 +
137 137 display_proposal('proposal-item-' + this.value);
138 138 });
139   -
  139 +
140 140 var availableTags = [ ];
141 141 $('#proposal-group li a').each(function(){
142 142 availableTags.push({ label: $(this).text(), value: $(this).attr('href')});
143 143 });
144   -
  144 +
145 145 $( '#search-input' ).autocomplete({
146 146 source: availableTags,
147 147 minLength: 3,
... ... @@ -155,8 +155,8 @@ define(['handlebars'], function(Handlebars){
155 155 results: function() {}
156 156 }
157 157 });
158   -
159   -
  158 +
  159 +
160 160 $('.save-article-form').submit(function (e) {
161 161 e.preventDefault();
162 162 var proposal_id = this.id.split('-').pop();
... ... @@ -182,33 +182,33 @@ define(['handlebars'], function(Handlebars){
182 182 message.text('Não foi possível enviar.');
183 183 });
184 184 });
185   -
  185 +
186 186 })
187 187 .fail(function( jqxhr, textStatus, error ) {
188 188 var err = textStatus + ', ' + error;
189 189 console.log( 'Request Failed: ' + err );
190 190 });
191   -
  191 +
192 192 function loadRandomProposal(topic_id, private_token) {
193 193 var $noProposals = $('.no-proposals');
194 194 var $loading = $('.loading');
195 195 var $randomProposal = $('.random-proposal');
196 196 var $body = $(document.body);
197   -
  197 +
198 198 // reset view
199 199 $noProposals.hide();
200 200 $loading.show();
201 201 $randomProposal.html('');
202   -
  202 +
203 203 var url = host + '/api/v1/articles/' + topic_id + '/children' + '?private_token=' + private_token + '&limit=1&order=random()&_='+new Date().getTime()+'&fields=id,name,abstract,created_by&content_type=ProposalsDiscussionPlugin::Proposal';
204 204 $.getJSON(url).done(function( data ) {
205 205 $loading.hide();
206   -
  206 +
207 207 if(data.articles.length === 0) {
208 208 $noProposals.show();
209 209 return;
210 210 }
211   -
  211 +
212 212 var article = data.articles[0];
213 213 $randomProposal.html(supportProposalTemplate(article));
214 214 $body.off('click', '.vote-actions .skip');
... ... @@ -218,6 +218,13 @@ define(['handlebars'], function(Handlebars){
218 218 });
219 219 $body.off('click', '.vote-actions .like');
220 220 $body.on('click', '.vote-actions .like', function(e) {
  221 + //Helps to prevent more than one vote per proposal
  222 + if(hasProposalbeenVoted(article.id)){
  223 + console.log("Proposta " + article.id + " já havia sido votada");
  224 + loadRandomProposal(topic_id, private_token);
  225 + e.preventDefault();
  226 + return;
  227 + }
221 228 $.ajax({
222 229 type: 'post',
223 230 url: host + '/api/v1/articles/' + article.id + '/vote',
... ... @@ -226,34 +233,35 @@ define(['handlebars'], function(Handlebars){
226 233 private_token: private_token
227 234 }
228 235 }).done(function( /*data*/ ) {
  236 + addVotedProposal(article.id);
229 237 loadRandomProposal(topic_id, private_token);
230 238 });
231 239 e.preventDefault();
232 240 });
233   -
  241 +
234 242 $body.off('click', '.vote-result');
235 243 $body.on('click', '.vote-result', function(e) {
236   -
  244 +
237 245 var $this = $(this);
238 246 var $proposalDetail = $this.parents('.proposal-detail');
239 247 var $resultsContainer = $proposalDetail.find('.results-container');
240   -
  248 +
241 249 // $resultsContainer.toggle();
242 250 // $resultsContainer.toggleClass('hide');
243   -
  251 +
244 252 if($resultsContainer.css('display') === 'none') {
245   -
  253 +
246 254 $resultsContainer.find('.loading').show();
247 255 $resultsContainer.find('.results-content').hide();
248   -
  256 +
249 257 var url = host + '/api/v1/articles/' + topic_id + '/children' + '?private_token=' + private_token + '&limit=10&order=votes_score&fields=id,name,abstract,votes_for,votes_against&content_type=ProposalsDiscussionPlugin::Proposal';
250 258 $.getJSON(url).done(function( data ) {
251   -
  259 +
252 260 $resultsContainer.html(resultsTemplate(data));
253 261 $resultsContainer.find('.loading').hide();
254 262 $resultsContainer.find('.results-content').show();
255 263 $resultsContainer.show();
256   -
  264 +
257 265 // scroll to the end
258 266 $('html, body').animate({
259 267 scrollTop: $(document).height()
... ... @@ -266,12 +274,12 @@ define(['handlebars'], function(Handlebars){
266 274 $('.talk-proposal-container').show();
267 275 $resultsContainer.hide();
268 276 }
269   -
  277 +
270 278 e.preventDefault();
271 279 });
272 280 });
273 281 }
274   -
  282 +
275 283 $(document).ready(function($) {
276 284 if($.cookie('_dialoga_session')) {
277 285 var url = host + '/api/v1/users/me?private_token=' + $.cookie('_dialoga_session');
... ... @@ -280,7 +288,7 @@ define(['handlebars'], function(Handlebars){
280 288 private_token = $.cookie('_dialoga_session');
281 289 });
282 290 }
283   -
  291 +
284 292 $(document).on('click', '.login-action', function(e) {
285 293 var message = $('.login .message');
286 294 message.hide();
... ... @@ -301,11 +309,11 @@ define(['handlebars'], function(Handlebars){
301 309 e.preventDefault();
302 310 });
303 311 });
304   -
  312 +
305 313 function loginCallback(loggedIn, token) {
306 314 logged_in = loggedIn;
307 315 $('.login .message').text('');
308   -
  316 +
309 317 if(logged_in) {
310 318 if(token){
311 319 private_token = token;
... ... @@ -323,7 +331,7 @@ define(['handlebars'], function(Handlebars){
323 331 function oauthPluginHandleLoginResult(loggedIn, token) {
324 332 loginCallback(loggedIn, token);
325 333 }
326   -
  334 +
327 335 function guid() {
328 336 function s4() {
329 337 return Math.floor((1 + Math.random()) * 0x10000)
... ... @@ -331,7 +339,7 @@ define(['handlebars'], function(Handlebars){
331 339 .substring(1);
332 340 }
333 341 }
334   -
  342 +
335 343 function display_category_tab(){
336 344 $('#proposal-group').hide();
337 345 $('#proposal-categories').show();
... ... @@ -340,22 +348,22 @@ define(['handlebars'], function(Handlebars){
340 348 $('.proposal-category-items').hide();
341 349 $('.proposal-category .arrow-box').hide();
342 350 $('.proposal-detail').hide();
343   -
  351 +
344 352 $('#content').show();
345 353 $('nav').show();
346 354 }
347   -
  355 +
348 356 function display_proposals_tab(){
349 357 $('#proposal-categories').hide();
350 358 $('#proposal-group').show();
351 359 $('#nav-proposal-group a').addClass('active');
352 360 $('#nav-proposal-categories a').removeClass('active');
353 361 $('.proposal-item p').dotdotdot();
354   -
  362 +
355 363 $('#content').show();
356 364 $('nav').show();
357 365 }
358   -
  366 +
359 367 function display_proposal(proposal_id){
360 368 $('#proposal-categories').hide();
361 369 $('#proposal-group').hide();
... ... @@ -364,7 +372,7 @@ define(['handlebars'], function(Handlebars){
364 372 $('.make-proposal-form').hide();
365 373 $('.login-container').hide();
366 374 $('.proposal-detail').hide();
367   -
  375 +
368 376 $('.proposal-detail-base').hide();
369 377 $('#' + proposal_id).show();
370 378 $('.proposal-header').show();
... ... @@ -375,11 +383,11 @@ define(['handlebars'], function(Handlebars){
375 383 $('.results-container .results-content').hide();
376 384 $('.experience-proposal-container').show();
377 385 $('.talk-proposal-container').show();
378   -
  386 +
379 387 var topic_id = proposal_id.split('-').pop();
380 388 loadRandomProposal(topic_id, private_token);
381 389 }
382   -
  390 +
383 391 function display_proposal_detail(){
384 392 $('#proposal-categories').hide();
385 393 $('#proposal-group').hide();
... ... @@ -392,13 +400,13 @@ define(['handlebars'], function(Handlebars){
392 400 $('.results-container').hide();
393 401 $('.experience-proposal-container').hide();
394 402 $('.talk-proposal-container').hide();
395   -
  403 +
396 404 $('.body').show();
397 405 }
398   -
  406 +
399 407 function display_proposal_by_category(item){
400 408 var $item = $('#' + item);
401   -
  409 +
402 410 if($item.hasClass('proposal-category-items')){
403 411 //Display Topics or Discussion by category
404 412 $('nav').show();
... ... @@ -415,13 +423,13 @@ define(['handlebars'], function(Handlebars){
415 423 $('#proposal-category-' + categorySlug).find('.arrow-box').show();
416 424 }
417 425 }
418   -
  426 +
419 427 var BARRA_ADDED = false;
420 428 function addBarraDoGoverno(){
421 429 console.log('add barra');
422   -
  430 +
423 431 if( BARRA_ADDED ) { return; }
424   -
  432 +
425 433 var HTML_BODY_PREPEND = '' +
426 434 '<div id="barra-brasil" style="background:#7F7F7F; height: 20px; padding:0 0 0 10px;display:block;"> ' +
427 435 '<ul id="menu-barra-temp" style="list-style:none;">' +
... ... @@ -429,11 +437,11 @@ define([&#39;handlebars&#39;], function(Handlebars){
429 437 '<li><a style="font-family:sans,sans-serif; text-decoration:none; color:white;" href="http://epwg.governoeletronico.gov.br/barra/atualize.html">Atualize sua Barra de Governo</a></li>' +
430 438 '</ul>' +
431 439 '</div>';
432   -
  440 +
433 441 var HTML_BODY_APPEND = ''+
434 442 '<div id="footer-brasil"></div>' +
435 443 '<script defer="defer" src="http://barra.brasil.gov.br/barra.js" type="text/javascript"></script>';
436   -
  444 +
437 445 var STYLE_TEMA_AZUL = '' +
438 446 '<style>'+
439 447 '#footer-brasil {'+
... ... @@ -446,88 +454,88 @@ define([&#39;handlebars&#39;], function(Handlebars){
446 454 'width: auto;'+
447 455 '}'+
448 456 '<style>';
449   -
  457 +
450 458 var $body = $(document.body);
451 459 $body.prepend(HTML_BODY_PREPEND);
452 460 $body.append(HTML_BODY_APPEND);
453 461 $body.append(STYLE_TEMA_AZUL);
454   -
  462 +
455 463 BARRA_ADDED = true;
456 464 }
457   -
  465 +
458 466 function updateHash(hash){
459 467 var id = hash.replace(/^.*#/, '');
460 468 var elem = document.getElementById(id);
461   -
  469 +
462 470 // preserve the query param
463 471 // if (HIDE_BARRA_DO_GOVERNO && (hash.indexOf('?barra=false') === -1)){
464 472 // hash += '?barra=false';
465 473 // }
466   -
  474 +
467 475 if ( !elem ) {
468 476 window.location.hash = hash;
469 477 return;
470 478 }
471   -
  479 +
472 480 elem.id = id+'-tmp';
473 481 window.location.hash = hash;
474 482 elem.id = id;
475 483 }
476   -
  484 +
477 485 function locationHashChanged(){
478 486 var hash = window.location.hash;
479 487 navigateTo(hash);
480 488 }
481   -
  489 +
482 490 var HIDE_BARRA_DO_GOVERNO = false;
483 491 function navigateTo(hash){
484 492 var regexProposals = /#\/programas/;
485 493 var regexCategory = /#\/temas/;
486 494 var regexHideBarra = /barra=false$/;
487   -
  495 +
488 496 if( !(regexHideBarra.exec(hash) !== null) && !HIDE_BARRA_DO_GOVERNO ){
489 497 addBarraDoGoverno();
490 498 }else{
491 499 HIDE_BARRA_DO_GOVERNO = true;
492 500 }
493   -
  501 +
494 502 // remove query params
495 503 hash = hash.split('?')[0];
496   -
  504 +
497 505 var parts = hash.split('/');
498   -
  506 +
499 507 var isProposal = regexProposals.exec(hash) !== null;
500 508 var isCategory = regexCategory.exec(hash) !== null;
501   -
  509 +
502 510 if( isProposal ){
503   -
504   - // go to proposal
  511 +
  512 + // go to proposal
505 513 var proposalId = parts[2];
506 514 navigateToProposal(proposalId);
507 515 }
508   -
  516 +
509 517 if( isCategory ){
510   -
511   - // go to category
  518 +
  519 + // go to category
512 520 var categoryId = parts[3];
513 521 navigateToCategory(categoryId);
514 522 }
515   -
  523 +
516 524 // default
517 525 if( !isProposal && !isCategory ){
518 526 // show the 'index' -> category tab
519 527 display_category_tab();
520 528 }
521   -
  529 +
522 530 $('html, body').animate({ scrollTop: 0 }, 'fast');
523 531 }
524   -
525   - function navigateToProposal(proposalId){
  532 +
  533 + function navigateToProposal(proposalId){
526 534 if(proposalId === undefined){
527 535 display_proposals_tab();
528 536 }else{
529 537 display_proposal('proposal-item-' + proposalId);
530   -
  538 +
531 539 // show sub-page
532 540 var regexSubpages = /sobre-o-programa$/;
533 541 var m;
... ... @@ -536,7 +544,7 @@ define([&#39;handlebars&#39;], function(Handlebars){
536 544 }
537 545 }
538 546 }
539   -
  547 +
540 548 function navigateToCategory(categoryId){
541 549 if(categoryId === undefined){
542 550 display_category_tab();
... ... @@ -544,7 +552,29 @@ define([&#39;handlebars&#39;], function(Handlebars){
544 552 display_proposal_by_category('proposal-item-' + categoryId);
545 553 }
546 554 }
547   -
  555 +
  556 + function addVotedProposal(id) {
  557 + var votedProposals;
  558 + if (typeof($.cookie("votedProposals")) == "undefined"){
  559 + votedProposals = [];
  560 + }
  561 + else{
  562 + votedProposals = JSON.parse($.cookie("votedProposals"));
  563 + }
  564 + if (votedProposals.indexOf(id)==-1){
  565 + votedProposals.push(id);
  566 + }
  567 + $.cookie("votedProposals", JSON.stringify(votedProposals), {expires : 999 }) ;
  568 + }
  569 +
  570 + function hasProposalbeenVoted(id) {
  571 + if (typeof($.cookie("votedProposals")) == "undefined") {
  572 + return false;
  573 + }
  574 + votedProposals = JSON.parse($.cookie("votedProposals"));
  575 + return votedProposals.indexOf(id)!=-1;
  576 + }
  577 +
548 578 if('onhashchange' in window){
549 579 window.onhashchange = locationHashChanged;
550 580 }else{
... ...