Skip to content

refactor(ILookup): add GetItemsAsync extension method #4979

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 13 commits into from
Dec 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 4 additions & 7 deletions src/BootstrapBlazor/Components/Display/Display.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ protected override async Task OnParametersSetAsync()
{
await base.OnParametersSetAsync();

_lookupData = null;
_displayText = await FormatDisplayText(Value);
}

Expand Down Expand Up @@ -169,14 +170,10 @@ private static string GetTextByValue(IEnumerable<SelectedItem> lookup, TValue va
}));
}

private IEnumerable<SelectedItem>? _lookupData;
private async Task<IEnumerable<SelectedItem>?> GetLookup()
{
if (Lookup != null)
{
return Lookup;
}

var lookupService = this.GetLookupService(InjectLookupService);
return await lookupService.GetItemsAsync(LookupServiceKey, LookupServiceData);
_lookupData ??= await this.GetItemsAsync(InjectLookupService, LookupServiceKey, LookupServiceData);
return _lookupData;
}
}
32 changes: 9 additions & 23 deletions src/BootstrapBlazor/Components/Filters/LookupFilter.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,40 +10,36 @@ namespace BootstrapBlazor.Components;
/// <summary>
/// 枚举类型过滤组件
/// </summary>
public partial class LookupFilter
public partial class LookupFilter : ILookup
{
private string? Value { get; set; }

/// <summary>
/// 获得/设置 相关枚举类型
/// <inheritdoc/>
/// </summary>
[Parameter]
[NotNull]
public IEnumerable<SelectedItem>? Lookup { get; set; }

/// <summary>
/// 获得/设置 <see cref="ILookupService"/> 服务实例
/// <inheritdoc/>
/// </summary>
[Parameter]
[NotNull]
public ILookupService? LookupService { get; set; }

/// <summary>
/// 获得/设置 <see cref="ILookupService"/> 服务获取 Lookup 数据集合键值 常用于外键自动转换为名称操作,可以通过 <see cref="LookupServiceData"/> 传递自定义数据
/// <inheritdoc/>
/// </summary>
[Parameter]
[NotNull]
public string? LookupServiceKey { get; set; }

/// <summary>
/// 获得/设置 <see cref="ILookupService"/> 服务获取 Lookup 数据集合键值自定义数据,通过 <see cref="LookupServiceKey"/> 指定键值
/// <inheritdoc/>
/// </summary>
[Parameter]
[NotNull]
public object? LookupServiceData { get; set; }

/// <summary>
/// 获得/设置 字典数据源字符串比较规则 默认 StringComparison.OrdinalIgnoreCase 大小写不敏感
/// <inheritdoc/>
/// </summary>
[Parameter]
public StringComparison LookupStringComparison { get; set; } = StringComparison.OrdinalIgnoreCase;
Expand Down Expand Up @@ -99,24 +95,14 @@ protected override async Task OnParametersSetAsync()
{
new("", Localizer["EnumFilter.AllText"].Value)
};
if (Lookup != null)
var lookup = await this.GetItemsAsync(InjectLookupService, LookupServiceKey, LookupServiceData);
if (lookup != null)
{
items.AddRange(Lookup);
}
else if (!string.IsNullOrEmpty(LookupServiceKey))
{
var lookupService = GetLookupService();
var lookup = await lookupService.GetItemsAsync(LookupServiceKey, LookupServiceData);
if (lookup != null)
{
items.AddRange(lookup);
}
items.AddRange(lookup);
}
Items = items;
}

private ILookupService GetLookupService() => LookupService ?? InjectLookupService;

