Commit 46a41fff81ab407234091a1b0ceeb81faca77b49
1 parent
61d1a008
Exists in
master
and in
8 other branches
Refactored limit proposal voting using cookie persistence
to another object to allow unit testing with Jasmine
Showing
4 changed files
with
104 additions
and
65 deletions
Show diff stats
index.html
... | ... | @@ -7,33 +7,58 @@ |
7 | 7 | <meta name="viewport" content="width=device-width, initial-scale=1"> |
8 | 8 | |
9 | 9 | <script type="text/javascript"> |
10 | - function removeUrlParameters(full_url){ | |
11 | - var url_base = full_url.split('#').shift(); | |
12 | - return url_base; | |
13 | - } | |
14 | - function addBaseUrl(filename){ | |
15 | - var base = window.location.href; | |
16 | - if(base.match(/file:/) || filename.match(/http:/)){ | |
17 | - base = ''; | |
18 | - }else{ | |
19 | - base = removeUrlParameters(base) + '/'; | |
10 | + /** | |
11 | + * The Url created with module pattern | |
12 | + * | |
13 | + * @todo Moves the module to another single js file | |
14 | + */ | |
15 | + var Url = (function(){ | |
16 | + | |
17 | + return { | |
18 | + | |
19 | + initBase: function(){ | |
20 | + var base = window.location.href; | |
21 | + var host = window.location.host; | |
22 | + var regex = new RegExp(".*" + host + '/', "g"); | |
23 | + | |
24 | + if(host){ | |
25 | + base = base.replace(regex,''); | |
26 | + }else{ | |
27 | + base = base.replace('index.html',''); | |
28 | + } | |
29 | + return base | |
30 | + }, | |
31 | + removeUrlParameters: function(full_url){ | |
32 | + var url_base = full_url.split('#').shift(); | |
33 | + return url_base; | |
34 | + }, | |
35 | + addBaseUrl: function(filename){ | |
36 | + var base = window.location.href; | |
37 | + if(base.match(/file:/) || filename.match(/http:/)){ | |
38 | + base = ''; | |
39 | + }else{ | |
40 | + base = this.removeUrlParameters(base) + '/'; | |
41 | + } | |
42 | + return base + filename; | |
43 | + } | |
20 | 44 | } |
21 | - return base + filename; | |
22 | - } | |
45 | + | |
46 | + })(); | |
47 | + | |
23 | 48 | function makeCSSLink(filename){ |
24 | 49 | var fileref=document.createElement('link'); |
25 | 50 | fileref.setAttribute('rel', 'stylesheet'); |
26 | 51 | fileref.setAttribute('type', 'text/css'); |
27 | - fileref.setAttribute('href', addBaseUrl(filename)); | |
52 | + fileref.setAttribute('href', Url.addBaseUrl(filename)); | |
28 | 53 | return fileref; |
29 | 54 | } |
30 | 55 | function loadCSSFiles(){ |
31 | 56 | var css_files = [ |
32 | - 'css/bootstrap.min.css', | |
33 | - 'css/hover.custom.css', | |
34 | - 'http://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css', | |
35 | - 'http://fonts.googleapis.com/css?family=Open+Sans:400,300,700', | |
36 | - 'http://fonts.googleapis.com/css?family=Asap:400,700', | |
57 | + 'css/bootstrap.min.css', | |
58 | + 'css/hover.custom.css', | |
59 | + 'http://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css', | |
60 | + 'http://fonts.googleapis.com/css?family=Open+Sans:400,300,700', | |
61 | + 'http://fonts.googleapis.com/css?family=Asap:400,700', | |
37 | 62 | 'style.css' |
38 | 63 | ]; |
39 | 64 | head = document.getElementsByTagName('head')[0] |
... | ... | @@ -42,8 +67,8 @@ |
42 | 67 | } |
43 | 68 | } |
44 | 69 | function makeJSURL(filename){ |
45 | - var url = addBaseUrl(filename); | |
46 | - | |
70 | + var url = Url.addBaseUrl(filename); | |
71 | + | |
47 | 72 | return url; |
48 | 73 | } |
49 | 74 | |
... | ... | @@ -66,17 +91,17 @@ |
66 | 91 | |
67 | 92 | <div id="proposal-result"></div> |
68 | 93 | <div class="clearfix"></div> |
69 | - | |
94 | + | |
70 | 95 | <script id="proposal-template" type="text/x-handlebars-template"> |
71 | 96 | <header> |
72 | 97 | <h1><a href="#">{{article.title}}</a></h1> |
73 | 98 | <a id="display-contrast" href="#">Alto Contraste</a> |
74 | 99 | </header> |
75 | - | |
100 | + | |
76 | 101 | <div id="content"> |
77 | 102 | {{{article.body}}} |
78 | 103 | </div> |
79 | - | |
104 | + | |
80 | 105 | <nav role="tabpanel"> |
81 | 106 | <ul role="tablist"> |
82 | 107 | <li id="nav-proposal-categories" role="presentation"> |
... | ... | @@ -112,7 +137,7 @@ |
112 | 137 | </div> |
113 | 138 | </div> |
114 | 139 | |
115 | - <div id="proposal-group" class="hide"> | |
140 | + <div id="proposal-group" class="hide"> | |
116 | 141 | <label for="search-input">Selecione um programa para fazer propostas e contar sua experiência.</label> |
117 | 142 | <div id="search-input-container"> |
118 | 143 | <input placeholder="palavra chave" id="search-input" type="text" name="search" /> |
... | ... | @@ -160,7 +185,7 @@ |
160 | 185 | <span class="fa fa-reply"></span> |
161 | 186 | Agora contribua para a melhoria desse programa |
162 | 187 | </a> |
163 | - </div> | |
188 | + </div> | |
164 | 189 | </div> |
165 | 190 | |
166 | 191 | <div class="make-proposal-container"> |
... | ... | @@ -303,7 +328,7 @@ |
303 | 328 | </script> |
304 | 329 | |
305 | 330 | <script type='text/javascript' > |
306 | -loadRequireJS(); | |
331 | + loadRequireJS(); | |
307 | 332 | </script> |
308 | 333 | |
309 | 334 | ... | ... |
js/main.js
1 | -define(['handlebars','handlebars_helpers','jquery'], function(Handlebars){ | |
1 | +define(['handlebars','handlebars_helpers'], function(Handlebars){ | |
2 | 2 | |
3 | 3 | |
4 | 4 | /* global Handlebars, $ */ |
... | ... | @@ -227,7 +227,7 @@ define(['handlebars','handlebars_helpers','jquery'], function(Handlebars){ |
227 | 227 | $body.off('click', '.vote-actions .like'); |
228 | 228 | $body.on('click', '.vote-actions .like', function(e) { |
229 | 229 | //Helps to prevent more than one vote per proposal |
230 | - if(contextMain.hasProposalbeenVoted(article.id)){ | |
230 | + if(ProposalApp.hasProposalbeenVoted(article.id)){ | |
231 | 231 | console.log("Proposta " + article.id + " já havia sido votada"); |
232 | 232 | contextMain.loadRandomProposal(topic_id, private_token); |
233 | 233 | e.preventDefault(); |
... | ... | @@ -241,7 +241,7 @@ define(['handlebars','handlebars_helpers','jquery'], function(Handlebars){ |
241 | 241 | private_token: private_token |
242 | 242 | } |
243 | 243 | }).done(function( /*data*/ ) { |
244 | - contextMain.addVotedProposal(article.id); | |
244 | + ProposalApp.addVotedProposal(article.id); | |
245 | 245 | contextMain.loadRandomProposal(topic_id, private_token); |
246 | 246 | }); |
247 | 247 | e.preventDefault(); |
... | ... | @@ -516,28 +516,7 @@ define(['handlebars','handlebars_helpers','jquery'], function(Handlebars){ |
516 | 516 | }else{ |
517 | 517 | this.display_proposal_by_category('proposal-item-' + categoryId); |
518 | 518 | } |
519 | - }, | |
520 | - addVotedProposal: function(id) { | |
521 | - var votedProposals; | |
522 | - if (typeof($.cookie("votedProposals")) == "undefined"){ | |
523 | - votedProposals = []; | |
524 | - } | |
525 | - else{ | |
526 | - votedProposals = JSON.parse($.cookie("votedProposals")); | |
527 | - } | |
528 | - if (votedProposals.indexOf(id)==-1){ | |
529 | - votedProposals.push(id); | |
530 | - } | |
531 | - $.cookie("votedProposals", JSON.stringify(votedProposals), {expires : 999 }) ; | |
532 | - return votedProposals; | |
533 | - }, | |
534 | - hasProposalbeenVoted: function(id) { | |
535 | - if (typeof($.cookie("votedProposals")) == "undefined") { | |
536 | - return false; | |
537 | - } | |
538 | - votedProposals = JSON.parse($.cookie("votedProposals")); | |
539 | - return votedProposals.indexOf(id)!=-1; | |
540 | - } | |
519 | + } | |
541 | 520 | } |
542 | 521 | })(); |
543 | 522 | ... | ... |
... | ... | @@ -0,0 +1,34 @@ |
1 | +define(['jquery','jquery_cookie'],function($){ | |
2 | + | |
3 | + | |
4 | + ProposalApp = (function (){ | |
5 | + | |
6 | + return { | |
7 | + addVotedProposal: function(id) { | |
8 | + var votedProposals; | |
9 | + if (typeof($.cookie("votedProposals")) == "undefined"){ | |
10 | + votedProposals = []; | |
11 | + } | |
12 | + else{ | |
13 | + votedProposals = JSON.parse($.cookie("votedProposals")); | |
14 | + } | |
15 | + if (votedProposals.indexOf(id)==-1){ | |
16 | + votedProposals.push(id); | |
17 | + } | |
18 | + $.cookie("votedProposals", JSON.stringify(votedProposals), {expires : 999 }) ; | |
19 | + return votedProposals; | |
20 | + }, | |
21 | + | |
22 | + hasProposalbeenVoted: function(id) { | |
23 | + if (typeof($.cookie("votedProposals")) == "undefined") { | |
24 | + return false; | |
25 | + } | |
26 | + votedProposals = JSON.parse($.cookie("votedProposals")); | |
27 | + return votedProposals.indexOf(id)!=-1; | |
28 | + } | |
29 | + }; | |
30 | + | |
31 | + })(); | |
32 | + | |
33 | + return ProposalApp; | |
34 | +}); | ... | ... |
js/requirejs-config.js
1 | -var base = window.location.href; | |
2 | -var host = window.location.host; | |
3 | -var regex = new RegExp(".*" + host + '/', "g"); | |
4 | - | |
5 | -if(host){ | |
6 | - base = base.replace(regex,''); | |
1 | +if(window.Url){ | |
2 | + var base = Url.initBase(); | |
3 | + base = Url.removeUrlParameters(base) + '/js/'; | |
7 | 4 | }else{ |
8 | - base = base.replace('index.html',''); | |
5 | + base = '../js' | |
9 | 6 | } |
10 | -base = removeUrlParameters(base); | |
11 | 7 | |
12 | 8 | requirejs.config({ |
13 | - baseUrl: ( base + '/js/'), | |
9 | + baseUrl: base, | |
14 | 10 | waitSeconds: 0, |
15 | 11 | paths: { |
16 | 12 | jquery: 'jquery-2.1.3.min', |
17 | - jquery_ui: 'jquery-ui-1.11.4.custom/jquery-ui.min', | |
18 | - jquery_cookie: 'jquery.cookie', | |
13 | + jquery_ui: 'jquery-ui-1.11.4.custom/jquery-ui.min', | |
14 | + jquery_cookie: 'jquery.cookie', | |
19 | 15 | handlebars: 'handlebars-v3.0.1', |
20 | 16 | handlebars_helpers: 'handlebars-helpers', |
21 | 17 | jquery_maxlength: 'jquery.maxlength.min', |
22 | 18 | layout: 'layout', |
23 | - main: 'main' | |
19 | + main: 'main', | |
20 | + proposal_app: 'proposal-app' | |
24 | 21 | }, |
25 | 22 | shim: { |
26 | 23 | 'handlebars':{ |
... | ... | @@ -38,9 +35,13 @@ requirejs.config({ |
38 | 35 | }, |
39 | 36 | 'handlebars_helpers':{ |
40 | 37 | deps: ['handlebars'] |
38 | + }, | |
39 | + 'proposal_app' :{ | |
40 | + deps: ['jquery'], | |
41 | + exports: 'ProposalApp' | |
41 | 42 | } |
42 | 43 | } |
43 | 44 | }); |
44 | 45 | |
45 | -requirejs(['jquery', 'jquery_ui', 'jquery_cookie', 'handlebars', 'handlebars_helpers']); | |
46 | -requirejs(['jquery_maxlength', 'layout', 'main']); | |
46 | +requirejs(['jquery', 'proposal_app', 'jquery_ui','handlebars_helpers']); | |
47 | +requirejs(['jquery_maxlength', 'layout','main']); | ... | ... |