[feat]列表ListField增肌文本对齐方式TextAlign和单元格样式Class;

百分比字段支持根据Scale控制小数位数;
This commit is contained in:
大石头 2023-12-18 10:35:23 +08:00
parent 1a082440b9
commit a682cf217a
5 changed files with 136 additions and 56 deletions

View File

@ -6,7 +6,6 @@ using System.Xml.Serialization;
using NewLife.Collections;
using NewLife.Data;
using NewLife.Reflection;
using XCode;
using XCode.Configuration;
namespace NewLife.Cube.ViewModels;
@ -45,6 +44,12 @@ public class ListField : DataField
/// <summary>头部标题。数据移上去后显示的文字</summary>
public String HeaderTitle { get; set; }
/// <summary>文本对齐方式</summary>
public TextAligns TextAlign { get; set; }
/// <summary>单元格样式</summary>
public String Class { get; set; }
///// <summary>头部链接。一般是排序</summary>
//public String HeaderUrl { get; set; }

View File

@ -0,0 +1,26 @@
namespace NewLife.Cube.ViewModels;
/// <summary>文本对齐方式</summary>
/// <remarks>
/// 可选 text-center/text-left/text-right/text-justify
/// </remarks>
public enum TextAligns
{
/// <summary>默认,文本左对齐,数字右对齐</summary>
Default = 0,
/// <summary>左对齐</summary>
Left = 1,
/// <summary>居中对齐</summary>
Center = 2,
/// <summary>右对齐</summary>
Right = 3,
/// <summary>两端对齐</summary>
Justify = 4,
/// <summary>阻止文字折行</summary>
Nowrap = 5,
}

View File

