diff --git a/src/BootstrapBlazor/BootstrapBlazor.csproj b/src/BootstrapBlazor/BootstrapBlazor.csproj index 301325292d5..78c373a09a7 100644 --- a/src/BootstrapBlazor/BootstrapBlazor.csproj +++ b/src/BootstrapBlazor/BootstrapBlazor.csproj @@ -1,11 +1,11 @@  - 9.11.5-beta02 + 9.11.5-beta03 - 10.0.0-rc.2.1.1 + 10.0.0-rc.2.1.2 diff --git a/src/BootstrapBlazor/Components/EditorForm/EditorForm.razor.cs b/src/BootstrapBlazor/Components/EditorForm/EditorForm.razor.cs index fc97a9dae6f..8ddf2b3a444 100644 --- a/src/BootstrapBlazor/Components/EditorForm/EditorForm.razor.cs +++ b/src/BootstrapBlazor/Components/EditorForm/EditorForm.razor.cs @@ -114,6 +114,12 @@ public partial class EditorForm : IShowLabel [Parameter] public bool IsDisplay { get; set; } + /// + /// 获得/设置 是否显示 Display 组件的 Tooltip 默认为 false + /// + [Parameter] + public bool IsShowDisplayTooltip { get; set; } + /// /// 获得/设置 是否使用 SearchTemplate 默认 false 使用 EditTemplate 模板 /// @@ -280,7 +286,7 @@ private RenderFragment AutoGenerateTemplate(IEditorItem item) => builder => { if (IsDisplay || !item.CanWrite(typeof(TModel), ItemChangedType, IsSearch.Value)) { - builder.CreateDisplayByFieldType(item, Model); + builder.CreateDisplayByFieldType(item, Model, IsShowDisplayTooltip); } else { diff --git a/src/BootstrapBlazor/Utils/Utility.cs b/src/BootstrapBlazor/Utils/Utility.cs index 3cfdea287a8..f58a6a06f99 100644 --- a/src/BootstrapBlazor/Utils/Utility.cs +++ b/src/BootstrapBlazor/Utils/Utility.cs @@ -391,10 +391,11 @@ internal static IEnumerable OrderFunc(this List cols /// /// RenderTreeBuilder 扩展方法 通过 IEditorItem 与 model 创建 Display 组件 /// - /// - /// - /// - public static void CreateDisplayByFieldType(this RenderTreeBuilder builder, IEditorItem item, object model) + /// 实例 + /// 实例 + /// 当前模型对象实例 + /// 如果是 组件时是否显示提示栏 默认 false + public static void CreateDisplayByFieldType(this RenderTreeBuilder builder, IEditorItem item, object model, bool showTooltip = false) { var fieldType = item.PropertyType; var fieldName = item.GetFieldName(); @@ -403,60 +404,80 @@ public static void CreateDisplayByFieldType(this RenderTreeBuilder builder, IEdi var type = (Nullable.GetUnderlyingType(fieldType) ?? fieldType); if (type == typeof(bool) || fieldValue?.GetType() == typeof(bool)) { - builder.OpenComponent(0); - builder.AddAttribute(10, nameof(Switch.Value), fieldValue); - builder.AddAttribute(20, nameof(Switch.IsDisabled), true); - builder.AddAttribute(30, nameof(Switch.DisplayText), displayName); - builder.AddAttribute(40, nameof(Switch.ShowLabelTooltip), item.ShowLabelTooltip); - if (item is ITableColumn col) - { - builder.AddAttribute(50, "class", col.CssClass); - } - builder.AddMultipleAttributes(60, item.ComponentParameters); + builder.RenderSwitch(item, fieldValue, displayName); } else if (item.ComponentType == typeof(Textarea) || item.Rows > 0) { - builder.OpenComponent(0, typeof(Textarea)); - builder.AddAttribute(10, nameof(Textarea.DisplayText), displayName); - builder.AddAttribute(20, nameof(Textarea.Value), fieldValue); - builder.AddAttribute(30, nameof(Textarea.ShowLabelTooltip), item.ShowLabelTooltip); - builder.AddAttribute(40, "readonly", true); - if (item.Rows > 0) - { - builder.AddAttribute(50, "rows", item.Rows); - } - if (item is ITableColumn col) - { - builder.AddAttribute(60, "class", col.CssClass); - } - builder.AddMultipleAttributes(70, item.ComponentParameters); + builder.RenderTextarea(item, fieldValue, displayName); } else { - builder.OpenComponent(0, typeof(Display<>).MakeGenericType(fieldType)); - builder.AddAttribute(10, nameof(Display.DisplayText), displayName); - builder.AddAttribute(20, nameof(Display.Value), fieldValue); - builder.AddAttribute(30, nameof(Display.Lookup), item.Lookup); - builder.AddAttribute(30, nameof(Display.LookupService), item.LookupService); - builder.AddAttribute(40, nameof(Display.LookupServiceKey), item.LookupServiceKey); - builder.AddAttribute(50, nameof(Display.LookupServiceData), item.LookupServiceData); - builder.AddAttribute(60, nameof(Display.LookupStringComparison), item.LookupStringComparison); - builder.AddAttribute(65, nameof(Display.ShowLabelTooltip), item.ShowLabelTooltip); - if (item is ITableColumn col) + builder.RenderDisplay(item, fieldType, fieldValue, displayName, showTooltip); + } + } + + private static void RenderTextarea(this RenderTreeBuilder builder, IEditorItem item, object? fieldValue, string? displayName) + { + builder.OpenComponent(0, typeof(Textarea)); + builder.AddAttribute(10, nameof(Textarea.DisplayText), displayName); + builder.AddAttribute(20, nameof(Textarea.Value), fieldValue); + builder.AddAttribute(30, nameof(Textarea.ShowLabelTooltip), item.ShowLabelTooltip); + builder.AddAttribute(40, "readonly", true); + + if (item.Rows > 0) + { + builder.AddAttribute(50, "rows", item.Rows); + } + if (item is ITableColumn col) + { + builder.AddAttribute(60, "class", col.CssClass); + } + builder.AddMultipleAttributes(70, item.ComponentParameters); + builder.CloseComponent(); + } + + private static void RenderSwitch(this RenderTreeBuilder builder, IEditorItem item, object? fieldValue, string? displayName) + { + builder.OpenComponent(0); + builder.AddAttribute(10, nameof(Switch.Value), fieldValue); + builder.AddAttribute(20, nameof(Switch.IsDisabled), true); + builder.AddAttribute(30, nameof(Switch.DisplayText), displayName); + builder.AddAttribute(40, nameof(Switch.ShowLabelTooltip), item.ShowLabelTooltip); + + if (item is ITableColumn col) + { + builder.AddAttribute(50, "class", col.CssClass); + } + builder.AddMultipleAttributes(60, item.ComponentParameters); + builder.CloseComponent(); + } + + private static void RenderDisplay(this RenderTreeBuilder builder, IEditorItem item, Type fieldType, object? fieldValue, string? displayName, bool showTooltip) + { + builder.OpenComponent(0, typeof(Display<>).MakeGenericType(fieldType)); + builder.AddAttribute(10, nameof(Display<>.DisplayText), displayName); + builder.AddAttribute(20, nameof(Display<>.Value), fieldValue); + builder.AddAttribute(30, nameof(Display<>.Lookup), item.Lookup); + builder.AddAttribute(35, nameof(Display<>.LookupService), item.LookupService); + builder.AddAttribute(40, nameof(Display<>.LookupServiceKey), item.LookupServiceKey); + builder.AddAttribute(50, nameof(Display<>.LookupServiceData), item.LookupServiceData); + builder.AddAttribute(60, nameof(Display<>.LookupStringComparison), item.LookupStringComparison); + builder.AddAttribute(65, nameof(Display<>.ShowLabelTooltip), item.ShowLabelTooltip); + builder.AddAttribute(66, nameof(Display<>.ShowTooltip), showTooltip); + + if (item is ITableColumn col) + { + if (col.Formatter != null) { - if (col.Formatter != null) - { - builder.AddAttribute(70, nameof(Display.FormatterAsync), CacheManager.GetFormatterInvoker(fieldType, col.Formatter)); - } - else if (!string.IsNullOrEmpty(col.FormatString)) - { - builder.AddAttribute(80, nameof(Display.FormatString), col.FormatString); - } - builder.AddAttribute(90, "class", col.CssClass); + builder.AddAttribute(70, nameof(Display<>.FormatterAsync), CacheManager.GetFormatterInvoker(fieldType, col.Formatter)); + } + else if (!string.IsNullOrEmpty(col.FormatString)) + { + builder.AddAttribute(80, nameof(Display<>.FormatString), col.FormatString); } - builder.AddMultipleAttributes(100, item.ComponentParameters); + builder.AddAttribute(90, "class", col.CssClass); } - + builder.AddMultipleAttributes(100, item.ComponentParameters); builder.CloseComponent(); } @@ -484,31 +505,31 @@ public static void CreateComponentByFieldType(this RenderTreeBuilder builder, Co builder.OpenComponent(0, componentType); if (componentType.IsSubclassOf(typeof(ValidateBase<>).MakeGenericType(fieldType))) { - builder.AddAttribute(10, nameof(ValidateBase.DisplayText), displayName); - builder.AddAttribute(20, nameof(ValidateBase.Value), fieldValue); - builder.AddAttribute(30, nameof(ValidateBase.ValueChanged), fieldValueChanged); - builder.AddAttribute(40, nameof(ValidateBase.ValueExpression), valueExpression); - builder.AddAttribute(41, nameof(ValidateBase.ShowRequired), GetRequired(item, changedType)); - builder.AddAttribute(42, nameof(ValidateBase.RequiredErrorMessage), item.RequiredErrorMessage); + builder.AddAttribute(10, nameof(ValidateBase<>.DisplayText), displayName); + builder.AddAttribute(20, nameof(ValidateBase<>.Value), fieldValue); + builder.AddAttribute(30, nameof(ValidateBase<>.ValueChanged), fieldValueChanged); + builder.AddAttribute(40, nameof(ValidateBase<>.ValueExpression), valueExpression); + builder.AddAttribute(41, nameof(ValidateBase<>.ShowRequired), GetRequired(item, changedType)); + builder.AddAttribute(42, nameof(ValidateBase<>.RequiredErrorMessage), item.RequiredErrorMessage); if (!item.CanWrite(model.GetType(), changedType, isSearch)) { - builder.AddAttribute(50, nameof(ValidateBase.IsDisabled), true); + builder.AddAttribute(50, nameof(ValidateBase<>.IsDisabled), true); } if (item.ValidateRules != null) { - builder.AddAttribute(60, nameof(ValidateBase.ValidateRules), item.ValidateRules); + builder.AddAttribute(60, nameof(ValidateBase<>.ValidateRules), item.ValidateRules); } if (item.ShowLabelTooltip != null) { - builder.AddAttribute(70, nameof(ValidateBase.ShowLabelTooltip), item.ShowLabelTooltip); + builder.AddAttribute(70, nameof(ValidateBase<>.ShowLabelTooltip), item.ShowLabelTooltip); } if (skipValidate is true) { - builder.AddAttribute(71, nameof(ValidateBase.SkipValidate), true); + builder.AddAttribute(71, nameof(ValidateBase<>.SkipValidate), true); } } @@ -525,31 +546,31 @@ public static void CreateComponentByFieldType(this RenderTreeBuilder builder, Co if (IsCheckboxList(fieldType, componentType) && item.Items != null) { - builder.AddAttribute(90, nameof(CheckboxList>.Items), item.Items.Clone()); + builder.AddAttribute(90, nameof(CheckboxList<>.Items), item.Items.Clone()); } // Nullable if (item.ComponentType == typeof(Select) && fieldType == typeof(bool?) && !item.IsLookup() && item.Items == null) { - builder.AddAttribute(100, nameof(Select.Items), GetNullableBoolItems(model, fieldName)); + builder.AddAttribute(100, nameof(Select<>.Items), GetNullableBoolItems(model, fieldName)); } // Lookup if (item.IsLookup() && item.Items == null) { - builder.AddAttribute(110, nameof(Select.ShowSearch), item.ShowSearchWhenSelect); - builder.AddAttribute(115, nameof(Select.Items), item.Lookup); - builder.AddAttribute(120, nameof(Select.LookupService), lookupService); - builder.AddAttribute(121, nameof(Select.LookupServiceKey), item.LookupServiceKey); - builder.AddAttribute(122, nameof(Select.LookupServiceData), item.LookupServiceData); - builder.AddAttribute(130, nameof(Select.StringComparison), item.LookupStringComparison); + builder.AddAttribute(110, nameof(Select<>.ShowSearch), item.ShowSearchWhenSelect); + builder.AddAttribute(115, nameof(Select<>.Items), item.Lookup); + builder.AddAttribute(120, nameof(Select<>.LookupService), lookupService); + builder.AddAttribute(121, nameof(Select<>.LookupServiceKey), item.LookupServiceKey); + builder.AddAttribute(122, nameof(Select<>.LookupServiceData), item.LookupServiceData); + builder.AddAttribute(130, nameof(Select<>.StringComparison), item.LookupStringComparison); } // 增加非枚举类,手动设定 ComponentType 为 Select 并且 Items 有值 自动生成下拉框 if (item.Items != null && item.ComponentType == typeof(Select<>).MakeGenericType(fieldType)) { - builder.AddAttribute(140, nameof(Select.Items), item.Items.Clone()); - builder.AddAttribute(150, nameof(Select.ShowSearch), item.ShowSearchWhenSelect); + builder.AddAttribute(140, nameof(Select<>.Items), item.Items.Clone()); + builder.AddAttribute(150, nameof(Select<>.ShowSearch), item.ShowSearchWhenSelect); } // 设置 SkipValidate 参数 @@ -563,9 +584,9 @@ public static void CreateComponentByFieldType(this RenderTreeBuilder builder, Co builder.AddMultipleAttributes(180, item.ComponentParameters); // 设置 IsPopover - if (componentType.GetPropertyByName(nameof(Select.IsPopover)) != null) + if (componentType.GetPropertyByName(nameof(Select<>.IsPopover)) != null) { - builder.AddAttribute(190, nameof(Select.IsPopover), item.IsPopover); + builder.AddAttribute(190, nameof(Select<>.IsPopover), item.IsPopover); } builder.CloseComponent(); } @@ -825,7 +846,7 @@ public static string Format(object? source, IFormatProvider provider) var instance = Activator.CreateInstance(typeof(List<>).MakeGenericType(t)); if (instance != null) { - var mi = instance.GetType().GetMethod(nameof(List.AddRange)); + var mi = instance.GetType().GetMethod(nameof(List<>.AddRange)); if (mi != null) { mi.Invoke(instance, [value]); diff --git a/test/UnitTest/Components/EditorFormTest.cs b/test/UnitTest/Components/EditorFormTest.cs index 5618645ba3f..466cbb172a2 100644 --- a/test/UnitTest/Components/EditorFormTest.cs +++ b/test/UnitTest/Components/EditorFormTest.cs @@ -94,6 +94,7 @@ public void IsDisplay_Ok() var cut = Context.RenderComponent>(pb => { pb.Add(a => a.IsDisplay, true); + pb.Add(a => a.IsShowDisplayTooltip, true); pb.Add(a => a.Model, foo); pb.Add(a => a.FieldItems, GenerateEditorItems(foo)); });