Skip to content

Commit 819378c

Browse files
committed
Improve date display on event page
It was misleading and unhelpful to show midnight start/end times
1 parent 37fbd91 commit 819378c

5 files changed

Lines changed: 105 additions & 33 deletions

File tree

app/helpers/events_helper.rb

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,4 +131,46 @@ def google_maps_javascript_api_tag(event)
131131
'map-suggested-marker-image': image_url('suggestion.png')
132132
})
133133
end
134+
135+
DATE_STRF = '%-e %B %Y'
136+
TIME_STRF = '%H:%M'
137+
138+
def neatly_printed_date_range(start, finish = nil)
139+
if start.blank?
140+
if finish.blank?
141+
return 'No date given'
142+
else
143+
return 'No start date'
144+
end
145+
else
146+
differing = []
147+
148+
if finish.present?
149+
if finish.to_date != start.to_date
150+
differing << '%-e'
151+
if finish.month != start.month
152+
differing << '%B'
153+
if finish.year != start.year
154+
differing << '%Y'
155+
end
156+
end
157+
end
158+
end
159+
160+
if finish.blank? || differing.empty?
161+
out = start.strftime(DATE_STRF)
162+
# Don't show time component if they are set to midnight since that is the default if no time specified.
163+
# Revisit this decision if any events start occurring at midnight (timezone issue?)!
164+
165+
show_time = (start.hour != 0 || start.min != 0) || (finish.present? && (finish.hour != 0 || finish.min != 0))
166+
if show_time
167+
out << " @ #{start.strftime(TIME_STRF)}"
168+
out << " - #{finish.strftime(TIME_STRF)}" if finish && (finish.hour != start.hour || finish.min != start.min)
169+
end
170+
out
171+
elsif differing.any?
172+
"#{start.strftime(differing.join(' '))} - #{finish.strftime(DATE_STRF)}"
173+
end
174+
end
175+
end
134176
end

app/helpers/search_helper.rb

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -68,34 +68,4 @@ def toggle_hidden_facet_link facet
6868
<i class='glyphicon glyphicon-chevron-up pull-right toggle-#{facet}' style='display: none;'></i>
6969
".html_safe
7070
end
71-
72-
def neatly_printed_date_range(start, finish = nil)
73-
return 'No date given' if start.blank? && finish.blank?
74-
return 'No start date' if !start
75-
76-
if finish
77-
out = ''
78-
79-
strftime_components = []
80-
if finish.to_date != start.to_date
81-
strftime_components << '%-e'
82-
if finish.month != start.month
83-
strftime_components << '%B'
84-
if finish.year != start.year
85-
strftime_components << '%Y'
86-
end
87-
end
88-
end
89-
90-
if strftime_components.any?
91-
out << "#{start.strftime(strftime_components.join(' '))} - "
92-
end
93-
94-
out << "#{finish.strftime('%-e %B %Y')}"
95-
else
96-
out = start.strftime('%-e %B %Y')
97-
end
98-
99-
out
100-
end
10171
end

app/mailers/subscription_mailer.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
class SubscriptionMailer < ApplicationMailer
22

33
include ActionView::Helpers::TextHelper
4-
helper(SearchHelper)
54
helper(SubscriptionsHelper)
5+
helper(EventsHelper)
66

77
def digest(sub, dig)
88
@user = sub.user

app/views/events/show.html.erb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,10 @@
5656

5757
<div class="my-3">
5858
<!-- Field: start and end -->
59-
<%= display_attribute(@event, :start) { |t| t.strftime('%A, %d %B %Y @ %H:%M') }%>
60-
<%= display_attribute(@event, :end) { |t| t.strftime('%A, %d %B %Y @ %H:%M') } %>
59+
<p class="date no-spacing">
60+
<strong class="text-primary"> Date: </strong>
61+
<%= neatly_printed_date_range(@event.start, @event.end) %>
62+
</p>
6163
<%= display_attribute(@event, :timezone) %>
6264
<%= display_attribute(@event, :duration) %>
6365

test/helpers/events_helper_test.rb

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
require 'test_helper'
2+
3+
class EventsHelperTest < ActionView::TestCase
4+
5+
test "neatly_printed_date_range" do
6+
assert_equal '15 April 2023',
7+
neatly_printed_date_range(DateTime.new(2023, 4, 15, 0)),
8+
'Should display single date without time if time is midnight'
9+
10+
assert_equal '15 April 2023',
11+
neatly_printed_date_range(DateTime.new(2023, 4, 15, 0), DateTime.new(2023, 4, 15, 0)),
12+
'Should display single date without time if time is midnight'
13+
14+
assert_equal '15 April 2023 @ 09:00',
15+
neatly_printed_date_range(DateTime.new(2023, 4, 15, 9)),
16+
'Should display single date with single time if no finish date'
17+
18+
assert_equal '15 April 2023 @ 09:00',
19+
neatly_printed_date_range(DateTime.new(2023, 4, 15, 9), DateTime.new(2023, 4, 15, 9)),
20+
'Should display single date with single time if both start and finish are the same'
21+
22+
assert_equal '15 April 2023 @ 09:00 - 17:00',
23+
neatly_printed_date_range(DateTime.new(2023, 4, 15, 9), DateTime.new(2023, 4, 15, 17)),
24+
'Should display single date with time range'
25+
26+
assert_equal '15 April 2023 @ 00:00 - 00:15',
27+
neatly_printed_date_range(DateTime.new(2023, 4, 15, 0, 0), DateTime.new(2023, 4, 15, 0, 15)),
28+
'Should display single date with time range if at least one time is not midnight'
29+
30+
assert_equal '15 April 2023 @ 09:15 - 09:16',
31+
neatly_printed_date_range(DateTime.new(2023, 4, 15, 9, 15), DateTime.new(2023, 4, 15, 9, 16)),
32+
'Should display single date with time range'
33+
34+
assert_equal '15 April 2023 @ 09:15 - 21:15',
35+
neatly_printed_date_range(DateTime.new(2023, 4, 15, 9, 15), DateTime.new(2023, 4, 15, 21, 15)),
36+
'Should display single date with time range'
37+
38+
assert_equal '15 - 16 April 2023',
39+
neatly_printed_date_range(DateTime.new(2023, 4, 15, 9), DateTime.new(2023, 4, 16, 17)),
40+
'Should display date range without time'
41+
42+
assert_equal '15 April - 16 May 2023',
43+
neatly_printed_date_range(DateTime.new(2023, 4, 15, 9), DateTime.new(2023, 5, 16, 17)),
44+
'Should display date and month range without time'
45+
46+
assert_equal '15 April 2023 - 16 May 2024',
47+
neatly_printed_date_range(DateTime.new(2023, 4, 15, 9), DateTime.new(2024, 5, 16, 17)),
48+
'Should display date, month and year range without time'
49+
50+
assert_equal '15 April 2023 - 16 May 2024',
51+
neatly_printed_date_range(DateTime.new(2023, 4, 15), DateTime.new(2024, 5, 16)),
52+
'Should display date, month and year range without time'
53+
54+
assert_equal 'No date given', neatly_printed_date_range('', '')
55+
assert_equal 'No date given', neatly_printed_date_range(nil, '')
56+
assert_equal 'No start date', neatly_printed_date_range(nil, DateTime.new(2024, 5, 16, 17))
57+
end
58+
end

0 commit comments

Comments
 (0)