Extract component to add/remove admin/mod/manager

We remove some duplication by doing so.
This commit is contained in:
Javi Martín
2020-07-01 19:01:06 +02:00
parent 02e27e13dc
commit 08c2bfc255
9 changed files with 63 additions and 33 deletions

View File

@@ -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 %>

View File

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

View File

@@ -29,7 +29,10 @@
<%= administrator.description %>
</td>
<td>
<%= render Admin::TableActionsComponent.new(administrator) %>
<%= render Admin::Roles::TableActionsComponent.new(
administrator,
actions: [:edit, :destroy]
) %>
</td>
</tr>
<% end %>

View File

@@ -18,16 +18,7 @@
<td><%= user.name %></td>
<td><%= user.email %></td>
<td>
<% 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) %>
</td>
</tr>
<% end %>

View File

@@ -22,7 +22,7 @@
<%= manager.email %>
</td>
<td>
<%= render Admin::TableActionsComponent.new(manager, actions: [:destroy]) %>
<%= render Admin::Roles::TableActionsComponent.new(manager) %>
</td>
</tr>
<% end %>

View File

@@ -18,16 +18,7 @@
<td><%= user.name %></td>
<td><%= user.email %></td>
<td>
<% 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) %>
</td>
</tr>
<% end %>

View File

@@ -24,7 +24,7 @@
<%= moderator.email %>
</td>
<td>
<%= render Admin::TableActionsComponent.new(moderator, actions: [:destroy]) %>
<%= render Admin::Roles::TableActionsComponent.new(moderator) %>
</td>
</tr>
<% end %>

View File

@@ -18,16 +18,7 @@
<td><%= user.name %></td>
<td><%= user.email %></td>
<td>
<% 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) %>
</td>
</tr>
<% end %>

View File

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