diff --git a/app/views/officing/_menu.html.erb b/app/components/officing/menu_component.html.erb
similarity index 94%
rename from app/views/officing/_menu.html.erb
rename to app/components/officing/menu_component.html.erb
index 71c65b884..23b91e04f 100644
--- a/app/views/officing/_menu.html.erb
+++ b/app/components/officing/menu_component.html.erb
@@ -3,7 +3,7 @@
<% if vote_collection_shift? %>
<%= " is-active" if controller_name == "voters" %>
- <%= " is-hidden" if controller_name == "voters" && Poll.votable_by(@user).any? %>">
+ <%= " is-hidden" if controller_name == "voters" && Poll.votable_by(voter_user).any? %>">
<%= link_to t("officing.menu.voters"), new_officing_residence_path, class: "users-link" %>
<% end %>
diff --git a/app/components/officing/menu_component.rb b/app/components/officing/menu_component.rb
new file mode 100644
index 000000000..eb5df5a54
--- /dev/null
+++ b/app/components/officing/menu_component.rb
@@ -0,0 +1,18 @@
+class Officing::MenuComponent < ApplicationComponent
+ attr_reader :voter_user
+ use_helpers :current_user
+
+ def initialize(voter_user:)
+ @voter_user = voter_user
+ end
+
+ private
+
+ def vote_collection_shift?
+ current_user.poll_officer.officer_assignments.voting_days.where(date: Time.current.to_date).any?
+ end
+
+ def final_recount_shift?
+ current_user.poll_officer.officer_assignments.final.where(date: Time.current.to_date).any?
+ end
+end
diff --git a/app/helpers/officers_helper.rb b/app/helpers/officers_helper.rb
index 9e6a6bb47..9a9d1aded 100644
--- a/app/helpers/officers_helper.rb
+++ b/app/helpers/officers_helper.rb
@@ -1,12 +1,4 @@
module OfficersHelper
- def vote_collection_shift?
- current_user.poll_officer.officer_assignments.voting_days.where(date: Time.current.to_date).any?
- end
-
- def final_recount_shift?
- current_user.poll_officer.officer_assignments.final.where(date: Time.current.to_date).any?
- end
-
def no_shifts?
current_user.poll_officer.officer_assignments.where(date: Time.current.to_date).blank?
end
diff --git a/app/views/layouts/admin.html.erb b/app/views/layouts/admin.html.erb
index e88e4773e..fc6807977 100644
--- a/app/views/layouts/admin.html.erb
+++ b/app/views/layouts/admin.html.erb
@@ -17,6 +17,8 @@
<%= render Admin::MenuComponent.new %>
<% elsif namespace == "sdg_management" %>
<%= render SDGManagement::MenuComponent.new %>
+ <% elsif namespace == "officing" %>
+ <%= render Officing::MenuComponent.new(voter_user: @user) %>
<% else %>
<%= render "/#{namespace}/menu" %>
<% end %>
diff --git a/spec/components/officing/menu_component_spec.rb b/spec/components/officing/menu_component_spec.rb
new file mode 100644
index 000000000..025eda47d
--- /dev/null
+++ b/spec/components/officing/menu_component_spec.rb
@@ -0,0 +1,37 @@
+require "rails_helper"
+
+describe Officing::MenuComponent do
+ let(:booth) { create(:poll_booth) }
+ let(:officer) { create(:poll_officer) }
+ let(:component) { Officing::MenuComponent.new(voter_user: nil) }
+
+ before do
+ create(:poll_booth_assignment, booth: booth)
+ sign_in(officer.user)
+ end
+
+ it "shows the validate document link when there are vote collection shifts assigned" do
+ create(:poll_shift, officer: officer, booth: booth, date: Date.current, task: :vote_collection)
+
+ render_inline component
+
+ expect(page).to have_content "Validate document"
+ expect(page).not_to have_content "Total recounts and results"
+ end
+
+ it "shows the total recounts link when there are recount scrutinity shifts assigned" do
+ create(:poll_shift, officer: officer, booth: booth, date: Date.current, task: :recount_scrutiny)
+
+ render_inline component
+
+ expect(page).not_to have_content "Validate document"
+ expect(page).to have_content "Total recounts and results"
+ end
+
+ it "does not show any links when there are no shifts assigned" do
+ render_inline component
+
+ expect(page).not_to have_content "Validate document"
+ expect(page).not_to have_content "Total recounts and results"
+ end
+end
diff --git a/spec/system/budget_polls/officing_spec.rb b/spec/system/budget_polls/officing_spec.rb
deleted file mode 100644
index 87ec22f2b..000000000
--- a/spec/system/budget_polls/officing_spec.rb
+++ /dev/null
@@ -1,37 +0,0 @@
-require "rails_helper"
-
-describe "Budget Poll Officing" do
- scenario "Show sidebar menus if officer has shifts assigned" do
- booth = create(:poll_booth)
- booth_assignment = create(:poll_booth_assignment, booth: booth)
- officer = create(:poll_officer)
-
- create(:poll_shift, officer: officer, booth: booth, date: Date.current, task: :vote_collection)
-
- login_as officer.user
- visit officing_root_path
-
- expect(page).not_to have_content("You don't have officing shifts today")
- expect(page).to have_content("Validate document")
- expect(page).not_to have_content("Total recounts and results")
-
- create(:poll_shift, officer: officer, booth: booth, date: Date.current, task: :recount_scrutiny)
- create(:poll_officer_assignment, booth_assignment: booth_assignment, officer: officer)
-
- refresh
-
- expect(page).not_to have_content("You don't have officing shifts today")
- expect(page).to have_content("Validate document")
- expect(page).to have_content("Total recounts and results")
- end
-
- scenario "Do not show sidebar menus if officer has no shifts assigned" do
- login_as(create(:poll_officer).user)
-
- visit officing_root_path
-
- expect(page).to have_content("You don't have officing shifts today")
- expect(page).not_to have_content("Validate document")
- expect(page).not_to have_content("Total recounts and results")
- end
-end