Skip to content

Commit 7253bc4

Browse files
authored
feat(Calendar): add FirstDayOfWeek parameter (#5692)
* refactor: 代码重构 * feat: 增加 FirstDayOfWeek 参数 * doc: 更新示例 * doc: 增加参数文档 * chore: bump version 9.4.11 * test: 增加单元测试
1 parent 89e944c commit 7253bc4

File tree

9 files changed

+56
-9
lines changed

9 files changed

+56
-9
lines changed

src/BootstrapBlazor.Server/Components/Samples/Calendars.razor

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<h4>@Localizer["SubTitle"]</h4>
77

88
<DemoBlock Title="@Localizer["BasicUsageTitle"]" Introduction="@Localizer["BasicUsageIntro"]" Name="Normal">
9-
<Calendar ValueChanged="@OnValueChanged" />
9+
<Calendar ValueChanged="@OnValueChanged" FirstDayOfWeek="DayOfWeek.Monday" />
1010
<ConsoleLogger @ref="NormalLogger" />
1111
</DemoBlock>
1212

src/BootstrapBlazor.Server/Components/Samples/Calendars.razor.cs

+8
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,14 @@ private AttributeItem[] GetAttributes() =>
7777
Type = "RenderFragment<CalendarCellValue>",
7878
ValueList = " — ",
7979
DefaultValue = " — "
80+
},
81+
new()
82+
{
83+
Name = nameof(Calendar.FirstDayOfWeek),
84+
Description = Localizer["FirstDayOfWeek"],
85+
Type = "DayOfWeek",
86+
ValueList = " — ",
87+
DefaultValue = "Sunday"
8088
}
8189
];
8290
}

src/BootstrapBlazor.Server/Components/Samples/DateTimePickers.razor.cs

+8
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,14 @@ private AttributeItem[] GetAttributes() =>
221221
DefaultValue = " — "
222222
},
223223
new()
224+
{
225+
Name = nameof(DateTimePicker<DateTime>.FirstDayOfWeek),
226+
Description = Localizer["AttrFirstDayOfWeek"],
227+
Type = "DayOfWeek",
228+
ValueList = " — ",
229+
DefaultValue = "Sunday"
230+
},
231+
new()
224232
{
225233
Name = "ViewMode",
226234
Description = Localizer["Att9"],

src/BootstrapBlazor.Server/Locales/en-US.json

+4-2
Original file line numberDiff line numberDiff line change
@@ -2572,7 +2572,8 @@
25722572
"FeatureShowHolidaysIntro": "<code>ShowHolidays</code> Whether to display holidays",
25732573
"OnGetDisabledDaysCallbackEvent": "Disable date callback method",
25742574
"AttrEnableDisabledDaysCache": "Whether to enable custom disabled date cache",
2575-
"AttrDisplayDisabledDayAsEmpty": "Display disabled date as an empty string"
2575+
"AttrDisplayDisabledDayAsEmpty": "Display disabled date as an empty string",
2576+
"AttrFirstDayOfWeek": "The first day of the week"
25762577
},
25772578
"BootstrapBlazor.Server.Components.Samples.TimePickers": {
25782579
"Title": "TimePicker",
@@ -3768,7 +3769,8 @@
37683769
"Chinese": "Chinese",
37693770
"Math": "Math",
37703771
"English": "English",
3771-
"Study": "Study"
3772+
"Study": "Study",
3773+
"FirstDayOfWeek": "The first day of the week"
37723774
},
37733775
"BootstrapBlazor.Server.Components.Samples.Cameras": {
37743776
"Title": "Camera",

src/BootstrapBlazor.Server/Locales/zh-CN.json

+4-2
Original file line numberDiff line numberDiff line change
@@ -2572,7 +2572,8 @@
25722572
"FeatureShowHolidaysIntro": "<code>ShowHolidays</code> 是否显示假日",
25732573
"OnGetDisabledDaysCallbackEvent": "获得自定义禁用日期回调方法",
25742574
"AttrEnableDisabledDaysCache": "是否启用获得自定义禁用日期缓存",
2575-
"AttrDisplayDisabledDayAsEmpty": "显示禁用日期为空字符串"
2575+
"AttrDisplayDisabledDayAsEmpty": "显示禁用日期为空字符串",
2576+
"AttrFirstDayOfWeek": "设置每周第一天"
25762577
},
25772578
"BootstrapBlazor.Server.Components.Samples.TimePickers": {
25782579
"Title": "TimePicker 时间选择器",
@@ -3768,7 +3769,8 @@
37683769
"Chinese": "语文",
37693770
"Math": "数学",
37703771
"English": "英语",
3771-
"Study": "自习"
3772+
"Study": "自习",
3773+
"FirstDayOfWeek": "设置每周第一天"
37723774
},
37733775
"BootstrapBlazor.Server.Components.Samples.Cameras": {
37743776
"Title": "Camera 摄像头拍照组件",

src/BootstrapBlazor/BootstrapBlazor.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk.Razor">
22

33
<PropertyGroup>
4-
<Version>9.5.0-beta11</Version>
4+
<Version>9.4.11</Version>
55
</PropertyGroup>
66

77
<ItemGroup>

src/BootstrapBlazor/Components/Calendar/Calendar.razor.cs

+16-2
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ protected override void OnInitialized()
107107
PreviousMonth = Localizer[nameof(PreviousMonth)];
108108
NextMonth = Localizer[nameof(NextMonth)];
109109
Today = Localizer[nameof(Today)];
110-
WeekLists = [.. Localizer[nameof(WeekLists)].Value.Split(',')];
110+
WeekLists = GetWeekList();
111111
PreviousWeek = Localizer[nameof(PreviousWeek)];
112112
NextWeek = Localizer[nameof(NextWeek)];
113113
WeekText = Localizer[nameof(WeekText)];
@@ -124,7 +124,7 @@ protected DateTime StartDate
124124
get
125125
{
126126
var d = Value.AddDays(1 - Value.Day);
127-
d = d.AddDays(0 - (int)d.DayOfWeek);
127+
d = d.AddDays((int)FirstDayOfWeek - (int)d.DayOfWeek);
128128
return d;
129129
}
130130
}
@@ -197,6 +197,12 @@ protected int GetWeekCount()
197197
[Parameter]
198198
public bool ShowYearButtons { get; set; } = true;
199199

