radiant-reader-extension 1.3.4 → 1.3.6
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +1 -0
- data/VERSION +1 -1
- data/app/controllers/reader_sessions_controller.rb +22 -2
- data/app/controllers/readers_controller.rb +1 -14
- data/app/views/reader_sessions/_login_form.html.haml +1 -1
- data/app/views/readers/_controls.html.haml +13 -25
- data/app/views/readers/_standard_parts.html.haml +10 -7
- data/config/locales/en.yml +8 -1
- data/lib/controller_extensions.rb +3 -1
- data/public/javascripts/reader.js +177 -1
- data/public/stylesheets/sass/admin/reader.sass +0 -3
- data/public/stylesheets/sass/reader.sass +10 -10
- data/radiant-reader-extension.gemspec +2 -2
- data/reader_extension.rb +1 -1
- metadata +4 -4
data/README.md
CHANGED
@@ -17,6 +17,7 @@ Right now we are **not compatible with multi_site or the sites extension**: that
|
|
17
17
|
* public interface internationalized;
|
18
18
|
* Uses the new configuration interface;
|
19
19
|
* Messaging much simplified and now intended to be purely administrative.
|
20
|
+
* ajaxable status panel returned by `reader_session_url`
|
20
21
|
|
21
22
|
## Status
|
22
23
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.3.
|
1
|
+
1.3.6
|
@@ -4,6 +4,24 @@ class ReaderSessionsController < ReaderActionController
|
|
4
4
|
before_filter :require_reader, :only => :destroy
|
5
5
|
radiant_layout { |controller| Radiant::Config['reader.layout'] }
|
6
6
|
|
7
|
+
def show
|
8
|
+
@reader = current_reader
|
9
|
+
respond_to do |format|
|
10
|
+
format.html {
|
11
|
+
if !@reader
|
12
|
+
redirect_to reader_login_url
|
13
|
+
elsif @reader.inactive?
|
14
|
+
redirect_to reader_activation_url
|
15
|
+
else
|
16
|
+
redirect_to reader_profile_url
|
17
|
+
end
|
18
|
+
}
|
19
|
+
format.js {
|
20
|
+
render :partial => 'readers/controls', :layout => false
|
21
|
+
}
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
7
25
|
def new
|
8
26
|
if current_reader
|
9
27
|
if current_reader.activated?
|
@@ -32,7 +50,7 @@ class ReaderSessionsController < ReaderActionController
|
|
32
50
|
redirect_back_or_to default_loggedin_url
|
33
51
|
}
|
34
52
|
format.js {
|
35
|
-
redirect_back_with_format(:js)
|
53
|
+
redirect_back_with_format(:js)
|
36
54
|
}
|
37
55
|
end
|
38
56
|
|
@@ -42,7 +60,9 @@ class ReaderSessionsController < ReaderActionController
|
|
42
60
|
flash[:error] = t('login_unknown')
|
43
61
|
render :action => :new
|
44
62
|
}
|
45
|
-
format.js {
|
63
|
+
format.js {
|
64
|
+
render :action => :new, :layout => false
|
65
|
+
}
|
46
66
|
end
|
47
67
|
end
|
48
68
|
end
|
@@ -6,7 +6,7 @@ class ReadersController < ReaderActionController
|
|
6
6
|
before_filter :check_registration_allowed, :only => [:new, :create]
|
7
7
|
before_filter :initialize_partials
|
8
8
|
before_filter :i_am_me, :only => [:show, :edit]
|
9
|
-
before_filter :require_reader, :except => [:
|
9
|
+
before_filter :require_reader, :except => [:new, :create, :activate]
|
10
10
|
before_filter :restrict_to_self, :only => [:edit, :update, :resend_activation]
|
11
11
|
before_filter :no_removing, :only => [:remove, :destroy]
|
12
12
|
before_filter :require_password, :only => [:update]
|
@@ -17,19 +17,6 @@ class ReadersController < ReaderActionController
|
|
17
17
|
|
18
18
|
def show
|
19
19
|
@reader = Reader.find(params[:id])
|
20
|
-
respond_to do |format|
|
21
|
-
format.html {
|
22
|
-
if @reader.inactive? && @reader == current_reader
|
23
|
-
redirect_to reader_activation_url
|
24
|
-
else
|
25
|
-
render
|
26
|
-
end
|
27
|
-
}
|
28
|
-
format.js {
|
29
|
-
@inline = true
|
30
|
-
render :partial => 'readers/controls'
|
31
|
-
}
|
32
|
-
end
|
33
20
|
end
|
34
21
|
|
35
22
|
def new
|
@@ -1,25 +1,13 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
= link_to 'admin', admin_pages_url
|
15
|
-
|
|
16
|
-
= link_to 'log out', reader_logout_url
|
17
|
-
-else
|
18
|
-
%p
|
19
|
-
please check your email for an activation message
|
20
|
-
- else
|
21
|
-
%p
|
22
|
-
To take part, please
|
23
|
-
= link_to 'log in', reader_login_url
|
24
|
-
or
|
25
|
-
= link_to 'register', new_reader_url
|
1
|
+
- if !current_reader
|
2
|
+
= link_to t('navigation.log_in'), reader_login_url
|
3
|
+
= link_to t('navigation.register'), new_reader_url
|
4
|
+
- elsif !current_reader.activated?
|
5
|
+
= link_to t('navigation.activate'), reader_activation_url
|
6
|
+
- else
|
7
|
+
= link_to t('navigation.profile'), reader_profile_url
|
8
|
+
= link_to t('navigation.account'), reader_account_url
|
9
|
+
- if current_reader.is_user?
|
10
|
+
= link_to t('navigation.admin'), admin_pages_url
|
11
|
+
= link_to t('navigation.log_out'), reader_logout_url
|
12
|
+
|
13
|
+
|
@@ -1,11 +1,8 @@
|
|
1
|
-
-
|
2
|
-
|
1
|
+
- content_for :reader_css do
|
2
|
+
%link{:rel => 'stylesheet', :type => 'text/css', :href => '/stylesheets/reader.css', :media => 'all'}
|
3
3
|
|
4
|
-
- content_for :
|
5
|
-
|
6
|
-
= link_to t('navigation.your_account'), reader_account_url
|
7
|
-
- if Radiant::Config['reader.help_url']
|
8
|
-
= link_to t('navigation.reader_help'), Radiant::Config['reader.help_url']
|
4
|
+
- content_for :reader_js do
|
5
|
+
%script{:src => '/javascripts/reader.js', :type => 'text/javascript'}
|
9
6
|
|
10
7
|
- content_for :reader_css do
|
11
8
|
- reader_css_paths.each do |path|
|
@@ -18,3 +15,9 @@
|
|
18
15
|
- content_for :person do
|
19
16
|
- if @reader && !@reader.new_record?
|
20
17
|
= standard_gravatar_for(@reader)
|
18
|
+
|
19
|
+
- content_for :section_navigation do
|
20
|
+
= link_to t('navigation.readers'), readers_url, :class => 'section'
|
21
|
+
= link_to t('navigation.loading'), reader_session_url, :class => "remotecontent"
|
22
|
+
- if Radiant::Config['reader.help_url']
|
23
|
+
= link_to t('navigation.reader_help'), Radiant::Config['reader.help_url']
|
data/config/locales/en.yml
CHANGED
@@ -5,6 +5,7 @@ en:
|
|
5
5
|
activate_account: "Activate your account"
|
6
6
|
activation_complete: "Thank you very much for persevering with the registration process. Your account is now active."
|
7
7
|
activation_message_sent: "Account activation instructions have been emailed to you."
|
8
|
+
activation_required: "Please check your email for an activation message"
|
8
9
|
activation_required_header: "Please check your email"
|
9
10
|
activation_required_explanation: "You should have received a confirmation message containing a link that will activate your account."
|
10
11
|
activation_sent: "Activation message sent"
|
@@ -20,6 +21,7 @@ en:
|
|
20
21
|
cannot_edit_others: "You are not allowed to edit other people's accounts."
|
21
22
|
change_gravatar: "change gravatar image"
|
22
23
|
change_password: "Change your password"
|
24
|
+
check_email: "Please check your email for an activation message"
|
23
25
|
config:
|
24
26
|
reader:
|
25
27
|
allow_registration?: "Allow registration"
|
@@ -80,12 +82,16 @@ en:
|
|
80
82
|
logout_message: "You are logged out. Bye!"
|
81
83
|
must_be_empty: "must be empty"
|
82
84
|
navigation:
|
85
|
+
account: "Your account"
|
83
86
|
activate: "Activate account"
|
87
|
+
admin: "Admin"
|
84
88
|
readers: "People"
|
85
89
|
preferences: "Preferences"
|
86
|
-
profile: "
|
90
|
+
profile: "Profile"
|
87
91
|
log_in: "Log in"
|
88
92
|
log_out: "Log out"
|
93
|
+
loading: "Loading..."
|
94
|
+
register: "Register"
|
89
95
|
your_account: "Your account"
|
90
96
|
new_account: "Create an account"
|
91
97
|
new_password: "New password"
|
@@ -136,6 +142,7 @@ en:
|
|
136
142
|
sorry: "sorry"
|
137
143
|
sorry_access_denied: "Sorry: access denied"
|
138
144
|
spam_trap: "it's a spam trap and shouldn't be visible"
|
145
|
+
status_check: "Please wait: loading controls"
|
139
146
|
terms_and_conditions: "terms and conditions"
|
140
147
|
thanks_activated: "Thank you! Your account has been activated."
|
141
148
|
thanks_and_activation_instructions: "Thank you for registering. Now please check your email. We have sent a message containing a link that will automatically activate your account and log you in."
|
@@ -53,8 +53,10 @@ module ControllerExtensions # for inclusion into ApplicationController
|
|
53
53
|
end
|
54
54
|
|
55
55
|
def redirect_back_with_format(format = 'html')
|
56
|
+
Rails.logger.warn "<<< redirect_back_with_format. session[:return_to] is #{session[:return_to].inspect}"
|
56
57
|
address = session[:return_to]
|
57
|
-
|
58
|
+
previous_format = File.extname(address)
|
59
|
+
raise StandardError, "Can't add format to an already formatted url: #{address}" unless previous_format.blank? || previous_format == format
|
58
60
|
redirect_to address + ".#{format}" # nasty! but necessary for inline login.
|
59
61
|
end
|
60
62
|
|
@@ -1,9 +1,21 @@
|
|
1
1
|
(function($) {
|
2
2
|
|
3
|
+
$.fn.rails_flash = function() {
|
4
|
+
this.each(function() {
|
5
|
+
var self = $(this);
|
6
|
+
var closer = $('<a href="#" class="closer">x</a>').appendTo(self);
|
7
|
+
closer.click( function (event) {
|
8
|
+
event.preventDefault();
|
9
|
+
self.fadeOut('fast');
|
10
|
+
});
|
11
|
+
});
|
12
|
+
return this;
|
13
|
+
};
|
14
|
+
|
3
15
|
$.fn.toggler = function() {
|
4
16
|
this.each(function() {
|
5
17
|
var self = $(this);
|
6
|
-
var toggling = $(self.attr
|
18
|
+
var toggling = $(self.attr('rel'));
|
7
19
|
self.click( function (event) {
|
8
20
|
event.preventDefault();
|
9
21
|
toggling.toggle();
|
@@ -12,8 +24,172 @@
|
|
12
24
|
return this;
|
13
25
|
};
|
14
26
|
|
27
|
+
$.ajaxSetup({
|
28
|
+
'beforeSend': function(xhr) {
|
29
|
+
xhr.setRequestHeader("Accept", "text/javascript");
|
30
|
+
}
|
31
|
+
});
|
32
|
+
|
33
|
+
// general-purpose event blocker
|
34
|
+
function squash(e) {
|
35
|
+
if(e) {
|
36
|
+
e.preventDefault();
|
37
|
+
e.stopPropagation();
|
38
|
+
if (e.target) e.target.blur();
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
$.fn.fetch_remote_content = function() {
|
43
|
+
this.each(function() {
|
44
|
+
var self = $(this);
|
45
|
+
var url = self.attr('href');
|
46
|
+
if (url) {
|
47
|
+
self.addClass('waiting');
|
48
|
+
$.get(url, function (result) { self.replaceWith($(result)); });
|
49
|
+
}
|
50
|
+
});
|
51
|
+
return this;
|
52
|
+
};
|
53
|
+
|
54
|
+
/*
|
55
|
+
* jQuery Color Animations
|
56
|
+
* Copyright 2007 John Resig
|
57
|
+
* Released under the MIT and GPL licenses.
|
58
|
+
* syntax corrected but otherwise untouched.
|
59
|
+
*/
|
60
|
+
|
61
|
+
// We override the animation for all of these color styles
|
62
|
+
$.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor', 'color', 'outlineColor'], function(i, attr) {
|
63
|
+
$.fx.step[attr] = function(fx) {
|
64
|
+
if (!fx.colorInit) {
|
65
|
+
fx.start = getColor(fx.elem, attr);
|
66
|
+
fx.end = getRGB(fx.end);
|
67
|
+
fx.colorInit = true;
|
68
|
+
}
|
69
|
+
|
70
|
+
fx.elem.style[attr] = "rgb(" + [
|
71
|
+
Math.max(Math.min(parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10), 255), 0),
|
72
|
+
Math.max(Math.min(parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10), 255), 0),
|
73
|
+
Math.max(Math.min(parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10), 255), 0)
|
74
|
+
].join(",") + ")";
|
75
|
+
}
|
76
|
+
});
|
77
|
+
|
78
|
+
// Color Conversion functions from highlightFade
|
79
|
+
// By Blair Mitchelmore
|
80
|
+
// http://jquery.offput.ca/highlightFade/
|
81
|
+
|
82
|
+
// Parse strings looking for color tuples [255,255,255]
|
83
|
+
function getRGB(color) {
|
84
|
+
var result;
|
85
|
+
|
86
|
+
// Check if we're already dealing with an array of colors
|
87
|
+
if ( color && color.constructor == Array && color.length == 3 )
|
88
|
+
return color;
|
89
|
+
|
90
|
+
// Look for rgb(num,num,num)
|
91
|
+
if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))
|
92
|
+
return [parseInt(result[1], 10), parseInt(result[2], 10), parseInt(result[3], 10)];
|
93
|
+
|
94
|
+
// Look for rgb(num%,num%,num%)
|
95
|
+
if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color))
|
96
|
+
return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];
|
97
|
+
|
98
|
+
// Look for #a0b1c2
|
99
|
+
if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))
|
100
|
+
return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];
|
101
|
+
|
102
|
+
// Look for #fff
|
103
|
+
if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))
|
104
|
+
return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];
|
105
|
+
|
106
|
+
// Look for rgba(0, 0, 0, 0) == transparent in Safari 3
|
107
|
+
if (result = /rgba\(0, 0, 0, 0\)/.exec(color))
|
108
|
+
return colors['transparent'];
|
109
|
+
|
110
|
+
// Otherwise, we're most likely dealing with a named color
|
111
|
+
return colors[jQuery.trim(color).toLowerCase()];
|
112
|
+
}
|
113
|
+
|
114
|
+
function getColor(elem, attr) {
|
115
|
+
var color;
|
116
|
+
|
117
|
+
do {
|
118
|
+
color = $.curCSS(elem, attr);
|
119
|
+
|
120
|
+
// Keep going until we find an element that has color, or we hit the body
|
121
|
+
if ( color != '' && color != 'transparent' || jQuery.nodeName(elem, "body") )
|
122
|
+
break;
|
123
|
+
|
124
|
+
attr = "backgroundColor";
|
125
|
+
} while ( elem = elem.parentNode );
|
126
|
+
|
127
|
+
return getRGB(color);
|
128
|
+
};
|
129
|
+
|
130
|
+
// Some named colors to work with
|
131
|
+
// From Interface by Stefan Petre
|
132
|
+
// http://interface.eyecon.ro/
|
133
|
+
|
134
|
+
var colors = {
|
135
|
+
aqua:[0,255,255],
|
136
|
+
azure:[240,255,255],
|
137
|
+
beige:[245,245,220],
|
138
|
+
black:[0,0,0],
|
139
|
+
blue:[0,0,255],
|
140
|
+
brown:[165,42,42],
|
141
|
+
cyan:[0,255,255],
|
142
|
+
darkblue:[0,0,139],
|
143
|
+
darkcyan:[0,139,139],
|
144
|
+
darkgrey:[169,169,169],
|
145
|
+
darkgreen:[0,100,0],
|
146
|
+
darkkhaki:[189,183,107],
|
147
|
+
darkmagenta:[139,0,139],
|
148
|
+
darkolivegreen:[85,107,47],
|
149
|
+
darkorange:[255,140,0],
|
150
|
+
darkorchid:[153,50,204],
|
151
|
+
darkred:[139,0,0],
|
152
|
+
darksalmon:[233,150,122],
|
153
|
+
darkviolet:[148,0,211],
|
154
|
+
fuchsia:[255,0,255],
|
155
|
+
gold:[255,215,0],
|
156
|
+
green:[0,128,0],
|
157
|
+
indigo:[75,0,130],
|
158
|
+
khaki:[240,230,140],
|
159
|
+
lightblue:[173,216,230],
|
160
|
+
lightcyan:[224,255,255],
|
161
|
+
lightgreen:[144,238,144],
|
162
|
+
lightgrey:[211,211,211],
|
163
|
+
lightpink:[255,182,193],
|
164
|
+
lightyellow:[255,255,224],
|
165
|
+
lime:[0,255,0],
|
166
|
+
magenta:[255,0,255],
|
167
|
+
maroon:[128,0,0],
|
168
|
+
navy:[0,0,128],
|
169
|
+
olive:[128,128,0],
|
170
|
+
orange:[255,165,0],
|
171
|
+
pink:[255,192,203],
|
172
|
+
purple:[128,0,128],
|
173
|
+
violet:[128,0,128],
|
174
|
+
red:[255,0,0],
|
175
|
+
silver:[192,192,192],
|
176
|
+
white:[255,255,255],
|
177
|
+
yellow:[255,255,0],
|
178
|
+
transparent: [255,255,255]
|
179
|
+
};
|
180
|
+
|
181
|
+
$.fn.blush = function(color, duration) {
|
182
|
+
color = color || "#FFFF9C";
|
183
|
+
duration = duration || 1500;
|
184
|
+
var backto = this.css("background-color");
|
185
|
+
if (backto == "" || backto == 'transparent') backto = '#ffffff';
|
186
|
+
this.css("background-color", color).animate({"background-color": backto}, duration);
|
187
|
+
};
|
188
|
+
|
15
189
|
})(jQuery);
|
16
190
|
|
17
191
|
$(function() {
|
18
192
|
$("a.toggle").toggler();
|
193
|
+
$("a.remotecontent").fetch_remote_content();
|
194
|
+
$("div.notice, div.error").rails_flash();
|
19
195
|
});
|
@@ -1,11 +1,11 @@
|
|
1
1
|
@import compass/css3
|
2
2
|
|
3
|
-
$dark: #4d4e53
|
4
|
-
$mid: #8c8d8e
|
5
|
-
$pale: #afafaf
|
6
|
-
$paler: #bdbdbd
|
7
|
-
$verypale: #d6d6d4
|
8
|
-
$accent = #d1005d
|
3
|
+
$dark: #4d4e53
|
4
|
+
$mid: #8c8d8e
|
5
|
+
$pale: #afafaf
|
6
|
+
$paler: #bdbdbd
|
7
|
+
$verypale: #d6d6d4
|
8
|
+
$accent = #d1005d
|
9
9
|
|
10
10
|
=functional
|
11
11
|
font-family: helvetica, arial, sans-serif
|
@@ -17,7 +17,7 @@ $accent = #d1005d / rubine red
|
|
17
17
|
+functional
|
18
18
|
font-size: 80%
|
19
19
|
|
20
|
-
.error, .notice
|
20
|
+
div.error, div.notice
|
21
21
|
position: absolute
|
22
22
|
width: 300px
|
23
23
|
top: 50px
|
@@ -33,10 +33,10 @@ $accent = #d1005d / rubine red
|
|
33
33
|
right: 5px
|
34
34
|
color: white
|
35
35
|
font-weight: bold
|
36
|
-
.notice
|
36
|
+
div.notice
|
37
37
|
background-color: #b2e5b2
|
38
38
|
color: #060
|
39
|
-
.error
|
39
|
+
div.error
|
40
40
|
background-color: #f3c2c2
|
41
41
|
color: #770000
|
42
42
|
|
@@ -66,7 +66,7 @@ img.gravatar
|
|
66
66
|
border: 1px solid white
|
67
67
|
|
68
68
|
form.friendly
|
69
|
-
margin: 0 0
|
69
|
+
margin: 0 0 2em 0
|
70
70
|
p
|
71
71
|
margin: 1em 0 0 0
|
72
72
|
input.login
|
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{radiant-reader-extension}
|
8
|
-
s.version = "1.3.
|
8
|
+
s.version = "1.3.6"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["spanner"]
|
12
|
-
s.date = %q{2011-02-
|
12
|
+
s.date = %q{2011-02-09}
|
13
13
|
s.description = %q{Centralises reader/member/user registration and management tasks for the benefit of other extensions}
|
14
14
|
s.email = %q{will@spanner.org}
|
15
15
|
s.extra_rdoc_files = [
|
data/reader_extension.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: radiant-reader-extension
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 1.3.
|
9
|
+
- 6
|
10
|
+
version: 1.3.6
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- spanner
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-02-
|
18
|
+
date: 2011-02-09 00:00:00 +00:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|