Open/Close system for public feature and landing page JS refactoring

James Peret 10 jaren geleden
bovenliggende
commit
9d6ca9e0be

+ 176 - 172
app/assets/javascripts/start.js

@@ -12,6 +12,182 @@ function attachHandler(jQuery) {
12 12
 	$('#tagline_subscribe').css('top', (($('#photo_subscribe').height()/10)*-8));
13 13
 	$('#tagline_subscribe2').css('top', (($('#photo_subscribe2').height()/10)*-7));
14 14
 
15
+	$(window).on('load',function(){
16
+		$('#obscure_header').css('height', ($('#photo_header').height()));
17
+		$('#obscure_header_mobile').css('height', ($('#photo_header_mobile').height()));
18
+		$('#obscure_subscribe').css('height', ($('#photo_subscribe').height()));	
19
+		$('#obscure_subscribe2').css('height', ($('#photo_subscribe2').height()));	
20
+		$('#myCarousel.carousel.slide').css('height', ($('#photo_header').height()));
21
+		$('#myCarousel2.carousel.slide').css('height', ($('#photo_header_mobile').height()));
22
+		$('#tagline_header').css('top', (($('#photo_header').height()/7)*-5));
23
+		$('#tagline_header_mobile').css('top', (($('#photo_header_mobile').height()/10)*-8));
24
+		$('#tagline_subscribe').css('top', (($('#photo_subscribe').height()/10)*-8));
25
+		$('#tagline_subscribe2').css('top', (($('#photo_subscribe2').height()/10)*-7));
26
+	});
27
+
28
+	$(window).on('ready',function(){
29
+		$('#obscure_header').css('height', ($('#photo_header').height()));
30
+		$('#obscure_header_mobile').css('height', ($('#photo_header_mobile').height()));
31
+		$('#obscure_subscribe').css('height', ($('#photo_subscribe').height()));	
32
+		$('#obscure_subscribe2').css('height', ($('#photo_subscribe2').height()));	
33
+		$('#myCarousel.carousel.slide').css('height', ($('#photo_header').height()));
34
+		$('#myCarousel2.carousel.slide').css('height', ($('#photo_header_mobile').height()));
35
+		$('#tagline_header').css('top', (($('#photo_header').height()/7)*-5));
36
+		$('#tagline_header_mobile').css('top', (($('#photo_header_mobile').height()/10)*-8));
37
+		$('#tagline_subscribe').css('top', (($('#photo_subscribe').height()/10)*-8));
38
+		$('#tagline_subscribe2').css('top', (($('#photo_subscribe2').height()/10)*-7));
39
+	});
40
+
41
+	var mainbottom = $('#myCarousel').height();
42
+
43
+
44
+
45
+	$( window ).resize(function(){
46
+		$('#obscure_header').css('height', ($('#photo_header').height()));
47
+		$('#obscure_header_mobile').css('height', ($('#photo_header_mobile').height()));	
48
+		$('#obscure_subscribe').css('height', ($('#photo_subscribe').height()));
49
+		$('#obscure_subscribe2').css('height', ($('#photo_subscribe2').height()));		
50
+		$('#myCarousel.carousel.slide').css('height', ($('#photo_header').height()));
51
+		$('#myCarousel2.carousel.slide').css('height', ($('#photo_header_mobile').height()));
52
+		var mainbottom = $('#myCarousel').offset().top + ($('#myCarousel').height()*2)-10;
53
+		$('#tagline_header').css('top', (($('#photo_header').height()/7)*-5));
54
+		$('#tagline_header_mobile').css('top', (($('#photo_header_mobile').height()/10)*-8));
55
+		$('#tagline_subscribe').css('top', (($('#photo_subscribe').height()/10)*-8));
56
+		$('#tagline_subscribe2').css('top', (($('#photo_subscribe2').height()/10)*-7));
57
+	});
58
+
59
+
60
+
61
+	$('.popup').popover('toogle')
62
+
63
+	// Newsletter Subscription AJAX
64
+
65
+	$('.new_subscription').submit(function() {  
66
+	    var valuesToSubmit = $(this).serialize();
67
+	    $.ajax({
68
+	        type: "POST",
69
+	        url: $(this).attr('action'),
70
+	        data: valuesToSubmit,
71
+		   dataType: "json",
72
+		   async: true,
73
+		   error: function(request, textStatus, errorThrown){
74
+		   		msg = '<div class="alert alert-error span5 subscribe-alert"><h4>' + request.status + " " + errorThrown + '</h4><br>' + request.responseText + '</div>'
75
+		   		$('.new_subscription').html(msg);     
76
+		   }, 
77
+		   success: function(data){
78
+			   $('.subscribe-alert').remove();
79
+			   switch(data.status) {
80
+			       case 'success':
81
+					 msg = '<div class="alert alert-success subscribe-alert"><h4>' + data.success + '</h4></div>';
82
+					 $('.new_subscription').html(msg); 
83
+			           break;
84
+			       case 'error':
85
+					 msg = '<div class="alert alert-error subscribe-alert"><h4>' + data.failure + '</h4></div>';
86
+					 $('.new_subscription').html(msg); 
87
+			           break;
88
+		       	  case 'invalid':
89
+					  msg = '<div class="alert alert-block subscribe-alert"><h4>' + data.invalid + '</h4></div>';
90
+					  $('.new_subscription').prepend(msg);
91
+		           	 break;
92
+			   }      
93
+		   }
94
+	    });
95
+	    return false;
96
+	});
97
+
98
+	// on scroll, 
99
+	$(window).on('scroll',function(){
100
+
101
+	    // we round here to reduce a little workload
102
+	    stop = Math.round($(document).scrollTop());
103
+	    if (stop > mainbottom) {
104
+	        $('.navbar-inner.nav_fx').addClass('past-main');
105
+	    } else {
106
+	        $('.navbar-inner.nav_fx').removeClass('past-main');
107
+	   }
108
+
109
+	});
110
+	
111
+	if ($("body").hasClass("landing-page")) {
112
+		
113
+		// scroll to 'header'
114
+		$(".btn-logo").click(function() {
115
+		    event.preventDefault();
116
+		    doc_with = $(document).width();
117
+		    if (doc_with > 979) {
118
+		    		$('html, body').animate({
119
+				    scrollTop: $("#myCarousel").offset().top
120
+				}, 1000);
121
+			} else if (doc_with < 979 && doc_with > 780) {
122
+		    		$('html, body').animate({
123
+				    scrollTop: ($("#myCarousel").offset().top - 56)
124
+				}, 1000);
125
+			} else {
126
+		    		$('html, body').animate({
127
+				    scrollTop: ($("#myCarousel2").offset().top - 56)
128
+				}, 1000);
129
+			}
130
+    
131
+		});
132
+
133
+		// scroll to 'about'
134
+		$(".btn-about").click(function() {
135
+		    event.preventDefault();
136
+		    doc_with = $(document).width();
137
+		    if (doc_with > 979) {
138
+			    $('html, body').animate({
139
+			        scrollTop: ($("#about").offset().top - 80)
140
+			    }, 1000);
141
+		    } else if (doc_with < 979 && doc_with > 780){
142
+			    $('html, body').animate({
143
+			        scrollTop: ($("#about").offset().top - 270)
144
+			    }, 1000);
145
+		    } else {
146
+			    $('html, body').animate({
147
+			        scrollTop: ($("#about").offset().top - 270)
148
+			    }, 1000);
149
+		    }
150
+		});
151
+
152
+		// scroll to 'features'
153
+		$(".btn-features").click(function() {
154
+		    event.preventDefault();
155
+		    doc_with = $(document).width();
156
+		    if (doc_with > 979) {
157
+			    $('html, body').animate({
158
+			        scrollTop: ($("#features").offset().top - 50)
159
+			    }, 1000);
160
+		    } else if (doc_with < 979 && doc_with > 780){
161
+			    $('html, body').animate({
162
+			        scrollTop: ($("#features").offset().top - 230)
163
+			    }, 1000);
164
+		    } else {
165
+			    $('html, body').animate({
166
+			        scrollTop: ($("#features2").offset().top - 230)
167
+			    }, 1000);
168
+		    }
169
+		});
170
+
171
+		// scroll to 'subscribe'
172
+		$(".btn-subscribe").click(function() {
173
+		    event.preventDefault();
174
+		    doc_with = $(document).width();
175
+		    if (doc_with > 979) {
176
+			    $('html, body').animate({
177
+			        scrollTop: ($("#subscribe").offset().top)
178
+			    }, 1000);
179
+		    } else if (doc_with < 979 && doc_with > 780){
180
+			    $('html, body').animate({
181
+			        scrollTop: ($("#subscribe").offset().top  - 100)
182
+			    }, 1000);
183
+		    } else {
184
+			    $('html, body').animate({
185
+			        scrollTop: ($("#subscribe2").offset().top  - 230)
186
+			    }, 1000);
187
+		    }
188
+		});
189
+	}
190
+
15 191
 };
