Browse Source

Invitations, promotions, demotions

Maarten van den Berg 8 years ago
parent
commit
8236833df7

+ 63 - 6
app/controllers/members_controller.rb

@@ -1,16 +1,16 @@
1 1
 class MembersController < ApplicationController
2 2
   include GroupsHelper
3 3
   before_action :set_group
4
-  before_action :set_member, only: [:show, :edit, :update, :destroy]
5
-  before_action :require_leader!
4
+  before_action :set_member, only: [:show, :edit, :update, :destroy, :promote, :demote]
5
+  before_action :require_leader!, except: [ :index ]
6 6
 
7 7
   # GET /members
8 8
   # GET /members.json
9 9
   def index
10
+    @admin = @group.is_leader?(current_person)
10 11
     @members = @group.members
11 12
       .joins(:person)
12
-      .order(is_leader: :desc)
13
-      .order('people.first_name ASC')
13
+      .order('members.is_leader DESC, people.first_name ASC')
14 14
   end
15 15
 
16 16
   # GET /members/1
@@ -24,6 +24,56 @@ class MembersController < ApplicationController
24 24
     @possible_members = Person.where.not(id: @group.person_ids)
25 25
   end
26 26
 
27
+  def invite
28
+    @person = Person.new
29
+  end
30
+
31
+  def promote
32
+    @member.update_attribute(:is_leader, true)
33
+    flash_message(:success, "#{@member.person.full_name} is now a group leader.")
34
+    redirect_to group_members_path(@group)
35
+  end
36
+
37
+  def demote
38
+    @member.update_attribute(:is_leader, false)
39
+    flash_message(:success, "#{@member.person.full_name} is no longer a group leader.")
40
+    redirect_to group_members_path(@group)
41
+  end
42
+
43
+  def process_invite
44
+    @person = Person.find_by(email: params[:person][:email])
45
+    if not @person
46
+      @person = Person.new(invite_params)
47
+
48
+
49
+      if not @person.save
50
+        respond_to do |format|
51
+          format.html { render 'invite' }
52
+          format.json { render json: @person.errors, status: :unprocessable_entity }
53
+        end
54
+        return
55
+      end
56
+    end
57
+
58
+    new_rec = @member.new_record?
59
+    @member = Member.new(person: @person, group: @group, is_leader: false)
60
+    @member.save!
61
+
62
+
63
+    respond_to do |format|
64
+      format.html do
65
+        invited = "invited to Aardbei and " if new_rec else ""
66
+        flash_message(
67
+          :success,
68
+          "#{@person.full_name} #{invited}added to group."
69
+        )
70
+        redirect_to group_members_path(@group)
71
+      end
72
+
73
+      format.json { render :show, status: :created, location: @person }
74
+    end
75
+  end
76
+
27 77
   # GET /members/1/edit
28 78
   def edit
29 79
     @possible_members = Person.where.not(id: @group.person_ids)
@@ -39,7 +89,7 @@ class MembersController < ApplicationController
39 89
       if @member.save
40 90
         format.html {
41 91
           redirect_to group_member_url(@group, @member)
42
-          flash_message(:info, 'Member was successfully created.')
92
+          flash_message(:info, "#{@member.full_name} was added successfully.")
43 93
         }
44 94
         format.json { render :show, status: :created, location: @member }
45 95
       else
@@ -75,7 +125,7 @@ class MembersController < ApplicationController
75 125
     respond_to do |format|
76 126
       format.html {
77 127
         redirect_to group_members_url(@group)
78
-        flash_message(:info, 'Member was successfully destroyed.')
128
+        flash_message(:info, "#{@member.person.full_name} was successfully removed.")
79 129
       }
80 130
       format.json { head :no_content }
81 131
     end
@@ -95,4 +145,11 @@ class MembersController < ApplicationController
95 145
     def member_params
96 146
       params.require(:member).permit(:person_id, :is_leader)
97 147
     end
148
+
149
+    # Never trust parameters from the scary internet, only allow the white list
150
+    # through.  Note: differs from the ones in PeopleController because
151
+    # creating admins is not allowed.
152
+    def invite_params
153
+      params.require(:person).permit(:first_name, :infix, :last_name, :email, :birth_date)
154
+    end
98 155
 end

+ 1 - 1
app/models/group.rb

