build: 10.11.101

This commit is contained in:
2248356998 qq.com
2025-10-14 11:46:26 +08:00
parent db3affc67e
commit 1bad65378f
13 changed files with 114 additions and 71 deletions

View File

@@ -5,7 +5,7 @@
<div class="tg-table h-100"> <div class="tg-table h-100">
<Table TItem="TItem" IsBordered="true" IsStriped="true" TableSize="TableSize.Compact" SelectedRows=SelectedRows SelectedRowsChanged=privateSelectedRowsChanged IsMultipleSelect="IsMultipleSelect" @ref="Instance" SearchTemplate="SearchTemplate" <Table TItem="TItem" IsBordered="true" IsStriped="true" TableSize="TableSize.Compact" SelectedRows=SelectedRows SelectedRowsChanged=privateSelectedRowsChanged IsMultipleSelect="IsMultipleSelect" @ref="Instance" SearchTemplate="SearchTemplate"
DataService="DataService" CreateItemCallback="CreateItemCallback!" DataService="DataService" CreateItemCallback="CreateItemCallback!" RenderMode=RenderMode
IsPagination="IsPagination" PageItemsSource="PageItemsSource" IsFixedHeader="IsFixedHeader" IndentSize=24 RowHeight=RowHeight ShowSearchText="ShowSearchText" ShowSearchButton="ShowSearchButton" DisableEditButtonCallback="DisableEditButtonCallback" DisableDeleteButtonCallback="DisableDeleteButtonCallback" BeforeShowEditDialogCallback=" BeforeShowEditDialogCallback!" IsPagination="IsPagination" PageItemsSource="PageItemsSource" IsFixedHeader="IsFixedHeader" IndentSize=24 RowHeight=RowHeight ShowSearchText="ShowSearchText" ShowSearchButton="ShowSearchButton" DisableEditButtonCallback="DisableEditButtonCallback" DisableDeleteButtonCallback="DisableDeleteButtonCallback" BeforeShowEditDialogCallback=" BeforeShowEditDialogCallback!"
IsTree="IsTree" OnTreeExpand="OnTreeExpand!" TreeNodeConverter="TreeNodeConverter!" TreeIcon="fa-solid fa-circle-chevron-right" TreeExpandIcon="fa-solid fa-circle-chevron-right fa-rotate-90" IsAutoQueryFirstRender=IsAutoQueryFirstRender IsTree="IsTree" OnTreeExpand="OnTreeExpand!" TreeNodeConverter="TreeNodeConverter!" TreeIcon="fa-solid fa-circle-chevron-right" TreeExpandIcon="fa-solid fa-circle-chevron-right fa-rotate-90" IsAutoQueryFirstRender=IsAutoQueryFirstRender
ShowDefaultButtons="ShowDefaultButtons" ShowAdvancedSearch="ShowAdvancedSearch" ShowResetButton=ShowResetButton ShowDefaultButtons="ShowDefaultButtons" ShowAdvancedSearch="ShowAdvancedSearch" ShowResetButton=ShowResetButton

View File