16 192
 
17 193
 $(document).ready(attachHandler);
@@ -22,175 +198,3 @@ $(document).load(attachHandler);
22 198
 
23 199
 
24 200
 
25
-$(window).on('load',function(){
26
-	$('#obscure_header').css('height', ($('#photo_header').height()));
27
-	$('#obscure_header_mobile').css('height', ($('#photo_header_mobile').height()));
28
-	$('#obscure_subscribe').css('height', ($('#photo_subscribe').height()));	
29
-	$('#obscure_subscribe2').css('height', ($('#photo_subscribe2').height()));	
30
-	$('#myCarousel.carousel.slide').css('height', ($('#photo_header').height()));
31
-	$('#myCarousel2.carousel.slide').css('height', ($('#photo_header_mobile').height()));
32
-	$('#tagline_header').css('top', (($('#photo_header').height()/7)*-5));
33
-	$('#tagline_header_mobile').css('top', (($('#photo_header_mobile').height()/10)*-8));
34
-	$('#tagline_subscribe').css('top', (($('#photo_subscribe').height()/10)*-8));
35
-	$('#tagline_subscribe2').css('top', (($('#photo_subscribe2').height()/10)*-7));
36
-});
37
-
38
-$(window).on('ready',function(){
39
-	$('#obscure_header').css('height', ($('#photo_header').height()));
40
-	$('#obscure_header_mobile').css('height', ($('#photo_header_mobile').height()));
41
-	$('#obscure_subscribe').css('height', ($('#photo_subscribe').height()));	
42
-	$('#obscure_subscribe2').css('height', ($('#photo_subscribe2').height()));	
43
-	$('#myCarousel.carousel.slide').css('height', ($('#photo_header').height()));
44
-	$('#myCarousel2.carousel.slide').css('height', ($('#photo_header_mobile').height()));
45
-	$('#tagline_header').css('top', (($('#photo_header').height()/7)*-5));
46
-	$('#tagline_header_mobile').css('top', (($('#photo_header_mobile').height()/10)*-8));
47
-	$('#tagline_subscribe').css('top', (($('#photo_subscribe').height()/10)*-8));
48
-	$('#tagline_subscribe2').css('top', (($('#photo_subscribe2').height()/10)*-7));
49
-});
50
-
51
-var mainbottom = $('#myCarousel').height();
52
-
53
-
54
-
55
-$( window ).resize(function(){
56
-	$('#obscure_header').css('height', ($('#photo_header').height()));
57
-	$('#obscure_header_mobile').css('height', ($('#photo_header_mobile').height()));	
58
-	$('#obscure_subscribe').css('height', ($('#photo_subscribe').height()));
59
-	$('#obscure_subscribe2').css('height', ($('#photo_subscribe2').height()));		
60
-	$('#myCarousel.carousel.slide').css('height', ($('#photo_header').height()));
61
-	$('#myCarousel2.carousel.slide').css('height', ($('#photo_header_mobile').height()));
62
-	var mainbottom = $('#myCarousel').offset().top + ($('#myCarousel').height()*2)-10;
63
-	$('#tagline_header').css('top', (($('#photo_header').height()/7)*-5));
64
-	$('#tagline_header_mobile').css('top', (($('#photo_header_mobile').height()/10)*-8));
65
-	$('#tagline_subscribe').css('top', (($('#photo_subscribe').height()/10)*-8));
66
-	$('#tagline_subscribe2').css('top', (($('#photo_subscribe2').height()/10)*-7));
67
-});
68
-
69
-
70
-
71
-$('.popup').popover('toogle')
72
-
73
-// Newsletter Subscription AJAX
74
-
75
-$('.new_subscription').submit(function() {  
76
-    var valuesToSubmit = $(this).serialize();
77
-    $.ajax({
78
-        type: "POST",
79
-        url: $(this).attr('action'),
80
-        data: valuesToSubmit,
81
-	   dataType: "json",
82
-	   async: true,
83
-	   error: function(request, textStatus, errorThrown){
84
-	   		msg = '<div class="alert alert-error span5 subscribe-alert"><h4>' + request.status + " " + errorThrown + '</h4><br>' + request.responseText + '</div>'
85
-	   		$('.new_subscription').html(msg);     
86
-	   }, 
87
-	   success: function(data){
88
-		   $('.subscribe-alert').remove();
89
-		   switch(data.status) {
90
-		       case 'success':
91
-				 msg = '<div class="alert alert-success subscribe-alert"><h4>' + data.success + '</h4></div>';
92
-				 $('.new_subscription').html(msg); 
93
-		           break;
94
-		       case 'error':
95
-				 msg = '<div class="alert alert-error subscribe-alert"><h4>' + data.failure + '</h4></div>';
96
-				 $('.new_subscription').html(msg); 
97
-		           break;
98
-	       	  case 'invalid':
99
-				  msg = '<div class="alert alert-block subscribe-alert"><h4>' + data.invalid + '</h4></div>';
100
-				  $('.new_subscription').prepend(msg);
101
-	           	 break;
102
-		   }      
103
-	   }
104
-    });
105
-    return false;
106
-});
107
-
108
-// on scroll, 
109
-$(window).on('scroll',function(){
110
-
111
-    // we round here to reduce a little workload
112
-    stop = Math.round($(document).scrollTop());
113
-    if (stop > mainbottom) {
114
-        $('.navbar-inner.nav_fx').addClass('past-main');
115
-    } else {
116
-        $('.navbar-inner.nav_fx').removeClass('past-main');
117
-   }
118
-
119
-});
120
-
121
-// scroll to 'header'
122
-$(".btn-logo").click(function() {
123
-    event.preventDefault();
124
-    doc_with = $(document).width();
125
-    if (doc_with > 979) {
126
-    		$('html, body').animate({
127
-		    scrollTop: $("#myCarousel").offset().top
128
-		}, 1000);
129
-	} else if (doc_with < 979 && doc_with > 780) {
130
-    		$('html, body').animate({
131
-		    scrollTop: ($("#myCarousel").offset().top - 56)
132
-		}, 1000);
133
-	} else {
134
-    		$('html, body').animate({
135
-		    scrollTop: ($("#myCarousel2").offset().top - 56)
136
-		}, 1000);
137
-	}
138
-    
139
-});
140
-
141
-// scroll to 'about'
142
-$(".btn-about").click(function() {
143
-    event.preventDefault();
144
-    doc_with = $(document).width();
145
-    if (doc_with > 979) {
146
-	    $('html, body').animate({
147
-	        scrollTop: ($("#about").offset().top - 80)
148
-	    }, 1000);
149
-    } else if (doc_with < 979 && doc_with > 780){
150
-	    $('html, body').animate({
151
-	        scrollTop: ($("#about").offset().top - 270)
152
-	    }, 1000);
153
-    } else {
154
-	    $('html, body').animate({
155
-	        scrollTop: ($("#about").offset().top - 270)
156
-	    }, 1000);
157
-    }
158
-});
159
-
160
-// scroll to 'features'
161
-$(".btn-features").click(function() {
162
-    event.preventDefault();
163
-    doc_with = $(document).width();
164
-    if (doc_with > 979) {
165
-	    $('html, body').animate({
166
-	        scrollTop: ($("#features").offset().top - 50)
167
-	    }, 1000);
168
-    } else if (doc_with < 979 && doc_with > 780){
169
-	    $('html, body').animate({
170
-	        scrollTop: ($("#features").offset().top - 230)
171
-	    }, 1000);
172
-    } else {
173
-	    $('html, body').animate({
174
-	        scrollTop: ($("#features2").offset().top - 230)
175
-	    }, 1000);
176
-    }
177
-});
178
-
179
-// scroll to 'subscribe'
180
-$(".btn-subscribe").click(function() {
181
-    event.preventDefault();
182
-    doc_with = $(document).width();
183
-    if (doc_with > 979) {
184
-	    $('html, body').animate({
185
-	        scrollTop: ($("#subscribe").offset().top)
186
-	    }, 1000);
187
-    } else if (doc_with < 979 && doc_with > 780){
188
-	    $('html, body').animate({
189
-	        scrollTop: ($("#subscribe").offset().top  - 100)
190
-	    }, 1000);
191
-    } else {
192
-	    $('html, body').animate({
193
-	        scrollTop: ($("#subscribe2").offset().top  - 230)
194
-	    }, 1000);
195
-    }
196
-});