@ -15,10 +15,42 @@
// 第二名称,去掉后面的数字,便于模式匹配
var digits = new[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
var name2 = item.Name.TrimEnd(digits);
// 文本对齐方式
var tdClass = "";
switch (listField.TextAlign)
{
case TextAligns.Default:
tdClass = "";
break;
case TextAligns.Left:
tdClass = "text-left";
break;
case TextAligns.Center:
tdClass = "text-center";
break;
case TextAligns.Right:
tdClass = "text-right";
break;
case TextAligns.Justify:
tdClass = "text-justify";
break;
case TextAligns.Nowrap:
tdClass = "text-nowrap;max-width:600px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;";
break;
}
if (!listField.Class.IsNullOrEmpty())
{
if (tdClass.IsNullOrEmpty() || listField.Class.Contains("text-"))
tdClass = listField.Class;
else
tdClass += ";" + listField.Class;
}
if (tdClass.IsNullOrEmpty()) tdClass = null;
}
@if (item.PrimaryKey)
{
<td class="text-center">@value</td>
<td class="@(tdClass ?? "text-center")">@value</td>
}
else
{
@ -26,7 +58,7 @@ else
{
case TypeCode.Boolean:
var bval = (Boolean)value;
<td class="text-center">
<td class="@(tdClass ?? "text-center")">
@if (item.Name.EqualIgnoreCase("Enable") && factory.Unique != null)
{
var key = entity[factory.Unique.Name];
@ -44,37 +76,37 @@ else
var dt = (DateTime)value;
if (listField.GetValue != null)
{
<td class="text-center">@listField.GetValue(entity)</td>
<td class="@(tdClass ?? "text-center")">@listField.GetValue(entity)</td>
}
else if (item.ItemType.EqualIgnoreCase("date") || name2.EndsWith("Date"))
{
<td class="text-center">@dt.ToString("yyyy-MM-dd", "")</td>
<td class="@(tdClass ?? "text-center")">@dt.ToString("yyyy-MM-dd", "")</td>
}
else
{
<td class="text-center">@dt.ToFullString("")</td>
<td class="@(tdClass ?? "text-center")">@dt.ToFullString("")</td>
}
break;
case TypeCode.Decimal:
if (listField.GetValue != null)
{
<td class="text-center">@listField.GetValue(entity)</td>
<td class="@(tdClass ?? "text-center")">@listField.GetValue(entity)</td>
}
else if (item.ItemType.EqualIgnoreCase("Money"))
{
var dc = (Decimal)value;
<td class="text-right">@dc.ToString("c")</td>
<td class="@(tdClass ?? "text-right")">@dc.ToString("c")</td>
}
else
{
var dc = (Decimal)value;
if (item.Scale > 0)
{
<td class="text-right">@dc.ToString("n" + item.Scale)</td>
<td class="@(tdClass ?? "text-right")">@dc.ToString("n" + item.Scale)</td>
}
else
{
<td class="text-right">@dc.ToString()</td>
<td class="@(tdClass ?? "text-right")">@dc.ToString()</td>
}
}
break;
@ -82,34 +114,37 @@ else
case TypeCode.Double:
if (listField.GetValue != null)
{
<td class="text-right">@listField.GetValue(entity)</td>
<td class="@(tdClass ?? "text-right")">@listField.GetValue(entity)</td>
}
else if (item.ItemType.EqualIgnoreCase("percent", "Percentage"))
{
var dd = (Double)value;
<td class="text-center">@dd.ToString("p2")</td>
var scale = item.Scale >= 2 ? item.Scale - 2 : 2;
<td class="@(tdClass ?? "text-center")">@dd.ToString("p" + scale)</td>
}
else if (name2.EndsWith("Rate") || name2.EndsWith("Ratio") || item.ItemType.EqualIgnoreCase("percent", "Percentage"))
{
var dd = (Double)value;
var scale = 0;
var des = item.Description + "";
if (des.Contains("十分之一")) { dd /= 10; }
if (des.Contains("百分之一")) { dd /= 100; }
if (des.Contains("千分之一")) { dd /= 1000; }
if (des.Contains("万分之一")) { dd /= 10000; }
if (des.Contains("十分之一")) { dd /= 10; scale += 1; }
if (des.Contains("百分之一")) { dd /= 100; scale += 2; }
if (des.Contains("千分之一")) { dd /= 1000; scale += 3; }
if (des.Contains("万分之一")) { dd /= 10000; scale += 4; }
scale = scale >= 2 ? scale - 2 : 2;
<td class="text-center">@dd.ToString("p2")</td>
<td class="@(tdClass ?? "text-center")">@dd.ToString("p" + scale)</td>
}
else
{
var dd = (Double)value;
if (item.Scale > 0)
{
<td class="text-right">@dd.ToString("n" + item.Scale)</td>
<td class="@(tdClass ?? "text-right")">@dd.ToString("n" + item.Scale)</td>
}
else
{
<td class="text-right">@dd.ToString()</td>
<td class="@(tdClass ?? "text-right")">@dd.ToString()</td>
}
}
break;
@ -122,7 +157,7 @@ else
case TypeCode.UInt64:
if (listField.GetValue != null)
{
<td class="text-right">@listField.GetValue(entity)</td>
<td class="@(tdClass ?? "text-right")">@listField.GetValue(entity)</td>
}
//特殊处理枚举
else if (item.Type.IsEnum)
@ -133,53 +168,54 @@ else
val = EnumHelper.GetDescription((Enum)value) ?? value + "";
}
catch { }
<td class="text-center">@val</td>
<td class="@(tdClass ?? "text-center")">@val</td>
}
else if (item.ItemType.EqualIgnoreCase("TimeSpan"))
{
<td class="text-right">@(TimeSpan.FromSeconds(value.ToInt()))</td>
<td class="@(tdClass ?? "text-right")">@(TimeSpan.FromSeconds(value.ToInt()))</td>
}
else if (item.ItemType.EqualIgnoreCase("Time"))
{
<td class="text-center">@(value.ToLong().ToDateTime().ToLocalTime().ToFullString(""))</td>
<td class="@(tdClass ?? "text-center")">@(value.ToLong().ToDateTime().ToLocalTime().ToFullString(""))</td>
}
else if (item.ItemType.EqualIgnoreCase("GMK"))
{
<td class="text-right">@(value.ToLong().ToGMK())</td>
<td class="@(tdClass ?? "text-right")">@(value.ToLong().ToGMK())</td>
}
else if (item.Name.EqualIgnoreCase("CreateUserID", "UpdateUserID"))
{
//var provider = ViewData["Provider"] as IManageProvider;
if (provider != null)
{
<td class="text-center">@provider?.FindByID(value)</td>
<td class="@(tdClass ?? "text-center")">@provider?.FindByID(value)</td>
}
else
{
<td class="text-center">@value</td>
<td class="@(tdClass ?? "text-center")">@value</td>
}
}
else if (name2.EndsWith("Rate") || name2.EndsWith("Ratio") || item.ItemType.EqualIgnoreCase("percent", "Percentage"))
{
var dd = Convert.ToDouble(value);
var scale = 0;
var des = item.Description + "";
if (des.Contains("十分之一")) { dd /= 10; }
if (des.Contains("百分之一")) { dd /= 100; }
if (des.Contains("千分之一")) { dd /= 1000; }
if (des.Contains("万分之一")) { dd /= 10000; }
if (des.Contains("十分之一")) { dd /= 10; scale = 0; }
if (des.Contains("百分之一")) { dd /= 100; scale = 0; }
if (des.Contains("千分之一")) { dd /= 1000; scale = 1; }
if (des.Contains("万分之一")) { dd /= 10000; scale = 2; }
<td class="text-center">@dd.ToString("p2")</td>
<td class="@(tdClass ?? "text-center")">@dd.ToString("p" + scale)</td>
}
else
{
<td class="text-right">@Convert.ToInt64(value).ToString("n0")</td>
<td class="@(tdClass ?? "text-right")">@Convert.ToInt64(value).ToString("n0")</td>
}
break;
case TypeCode.String:
default:
if (listField.GetValue != null)
{
<td>@listField.GetValue(entity)</td>
<td class="@tdClass">@listField.GetValue(entity)</td>
}
else
{
@ -191,25 +227,25 @@ else
var name = item.MapProvider.EntityType.Name;
var key = item.MapProvider.Key;
val = entity[item.MapField];
<td class="text-center"><a href="@name?@key=@val">@value</a></td>
<td class="@(tdClass ?? "text-center")"><a href="@name?@key=@val">@value</a></td>
}
else
{
<td class="text-center">@value</td>
<td class="@(tdClass ?? "text-center")">@value</td>
}
}
else if (item.Name.EqualIgnoreCase("CreateIP", "UpdateIP"))
{
<td class="text-center" title="@((value+"").IPToAddress())">@value</td>
<td class="@(tdClass ?? "text-center")" title="@((value+"").IPToAddress())">@value</td>
}
else if (item.IsBigText())
{
//防止内容过长
<td style="max-width:600px;overflow:hidden;white-space: nowrap;text-overflow: ellipsis;" title="@value">@value</td>
<td style="@tdClass" title="@value">@value</td>
}
else
{
<td>@value</td>
<td class="@tdClass">@value</td>
}
}
break;

