diff --git a/src/BootstrapBlazor.Server/Components/Samples/FlipClocks.razor b/src/BootstrapBlazor.Server/Components/Samples/FlipClocks.razor index 9016122df87..6de934cdfe8 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/FlipClocks.razor +++ b/src/BootstrapBlazor.Server/Components/Samples/FlipClocks.razor @@ -5,26 +5,6 @@

@((MarkupString)Localizer["FlipClocksDescription"].Value)

- - - - - - - - - - - - - - - - - - - - @@ -79,12 +59,50 @@ +
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+ CardMargin="@CardMarginValueString" CardGroupMargin="@CardGroupMarginValueString" + ShowYear="_showYear" ShowMonth="_showMonth" ShowDay="_showDay" + ShowHour="_showHour" ShowMinute="_showMinute" ShowSecond="_showSecond"> diff --git a/src/BootstrapBlazor.Server/Components/Samples/FlipClocks.razor.cs b/src/BootstrapBlazor.Server/Components/Samples/FlipClocks.razor.cs index 9c83203f87c..b46e61fd54b 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/FlipClocks.razor.cs +++ b/src/BootstrapBlazor.Server/Components/Samples/FlipClocks.razor.cs @@ -36,6 +36,12 @@ public partial class FlipClocks private bool _isCompleted; + private bool _showYear = false; + private bool _showMonth = false; + private bool _showDay = false; + private bool _showHour = true; + private bool _showMinute = true; + private bool _showSecond = true; private Task OnCompletedAsync() { @@ -50,6 +56,14 @@ private Task OnCompletedAsync() /// private AttributeItem[] GetAttributes() => [ + new() + { + Name = nameof(FlipClock.ShowYear), + Description = Localizer["ShowYear_Description"], + Type = "boolean", + ValueList = "true|false", + DefaultValue = "false" + }, new() { Name = nameof(FlipClock.ShowMonth), diff --git a/src/BootstrapBlazor.Server/Locales/en-US.json b/src/BootstrapBlazor.Server/Locales/en-US.json index 107c69359b9..5e7e872e03f 100644 --- a/src/BootstrapBlazor.Server/Locales/en-US.json +++ b/src/BootstrapBlazor.Server/Locales/en-US.json @@ -6800,16 +6800,6 @@ "BootstrapBlazor.Server.Components.Samples.FlipClocks": { "FlipClocksTitle": "FlipClock", "FlipClocksDescription": "Used for website timing or countdown", - "BaseUsageText": "Basic usage", - "BaseUsageIntro": "Synchronize display of current time", - "ShowMonthText": "Show Month", - "ShowMonthIntro": "Display month information by setting ShowMonth=\"true\"", - "ShowDayText": "Show Day", - "ShowDayIntro": "Display day information by setting ShowDay=\"true\"", - "ShowMinuteText": "not display hours and minutes", - "ShowMinuteIntro": "By setting ShowHour=\"false\" ShowMinute=\"false\" to not display hour and minute information", - "ShowSecondText": "not display seconds", - "ShowSecondIntro": "By setting ShowSecond=\"false\" to display hour and minute information", "CountText": "Counter", "CountIntro": "By setting ViewMode=\"FlipClockViewMode.Count\" to enable the timer function, the start time can be set using StartValue", "IsCountDownText": "CountDown", @@ -6826,6 +6816,8 @@ "ShowDay_Description": "Show day", "ShowHour_Description": "Show hour", "ShowMinute_Description": "Show minute", + "ShowMonth_Description": "Show month", + "ShowYear_Description": "Show year", "ViewMode_Description": "View mode", "StartValue_Description": "Start time", "OnCompletedAsync_Description": "Callback when timer completed", diff --git a/src/BootstrapBlazor.Server/Locales/zh-CN.json b/src/BootstrapBlazor.Server/Locales/zh-CN.json index 4b64a8615fa..bfe6a152588 100644 --- a/src/BootstrapBlazor.Server/Locales/zh-CN.json +++ b/src/BootstrapBlazor.Server/Locales/zh-CN.json @@ -6800,16 +6800,6 @@ "BootstrapBlazor.Server.Components.Samples.FlipClocks": { "FlipClocksTitle": "FlipClock 卡片翻转时钟", "FlipClocksDescription": "用于网站计时,或者倒计时使用", - "BaseUsageText": "基本功能", - "BaseUsageIntro": "同步显示当前时间", - "ShowDayText": "显示日", - "ShowDayIntro": "通过设置 ShowDay=\"true\" 显示日信息", - "ShowMonthText": "显示月", - "ShowMonthIntro": "通过设置 ShowMonth=\"true\" 显示月信息", - "ShowMinuteText": "不显示时、分", - "ShowMinuteIntro": "通过设置 ShowHour=\"false\" ShowMinute=\"false\" 不显示小时、分钟信息", - "ShowSecondText": "不显示秒", - "ShowSecondIntro": "通过设置 ShowSecond=\"false\" 不显示秒信息", "CountText": "计时器", "CountIntro": "通过设置 ViewMode=\"FlipClockViewMode.Count\" 开启计时功能,开始时间使用 StartValue 设置", "IsCountDownText": "倒计时", @@ -6826,6 +6816,8 @@ "ShowDay_Description": "是否显示日", "ShowHour_Description": "是否显示小时", "ShowMinute_Description": "是否显示分钟", + "ShowMonth_Description": "是否显示月", + "ShowYear_Description": "是否显示年", "ViewMode_Description": "显示模式", "StartValue_Description": "开始时间", "OnCompletedAsync_Description": "计时结束回调方法", diff --git a/src/BootstrapBlazor/Components/FlipClock/FlipClock.razor b/src/BootstrapBlazor/Components/FlipClock/FlipClock.razor index 83fdca59cef..0e538119cfa 100644 --- a/src/BootstrapBlazor/Components/FlipClock/FlipClock.razor +++ b/src/BootstrapBlazor/Components/FlipClock/FlipClock.razor @@ -1,8 +1,18 @@ @namespace BootstrapBlazor.Components @inherits BootstrapModuleComponentBase -@attribute [BootstrapModuleAutoLoader(JSObjectReference = true)] +@attribute [BootstrapModuleAutoLoader(JSObjectReference = true, AutoInvokeDispose = false)]
+ @if (ShowYear) + { +
+ @RenderItem(10) + @RenderItem(10) + @RenderItem(10) + @RenderItem(10) +
+ } + @if (ShowMonth) {
diff --git a/src/BootstrapBlazor/Components/FlipClock/FlipClock.razor.cs b/src/BootstrapBlazor/Components/FlipClock/FlipClock.razor.cs index 7b85496338a..39d423353f8 100644 --- a/src/BootstrapBlazor/Components/FlipClock/FlipClock.razor.cs +++ b/src/BootstrapBlazor/Components/FlipClock/FlipClock.razor.cs @@ -11,6 +11,12 @@ namespace BootstrapBlazor.Components; /// public partial class FlipClock { + /// + /// 获得/设置 是否显示 Year 默认 false + /// + [Parameter] + public bool ShowYear { get; set; } + /// /// 获得/设置 是否显示 Month 默认 false /// diff --git a/src/BootstrapBlazor/Components/FlipClock/FlipClock.razor.js b/src/BootstrapBlazor/Components/FlipClock/FlipClock.razor.js index 7b71dbf7ef4..9176f0f55c3 100644 --- a/src/BootstrapBlazor/Components/FlipClock/FlipClock.razor.js +++ b/src/BootstrapBlazor/Components/FlipClock/FlipClock.razor.js @@ -1,6 +1,4 @@ -import Data from "../../modules/data.js" - -export function init(id, options) { +export function init(id, options) { options = { ...{ viewMode: 'DateTime', @@ -14,30 +12,17 @@ export function init(id, options) { return; } - const listMonth = el.querySelector('.bb-flip-clock-list.month'); - const listDay = el.querySelector('.bb-flip-clock-list.day'); - const listHour = el.querySelector('.bb-flip-clock-list.hour'); - const listMinute = el.querySelector('.bb-flip-clock-list.minute'); - const listSecond = el.querySelector('.bb-flip-clock-list.second'); - const countDown = options.viewMode === "CountDown"; - + const lastValues = {}; let counter = 0; + let totalMilliseconds = 0; + let countDown = false; const getDate = () => { - let totalMilliseconds = 0; - let now; - - if (options.viewMode === "Count") { - counter += 1000; - totalMilliseconds = counter - options.startValue; - } - else if (countDown) { - counter += 1000; - totalMilliseconds = options.startValue - counter; - if (totalMilliseconds < 0) totalMilliseconds = 0; - } - else { - now = new Date(); + const view = options.viewMode; + countDown = false; + if (view === "DateTime") { + const now = new Date(); return { + years: now.getFullYear(), months: now.getMonth() + 1, days: now.getDate(), hours: now.getHours(), @@ -45,44 +30,59 @@ export function init(id, options) { seconds: now.getSeconds() }; } + else if (view === "Count") { + counter += 1000; + totalMilliseconds = counter - options.startValue; + } + else if (view === "CountDown") { + countDown = true; + counter += 1000; + totalMilliseconds = options.startValue - counter; + if (totalMilliseconds < 0) totalMilliseconds = 0; + } const seconds = Math.floor(totalMilliseconds / 1000) % 60; const minutes = Math.floor(totalMilliseconds / (1000 * 60)) % 60; const hours = Math.floor(totalMilliseconds / (1000 * 60 * 60)) % 24; const days = Math.floor(totalMilliseconds / (1000 * 60 * 60 * 24)); - return { months, days, hours, minutes, seconds }; - } + const months = 0; + const years = 0; + return { years, months, days, hours, minutes, seconds }; + }; + + const getConfig = () => [ + { key: 'years', list: el.querySelector('.bb-flip-clock-list.year'), digits: 4 }, + { key: 'months', list: el.querySelector('.bb-flip-clock-list.month'), digits: 2 }, + { key: 'days', list: el.querySelector('.bb-flip-clock-list.day'), digits: 2 }, + { key: 'hours', list: el.querySelector('.bb-flip-clock-list.hour'), digits: 2 }, + { key: 'minutes', list: el.querySelector('.bb-flip-clock-list.minute'), digits: 2 }, + { key: 'seconds', list: el.querySelector('.bb-flip-clock-list.second'), digits: 2 }, + ]; + + const setDigits = (list, value, digits, countDown) => { + list.classList.remove('flip'); + for (let i = 0; i < digits; i++) { + const place = digits - 1 - i; + const digit = Math.floor(value / 10 ** place) % 10; + setFlip(list.children[i], digit, countDown); + } + list.classList.add('flip'); + }; - let lastMonth; - let lastDay; - let lastHour; - let lastMinute; - let lastSecond; const go = () => { - const { months, days, hours, minutes, seconds } = getDate(); - - if (lastSecond !== seconds) { - lastSecond = seconds; - setTime(listSecond, seconds, countDown); - } - if (lastMinute !== minutes) { - lastMinute = minutes; - setTime(listMinute, minutes, countDown); - } - if (lastHour !== hours) { - lastHour = hours; - setTime(listHour, hours, countDown); - } - if (lastDay !== days) { - lastDay = days; - setTime(listDay, days, countDown); - } - if (lastMonth !== months) { - lastDay = days; - setTime(listMonth, months, countDown); - } - return { months, days, hours, minutes, seconds } - } + const d = getDate(); + const unitConfig = getConfig(); + unitConfig.forEach(({ key, list, digits }) => { + if (list === null) return; + + const v = d[key]; + if (lastValues[key] !== v) { + lastValues[key] = v; + setDigits(list, v, digits, countDown); + } + }); + return d; + }; let start = void 0 let current; @@ -105,28 +105,6 @@ export function init(id, options) { } requestAnimationFrame(flip); - Data.set(id, { el, options }); -} - -export function dispose(id) { - const clock = Data.get(id) - if (clock) { - - } -} - -const setTime = (list, time, countDown) => { - if (list) { - const leftIndex = Math.floor(time / 10); - const rightIndex = time % 10; - const leftFlip = list.children[0]; - const rightFlip = list.children[1]; - - list.classList.remove('flip'); - setFlip(leftFlip, leftIndex, countDown); - setFlip(rightFlip, rightIndex, countDown); - list.classList.add('flip'); - } } const setFlip = (flip, index, countDown) => { diff --git a/test/UnitTest/Components/FlipClockTest.cs b/test/UnitTest/Components/FlipClockTest.cs index eb1f4c65c1b..57a64a663ab 100644 --- a/test/UnitTest/Components/FlipClockTest.cs +++ b/test/UnitTest/Components/FlipClockTest.cs @@ -72,6 +72,19 @@ public void ShowMonth_Ok() cut.Contains("bb-flip-clock-list month"); } + [Fact] + public void ShowYear_Ok() + { + var cut = Context.RenderComponent(); + cut.DoesNotContain("bb-flip-clock-list year"); + + cut.SetParametersAndRender(pb => + { + pb.Add(a => a.ShowYear, true); + }); + cut.Contains("bb-flip-clock-list year"); + } + [Fact] public async Task ViewMode_Ok() {