From faf733f54db7811748a89bb702fd8cf1cada2bd9 Mon Sep 17 00:00:00 2001 From: Justin Miller <16829344+jmilljr24@users.noreply.github.com> Date: Wed, 17 Jun 2026 08:01:52 -0400 Subject: [PATCH] split date/time in form - merge in controller --- app/models/event.rb | 49 +++++++++++++ app/policies/event_policy.rb | 5 +- app/views/events/_form.html.erb | 88 ++++++++++++++---------- spec/requests/events_spec.rb | 26 ++++--- spec/views/events/_form.html.erb_spec.rb | 15 ++-- 5 files changed, 129 insertions(+), 54 deletions(-) diff --git a/app/models/event.rb b/app/models/event.rb index d7a78f1c6..7e644f9b7 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -42,6 +42,7 @@ class Event < ApplicationRecord # Callbacks after_commit :build_public_registration_form, if: :public_registration_just_enabled? + before_validation :merge_date_time_fields # Validations validates_presence_of :title, :start_date, :end_date @@ -155,6 +156,35 @@ def event_details_label super.presence || "Before you attend" end + # Virtual attributes for date/time inputs (Firefox datetime-local compat) + attr_writer :start_date_date, :start_date_time, + :end_date_date, :end_date_time, + :registration_close_date_date, :registration_close_date_time + + def start_date_date + @start_date_date || start_date&.strftime("%Y-%m-%d") + end + + def start_date_time + @start_date_time || start_date&.strftime("%H:%M") + end + + def end_date_date + @end_date_date || end_date&.strftime("%Y-%m-%d") + end + + def end_date_time + @end_date_time || end_date&.strftime("%H:%M") + end + + def registration_close_date_date + @registration_close_date_date || registration_close_date&.strftime("%Y-%m-%d") + end + + def registration_close_date_time + @registration_close_date_time || registration_close_date&.strftime("%H:%M") + end + # Virtual attribute for cost in dollars (converts to/from cost_cents) def cost return nil if cost_cents.nil? @@ -188,6 +218,25 @@ def to_partial_path private + def merge_date_time_fields + merge_date_time(:start_date) + merge_date_time(:end_date) + merge_date_time(:registration_close_date) + end + + def merge_date_time(field) + date_val = send(:"#{field}_date") + time_val = send(:"#{field}_time") + self[field] = build_datetime(date_val, time_val) + end + + def build_datetime(date_str, time_str) + return nil if date_str.blank? && time_str.blank? + return Time.zone.parse(date_str) if date_str.present? && time_str.blank? + return Time.zone.parse("2000-01-01 #{time_str}") if date_str.blank? && time_str.present? + Time.zone.parse("#{date_str} #{time_str}") + end + def registration_form_required_when_publicly_registerable return unless public_registration_enabled? return if will_save_change_to_public_registration_enabled? diff --git a/app/policies/event_policy.rb b/app/policies/event_policy.rb index 94c5beb20..7bed8e13e 100644 --- a/app/policies/event_policy.rb +++ b/app/policies/event_policy.rb @@ -127,8 +127,9 @@ def google_analytics? :pre_title, :pre_date_text, :featured, - :start_date, :end_date, - :registration_close_date, + :start_date, :start_date_date, :start_date_time, + :end_date, :end_date_date, :end_date_time, + :registration_close_date, :registration_close_date_date, :registration_close_date_time, :published, :publicly_visible, :publicly_featured, diff --git a/app/views/events/_form.html.erb b/app/views/events/_form.html.erb index 0871ae01d..6e9e0b35d 100644 --- a/app/views/events/_form.html.erb +++ b/app/views/events/_form.html.erb @@ -68,53 +68,67 @@ <%# LEFT: Date/time, cost + pre-date text, videoconference + location %>
Start date <%= f.object.errors[:start_date].join(", ") %>
<% end %>End date <%= f.object.errors[:end_date].join(", ") %>
<% end %>Registration close date @@ -485,7 +499,7 @@