+ 7 - 0
app/controllers/application_controller.rb

@@ -38,6 +38,13 @@ class ApplicationController < ActionController::Base
38 38
       end
39 39
     end
40 40
     I18n.locale = l
41
+    if @config.open_for_public == false && user_signed_in? == false
42
+      page = params[:controller]
43
+      if page != 'start' && page != 'devise/sessions' && page != 'devise/registrations' && page != 'devise/invitations' && page != 'devise/passwords' && page != 'devise/unlocks' && page != 'devise/confirmations'
44
+        redirect_to root_path, notice: (t 'admin_panel.closed_for_public')
45
+        return
46
+      end
47
+    end
41 48
   end
42 49
   
43 50
   def analytics

+ 3 - 1
app/views/devise/sessions/new.html.erb

@@ -14,7 +14,9 @@
14 14
 		<% end%>
15 15
 		<%= content_tag(:div, class: 'form-buttons') do %>
16 16
   	     	<%= f.submit (t 'registration.sign_in_submit'), id: 'submit_login_btn', class: 'btn inverse' %>
17
-  	     	<%= link_to (t 'registration.sign_up'), new_user_registration_path, class: 'btn btn-link inverse', style: 'padding-left: 25px;' %>
17
+			<% if @config.open_for_signup %>
18
+  	     		<%= link_to (t 'registration.sign_up'), new_user_registration_path, class: 'btn btn-link inverse', style: 'padding-left: 25px;' %>
19
+			<% end %>
18 20
   	     	<%= link_to (t 'registration.forgot_password'), new_user_password_path, class: 'btn btn-link inverse', id: 'btn-forgot-password' %>