/// <summary>
/// <inheritdoc/>
/// </summary>
Expand Down
32 changes: 15 additions & 17 deletions src/BootstrapBlazor/Components/Select/Select.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ namespace BootstrapBlazor.Components;
/// Select 组件实现类
/// </summary>
/// <typeparam name="TValue"></typeparam>
public partial class Select<TValue> : ISelect
public partial class Select<TValue> : ISelect, ILookup
{
[Inject]
[NotNull]
Expand Down Expand Up @@ -214,23 +214,33 @@ public partial class Select<TValue> : ISelect
public string? SwalFooter { get; set; }

/// <summary>
/// 获得/设置 <see cref="ILookupService"/> 服务实例
/// <inheritdoc/>
/// </summary>
[Parameter]
public ILookupService? LookupService { get; set; }

/// <summary>
/// 获得/设置 <see cref="ILookupService"/> 服务获取 Lookup 数据集合键值 常用于外键自动转换为名称操作,可以通过 <see cref="LookupServiceData"/> 传递自定义数据
/// <inheritdoc/>
/// </summary>
[Parameter]
public string? LookupServiceKey { get; set; }

/// <summary>
/// 获得/设置 <see cref="ILookupService"/> 服务获取 Lookup 数据集合键值自定义数据,通过 <see cref="LookupServiceKey"/> 指定键值
/// <inheritdoc/>
/// </summary>
[Parameter]
public object? LookupServiceData { get; set; }

/// <summary>
/// <inheritdoc/>
/// </summary>
IEnumerable<SelectedItem>? ILookup.Lookup { get; set; }

/// <summary>
/// <inheritdoc/>
/// </summary>
StringComparison ILookup.LookupStringComparison { get; set; }

[Inject]
[NotNull]
private IStringLocalizer<Select<TValue>>? Localizer { get; set; }
Expand Down Expand Up @@ -347,7 +357,7 @@ protected override async Task OnParametersSetAsync()
{
await base.OnParametersSetAsync();

Items ??= await GetItemsAsync();
Items ??= await this.GetItemsAsync(InjectLookupService, LookupServiceKey, LookupServiceData) ?? [];

// 内置对枚举类型的支持
if (!Items.Any() && ValueType.IsEnum())
Expand Down Expand Up @@ -375,18 +385,6 @@ protected override async Task OnAfterRenderAsync(bool firstRender)
}
}

private async Task<IEnumerable<SelectedItem>> GetItemsAsync()
{
IEnumerable<SelectedItem>? items = null;
if (!string.IsNullOrEmpty(LookupServiceKey))
{
items = await GetLookupService().GetItemsAsync(LookupServiceKey, LookupServiceData);
}
return items ?? [];
}

private ILookupService GetLookupService() => LookupService ?? InjectLookupService;

/// <summary>
/// 获得/设置 数据总条目
/// </summary>
Expand Down
36 changes: 10 additions & 26 deletions src/BootstrapBlazor/Components/Table/LookupContent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,38 +7,37 @@

namespace BootstrapBlazor.Components;

internal class LookupContent : ComponentBase
internal class LookupContent : ComponentBase, ILookup
{
/// <summary>
/// 获得/设置 <see cref="ILookupService"/> 服务实例
/// <inheritdoc/>
/// </summary>
[Parameter]
public IEnumerable<SelectedItem>? Lookup { get; set; }

/// <summary>
/// 获得/设置 <see cref="ILookupService"/> 服务实例
/// <inheritdoc/>
/// </summary>
[Parameter]
public ILookupService? LookupService { get; set; }

/// <summary>
/// 获得/设置 <see cref="ILookupService"/> 服务获取 Lookup 数据集合键值 常用于外键自动转换为名称操作,可以通过 <see cref="LookupServiceData"/> 传递自定义数据
/// <inheritdoc/>
/// </summary>
[Parameter]
[EditorRequired]
public string? LookupServiceKey { get; set; }

/// <summary>
/// 获得/设置 <see cref="ILookupService"/> 服务获取 Lookup 数据集合键值自定义数据,通过 <see cref="LookupServiceKey"/> 指定键值
/// <inheritdoc/>
/// </summary>
[Parameter]
public object? LookupServiceData { get; set; }

/// <summary>
/// 获得/设置 字典数据源字符串比较规则 默认 <see cref="StringComparison.OrdinalIgnoreCase" /> 大小写不敏感
/// <inheritdoc/>
/// </summary>
[Parameter]
public StringComparison LookupStringComparison { get; set; }
public StringComparison LookupStringComparison { get; set; } = StringComparison.OrdinalIgnoreCase;

/// <summary>
/// 获得/设置 显示值
Expand All @@ -52,7 +51,7 @@ internal class LookupContent : ComponentBase

private string? _content;

private List<SelectedItem>? _items;
private IEnumerable<SelectedItem>? _items;

/// <summary>
/// <inheritdoc/>
Expand All @@ -62,8 +61,8 @@ protected override async Task OnParametersSetAsync()
{
await base.OnParametersSetAsync();

_items ??= await GetLookupItemsAsync();
var item = _items.Find(i => i.Value.Equals(Value, LookupStringComparison));
_items ??= await this.GetItemsAsync(InjectLookupService, LookupServiceKey, LookupServiceData) ?? [];
var item = _items.FirstOrDefault(i => i.Value.Equals(Value, LookupStringComparison));
_content = item?.Text ?? Value;
}

Expand All @@ -78,19 +77,4 @@ protected override void BuildRenderTree(RenderTreeBuilder builder)
builder.AddContent(0, _content);
}
}

