simple_teams 0.1.0
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.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +28 -0
- data/Rakefile +8 -0
- data/app/assets/config/simple_teams_manifest.js +1 -0
- data/app/assets/stylesheets/simple_teams/application.css +15 -0
- data/app/controllers/simple_teams/accept_invitations_controller.rb +57 -0
- data/app/controllers/simple_teams/admin/invitations_controller.rb +60 -0
- data/app/controllers/simple_teams/admin/memberships_controller.rb +60 -0
- data/app/controllers/simple_teams/admin/teams_controller.rb +60 -0
- data/app/controllers/simple_teams/application_controller.rb +13 -0
- data/app/controllers/simple_teams/invitations_controller.rb +96 -0
- data/app/controllers/simple_teams/leave_teams_controller.rb +25 -0
- data/app/controllers/simple_teams/memberships_controller.rb +61 -0
- data/app/controllers/simple_teams/related_members_controller.rb +33 -0
- data/app/controllers/simple_teams/teams_controller.rb +19 -0
- data/app/forms/simple_teams/invitation_form.rb +77 -0
- data/app/forms/simple_teams/invitation_forms/create.rb +24 -0
- data/app/forms/simple_teams/invitation_forms/create_bulk.rb +125 -0
- data/app/forms/simple_teams/invitation_forms/create_combo.rb +75 -0
- data/app/forms/simple_teams/invitation_forms/update.rb +29 -0
- data/app/forms/simple_teams/membership_form.rb +91 -0
- data/app/helpers/simple_teams/application_helper.rb +4 -0
- data/app/helpers/simple_teams/invitations_helper.rb +4 -0
- data/app/helpers/simple_teams/memberships_helper.rb +4 -0
- data/app/helpers/simple_teams/teams_helper.rb +4 -0
- data/app/jobs/simple_teams/application_job.rb +4 -0
- data/app/mailers/simple_teams/application_mailer.rb +6 -0
- data/app/mailers/simple_teams/mailer.rb +17 -0
- data/app/models/concerns/simple_teams/member_object.rb +22 -0
- data/app/models/concerns/simple_teams/team_object.rb +23 -0
- data/app/models/simple_teams/ability.rb +34 -0
- data/app/models/simple_teams/application_record.rb +5 -0
- data/app/models/simple_teams/invitation.rb +85 -0
- data/app/models/simple_teams/membership.rb +16 -0
- data/app/models/simple_teams/team.rb +23 -0
- data/app/notifications/application_notification.rb +4 -0
- data/app/notifications/simple_teams/bulk_invitations_notification.rb +51 -0
- data/app/notifications/simple_teams/invitation_notification.rb +54 -0
- data/app/notifications/simple_teams/invitations/accepted_notification.rb +13 -0
- data/app/notifications/simple_teams/invitations/created_notification.rb +13 -0
- data/app/notifications/simple_teams/invitations/destroyed_notification.rb +13 -0
- data/app/notifications/simple_teams/invitations/updated_notification.rb +13 -0
- data/app/notifications/simple_teams/membership_notification.rb +58 -0
- data/app/notifications/simple_teams/memberships/destroyed_notification.rb +13 -0
- data/app/notifications/simple_teams/memberships/left_notification.rb +17 -0
- data/app/notifications/simple_teams/memberships/updated_notification.rb +17 -0
- data/app/service_objects/simple_teams/accept_invitation_service.rb +61 -0
- data/app/service_objects/simple_teams/initialize_team_service.rb +25 -0
- data/app/service_objects/simple_teams/leave_team_service.rb +56 -0
- data/app/views/layouts/simple_teams/application.html.erb +20 -0
- data/app/views/simple_teams/_roles_field.html.erb +22 -0
- data/app/views/simple_teams/accept_invitations/invalid_token.html.erb +7 -0
- data/app/views/simple_teams/accept_invitations/new.html.erb +18 -0
- data/app/views/simple_teams/admin/invitations/_form.html.erb +62 -0
- data/app/views/simple_teams/admin/invitations/_invitation.html.erb +47 -0
- data/app/views/simple_teams/admin/invitations/edit.html.erb +10 -0
- data/app/views/simple_teams/admin/invitations/index.html.erb +14 -0
- data/app/views/simple_teams/admin/invitations/new.html.erb +9 -0
- data/app/views/simple_teams/admin/invitations/show.html.erb +10 -0
- data/app/views/simple_teams/admin/memberships/_form.html.erb +32 -0
- data/app/views/simple_teams/admin/memberships/_membership.html.erb +17 -0
- data/app/views/simple_teams/admin/memberships/edit.html.erb +10 -0
- data/app/views/simple_teams/admin/memberships/index.html.erb +14 -0
- data/app/views/simple_teams/admin/memberships/new.html.erb +9 -0
- data/app/views/simple_teams/admin/memberships/show.html.erb +10 -0
- data/app/views/simple_teams/admin/teams/_form.html.erb +22 -0
- data/app/views/simple_teams/admin/teams/_team.html.erb +7 -0
- data/app/views/simple_teams/admin/teams/edit.html.erb +10 -0
- data/app/views/simple_teams/admin/teams/index.html.erb +14 -0
- data/app/views/simple_teams/admin/teams/new.html.erb +9 -0
- data/app/views/simple_teams/admin/teams/show.html.erb +10 -0
- data/app/views/simple_teams/invitations/_bulk_form.html.erb +63 -0
- data/app/views/simple_teams/invitations/_form.html.erb +15 -0
- data/app/views/simple_teams/invitations/_invitation.html.erb +19 -0
- data/app/views/simple_teams/invitations/_invitation.json.jbuilder +2 -0
- data/app/views/simple_teams/invitations/edit.html.erb +12 -0
- data/app/views/simple_teams/invitations/new.html.erb +12 -0
- data/app/views/simple_teams/leave_teams/edit.html.erb +2 -0
- data/app/views/simple_teams/memberships/_form.html.erb +12 -0
- data/app/views/simple_teams/memberships/_membership.html.erb +23 -0
- data/app/views/simple_teams/memberships/edit.html.erb +12 -0
- data/app/views/simple_teams/related_members/index.json.jbuilder +5 -0
- data/app/views/simple_teams/related_members/select2.json.jbuilder +6 -0
- data/app/views/simple_teams/teams/_add_member_link.html.erb +3 -0
- data/app/views/simple_teams/teams/_members_table.html.erb +20 -0
- data/app/views/simple_teams/teams/show.html.erb +38 -0
- data/app/views/simple_teams/teams_mailer/invitation_notification.html.erb +9 -0
- data/config/locales/simple_teams.en.yml +18 -0
- data/config/routes.rb +21 -0
- data/db/migrate/20240311052758_create_simple_teams_teams.rb +9 -0
- data/db/migrate/20240311053006_create_simple_teams_memberships.rb +11 -0
- data/db/migrate/20240311053607_create_simple_teams_invitations.rb +17 -0
- data/lib/simple_teams/engine.rb +22 -0
- data/lib/simple_teams/version.rb +3 -0
- data/lib/simple_teams.rb +6 -0
- data/lib/tasks/simple_teams_tasks.rake +4 -0
- metadata +160 -0
@@ -0,0 +1,10 @@
|
|
1
|
+
<p style="color: green"><%= notice %></p>
|
2
|
+
|
3
|
+
<%= render @membership %>
|
4
|
+
|
5
|
+
<div>
|
6
|
+
<%= link_to "Edit this membership", edit_membership_path(@membership) %> |
|
7
|
+
<%= link_to "Back to memberships", memberships_path %>
|
8
|
+
|
9
|
+
<%= button_to "Destroy this membership", @membership, method: :delete %>
|
10
|
+
</div>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<%= form_with(model: team) do |form| %>
|
2
|
+
<% if team.errors.any? %>
|
3
|
+
<div style="color: red">
|
4
|
+
<h2><%= pluralize(team.errors.count, "error") %> prohibited this team from being saved:</h2>
|
5
|
+
|
6
|
+
<ul>
|
7
|
+
<% team.errors.each do |error| %>
|
8
|
+
<li><%= error.full_message %></li>
|
9
|
+
<% end %>
|
10
|
+
</ul>
|
11
|
+
</div>
|
12
|
+
<% end %>
|
13
|
+
|
14
|
+
<div>
|
15
|
+
<%= form.label :teamable_id, style: "display: block" %>
|
16
|
+
<%= form.text_field :teamable_id %>
|
17
|
+
</div>
|
18
|
+
|
19
|
+
<div>
|
20
|
+
<%= form.submit %>
|
21
|
+
</div>
|
22
|
+
<% end %>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<p style="color: green"><%= notice %></p>
|
2
|
+
|
3
|
+
<h1>Teams</h1>
|
4
|
+
|
5
|
+
<div id="teams">
|
6
|
+
<% @teams.each do |team| %>
|
7
|
+
<%= render team %>
|
8
|
+
<p>
|
9
|
+
<%= link_to "Show this team", team %>
|
10
|
+
</p>
|
11
|
+
<% end %>
|
12
|
+
</div>
|
13
|
+
|
14
|
+
<%= link_to "New team", new_team_path %>
|
@@ -0,0 +1,63 @@
|
|
1
|
+
<%= simple_form_for(@service_object, :url => (%w"new create".include?(params[:action]) ? team_invitations_path(@team) : team_invitation_path(@team, @invitation)), :method => (%w"new create".include?(params[:action]) ? :post : :put) ) do |f| %>
|
2
|
+
<%= f.error_notification %>
|
3
|
+
<%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>
|
4
|
+
|
5
|
+
<div class="form-inputs">
|
6
|
+
<%= f.input :single_vs_multiple,
|
7
|
+
:as => :select,
|
8
|
+
:collection => [:single, :multiple, :accessible],
|
9
|
+
:include_blank => false,
|
10
|
+
:input_html => {
|
11
|
+
"data-togglefields" => "single-vs-multiple"
|
12
|
+
}
|
13
|
+
%>
|
14
|
+
|
15
|
+
<div data-togglefields-name="single-vs-multiple" data-togglefields-values='["single"]'>
|
16
|
+
<%= f.input :email,
|
17
|
+
:placeholder => "e.g. test@example.com",
|
18
|
+
:error => false,
|
19
|
+
:input_html => { "data-teams-invitations-field" => "single" }
|
20
|
+
%>
|
21
|
+
</div>
|
22
|
+
|
23
|
+
<div data-togglefields-name="single-vs-multiple" data-togglefields-values='["multiple"]'>
|
24
|
+
<%= f.input :select2_emails,
|
25
|
+
:as => :select,
|
26
|
+
collection: @service_object.emails,
|
27
|
+
:include_blank => false,
|
28
|
+
:error => false,
|
29
|
+
:input_html => {:multiple => true, "data-teams-invitations-field" => "multiple" }
|
30
|
+
%>
|
31
|
+
</div>
|
32
|
+
|
33
|
+
<div data-togglefields-name="single-vs-multiple" data-togglefields-values='["accessible"]'>
|
34
|
+
<%= f.input :accessible_emails,
|
35
|
+
:error => false,
|
36
|
+
:placeholder => "e.g. test1@example.com, test2@example.com",
|
37
|
+
:input_html => {"data-teams-invitations-field" => "accessible" },
|
38
|
+
:hint => "Enter email addresses separated by comma."
|
39
|
+
%>
|
40
|
+
</div>
|
41
|
+
|
42
|
+
<small class="form-text text-muted">
|
43
|
+
Begin typing to search for members of other projects that you belong to.
|
44
|
+
</small>
|
45
|
+
|
46
|
+
<% [:email, :select2_emails, :accessible_emails].each do |a| %>
|
47
|
+
<% if @service_object.errors[a].present? %>
|
48
|
+
<ul class="invalid-feedback d-block">
|
49
|
+
<% @service_object.errors[a].each do |error| %>
|
50
|
+
<li><%= error %></li>
|
51
|
+
<% end %>
|
52
|
+
</ul>
|
53
|
+
<% end %>
|
54
|
+
<% end %>
|
55
|
+
|
56
|
+
<%= render "simple_teams/roles_field", :f => f, :prefix => "invitation_forms_create_combo" %>
|
57
|
+
</div>
|
58
|
+
|
59
|
+
<div class="form-actions">
|
60
|
+
<%= f.button :submit, :class => "btn-primary" %>
|
61
|
+
<%= link_to "Cancel", team_path(@team), :class => "btn btn-danger" %>
|
62
|
+
</div>
|
63
|
+
<% end %>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<%= simple_form_for(@service_object, :url => (%w"new create".include?(params[:action]) ? team_invitations_path(@team) : team_invitation_path(@team, @invitation)), :method => (%w"new create".include?(params[:action]) ? :post : :put) ) do |f| %>
|
2
|
+
<%= f.error_notification %>
|
3
|
+
<%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>
|
4
|
+
|
5
|
+
<div class="form-inputs">
|
6
|
+
<%= f.input :email %>
|
7
|
+
|
8
|
+
<%= render "simple_teams/roles_field", :f => f, :prefix => "invitation_forms_update" %>
|
9
|
+
</div>
|
10
|
+
|
11
|
+
<div class="form-actions">
|
12
|
+
<%= f.button :submit, :class => "btn-primary" %>
|
13
|
+
<%= link_to "Cancel", team_path(@team), :class => "btn btn-danger" %>
|
14
|
+
</div>
|
15
|
+
<% end %>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<tr id="<%= dom_id invitation %>">
|
2
|
+
<td><%= invitation.email %></td>
|
3
|
+
<td><%= invitation.role.capitalize %></td>
|
4
|
+
<td>Invited</td>
|
5
|
+
<td><%= invitation.created_at.to_date %></td>
|
6
|
+
<td>
|
7
|
+
<% if can? :edit, invitation %>
|
8
|
+
<button class="btn btn-outline-dark btn-sm dropdown-toggle" type="button" id="<%= dom_id invitation %>-dropdown-menu" data-bs-toggle="dropdown" aria-expanded="false">
|
9
|
+
Actions
|
10
|
+
</button>
|
11
|
+
<ul class="dropdown-menu" aria-labelledby="<%= dom_id invitation %>-dropdown-menu">
|
12
|
+
<li><%= button_to "Resend", resend_team_invitation_path(team, invitation), :class => "dropdown-item" %></li>
|
13
|
+
<li class="dropdown-divider"></li>
|
14
|
+
<li><%= link_to "Edit", edit_team_invitation_path(team, invitation), :class => "dropdown-item" %></li>
|
15
|
+
<li><%= button_to "Delete", team_invitation_path(team, invitation), :method => :delete, :class => "btn btn-link dropdown-item", :form => { :data => { "turbo-confirm" => "Are you sure you want to delete this invitation?" } } %></li>
|
16
|
+
</ul>
|
17
|
+
<% end %>
|
18
|
+
</td>
|
19
|
+
</tr>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<div class="centered-content-template">
|
2
|
+
<nav aria-label="breadcrumb">
|
3
|
+
<ol class="breadcrumb">
|
4
|
+
<li class="breadcrumb-item"><a href="<%= team_path(@team) %>"><%= @team.name %></a></li>
|
5
|
+
<li class="breadcrumb-item active" aria-current="page">Update Invitation</li>
|
6
|
+
</ol>
|
7
|
+
</nav>
|
8
|
+
|
9
|
+
<h1>Update Invitation</h1>
|
10
|
+
|
11
|
+
<%= render "form", invitation: @invitation %>
|
12
|
+
</div>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<div class="centered-content-template">
|
2
|
+
<nav aria-label="breadcrumb">
|
3
|
+
<ol class="breadcrumb">
|
4
|
+
<li class="breadcrumb-item"><a href="<%= team_path(@team) %>"><%= @team.name %></a></li>
|
5
|
+
<li class="breadcrumb-item active" aria-current="page">Invite User</li>
|
6
|
+
</ol>
|
7
|
+
</nav>
|
8
|
+
|
9
|
+
<h1>Invite Users</h1>
|
10
|
+
|
11
|
+
<%= render "bulk_form", invitation: @invitation %>
|
12
|
+
</div>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<%= simple_form_for(@service_object, :url => team_membership_path(@team, @membership), :method => :put) do |f| %>
|
2
|
+
<%= f.error_notification %>
|
3
|
+
|
4
|
+
<div class="form-inputs">
|
5
|
+
<%= render "simple_teams/roles_field", :f => f, :prefix => "teams_membership_form" %>
|
6
|
+
</div>
|
7
|
+
|
8
|
+
<div class="form-actions">
|
9
|
+
<%= f.button :submit, :class => "btn-primary" %>
|
10
|
+
<%= link_to "Cancel", team_path(@team), :class => "btn btn-danger" %>
|
11
|
+
</div>
|
12
|
+
<% end %>
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<tr id="<%= dom_id membership %>">
|
2
|
+
<td><%= membership.member.full_name %><%= " (you)" if current_user.membership_for_team(team) == membership %></td>
|
3
|
+
<td><%= membership.role.capitalize %></td>
|
4
|
+
<td>Active</td>
|
5
|
+
<td><%= membership.created_at.to_date %></td>
|
6
|
+
<td>
|
7
|
+
<% unless defined?(hide_controls) and hide_controls %>
|
8
|
+
<% if can? :edit, membership %>
|
9
|
+
<button class="btn btn-outline-dark btn-sm dropdown-toggle" type="button" id="<%= dom_id membership %>-dropdown-menu" data-bs-toggle="dropdown" aria-expanded="false">
|
10
|
+
Actions
|
11
|
+
</button>
|
12
|
+
<ul class="dropdown-menu" aria-labelledby="<%= dom_id membership %>-dropdown-menu">
|
13
|
+
<%= link_to "Edit", edit_team_membership_path(team, membership), :class => "dropdown-item" %>
|
14
|
+
<% if membership == current_user.membership_for_team(team) %>
|
15
|
+
<%= button_to "Delete", team_leave_team_path(@team), :method => :delete, :class => "btn btn-link dropdown-item", :form => { :data => { "turbo-confirm" => "Are you sure you want to leave this #{ @team.teamable.class.model_name.human }? Removing your own membership will remove all access to this #{ @team.teamable.class.model_name.human }." } } %></li>
|
16
|
+
<% else %>
|
17
|
+
<%= button_to "Delete", team_membership_path(team, membership), :method => :delete, :class => "btn btn-link dropdown-item", :form => { :data => { "turbo-confirm" => "Are you sure you want to delete this member?" } } %>
|
18
|
+
<% end %>
|
19
|
+
</ul>
|
20
|
+
<% end %>
|
21
|
+
<% end %>
|
22
|
+
</td>
|
23
|
+
</tr>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<div class="centered-content-template">
|
2
|
+
<nav aria-label="breadcrumb">
|
3
|
+
<ol class="breadcrumb">
|
4
|
+
<li class="breadcrumb-item"><a href="<%= team_path(@team) %>"><%= @team.name %></a></li>
|
5
|
+
<li class="breadcrumb-item active" aria-current="page">Edit Member</li>
|
6
|
+
</ol>
|
7
|
+
</nav>
|
8
|
+
|
9
|
+
<h1>Edit Member: <%= @membership.member.full_name %></h1>
|
10
|
+
|
11
|
+
<%= render "form", membership: @membership %>
|
12
|
+
</div>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<table class="table table-bordered mb-5">
|
2
|
+
<thead>
|
3
|
+
<tr>
|
4
|
+
<th class="col-3">Name</th>
|
5
|
+
<th class="col-3">Role</th>
|
6
|
+
<th class="col-3">Status</th>
|
7
|
+
<th class="col-2">Added</th>
|
8
|
+
<th class="col-1"></th>
|
9
|
+
</tr>
|
10
|
+
</thead>
|
11
|
+
<tbody>
|
12
|
+
<% @memberships_and_invitations.each do |object| %>
|
13
|
+
<% if object.kind_of? SimpleTeams::Membership %>
|
14
|
+
<%= render "simple_teams/memberships/membership", :team => @team, :membership => object %>
|
15
|
+
<% elsif object.kind_of? SimpleTeams::Invitation %>
|
16
|
+
<%= render "simple_teams/invitations/invitation", :team => @team, :invitation => object %>
|
17
|
+
<% end %>
|
18
|
+
<% end %>
|
19
|
+
</tbody>
|
20
|
+
</table>
|
@@ -0,0 +1,38 @@
|
|
1
|
+
<nav aria-label="breadcrumb">
|
2
|
+
<ol class="breadcrumb">
|
3
|
+
<li class="breadcrumb-item"><%= link_to "Teams", teams_path %></li>
|
4
|
+
<li class="breadcrumb-item active" aria-current="page"><%= @team.name %></li>
|
5
|
+
</ol>
|
6
|
+
</nav>
|
7
|
+
|
8
|
+
<div class="heading-with-dropdown-menu">
|
9
|
+
<h1><%= @team.name %></h1>
|
10
|
+
|
11
|
+
<div class="dropdown">
|
12
|
+
<% if can? :update, @team %>
|
13
|
+
<button class="btn btn-outline-dark btn-sm dropdown-toggle" type="button" id="<%= @team.id %>-dropdown-menu" data-bs-toggle="dropdown" aria-expanded="false">
|
14
|
+
Actions
|
15
|
+
</button>
|
16
|
+
<ul class="dropdown-menu" aria-labelledby="<%= @team.id %>-dropdown-menu">
|
17
|
+
<%= link_to "Invite User", new_team_invitation_path(@team), :class => "dropdown-item" %>
|
18
|
+
|
19
|
+
<li><hr class="dropdown-divider"></li>
|
20
|
+
<%= link_to "Edit", edit_team_path(@team), :class => "dropdown-item" %>
|
21
|
+
|
22
|
+
<% if current_user.membership_for_team(@team).present? %>
|
23
|
+
<li><hr class="dropdown-divider"></li>
|
24
|
+
<%= button_to "Leave", team_leave_team_path(@team), :method => :delete, :class => "btn btn-link dropdown-item", :form => { :data => { "turbo-confirm" => "Are you sure you want to leave this #{ @team.teamable.class.model_name.human }?" } } %>
|
25
|
+
<% end %>
|
26
|
+
|
27
|
+
<% if can? :destroy, @team %>
|
28
|
+
<li><hr class="dropdown-divider"></li>
|
29
|
+
<%= button_to "Delete", team_path(@team), :method => :delete, :class => "btn btn-link dropdown-item", :form => { :data => { "turbo-confirm" => "Are you sure you want to delete this #{ @team.teamable.class.model_name.human }?" } } %>
|
30
|
+
<% end %>
|
31
|
+
</ul>
|
32
|
+
<% end %>
|
33
|
+
</div>
|
34
|
+
</div>
|
35
|
+
|
36
|
+
<h2 class="mt-5">Members</h2>
|
37
|
+
|
38
|
+
<%= render "members_table" %>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<% if @invitation.inviter.present? %>
|
2
|
+
<p><%= @invitation.inviter.full_name %> has invited you to the "<%= @name %>" <%= @resource_name %>.</p>
|
3
|
+
<% else %>
|
4
|
+
<p>You have been invited to the "<%= @name %>" <%= @resource_name %>.</p>
|
5
|
+
<% end %>
|
6
|
+
|
7
|
+
<p>Use the link below to view this invitation:</p>
|
8
|
+
|
9
|
+
<p><%= link_to @invitation_url, @invitation_url %></p>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
en:
|
2
|
+
simple_teams:
|
3
|
+
roles:
|
4
|
+
member: "Can view content"
|
5
|
+
administrator: "Can create and delete content, and invite and remove other members"
|
6
|
+
owner: "Same as administrator, but cannot be removed except by another owner"
|
7
|
+
simple_form:
|
8
|
+
labels:
|
9
|
+
invitation_forms_create_combo:
|
10
|
+
single_vs_multiple: "Single or multiple users"
|
11
|
+
select2_emails: "Email addresses"
|
12
|
+
accessible_emails: "Email addresses"
|
13
|
+
options:
|
14
|
+
invitation_forms_create_combo:
|
15
|
+
single_vs_multiple:
|
16
|
+
single: "Single user"
|
17
|
+
multiple: "Multiple users"
|
18
|
+
accessible: "Multiple users (accessible form)"
|
data/config/routes.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
SimpleTeams::Engine.routes.draw do
|
2
|
+
|
3
|
+
# Team Resources
|
4
|
+
resources :teams do
|
5
|
+
resources :memberships, :only => [:edit, :update, :destroy]
|
6
|
+
resources :invitations, :only => [:new, :create, :edit, :update, :destroy] do
|
7
|
+
post "resend", :on => :member
|
8
|
+
end
|
9
|
+
resource :leave_team, :only => [:destroy]
|
10
|
+
end
|
11
|
+
|
12
|
+
# Autocomplete
|
13
|
+
resources :related_members, :only => [:index] do
|
14
|
+
get "select2", :on => :collection
|
15
|
+
end
|
16
|
+
|
17
|
+
# Team Invitations
|
18
|
+
get "accept_team_invitation/:id", :as => "accept_team_invitation", to: "teams/accept_invitations#new"
|
19
|
+
post "accept_team_invitation/:id", to: "teams/accept_invitations#create"
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class CreateSimpleTeamsMemberships < ActiveRecord::Migration[7.0]
|
2
|
+
def change
|
3
|
+
create_table :simple_teams_memberships do |t|
|
4
|
+
t.references :team, null: false, foreign_key: { to_table: :simple_teams_teams }
|
5
|
+
t.references :member, null: false, foreign_key: { to_table: :users }
|
6
|
+
t.integer :role, null: false, default: 0
|
7
|
+
|
8
|
+
t.timestamps
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class CreateSimpleTeamsInvitations < ActiveRecord::Migration[7.0]
|
2
|
+
def change
|
3
|
+
create_table :simple_teams_invitations do |t|
|
4
|
+
t.references :team, null: false, foreign_key: { to_table: :simple_teams_teams }
|
5
|
+
t.references :inviter, null: false, foreign_key: { to_table: :users }
|
6
|
+
t.references :membership, foreign_key: { to_table: :simple_teams_memberships }
|
7
|
+
t.string :email, null: false
|
8
|
+
t.integer :role, null: false, default: 0
|
9
|
+
t.string :token, null: false
|
10
|
+
t.integer :status, default: 0
|
11
|
+
t.datetime :sent_at
|
12
|
+
t.datetime :expires_at
|
13
|
+
|
14
|
+
t.timestamps
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module SimpleTeams
|
2
|
+
class Engine < ::Rails::Engine
|
3
|
+
isolate_namespace SimpleTeams
|
4
|
+
end
|
5
|
+
|
6
|
+
mattr_accessor :member_class
|
7
|
+
mattr_accessor :parent_controller
|
8
|
+
mattr_accessor :layout
|
9
|
+
|
10
|
+
def self.member_class
|
11
|
+
(@@member_class || "User").constantize
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.parent_controller
|
15
|
+
(@@parent_controller || "ApplicationController").constantize
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.layout
|
19
|
+
(@@layout || "simple_teams/application")
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
data/lib/simple_teams.rb
ADDED