200+
/// <summary>
201+
/// 获得/设置 星期第一天 默认 <see cref="DayOfWeek.Sunday"/>
202+
/// </summary>
203+
[Parameter]
204+
public DayOfWeek FirstDayOfWeek { get; set; } = DayOfWeek.Sunday;
205+
200206
/// <summary>
201207
/// 选中日期时回调此方法
202208
/// </summary>
@@ -297,4 +303,12 @@ private BodyTemplateContext GetBodyTemplateContext(DateTime week)
297303
context.Values.AddRange(Enumerable.Range(0, 7).Select(i => CreateCellValue(week.AddDays(i))));
298304
return context;
299305
}
306+
private List<string> GetWeekList()
307+
{
308+
var list = Localizer[nameof(WeekLists)].Value.Split(',', StringSplitOptions.RemoveEmptyEntries).ToList();
309+
310+
// 调整顺序
311+
var firstDayIndex = (int)FirstDayOfWeek;
312+
return [.. list.Skip(firstDayIndex), .. list.Take(firstDayIndex)];
313+
}
300314
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,7 @@ private List<string> GetWeekList()
537537

538538
// 调整顺序
539539
var firstDayIndex = (int)FirstDayOfWeek;
540-
return list.Skip(firstDayIndex).Concat(list.Take(firstDayIndex)).ToList();
540+
return [.. list.Skip(firstDayIndex), .. list.Take(firstDayIndex)];
541541
}
542542

543543
private async Task UpdateDisabledDaysCache(bool force)

test/UnitTest/Components/CalendarTest.cs

+13
Original file line numberDiff line numberDiff line change
@@ -233,4 +233,17 @@ await cut.InvokeAsync(() =>
233233
});
234234
Assert.NotEqual(v, DateTime.MinValue);
235235
}
236+
237+
[Fact]
238+
public void FirstDayOfWeek_Ok()
239+
{
240+
var cut = Context.RenderComponent<Calendar>(pb =>
241+
{
242+
pb.Add(a => a.Value, new DateTime(2025, 02, 20));
243+
pb.Add(a => a.FirstDayOfWeek, DayOfWeek.Monday);
244+
});
245+
var labels = cut.FindAll(".calendar-table thead > tr > th");
246+
Assert.Equal("一", labels[0].TextContent);
247+
Assert.Equal("日", labels[6].TextContent);
248+
}
236249
}

0 commit comments

Comments
 (0)