@@ -14,6 +14,10 @@ namespace ThingsGateway.Admin.Razor;
public partial class AdminTable<TItem> where TItem : class, new() public partial class AdminTable<TItem> where TItem : class, new()
{ {
/// <inheritdoc cref="Table{TItem}.RenderMode"/>
[Parameter]
public TableRenderMode RenderMode { get; set; }
public List<ITableColumn> Columns => Instance?.Columns; public List<ITableColumn> Columns => Instance?.Columns;

View File

@@ -8,8 +8,6 @@
// QQ群605534569 // QQ群605534569
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
using ThingsGateway.NewLife.Log;
namespace ThingsGateway.NewLife; namespace ThingsGateway.NewLife;
/// <summary> /// <summary>

View File

@@ -8,8 +8,6 @@
// QQ群605534569 // QQ群605534569
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
using ThingsGateway.NewLife;
namespace ThingsGateway; namespace ThingsGateway;
/// <inheritdoc/> /// <inheritdoc/>

View File

@@ -1,7 +1,6 @@
using System.Reflection; using System.Reflection;
using ThingsGateway.NewLife.Log; using ThingsGateway.NewLife.Log;
using ThingsGateway.NewLife.Reflection;
namespace ThingsGateway.NewLife.Threading; namespace ThingsGateway.NewLife.Threading;

View File

@@ -1,9 +1,9 @@
<Project> <Project>
<PropertyGroup> <PropertyGroup>
<PluginVersion>10.11.100</PluginVersion> <PluginVersion>10.11.101</PluginVersion>
<ProPluginVersion>10.11.100</ProPluginVersion> <ProPluginVersion>10.11.101</ProPluginVersion>
<DefaultVersion>10.11.100</DefaultVersion> <DefaultVersion>10.11.101</DefaultVersion>
<AuthenticationVersion>10.11.6</AuthenticationVersion> <AuthenticationVersion>10.11.6</AuthenticationVersion>
<SourceGeneratorVersion>10.11.6</SourceGeneratorVersion> <SourceGeneratorVersion>10.11.6</SourceGeneratorVersion>
<NET8Version>8.0.20</NET8Version> <NET8Version>8.0.20</NET8Version>

View File

@@ -73,7 +73,7 @@ public interface IChannelOptions
bool RtsEnable { get; set; } bool RtsEnable { get; set; }
bool StreamAsync { get; set; } bool StreamAsync { get; set; }
Handshake Handshake { get; set; } Handshake Handshake { get; set; }
#endregion #endregion
/// <summary> /// <summary>

View File

@@ -100,7 +100,7 @@ public static class LoggerExtensions
/// </summary> /// </summary>
public static string GetDeviceLogBasePath() public static string GetDeviceLogBasePath()
{ {
return PathExtensions.CombinePathWithOs("Logs","DeviceLog"); return PathExtensions.CombinePathWithOs("Logs", "DeviceLog");
} }
/// <summary> /// <summary>

View File

@@ -143,7 +143,7 @@ public class Channel : ChannelOptionsBase, IPrimaryIdEntity, IBaseDataEntity, IB
[SugarColumn(ColumnDescription = "StreamAsync", IsNullable = true)] [SugarColumn(ColumnDescription = "StreamAsync", IsNullable = true)]
[AutoGenerateColumn(Visible = false, Filterable = true, Sortable = true)] [AutoGenerateColumn(Visible = false, Filterable = true, Sortable = true)]
public override bool StreamAsync { get; set; } public override bool StreamAsync { get; set; }
/// <summary> /// <summary>
/// Handshake /// Handshake
/// </summary> /// </summary>

View File

@@ -5,7 +5,6 @@
@using ThingsGateway.Admin.Razor @using ThingsGateway.Admin.Razor
@using ThingsGateway.Gateway.Application @using ThingsGateway.Gateway.Application
@inherits ComponentDefault @inherits ComponentDefault
@typeparam TItem
@foreach (var col in RowContent.Columns) @foreach (var col in RowContent.Columns)
@@ -14,13 +13,7 @@
<DynamicElement TagName="div" TriggerClick="@false" <DynamicElement TagName="div" TriggerClick="@false"
StopPropagation="false" StopPropagation="false"
class="@GetCellClassString(col, false, false)"> class="@GetCellClassString(col, false, false)">
@{ @GetValue(col, RowContent.Row)
<DynamicElement TagName="div" TriggerDoubleClick="false" GenerateElement="false"
StopPropagation="true"
class="@GetDoubleClickCellClassString(false)">
@GetValue(col, RowContent.Row)
</DynamicElement>
}
</DynamicElement> </DynamicElement>
</td> </td>
} }

View File