View File

@ -19,7 +19,7 @@
{
if (item.PrimaryKey)
{
<td>总计</td>
<td class="text-center">总计</td>
}
else
{
@ -66,18 +66,21 @@
else if (item.ItemType.EqualIgnoreCase("percent", "Percentage"))
{
var dd = (Double)value;
<td class="text-center">@dd.ToString("p2")</td>
var scale = item.Scale >= 2 ? item.Scale - 2 : 2;
<td class="text-center">@dd.ToString("p" + scale)</td>
}
else if (name2.EndsWith("Rate") || name2.EndsWith("Ratio") || item.ItemType.EqualIgnoreCase("percent", "Percentage"))
{
var dd = (Double)value;
var scale = item.Scale;
var des = item.Description + "";
if (des.Contains("十分之一")) { dd /= 10; }
if (des.Contains("百分之一")) { dd /= 100; }
if (des.Contains("千分之一")) { dd /= 1000; }
if (des.Contains("万分之一")) { dd /= 10000; }
if (des.Contains("十分之一")) { dd /= 10; scale += 1; }
if (des.Contains("百分之一")) { dd /= 100; scale += 2; }
if (des.Contains("千分之一")) { dd /= 1000; scale += 3; }
if (des.Contains("万分之一")) { dd /= 10000; scale += 4; }
scale = scale >= 2 ? scale - 2 : 2;
<td class="text-center">@dd.ToString("p2")</td>
<td class="text-center">@dd.ToString("p" + scale)</td>
}
else
{
@ -111,13 +114,14 @@
else if (name2.EndsWith("Rate") || name2.EndsWith("Ratio") || item.ItemType.EqualIgnoreCase("percent", "Percentage"))
{
var dd = Convert.ToDouble(value);
var scale = 0;
var des = item.Description + "";
if (des.Contains("十分之一")) { dd /= 10; }
if (des.Contains("百分之一")) { dd /= 100; }
if (des.Contains("千分之一")) { dd /= 1000; }
if (des.Contains("万分之一")) { dd /= 10000; }
if (des.Contains("十分之一")) { dd /= 10; scale = 0; }
if (des.Contains("百分之一")) { dd /= 100; scale = 0; }
if (des.Contains("千分之一")) { dd /= 1000; scale = 1; }
if (des.Contains("万分之一")) { dd /= 10000; scale = 2; }
<td class="text-center">@dd.ToString("p2")</td>
<td class="text-center">@dd.ToString("p" + scale)</td>
}
else
{

View File

@ -69,20 +69,29 @@ else
break;
case TypeCode.Decimal:
var dc = (Decimal)value;
<td>@dc.ToString("n2")</td>
if (item.Scale > 0)
{
<td>@dc.ToString("n" + item.Scale)</td>
}
else
{
<td>@dc.ToString()</td>
}
break;
case TypeCode.Single:
case TypeCode.Double:
if (name2.EndsWith("Rate") || name2.EndsWith("Ratio") || item.ItemType.EqualIgnoreCase("percent", "Percentage"))
{
var dd = (Double)value;
var scale = item.Scale >= 2 ? item.Scale - 2 : 2;
var des = item.Description + "";
if (des.Contains("十分之一")) { dd /= 10; }
if (des.Contains("百分之一")) { dd /= 100; }
if (des.Contains("千分之一")) { dd /= 1000; }
if (des.Contains("万分之一")) { dd /= 10000; }
if (des.Contains("十分之一")) { dd /= 10; scale += 1; }
if (des.Contains("百分之一")) { dd /= 100; scale += 2; }
if (des.Contains("千分之一")) { dd /= 1000; scale += 3; }
if (des.Contains("万分之一")) { dd /= 10000; scale += 4; }
scale = scale >= 2 ? scale - 2 : 2;
<td>@dd.ToString("p2")</td>
<td>@dd.ToString("p" + scale)</td>
}
else
{