radiant-reader-extension 3.0.3 → 3.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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
@@ -4,10 +4,19 @@ class Membership < ActiveRecord::Base
4
4
  belongs_to :reader
5
5
 
6
6
  named_scope :for, lambda { |reader|
7
- {
8
- :conditions => ["memberships.reader_id = ?", reader.id]
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
- all_groups.include?(group)
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
- - if Radiant.config['reader.public?']
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
- - column.each do |reader|
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
- - cssclass = reader.has_group?(group) ? "fake_checkbox checked" : "fake_checkbox unchecked"
3
+ - membership = reader.membership_of(group)
4
+ - cssclass = membership ? "fake_checkbox checked" : "fake_checkbox unchecked"
4
5
 
5
- = link_to reader.name, admin_toggle_group_membership_url(:group_id => group.id, :reader_id => reader.id), {:class => cssclass, :id => "toggle_reader_#{reader.id}"}
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}
@@ -0,0 +1,3 @@
1
+ - membership ||= @membership
2
+ - group ||= @group
3
+ = link_to membership.role || t('reader_extension.member'), edit_admin_membership_url(membership, :group_id => group.id), {:class => 'inplace'}
@@ -0,0 +1,5 @@
1
+ - form_for [:admin, @membership], :html => {:class => 'inplace'} do |f|
2
+ = hidden_field_tag :group_id, @membership.group_id
3
+ = f.text_field :role, :maxlength => 100, :class => "minibox"
4
+ = f.check_box :admin
5
+ = f.label :admin
@@ -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, admin_toggle_group_permission_url(:group_id => group.id, :page_id => page.id), {:class => cssclass, :id => "toggle_page_#{page.id}"}
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
- %h2
36
- = t('reader_extension.group_members')
37
- = render :partial => 'readers/list', :locals => {:readers => @readers}
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 "&nbsp;", 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
- - groups = reader.groups.visible_to(current_reader)
3
- - if groups.any?
2
+ - memberships = reader.memberships
3
+ - if memberships.any?
4
4
  %ul.groups
5
- - groups.each do |group|
6
- %li
7
- = link_to_group(group)
8
- = t("reader_extension.member")
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
@@ -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 to %{site}. This page gathers together recent activity, useful links and bits of administration. You can always get back here by clicking on a 'dashboard' link."
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.3'
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 : this.element.href,
16
+ url : self.element.href,
17
17
  method : 'get',
18
- update: this.element.up(),
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: 1
4
+ hash: 15
5
5
  prerelease:
6
6
  segments:
7
7
  - 3
8
8
  - 0
9
- - 3
10
- version: 3.0.3
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.3'\n\n and if you haven't already, remember to enable ActionMailer in your\n project's config/environment.rb.\n "
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: