Skip to content

Commit 58180ef

Browse files
authored
feat(EditorForm): add IsShowDisplayTooltip parameter (#6987)
* refactor: 精简代码 * feat: 增加 showTooltip 参数 * feat(EditorForm): add IsShowDisplayTooltip parameter * chore: bump version 9.11.5-beta03 * refactor: 更新索引 * test: 更新单元测试
1 parent 22bc849 commit 58180ef

File tree

4 files changed

+103
-75
lines changed

4 files changed

+103
-75
lines changed

src/BootstrapBlazor/BootstrapBlazor.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
<Project Sdk="Microsoft.NET.Sdk.Razor">
22

33
<PropertyGroup Condition="'$(VisualStudioVersion)' == '17.0'">
4-
<Version>9.11.5-beta02</Version>
4+
<Version>9.11.5-beta03</Version>
55
</PropertyGroup>
66

77
<PropertyGroup Condition="'$(VisualStudioVersion)' == '18.0'">
8-
<Version>10.0.0-rc.2.1.1</Version>
8+
<Version>10.0.0-rc.2.1.2</Version>
99
</PropertyGroup>
1010

1111
<ItemGroup>

src/BootstrapBlazor/Components/EditorForm/EditorForm.razor.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,12 @@ public partial class EditorForm<TModel> : IShowLabel
114114
[Parameter]
115115
public bool IsDisplay { get; set; }
116116

117+
/// <summary>
118+
/// 获得/设置 是否显示 Display 组件的 Tooltip 默认为 false
119+
/// </summary>
120+
[Parameter]
121+
public bool IsShowDisplayTooltip { get; set; }
122+
117123
/// <summary>
118124
/// 获得/设置 是否使用 SearchTemplate 默认 false 使用 EditTemplate 模板
119125
/// </summary>
@@ -280,7 +286,7 @@ private RenderFragment AutoGenerateTemplate(IEditorItem item) => builder =>
280286
{
281287
if (IsDisplay || !item.CanWrite(typeof(TModel), ItemChangedType, IsSearch.Value))
282288
{
283-
builder.CreateDisplayByFieldType(item, Model);
289+
builder.CreateDisplayByFieldType(item, Model, IsShowDisplayTooltip);
284290
}
285291
else
286292
{

src/BootstrapBlazor/Utils/Utility.cs

Lines changed: 93 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -391,10 +391,11 @@ internal static IEnumerable<ITableColumn> OrderFunc(this List<ITableColumn> cols
391391
/// <summary>
392392
/// RenderTreeBuilder 扩展方法 通过 IEditorItem 与 model 创建 Display 组件
393393
/// </summary>
394-
/// <param name="builder"></param>
395-
/// <param name="item"></param>
396-
/// <param name="model"></param>
397-
public static void CreateDisplayByFieldType(this RenderTreeBuilder builder, IEditorItem item, object model)
394+
/// <param name="builder"><see cref="RenderTreeBuilder"/> 实例</param>
395+
/// <param name="item"><see cref="IEditorItem"/> 实例</param>
396+
/// <param name="model">当前模型对象实例</param>
397+
/// <param name="showTooltip">如果是 <see cref="Display{TValue}"/> 组件时是否显示提示栏 默认 false</param>
398+
public static void CreateDisplayByFieldType(this RenderTreeBuilder builder, IEditorItem item, object model, bool showTooltip = false)
398399
{
399400
var fieldType = item.PropertyType;
400401
var fieldName = item.GetFieldName();
@@ -403,60 +404,80 @@ public static void CreateDisplayByFieldType(this RenderTreeBuilder builder, IEdi
403404
var type = (Nullable.GetUnderlyingType(fieldType) ?? fieldType);
404405
if (type == typeof(bool) || fieldValue?.GetType() == typeof(bool))
405406
{
406-
builder.OpenComponent<Switch>(0);
407-
builder.AddAttribute(10, nameof(Switch.Value), fieldValue);
408-
builder.AddAttribute(20, nameof(Switch.IsDisabled), true);
409-
builder.AddAttribute(30, nameof(Switch.DisplayText), displayName);
410-
builder.AddAttribute(40, nameof(Switch.ShowLabelTooltip), item.ShowLabelTooltip);
411-
if (item is ITableColumn col)
412-
{
413-
builder.AddAttribute(50, "class", col.CssClass);
414-
}
415-
builder.AddMultipleAttributes(60, item.ComponentParameters);
407+
builder.RenderSwitch(item, fieldValue, displayName);
416408
}
417409
else if (item.ComponentType == typeof(Textarea) || item.Rows > 0)
418410
{
419-
builder.OpenComponent(0, typeof(Textarea));
420-
builder.AddAttribute(10, nameof(Textarea.DisplayText), displayName);
421-
builder.AddAttribute(20, nameof(Textarea.Value), fieldValue);
422-
builder.AddAttribute(30, nameof(Textarea.ShowLabelTooltip), item.ShowLabelTooltip);
423-
builder.AddAttribute(40, "readonly", true);
424-
if (item.Rows > 0)
425-
{
426-
builder.AddAttribute(50, "rows", item.Rows);
427-
}
428-
if (item is ITableColumn col)
429-
{
430-
builder.AddAttribute(60, "class", col.CssClass);
431-
}
432-
builder.AddMultipleAttributes(70, item.ComponentParameters);
411+
builder.RenderTextarea(item, fieldValue, displayName);
433412
}
434413
else
435414
{
436-
builder.OpenComponent(0, typeof(Display<>).MakeGenericType(fieldType));
437-
builder.AddAttribute(10, nameof(Display<string>.DisplayText), displayName);
438-
builder.AddAttribute(20, nameof(Display<string>.Value), fieldValue);
439-
builder.AddAttribute(30, nameof(Display<string>.Lookup), item.Lookup);
440-
builder.AddAttribute(30, nameof(Display<string>.LookupService), item.LookupService);
441-
builder.AddAttribute(40, nameof(Display<string>.LookupServiceKey), item.LookupServiceKey);
442-
builder.AddAttribute(50, nameof(Display<string>.LookupServiceData), item.LookupServiceData);
443-
builder.AddAttribute(60, nameof(Display<string>.LookupStringComparison), item.LookupStringComparison);
444-
builder.AddAttribute(65, nameof(Display<string>.ShowLabelTooltip), item.ShowLabelTooltip);
445-
if (item is ITableColumn col)
415+
builder.RenderDisplay(item, fieldType, fieldValue, displayName, showTooltip);
416+
}
417+
}
418+
419+
private static void RenderTextarea(this RenderTreeBuilder builder, IEditorItem item, object? fieldValue, string? displayName)
420+
{
421+
builder.OpenComponent(0, typeof(Textarea));
422+
builder.AddAttribute(10, nameof(Textarea.DisplayText), displayName);
423+
builder.AddAttribute(20, nameof(Textarea.Value), fieldValue);
424+
builder.AddAttribute(30, nameof(Textarea.ShowLabelTooltip), item.ShowLabelTooltip);
425+
builder.AddAttribute(40, "readonly", true);
426+
427+
if (item.Rows > 0)
428+
{
429+
builder.AddAttribute(50, "rows", item.Rows);
430+
}
431+
if (item is ITableColumn col)
432+
{
433+
builder.AddAttribute(60, "class", col.CssClass);
434+
}
435+
builder.AddMultipleAttributes(70, item.ComponentParameters);
436+
builder.CloseComponent();
437+
}
438+
439+
private static void RenderSwitch(this RenderTreeBuilder builder, IEditorItem item, object? fieldValue, string? displayName)
440+
{
441+
builder.OpenComponent<Switch>(0);
442+
builder.AddAttribute(10, nameof(Switch.Value), fieldValue);
443+
builder.AddAttribute(20, nameof(Switch.IsDisabled), true);
444+
builder.AddAttribute(30, nameof(Switch.DisplayText), displayName);
445+
builder.AddAttribute(40, nameof(Switch.ShowLabelTooltip), item.ShowLabelTooltip);
446+
447+
if (item is ITableColumn col)
448+
{
449+
builder.AddAttribute(50, "class", col.CssClass);
450+
}
451+
builder.AddMultipleAttributes(60, item.ComponentParameters);
452+
builder.CloseComponent();
453+
}
454+
455+
private static void RenderDisplay(this RenderTreeBuilder builder, IEditorItem item, Type fieldType, object? fieldValue, string? displayName, bool showTooltip)
456+
{
457+
builder.OpenComponent(0, typeof(Display<>).MakeGenericType(fieldType));
458+
builder.AddAttribute(10, nameof(Display<>.DisplayText), displayName);
459+
builder.AddAttribute(20, nameof(Display<>.Value), fieldValue);
460+
builder.AddAttribute(30, nameof(Display<>.Lookup), item.Lookup);
461+
builder.AddAttribute(35, nameof(Display<>.LookupService), item.LookupService);
462+
builder.AddAttribute(40, nameof(Display<>.LookupServiceKey), item.LookupServiceKey);
463+
builder.AddAttribute(50, nameof(Display<>.LookupServiceData), item.LookupServiceData);
464+
builder.AddAttribute(60, nameof(Display<>.LookupStringComparison), item.LookupStringComparison);
465+
builder.AddAttribute(65, nameof(Display<>.ShowLabelTooltip), item.ShowLabelTooltip);
466+
builder.AddAttribute(66, nameof(Display<>.ShowTooltip), showTooltip);
467+
468+
if (item is ITableColumn col)
469+
{
470+
if (col.Formatter != null)
446471
{
447-
if (col.Formatter != null)
448-
{
449-
builder.AddAttribute(70, nameof(Display<string>.FormatterAsync), CacheManager.GetFormatterInvoker(fieldType, col.Formatter));
450-
}
451-
else if (!string.IsNullOrEmpty(col.FormatString))
452-
{
453-
builder.AddAttribute(80, nameof(Display<string>.FormatString), col.FormatString);
454-
}
455-
builder.AddAttribute(90, "class", col.CssClass);
472+
builder.AddAttribute(70, nameof(Display<>.FormatterAsync), CacheManager.GetFormatterInvoker(fieldType, col.Formatter));
473+
}
474+
else if (!string.IsNullOrEmpty(col.FormatString))
475+
{
476+
builder.AddAttribute(80, nameof(Display<>.FormatString), col.FormatString);
456477
}
457-
builder.AddMultipleAttributes(100, item.ComponentParameters);
478+
builder.AddAttribute(90, "class", col.CssClass);
458479
}
459-
480+
builder.AddMultipleAttributes(100, item.ComponentParameters);
460481
builder.CloseComponent();
461482
}
462483

@@ -484,31 +505,31 @@ public static void CreateComponentByFieldType(this RenderTreeBuilder builder, Co
484505
builder.OpenComponent(0, componentType);
485506
if (componentType.IsSubclassOf(typeof(ValidateBase<>).MakeGenericType(fieldType)))
486507
{
487-
builder.AddAttribute(10, nameof(ValidateBase<string>.DisplayText), displayName);
488-
builder.AddAttribute(20, nameof(ValidateBase<string>.Value), fieldValue);
489-
builder.AddAttribute(30, nameof(ValidateBase<string>.ValueChanged), fieldValueChanged);
490-
builder.AddAttribute(40, nameof(ValidateBase<string>.ValueExpression), valueExpression);
491-
builder.AddAttribute(41, nameof(ValidateBase<string>.ShowRequired), GetRequired(item, changedType));
492-
builder.AddAttribute(42, nameof(ValidateBase<string>.RequiredErrorMessage), item.RequiredErrorMessage);
508+
builder.AddAttribute(10, nameof(ValidateBase<>.DisplayText), displayName);
509+
builder.AddAttribute(20, nameof(ValidateBase<>.Value), fieldValue);
510+
builder.AddAttribute(30, nameof(ValidateBase<>.ValueChanged), fieldValueChanged);
511+
builder.AddAttribute(40, nameof(ValidateBase<>.ValueExpression), valueExpression);
512+
builder.AddAttribute(41, nameof(ValidateBase<>.ShowRequired), GetRequired(item, changedType));
513+
builder.AddAttribute(42, nameof(ValidateBase<>.RequiredErrorMessage), item.RequiredErrorMessage);
493514

494515
if (!item.CanWrite(model.GetType(), changedType, isSearch))
495516
{
496-
builder.AddAttribute(50, nameof(ValidateBase<string>.IsDisabled), true);
517+
builder.AddAttribute(50, nameof(ValidateBase<>.IsDisabled), true);
497518
}
498519

499520
if (item.ValidateRules != null)
500521
{
501-
builder.AddAttribute(60, nameof(ValidateBase<string>.ValidateRules), item.ValidateRules);
522+
builder.AddAttribute(60, nameof(ValidateBase<>.ValidateRules), item.ValidateRules);
502523
}
503524

504525
if (item.ShowLabelTooltip != null)
505526
{
506-
builder.AddAttribute(70, nameof(ValidateBase<string>.ShowLabelTooltip), item.ShowLabelTooltip);
527+
builder.AddAttribute(70, nameof(ValidateBase<>.ShowLabelTooltip), item.ShowLabelTooltip);
507528
}
508529

509530
if (skipValidate is true)
510531
{
511-
builder.AddAttribute(71, nameof(ValidateBase<string>.SkipValidate), true);
532+
builder.AddAttribute(71, nameof(ValidateBase<>.SkipValidate), true);
512533
}
513534
}
514535

@@ -525,31 +546,31 @@ public static void CreateComponentByFieldType(this RenderTreeBuilder builder, Co
525546

526547
if (IsCheckboxList(fieldType, componentType) && item.Items != null)
527548
{
528-
builder.AddAttribute(90, nameof(CheckboxList<IEnumerable<string>>.Items), item.Items.Clone());
549+
builder.AddAttribute(90, nameof(CheckboxList<>.Items), item.Items.Clone());
529550
}
530551

531552
// Nullable<bool?>
532553
if (item.ComponentType == typeof(Select<bool?>) && fieldType == typeof(bool?) && !item.IsLookup() && item.Items == null)
533554
{
534-
builder.AddAttribute(100, nameof(Select<bool?>.Items), GetNullableBoolItems(model, fieldName));
555+
builder.AddAttribute(100, nameof(Select<>.Items), GetNullableBoolItems(model, fieldName));
535556
}
536557

537558
// Lookup
538559
if (item.IsLookup() && item.Items == null)
539560
{
540-
builder.AddAttribute(110, nameof(Select<SelectedItem>.ShowSearch), item.ShowSearchWhenSelect);
541-
builder.AddAttribute(115, nameof(Select<SelectedItem>.Items), item.Lookup);
542-
builder.AddAttribute(120, nameof(Select<SelectedItem>.LookupService), lookupService);
543-
builder.AddAttribute(121, nameof(Select<SelectedItem>.LookupServiceKey), item.LookupServiceKey);
544-
builder.AddAttribute(122, nameof(Select<SelectedItem>.LookupServiceData), item.LookupServiceData);
545-
builder.AddAttribute(130, nameof(Select<SelectedItem>.StringComparison), item.LookupStringComparison);
561+
builder.AddAttribute(110, nameof(Select<>.ShowSearch), item.ShowSearchWhenSelect);
562+
builder.AddAttribute(115, nameof(Select<>.Items), item.Lookup);
563+
builder.AddAttribute(120, nameof(Select<>.LookupService), lookupService);
564+
builder.AddAttribute(121, nameof(Select<>.LookupServiceKey), item.LookupServiceKey);
565+
builder.AddAttribute(122, nameof(Select<>.LookupServiceData), item.LookupServiceData);
566+
builder.AddAttribute(130, nameof(Select<>.StringComparison), item.LookupStringComparison);
546567
}
547568

548569
// 增加非枚举类,手动设定 ComponentType 为 Select 并且 Items 有值 自动生成下拉框
549570
if (item.Items != null && item.ComponentType == typeof(Select<>).MakeGenericType(fieldType))
550571
{
551-
builder.AddAttribute(140, nameof(Select<SelectedItem>.Items), item.Items.Clone());
552-
builder.AddAttribute(150, nameof(Select<SelectedItem>.ShowSearch), item.ShowSearchWhenSelect);
572+
builder.AddAttribute(140, nameof(Select<>.Items), item.Items.Clone());
573+
builder.AddAttribute(150, nameof(Select<>.ShowSearch), item.ShowSearchWhenSelect);
553574
}
554575

555576
// 设置 SkipValidate 参数
@@ -563,9 +584,9 @@ public static void CreateComponentByFieldType(this RenderTreeBuilder builder, Co
563584
builder.AddMultipleAttributes(180, item.ComponentParameters);
564585

565586
// 设置 IsPopover
566-
if (componentType.GetPropertyByName(nameof(Select<string>.IsPopover)) != null)
587+
if (componentType.GetPropertyByName(nameof(Select<>.IsPopover)) != null)
567588
{
568-
builder.AddAttribute(190, nameof(Select<string>.IsPopover), item.IsPopover);
589+
builder.AddAttribute(190, nameof(Select<>.IsPopover), item.IsPopover);
569590
}
570591
builder.CloseComponent();
571592
}
@@ -825,7 +846,7 @@ public static string Format(object? source, IFormatProvider provider)
825846
var instance = Activator.CreateInstance(typeof(List<>).MakeGenericType(t));
826847
if (instance != null)
827848
{
828-
var mi = instance.GetType().GetMethod(nameof(List<string>.AddRange));
849+
var mi = instance.GetType().GetMethod(nameof(List<>.AddRange));
829850
if (mi != null)
830851
{
831852
mi.Invoke(instance, [value]);

test/UnitTest/Components/EditorFormTest.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ public void IsDisplay_Ok()
9494
var cut = Context.RenderComponent<EditorForm<Foo>>(pb =>
9595
{
9696
pb.Add(a => a.IsDisplay, true);
97+
pb.Add(a => a.IsShowDisplayTooltip, true);
9798
pb.Add(a => a.Model, foo);
9899
pb.Add(a => a.FieldItems, GenerateEditorItems(foo));
99100
});

0 commit comments

Comments
 (0)