private async Task<List<SelectedItem>> GetLookupItemsAsync()
{
IEnumerable<SelectedItem>? items;
if (Lookup != null)
{
items = Lookup;
}
else
{
var lookupService = LookupService ?? InjectLookupService;
items = await lookupService.GetItemsAsync(LookupServiceKey, LookupServiceData);
}
return items?.ToList() ?? [];
}
}
7 changes: 0 additions & 7 deletions src/BootstrapBlazor/Extensions/IEditorItemExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,6 @@ namespace BootstrapBlazor.Components;
/// </summary>
public static class IEditorItemExtensions
{
/// <summary>
/// 判断当前 IEditorItem 实例是否为 Lookup 类型
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
public static bool IsLookup(this IEditorItem item) => item.Lookup != null || !string.IsNullOrEmpty(item.LookupServiceKey);

/// <summary>
/// 判断当前 IEditorItem 实例是否可以编辑
/// </summary>
Expand Down
23 changes: 0 additions & 23 deletions src/BootstrapBlazor/Extensions/ILookupServiceExtensions.cs

This file was deleted.

32 changes: 30 additions & 2 deletions src/BootstrapBlazor/Extensions/ILooupExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,39 @@ namespace BootstrapBlazor.Components;
/// </summary>
public static class ILooupExtensions
{
/// <summary>
/// 判断当前 <see cref="ILookup"/> 实例是否配置 Lookup 数据
/// </summary>
/// <param name="lookup"></param>
/// <returns></returns>
public static bool IsLookup(this ILookup lookup) => lookup.Lookup != null || !string.IsNullOrEmpty(lookup.LookupServiceKey);

/// <summary>
/// 获得 ILookupService 实例
/// </summary>
/// <param name="item"></param>
/// <param name="lookup"></param>
/// <param name="service"></param>
/// <returns></returns>
public static ILookupService GetLookupService(this ILookup lookup, ILookupService service) => lookup.LookupService ?? service;

/// <summary>
///
/// </summary>
/// <param name="lookup"></param>
/// <param name="service"></param>
/// <param name="key"></param>
/// <param name="data"></param>
/// <returns></returns>
public static async Task<IEnumerable<SelectedItem>?> GetItemsAsync(this ILookup lookup, ILookupService service, string? key, object? data) => lookup.Lookup ?? await lookup.GetLookupService(service).GetItemsAsync(key, data);

/// <summary>
/// 根据指定键值获取 Lookup 集合扩展方法,先调用同步方法,如果返回 null 则调用异步方法
/// </summary>
/// <param name="service"></param>
/// <param name="key"></param>
/// <param name="data"></param>
/// <returns></returns>
public static ILookupService GetLookupService(this ILookup item, ILookupService service) => item.LookupService ?? service;
public static async Task<IEnumerable<SelectedItem>?> GetItemsAsync(this ILookupService service, string? key, object? data) => string.IsNullOrEmpty(key)
? null
: service.GetItemsByKey(key, data) ?? await service.GetItemsByKeyAsync(key, data);
}
15 changes: 15 additions & 0 deletions test/UnitTest/Components/SelectTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,21 @@ public void LookupService_Ok()
Assert.Equal(2, cut.Instance.Items.Count());
}

[Fact]
public void Select_Lookup()
{
var cut = Context.RenderComponent<Select<string>>(pb =>
{
pb.Add(a => a.LookupServiceKey, "FooLookup");
});
ILookup lookup = cut.Instance;
lookup.Lookup = [new SelectedItem("", "test")];
Assert.Single(lookup.Lookup);

lookup.LookupStringComparison = StringComparison.Ordinal;
Assert.Equal(StringComparison.Ordinal, lookup.LookupStringComparison);
}

[Fact]
public void IsClearable_Ok()
{
Expand Down
Loading