19 21
 		<% end%>
20 22
 	<% end %>

+ 17 - 7
app/views/layouts/_navigation_links.html.erb

@@ -1,10 +1,16 @@
1 1
 <div class="container nav-collapse">
2 2
   <ul class="nav">
3
-    <% if user_signed_in? %>
4
-    	  <li><%= link_to (t 'agent.dashboard'), dashboard_path %></li>
5
-    <% end %>
6
-    <li><%= link_to (t 'missions.missions'), missions_path %></li>
7
-    <li><%= link_to (t 'agents.agents'), agent_list_path %></li>
3
+	<% if @config.open_for_public || user_signed_in? %>
4
+		<% if user_signed_in? %>
5
+			<li><%= link_to (t 'agent.dashboard'), dashboard_path %></li>
6
+		<% end %>
7
+		<li><%= link_to (t 'missions.missions'), missions_path %></li>
8
+		<li><%= link_to (t 'agents.agents'), agent_list_path %></li>
9
+	<% else %>
10
+		<li><%= link_to (t "landing_page.about").html_safe, root_path(anchor: 'about'), class: 'btn-about nav-responsive-link' %></li>
11
+		<li><%= link_to (t "landing_page.features").html_safe, root_path(anchor: 'features'), class: 'btn-features nav-responsive-link' %></li>
12
+		<li><%= link_to (t "landing_page.subscribe").html_safe, root_path(anchor: 'subscribe'), class: 'btn-subscribe nav-responsive-link' %></li>
13
+	<% end %>
8 14
   </ul>
