Skip to content

Commit 6f84d88

Browse files
authored
feat(FlipClock): add ShowYear parameter (#6224)
* feat: 增加 ShowYear 参数 * doc: 更新示例 * test: 更新单元测试 * refactor: 重构脚本 * doc: 更新示例 * refactor: 精简代码减少依赖项
1 parent 48289a4 commit 6f84d88

File tree

8 files changed

+142
-119
lines changed

8 files changed

+142
-119
lines changed

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

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,6 @@
55

66
<h4>@((MarkupString)Localizer["FlipClocksDescription"].Value)</h4>
77

8-
<DemoBlock Title="@Localizer["BaseUsageText"]" Introduction="@Localizer["BaseUsageIntro"]" Name="Normal">
9-
<FlipClock></FlipClock>
10-
</DemoBlock>
11-
12-
<DemoBlock Title="@Localizer["ShowMonthText"]" Introduction="@Localizer["ShowMonthIntro"]" Name="ShowDay">
13-
<FlipClock ShowMonth="true" ShowDay="true"></FlipClock>
14-
</DemoBlock>
15-
16-
<DemoBlock Title="@Localizer["ShowDayText"]" Introduction="@Localizer["ShowDayIntro"]" Name="ShowDay">
17-
<FlipClock ShowDay="true"></FlipClock>
18-
</DemoBlock>
19-
20-
<DemoBlock Title="@Localizer["ShowMinuteText"]" Introduction="@Localizer["ShowMinuteIntro"]" Name="ShowMinute">
21-
<FlipClock ShowHour="false" ShowMinute="false"></FlipClock>
22-
</DemoBlock>
23-
24-
<DemoBlock Title="@Localizer["ShowSecondText"]" Introduction="@Localizer["ShowSecondIntro"]" Name="ShowSecond">
25-
<FlipClock ShowSecond="false"></FlipClock>
26-
</DemoBlock>
27-
288
<DemoBlock Title="@Localizer["CountText"]" Introduction="@Localizer["CountIntro"]" Name="Count">
299
<FlipClock ViewMode="FlipClockViewMode.Count"></FlipClock>
3010
</DemoBlock>
@@ -79,12 +59,50 @@
7959
<Slider @bind-Value="CardGroupMarginValue" Max="28" Min="18"></Slider>
8060
</BootstrapInputGroup>
8161
</div>
62+
<div class="col-12 col-sm-6 col-lg-4">
63+
<BootstrapInputGroup>
64+
<BootstrapInputGroupLabel DisplayText="@Localizer["ShowYear"]" Width="150"></BootstrapInputGroupLabel>
65+
<Switch @bind-Value="_showYear"></Switch>
66+
</BootstrapInputGroup>
67+
</div>
68+
<div class="col-12 col-sm-6 col-lg-4">
69+
<BootstrapInputGroup>
70+
<BootstrapInputGroupLabel DisplayText="@Localizer["ShowMonth"]" Width="150"></BootstrapInputGroupLabel>
71+
<Switch @bind-Value="_showMonth"></Switch>
72+
</BootstrapInputGroup>
73+
</div>
74+
<div class="col-12 col-sm-6 col-lg-4">
75+
<BootstrapInputGroup>
76+
<BootstrapInputGroupLabel DisplayText="@Localizer["ShowDay"]" Width="150"></BootstrapInputGroupLabel>
77+
<Switch @bind-Value="_showDay"></Switch>
78+
</BootstrapInputGroup>
79+
</div>
80+
<div class="col-12 col-sm-6 col-lg-4">
81+
<BootstrapInputGroup>
82+
<BootstrapInputGroupLabel DisplayText="@Localizer["ShowHour"]" Width="150"></BootstrapInputGroupLabel>
83+
<Switch @bind-Value="_showHour"></Switch>
84+
</BootstrapInputGroup>
85+
</div>
86+
<div class="col-12 col-sm-6 col-lg-4">
87+
<BootstrapInputGroup>
88+
<BootstrapInputGroupLabel DisplayText="@Localizer["ShowMinute"]" Width="150"></BootstrapInputGroupLabel>
89+
<Switch @bind-Value="_showMinute"></Switch>
90+
</BootstrapInputGroup>
91+
</div>
92+
<div class="col-12 col-sm-6 col-lg-4">
93+
<BootstrapInputGroup>
94+
<BootstrapInputGroupLabel DisplayText="@Localizer["ShowSecond"]" Width="150"></BootstrapInputGroupLabel>
95+
<Switch @bind-Value="_showSecond"></Switch>
96+
</BootstrapInputGroup>
97+
</div>
8298
</div>
8399
</GroupBox>
84100
</section>
85101
<FlipClock BackgroundColor="radial-gradient(ellipse at center, #ac85f1 0%, #833bf8 100%)" Height="@HeightValueString"
86102
FontSize="@FontSizeValueString" CardHeight="@CardHeightValueString" CardWidth="@CardWidthValueString"
87-
CardMargin="@CardMarginValueString" CardGroupMargin="@CardGroupMarginValueString"></FlipClock>
103+
CardMargin="@CardMarginValueString" CardGroupMargin="@CardGroupMarginValueString"
104+
ShowYear="_showYear" ShowMonth="_showMonth" ShowDay="_showDay"
105+
ShowHour="_showHour" ShowMinute="_showMinute" ShowSecond="_showSecond"></FlipClock>
88106
</DemoBlock>
89107

90108
<AttributeTable Items="@GetAttributes()" />

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@ public partial class FlipClocks
3636

3737

3838
private bool _isCompleted;
39+
private bool _showYear = false;
40+
private bool _showMonth = false;
41+
private bool _showDay = false;
42+
private bool _showHour = true;
43+
private bool _showMinute = true;
44+
private bool _showSecond = true;
3945

4046
private Task OnCompletedAsync()
4147
{
@@ -50,6 +56,14 @@ private Task OnCompletedAsync()
5056
/// <returns></returns>
5157
private AttributeItem[] GetAttributes() =>
5258
[
59+
new()
60+
{
61+
Name = nameof(FlipClock.ShowYear),
62+
Description = Localizer["ShowYear_Description"],
63+
Type = "boolean",
64+
ValueList = "true|false",
65+
DefaultValue = "false"
66+
},
5367
new()
5468
{
5569
Name = nameof(FlipClock.ShowMonth),

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

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6800,16 +6800,6 @@
68006800
"BootstrapBlazor.Server.Components.Samples.FlipClocks": {
68016801
"FlipClocksTitle": "FlipClock",
68026802
"FlipClocksDescription": "Used for website timing or countdown",
6803-
"BaseUsageText": "Basic usage",
6804-
"BaseUsageIntro": "Synchronize display of current time",
6805-
"ShowMonthText": "Show Month",
6806-
"ShowMonthIntro": "Display month information by setting <code>ShowMonth=\"true\"</code>",
6807-
"ShowDayText": "Show Day",
6808-
"ShowDayIntro": "Display day information by setting <code>ShowDay=\"true\"</code>",
6809-
"ShowMinuteText": "not display hours and minutes",
6810-
"ShowMinuteIntro": "By setting <code>ShowHour=\"false\"</code> <code>ShowMinute=\"false\"</code> to not display hour and minute information",
6811-
"ShowSecondText": "not display seconds",
6812-
"ShowSecondIntro": "By setting <code>ShowSecond=\"false\"</code> to display hour and minute information",
68136803
"CountText": "Counter",
68146804
"CountIntro": "By setting <code>ViewMode=\"FlipClockViewMode.Count\"</code> to enable the timer function, the start time can be set using <code>StartValue</code>",
68156805
"IsCountDownText": "CountDown",
@@ -6826,6 +6816,8 @@
68266816
"ShowDay_Description": "Show day",
68276817
"ShowHour_Description": "Show hour",
68286818
"ShowMinute_Description": "Show minute",
6819+
"ShowMonth_Description": "Show month",
6820+
"ShowYear_Description": "Show year",
68296821
"ViewMode_Description": "View mode",
68306822
"StartValue_Description": "Start time",
68316823
"OnCompletedAsync_Description": "Callback when timer completed",

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

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6800,16 +6800,6 @@
68006800
"BootstrapBlazor.Server.Components.Samples.FlipClocks": {
68016801
"FlipClocksTitle": "FlipClock 卡片翻转时钟",
68026802
"FlipClocksDescription": "用于网站计时,或者倒计时使用",
6803-
"BaseUsageText": "基本功能",
6804-
"BaseUsageIntro": "同步显示当前时间",
6805-
"ShowDayText": "显示日",
6806-
"ShowDayIntro": "通过设置 <code>ShowDay=\"true\"</code> 显示日信息",
6807-
"ShowMonthText": "显示月",
6808-
"ShowMonthIntro": "通过设置 <code>ShowMonth=\"true\"</code> 显示月信息",
6809-
"ShowMinuteText": "不显示时、分",
6810-
"ShowMinuteIntro": "通过设置 <code>ShowHour=\"false\"</code> <code>ShowMinute=\"false\"</code> 不显示小时、分钟信息",
6811-
"ShowSecondText": "不显示秒",
6812-
"ShowSecondIntro": "通过设置 <code>ShowSecond=\"false\"</code> 不显示秒信息",
68136803
"CountText": "计时器",
68146804
"CountIntro": "通过设置 <code>ViewMode=\"FlipClockViewMode.Count\"</code> 开启计时功能,开始时间使用 <code>StartValue</code> 设置",
68156805
"IsCountDownText": "倒计时",
@@ -6826,6 +6816,8 @@
68266816
"ShowDay_Description": "是否显示日",
68276817
"ShowHour_Description": "是否显示小时",
68286818
"ShowMinute_Description": "是否显示分钟",
6819+
"ShowMonth_Description": "是否显示月",
6820+
"ShowYear_Description": "是否显示年",
68296821
"ViewMode_Description": "显示模式",
68306822
"StartValue_Description": "开始时间",
68316823
"OnCompletedAsync_Description": "计时结束回调方法",

src/BootstrapBlazor/Components/FlipClock/FlipClock.razor

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,18 @@
11
@namespace BootstrapBlazor.Components
22
@inherits BootstrapModuleComponentBase
3-
@attribute [BootstrapModuleAutoLoader(JSObjectReference = true)]
3+
@attribute [BootstrapModuleAutoLoader(JSObjectReference = true, AutoInvokeDispose = false)]
44

55
<div @attributes="@AdditionalAttributes" class="@ClassString" style="@StyleString" id="@Id">
6+
@if (ShowYear)
7+
{
8+
<div class="bb-flip-clock-list year">
9+
@RenderItem(10)
10+
@RenderItem(10)
11+
@RenderItem(10)
12+
@RenderItem(10)
13+
</div>
14+
}
15+
616
@if (ShowMonth)
717
{
818
<div class="bb-flip-clock-list month">

src/BootstrapBlazor/Components/FlipClock/FlipClock.razor.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@ namespace BootstrapBlazor.Components;
1111
/// </summary>
1212
public partial class FlipClock
1313
{
14+
/// <summary>
15+
/// 获得/设置 是否显示 Year 默认 false
16+
/// </summary>
17+
[Parameter]
18+
public bool ShowYear { get; set; }
19+
1420
/// <summary>
1521
/// 获得/设置 是否显示 Month 默认 false
1622
/// </summary>

src/BootstrapBlazor/Components/FlipClock/FlipClock.razor.js

Lines changed: 55 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
import Data from "../../modules/data.js"
2-
3-
export function init(id, options) {
1+
export function init(id, options) {
42
options = {
53
...{
64
viewMode: 'DateTime',
@@ -14,75 +12,77 @@ export function init(id, options) {
1412
return;
1513
}
1614

17-
const listMonth = el.querySelector('.bb-flip-clock-list.month');
18-
const listDay = el.querySelector('.bb-flip-clock-list.day');
19-
const listHour = el.querySelector('.bb-flip-clock-list.hour');
20-
const listMinute = el.querySelector('.bb-flip-clock-list.minute');
21-
const listSecond = el.querySelector('.bb-flip-clock-list.second');
22-
const countDown = options.viewMode === "CountDown";
23-
15+
const lastValues = {};
2416
let counter = 0;
17+
let totalMilliseconds = 0;
18+
let countDown = false;
2519
const getDate = () => {
26-
let totalMilliseconds = 0;
27-
let now;
28-
29-
if (options.viewMode === "Count") {
30-
counter += 1000;
31-
totalMilliseconds = counter - options.startValue;
32-
}
33-
else if (countDown) {
34-
counter += 1000;
35-
totalMilliseconds = options.startValue - counter;
36-
if (totalMilliseconds < 0) totalMilliseconds = 0;
37-
}
38-
else {
39-
now = new Date();
20+
const view = options.viewMode;
21+
countDown = false;
22+
if (view === "DateTime") {
23+
const now = new Date();
4024
return {
25+
years: now.getFullYear(),
4126
months: now.getMonth() + 1,
4227
days: now.getDate(),
4328
hours: now.getHours(),
4429
minutes: now.getMinutes(),
4530
seconds: now.getSeconds()
4631
};
4732
}
33+
else if (view === "Count") {
34+
counter += 1000;
35+
totalMilliseconds = counter - options.startValue;
36+
}
37+
else if (view === "CountDown") {
38+
countDown = true;
39+
counter += 1000;
40+
totalMilliseconds = options.startValue - counter;
41+
if (totalMilliseconds < 0) totalMilliseconds = 0;
42+
}
4843

4944
const seconds = Math.floor(totalMilliseconds / 1000) % 60;
5045
const minutes = Math.floor(totalMilliseconds / (1000 * 60)) % 60;
5146
const hours = Math.floor(totalMilliseconds / (1000 * 60 * 60)) % 24;
5247
const days = Math.floor(totalMilliseconds / (1000 * 60 * 60 * 24));
53-
return { months, days, hours, minutes, seconds };
54-
}
48+
const months = 0;
49+
const years = 0;
50+
return { years, months, days, hours, minutes, seconds };
51+
};
52+
53+
const getConfig = () => [
54+
{ key: 'years', list: el.querySelector('.bb-flip-clock-list.year'), digits: 4 },
55+
{ key: 'months', list: el.querySelector('.bb-flip-clock-list.month'), digits: 2 },
56+
{ key: 'days', list: el.querySelector('.bb-flip-clock-list.day'), digits: 2 },
57+
{ key: 'hours', list: el.querySelector('.bb-flip-clock-list.hour'), digits: 2 },
58+
{ key: 'minutes', list: el.querySelector('.bb-flip-clock-list.minute'), digits: 2 },
59+
{ key: 'seconds', list: el.querySelector('.bb-flip-clock-list.second'), digits: 2 },
60+
];
61+
62+
const setDigits = (list, value, digits, countDown) => {
63+
list.classList.remove('flip');
64+
for (let i = 0; i < digits; i++) {
65+
const place = digits - 1 - i;
66+
const digit = Math.floor(value / 10 ** place) % 10;
67+
setFlip(list.children[i], digit, countDown);
68+
}
69+
list.classList.add('flip');
70+
};
5571

56-
let lastMonth;
57-
let lastDay;
58-
let lastHour;
59-
let lastMinute;
60-
let lastSecond;
6172
const go = () => {
62-
const { months, days, hours, minutes, seconds } = getDate();
63-
64-
if (lastSecond !== seconds) {
65-
lastSecond = seconds;
66-
setTime(listSecond, seconds, countDown);
67-
}
68-
if (lastMinute !== minutes) {
69-
lastMinute = minutes;
70-
setTime(listMinute, minutes, countDown);
71-
}
72-
if (lastHour !== hours) {
73-
lastHour = hours;
74-
setTime(listHour, hours, countDown);
75-
}
76-
if (lastDay !== days) {
77-
lastDay = days;
78-
setTime(listDay, days, countDown);
79-
}
80-
if (lastMonth !== months) {
81-
lastDay = days;
82-
setTime(listMonth, months, countDown);
83-
}
84-
return { months, days, hours, minutes, seconds }
85-
}
73+
const d = getDate();
74+
const unitConfig = getConfig();
75+
unitConfig.forEach(({ key, list, digits }) => {
76+
if (list === null) return;
77+
78+
const v = d[key];
79+
if (lastValues[key] !== v) {
80+
lastValues[key] = v;
81+
setDigits(list, v, digits, countDown);
82+
}
83+
});
84+
return d;
85+
};
8686

8787
let start = void 0
8888
let current;
@@ -105,28 +105,6 @@ export function init(id, options) {
105105
}
106106

107107
requestAnimationFrame(flip);
108-
Data.set(id, { el, options });
109-
}
110-
111-
export function dispose(id) {
112-
const clock = Data.get(id)
113-
if (clock) {
114-
115-
}
116-
}
117-
118-
const setTime = (list, time, countDown) => {
119-
if (list) {
120-
const leftIndex = Math.floor(time / 10);
121-
const rightIndex = time % 10;
122-
const leftFlip = list.children[0];
123-
const rightFlip = list.children[1];
124-
125-
list.classList.remove('flip');
126-
setFlip(leftFlip, leftIndex, countDown);
127-
setFlip(rightFlip, rightIndex, countDown);
128-
list.classList.add('flip');
129-
}
130108
}
131109

132110
const setFlip = (flip, index, countDown) => {

test/UnitTest/Components/FlipClockTest.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,19 @@ public void ShowMonth_Ok()
7272
cut.Contains("bb-flip-clock-list month");
7373
}
7474

75+
[Fact]
76+
public void ShowYear_Ok()
77+
{
78+
var cut = Context.RenderComponent<FlipClock>();
79+
cut.DoesNotContain("bb-flip-clock-list year");
80+
81+
cut.SetParametersAndRender(pb =>
82+
{
83+
pb.Add(a => a.ShowYear, true);
84+
});
85+
cut.Contains("bb-flip-clock-list year");
86+
}
87+
7588
[Fact]
7689
public async Task ViewMode_Ok()
7790
{

0 commit comments

Comments
 (0)