Move poll shifts form partial to a component

Thanks to it, we can move a few helper methods to the component.
This commit is contained in:
Javi Martín
2024-10-12 18:23:54 +02:00
parent 9ab6c15975
commit ee34ead4ee
7 changed files with 67 additions and 54 deletions

View File

@@ -1,6 +1,6 @@
(function() { (function() {
"use strict"; "use strict";
App.PollsAdmin = { App.AdminPollShiftsForm = {
initialize: function() { initialize: function() {
$("select[class='js-poll-shifts']").on({ $("select[class='js-poll-shifts']").on({
change: function() { change: function() {

View File

@@ -101,7 +101,6 @@
//= require imageable //= require imageable
//= require tree_navigator //= require tree_navigator
//= require tag_autocomplete //= require tag_autocomplete
//= require polls_admin
//= require leaflet/dist/leaflet //= require leaflet/dist/leaflet
//= require leaflet.markercluster/dist/leaflet.markercluster //= require leaflet.markercluster/dist/leaflet.markercluster
//= require map //= require map
@@ -157,7 +156,6 @@ var initialize_modules = function() {
App.Documentable.initialize(); App.Documentable.initialize();
App.Imageable.initialize(); App.Imageable.initialize();
App.TagAutocomplete.initialize(); App.TagAutocomplete.initialize();
App.PollsAdmin.initialize();
App.Map.initialize(); App.Map.initialize();
App.Polls.initialize(); App.Polls.initialize();
App.Sortable.initialize(); App.Sortable.initialize();
@@ -171,6 +169,7 @@ var initialize_modules = function() {
} }
App.AdminBudgetsWizardCreationStep.initialize(); App.AdminBudgetsWizardCreationStep.initialize();
App.AdminMachineLearningScripts.initialize(); App.AdminMachineLearningScripts.initialize();
App.AdminPollShiftsForm.initialize();
App.AdminTenantsForm.initialize(); App.AdminTenantsForm.initialize();
App.AdminVotationTypesFields.initialize(); App.AdminVotationTypesFields.initialize();
App.AdminMenu.initialize(); App.AdminMenu.initialize();

View File

@@ -1,5 +1,5 @@
<%= form_for @shift, as: :shift, url: admin_booth_shifts_path do |f| %> <%= form_for shift, as: :shift, url: admin_booth_shifts_path do |f| %>
<%= render "shared/errors", resource: @shift %> <%= render "shared/errors", resource: shift %>
<fieldset class="fieldset"> <fieldset class="fieldset">
<legend> <legend>
@@ -8,8 +8,8 @@
<div class="small-12 medium-3 column highlight padding"> <div class="small-12 medium-3 column highlight padding">
<strong><%= t("admin.poll_shifts.new.officer") %></strong> <strong><%= t("admin.poll_shifts.new.officer") %></strong>
<br><%= @officer.name %> <br><%= officer.name %>
<%= f.hidden_field :officer_id, value: @officer.id %> <%= f.hidden_field :officer_id, value: officer.id %>
</div> </div>
<div class="small-12 medium-3 column"> <div class="small-12 medium-3 column">
@@ -22,17 +22,17 @@
<div class="small-12 medium-3 column"> <div class="small-12 medium-3 column">
<label><%= t("admin.poll_shifts.new.date") %></label> <label><%= t("admin.poll_shifts.new.date") %></label>
<%= select "shift[date]", "vote_collection_date", <%= select "shift[date]", "vote_collection_date",
options_for_select(shift_vote_collection_dates(@booth, @voting_polls)), options_for_select(shift_vote_collection_dates(booth, voting_polls)),
{ prompt: @voting_polls.present? ? t("admin.poll_shifts.new.select_date") : t("admin.poll_shifts.new.no_voting_days") }, { prompt: voting_polls.present? ? t("admin.poll_shifts.new.select_date") : t("admin.poll_shifts.new.no_voting_days") },
class: "js-shift-vote-collection-dates" %> class: "js-shift-vote-collection-dates" %>
<%= select "shift[date]", "recount_scrutiny_date", <%= select "shift[date]", "recount_scrutiny_date",
options_for_select(shift_recount_scrutiny_dates(@booth, @recount_polls)), options_for_select(shift_recount_scrutiny_dates(booth, recount_polls)),
{ prompt: t("admin.poll_shifts.new.select_date") }, { prompt: t("admin.poll_shifts.new.select_date") },
class: "js-shift-recount-scrutiny-dates", class: "js-shift-recount-scrutiny-dates",
hidden: "hidden" %> hidden: "hidden" %>
</div> </div>
<%= f.hidden_field :booth_id, value: @booth.id %> <%= f.hidden_field :booth_id, value: booth.id %>
<div class="small-12 medium-3 column"> <div class="small-12 medium-3 column">
<%= f.submit t("admin.poll_shifts.new.add_shift"), <%= f.submit t("admin.poll_shifts.new.add_shift"),

View File

@@ -0,0 +1,56 @@
class Admin::Poll::Shifts::FormComponent < ApplicationComponent
attr_reader :shift, :booth, :officer
def initialize(shift, booth:, officer:)
@shift = shift
@booth = booth
@officer = officer
end
private
def voting_polls
booth.polls.current
end
def recount_polls
booth.polls.current_or_recounting
end
def shift_vote_collection_dates(booth, polls)
return [] if polls.blank?
date_options((start_date(polls)..end_date(polls)), Poll::Shift.tasks[:vote_collection], booth)
end
def shift_recount_scrutiny_dates(booth, polls)
return [] if polls.blank?
dates = polls.map(&:ends_at).map(&:to_date).sort.reduce([]) do |total, date|
initial_date = [date, Date.current].max
total << (initial_date..date + Poll::RECOUNT_DURATION).to_a
end
date_options(dates.flatten.uniq, Poll::Shift.tasks[:recount_scrutiny], booth)
end
def date_options(dates, task_id, booth)
valid_dates(dates, task_id, booth).map { |date| [l(date, format: :long), l(date)] }
end
def valid_dates(dates, task_id, booth)
dates.reject { |date| officer_shifts(task_id, booth).include?(date) }
end
def start_date(polls)
start_date = polls.minimum(:starts_at).to_date
[start_date, Date.current].max
end
def end_date(polls)
polls.maximum(:ends_at).to_date
end
def officer_shifts(task_id, booth)
officer.shifts.where(task: task_id, booth: booth).map(&:date)
end
end

View File

@@ -5,8 +5,6 @@ class Admin::Poll::ShiftsController < Admin::Poll::BaseController
def new def new
load_shifts load_shifts
@shift = ::Poll::Shift.new @shift = ::Poll::Shift.new
@voting_polls = @booth.polls.current
@recount_polls = @booth.polls.current_or_recounting
end end
def create def create

View File

@@ -1,40 +0,0 @@
module ShiftsHelper
def shift_vote_collection_dates(booth, polls)
return [] if polls.blank?
date_options((start_date(polls)..end_date(polls)), Poll::Shift.tasks[:vote_collection], booth)
end
def shift_recount_scrutiny_dates(booth, polls)
return [] if polls.blank?
dates = polls.map(&:ends_at).map(&:to_date).sort.reduce([]) do |total, date|
initial_date = [date, Date.current].max
total << (initial_date..date + Poll::RECOUNT_DURATION).to_a
end
date_options(dates.flatten.uniq, Poll::Shift.tasks[:recount_scrutiny], booth)
end
def date_options(dates, task_id, booth)
valid_dates(dates, task_id, booth).map { |date| [l(date, format: :long), l(date)] }
end
def valid_dates(dates, task_id, booth)
dates.reject { |date| officer_shifts(task_id, booth).include?(date) }
end
def start_date(polls)
start_date = polls.minimum(:starts_at).to_date
[start_date, Date.current].max
end
def end_date(polls)
polls.maximum(:ends_at).to_date
end
private
def officer_shifts(task_id, booth)
@officer.shifts.where(task: task_id, booth: booth).map(&:date)
end
end

View File

@@ -8,7 +8,7 @@
</p> </p>
<%= render "search_officers" %> <%= render "search_officers" %>
<% else %> <% else %>
<%= render "form" %> <%= render Admin::Poll::Shifts::FormComponent.new(@shift, booth: @booth, officer: @officer) %>
<% end %> <% end %>
<div id="shifts"> <div id="shifts">