From 08c2bfc25579d7384d8852674cce00ea3bf0a07e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javi=20Mart=C3=ADn?= Date: Wed, 1 Jul 2020 19:01:06 +0200 Subject: [PATCH] Extract component to add/remove admin/mod/manager We remove some duplication by doing so. --- .../roles/table_actions_component.html.erb | 7 +++++ .../admin/roles/table_actions_component.rb | 30 +++++++++++++++++++ app/views/admin/administrators/index.html.erb | 5 +++- .../admin/administrators/search.html.erb | 11 +------ app/views/admin/managers/index.html.erb | 2 +- app/views/admin/managers/search.html.erb | 11 +------ app/views/admin/moderators/index.html.erb | 2 +- app/views/admin/moderators/search.html.erb | 11 +------ .../roles/table_actions_component_spec.rb | 17 +++++++++++ 9 files changed, 63 insertions(+), 33 deletions(-) create mode 100644 app/components/admin/roles/table_actions_component.html.erb create mode 100644 app/components/admin/roles/table_actions_component.rb create mode 100644 spec/components/admin/roles/table_actions_component_spec.rb 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