@@ -16,25 +16,33 @@ using TouchSocket.Core;
namespace ThingsGateway.Gateway.Razor; namespace ThingsGateway.Gateway.Razor;
public partial class VariableRow<TItem> : IDisposable public partial class VariableRow : IDisposable
{ {
[Parameter] [Parameter]
public TableRowContext<TItem>? RowContent { get; set; } public TableRowContext<VariableRuntime>? RowContent { get; set; }
private bool Disposed;
public void Dispose() public void Dispose()
{ {
Disposed = true;
timer?.SafeDispose(); timer?.SafeDispose();
GC.SuppressFinalize(this); GC.SuppressFinalize(this);
} }
TimerX? timer; TimerX? timer;
protected override void OnInitialized() protected override void OnAfterRender(bool firstRender)
{ {
timer = new TimerX(Refresh, null, 1000, 1000, "VariableRow"); if (firstRender)
base.OnInitialized(); {
timer = new TimerX(Refresh, null, 1000, 1000, "VariableRow");
}
base.OnAfterRender(firstRender);
} }
private Task Refresh(object? state) private Task Refresh(object? state)
{ {
return InvokeAsync(StateHasChanged); if (!Disposed)
return InvokeAsync(StateHasChanged);
else
return Task.CompletedTask;
} }
protected override void OnParametersSet() protected override void OnParametersSet()
@@ -49,7 +57,7 @@ public partial class VariableRow<TItem> : IDisposable
/// <param name="col"></param> /// <param name="col"></param>
/// <param name="item"></param> /// <param name="item"></param>
/// <returns></returns> /// <returns></returns>
protected RenderFragment GetValue(ITableColumn col, TItem item) => builder => protected RenderFragment GetValue(ITableColumn col, VariableRuntime item) => builder =>
{ {
if (col.Template != null) if (col.Template != null)
{ {
@@ -66,9 +74,9 @@ public partial class VariableRow<TItem> : IDisposable
} }
}; };
internal static string? GetDoubleClickCellClassString(bool trigger) => CssBuilder.Default() // internal static string? GetDoubleClickCellClassString(bool trigger) => CssBuilder.Default()
.AddClass("is-dbcell", trigger) //.AddClass("is-dbcell", trigger)
.Build(); //.Build();
/// <summary> /// <summary>
/// 获得指定列头固定列样式 /// 获得指定列头固定列样式
@@ -160,16 +168,29 @@ public partial class VariableRow<TItem> : IDisposable
/// <param name="hasChildren"></param> /// <param name="hasChildren"></param>
/// <param name="inCell"></param> /// <param name="inCell"></param>
/// <returns></returns> /// <returns></returns>
protected string? GetCellClassString(ITableColumn col, bool hasChildren, bool inCell) => CellClassStringCache.GetOrAdd(col, col => CssBuilder.Default("table-cell") protected string? GetCellClassString(ITableColumn col, bool hasChildren, bool inCell)
.AddClass(col.GetAlign().ToDescriptionString(), col.Align == Alignment.Center || col.Align == Alignment.Right) {
.AddClass("is-wrap", col.GetTextWrap()) if (CellClassStringCache.TryGetValue(col, out var cached))
.AddClass("is-ellips", col.GetTextEllipsis()) {
.AddClass("is-tips", col.GetShowTips()) return cached;
.AddClass("is-resizable", AllowResizing) }
.AddClass("is-tree", IsTree && hasChildren) else
.AddClass("is-incell", inCell) {
.AddClass(col.CssClass) bool trigger = false;
.Build()); return CellClassStringCache.GetOrAdd(col, col => CssBuilder.Default("table-cell")
.AddClass(col.GetAlign().ToDescriptionString(), col.Align == Alignment.Center || col.Align == Alignment.Right)
.AddClass("is-wrap", col.GetTextWrap())
.AddClass("is-ellips", col.GetTextEllipsis())
.AddClass("is-tips", col.GetShowTips())
.AddClass("is-resizable", AllowResizing)
.AddClass("is-tree", IsTree && hasChildren)
.AddClass("is-incell", inCell)
.AddClass("is-dbcell", trigger)
.AddClass(col.CssClass)
.Build());
}
}
private bool AllowResizing = true; private bool AllowResizing = true;
private bool IsTree = false; private bool IsTree = false;
@@ -180,12 +201,24 @@ public partial class VariableRow<TItem> : IDisposable
/// </summary> /// </summary>
/// <param name="col"></param> /// <param name="col"></param>
/// <returns></returns> /// <returns></returns>
protected string? GetFixedCellClassString(ITableColumn col) => FixedCellClassStringCache.GetOrAdd(col, col => CssBuilder.Default() protected string? GetFixedCellClassString(ITableColumn col)
.AddClass("fixed", col.Fixed) {
.AddClass("fixed-right", col.Fixed && IsTail(col)) if (FixedCellClassStringCache.TryGetValue(col, out var cached))
.AddClass("fr", IsLastColumn(col)) {
.AddClass("fl", IsFirstColumn(col)) return cached;
.Build()); }
else
{
return FixedCellClassStringCache.GetOrAdd(col, col => CssBuilder.Default()
.AddClass("fixed", col.Fixed)
.AddClass("fixed-right", col.Fixed && IsTail(col))
.AddClass("fr", IsLastColumn(col))
.AddClass("fl", IsFirstColumn(col))
.Build());
}
}
[Parameter] [Parameter]
@@ -193,33 +226,53 @@ public partial class VariableRow<TItem> : IDisposable
public List<ITableColumn> Columns => ColumnsFunc(); public List<ITableColumn> Columns => ColumnsFunc();
private ConcurrentDictionary<ITableColumn, bool> LastFixedColumnCache { get; } = new(ReferenceEqualityComparer.Instance); private ConcurrentDictionary<ITableColumn, bool> LastFixedColumnCache { get; } = new(ReferenceEqualityComparer.Instance);
private bool IsLastColumn(ITableColumn col) => LastFixedColumnCache.GetOrAdd(col, col => private bool IsLastColumn(ITableColumn col)
{ {
var ret = false; if (LastFixedColumnCache.TryGetValue(col, out var cached))
if (col.Fixed && !IsTail(col))
{ {
var index = Columns.IndexOf(col) + 1; return cached;
ret = index < Columns.Count && Columns[index].Fixed == false;
} }
return ret; else
});
private ConcurrentDictionary<ITableColumn, bool> FirstFixedColumnCache { get; } = new(ReferenceEqualityComparer.Instance);
private bool IsFirstColumn(ITableColumn col) => FirstFixedColumnCache.GetOrAdd(col, col =>
{
var ret = false;
if (col.Fixed && IsTail(col))
{ {
// 查找前一列是否固定 return LastFixedColumnCache.GetOrAdd(col, col =>
var index = Columns.IndexOf(col) - 1;
if (index > 0)
{ {
ret = !Columns[index].Fixed; var ret = false;
} if (col.Fixed && !IsTail(col))
{
var index = Columns.IndexOf(col) + 1;
ret = index < Columns.Count && Columns[index].Fixed == false;
}
return ret;
});
} }
return ret; }
}); private ConcurrentDictionary<ITableColumn, bool> FirstFixedColumnCache { get; } = new(ReferenceEqualityComparer.Instance);
private bool IsFirstColumn(ITableColumn col)
{
if (FirstFixedColumnCache.TryGetValue(col, out var cached))
{
return cached;
}
else
{
return FirstFixedColumnCache.GetOrAdd(col, col =>
{
var ret = false;
if (col.Fixed && IsTail(col))
{
// 查找前一列是否固定
var index = Columns.IndexOf(col) - 1;
if (index > 0)
{
ret = !Columns[index].Fixed;
}
}
return ret;
});
}
}

View File

@@ -15,12 +15,13 @@
AllowResizing="true" AllowResizing="true"
OnAdd="OnAdd" OnAdd="OnAdd"
IsFixedHeader=true IsFixedHeader=true
ShowCardView=false
IsMultipleSelect=true IsMultipleSelect=true
SearchMode=SearchMode.Top SearchMode=SearchMode.Top
ShowExtendButtons=true ShowExtendButtons=true
ShowToolbar="true" ShowToolbar="true"
ShowExportButton ShowExportButton
RenderMode="TableRenderMode.Table"
ShowDefaultButtons=true ShowDefaultButtons=true
ShowSearch=false ShowSearch=false
ExtendButtonColumnWidth=220 ExtendButtonColumnWidth=220

View File

@@ -15,9 +15,6 @@ using BootstrapBlazor.Components;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Localization; using Microsoft.Extensions.Localization;
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
using ThingsGateway.Gateway.Application; using ThingsGateway.Gateway.Application;
namespace ThingsGateway.Server; namespace ThingsGateway.Server;