Commit 5a9b31396227f115a33160e0548d45720584e63c

Authored by Fabio Teixeira
1 parent 2e0e1b3d

Refactory theme javascript by adding namespaces, remove some dead code, optmize …

…methods and move custom translations to custom_locales file

Signed-off-by: ArthurJahn <stutrzbecher@gmail.com>
Signed-off-by: Dylan Guedes <djmgguedes@gmail.com>
Signed-off-by: Fabio Teixeira <fabio1079@gmail.com>
Signed-off-by: Melissa Wen <melissa.srw@gmail.com>
Showing 1 changed file with 245 additions and 235 deletions   Show diff stats
src/noosfero-spb/noosfero-spb-theme/theme.js
1 -function alignBlocks(containerIndex){  
2 - //Needed to save the original reference to jQuery(this)  
3 - jt = jQuery(this);  
4 - longerBlock = 0;  
5 - jt.find(".block-outer").each(function () {  
6 - if(jQuery(this).height() > longerBlock)  
7 - longerBlock = jQuery(this).height();  
8 - }); 1 +/* globals jQuery */
9 2
10 - jt.find("#block-48504 .block-inner-2").height(492);  
11 - jt.find("#block-55304 .block-inner-2").height(378);  
12 -  
13 - //Aligns the blocks in the most common situations  
14 - jt.find(".block-outer").height(longerBlock);  
15 - //Only used for blocks with video, since it uses the size of the iframe  
16 - if(jt.find("iframe").length > 0){  
17 - jt.find(".block-inner-1 .block-inner-2").each(function (idx) {  
18 - if(idx==2){  
19 - jQuery(this).height(jt.find("iframe").height());  
20 - }  
21 - });  
22 - }  
23 -} 3 +// Theme namespace
  4 +var SPBNoosferoTheme = {};