9 15
   
10 16
 <ul class="nav pull-right">
@@ -25,8 +31,12 @@
25 31
 		</li>
26 32
 	<% else %>
27 33
 		<li><%= link_to (t "nav.login"), new_user_session_path  %></li>
28
-		<li><%= link_to (t "nav.signup"), new_user_registration_path  %></li>
34
+		<% if @config.open_for_signup %>
35
+			<li><%= link_to (t "nav.signup"), new_user_registration_path  %></li>
36
+		<% end %>
29 37
 	<% end %>
30 38
 </ul>
31 39
   
32
-</div><!--/.nav-collapse -->
40
+</div><!--/.nav-collapse -->
41
+
42
+

+ 2 - 2
app/views/layouts/application.html.erb

@@ -49,9 +49,9 @@
49 49
 	<% end %>
50 50
     
51 51
   </head>
52
-  <body>
52
+  <body class="<%= if params[:controller] == 'start' then 'landing-page' end %>">
53 53
     <div class="wrapper">
54
-	    <div class="navbar navbar-fixed-top">
54
+	    <div class="navbar navbar-fixed-top ">
55 55
 	      <div class="navbar-inner <%= if params[:controller] == 'start' then 'nav_fx' else 'past-main' end %>">
56 56
 	        <div class="container">
