diff --git a/app/components/admin/roles/table_actions_component.html.erb b/app/components/admin/roles/table_actions_component.html.erb
new file mode 100644
index 000000000..0531450cc
--- /dev/null
+++ b/app/components/admin/roles/table_actions_component.html.erb
@@ -0,0 +1,7 @@
+<% if already_has_role? %>
+ <%= render Admin::TableActionsComponent.new(record, actions: actions) %>
+<% else %>
+ <%= render Admin::TableActionsComponent.new(actions: []) do %>
+ <%= link_to add_user_text, add_user_path, method: :post, class: "button success expanded" %>
+ <% end %>
+<% end %>
diff --git a/app/components/admin/roles/table_actions_component.rb b/app/components/admin/roles/table_actions_component.rb
new file mode 100644
index 000000000..57d19f169
--- /dev/null
+++ b/app/components/admin/roles/table_actions_component.rb
@@ -0,0 +1,30 @@
+class Admin::Roles::TableActionsComponent < ApplicationComponent
+ attr_reader :record, :actions
+
+ def initialize(record, actions: [:destroy])
+ @record = record
+ @actions = actions
+ end
+
+ private
+
+ def role
+ record.class.name.tableize
+ end
+
+ def already_has_role?
+ record.persisted?
+ end
+
+ def add_user_text
+ t("admin.#{role}.#{role.singularize}.add")
+ end
+
+ def add_user_path
+ {
+ controller: "admin/#{role}",
+ action: :create,
+ user_id: record.user
+ }
+ end
+end
diff --git a/app/views/admin/administrators/index.html.erb b/app/views/admin/administrators/index.html.erb
index 4c5620b3a..90dc07e5d 100644
--- a/app/views/admin/administrators/index.html.erb
+++ b/app/views/admin/administrators/index.html.erb
@@ -29,7 +29,10 @@
<%= administrator.description %>
- <%= render Admin::TableActionsComponent.new(administrator) %>
+ <%= render Admin::Roles::TableActionsComponent.new(
+ administrator,
+ actions: [:edit, :destroy]
+ ) %>
|
<% end %>
diff --git a/app/views/admin/administrators/search.html.erb b/app/views/admin/administrators/search.html.erb
index 03591a1ce..d5ccddf38 100644
--- a/app/views/admin/administrators/search.html.erb
+++ b/app/views/admin/administrators/search.html.erb
@@ -18,16 +18,7 @@
<%= user.name %> |
<%= user.email %> |
- <% if user.administrator? && user.administrator.persisted? %>
- <%= render Admin::TableActionsComponent.new(user.administrator, actions: [:destroy]) %>
- <% else %>
- <%= link_to t("admin.administrators.administrator.add"),
- { controller: "admin/administrators",
- action: :create,
- user_id: user },
- method: :post,
- class: "button success expanded" %>
- <% end %>
+ <%= render Admin::Roles::TableActionsComponent.new(user.administrator || user.build_administrator) %>
|
<% end %>
diff --git a/app/views/admin/managers/index.html.erb b/app/views/admin/managers/index.html.erb
index 62ca1f189..86cfa88bc 100644
--- a/app/views/admin/managers/index.html.erb
+++ b/app/views/admin/managers/index.html.erb
@@ -22,7 +22,7 @@
<%= manager.email %>
- <%= render Admin::TableActionsComponent.new(manager, actions: [:destroy]) %>
+ <%= render Admin::Roles::TableActionsComponent.new(manager) %>
|
<% end %>
diff --git a/app/views/admin/managers/search.html.erb b/app/views/admin/managers/search.html.erb
index a834a9d80..442fe3194 100644
--- a/app/views/admin/managers/search.html.erb
+++ b/app/views/admin/managers/search.html.erb
@@ -18,16 +18,7 @@
<%= user.name %> |
<%= user.email %> |
- <% if user.manager? && user.manager.persisted? %>
- <%= render Admin::TableActionsComponent.new(user.manager, actions: [:destroy]) %>
- <% else %>
- <%= link_to t("admin.managers.manager.add"),
- { controller: "admin/managers",
- action: :create,
- user_id: user },
- method: :post,
- class: "button success expanded" %>
- <% end %>
+ <%= render Admin::Roles::TableActionsComponent.new(user.manager || user.build_manager) %>
|
<% end %>
diff --git a/app/views/admin/moderators/index.html.erb b/app/views/admin/moderators/index.html.erb
index 1c60e1d6d..beb22577c 100644
--- a/app/views/admin/moderators/index.html.erb
+++ b/app/views/admin/moderators/index.html.erb
@@ -24,7 +24,7 @@
<%= moderator.email %>
- <%= render Admin::TableActionsComponent.new(moderator, actions: [:destroy]) %>
+ <%= render Admin::Roles::TableActionsComponent.new(moderator) %>
|
<% end %>
diff --git a/app/views/admin/moderators/search.html.erb b/app/views/admin/moderators/search.html.erb
index 3cda8819e..d3b1d69d1 100644
--- a/app/views/admin/moderators/search.html.erb
+++ b/app/views/admin/moderators/search.html.erb
@@ -18,16 +18,7 @@
<%= user.name %> |
<%= user.email %> |
- <% if user.moderator? && user.moderator.persisted? %>
- <%= render Admin::TableActionsComponent.new(user.moderator, actions: [:destroy]) %>
- <% else %>
- <%= link_to t("admin.moderators.moderator.add"),
- { controller: "admin/moderators",
- action: :create,
- user_id: user },
- method: :post,
- class: "button success expanded" %>
- <% end %>
+ <%= render Admin::Roles::TableActionsComponent.new(user.moderator || user.build_moderator) %>
|
<% end %>
diff --git a/spec/components/admin/roles/table_actions_component_spec.rb b/spec/components/admin/roles/table_actions_component_spec.rb
new file mode 100644
index 000000000..42382cf8b
--- /dev/null
+++ b/spec/components/admin/roles/table_actions_component_spec.rb
@@ -0,0 +1,17 @@
+require "rails_helper"
+
+describe Admin::Roles::TableActionsComponent, type: :component do
+ let(:user) { create(:user) }
+
+ it "renders link to add the role for new records" do
+ render_inline Admin::Roles::TableActionsComponent.new(user.build_manager)
+
+ expect(page).to have_css "a[data-method='post']", text: "Add"
+ end
+
+ it "renders link to remove the role for existing records" do
+ render_inline Admin::Roles::TableActionsComponent.new(create(:manager, user: user))
+
+ expect(page).to have_css "a[data-method='delete']", text: "Delete"
+ end
+end