radiant-reader-extension 3.0.3 → 3.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/app/controllers/admin/memberships_controller.rb +16 -0
- data/app/models/membership.rb +12 -3
- data/app/models/reader.rb +5 -1
- data/app/views/accounts/edit_profile.html.haml +1 -6
- data/app/views/admin/groups/show.html.haml +2 -6
- data/app/views/admin/memberships/_reader.html.haml +6 -2
- data/app/views/admin/memberships/_role.html.haml +3 -0
- data/app/views/admin/memberships/_role_form.html.haml +5 -0
- data/app/views/admin/permissions/_page.html.haml +1 -1
- data/app/views/groups/show.html.haml +6 -3
- data/app/views/memberships/_membership.html.haml +36 -0
- data/app/views/readers/_list.html.haml +0 -10
- data/app/views/readers/_memberships.html.haml +9 -6
- data/config/locales/en.yml +4 -1
- data/config/routes.rb +6 -6
- data/db/migrate/20110908194602_membership_attributes.rb +11 -0
- data/lib/radiant-reader-extension.rb +1 -1
- data/public/javascripts/admin/reader.js +22 -3
- data/public/stylesheets/sass/admin/reader_group.sass +29 -1
- metadata +8 -4
@@ -38,6 +38,22 @@ class Admin::MembershipsController < ApplicationController
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
+
def edit
|
42
|
+
@membership = @group.memberships.find(params[:id])
|
43
|
+
respond_to do |format|
|
44
|
+
format.js { render :partial => 'admin/memberships/role_form' }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def update
|
49
|
+
@membership = @group.memberships.find(params[:id])
|
50
|
+
@membership.update_attributes(params[:membership])
|
51
|
+
@membership.save!
|
52
|
+
respond_to do |format|
|
53
|
+
format.js { render :partial => 'admin/memberships/role' }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
41
57
|
protected
|
42
58
|
|
43
59
|
def find_reader_and_group
|
data/app/models/membership.rb
CHANGED
@@ -4,10 +4,19 @@ class Membership < ActiveRecord::Base
|
|
4
4
|
belongs_to :reader
|
5
5
|
|
6
6
|
named_scope :for, lambda { |reader|
|
7
|
-
{
|
8
|
-
|
7
|
+
{ :conditions => ["memberships.reader_id = ?", reader.id] }
|
8
|
+
}
|
9
|
+
|
10
|
+
named_scope :of, lambda { |group|
|
11
|
+
{ :conditions => ["memberships.group_id = ?", group.id] }
|
12
|
+
}
|
13
|
+
|
14
|
+
named_scope :by_reader_name, lambda {
|
15
|
+
{
|
16
|
+
:joins => "INNER JOIN readers on memberships.reader_id = readers.id",
|
17
|
+
:group => "readers.id",
|
18
|
+
:order => "readers.name ASC"
|
9
19
|
}
|
10
20
|
}
|
11
21
|
|
12
22
|
end
|
13
|
-
|
data/app/models/reader.rb
CHANGED
@@ -135,8 +135,12 @@ class Reader < ActiveRecord::Base
|
|
135
135
|
(grouplist & all_groups).any?
|
136
136
|
end
|
137
137
|
|
138
|
+
def membership_of(group)
|
139
|
+
memberships.of(group).first
|
140
|
+
end
|
141
|
+
|
138
142
|
def has_group? (group)
|
139
|
-
|
143
|
+
!!membership_of(group)
|
140
144
|
end
|
141
145
|
alias :is_in? :has_group?
|
142
146
|
|
@@ -2,12 +2,7 @@
|
|
2
2
|
%p
|
3
3
|
= t("reader_extension.hello").titlecase
|
4
4
|
= link_to(@reader.name, reader_url(@reader)) + '.'
|
5
|
-
|
6
|
-
= t('reader_extension.profile_intro_public')
|
7
|
-
- elsif Radiant.config['reader.confine_to_groups?']
|
8
|
-
= t('reader_extension.profile_intro_grouped')
|
9
|
-
- else
|
10
|
-
= t('reader_extension.profile_intro_private')
|
5
|
+
= t("reader_extension.profile_intro_#{Radiant.config['reader.directory_visibility']}")
|
11
6
|
|
12
7
|
- content_for :breadcrumbs do
|
13
8
|
= link_to t('reader_extension.home').titlecase, '/'
|
@@ -50,15 +50,11 @@
|
|
50
50
|
= link_to image('plus') + ' ' + t('reader_extension.add_members'), new_admin_group_group_invitation_url(@group), :class => 'action'
|
51
51
|
%h3
|
52
52
|
=t('reader_extension.group_members').titlecase
|
53
|
-
- readers = Reader.find(:all)
|
54
|
-
- total = readers.count
|
55
|
-
- column_length = (readers.count-1) / 2
|
56
|
-
- columns = [readers[0..column_length], readers[column_length+1..readers.count]]
|
57
|
-
- columns.each do |column|
|
58
53
|
%ul.column
|
59
|
-
-
|
54
|
+
- Reader.all.each do |reader|
|
60
55
|
%li{:id => "reader_holder_#{reader.id}"}
|
61
56
|
= render :partial => 'admin/memberships/reader', :object => reader
|
57
|
+
|
62
58
|
|
63
59
|
- render_region :footer do |footer|
|
64
60
|
- footer.notes do
|
@@ -1,5 +1,9 @@
|
|
1
1
|
- reader ||= @reader
|
2
2
|
- group ||= @group
|
3
|
-
-
|
3
|
+
- membership = reader.membership_of(group)
|
4
|
+
- cssclass = membership ? "fake_checkbox checked" : "fake_checkbox unchecked"
|
4
5
|
|
5
|
-
= link_to reader.name,
|
6
|
+
= link_to reader.name, toggle_admin_membership_url(:group_id => group.id, :reader_id => reader.id), {:class => cssclass, :id => "toggle_reader_#{reader.id}"}
|
7
|
+
- if membership
|
8
|
+
%span.role
|
9
|
+
= render :partial => 'admin/memberships/role', :locals => {:membership => membership, :group => group}
|
@@ -9,7 +9,7 @@
|
|
9
9
|
- else
|
10
10
|
- cssclass = "fake_checkbox"
|
11
11
|
- cssclass << ' checked' if page.has_group?(group)
|
12
|
-
= link_to page.title,
|
12
|
+
= link_to page.title, toggle_admin_permission_url(:group_id => group.id, :page_id => page.id), {:class => cssclass, :id => "toggle_page_#{page.id}"}
|
13
13
|
|
14
14
|
- if page.children.any?
|
15
15
|
%ul
|
@@ -32,9 +32,12 @@
|
|
32
32
|
= t('reader_extension.subgroups', :name => @group.name)
|
33
33
|
= render :partial => 'groups/group', :collection => @group.children
|
34
34
|
|
35
|
-
|
36
|
-
|
37
|
-
|
35
|
+
- if @group.memberships.any?
|
36
|
+
%h2
|
37
|
+
= t('reader_extension.group_members')
|
38
|
+
%table.readers
|
39
|
+
%tbody
|
40
|
+
= render :partial => 'memberships/membership', :collection => @group.memberships.by_reader_name
|
38
41
|
|
39
42
|
= yield :main
|
40
43
|
|
@@ -0,0 +1,36 @@
|
|
1
|
+
- if membership
|
2
|
+
- group = membership.group
|
3
|
+
- reader = membership.reader
|
4
|
+
- if reader
|
5
|
+
%tr.reader
|
6
|
+
- if reader.unshareable?
|
7
|
+
%td{:colspan => 8}
|
8
|
+
= t("reader_extension.listing_denied")
|
9
|
+
- else
|
10
|
+
%td.gravatar
|
11
|
+
= link_to gravatar_for(reader, {:size => 18}, {:class => 'gravatar'}), reader_url(reader), :title => reader.name
|
12
|
+
%td.name
|
13
|
+
%h3
|
14
|
+
= link_to reader.name, reader_url(reader)
|
15
|
+
%td.role
|
16
|
+
%p
|
17
|
+
%span.role
|
18
|
+
= membership.role
|
19
|
+
%td.email
|
20
|
+
%p
|
21
|
+
= mail_to reader.email, nil, :encode => 'hex', :replace_at => " #{t('reader_extension.at')} "
|
22
|
+
|
23
|
+
- [:phone, :mobile].each do |field|
|
24
|
+
- value = reader.send(field)
|
25
|
+
- unless value.blank?
|
26
|
+
%td{:class => field.to_s}
|
27
|
+
%p
|
28
|
+
= value
|
29
|
+
- else
|
30
|
+
%td.missing
|
31
|
+
%p
|
32
|
+
= t("reader_extension.no_#{field}")
|
33
|
+
|
34
|
+
%td.vcard
|
35
|
+
%p
|
36
|
+
= link_to " ", reader_url(reader, :format => :vcard), :class => 'vcard'
|
@@ -4,16 +4,6 @@
|
|
4
4
|
- if readers.respond_to?(:previous_page) && readers.previous_page
|
5
5
|
= pagination_and_summary_for(readers, t('reader_extension.person'))
|
6
6
|
|
7
|
-
- if @display == 'gallery'
|
8
|
-
- if readers.size > 1
|
9
|
-
- cols = 3
|
10
|
-
- columns = readers.in_groups_of((readers.size / cols), false)
|
11
|
-
- else
|
12
|
-
- columns = [readers]
|
13
|
-
- columns.each do |column|
|
14
|
-
%div.column
|
15
|
-
= render :partial => 'readers/mugshot', :collection => column
|
16
|
-
|
17
7
|
- else
|
18
8
|
%table.readers
|
19
9
|
%tbody
|
@@ -1,8 +1,11 @@
|
|
1
1
|
- reader ||= @reader
|
2
|
-
-
|
3
|
-
- if
|
2
|
+
- memberships = reader.memberships
|
3
|
+
- if memberships.any?
|
4
4
|
%ul.groups
|
5
|
-
-
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
- memberships.each do |membership|
|
6
|
+
- if membership.group.visible_to?(current_reader)
|
7
|
+
%li
|
8
|
+
= link_to_group(membership.group)
|
9
|
+
- if membership.role?
|
10
|
+
%span.role
|
11
|
+
= membership.role
|
data/config/locales/en.yml
CHANGED
@@ -6,6 +6,9 @@ en:
|
|
6
6
|
description: "Description"
|
7
7
|
parent_id: "Subgroup of"
|
8
8
|
homepage_id: "Group home page"
|
9
|
+
membership:
|
10
|
+
role: "Role"
|
11
|
+
admin: "admin?"
|
9
12
|
reader:
|
10
13
|
description: "Biog or remarks"
|
11
14
|
email: "Email address"
|
@@ -140,7 +143,7 @@ en:
|
|
140
143
|
directory: "Directory"
|
141
144
|
edit_profile: "Edit profile"
|
142
145
|
groups: "Your groups"
|
143
|
-
introduction: "Hello %{name}. Welcome back
|
146
|
+
introduction: "Hello %{name}. Welcome back. This page gathers together recent activity, useful links and bits of administration. You can always get back here by clicking on a 'dashboard' link."
|
144
147
|
listing: "Directory listing"
|
145
148
|
messages: "Messages for you"
|
146
149
|
profile: "Your page"
|
data/config/routes.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
ActionController::Routing::Routes.draw do |map|
|
2
|
+
map.namespace :admin do |admin|
|
3
|
+
admin.resources :readers, :except => [:show]
|
4
|
+
end
|
5
|
+
|
2
6
|
map.namespace :admin, :path_prefix => 'admin/readers' do |admin|
|
3
7
|
admin.resources :messages, :member => [:preview, :deliver]
|
4
8
|
admin.resources :groups, :has_many => [:memberships, :permissions, :group_invitations, :messages]
|
9
|
+
admin.resources :memberships, :only => [:edit, :update], :member => [:toggle]
|
10
|
+
admin.resources :permissions, :only => [], :member => [:toggle]
|
5
11
|
admin.resource :reader_configuration, :controller => 'reader_configuration'
|
6
|
-
admin.toggle_group_membership "memberships/toggle", :controller => 'memberships', :action => 'toggle'
|
7
|
-
admin.toggle_group_permission "permissions/toggle", :controller => 'permissions', :action => 'toggle'
|
8
|
-
end
|
9
|
-
|
10
|
-
map.namespace :admin do |admin|
|
11
|
-
admin.resources :readers, :except => [:show]
|
12
12
|
end
|
13
13
|
|
14
14
|
readers_prefix = Radiant.config['reader.profiles_path'] || "directory"
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class MembershipAttributes < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
add_column :memberships, :role, :string
|
4
|
+
add_column :memberships, :admin, :boolean
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.down
|
8
|
+
remove_column :memberships, :role
|
9
|
+
remove_column :memberships, :admin
|
10
|
+
end
|
11
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module RadiantReaderExtension
|
2
|
-
VERSION = '3.0.
|
2
|
+
VERSION = '3.0.4'
|
3
3
|
SUMMARY = %q{Reader/viewer/visitor registration, login and access-control for Radiant CMS}
|
4
4
|
DESCRIPTION = %q{Provides reader/member/user registration and management functions including password-reminder, group-based page access control and administrative email.}
|
5
5
|
URL = "http://radiant.spanner.org/reader"
|
@@ -13,9 +13,26 @@ Remote.UpdatingLink = Behavior.create(Remote.Base, {
|
|
13
13
|
onclick : function() {
|
14
14
|
var self = this;
|
15
15
|
var options = Object.extend({
|
16
|
-
url :
|
16
|
+
url : self.element.href,
|
17
17
|
method : 'get',
|
18
|
-
update:
|
18
|
+
update: self.element.up(),
|
19
|
+
onLoading: function () { self.element.addClassName('waiting'); },
|
20
|
+
onComplete: function () { self.element.removeClassName('waiting'); },
|
21
|
+
onSuccess: function () { Event.addBehavior.reload(); },
|
22
|
+
onFailure: function () { self.element.addClassName('failed'); }
|
23
|
+
}, self.options);
|
24
|
+
return self._makeRequest(options);
|
25
|
+
}
|
26
|
+
});
|
27
|
+
|
28
|
+
Remote.UpdatingForm = Behavior.create(Remote.Base, {
|
29
|
+
onsubmit : function() {
|
30
|
+
var self = this;
|
31
|
+
var options = Object.extend({
|
32
|
+
url : self.element.action,
|
33
|
+
method : self.element.method || 'get',
|
34
|
+
parameters : self.element.serialize(),
|
35
|
+
update: self.element.up(),
|
19
36
|
onLoading: function () { self.element.addClassName('waiting'); },
|
20
37
|
onComplete: function () { self.element.removeClassName('waiting'); },
|
21
38
|
onSuccess: function () { Event.addBehavior.reload(); },
|
@@ -28,5 +45,7 @@ Remote.UpdatingLink = Behavior.create(Remote.Base, {
|
|
28
45
|
Event.addBehavior({
|
29
46
|
'div.radio_group': Toggle.RadioGroupBehavior(),
|
30
47
|
'input.select_all': Toggle.SelectAllBehavior(),
|
31
|
-
'a.fake_checkbox': Remote.UpdatingLink()
|
48
|
+
'a.fake_checkbox': Remote.UpdatingLink(),
|
49
|
+
'a.inplace': Remote.UpdatingLink(),
|
50
|
+
'form.inplace': Remote.UpdatingForm()
|
32
51
|
});
|
@@ -91,15 +91,42 @@
|
|
91
91
|
|
92
92
|
#group_pages ul
|
93
93
|
padding-left: 20px
|
94
|
+
li
|
95
|
+
clear: left
|
94
96
|
|
95
97
|
#group_people ul
|
96
98
|
padding-left: 0
|
97
99
|
li
|
100
|
+
clear: left
|
98
101
|
font-size: 16px
|
102
|
+
line-height: 1.6
|
99
103
|
list-style: none
|
100
|
-
line-height: 24px
|
101
104
|
margin-top: 2px
|
102
105
|
font-family: 'Lucida Grande'
|
106
|
+
.role
|
107
|
+
display: block
|
108
|
+
float: left
|
109
|
+
font-weight: normal
|
110
|
+
margin-left: 0.5em
|
111
|
+
a
|
112
|
+
color: #999
|
113
|
+
text-decoration: none
|
114
|
+
background-repeat: no-repeat
|
115
|
+
background-position: 0 3px
|
116
|
+
font-size: 60%
|
117
|
+
vertical-align: text-bottom
|
118
|
+
&.waiting
|
119
|
+
color: #8c8d8e
|
120
|
+
padding-left: 20px
|
121
|
+
background-image: url(/images/admin/spinner.gif)
|
122
|
+
form
|
123
|
+
font-size: 60%
|
124
|
+
input.minibox
|
125
|
+
width: 60px
|
126
|
+
color: #666
|
127
|
+
input, label
|
128
|
+
float: left
|
129
|
+
vertical-align: text-bottom
|
103
130
|
|
104
131
|
#group_pages ul li
|
105
132
|
font-size: 16px
|
@@ -125,6 +152,7 @@
|
|
125
152
|
|
126
153
|
.fake_checkbox
|
127
154
|
display: block
|
155
|
+
float: left
|
128
156
|
padding-left: 20px
|
129
157
|
cursor: pointer
|
130
158
|
background-repeat: no-repeat
|
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: 15
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 3
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 3.0.
|
9
|
+
- 4
|
10
|
+
version: 3.0.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- William Ross
|
@@ -208,6 +208,8 @@ files:
|
|
208
208
|
- app/views/admin/groups/remove.html.haml
|
209
209
|
- app/views/admin/groups/show.html.haml
|
210
210
|
- app/views/admin/memberships/_reader.html.haml
|
211
|
+
- app/views/admin/memberships/_role.html.haml
|
212
|
+
- app/views/admin/memberships/_role_form.html.haml
|
211
213
|
- app/views/admin/messages/_form.html.haml
|
212
214
|
- app/views/admin/messages/_help.html.haml
|
213
215
|
- app/views/admin/messages/_list_function.haml
|
@@ -240,6 +242,7 @@ files:
|
|
240
242
|
- app/views/groups/_group.html.haml
|
241
243
|
- app/views/groups/index.html.haml
|
242
244
|
- app/views/groups/show.html.haml
|
245
|
+
- app/views/memberships/_membership.html.haml
|
243
246
|
- app/views/messages/preview.html.haml
|
244
247
|
- app/views/messages/show.html.haml
|
245
248
|
- app/views/password_resets/create.html.haml
|
@@ -295,6 +298,7 @@ files:
|
|
295
298
|
- db/migrate/20110812111934_groups_nested_set.rb
|
296
299
|
- db/migrate/20110814070858_message_has_many_groups.rb
|
297
300
|
- db/migrate/20110905194602_group_ancestry.rb
|
301
|
+
- db/migrate/20110908194602_membership_attributes.rb
|
298
302
|
- lib/controller_extensions.rb
|
299
303
|
- lib/group_tags.rb
|
300
304
|
- lib/grouped_model.rb
|
@@ -349,7 +353,7 @@ has_rdoc: true
|
|
349
353
|
homepage: http://radiant.spanner.org/reader
|
350
354
|
licenses: []
|
351
355
|
|
352
|
-
post_install_message: "\n Add this to your radiant project with:\n\n config.gem 'radiant-reader-extension', :version => '~> 3.0.
|
356
|
+
post_install_message: "\n Add this to your radiant project with:\n\n config.gem 'radiant-reader-extension', :version => '~> 3.0.4'\n\n and if you haven't already, remember to enable ActionMailer in your\n project's config/environment.rb.\n "
|
353
357
|
rdoc_options: []
|
354
358
|
|
355
359
|
require_paths:
|