From a825ca5f6f8c3c0838ec8ef15d0b94094df71b9a Mon Sep 17 00:00:00 2001 From: Diego <2248356998@qq.com> Date: Fri, 4 Jul 2025 12:50:07 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BD=91=E5=85=B3=E7=9B=91=E6=8E=A7=E6=A0=91?= =?UTF-8?q?=E8=8A=82=E7=82=B9=E6=B7=BB=E5=8A=A0=E5=8F=B3=E4=BE=A7=E5=B8=B8?= =?UTF-8?q?=E7=94=A8=E6=93=8D=E4=BD=9C=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Locales/en-US.json | 2 +- .../Locales/zh-CN.json | 2 +- .../ChannelDeviceTree.razor | 62 +++++++++- .../ChannelDeviceTree.razor.cs | 114 +++++++++++------- .../ChannelDeviceTree.razor.css | 13 +- .../ThingsGateway.Plugin.Kafka.csproj | 2 +- 6 files changed, 146 insertions(+), 49 deletions(-) diff --git a/src/Gateway/ThingsGateway.Gateway.Razor/Locales/en-US.json b/src/Gateway/ThingsGateway.Gateway.Razor/Locales/en-US.json index 000b082c1..811f8f4ae 100644 --- a/src/Gateway/ThingsGateway.Gateway.Razor/Locales/en-US.json +++ b/src/Gateway/ThingsGateway.Gateway.Razor/Locales/en-US.json @@ -107,7 +107,7 @@ "DeleteCurrentDevice": "Delete Current Device", "DeleteDevice": "Delete Device", "DeviceInformation": "Device Information", - "DeviceList": "Device List", + "DeviceList": "Tip: Right click to operate tree nodes", "DeviceRedundantThread": "Switching redundancy", "ExcelChannel": "ExcelChannel", "ExcelDevice": "ExcelDevice", diff --git a/src/Gateway/ThingsGateway.Gateway.Razor/Locales/zh-CN.json b/src/Gateway/ThingsGateway.Gateway.Razor/Locales/zh-CN.json index c9a2dd0de..8f5b0bab0 100644 --- a/src/Gateway/ThingsGateway.Gateway.Razor/Locales/zh-CN.json +++ b/src/Gateway/ThingsGateway.Gateway.Razor/Locales/zh-CN.json @@ -105,7 +105,7 @@ "DeleteCurrentDevice": "删除当前节点下的设备", "DeleteDevice": "删除设备", "DeviceInformation": "设备信息", - "DeviceList": "设备节点", + "DeviceList": "提示:右键操作树节点", "DeviceRedundantThread": "切换冗余", "ExcelChannel": "在线excel编辑通道", "ExcelDevice": "在线excel编辑设备", diff --git a/src/Gateway/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/ChannelDeviceTree.razor b/src/Gateway/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/ChannelDeviceTree.razor index 4f6709596..a9449a1bc 100644 --- a/src/Gateway/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/ChannelDeviceTree.razor +++ b/src/Gateway/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/ChannelDeviceTree.razor @@ -13,10 +13,66 @@ - @GatewayLocalizer["DeviceList"] + @GatewayLocalizer["DeviceList"] - - + + + + +
+ + @if (context.ChannelDevicePluginType < ChannelDevicePluginTypeEnum.Channel) + { + @* *@ + + @* *@ + + @* *@ + + @* *@ + + } + + @* //更新通道 *@ + @if (context.ChannelDevicePluginType == ChannelDevicePluginTypeEnum.Channel) + { + @* *@ + + @* *@ + + @* *@ + + @* *@ + + @* *@ + + @* *@ + + } + + + + @* //更新设备 *@ + @if (context.ChannelDevicePluginType == ChannelDevicePluginTypeEnum.Device) + { + @* *@ + + @* *@ + + @* *@ + + @* *@ + } + +
+
diff --git a/src/Gateway/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/ChannelDeviceTree.razor.cs b/src/Gateway/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/ChannelDeviceTree.razor.cs index 0fc044dd5..403c6172b 100644 --- a/src/Gateway/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/ChannelDeviceTree.razor.cs +++ b/src/Gateway/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/ChannelDeviceTree.razor.cs @@ -101,19 +101,22 @@ public partial class ChannelDeviceTree #region 通道 - async Task EditChannel(ContextMenuItem item, object value, ItemChangedType itemChangedType) + Task EditChannel(ContextMenuItem item, object value, ItemChangedType itemChangedType) + { + return EditChannel(item.Text, value as ChannelDeviceTreeItem, itemChangedType); + } + async Task EditChannel(string text, ChannelDeviceTreeItem channelDeviceTreeItem, ItemChangedType itemChangedType) { var op = new DialogOption() { IsScrolling = false, ShowMaximizeButton = true, Size = Size.ExtraLarge, - Title = item.Text, + Title = text, ShowFooter = false, ShowCloseButton = false, }; - if (value is not ChannelDeviceTreeItem channelDeviceTreeItem) return; PluginTypeEnum? pluginTypeEnum = ChannelDeviceHelpers.GetPluginType(channelDeviceTreeItem); var oneModel = ChannelDeviceHelpers.GetChannelModel(itemChangedType, channelDeviceTreeItem); @@ -134,12 +137,16 @@ public partial class ChannelDeviceTree } - async Task CopyChannel(ContextMenuItem item, object value) + Task CopyChannel(ContextMenuItem item, object value) + { + return CopyChannel(item.Text, value as ChannelDeviceTreeItem); + } + + async Task CopyChannel(string text, ChannelDeviceTreeItem channelDeviceTreeItem) { Channel oneModel = null; Dictionary> deviceDict = new(); - if (value is not ChannelDeviceTreeItem channelDeviceTreeItem) return; if (channelDeviceTreeItem.TryGetChannelRuntime(out var channelRuntime)) { @@ -159,7 +166,7 @@ public partial class ChannelDeviceTree IsScrolling = false, ShowMaximizeButton = true, Size = Size.ExtraLarge, - Title = item.Text, + Title = text, ShowFooter = false, ShowCloseButton = false, }; @@ -182,22 +189,21 @@ public partial class ChannelDeviceTree } - - async Task BatchEditChannel(ContextMenuItem item, object value) + Task BatchEditChannel(ContextMenuItem item, object value) { + return BatchEditChannel(item.Text, value as ChannelDeviceTreeItem); + } - - + async Task BatchEditChannel(string text, ChannelDeviceTreeItem channelDeviceTreeItem) + { Channel oldModel = null; Channel oneModel = null; IEnumerable? changedModels = null; IEnumerable? models = null; - if (value is not ChannelDeviceTreeItem channelDeviceTreeItem) return; - if (channelDeviceTreeItem.TryGetChannelRuntime(out var channelRuntime)) { - await EditChannel(item, value, ItemChangedType.Update); + await EditChannel(text, channelDeviceTreeItem, ItemChangedType.Update); return; } //批量编辑只有分类和插件名称节点 @@ -235,7 +241,7 @@ public partial class ChannelDeviceTree IsScrolling = false, ShowMaximizeButton = true, Size = Size.ExtraLarge, - Title = item.Text, + Title = text, ShowFooter = false, ShowCloseButton = false, }; @@ -265,8 +271,11 @@ public partial class ChannelDeviceTree } - - async Task ExcelChannel(ContextMenuItem item, object value) + Task ExcelChannel(ContextMenuItem item, object value) + { + return ExcelChannel(item.Text); + } + async Task ExcelChannel(string text) { var op = new DialogOption() @@ -274,7 +283,7 @@ public partial class ChannelDeviceTree IsScrolling = false, ShowMaximizeButton = true, Size = Size.ExtraExtraLarge, - Title = item.Text, + Title = text, ShowFooter = false, ShowCloseButton = false, }; @@ -316,8 +325,11 @@ finally } - - async Task DeleteChannel(ContextMenuItem item, object value) + Task DeleteChannel(ContextMenuItem item, object value) + { + return DeleteChannel(value as ChannelDeviceTreeItem); + } + async Task DeleteChannel(ChannelDeviceTreeItem channelDeviceTreeItem) { var op = new DialogOption(); { @@ -336,7 +348,7 @@ finally EventCallback.Factory.Create(this, async e => { await op.CloseDialogAsync(); - await DeleteCurrentChannel(item, value); + await DeleteCurrentChannel(channelDeviceTreeItem); })); builder.AddComponentParameter(5, nameof(Button.Text), GatewayLocalizer["DeleteCurrentChannel"].Value); @@ -348,7 +360,7 @@ finally builder.AddComponentParameter(15, nameof(Button.OnClick), EventCallback.Factory.Create(this, async e => { await op.CloseDialogAsync(); - await DeleteAllChannel(item, value); + await DeleteAllChannel(); })); builder.AddComponentParameter(16, nameof(Button.Text), GatewayLocalizer["DeleteAllChannel"].Value); @@ -361,10 +373,9 @@ finally ; await DialogService.Show(op); } - async Task DeleteCurrentChannel(ContextMenuItem item, object value) + async Task DeleteCurrentChannel(ChannelDeviceTreeItem channelDeviceTreeItem) { IEnumerable modelIds = null; - if (value is not ChannelDeviceTreeItem channelDeviceTreeItem) return; if (channelDeviceTreeItem.TryGetChannelRuntime(out var channelRuntime)) { @@ -395,6 +406,7 @@ finally { var op = new SwalOption() { + Title = GatewayLocalizer["DeleteConfirmTitle"], BodyTemplate = (__builder) => { @@ -434,7 +446,7 @@ finally } } - async Task DeleteAllChannel(ContextMenuItem item, object value) + async Task DeleteAllChannel() { try { @@ -479,7 +491,11 @@ finally } - async Task ExportChannel(ContextMenuItem item, object value) + Task ExportChannel(ContextMenuItem item, object value) + { + return ExportChannel(value as ChannelDeviceTreeItem); + } + async Task ExportChannel(ChannelDeviceTreeItem channelDeviceTreeItem) { var op = new DialogOption(); { @@ -498,7 +514,7 @@ finally EventCallback.Factory.Create(this, async e => { await op.CloseDialogAsync(); - await ExportCurrentChannel(item, value); + await ExportCurrentChannel(channelDeviceTreeItem); })); builder.AddComponentParameter(5, nameof(Button.Text), GatewayLocalizer["ExportCurrentChannel"].Value); @@ -510,7 +526,7 @@ EventCallback.Factory.Create(this, async e => builder.AddComponentParameter(15, nameof(Button.OnClick), EventCallback.Factory.Create(this, async e => { await op.CloseDialogAsync(); - await ExportAllChannel(item, value); + await ExportAllChannel(); })); builder.AddComponentParameter(16, nameof(Button.Text), GatewayLocalizer["ExportAllChannel"].Value); @@ -523,10 +539,9 @@ EventCallback.Factory.Create(this, async e => ; await DialogService.Show(op); } - async Task ExportCurrentChannel(ContextMenuItem item, object value) + async Task ExportCurrentChannel(ChannelDeviceTreeItem channelDeviceTreeItem) { bool ret; - if (value is not ChannelDeviceTreeItem channelDeviceTreeItem) return; if (channelDeviceTreeItem.TryGetChannelRuntime(out var channelRuntime)) { @@ -550,7 +565,7 @@ EventCallback.Factory.Create(this, async e => if (ret) await ToastService.Default(); } - async Task ExportAllChannel(ContextMenuItem item, object value) + async Task ExportAllChannel() { bool ret; ret = await GatewayExportService.OnChannelExport(new() { QueryPageOptions = new() }); @@ -561,14 +576,18 @@ EventCallback.Factory.Create(this, async e => } - async Task ImportChannel(ContextMenuItem item, object value) + Task ImportChannel(ContextMenuItem item, object value) + { + return ImportChannel(item.Text); + } + async Task ImportChannel(string text) { var op = new DialogOption() { IsScrolling = true, ShowMaximizeButton = true, Size = Size.ExtraLarge, - Title = item.Text, + Title = text, ShowFooter = false, ShowCloseButton = false, OnCloseAsync = async () => @@ -654,19 +673,22 @@ EventCallback.Factory.Create(this, async e => } - async Task EditDevice(ContextMenuItem item, object value, ItemChangedType itemChangedType) + Task EditDevice(ContextMenuItem item, object value, ItemChangedType itemChangedType) + { + return EditDevice(item.Text, value as ChannelDeviceTreeItem, itemChangedType); + } + async Task EditDevice(string text, ChannelDeviceTreeItem channelDeviceTreeItem, ItemChangedType itemChangedType) { var op = new DialogOption() { IsScrolling = true, ShowMaximizeButton = true, Size = Size.ExtraLarge, - Title = item.Text, + Title = text, ShowFooter = false, ShowCloseButton = false, }; Device oneModel = null; - if (value is not ChannelDeviceTreeItem channelDeviceTreeItem) return; if (channelDeviceTreeItem.TryGetDeviceRuntime(out var deviceRuntime)) { @@ -845,7 +867,12 @@ finally } - async Task DeleteDevice(ContextMenuItem item, object value) + Task DeleteDevice(ContextMenuItem item, object value) + { + return DeleteDevice(value as ChannelDeviceTreeItem); + } + + async Task DeleteDevice(ChannelDeviceTreeItem channelDeviceTreeItem) { var op = new DialogOption(); { @@ -864,7 +891,7 @@ finally EventCallback.Factory.Create(this, async e => { await op.CloseDialogAsync(); - await DeleteCurrentDevice(item, value); + await DeleteCurrentDevice(channelDeviceTreeItem); })); builder.AddComponentParameter(5, nameof(Button.Text), GatewayLocalizer["DeleteCurrentDevice"].Value); @@ -876,7 +903,7 @@ EventCallback.Factory.Create(this, async e => builder.AddComponentParameter(15, nameof(Button.OnClick), EventCallback.Factory.Create(this, async e => { await op.CloseDialogAsync(); - await DeleteAllDevice(item, value); + await DeleteAllDevice(); })); builder.AddComponentParameter(16, nameof(Button.Text), GatewayLocalizer["DeleteAllDevice"].Value); @@ -886,15 +913,14 @@ EventCallback.Factory.Create(this, async e => }); } - ; + ; await DialogService.Show(op); } - async Task DeleteCurrentDevice(ContextMenuItem item, object value) + async Task DeleteCurrentDevice(ChannelDeviceTreeItem channelDeviceTreeItem) { IEnumerable modelIds = null; - if (value is not ChannelDeviceTreeItem channelDeviceTreeItem) return; if (channelDeviceTreeItem.TryGetDeviceRuntime(out var deviceRuntime)) { @@ -968,7 +994,7 @@ EventCallback.Factory.Create(this, async e => } - async Task DeleteAllDevice(ContextMenuItem item, object value) + async Task DeleteAllDevice() { try { @@ -1511,4 +1537,8 @@ EventCallback.Factory.Create(this, async e => base.OnAfterRender(firstRender); } + private void OnUpdateCallbackAsync() + { + throw new NotImplementedException(); + } } diff --git a/src/Gateway/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/ChannelDeviceTree.razor.css b/src/Gateway/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/ChannelDeviceTree.razor.css index 0369bbaac..a5b3b6247 100644 --- a/src/Gateway/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/ChannelDeviceTree.razor.css +++ b/src/Gateway/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/ChannelDeviceTree.razor.css @@ -2,15 +2,26 @@ .listtree-view { height: 100%; } + .listtree-view ::deep .bb-cm-zone { - height: calc(100% - 60px); + height: calc(100% - 60px); /*margin-bottom: 2px;*/ } + .listtree-view ::deep .tree-view { --bb-tree-search-height: 32px; min-height: 300px; height: 100%; } + + .listtree-view ::deep .tree-view .tree-root { + padding-right: 0px; + } + .deviceEnable--text { color: var(--bs-body-color); } + +.tree-node-toolbar-edit { + background-color: white; +} diff --git a/src/Plugin/ThingsGateway.Plugin.Kafka/ThingsGateway.Plugin.Kafka.csproj b/src/Plugin/ThingsGateway.Plugin.Kafka/ThingsGateway.Plugin.Kafka.csproj index cae756288..20c215577 100644 --- a/src/Plugin/ThingsGateway.Plugin.Kafka/ThingsGateway.Plugin.Kafka.csproj +++ b/src/Plugin/ThingsGateway.Plugin.Kafka/ThingsGateway.Plugin.Kafka.csproj @@ -7,7 +7,7 @@ - + contentFiles;compile;build;buildMultitargeting;buildTransitive;analyzers;