@@ -35,6 +35,6 @@ class Group < ApplicationRecord
35 35
       person: person,
36 36
       group: self,
37 37
       is_leader: true
38
-    )
38
+    ) || person.is_admin?
39 39
   end
40 40
 end

+ 23 - 4
app/views/members/index.html.erb

@@ -1,10 +1,12 @@
1
-<h1>Members</h1>
1
+<h1>Members of <%= @group.name %></h1>
2 2
 
3 3
 <table class="table table-striped">
4 4
   <thead>
5 5
     <tr>
6 6
       <th>Name</th>
7
-      <th>Remove</th>
7
+      <% if @admin %>
8
+        <th colspan="2">Actions</th>
9
+      <% end %>
8 10
     </tr>
9 11
   </thead>
10 12
 
@@ -17,7 +19,23 @@
17 19
             (<i class="fa fa-angle-up"></i>)
18 20
           <% end %>
19 21
         </td>
20
-        <td><%= link_to 'Remove', group_member_path(@group, member), method: :delete, data: { confirm: 'Are you sure?' } %></td>
22
+
23
+        <% if @admin and current_person != member.person %>
24
+            <% if member.is_leader %>
25
+              <td>
26
+                <%= link_to 'Demote', demote_group_member_path(@group, member), method: :post, data: { confirm: 'Are you sure?' } %>
27
+              </td>
28
+            <% else %>
29
+              <td>
30
+                <%= link_to 'Promote', promote_group_member_path(@group, member), method: :post, data: { confirm: 'Are you sure?' } %>
31
+              </td>
32
+            <% end %>
33
+            <td>
34
+              <%= link_to 'Remove', group_member_path(@group, member), method: :delete, data: { confirm: 'Are you sure?' } %>
35
+            </td>
36
+          <% else %>
37
+            <td></td><td></td>
38
+        <% end %>
21 39
       </tr>
22 40
     <% end %>
23 41
   </tbody>
@@ -25,4 +43,5 @@
25 43
 
26 44
 <br>
27 45
 
28
-<%= link_to 'New Member', new_group_member_path(@group) %>
46
+<%= link_to 'New Member', new_group_member_path(@group) %> |
47
+<%= link_to 'Invite Member', group_invite_path(@group) %>

+ 5 - 0
app/views/members/invite.html.haml

@@ -0,0 +1,5 @@
1
+%h1
2
+  Invite new person to Aardbei
3
+
4
+= render 'people/form', person: @person, no_admin: true, destination: 'invite'
5
+= link_to 'Back', group_members_path(@group)

+ 8 - 5
app/views/people/_form.html.erb

@@ -1,4 +1,5 @@
1
-<%= form_for(person) do |f| %>
1
+<% destination = 'new' if not defined? destination %>
2
+<%= form_for(person, url: {action: destination}) do |f| %>
2 3
   <% if person.errors.any? %>
3 4
     <div id="error_explanation">
4 5
       <h2><%= pluralize(person.errors.count, "error") %> prohibited this person from being saved:</h2>
@@ -28,10 +29,12 @@
28 29
       <%= f.label :birth_date %>
29 30
       <%= f.date_field :birth_date, type: 'date', class: 'form-control' %>
30 31
     </div>
31
-    <div class="form-group">
32
-      <%= f.check_box :is_admin %>
33
-      <%= f.label :is_admin %>
34
-    </div>
32
+    <% if not defined? no_admin %>
33
+      <div class="form-group">
34
+        <%= f.check_box :is_admin %>
35
+        <%= f.label :is_admin %>
36
+      </div>
37
+    <% end %>
35 38
     <%= f.submit %>
36 39
   </div>
37 40
 <% end %>

+ 8 - 1
config/routes.rb

@@ -24,7 +24,14 @@ Rails.application.routes.draw do
24 24
   resources :people
25 25
 
26 26
   resources :groups do
27
-    resources :members
27
+    get 'invite', to: 'members#invite'
28
+    post 'invite', to: 'members#process_invite'
29
+
30
+    resources :members do
31
+      post 'promote', to: 'members#promote', on: :member
32
+      post 'demote', to: 'members#demote', on: :member
33
+    end
34
+
28 35
     resources :activities do
29 36
       put 'presence', to: 'activities#presence', on: :member
30 37
       patch 'presence', to: 'activities#presence', on: :member