24 5
25 -(function($) {  
26 - // Run code  
27 - if($.cookie("high_contrast") === 'true'){  
28 - $( "body" ).toggleClass( "contraste" );  
29 - }  
30 - $( "#siteaction-contraste a" ).click(function() {  
31 - $( "body" ).toggleClass( "contraste" );  
32 - if($('body').hasClass('contraste')){  
33 - $.cookie('high_contrast', 'true', {path: '/'});  
34 - } else {  
35 - $.cookie('high_contrast', null, { path: '/' });  
36 - }  
37 - });  
38 -  
39 - $( ".profile-image" ).prepend( "<span class='helper'></span>" );  
40 - //insere a mensagem no bloco de trilhas na página inicial//  
41 - $( ".action-home-index #content .community-track-plugin_track-card-list-block .track_list" ).prepend( "<span class='msg_block'>Construa seu caminho de participação na elaboração de políticas públicas...</span>" );  
42 - //insere a mensagem no bloco de comunidades na página inicial//  
43 - $( ".action-home-index #content .communities-block .block-inner-2>div" ).prepend( "<span class='msg_block'>Participe dos dialogos entre governo e sociedade em comunidades temáticas...</span>" );  
44 - $( ".action-home-index #content .communities-block .block-inner-2>div.block-footer-content .msg_block" ).remove();  
45 - $('.container-block-plugin_container-block').each(alignBlocks);  
46 -  
47 - $('#block-48500 > .block-inner-1 > .block-inner-2').append('<div class="more_button" style="position: absolute; top: 5px; left: 519px;"><div class="view_all"><a href="/portal/blog">Ler todas</a></div></div>'); 6 +// Add in jQuery a method that executes a given function only if there is a filled query result
  7 +jQuery.fn.doOnce = function( func ) {
  8 + this.length && func.apply( this );
  9 + return this;
  10 +}
48 11
  12 +// Animate Organization Ratings additional informations form
  13 +SPBNoosferoTheme.OrganizationRatings = (function($) {
  14 + 'use strict';
49 15
  16 + // Add a question mark next to each form field, so when user mouse over it,
  17 + // it displays some userfull information about the field
  18 + function setTooltipContent() {
  19 + $('span.star-tooltip').html('?');
  20 + }
50 21
51 -// Foco no botao de busca 22 + // Given the current state of the form(hidden or in display)
  23 + // change the arrow image and animte its state change
  24 + function animateExtraFields(additionalFields, arrow) {
  25 + var innerHeight = additionalFields[0].offsetHeight;
  26 +
  27 + // If in display, puts the down arrow and hide the form
  28 + if(additionalFields.height() !== 0) {
  29 + arrow.attr('class', 'comments-arrow-down');
  30 + additionalFields.animate({height: 0});
  31 + } else { // if the form is hidden, puts the up arrow and display the form
  32 + arrow.attr('class', 'comments-arrow-up');
  33 + additionalFields.animate({
  34 + height: additionalFields.get(0).scrollHeight
  35 + }, 1000 );
  36 + }
52 37
53 -$('#link-buscar').click(function(e) {  
54 - e.defaultPrevented();  
55 - window.location.hash = '#portal-searchbox';  
56 - $('.searchField').focus()  
57 -}) 38 + // Fix for the arrow change on the additional informations, it prevents the institution modal
  39 + // from killing the entire page. When the form had their status changed, the institution modal
  40 + // tended to cover the page even if it was not in display
  41 + document.getElementById('institution_modal').style.display = 'none';
  42 + }
58 43
59 -})(jQuery); 44 + // Set additional informations form up and down arrows click event
  45 + function setArrowDirection() {
  46 + var reportForm = $('div.star-comment-container');
  47 + var parent = reportForm.parent();
  48 + reportForm.detach(); // Remove form from the page DOM
  49 +
  50 + // Apply arrows click event
  51 + var additionalDataBar = reportForm.find('div.comments-display-fields');
  52 + additionalDataBar.on('click', function() {
  53 + var arrow = additionalDataBar.find('span[class*="comments-arrow"]');
  54 + var additionalFields = reportForm.find('.comments-software-extra-fields');
  55 + animateExtraFields(additionalFields, arrow);
  56 + });
60 57
  58 + // Add the form back to the page
  59 + parent.append(reportForm);
  60 + }
61 61
62 -// Efeito Fade nos box de softwares  
63 62
64 -(function($){  
65 - "use strict";// Make javascript less intolerant to errors 63 + function initialize() {
  64 + $('div.star-rate-form').doOnce(function() {
  65 + setTooltipContent();
  66 + setArrowDirection();
  67 + });
  68 + }
66 69
67 - var TRANSITION_TIME = 250;// milliseconds 70 + return {
  71 + init: initialize
  72 + };
68 73
  74 +}) (jQuery);
69 75
70 - function show_finality() {  
71 - var finality = $(this).children(".software-block-finality"); 76 +// Fade effect on software blocks of portal homepage
  77 +SPBNoosferoTheme.HighlightedSoftwaresBlock = (function($) {
  78 + 'use strict';
72 79
73 - //finality.stop().fadeTo(TRANSITION_TIME,1); 80 + function showFinality() {
  81 + var finality = $(this).children('div.software-block-finality');
74 finality.stop().fadeTo('fast', 1); 82 finality.stop().fadeTo('fast', 1);
75 - //finality.stop().animate({"top" : "0%"}, TRANSITION_TIME);  
76 } 83 }
77 84
78 - function hide_finality() {  
79 - var finality = $(this).children(".software-block-finality");  
80 -  
81 - //finality.stop().fadeTo(TRANSITION_TIME,0); 85 + function hideFinality() {
  86 + var finality = $(this).children('div.software-block-finality');
82 finality.stop().fadeTo('fast', 0); 87 finality.stop().fadeTo('fast', 0);
83 - //finality.stop().animate({"top" : "100%"}, TRANSITION_TIME);  
84 } 88 }
85 89
86 - function move_article_buttons(){  
87 - var article_actions = $('#article-actions').clone();  
88 - var report = $('.report-abuse-action').remove();  
89 - var suggest = $('.icon-suggest').remove(); 90 + // Set the mouse over and out event in each of the finality blocks in the page
  91 + function setFadeInOutFinality(){
  92 + $('#boxes div.software-block-finality').css({'opacity':0, 'top':0});
  93 + var softwaresBlocks = $('#boxes div.software-block');
90 94
91 -  
92 - $(article_actions).find('.icon-edit, .icon-new, .icon-delete, .icon-locale').remove();  
93 - $('.article-body').append(article_actions); 95 + softwaresBlocks.mouseover(showFinality);
  96 + softwaresBlocks.mouseout(hideFinality);
94 } 97 }
95 98
96 - function add_link_to_article_div(){  
97 - var list = $('.display-content-block').find('li'); 99 + function initialize() {
  100 + $('#boxes .box-1 div.softwares-block').doOnce(function() {
  101 + setFadeInOutFinality();
  102 + });
  103 + }
98 104
99 - list.each(function(){  
100 - var link = $(this).find('.title').find('a').attr('href');  
101 - var text = $(this).find('.lead').find('p').text(); 105 + return {
  106 + init: initialize
  107 + };
  108 +}) (jQuery);
  109 +
  110 +
  111 +SPBNoosferoTheme.NoosferoHTMLAdjusts = (function($) {
  112 + 'use strict';
  113 +
  114 + // Take each list item from the block and apply to its lead the same link as its title
  115 + // then wraps the list item inside a new div with class notice-item
  116 + function insertLinksAndWrapsOnHomeNews(){
  117 + var news = $('div.display-content-block').find('li');
  118 + var parent = news.parent();
  119 + news.detach();
  120 + news.each(function(){
  121 + //add link on lead
  122 + var link = $(this).find('div.title a').attr('href');
  123 + var lead = $(this).find('div.lead');
102 var leadLink = $('<a></a>'); 124 var leadLink = $('<a></a>');
103 125
104 leadLink.attr('href', link); 126 leadLink.attr('href', link);
105 - leadLink.text(text); 127 + leadLink.text(lead.find('p').text());
  128 + lead.html(leadLink);
106 129
107 - $(this).find('.lead').html(leadLink); 130 + //add wraps to improve styling
  131 + $(this).find('div:gt(0)').wrapAll('<div class="notice-item"/>');
  132 + $(this).find('.notice-item div:gt(0)').wrapAll('<div class="notice-info"/>');
108 }); 133 });
  134 +
  135 + parent.append(news);
109 } 136 }
110 137
111 - function insert_notice_div(){  
112 - var notice = $('.display-content-block').find('li');  
113 - notice.each(function(){  
114 - var $set = $(this).children();  
115 - for(var i=1, len = $set.length; i < len; i+=5){  
116 - $set.slice(i, i+5).wrapAll('<div class="notice-item"/>');  
117 - }  
118 - for(var i=2, len = $set.length; i < len; i+=3){  
119 - $set.slice(i, i+3).wrapAll('<div class="notice-info"/>'); 138 + // Add a toggle tooltip to all span with title attribute
  139 + function addTooltips(){
  140 + $('#content span[title]').doOnce(function(){
  141 + this.attr('data-toggle', 'tooltip');
  142 + this.tooltip();
  143 + });
  144 + }
  145 +
  146 + // Make the link next to a popover span show the popover when it is clicked
  147 + function addPopovers() {
  148 + var span = $('span[data-toggle="popover"]');
  149 + var place = span.attr('data-placement');
  150 + var elementClass = span.attr('data-class');
  151 +
  152 + span.doOnce(function(){
  153 + var popover = this.popover({
  154 + html:true,
  155 + placement: place,
  156 + content: function() {
  157 + return $(this).next().html();
120 } 158 }
121 - //$('<div class="notice-item"></div>').wrap($(this).find( '.image', '.title', '.lead', '.read_more')); 159 + })
  160 + .data('bs.popover');
  161 +
  162 + if(popover) {
  163 + popover.tip()
  164 + .addClass(elementClass);
  165 +
  166 + // Make the link show the span popover when it is clicked
  167 + $('a.toggle-popover').on('click',function() {
  168 + span.trigger('click');
  169 + });
  170 + }
122 }); 171 });
  172 + }
123 173
  174 + function moveBreadcrumbs() {
  175 + $('div.breadcrumbs-plugin_content-breadcrumbs-block').doOnce(function() {
  176 + this.insertBefore('#content-inner');
  177 + $('<span id="breadcrumbs-you-are-here">Você está aqui:</span>').insertBefore(this.find('div.block-inner-2').children().first());
  178 + });
124 } 179 }
125 180
126 - //toggle filter options in catalog page  
127 - function setFilterCategoriesOptionClass() {  
128 - var filterOptions = $("#filter-categories-option");  
129 - filterOptions.addClass("animated slideInDown"); 181 + function removeButtons(){
  182 + $('#article-actions').doOnce(function() {
  183 + $(this).children('.icon-spread, .icon-locale, .report-abuse-action, .icon-clone').remove();
  184 + });
  185 +
  186 + $('div.page-members-header').doOnce(function() {
  187 + $(this).find('.report-abuse-action').remove();
  188 + });
130 } 189 }
131 190
  191 + // Put the focus on the search form when user click on the "go to search link"
  192 + function searchLinkApplyFocusToItsForm() {
  193 + $('#link-buscar').click(function(e) {
  194 + e.defaultPrevented();
  195 + $('.searchField').focus();
  196 + });
  197 + }
  198 +
  199 + function initialize() {
  200 + insertLinksAndWrapsOnHomeNews();
  201 + addTooltips();
  202 + addPopovers();
  203 + moveBreadcrumbs();
  204 + searchLinkApplyFocusToItsForm();
  205 + removeButtons();
  206 + }
  207 +
  208 + return {
  209 + init: initialize
  210 + };
  211 +
  212 +}) (jQuery);
  213 +
  214 +// Software catalog category filter toggle functionality
  215 +SPBNoosferoTheme.SoftwareCatalog = (function($) {
  216 + 'use strict';
  217 +
  218 + // Apply the toggle animation on the category filter based on its current status
132 function toggleFilterOptions(){ 219 function toggleFilterOptions(){
133 - var filterOptions = $("#filter-categories-option");  
134 - var filterHeight = filterOptions[0].scrollHeight;  
135 - var showOptions = $("#filter-option-catalog-software");  
136 - var hideOptions = $("#filter-option-catalog-close");  
137 - if(hideOptions.is(":visible")){  
138 - //filterOptions.slideUp(function() {  
139 - showOptions.show();  
140 - hideOptions.hide();  
141 - //}); 220 + var filter = document.getElementById('filter-catalog-software');
  221 + var filterOptions = $(filter.children[0]); // filter categories
  222 + var filterHeight = filterOptions[0].scrollHeight; // filter categories height to be used when displaying it
  223 + var showOptions = $(filter.children[1]); // Show categories div, has a click event
  224 + var hideOptions = $(filter.children[2]); // Hide categories div, has a click event
  225 +
  226 + // If the hide categories div is visible and it is clicked,
  227 + // hide the categories and display the show categories div
  228 + if(hideOptions.is(':visible')){
  229 + showOptions.show();
  230 + hideOptions.hide();
  231 +
142 filterOptions.animate({ 232 filterOptions.animate({
143 height: 0 233 height: 0
144 },500); 234 },500);
145 - }  
146 - else { 235 + } else { // The user clicked on the show categories div, then show the categories and the "hide categories div"
147 showOptions.hide(); 236 showOptions.hide();
148 hideOptions.show(); 237 hideOptions.show();
  238 +
149 filterOptions.animate({ 239 filterOptions.animate({
150 height: filterHeight 240 height: filterHeight
151 },500); 241 },500);
152 } 242 }
153 } 243 }
154 244
155 - function setEvents(){  
156 - // Fade css  
157 - $('.software-block-finality').css({'opacity':0, 'top':0});  
158 - // End Fade CSS  
159 - var software_block = $('.software-block');  
160 - software_block.mouseover(show_finality);  
161 - software_block.mouseout(hide_finality);  
162 -  
163 - var showOptions = $("#filter-option-catalog-software");  
164 - var hideOptions = $("#filter-option-catalog-close");  
165 - showOptions.click(toggleFilterOptions);  
166 - hideOptions.click(toggleFilterOptions);  
167 - }  
168 -  
169 - /* Finds all uploaded files from manuals page and sets its names on the right format */  
170 - function set_uploaded_files_names() {  
171 - try {  
172 - var article = document.getElementById('article');  
173 - var folderList = article.getElementsByClassName('folder-content')[0];  
174 - var folderItens = folderList.getElementsByClassName('item-description');  
175 -  
176 - for(var i = 0, var loop_length = folderItens.length; i < loop_length; i++) {  
177 - split_file_extension(folderItens[i].getElementsByTagName('a')[0]);  
178 - }  
179 - } catch(e) { 245 + // If there is a software catalog on the page, add its category filter toggle animation
  246 + function initialize() {
  247 + var filter = document.getElementById('filter-catalog-software');
180 248
  249 + if (filter) {
  250 + //toggle filter options in catalog page
  251 + filter.children[0].setAttribute('class', 'animated slideInDown');
  252 + $(filter.children[1]).click(toggleFilterOptions);
  253 + $(filter.children[2]).click(toggleFilterOptions);
181 } 254 }
182 } 255 }
183 256
  257 + return {
  258 + init: initialize
  259 + };
  260 +}) (jQuery);
  261 +
  262 +SPBNoosferoTheme.NoosferoFoldersContent = (function($) {
  263 + 'use strict';
  264 +
184 /* Splits a file name from its extension. Example: example.pdf becomes example - PDF */ 265 /* Splits a file name from its extension. Example: example.pdf becomes example - PDF */
185 function split_file_extension(element) { 266 function split_file_extension(element) {
186 var tokens = element.innerHTML.split('.'); 267 var tokens = element.innerHTML.split('.');
187 - if(tokens.length == 2) {  
188 - var fileName = tokens[0];  
189 - var fileExtension = tokens[1].toUpperCase();  
190 - element.innerHTML = fileName + " - " + fileExtension;  
191 - }  
192 - }  
193 -  
194 - function set_tooltip_content() {  
195 - $('.star-tooltip').html("?");  
196 - }  
197 268
198 - function set_arrow_direction() {  
199 - var additional_data_bar = $('.comments-display-fields');  
200 -  
201 - additional_data_bar.on('click', function() {  
202 - var arrow = additional_data_bar.find('span[class*="comments-arrow"]');  
203 - var additional_fields = $('.comments-software-extra-fields');  
204 -  
205 - if (additional_fields) {  
206 - animateExtraFields(additional_fields, arrow);  
207 - }  
208 - });  
209 - }  
210 -  
211 -  
212 - function animateExtraFields(additional_fields, arrow) {  
213 - var innerHeight = additional_fields[0].offsetHeight;  
214 -  
215 - if(additional_fields.height() !== 0) {  
216 - arrow.attr('class', "comments-arrow-down");  
217 - additional_fields.animate({height: 0});  
218 - } else {  
219 - arrow.attr('class', "comments-arrow-up");  
220 - additional_fields.animate({height: additional_fields.get(0).scrollHeight}, 1000 ); 269 + if(tokens.length > 1) {
  270 + var fileExtension = tokens.pop().toUpperCase();
  271 + var fileName = tokens.join('.');
  272 + element.innerHTML = fileName + ' - ' + fileExtension;
221 } 273 }
222 -  
223 - // Fix for the arrow change on modal display to block, killing the entire page  
224 - $("#institution_modal").css({'display':'none'});  
225 - }  
226 -  
227 -  
228 - function set_use_report_content() {  
229 - $('.profile-homepage .organization-average-rating-container .rate-this-organization a').html('Avalie este software');  
230 - $('.make-report-block .make-report-container .button-bar a span').html('Avalie este software');  
231 - $('.star-rate-data .star-rate-form.rating-cooldown .button-bar a span').html('Avalie este software');  
232 - $('.make-report-block .make-report-container .make-report-message').html('Relate sua experiência ou do órgão/empresa com relação ao software.');  
233 - $('.ratings-list .see-more a.icon-arrow-right-p').html('veja todos os relatos');  
234 - $('.main-content .star-rate-data .star-rate-form .star-comment-container .button-bar input').attr('value', 'Enviar');  
235 - $('.main-content .star-rate-data .star-rate-form .star-rate-text').html('Avalie este software');  
236 - $('.main-content .star-rate-data .star-rate-form .star-comment-container .formlabel').html('Depoimento sobre o software');  
237 - $('.star-rate-form .star-comment-container .comments-display-fields span#comments-additional-information').html('Dados adicionais (órgãos e empresas)');  
238 - $('.star-rate-form .star-comment-container .comments-software-extra-fields #input_institution_comments label').html('Nome do órgão ou empresa');  
239 - $('.star-rate-form .star-comment-container .comments-software-extra-fields .comments-software-people-benefited label').html('Número de beneficiados');  
240 - $('.star-rate-form .star-comment-container .comments-software-extra-fields .comments-software-saved-values label').html('Recursos economizados');  
241 } 274 }
242 275
243 - function add_tooltips(){  
244 - $('#content span[title]').attr("data-toggle","tooltip"); 276 + /* Finds all uploaded files from manuals page and sets its names on the right format */
  277 + function set_uploaded_files_names() {
  278 + try {
  279 + var article = document.getElementById('article');
  280 + var folderList = article.getElementsByClassName('folder-content')[0];
  281 + var folderItens = folderList.getElementsByClassName('item-description');
245 282
246 - $('[data-toggle="tooltip"]').tooltip();  
247 - } 283 + for(var i = 0, loop_length = folderItens.length; i < loop_length; i++) {
  284 + split_file_extension(folderItens[i].getElementsByTagName('a')[0]);
  285 + }
  286 + } catch(e) {
248 287
249 - function add_popovers() {  
250 - var span = $('span[data-toggle="popover"]');  
251 - var place = span.attr("data-placement");  
252 - var elementClass = span.attr("data-class");  
253 - if(span){  
254 - var popover = span.popover({  
255 - html:true,  
256 - placement: place,  
257 - content: function() {  
258 - return $(this).next().html();  
259 - }  
260 - })  
261 - .data('bs.popover');  
262 } 288 }
263 - if(popover) {  
264 - popover.tip()  
265 - .addClass(elementClass);  
266 - $('a.toggle-popover').on("click",function() {  
267 - span.trigger("click");  
268 - });  
269 - }  
270 - }  
271 -  
272 - function move_breadcrumbs() {  
273 - $('.breadcrumbs-plugin_content-breadcrumbs-block').prependTo('#wrap-2');  
274 - $('<span id="breadcrumbs-you-are-here">Você está aqui:</span>').insertBefore($('.breadcrumbs-plugin_content-breadcrumbs-block .block-inner-2').children().first());  
275 } 289 }
276 290
277 - // temporary solution for the suspension_point in some buttons  
278 - function remove_suspension_points_in_buttons() {  
279 - $(".template-kind a span:contains('...')").each(function(index, element) {  
280 - element.innerHTML = element.innerHTML.replace(/(\...)/, "");  
281 - });  
282 - }  
283 -  
284 - // temporary solution for the text in send_email buttons  
285 - function replace_send_email_button_text() {  
286 - $('.action-profile-members .page-members-header .icon-menu-mail').html('Contatar administradores'); 291 + function initialize() {
  292 + set_uploaded_files_names();
287 } 293 }
288 294
289 - $(document).ready(function(){  
290 - add_tooltips();  
291 - add_popovers();  
292 - move_article_buttons();  
293 - move_breadcrumbs();  
294 - insert_notice_div();  
295 - set_uploaded_files_names();  
296 - set_tooltip_content();  
297 - set_arrow_direction();  
298 - set_use_report_content();  
299 - setEvents();  
300 - remove_suspension_points_in_buttons();  
301 - replace_send_email_button_text();  
302 - });  
303 -})(jQuery); 295 + return {
  296 + init: initialize
  297 + };
  298 +
  299 +}) (jQuery);
  300 +
  301 +// Theme javascript bootstrap
  302 +(function(jQuery) {
  303 + 'use strict';
  304 +
  305 + // Initialize everything
  306 + $(document).ready(function() {
  307 + SPBNoosferoTheme.OrganizationRatings.init();
  308 + SPBNoosferoTheme.HighlightedSoftwaresBlock.init();
  309 + SPBNoosferoTheme.NoosferoHTMLAdjusts.init();
  310 + SPBNoosferoTheme.SoftwareCatalog.init();
  311 + SPBNoosferoTheme.NoosferoFoldersContent.init();
  312 + });
  313 +}) (jQuery);