mirror of
https://gitee.com/ThingsGateway/ThingsGateway.git
synced 2025-10-20 10:50:48 +08:00
feat: js刷新变量表数据
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
using ThingsGateway.NewLife.Caching;
|
||||
using ThingsGateway.NewLife.Json.Extension;
|
||||
|
||||
namespace ThingsGateway.NewLife;
|
||||
namespace ThingsGateway.Gateway.Razor;
|
||||
|
||||
public static class VariableModelUtils
|
||||
{
|
||||
@@ -25,4 +26,56 @@ public static class VariableModelUtils
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
public static string GetValue(VariableRuntime row, string fieldName)
|
||||
{
|
||||
switch (fieldName)
|
||||
{
|
||||
case nameof(VariableRuntime.Value):
|
||||
return row.Value?.ToSystemTextJsonString() ?? string.Empty;
|
||||
case nameof(VariableRuntime.RawValue):
|
||||
return row.RawValue?.ToSystemTextJsonString() ?? string.Empty;
|
||||
case nameof(VariableRuntime.LastSetValue):
|
||||
return row.LastSetValue?.ToSystemTextJsonString() ?? string.Empty;
|
||||
case nameof(VariableRuntime.ChangeTime):
|
||||
return row.ChangeTime.ToString("yyyy-MM-dd HH:mm:ss.fff");
|
||||
|
||||
case nameof(VariableRuntime.CollectTime):
|
||||
return row.CollectTime.ToString("yyyy-MM-dd HH:mm:ss.fff");
|
||||
|
||||
case nameof(VariableRuntime.IsOnline):
|
||||
return row.IsOnline.ToString();
|
||||
|
||||
case nameof(VariableRuntime.LastErrorMessage):
|
||||
return row.LastErrorMessage;
|
||||
|
||||
|
||||
case nameof(VariableRuntime.RuntimeType):
|
||||
return row.RuntimeType;
|
||||
default:
|
||||
|
||||
var ret = VariableModelUtils.GetPropertyValue(row, fieldName);
|
||||
|
||||
if (ret != null)
|
||||
{
|
||||
var t = ret.GetType();
|
||||
if (t.IsEnum)
|
||||
{
|
||||
// 如果是枚举这里返回 枚举的描述信息
|
||||
var itemName = ret.ToString();
|
||||
if (!string.IsNullOrEmpty(itemName))
|
||||
{
|
||||
ret = Utility.GetDisplayName(t, itemName);
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret is string str ? str : ret?.ToString() ?? string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
internal static Alignment GetAlign(this ITableColumn col) => col.Align ?? Alignment.None;
|
||||
internal static bool GetTextWrap(this ITableColumn col) => col.TextWrap ?? false;
|
||||
internal static bool GetShowTips(this ITableColumn col) => col.ShowTips ?? false;
|
||||
|
||||
internal static bool GetTextEllipsis(this ITableColumn col) => col.TextEllipsis ?? false;
|
||||
}
|
||||
|
@@ -1,4 +1,4 @@
|
||||
@* @namespace ThingsGateway.Gateway.Razor
|
||||
@namespace ThingsGateway.Gateway.Razor
|
||||
@using System.Text.Json.Nodes
|
||||
@using Microsoft.Extensions.Hosting
|
||||
@using ThingsGateway.Admin.Application
|
||||
@@ -9,12 +9,18 @@
|
||||
|
||||
@foreach (var col in RowContent.Columns)
|
||||
{
|
||||
<td class="@GetFixedCellClassString(col)" style="@GetFixedCellStyleString(col)">
|
||||
<DynamicElement TagName="div" TriggerClick="@false"
|
||||
StopPropagation="false"
|
||||
class="@GetCellClassString(col, false, false)">
|
||||
@GetValue(col, RowContent.Row)
|
||||
</DynamicElement>
|
||||
<td class="@GetFixedCellClassString(col)" style="@GetFixedCellStyleString(col)" @key=col>
|
||||
<div class="@GetCellClassString(col, false, false)" @key=col>
|
||||
@if(col.GetShowTips())
|
||||
{
|
||||
<Tooltip @key=col Title="@VariableModelUtils.GetValue(RowContent.Row, col.GetFieldName())" class="text-truncate d-block">
|
||||
@VariableModelUtils.GetValue(RowContent.Row, col.GetFieldName())
|
||||
</Tooltip>
|
||||
}
|
||||
else
|
||||
{
|
||||
@VariableModelUtils.GetValue(RowContent.Row, col.GetFieldName())
|
||||
}
|
||||
</div>
|
||||
</td>
|
||||
}
|
||||
*@
|
@@ -1,279 +1,249 @@
|
||||
////------------------------------------------------------------------------------
|
||||
//// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
|
||||
//// 此代码版权(除特别声明外的代码)归作者本人Diego所有
|
||||
//// 源代码使用协议遵循本仓库的开源协议及附加协议
|
||||
//// Gitee源代码仓库:https://gitee.com/diego2098/ThingsGateway
|
||||
//// Github源代码仓库:https://github.com/kimdiego2098/ThingsGateway
|
||||
//// 使用文档:https://thingsgateway.cn/
|
||||
//// QQ群:605534569
|
||||
////------------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------------
|
||||
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
|
||||
// 此代码版权(除特别声明外的代码)归作者本人Diego所有
|
||||
// 源代码使用协议遵循本仓库的开源协议及附加协议
|
||||
// Gitee源代码仓库:https://gitee.com/diego2098/ThingsGateway
|
||||
// Github源代码仓库:https://github.com/kimdiego2098/ThingsGateway
|
||||
// 使用文档:https://thingsgateway.cn/
|
||||
// QQ群:605534569
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//using System.Collections.Concurrent;
|
||||
using System.Collections.Concurrent;
|
||||
|
||||
//using ThingsGateway.NewLife.Threading;
|
||||
namespace ThingsGateway.Gateway.Razor;
|
||||
|
||||
//using TouchSocket.Core;
|
||||
public partial class VariableRow
|
||||
{
|
||||
[Parameter]
|
||||
public TableRowContext<VariableRuntime>? RowContent { get; set; }
|
||||
//private bool Disposed;
|
||||
//public void Dispose()
|
||||
//{
|
||||
// Disposed = true;
|
||||
// timer?.SafeDispose();
|
||||
// GC.SuppressFinalize(this);
|
||||
//}
|
||||
//TimerX? timer;
|
||||
//protected override void OnAfterRender(bool firstRender)
|
||||
//{
|
||||
// if (firstRender)
|
||||
// {
|
||||
// timer = new TimerX(Refresh, null, 1000, 1000, "VariableRow");
|
||||
// }
|
||||
// base.OnAfterRender(firstRender);
|
||||
//}
|
||||
|
||||
//namespace ThingsGateway.Gateway.Razor;
|
||||
//private Task Refresh(object? state)
|
||||
//{
|
||||
// if (!Disposed)
|
||||
// return InvokeAsync(StateHasChanged);
|
||||
// else
|
||||
// return Task.CompletedTask;
|
||||
//}
|
||||
|
||||
//public partial class VariableRow : IDisposable
|
||||
//{
|
||||
// [Parameter]
|
||||
// public TableRowContext<VariableRuntime>? RowContent { get; set; }
|
||||
// private bool Disposed;
|
||||
// public void Dispose()
|
||||
// {
|
||||
// Disposed = true;
|
||||
// timer?.SafeDispose();
|
||||
// GC.SuppressFinalize(this);
|
||||
// }
|
||||
// TimerX? timer;
|
||||
// protected override void OnAfterRender(bool firstRender)
|
||||
// {
|
||||
// if (firstRender)
|
||||
// {
|
||||
// timer = new TimerX(Refresh, null, 1000, 1000, "VariableRow");
|
||||
// }
|
||||
// base.OnAfterRender(firstRender);
|
||||
// }
|
||||
protected override void OnParametersSet()
|
||||
{
|
||||
FixedCellClassStringCache?.Clear();
|
||||
CellClassStringCache?.Clear();
|
||||
base.OnParametersSet();
|
||||
}
|
||||
|
||||
// private Task Refresh(object? state)
|
||||
// {
|
||||
// if (!Disposed)
|
||||
// return InvokeAsync(StateHasChanged);
|
||||
// else
|
||||
// return Task.CompletedTask;
|
||||
// }
|
||||
/// <summary>
|
||||
/// 获得指定列头固定列样式
|
||||
/// </summary>
|
||||
/// <param name="col"></param>
|
||||
/// <param name="margin"></param>
|
||||
/// <returns></returns>
|
||||
protected string? GetFixedCellStyleString(ITableColumn col, int margin = 0)
|
||||
{
|
||||
string? ret = null;
|
||||
if (col.Fixed)
|
||||
{
|
||||
ret = IsTail(col) ? GetRightStyle(col, margin) : GetLeftStyle(col);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
// protected override void OnParametersSet()
|
||||
// {
|
||||
// FixedCellClassStringCache?.Clear();
|
||||
// CellClassStringCache?.Clear();
|
||||
// base.OnParametersSet();
|
||||
// }
|
||||
// /// <summary>
|
||||
// /// 获得 指定单元格数据方法
|
||||
// /// </summary>
|
||||
// /// <param name="col"></param>
|
||||
// /// <param name="item"></param>
|
||||
// /// <returns></returns>
|
||||
// protected static RenderFragment GetValue(ITableColumn col, VariableRuntime item) => builder =>
|
||||
// {
|
||||
// if (col.Template != null)
|
||||
// {
|
||||
// builder.AddContent(0, col.Template(item));
|
||||
// }
|
||||
// else if (col.ComponentType == typeof(ColorPicker))
|
||||
// {
|
||||
// // 自动化处理 ColorPicker 组件
|
||||
// builder.AddContent(10, col.RenderColor(item));
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// builder.AddContent(20, col.RenderValue(item));
|
||||
// }
|
||||
// };
|
||||
private string? GetLeftStyle(ITableColumn col)
|
||||
{
|
||||
var columns = RowContent.Columns.ToList();
|
||||
var defaultWidth = 200;
|
||||
var width = 0;
|
||||
var start = 0;
|
||||
var index = columns.IndexOf(col);
|
||||
//if (GetFixedDetailRowHeaderColumn)
|
||||
//{
|
||||
// width += DetailColumnWidth;
|
||||
//}
|
||||
//if (GetFixedMultipleSelectColumn)
|
||||
//{
|
||||
// width += MultiColumnWidth;
|
||||
//}
|
||||
if (GetFixedLineNoColumn)
|
||||
{
|
||||
width += LineNoColumnWidth;
|
||||
}
|
||||
while (index > start)
|
||||
{
|
||||
var column = columns[start++];
|
||||
width += column.Width ?? defaultWidth;
|
||||
}
|
||||
return $"left: {width}px;";
|
||||
}
|
||||
private bool GetFixedLineNoColumn = false;
|
||||
|
||||
// // internal static string? GetDoubleClickCellClassString(bool trigger) => CssBuilder.Default()
|
||||
// //.AddClass("is-dbcell", trigger)
|
||||
// //.Build();
|
||||
private string? GetRightStyle(ITableColumn col, int margin)
|
||||
{
|
||||
var columns = RowContent.Columns.ToList();
|
||||
var defaultWidth = 200;
|
||||
var width = 0;
|
||||
var index = columns.IndexOf(col);
|
||||
|
||||
// /// <summary>
|
||||
// /// 获得指定列头固定列样式
|
||||
// /// </summary>
|
||||
// /// <param name="col"></param>
|
||||
// /// <param name="margin"></param>
|
||||
// /// <returns></returns>
|
||||
// protected string? GetFixedCellStyleString(ITableColumn col, int margin = 0)
|
||||
// {
|
||||
// string? ret = null;
|
||||
// if (col.Fixed)
|
||||
// {
|
||||
// ret = IsTail(col) ? GetRightStyle(col, margin) : GetLeftStyle(col);
|
||||
// }
|
||||
// return ret;
|
||||
// }
|
||||
// after
|
||||
while (index + 1 < columns.Count)
|
||||
{
|
||||
var column = columns[index++];
|
||||
width += column.Width ?? defaultWidth;
|
||||
}
|
||||
//if (ShowExtendButtons && FixedExtendButtonsColumn)
|
||||
{
|
||||
width += ExtendButtonColumnWidth;
|
||||
}
|
||||
|
||||
// private string? GetLeftStyle(ITableColumn col)
|
||||
// {
|
||||
// var columns = RowContent.Columns.ToList();
|
||||
// var defaultWidth = 200;
|
||||
// var width = 0;
|
||||
// var start = 0;
|
||||
// var index = columns.IndexOf(col);
|
||||
// //if (GetFixedDetailRowHeaderColumn)
|
||||
// //{
|
||||
// // width += DetailColumnWidth;
|
||||
// //}
|
||||
// //if (GetFixedMultipleSelectColumn)
|
||||
// //{
|
||||
// // width += MultiColumnWidth;
|
||||
// //}
|
||||
// if (GetFixedLineNoColumn)
|
||||
// {
|
||||
// width += LineNoColumnWidth;
|
||||
// }
|
||||
// while (index > start)
|
||||
// {
|
||||
// var column = columns[start++];
|
||||
// width += column.Width ?? defaultWidth;
|
||||
// }
|
||||
// return $"left: {width}px;";
|
||||
// }
|
||||
// private bool GetFixedLineNoColumn = false;
|
||||
// 如果是固定表头时增加滚动条位置
|
||||
if (IsFixedHeader && (index + 1) == columns.Count)
|
||||
{
|
||||
width += margin;
|
||||
}
|
||||
return $"right: {width}px;";
|
||||
}
|
||||
private bool IsFixedHeader = true;
|
||||
|
||||
// private string? GetRightStyle(ITableColumn col, int margin)
|
||||
// {
|
||||
// var columns = RowContent.Columns.ToList();
|
||||
// var defaultWidth = 200;
|
||||
// var width = 0;
|
||||
// var index = columns.IndexOf(col);
|
||||
|
||||
// // after
|
||||
// while (index + 1 < columns.Count)
|
||||
// {
|
||||
// var column = columns[index++];
|
||||
// width += column.Width ?? defaultWidth;
|
||||
// }
|
||||
// //if (ShowExtendButtons && FixedExtendButtonsColumn)
|
||||
// {
|
||||
// width += ExtendButtonColumnWidth;
|
||||
// }
|
||||
|
||||
// // 如果是固定表头时增加滚动条位置
|
||||
// if (IsFixedHeader && (index + 1) == columns.Count)
|
||||
// {
|
||||
// width += margin;
|
||||
// }
|
||||
// return $"right: {width}px;";
|
||||
// }
|
||||
// private bool IsFixedHeader = true;
|
||||
|
||||
// public int LineNoColumnWidth { get; set; } = 60;
|
||||
// public int ExtendButtonColumnWidth { get; set; } = 220;
|
||||
public int LineNoColumnWidth { get; set; } = 60;
|
||||
public int ExtendButtonColumnWidth { get; set; } = 220;
|
||||
|
||||
|
||||
// private bool IsTail(ITableColumn col)
|
||||
// {
|
||||
// var middle = Math.Floor(RowContent.Columns.Count() * 1.0 / 2);
|
||||
// var index = Columns.IndexOf(col);
|
||||
// return middle < index;
|
||||
// }
|
||||
// private NonBlockingDictionary<ITableColumn, string> CellClassStringCache { get; } = new(ReferenceEqualityComparer.Instance);
|
||||
private bool IsTail(ITableColumn col)
|
||||
{
|
||||
var middle = Math.Floor(RowContent.Columns.Count() * 1.0 / 2);
|
||||
var index = Columns.IndexOf(col);
|
||||
return middle < index;
|
||||
}
|
||||
private NonBlockingDictionary<ITableColumn, string> CellClassStringCache { get; } = new(ReferenceEqualityComparer.Instance);
|
||||
|
||||
// /// <summary>
|
||||
// /// 获得 Cell 文字样式
|
||||
// /// </summary>
|
||||
// /// <param name="col"></param>
|
||||
// /// <param name="hasChildren"></param>
|
||||
// /// <param name="inCell"></param>
|
||||
// /// <returns></returns>
|
||||
// protected string? GetCellClassString(ITableColumn col, bool hasChildren, bool inCell)
|
||||
// {
|
||||
// if (CellClassStringCache.TryGetValue(col, out var cached))
|
||||
// {
|
||||
// return cached;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// bool trigger = false;
|
||||
// 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());
|
||||
// }
|
||||
/// <summary>
|
||||
/// 获得 Cell 文字样式
|
||||
/// </summary>
|
||||
/// <param name="col"></param>
|
||||
/// <param name="hasChildren"></param>
|
||||
/// <param name="inCell"></param>
|
||||
/// <returns></returns>
|
||||
protected string? GetCellClassString(ITableColumn col, bool hasChildren, bool inCell)
|
||||
{
|
||||
if (CellClassStringCache.TryGetValue(col, out var cached))
|
||||
{
|
||||
return cached;
|
||||
}
|
||||
else
|
||||
{
|
||||
bool trigger = false;
|
||||
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 IsTree = false;
|
||||
private bool AllowResizing = true;
|
||||
private bool IsTree = false;
|
||||
|
||||
// private NonBlockingDictionary<ITableColumn, string> FixedCellClassStringCache { get; } = new(ReferenceEqualityComparer.Instance);
|
||||
// /// <summary>
|
||||
// /// 获得指定列头固定列样式
|
||||
// /// </summary>
|
||||
// /// <param name="col"></param>
|
||||
// /// <returns></returns>
|
||||
// protected string? GetFixedCellClassString(ITableColumn col)
|
||||
// {
|
||||
// if (FixedCellClassStringCache.TryGetValue(col, out var cached))
|
||||
// {
|
||||
// return cached;
|
||||
// }
|
||||
// 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());
|
||||
private NonBlockingDictionary<ITableColumn, string> FixedCellClassStringCache { get; } = new(ReferenceEqualityComparer.Instance);
|
||||
/// <summary>
|
||||
/// 获得指定列头固定列样式
|
||||
/// </summary>
|
||||
/// <param name="col"></param>
|
||||
/// <returns></returns>
|
||||
protected string? GetFixedCellClassString(ITableColumn col)
|
||||
{
|
||||
if (FixedCellClassStringCache.TryGetValue(col, out var cached))
|
||||
{
|
||||
return cached;
|
||||
}
|
||||
else
|
||||
{
|
||||
return FixedCellClassStringCache.GetOrAdd(col, col => CssBuilder.Default(col.GetFieldName())
|
||||
.AddClass("fixed", col.Fixed)
|
||||
.AddClass("fixed-right", col.Fixed && IsTail(col))
|
||||
.AddClass("fr", IsLastColumn(col))
|
||||
.AddClass("fl", IsFirstColumn(col))
|
||||
.Build());
|
||||
|
||||
// }
|
||||
}
|
||||
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
// [Parameter]
|
||||
// public Func<List<ITableColumn>> ColumnsFunc { get; set; }
|
||||
// public List<ITableColumn> Columns => ColumnsFunc();
|
||||
[Parameter]
|
||||
public Func<List<ITableColumn>> ColumnsFunc { get; set; }
|
||||
public List<ITableColumn> Columns => ColumnsFunc();
|
||||
|
||||
// private NonBlockingDictionary<ITableColumn, bool> LastFixedColumnCache { get; } = new(ReferenceEqualityComparer.Instance);
|
||||
// private bool IsLastColumn(ITableColumn col)
|
||||
// {
|
||||
// if (LastFixedColumnCache.TryGetValue(col, out var cached))
|
||||
// {
|
||||
// return cached;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// return LastFixedColumnCache.GetOrAdd(col, col =>
|
||||
// {
|
||||
// var ret = false;
|
||||
// if (col.Fixed && !IsTail(col))
|
||||
// {
|
||||
// var index = Columns.IndexOf(col) + 1;
|
||||
// ret = index < Columns.Count && Columns[index].Fixed == false;
|
||||
// }
|
||||
// return ret;
|
||||
// });
|
||||
private NonBlockingDictionary<ITableColumn, bool> LastFixedColumnCache { get; } = new(ReferenceEqualityComparer.Instance);
|
||||
private bool IsLastColumn(ITableColumn col)
|
||||
{
|
||||
if (LastFixedColumnCache.TryGetValue(col, out var cached))
|
||||
{
|
||||
return cached;
|
||||
}
|
||||
else
|
||||
{
|
||||
return LastFixedColumnCache.GetOrAdd(col, col =>
|
||||
{
|
||||
var ret = false;
|
||||
if (col.Fixed && !IsTail(col))
|
||||
{
|
||||
var index = Columns.IndexOf(col) + 1;
|
||||
ret = index < Columns.Count && Columns[index].Fixed == false;
|
||||
}
|
||||
return ret;
|
||||
});
|
||||
|
||||
// }
|
||||
// }
|
||||
// private NonBlockingDictionary<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;
|
||||
// });
|
||||
}
|
||||
}
|
||||
private NonBlockingDictionary<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;
|
||||
});
|
||||
|
||||
// }
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//}
|
||||
}
|
||||
|
@@ -1,60 +0,0 @@
|
||||
////------------------------------------------------------------------------------
|
||||
//// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
|
||||
//// 此代码版权(除特别声明外的代码)归作者本人Diego所有
|
||||
//// 源代码使用协议遵循本仓库的开源协议及附加协议
|
||||
//// Gitee源代码仓库:https://gitee.com/diego2098/ThingsGateway
|
||||
//// Github源代码仓库:https://github.com/kimdiego2098/ThingsGateway
|
||||
//// 使用文档:https://thingsgateway.cn/
|
||||
//// QQ群:605534569
|
||||
////------------------------------------------------------------------------------
|
||||
|
||||
//namespace ThingsGateway.Gateway.Razor;
|
||||
|
||||
//internal static class VariableRowHelpers
|
||||
//{
|
||||
// internal static Alignment GetAlign(this ITableColumn col) => col.Align ?? Alignment.None;
|
||||
// internal static bool GetTextWrap(this ITableColumn col) => col.TextWrap ?? false;
|
||||
// internal static bool GetShowTips(this ITableColumn col) => col.ShowTips ?? false;
|
||||
|
||||
|
||||
// internal static RenderFragment RenderColor<TItem>(this ITableColumn col, TItem item) => builder =>
|
||||
// {
|
||||
// var val = GetItemValue(col, item);
|
||||
// var v = val?.ToString() ?? "#000";
|
||||
// var style = $"background-color: {v};";
|
||||
// builder.OpenElement(0, "div");
|
||||
// builder.AddAttribute(1, "class", "is-color");
|
||||
// builder.AddAttribute(2, "style", style);
|
||||
// builder.CloseElement();
|
||||
// };
|
||||
// internal static object? GetItemValue<TItem>(this ITableColumn col, TItem item)
|
||||
// {
|
||||
// var fieldName = col.GetFieldName();
|
||||
// object? ret;
|
||||
// if (item is IDynamicObject dynamicObject)
|
||||
// {
|
||||
// ret = dynamicObject.GetValue(fieldName);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// ret = Utility.GetPropertyValue<TItem, object?>(item, fieldName);
|
||||
|
||||
// if (ret != null)
|
||||
// {
|
||||
// var t = ret.GetType();
|
||||
// if (t.IsEnum)
|
||||
// {
|
||||
// // 如果是枚举这里返回 枚举的描述信息
|
||||
// var itemName = ret.ToString();
|
||||
// if (!string.IsNullOrEmpty(itemName))
|
||||
// {
|
||||
// ret = Utility.GetDisplayName(t, itemName);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// return ret;
|
||||
// }
|
||||
// internal static bool GetTextEllipsis(this ITableColumn col) => col.TextEllipsis ?? false;
|
||||
|
||||
//}
|
@@ -12,6 +12,8 @@
|
||||
|
||||
<AdminTable Id=@Id @ref=table BeforeShowEditDialogCallback="BeforeShowEditDialogCallback"
|
||||
TItem="VariableRuntime"
|
||||
RenderMode="TableRenderMode.Table"
|
||||
ShowCardView=false
|
||||
EditDialogSize="Size.ExtraLarge"
|
||||
AutoGenerateColumns="true"
|
||||
ShowAdvancedSearch=false
|
||||
@@ -89,11 +91,11 @@
|
||||
<VariableEditComponent Model=@(context) AutoRestartThread="AutoRestartThread"></VariableEditComponent>
|
||||
</EditTemplate>
|
||||
|
||||
@* <RowContentTemplate Context="context">
|
||||
<RowContentTemplate Context="context">
|
||||
|
||||
<VariableRow RowContent="@context" ColumnsFunc="ColumnsFunc"></VariableRow>
|
||||
|
||||
</RowContentTemplate> *@
|
||||
</RowContentTemplate>
|
||||
|
||||
<ExportButtonDropdownTemplate Context="ExportContext">
|
||||
@if ((AuthorizeButton("导出")))
|
||||
|
@@ -16,7 +16,6 @@ using ThingsGateway.Admin.Application;
|
||||
using ThingsGateway.Admin.Razor;
|
||||
using ThingsGateway.DB;
|
||||
using ThingsGateway.Extension.Generic;
|
||||
using ThingsGateway.NewLife;
|
||||
using ThingsGateway.NewLife.Json.Extension;
|
||||
|
||||
namespace ThingsGateway.Gateway.Razor;
|
||||
@@ -62,7 +61,10 @@ public partial class VariableRuntimeInfo
|
||||
public ToastService? ToastService { get; set; }
|
||||
|
||||
#region js
|
||||
|
||||
private List<ITableColumn> ColumnsFunc()
|
||||
{
|
||||
return table.Columns;
|
||||
}
|
||||
protected override Task InvokeInitAsync() => InvokeVoidAsync("init", Id, Interop, new { Method = nameof(TriggerStateChanged) });
|
||||
|
||||
private Task OnColumnVisibleChanged(string name, bool visible)
|
||||
@@ -97,60 +99,7 @@ public partial class VariableRuntimeInfo
|
||||
foreach (var col in _cachedFields)
|
||||
{
|
||||
var fieldName = col.GetFieldName();
|
||||
switch (fieldName)
|
||||
{
|
||||
case nameof(VariableRuntime.Value):
|
||||
list.Add(new(fieldName, row.Value?.ToSystemTextJsonString() ?? string.Empty));
|
||||
break;
|
||||
case nameof(VariableRuntime.RawValue):
|
||||
list.Add(new(fieldName, row.RawValue?.ToSystemTextJsonString() ?? string.Empty));
|
||||
break;
|
||||
case nameof(VariableRuntime.LastSetValue):
|
||||
list.Add(new(fieldName, row.LastSetValue?.ToSystemTextJsonString() ?? string.Empty));
|
||||
break;
|
||||
case nameof(VariableRuntime.ChangeTime):
|
||||
list.Add(new(fieldName, row.ChangeTime.ToString("yyyy-MM-dd HH:mm:ss.fff")));
|
||||
break;
|
||||
|
||||
case nameof(VariableRuntime.CollectTime):
|
||||
list.Add(new(fieldName, row.CollectTime.ToString("yyyy-MM-dd HH:mm:ss.fff")));
|
||||
break;
|
||||
|
||||
case nameof(VariableRuntime.IsOnline):
|
||||
list.Add(new(fieldName, row.IsOnline.ToString()));
|
||||
break;
|
||||
|
||||
case nameof(VariableRuntime.LastErrorMessage):
|
||||
list.Add(new(fieldName, row.LastErrorMessage));
|
||||
break;
|
||||
|
||||
|
||||
case nameof(VariableRuntime.RuntimeType):
|
||||
list.Add(new(fieldName, row.RuntimeType));
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
var ret = VariableModelUtils.GetPropertyValue(row, fieldName);
|
||||
|
||||
if (ret != null)
|
||||
{
|
||||
var t = ret.GetType();
|
||||
if (t.IsEnum)
|
||||
{
|
||||
// 如果是枚举这里返回 枚举的描述信息
|
||||
var itemName = ret.ToString();
|
||||
if (!string.IsNullOrEmpty(itemName))
|
||||
{
|
||||
ret = Utility.GetDisplayName(t, itemName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
list.Add(new(fieldName, ret is string str ? str : ret?.ToString() ?? string.Empty));
|
||||
break;
|
||||
}
|
||||
|
||||
list.Add(new(fieldName, VariableModelUtils.GetValue(row,fieldName)));
|
||||
}
|
||||
|
||||
return list;
|
||||
|
@@ -41,45 +41,54 @@
|
||||
if (!cell) continue;
|
||||
|
||||
// 查找 tooltip span
|
||||
var tooltipSpan = cell.querySelector('.bb-tooltip');
|
||||
if (tooltipSpan) {
|
||||
tooltipSpan.innerText = cellValue ?? ''; // 更新显示文字
|
||||
tooltipSpan.setAttribute('data-bs-original-title', cellValue ?? ''); // 同步 tooltip 提示
|
||||
continue;
|
||||
}
|
||||
var cellDiv = cell.querySelector('.table-cell');
|
||||
if (cellDiv) {
|
||||
var tooltipSpan = cell.querySelector('.bb-tooltip');
|
||||
if (tooltipSpan) {
|
||||
|
||||
// 查找 switch
|
||||
var switchDiv = cell.querySelector('.switch');
|
||||
if (switchDiv) {
|
||||
if (cellValue === true || cellValue === "on" || cellValue === "True" || cellValue === "true") {
|
||||
switchDiv.classList.add('is-checked');
|
||||
switchDiv.classList.add('enable');
|
||||
switchDiv.classList.remove('is-unchecked');
|
||||
switchDiv.classList.remove('disabled');
|
||||
tooltipSpan.innerText = cellValue ?? ''; // 更新显示文字
|
||||
tooltipSpan.setAttribute('data-bs-original-title', cellValue ?? ''); // 同步 tooltip 提示
|
||||
continue;
|
||||
|
||||
switchDiv.querySelectorAll('span')[0].classList.add('border-success');
|
||||
switchDiv.querySelectorAll('span')[0].classList.add('bg-success');
|
||||
|
||||
} else {
|
||||
switchDiv.classList.remove('is-checked');
|
||||
switchDiv.classList.remove('enable');
|
||||
switchDiv.classList.add('is-unchecked');
|
||||
switchDiv.classList.add('disabled');
|
||||
|
||||
switchDiv.querySelectorAll('span')[0].classList.remove('border-success');
|
||||
switchDiv.querySelectorAll('span')[0].classList.remove('bg-success');
|
||||
}
|
||||
continue;
|
||||
else {
|
||||
cellDiv.innerText = cellValue ?? '';
|
||||
}
|
||||
}
|
||||
// 默认情况(普通单元格)
|
||||
getCellByClass(row, cellName).innerText = cellValue;
|
||||
|
||||
//// 查找 switch
|
||||
//var switchDiv = cell.querySelector('.switch');
|
||||
//if (switchDiv) {
|
||||
// if (cellValue === true || cellValue === "on" || cellValue === "True" || cellValue === "true") {
|
||||
// switchDiv.classList.add('is-checked');
|
||||
// switchDiv.classList.add('enable');
|
||||
// switchDiv.classList.remove('is-unchecked');
|
||||
// switchDiv.classList.remove('disabled');
|
||||
|
||||
// switchDiv.querySelectorAll('span')[0].classList.add('border-success');
|
||||
// switchDiv.querySelectorAll('span')[0].classList.add('bg-success');
|
||||
|
||||
// } else {
|
||||
// switchDiv.classList.remove('is-checked');
|
||||
// switchDiv.classList.remove('enable');
|
||||
// switchDiv.classList.add('is-unchecked');
|
||||
// switchDiv.classList.add('disabled');
|
||||
|
||||
// switchDiv.querySelectorAll('span')[0].classList.remove('border-success');
|
||||
// switchDiv.querySelectorAll('span')[0].classList.remove('bg-success');
|
||||
// }
|
||||
// continue;
|
||||
//}
|
||||
//// 默认情况(普通单元格)
|
||||
//getCellByClass(row, cellName).innerText = cellValue;
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
, 1000) //1000ms刷新一次
|
||||
, 500) //1000ms刷新一次
|
||||
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user