From 6eeafde6b0593b68c674bb5f372d4d07b6ac09bc Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Wed, 13 Aug 2025 16:46:51 +0800 Subject: [PATCH 01/12] =?UTF-8?q?chore:=20=E5=A2=9E=E5=8A=A0=20TaskDashboa?= =?UTF-8?q?rd=20=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BootstrapBlazor.Extensions.sln | 9 ++++- .../BootstrapBlazor.Tasks.Dashboard.csproj | 33 +++++++++++++++++++ .../Locales/en-US.json | 3 ++ .../Locales/zh-CN.json | 3 ++ .../TaskDashboard.razor | 16 +++++++++ .../TaskDashboard.razor.cs | 33 +++++++++++++++++++ .../TaskDashboard.razor.css | 6 ++++ .../_Imports.razor | 2 ++ 8 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 src/components/BootstrapBlazor.Tasks.Dashboard/BootstrapBlazor.Tasks.Dashboard.csproj create mode 100644 src/components/BootstrapBlazor.Tasks.Dashboard/Locales/en-US.json create mode 100644 src/components/BootstrapBlazor.Tasks.Dashboard/Locales/zh-CN.json create mode 100644 src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor create mode 100644 src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor.cs create mode 100644 src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor.css create mode 100644 src/components/BootstrapBlazor.Tasks.Dashboard/_Imports.razor diff --git a/BootstrapBlazor.Extensions.sln b/BootstrapBlazor.Extensions.sln index 1f62ca72..7dbcbca8 100644 --- a/BootstrapBlazor.Extensions.sln +++ b/BootstrapBlazor.Extensions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 18 -VisualStudioVersion = 18.0.10828.68 main +VisualStudioVersion = 18.0.10828.68 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "components", "components", "{FF1089BE-C704-4374-B629-C57C08E1798F}" EndProject @@ -200,6 +200,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BootstrapBlazor.OpcDa", "sr EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTestOpcDa", "test\UnitTestOpcDa\UnitTestOpcDa.csproj", "{835C8BA9-A9CC-4EA0-9002-34A20F8B2E86}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BootstrapBlazor.Tasks.Dashboard", "src\components\BootstrapBlazor.Tasks.Dashboard\BootstrapBlazor.Tasks.Dashboard.csproj", "{30C57119-C564-401C-AE3A-6203E2733E1A}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -546,6 +548,10 @@ Global {835C8BA9-A9CC-4EA0-9002-34A20F8B2E86}.Debug|Any CPU.Build.0 = Debug|Any CPU {835C8BA9-A9CC-4EA0-9002-34A20F8B2E86}.Release|Any CPU.ActiveCfg = Release|Any CPU {835C8BA9-A9CC-4EA0-9002-34A20F8B2E86}.Release|Any CPU.Build.0 = Release|Any CPU + {30C57119-C564-401C-AE3A-6203E2733E1A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {30C57119-C564-401C-AE3A-6203E2733E1A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {30C57119-C564-401C-AE3A-6203E2733E1A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {30C57119-C564-401C-AE3A-6203E2733E1A}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -640,6 +646,7 @@ Global {98373A64-E224-4715-AE02-A8C6DAFF3338} = {B6A98ADE-D26A-4D0B-8978-AB7AC915F5AE} {01007B10-7C3C-4136-83FF-981CA39AD3D4} = {7B29E81D-92DE-46C8-8EDC-1B48C8F12BC2} {835C8BA9-A9CC-4EA0-9002-34A20F8B2E86} = {B6A98ADE-D26A-4D0B-8978-AB7AC915F5AE} + {30C57119-C564-401C-AE3A-6203E2733E1A} = {FF1089BE-C704-4374-B629-C57C08E1798F} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {D5EB1960-6F30-4CE1-B375-EAE1F787D6FF} diff --git a/src/components/BootstrapBlazor.Tasks.Dashboard/BootstrapBlazor.Tasks.Dashboard.csproj b/src/components/BootstrapBlazor.Tasks.Dashboard/BootstrapBlazor.Tasks.Dashboard.csproj new file mode 100644 index 00000000..a11d58f3 --- /dev/null +++ b/src/components/BootstrapBlazor.Tasks.Dashboard/BootstrapBlazor.Tasks.Dashboard.csproj @@ -0,0 +1,33 @@ + + + + 9.0.0-beta01 + + + + Bootstrap Blazor WebAssembly wasm UI Components Task Dashboard + Bootstrap UI components extensions of Task + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components/BootstrapBlazor.Tasks.Dashboard/Locales/en-US.json b/src/components/BootstrapBlazor.Tasks.Dashboard/Locales/en-US.json new file mode 100644 index 00000000..0db3279e --- /dev/null +++ b/src/components/BootstrapBlazor.Tasks.Dashboard/Locales/en-US.json @@ -0,0 +1,3 @@ +{ + +} diff --git a/src/components/BootstrapBlazor.Tasks.Dashboard/Locales/zh-CN.json b/src/components/BootstrapBlazor.Tasks.Dashboard/Locales/zh-CN.json new file mode 100644 index 00000000..0db3279e --- /dev/null +++ b/src/components/BootstrapBlazor.Tasks.Dashboard/Locales/zh-CN.json @@ -0,0 +1,3 @@ +{ + +} diff --git a/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor new file mode 100644 index 00000000..636ebe6a --- /dev/null +++ b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor @@ -0,0 +1,16 @@ +@namespace BootstrapBlazor.Components +@inherits BootstrapComponentBase + +
+ + + + + + + + + + +
+
diff --git a/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor.cs b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor.cs new file mode 100644 index 00000000..c5826018 --- /dev/null +++ b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor.cs @@ -0,0 +1,33 @@ +// Copyright (c) Argo Zhang (argo@163.com). All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Website: https://www.blazor.zone or https://argozhang.github.io/ + +using Microsoft.AspNetCore.Components; +using Microsoft.Extensions.Localization; + +namespace BootstrapBlazor.Components; + +/// +/// Task Dashboard Component +/// +public partial class TaskDashboard +{ + [Inject, NotNull] + private IStringLocalizer? Localizer { get; set; } + + private string? ClassString => CssBuilder.Default("bb-tasks-dashboard") + .AddClassFromAttributes(AdditionalAttributes) + .Build(); + + private IEnumerable _schedulers = []; + + /// + /// + /// + protected override void OnParametersSet() + { + base.OnParametersSet(); + + _schedulers = TaskServicesManager.ToList(); + } +} diff --git a/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor.css b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor.css new file mode 100644 index 00000000..c6afca40 --- /dev/null +++ b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor.css @@ -0,0 +1,6 @@ +.my-component { + border: 2px dashed red; + padding: 1em; + margin: 1em 0; + background-image: url('background.png'); +} diff --git a/src/components/BootstrapBlazor.Tasks.Dashboard/_Imports.razor b/src/components/BootstrapBlazor.Tasks.Dashboard/_Imports.razor new file mode 100644 index 00000000..f839b296 --- /dev/null +++ b/src/components/BootstrapBlazor.Tasks.Dashboard/_Imports.razor @@ -0,0 +1,2 @@ +@using Microsoft.AspNetCore.Components.Web +@using Longbow.Tasks From 6daed5052ead1430533284448aca4108f1bd5251 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Wed, 13 Aug 2025 18:58:02 +0800 Subject: [PATCH 02/12] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TaskDashboard.razor | 62 ++++++++++++-- .../TaskDashboard.razor.cs | 80 +++++++++++++++++- .../TaskInfo.razor | 3 + .../TaskInfo.razor.cs | 84 +++++++++++++++++++ .../_Imports.razor | 3 +- 5 files changed, 221 insertions(+), 11 deletions(-) create mode 100644 src/components/BootstrapBlazor.Tasks.Dashboard/TaskInfo.razor create mode 100644 src/components/BootstrapBlazor.Tasks.Dashboard/TaskInfo.razor.cs diff --git a/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor index 636ebe6a..b1787a65 100644 --- a/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor +++ b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor @@ -1,16 +1,60 @@ -@namespace BootstrapBlazor.Components +@namespace BootstrapBlazor.Components.Tasks @inherits BootstrapComponentBase
- +
- - - - - - - + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor.cs b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor.cs index c5826018..00d44640 100644 --- a/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor.cs +++ b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor.cs @@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Components; using Microsoft.Extensions.Localization; -namespace BootstrapBlazor.Components; +namespace BootstrapBlazor.Components.Tasks; /// /// Task Dashboard Component @@ -15,6 +15,9 @@ public partial class TaskDashboard [Inject, NotNull] private IStringLocalizer? Localizer { get; set; } + [Inject, NotNull] + private DialogService? DialogService { get; set; } + private string? ClassString => CssBuilder.Default("bb-tasks-dashboard") .AddClassFromAttributes(AdditionalAttributes) .Build(); @@ -30,4 +33,79 @@ protected override void OnParametersSet() _schedulers = TaskServicesManager.ToList(); } + + private static Color GetStatusColor(SchedulerStatus status) => status switch + { + SchedulerStatus.Running => Color.Success, + SchedulerStatus.Ready => Color.Primary, + _ => Color.Danger + }; + + private string FormatStatus(SchedulerStatus status) => status switch + { + SchedulerStatus.Running => Localizer["SchedulerStatus.Running"], + SchedulerStatus.Ready => Localizer["SchedulerStatus.Ready"], + _ => Localizer["SchedulerStatus.Disabled"] + }; + + private static string GetStatusIcon(SchedulerStatus status) => status switch + { + SchedulerStatus.Running => "fa-solid fa-play-circle", + SchedulerStatus.Ready => "fa-solid fa-stop-circle", + _ => "fa-solid fa-times-circle" + }; + + private static Color GetResultColor(TriggerResult result) => result switch + { + TriggerResult.Running => Color.Primary, + TriggerResult.Success => Color.Success, + TriggerResult.Cancelled => Color.Dark, + TriggerResult.Timeout => Color.Warning, + _ => Color.Danger, + }; + + private string FormatResult(TriggerResult result) => result switch + { + TriggerResult.Running => Localizer["TriggerResult.Running"], + TriggerResult.Success => Localizer["TriggerResult.Success"], + TriggerResult.Cancelled => Localizer["TriggerResult.Timeout"], + TriggerResult.Timeout => Localizer["TriggerResult.Timeout"], + _ => Localizer["TriggerResult.Error"], + }; + + private static Task OnPause(IScheduler scheduler) + { + scheduler.Status = SchedulerStatus.Ready; + return Task.CompletedTask; + } + + private static Task OnRun(IScheduler scheduler) + { + scheduler.Status = SchedulerStatus.Running; + return Task.CompletedTask; + } + + private async Task OnLog(IScheduler scheduler) + { + var option = new DialogOption() + { + Class = "modal-dialog-task", + Title = Localizer["LogDilaogTitle", scheduler.Name], + Component = BootstrapDynamicComponent.CreateComponent(new Dictionary + { + [nameof(TaskInfo.Scheduler)] = scheduler, + [nameof(TaskInfo.HeaderText)] = Localizer["LogDilaogConsoleHeaderText"].Value + }) + }; + await DialogService.Show(option); + } + + private static bool OnCheckTaskStatus(IScheduler model) => model.Status != SchedulerStatus.Running; + + private static string? FormatDateTime(DateTimeOffset? dateTime) => dateTime?.ToString("yyyy-MM-dd HH:mm:ss"); + + private Task OnShowException(Exception ex) + { + return Task.CompletedTask; + } } diff --git a/src/components/BootstrapBlazor.Tasks.Dashboard/TaskInfo.razor b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskInfo.razor new file mode 100644 index 00000000..d7003186 --- /dev/null +++ b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskInfo.razor @@ -0,0 +1,3 @@ +@namespace BootstrapBlazor.Components.Tasks + + diff --git a/src/components/BootstrapBlazor.Tasks.Dashboard/TaskInfo.razor.cs b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskInfo.razor.cs new file mode 100644 index 00000000..949cf458 --- /dev/null +++ b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskInfo.razor.cs @@ -0,0 +1,84 @@ +// Copyright (c) Argo Zhang (argo@163.com). All rights reserved. +// Licensed under the LGPL License, Version 3.0. See License.txt in the project root for license information. +// Website: https://admin.blazor.zone + +using Microsoft.AspNetCore.Components; + +namespace BootstrapBlazor.Components.Tasks; + +/// +/// TaskInfo 组件 +/// +public partial class TaskInfo : IDisposable +{ + /// + /// 获得/设置 实例 + /// + [Parameter] + [NotNull] + [EditorRequired] + public IScheduler? Scheduler { get; set; } + + /// + /// 获得/设置 日志窗口标题文本 + /// + [Parameter] + public string? HeaderText { get; set; } + + private List Messages { get; } = new(24); + + /// + /// + /// + /// + /// + protected override async Task OnAfterRenderAsync(bool firstRender) + { + await base.OnAfterRenderAsync(firstRender); + + if (firstRender) + { + var sche = TaskServicesManager.Get(Scheduler.Name); + if (sche != null) + { + sche.Triggers.First().PulseCallback = async t => await DispatchMessage(t); + await DispatchMessage(sche.Triggers.First()); + } + } + } + + private async Task DispatchMessage(ITrigger trigger) + { + var message = $"Trigger({trigger.GetType().Name}) LastRuntime: {trigger.LastRuntime} Run({trigger.LastResult}) NextRuntime: {trigger.NextRuntime} Elapsed: {trigger.LastRunElapsedTime.TotalSeconds}"; + Messages.Add(new ConsoleMessageItem() + { + Message = message + }); + if (Messages.Count > 20) + { + Messages.RemoveAt(0); + } + await InvokeAsync(StateHasChanged); + } + + private void Dispose(bool disposing) + { + if (disposing) + { + var sche = TaskServicesManager.Get(Scheduler.Name); + if (sche != null) + { + sche.Triggers.First().PulseCallback = null; + } + } + } + + /// + /// + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } +} diff --git a/src/components/BootstrapBlazor.Tasks.Dashboard/_Imports.razor b/src/components/BootstrapBlazor.Tasks.Dashboard/_Imports.razor index f839b296..ea98a2fd 100644 --- a/src/components/BootstrapBlazor.Tasks.Dashboard/_Imports.razor +++ b/src/components/BootstrapBlazor.Tasks.Dashboard/_Imports.razor @@ -1,2 +1,3 @@ -@using Microsoft.AspNetCore.Components.Web +@using BootstrapBlazor.Components +@using Microsoft.AspNetCore.Components.Web @using Longbow.Tasks From 0d861cb02d9e7142ba46b75e6ae04c874b963bdb Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Wed, 13 Aug 2025 19:09:35 +0800 Subject: [PATCH 03/12] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E5=BC=B9=E7=AA=97=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Locales/en-US.json | 25 +++++++++++++++++-- .../Locales/zh-CN.json | 25 +++++++++++++++++-- .../TaskDashboard.razor | 11 +++----- .../TaskDashboard.razor.cs | 4 ++- 4 files changed, 52 insertions(+), 13 deletions(-) diff --git a/src/components/BootstrapBlazor.Tasks.Dashboard/Locales/en-US.json b/src/components/BootstrapBlazor.Tasks.Dashboard/Locales/en-US.json index 0db3279e..490759a1 100644 --- a/src/components/BootstrapBlazor.Tasks.Dashboard/Locales/en-US.json +++ b/src/components/BootstrapBlazor.Tasks.Dashboard/Locales/en-US.json @@ -1,3 +1,24 @@ -{ - +{ + "BootstrapBlazor.Components.Tasks.TaskDashboard": { + "Name": "Name", + "Status": "Status", + "NextRuntime": "NextRuntime", + "LastRuntime": "LastRuntime", + "LastRunResult": "LastRunResult", + "Exception": "Exception", + "Operation": "Operation", + "SchedulerStatus.Running": "Running", + "SchedulerStatus.Ready": "Ready", + "SchedulerStatus.Disabled": "Disabled", + "TriggerResult.Running": "Running", + "TriggerResult.Success": "Success", + "TriggerResult.Cancelled": "Cancelled", + "TriggerResult.Timeout": "Timeout", + "TriggerResult.Error": "Error", + "ButtonPause": "Pause", + "ButtonRun": "Run", + "ButtonLog": "Log", + "LogDilaogTitle": "{0} - Log(Latest 20 Items)", + "LogDilaogConsoleHeaderText": "Action Log" + } } diff --git a/src/components/BootstrapBlazor.Tasks.Dashboard/Locales/zh-CN.json b/src/components/BootstrapBlazor.Tasks.Dashboard/Locales/zh-CN.json index 0db3279e..cca1c0a7 100644 --- a/src/components/BootstrapBlazor.Tasks.Dashboard/Locales/zh-CN.json +++ b/src/components/BootstrapBlazor.Tasks.Dashboard/Locales/zh-CN.json @@ -1,3 +1,24 @@ -{ - +{ + "BootstrapBlazor.Components.Tasks.TaskDashboard": { + "Name": "名称", + "Status": "调度状态", + "NextRuntime": "下次运行时间", + "LastRuntime": "上次运行时间", + "LastRunResult": "上次结果", + "Exception": "异常", + "Operation": "操作", + "SchedulerStatus.Running": "运行中", + "SchedulerStatus.Ready": "已停止", + "SchedulerStatus.Disabled": "禁用", + "TriggerResult.Running": "运行", + "TriggerResult.Success": "成功", + "TriggerResult.Cancelled": "取消", + "TriggerResult.Timeout": "超时", + "TriggerResult.Error": "故障", + "ButtonPause": "暂停", + "ButtonRun": "运行", + "ButtonLog": "日志", + "LogDilaogTitle": "{0} - 日志窗口(最新 20 条)", + "LogDilaogConsoleHeaderText": "执行日志" + } } diff --git a/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor index b1787a65..7ecda34b 100644 --- a/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor +++ b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor @@ -29,11 +29,6 @@ @FormatResult(v.Row.LastRunResult) - - - - + - + From d4c10509ffa034f1f1e493cabb6cf59d41a94898 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Wed, 13 Aug 2025 19:41:47 +0800 Subject: [PATCH 05/12] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E6=98=8E=E7=BB=86=E5=BC=B9=E7=AA=97=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Locales/en-US.json | 3 ++- .../Locales/zh-CN.json | 3 ++- .../TaskDashboard.razor | 4 ++-- .../TaskDashboard.razor.cs | 16 +++++++++++++--- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/components/BootstrapBlazor.Tasks.Dashboard/Locales/en-US.json b/src/components/BootstrapBlazor.Tasks.Dashboard/Locales/en-US.json index 490759a1..3cb9ad1b 100644 --- a/src/components/BootstrapBlazor.Tasks.Dashboard/Locales/en-US.json +++ b/src/components/BootstrapBlazor.Tasks.Dashboard/Locales/en-US.json @@ -19,6 +19,7 @@ "ButtonRun": "Run", "ButtonLog": "Log", "LogDilaogTitle": "{0} - Log(Latest 20 Items)", - "LogDilaogConsoleHeaderText": "Action Log" + "LogDilaogConsoleHeaderText": "Action Log", + "ExceptionDilaogTitle": "{0} - Exception Detail" } } diff --git a/src/components/BootstrapBlazor.Tasks.Dashboard/Locales/zh-CN.json b/src/components/BootstrapBlazor.Tasks.Dashboard/Locales/zh-CN.json index cca1c0a7..204978cd 100644 --- a/src/components/BootstrapBlazor.Tasks.Dashboard/Locales/zh-CN.json +++ b/src/components/BootstrapBlazor.Tasks.Dashboard/Locales/zh-CN.json @@ -19,6 +19,7 @@ "ButtonRun": "运行", "ButtonLog": "日志", "LogDilaogTitle": "{0} - 日志窗口(最新 20 条)", - "LogDilaogConsoleHeaderText": "执行日志" + "LogDilaogConsoleHeaderText": "执行日志", + "ExceptionDilaogTitle": "{0} - 异常明细" } } diff --git a/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor index 923d791f..f40c70ac 100644 --- a/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor +++ b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor @@ -31,10 +31,10 @@ diff --git a/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor.cs b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor.cs index 425c1a47..5602e4b0 100644 --- a/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor.cs +++ b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor.cs @@ -89,7 +89,7 @@ private async Task OnLog(IScheduler scheduler) { var option = new DialogOption() { - Class = "modal-dialog-task", + Class = "modal-dialog-task-log", Title = Localizer["LogDilaogTitle", scheduler.Name], Component = BootstrapDynamicComponent.CreateComponent(new Dictionary { @@ -106,8 +106,18 @@ private async Task OnLog(IScheduler scheduler) private static string? FormatDateTime(DateTimeOffset? dateTime) => dateTime?.ToString("yyyy-MM-dd HH:mm:ss"); - private Task OnShowException(Exception ex) + private async Task OnShowException(IScheduler scheduler, Exception ex) { - return Task.CompletedTask; + ex = new Exception("test"); + var option = new DialogOption() + { + Class = "modal-dialog-task-ex", + IsScrolling = true, + Title = Localizer["ExceptionDilaogTitle", scheduler.Name], + BodyTemplate = RenderException(ex) + }; + await DialogService.Show(option); } + + private static RenderFragment RenderException(Exception ex) => builder => builder.AddContent(0, ex.FormatMarkupString()); } From 9a3f70edbc8d70d5c94433b433aa9dee94f6bc1f Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Wed, 13 Aug 2025 19:43:30 +0800 Subject: [PATCH 06/12] =?UTF-8?q?refactor:=20=E7=A7=BB=E9=99=A4=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor | 2 +- .../BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor.cs | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor index f40c70ac..f4f71833 100644 --- a/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor +++ b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor @@ -31,7 +31,7 @@ - + diff --git a/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor.cs b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor.cs index 522c86d3..343b3b8c 100644 --- a/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor.cs +++ b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskDashboard.razor.cs @@ -90,11 +90,11 @@ private async Task OnLog(IScheduler scheduler) var option = new DialogOption() { Class = "modal-dialog-task-log", - Title = Localizer["LogDilaogTitle", scheduler.Name], + Title = Localizer["LogDialogTitle", scheduler.Name], Component = BootstrapDynamicComponent.CreateComponent(new Dictionary { [nameof(TaskInfo.Scheduler)] = scheduler, - [nameof(TaskInfo.HeaderText)] = Localizer["LogDilaogConsoleHeaderText"].Value + [nameof(TaskInfo.HeaderText)] = Localizer["LogDialogConsoleHeaderText"].Value }) }; await DialogService.Show(option); @@ -112,7 +112,7 @@ private async Task OnShowException(IScheduler scheduler, Exception ex) { Class = "modal-dialog-task-ex", IsScrolling = true, - Title = Localizer["ExceptionDilaogTitle", scheduler.Name], + Title = Localizer["ExceptionDialogTitle", scheduler.Name], BodyTemplate = RenderException(ex) }; await DialogService.Show(option); From 05915a68b261558951a2b8bf9fbe56ee9088c89a Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 16 Aug 2025 00:07:07 +0800 Subject: [PATCH 08/12] =?UTF-8?q?doc:=20=E4=BB=A3=E7=A0=81=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BootstrapBlazor.Tasks.Dashboard/TaskInfo.razor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/BootstrapBlazor.Tasks.Dashboard/TaskInfo.razor.cs b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskInfo.razor.cs index 949cf458..073ae698 100644 --- a/src/components/BootstrapBlazor.Tasks.Dashboard/TaskInfo.razor.cs +++ b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskInfo.razor.cs @@ -23,7 +23,7 @@ public partial class TaskInfo : IDisposable /// 获得/设置 日志窗口标题文本 /// [Parameter] - public string? HeaderText { get; set; } + public string? HeaderText { get; set; } private List Messages { get; } = new(24); From 6cc3d6ab1f6dc627bfce625137002bc71ffb5687 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 16 Aug 2025 00:07:16 +0800 Subject: [PATCH 09/12] =?UTF-8?q?doc:=20=E4=BB=A3=E7=A0=81=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BootstrapBlazor.Tasks.Dashboard/TaskInfo.razor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/BootstrapBlazor.Tasks.Dashboard/TaskInfo.razor.cs b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskInfo.razor.cs index 073ae698..b3372bf3 100644 --- a/src/components/BootstrapBlazor.Tasks.Dashboard/TaskInfo.razor.cs +++ b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskInfo.razor.cs @@ -74,7 +74,7 @@ private void Dispose(bool disposing) } /// - /// + /// /// public void Dispose() { From cd1984e479a032be6ec71f9d817195f32de8ab16 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 16 Aug 2025 00:07:31 +0800 Subject: [PATCH 10/12] =?UTF-8?q?refactor:=20=E6=94=AF=E6=8C=81=E5=A4=9A?= =?UTF-8?q?=E6=92=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TaskInfo.razor.cs | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/components/BootstrapBlazor.Tasks.Dashboard/TaskInfo.razor.cs b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskInfo.razor.cs index b3372bf3..7085c67a 100644 --- a/src/components/BootstrapBlazor.Tasks.Dashboard/TaskInfo.razor.cs +++ b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskInfo.razor.cs @@ -38,15 +38,20 @@ protected override async Task OnAfterRenderAsync(bool firstRender) if (firstRender) { - var sche = TaskServicesManager.Get(Scheduler.Name); - if (sche != null) + var scheduler = TaskServicesManager.Get(Scheduler.Name); + if (scheduler != null) { - sche.Triggers.First().PulseCallback = async t => await DispatchMessage(t); - await DispatchMessage(sche.Triggers.First()); + scheduler.Triggers.First().PulseCallback += DispatchMessageCallback; + await DispatchMessage(scheduler.Triggers.First()); } } } + private void DispatchMessageCallback(ITrigger trigger) + { + _ = DispatchMessage(trigger); + } + private async Task DispatchMessage(ITrigger trigger) { var message = $"Trigger({trigger.GetType().Name}) LastRuntime: {trigger.LastRuntime} Run({trigger.LastResult}) NextRuntime: {trigger.NextRuntime} Elapsed: {trigger.LastRunElapsedTime.TotalSeconds}"; @@ -65,10 +70,10 @@ private void Dispose(bool disposing) { if (disposing) { - var sche = TaskServicesManager.Get(Scheduler.Name); - if (sche != null) + var scheduler = TaskServicesManager.Get(Scheduler.Name); + if (scheduler != null) { - sche.Triggers.First().PulseCallback = null; + scheduler.Triggers.First().PulseCallback -= DispatchMessageCallback; } } } From a799c38e24392c6e59797db2ef0876b30aedfe9a Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 16 Aug 2025 15:46:34 +0800 Subject: [PATCH 11/12] =?UTF-8?q?refactor:=20=E8=A7=A6=E5=8F=91=E5=99=A8?= =?UTF-8?q?=E6=9C=AA=E6=89=A7=E8=A1=8C=E6=97=B6=E4=B8=8D=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BootstrapBlazor.Tasks.Dashboard/TaskInfo.razor.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/components/BootstrapBlazor.Tasks.Dashboard/TaskInfo.razor.cs b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskInfo.razor.cs index 7085c67a..004b6cee 100644 --- a/src/components/BootstrapBlazor.Tasks.Dashboard/TaskInfo.razor.cs +++ b/src/components/BootstrapBlazor.Tasks.Dashboard/TaskInfo.razor.cs @@ -54,6 +54,11 @@ private void DispatchMessageCallback(ITrigger trigger) private async Task DispatchMessage(ITrigger trigger) { + if (trigger.LastRuntime == null) + { + return; + } + var message = $"Trigger({trigger.GetType().Name}) LastRuntime: {trigger.LastRuntime} Run({trigger.LastResult}) NextRuntime: {trigger.NextRuntime} Elapsed: {trigger.LastRunElapsedTime.TotalSeconds}"; Messages.Add(new ConsoleMessageItem() { From 3cd022fff4ec549f373384e407b06cb2d6cb1b63 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 16 Aug 2025 15:54:33 +0800 Subject: [PATCH 12/12] chore(Tasks): bump version 9.0.0 --- .../BootstrapBlazor.Tasks.Dashboard.csproj | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/components/BootstrapBlazor.Tasks.Dashboard/BootstrapBlazor.Tasks.Dashboard.csproj b/src/components/BootstrapBlazor.Tasks.Dashboard/BootstrapBlazor.Tasks.Dashboard.csproj index a11d58f3..bdf99fae 100644 --- a/src/components/BootstrapBlazor.Tasks.Dashboard/BootstrapBlazor.Tasks.Dashboard.csproj +++ b/src/components/BootstrapBlazor.Tasks.Dashboard/BootstrapBlazor.Tasks.Dashboard.csproj @@ -1,7 +1,7 @@  - 9.0.0-beta01 + 9.0.0 @@ -17,12 +17,8 @@ - - - - - - + +