57 57
 	          <a class="btn btn-navbar" data-target=".nav-collapse" data-toggle="collapse">

+ 14 - 6
app/views/layouts/footer/_footer_links.html.erb

@@ -5,13 +5,21 @@
5 5
 	<%= t 'contact.support' %>
6 6
 <% end %>
7 7
 <%= content_tag(:div, class: 'pull-right') do %>
8
-	<%= link_to (t 'missions.missions'), missions_path  %><br>
9
-	<%= link_to (t 'missions.agents'), agent_list_path  %><br>
10
-	<% if user_signed_in? %>
11
-		<%= link_to (t 'agent.dashboard'), dashboard_path  %><br>
12
-		<%= link_to (t "registration.account"), edit_user_registration_path, class: "btn-account" %><br>
8
+	<% if @config.open_for_public || user_signed_in? %>
9
+		<%= link_to (t 'missions.missions'), missions_path  %><br>
10
+		<%= link_to (t 'missions.agents'), agent_list_path  %><br>
11
+		<% if user_signed_in? %>
12
+			<%= link_to (t 'agent.dashboard'), dashboard_path  %><br>
13
+			<%= link_to (t "registration.account"), edit_user_registration_path, class: "btn-account" %><br>
14
+		<% else %>
15
+			<%= link_to (t "registration.sign_in"), new_user_session_path, class: "btn-login" %><br>
16
+			<%= link_to (t "registration.sign_up"), new_user_registration_path, class: "btn-login" %><br>
17
+		<% end %>
13 18
 	<% else %>
19
+		<%= link_to (t "landing_page.about").html_safe, root_path(anchor: 'about'), class: 'btn-about' %><br>
20
+		<%= link_to (t "landing_page.features").html_safe, root_path(anchor: 'features'), class: 'btn-features' %><br>
21
+		<%= link_to (t "landing_page.subscribe").html_safe, root_path(anchor: 'subscribe'), class: 'btn-subscribe' %><br>
14 22
 		<%= link_to (t "registration.sign_in"), new_user_session_path, class: "btn-login" %><br>
15
-		<%= link_to (t "registration.sign_up"), new_user_registration_path, class: "btn-login" %><br>
16 23
 	<% end %>
17 24
 <% end %>
25
+

+ 2 - 2
app/views/layouts/landing_page.erb

@@ -42,9 +42,9 @@
42 42
     <script src='https://api.tiles.mapbox.com/mapbox.js/v2.1.4/mapbox.js'></script>
43 43
     <link href='https://api.tiles.mapbox.com/mapbox.js/v2.1.4/mapbox.css' rel='stylesheet' />
44 44
   </head>
45
-  <body data-no-turbolink='true'>
45
+  <body data-no-turbolink='true' class="">
46 46
 
47
-    <nav class="navbar navbar-fixed-top">
47
+    <div class="navbar navbar-fixed-top landing-page">
48 48
       <div class="navbar-inner nav_fx">
49 49
         <div class="container">
50 50
           <a  class="btn btn-navbar" data-target=".nav-collapse" data-toggle="collapse" style="margin-top: 13px;">

+ 1 - 0
config/locales/en.yml

@@ -243,6 +243,7 @@ en:
243 243
     permission_denied: You dont have permission to access that page!
244 244
     contact_messages: Messages
245 245
     subscribers: Subscribers
246
+    closed_for_pulbic: You have to be loged in to access this page
246 247
   nav:
247 248
     admin_panel: Admin Panel
248 249
     account: Account

+ 1 - 0
config/locales/pt-BR.yml

@@ -245,6 +245,7 @@ pt-BR:
245 245
     permission_denied: Você não tem permissão para acessar aquela página!
246 246
     contact_messages: Mensagens
247 247
     subscribers: Assinantes
248
+    closed_for_public: "Você precisa estar registrado para acessar essa página."
248 249
   nav:
249 250
     admin_panel: Painel de Controle
250 251
     account: Conta

BIN
dump.rdb