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.
@@ -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: