@@ -7,6 +7,18 @@ namespace BlazorLocalTime;
77/// </summary>
88public record LocalTimeFormValue
99{
10+ // Since users likely won't create it themselves, the constructor is internal.
11+ internal LocalTimeFormValue ( ILocalTimeService localTimeService )
12+ {
13+ _localTimeService = localTimeService ;
14+ }
15+
16+ /// <summary>
17+ /// The local time service used to get the current local time.
18+ /// </summary>
19+ private readonly ILocalTimeService _localTimeService ;
20+
21+ // Backing field for Value property.
1022 private DateTime ? _innerValue ;
1123
1224 /// <summary>
@@ -27,10 +39,7 @@ public required DateTime? Value
2739 /// </summary>
2840 public DateOnly ? Date
2941 {
30- get =>
31- Value . HasValue
32- ? new DateOnly ( Value . Value . Year , Value . Value . Month , Value . Value . Day )
33- : null ;
42+ get => Value . HasValue ? DateOnly . FromDateTime ( Value . Value ) : null ;
3443 set => DateChanged . InvokeAsync ( value ) ;
3544 }
3645
@@ -39,10 +48,7 @@ public DateOnly? Date
3948 /// </summary>
4049 public TimeOnly ? Time
4150 {
42- get =>
43- Value . HasValue
44- ? new TimeOnly ( Value . Value . Hour , Value . Value . Minute , Value . Value . Second )
45- : null ;
51+ get => Value . HasValue ? TimeOnly . FromDateTime ( Value . Value ) : null ;
4652 set => TimeChanged . InvokeAsync ( value ) ;
4753 }
4854
@@ -51,13 +57,50 @@ public TimeOnly? Time
5157 /// </summary>
5258 public TimeSpan ? TimeSpan
5359 {
54- get =>
55- Value . HasValue
56- ? new TimeSpan ( Value . Value . Hour , Value . Value . Minute , Value . Value . Second )
57- : null ;
60+ get => Value . HasValue ? Value . Value . TimeOfDay : null ;
5861 set => TimeSpanChanged . InvokeAsync ( value ) ;
5962 }
6063
64+ /// <summary>
65+ /// It is essentially the same as <see cref="Value"/>. but returns the current date and time when the value is null. <br/>
66+ /// This is useful when binding values to date and time components that do not tolerate null values.
67+ /// </summary>
68+ public DateTime ValueOrNow
69+ {
70+ get => _innerValue ?? _localTimeService . Now . DateTime ;
71+ set => Value = value ;
72+ }
73+
74+ /// <summary>
75+ /// It is essentially the same as <see cref="Date"/>, but returns today's date when the value is null. <br/>
76+ /// This is useful when binding values to date components that do not tolerate null values.
77+ /// </summary>
78+ public DateOnly DateOrToday
79+ {
80+ get => Date ?? DateOnly . FromDateTime ( _localTimeService . Now . DateTime ) ;
81+ set => Date = value ;
82+ }
83+
84+ /// <summary>
85+ /// It is essentially the same as <see cref="Time"/>, but returns current time when the value is null. <br/>
86+ /// This is useful when binding values to time components that do not tolerate null values.
87+ /// </summary>
88+ public TimeOnly TimeOrNow
89+ {
90+ get => Time ?? TimeOnly . FromDateTime ( _localTimeService . Now . DateTime ) ;
91+ set => Time = value ;
92+ }
93+
94+ /// <summary>
95+ /// It is essentially the same as <see cref="TimeSpan"/>, but returns current time when the value is null. <br/>
96+ /// This is useful when binding values to time components that do not tolerate null values.
97+ /// </summary>
98+ public TimeSpan TimeSpanOrNow
99+ {
100+ get => TimeSpan ?? _localTimeService . Now . DateTime . TimeOfDay ;
101+ set => TimeSpan = value ;
102+ }
103+
61104 /// <summary>
62105 /// An <see cref="EventCallback"/> that is invoked when the value changes.
63106 /// </summary>
0 commit comments