Skip to content

Commit 3548070

Browse files
committed
refactor: 更新 FormatValueAsString 逻辑
1 parent 2d96c36 commit 3548070

File tree

2 files changed

+90
-34
lines changed

2 files changed

+90
-34
lines changed

src/BootstrapBlazor/Components/DateTimePicker/DateTimePicker.razor.cs

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -328,15 +328,23 @@ protected override async Task OnParametersSetAsync()
328328
_ => DateTime.MinValue
329329
};
330330

331-
if (MinValueToToday(d))
331+
if (d != DateTime.MinValue)
332332
{
333-
d = DateTime.Today;
333+
_render = false;
334+
_disabledDaysList = await OnGetDisabledDaysCallback(d, d);
335+
_render = true;
334336
}
335-
336-
_disabledDaysList = await OnGetDisabledDaysCallback(d, d);
337337
}
338338
}
339339

340+
private bool _render = true;
341+
342+
/// <summary>
343+
/// <inheritdoc/>
344+
/// </summary>
345+
/// <returns></returns>
346+
protected override bool ShouldRender() => _render;
347+
340348
/// <summary>
341349
/// 格式化数值方法
342350
/// </summary>
@@ -350,18 +358,9 @@ protected override string FormatValueAsString(TValue value)
350358
_ => null
351359
};
352360

353-
if (d.HasValue)
361+
if (d.HasValue && !_disabledDaysList.Contains(d.Value))
354362
{
355-
if (MinValueToToday(d.Value))
356-
{
357-
// 最小值映射为当天
358-
d = DateTime.Today;
359-
}
360-
361-
if (!MinValueToEmpty(d.Value) && !_disabledDaysList.Contains(d.Value))
362-
{
363-
ret = d.Value.ToString(ViewMode == DatePickerViewMode.DateTime ? DateTimeFormat : DateFormat);
364-
}
363+
ret = d.Value.ToString(ViewMode == DatePickerViewMode.DateTime ? DateTimeFormat : DateFormat);
365364
}
366365
return ret;
367366
}

test/UnitTest/Components/DateTimePickerTest.cs

Lines changed: 76 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,35 +1027,92 @@ public void OnClickShortLink_Ok()
10271027
}
10281028

10291029
[Fact]
1030-
public void FormatValueAsString_Ok()
1030+
public void FormatValueAsString_DateTime_Ok()
10311031
{
10321032
// 设置为 最小值或者 null 时 当 AutoToday 为 true 时自动设置为当前时间
10331033
var cut = Context.RenderComponent<DateTimePicker<DateTime>>(pb =>
10341034
{
10351035
pb.Add(a => a.AutoToday, true);
10361036
pb.Add(a => a.Value, DateTime.MinValue);
10371037
});
1038+
var input = cut.Find(".datetime-picker-input");
1039+
Assert.Equal($"{DateTime.Today:yyyy-MM-dd}", input.GetAttribute("value"));
10381040
Assert.Equal(DateTime.Today, cut.Instance.Value);
10391041

1040-
var picker = cut.Instance;
1041-
var mi = picker.GetType().GetMethod("FormatValueAsString", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic)!;
1042-
var v = mi.Invoke(picker, [DateTime.MinValue]);
1043-
Assert.Equal($"{DateTime.Today:yyyy-MM-dd}", v);
1044-
10451042
// 设置为 禁用日期时 UI 显示为空字符串
1046-
// cut.SetParametersAndRender(pb =>
1047-
// {
1048-
// pb.Add(a => a.Value, DateTime.Today);
1049-
// pb.Add(a => a.OnGetDisabledDaysCallback, async (start, end) =>
1050-
// {
1051-
// await Task.Delay(0);
1052-
// var ret = new List<DateTime>() { DateTime.Today };
1053-
// return ret;
1054-
// });
1055-
// });
1056-
//
1057-
// v = mi.Invoke(picker, [DateTime.MinValue]);
1058-
// Assert.Equal(string.Empty, v);
1043+
cut.SetParametersAndRender(pb =>
1044+
{
1045+
pb.Add(a => a.DisplayDisabledDayAsEmpty, true);
1046+
pb.Add(a => a.Value, DateTime.MinValue);
1047+
pb.Add(a => a.AutoToday, true);
1048+
pb.Add(a => a.OnGetDisabledDaysCallback, async (start, end) =>
1049+
{
1050+
await Task.Delay(0);
1051+
var ret = new List<DateTime>() { DateTime.Today };
1052+
return ret;
1053+
});
1054+
});
1055+
Assert.Equal("", input.GetAttribute("value"));
1056+
1057+
// 禁用 AutoToday 显示 0001-01-01
1058+
cut.SetParametersAndRender(pb =>
1059+
{
1060+
pb.Add(a => a.Value, DateTime.MinValue);
1061+
pb.Add(a => a.AutoToday, false);
1062+
});
1063+
Assert.Equal("0001-01-01", input.GetAttribute("value"));
1064+
1065+
// 更改值为未禁用日期
1066+
cut.SetParametersAndRender(pb =>
1067+
{
1068+
pb.Add(a => a.Value, DateTime.Today.AddDays(-1));
1069+
});
1070+
Assert.Equal($"{DateTime.Today.AddDays(-1):yyyy-MM-dd}", input.GetAttribute("value"));
1071+
}
1072+
1073+
[Fact]
1074+
public void FormatValueAsString_DateTimeOffset_Ok()
1075+
{
1076+
// 设置为 最小值或者 null 时 当 AutoToday 为 true 时自动设置为当前时间
1077+
var cut = Context.RenderComponent<DateTimePicker<DateTimeOffset?>>(pb =>
1078+
{
1079+
pb.Add(a => a.DisplayDisabledDayAsEmpty, true);
1080+
pb.Add(a => a.Value, null);
1081+
pb.Add(a => a.AutoToday, false);
1082+
pb.Add(a => a.OnGetDisabledDaysCallback, async (start, end) =>
1083+
{
1084+
await Task.Delay(0);
1085+
var ret = new List<DateTime>() { DateTime.Today };
1086+
return ret;
1087+
});
1088+
});
1089+
var input = cut.Find(".datetime-picker-input");
1090+
Assert.Equal("", input.GetAttribute("value"));
1091+
Assert.Null(cut.Instance.Value);
1092+
1093+
cut.SetParametersAndRender(pb =>
1094+
{
1095+
pb.Add(a => a.Value, DateTimeOffset.Now);
1096+
pb.Add(a => a.DisplayDisabledDayAsEmpty, false);
1097+
});
1098+
Assert.Equal($"{DateTimeOffset.Now:yyyy-MM-dd}", input.GetAttribute("value"));
1099+
1100+
cut.SetParametersAndRender(pb =>
1101+
{
1102+
pb.Add(a => a.Value, DateTimeOffset.MinValue);
1103+
pb.Add(a => a.AutoToday, false);
1104+
pb.Add(a => a.DisplayMinValueAsEmpty, false);
1105+
pb.Add(a => a.DisplayDisabledDayAsEmpty, false);
1106+
});
1107+
Assert.Equal($"0001-01-01", input.GetAttribute("value"));
1108+
1109+
cut.SetParametersAndRender(pb =>
1110+
{
1111+
pb.Add(a => a.Value, DateTimeOffset.MinValue);
1112+
pb.Add(a => a.AutoToday, true);
1113+
pb.Add(a => a.DisplayDisabledDayAsEmpty, true);
1114+
});
1115+
Assert.Equal($"0001-01-01", input.GetAttribute("value"));
10591116
}
10601117

10611118
[Fact]

0 commit comments

Comments
 (0)