Skip to content

Commit 7c208c7

Browse files
Merge pull request rails#47866 from ghiculescu/input-time-hh-mm
Allow a `value` formatted as `HH:MM` for `time_field`
2 parents 97f0c3c + 2d89108 commit 7c208c7

File tree

2 files changed

+22
-8
lines changed

2 files changed

+22
-8
lines changed

actionview/lib/action_view/helpers/tags/datetime_field.rb

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,28 @@ module Tags # :nodoc:
66
class DatetimeField < TextField # :nodoc:
77
def render
88
options = @options.stringify_keys
9-
options["value"] = normalize_datetime(options["value"] || value)
10-
options["min"] = normalize_datetime(options["min"])
11-
options["max"] = normalize_datetime(options["max"])
9+
options["value"] = datetime_value(options["value"] || value)
10+
options["min"] = format_datetime(parse_datetime(options["min"]))
11+
options["max"] = format_datetime(parse_datetime(options["max"]))
1212
@options = options
1313
super
1414
end
1515

1616
private
17-
def format_datetime(value)
18-
raise NotImplementedError
17+
def datetime_value(value)
18+
if value.is_a?(String)
19+
value
20+
else
21+
format_datetime(value)
22+
end
1923
end
2024

21-
def normalize_datetime(value)
22-
format_datetime(parse_datetime(value))
25+
def format_datetime(value)
26+
raise NotImplementedError
2327
end
2428

2529
def parse_datetime(value)
26-
if value.is_a? String
30+
if value.is_a?(String)
2731
DateTime.parse(value) rescue nil
2832
else
2933
value

actionview/test/template/form_helper_test.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1165,6 +1165,11 @@ def test_time_field_with_value_attr
11651165
assert_dom_equal(expected, time_field("post", "written_on", value: value))
11661166
end
11671167

1168+
def test_time_field_with_value_attr_that_excludes_seconds
1169+
expected = %{<input id="post_written_on" name="post[written_on]" type="time" value="01:45" />}
1170+
assert_dom_equal(expected, time_field("post", "written_on", value: "01:45"))
1171+
end
1172+
11681173
def test_time_field_with_timewithzone_value
11691174
previous_time_zone, Time.zone = Time.zone, "UTC"
11701175
expected = %{<input id="post_written_on" name="post[written_on]" type="time" value="01:02:03.000" />}
@@ -1271,6 +1276,11 @@ def test_datetime_local_field_without_seconds
12711276
assert_dom_equal(expected, datetime_local_field("post", "written_on", include_seconds: false))
12721277
end
12731278

1279+
def test_datetime_local_field_with_value_attr_that_excludes_seconds
1280+
expected = %{<input id="post_written_on" name="post[written_on]" type="datetime-local" value="2004-06-15T00:00" />}
1281+
assert_dom_equal(expected, datetime_local_field("post", "written_on", value: "2004-06-15T00:00"))
1282+
end
1283+
12741284
def test_month_field
12751285
expected = %{<input id="post_written_on" name="post[written_on]" type="month" value="2004-06" />}
12761286
assert_dom_equal(expected, month_field("post", "written_on"))

0 commit comments

Comments
 (0)