diff --git a/src/BootstrapBlazor.Server/Components/Samples/Table/TablesSearch.razor b/src/BootstrapBlazor.Server/Components/Samples/Table/TablesSearch.razor index 2a3838689a0..950f1be464b 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/Table/TablesSearch.razor +++ b/src/BootstrapBlazor.Server/Components/Samples/Table/TablesSearch.razor @@ -34,48 +34,6 @@ - -
- - @((MarkupString)Localizer["AutoHeightIntro"].Value) -
-
- - - - - - - - - -
-
- -
-
- -
-
-
-
-
-
-
- @@ -124,6 +82,48 @@ + +
+ + @((MarkupString)Localizer["AutoHeightIntro"].Value) +
+
+ + + + + + + + + +
+
+ +
+
+ +
+
+
+
+
+
+
+ diff --git a/src/BootstrapBlazor.Server/Locales/en-US.json b/src/BootstrapBlazor.Server/Locales/en-US.json index 8900002c188..27ca58ad6e4 100644 --- a/src/BootstrapBlazor.Server/Locales/en-US.json +++ b/src/BootstrapBlazor.Server/Locales/en-US.json @@ -5066,7 +5066,7 @@ "NamePlaceholder": "Please enter your name within 50 characters", "SearchFormDesc": "When UseSearchForm is enabled and SearchItems is not provided, it will default to using TableColumn with Searchable=\"true\". You can customize the metadata through the SearchFormItemMetadata property in TableColumn", "SearchFormIntro": "Enable the search form feature by setting UseSearchForm=\"true\", and configure the search items within the form using SearchItems, suitable for scenarios with custom complex search conditions", - "SearchFormTips": "Enabling UseSearchForm will prevent SearchTemplate, CustomerSearchModel, and CustomerSearchTemplate from taking effect.", + "SearchFormTips": "Enabling UseSearchForm will prevent SearchModel SearchTemplate, CustomerSearchModel, and CustomerSearchTemplate from taking effect.", "SearchFormTitle": "Search Form", "SearchTableGroupBoxText": "Search Criteria", "SearchTableIntro": "Set ShowSearch to display the query component, customize the search UI by setting the SearchTemplate template", diff --git a/src/BootstrapBlazor.Server/Locales/zh-CN.json b/src/BootstrapBlazor.Server/Locales/zh-CN.json index 8f412d54191..18b18e3d58f 100644 --- a/src/BootstrapBlazor.Server/Locales/zh-CN.json +++ b/src/BootstrapBlazor.Server/Locales/zh-CN.json @@ -5065,8 +5065,8 @@ "EditModelTitle": "编辑测试数据窗口", "NamePlaceholder": "请输入姓名,50字以内", "SearchFormDesc": "使用 UseSearchForm 开启搜索表单时未提供 SearchItems 默认尝试使用设置 Searchable=\"true\"TableColumn 进行构建,可以通过 TableColumn 中的 SearchFormItemMetadata 属性定制化元数据", - "SearchFormTips": "开启 UseSearchFormSearchTemplate CustomerSearchModel CustomerSearchTemplate 均不生效", "SearchFormIntro": "通过设置 UseSearchForm=\"true\" 开启搜索表单功能,通过 SearchItems 配置搜索表单内搜索项,适用于自定义复杂搜索条件的场景", + "SearchFormTips": "开启 UseSearchFormSearchModel SearchTemplate CustomerSearchModel CustomerSearchTemplate 均不生效", "SearchFormTitle": "搜索表单", "SearchTableGroupBoxText": "搜索条件", "SearchTableIntro": "设置 ShowSearch 显示查询组件,通过设置 SearchTemplate 模板自定义搜索 UI", diff --git a/src/BootstrapBlazor/BootstrapBlazor.csproj b/src/BootstrapBlazor/BootstrapBlazor.csproj index 05fb07de626..3a92c5156d9 100644 --- a/src/BootstrapBlazor/BootstrapBlazor.csproj +++ b/src/BootstrapBlazor/BootstrapBlazor.csproj @@ -1,7 +1,7 @@  - 10.4.2-beta02 + 10.4.2 diff --git a/src/BootstrapBlazor/Components/Dialog/SearchDialog.razor b/src/BootstrapBlazor/Components/Dialog/SearchDialog.razor index b7e6b419316..6de5a36837f 100644 --- a/src/BootstrapBlazor/Components/Dialog/SearchDialog.razor +++ b/src/BootstrapBlazor/Components/Dialog/SearchDialog.razor @@ -4,8 +4,10 @@ @if (UseSearchForm) { - + @RenderButtons diff --git a/src/BootstrapBlazor/Components/SearchForm/SearchForm.razor.cs b/src/BootstrapBlazor/Components/SearchForm/SearchForm.razor.cs index 8241074c84a..edf92b4dcf6 100644 --- a/src/BootstrapBlazor/Components/SearchForm/SearchForm.razor.cs +++ b/src/BootstrapBlazor/Components/SearchForm/SearchForm.razor.cs @@ -145,26 +145,18 @@ private RenderFragment AutoGenerateTemplate(ISearchItem item) if (OnChanged != null) { var filter = Items.ToFilter(); - await OnChanged.Invoke(filter); + await OnChanged(filter); } }; - return item.CreateSearchItemComponentByMetadata(); + return item.Metadata.RenderContent() ?? item.CreateSearchItemComponentByMetadata(); } private SearchFormLocalizerOptions? _options; private SearchFormLocalizerOptions GetSearchOptions() { - _options ??= SearchFormLocalizerOptions ?? new SearchFormLocalizerOptions() - { - SelectAllText = SearchFormLocalizer[nameof(Components.SearchFormLocalizerOptions.SelectAllText)], - BooleanAllText = SearchFormLocalizer[nameof(Components.SearchFormLocalizerOptions.BooleanAllText)], - BooleanTrueText = SearchFormLocalizer[nameof(Components.SearchFormLocalizerOptions.BooleanTrueText)], - BooleanFalseText = SearchFormLocalizer[nameof(Components.SearchFormLocalizerOptions.BooleanFalseText)], - NumberStartValueLabelText = SearchFormLocalizer[nameof(Components.SearchFormLocalizerOptions.NumberStartValueLabelText)], - NumberEndValueLabelText = SearchFormLocalizer[nameof(Components.SearchFormLocalizerOptions.NumberEndValueLabelText)] - }; + _options ??= SearchFormLocalizerOptions ?? SearchFormLocalizer.GetSearchFormLocalizerOptions(); return _options.Value; } diff --git a/src/BootstrapBlazor/Components/Searches/DateTimeRangeSearchMetadata.cs b/src/BootstrapBlazor/Components/Searches/DateTimeRangeSearchMetadata.cs index 3d52e3f8493..825e4c41e45 100644 --- a/src/BootstrapBlazor/Components/Searches/DateTimeRangeSearchMetadata.cs +++ b/src/BootstrapBlazor/Components/Searches/DateTimeRangeSearchMetadata.cs @@ -9,7 +9,7 @@ namespace BootstrapBlazor.Components; /// 时间区间搜索元数据类 /// DateTime range search meta data class /// -public class DateTimeRangeSearchMetadata : SearchMetadataBase +public class DateTimeRangeSearchMetadata : SearchFormItemMetadataBase { /// /// 获得/设置 搜索值 diff --git a/src/BootstrapBlazor/Components/Searches/DateTimeSearchMetadata.cs b/src/BootstrapBlazor/Components/Searches/DateTimeSearchMetadata.cs index 5e526678f3a..24e77c68831 100644 --- a/src/BootstrapBlazor/Components/Searches/DateTimeSearchMetadata.cs +++ b/src/BootstrapBlazor/Components/Searches/DateTimeSearchMetadata.cs @@ -9,7 +9,7 @@ namespace BootstrapBlazor.Components; /// 时间搜索元数据类 /// DateTime search meta data class /// -public class DateTimeSearchMetadata : SearchMetadataBase +public class DateTimeSearchMetadata : SearchFormItemMetadataBase { /// /// 获得/设置 搜索值 diff --git a/src/BootstrapBlazor/Components/Searches/ISearchFormItemMetadata.cs b/src/BootstrapBlazor/Components/Searches/ISearchFormItemMetadata.cs index 03557144c1c..3b113530a30 100644 --- a/src/BootstrapBlazor/Components/Searches/ISearchFormItemMetadata.cs +++ b/src/BootstrapBlazor/Components/Searches/ISearchFormItemMetadata.cs @@ -58,4 +58,11 @@ public interface ISearchFormItemMetadata /// Reset method /// void Reset(); + + /// + /// 渲染自定义内容方法 + /// Render custom content method + /// + /// + RenderFragment? RenderContent(); } diff --git a/src/BootstrapBlazor/Components/Searches/MultipleSelectSearchMetadata.cs b/src/BootstrapBlazor/Components/Searches/MultipleSelectSearchMetadata.cs index 499406fb7ef..a87cfe9e418 100644 --- a/src/BootstrapBlazor/Components/Searches/MultipleSelectSearchMetadata.cs +++ b/src/BootstrapBlazor/Components/Searches/MultipleSelectSearchMetadata.cs @@ -12,7 +12,7 @@ namespace BootstrapBlazor.Components; public class MultipleSelectSearchMetadata : SelectSearchMetadata { /// - /// + /// /// public override FilterKeyValueAction? GetFilter(string fieldName) { diff --git a/src/BootstrapBlazor/Components/Searches/NumberSearchMetadata.cs b/src/BootstrapBlazor/Components/Searches/NumberSearchMetadata.cs index c0c2bc5029f..788e86682b0 100644 --- a/src/BootstrapBlazor/Components/Searches/NumberSearchMetadata.cs +++ b/src/BootstrapBlazor/Components/Searches/NumberSearchMetadata.cs @@ -9,7 +9,7 @@ namespace BootstrapBlazor.Components; /// 数字类型搜索元数据类 /// Number type search metadata class /// -public class NumberSearchMetadata : SearchMetadataBase +public class NumberSearchMetadata : SearchFormItemMetadataBase { /// /// 获得/设置 搜索开始值 diff --git a/src/BootstrapBlazor/Components/Searches/SearchMetadataBase.cs b/src/BootstrapBlazor/Components/Searches/SearchFormItemMetadataBase.cs similarity index 87% rename from src/BootstrapBlazor/Components/Searches/SearchMetadataBase.cs rename to src/BootstrapBlazor/Components/Searches/SearchFormItemMetadataBase.cs index be00a6a3949..f00db34f771 100644 --- a/src/BootstrapBlazor/Components/Searches/SearchMetadataBase.cs +++ b/src/BootstrapBlazor/Components/Searches/SearchFormItemMetadataBase.cs @@ -11,7 +11,7 @@ namespace BootstrapBlazor.Components; /// 搜索元数据基类 /// Search meta data base class /// -public abstract class SearchMetadataBase : ISearchFormItemMetadata +public abstract class SearchFormItemMetadataBase : ISearchFormItemMetadata { /// /// 获得/设置 占位符文本 @@ -72,7 +72,13 @@ public abstract class SearchMetadataBase : ISearchFormItemMetadata } /// - /// + /// /// public abstract void Reset(); + + /// + /// + /// + /// + public virtual RenderFragment? RenderContent() => null; } diff --git a/src/BootstrapBlazor/Components/Searches/StringSearchMetadata.cs b/src/BootstrapBlazor/Components/Searches/StringSearchMetadata.cs index 3ae4cd720aa..f5121bf5913 100644 --- a/src/BootstrapBlazor/Components/Searches/StringSearchMetadata.cs +++ b/src/BootstrapBlazor/Components/Searches/StringSearchMetadata.cs @@ -9,7 +9,7 @@ namespace BootstrapBlazor.Components; /// 字符串搜索元数据类 /// String search meta data class /// -public class StringSearchMetadata : SearchMetadataBase +public class StringSearchMetadata : SearchFormItemMetadataBase { /// /// 获得/设置 搜索值 diff --git a/src/BootstrapBlazor/Components/Table/Table.razor b/src/BootstrapBlazor/Components/Table/Table.razor index d36ae847447..e5b4eb50373 100644 --- a/src/BootstrapBlazor/Components/Table/Table.razor +++ b/src/BootstrapBlazor/Components/Table/Table.razor @@ -1100,7 +1100,9 @@ @if (UseSearchForm) { - } diff --git a/src/BootstrapBlazor/Components/Table/Table.razor.Search.cs b/src/BootstrapBlazor/Components/Table/Table.razor.Search.cs index 7dcfd1ee53d..19cd502b698 100644 --- a/src/BootstrapBlazor/Components/Table/Table.razor.Search.cs +++ b/src/BootstrapBlazor/Components/Table/Table.razor.Search.cs @@ -185,15 +185,7 @@ private List GetSearchFormItems() if (SearchFormLocalizerOptions is null) { - SearchFormLocalizerOptions = new SearchFormLocalizerOptions() - { - SelectAllText = SearchFormLocalizer[nameof(Components.SearchFormLocalizerOptions.SelectAllText)], - BooleanAllText = SearchFormLocalizer[nameof(Components.SearchFormLocalizerOptions.BooleanAllText)], - BooleanTrueText = SearchFormLocalizer[nameof(Components.SearchFormLocalizerOptions.BooleanTrueText)], - BooleanFalseText = SearchFormLocalizer[nameof(Components.SearchFormLocalizerOptions.BooleanFalseText)], - NumberStartValueLabelText = SearchFormLocalizer[nameof(Components.SearchFormLocalizerOptions.NumberStartValueLabelText)], - NumberEndValueLabelText = SearchFormLocalizer[nameof(Components.SearchFormLocalizerOptions.NumberEndValueLabelText)] - }; + SearchFormLocalizerOptions = SearchFormLocalizer.GetSearchFormLocalizerOptions(); } return GetSearchColumns().Select(i => i.ParseSearchItem(SearchFormLocalizerOptions.Value)).ToList(); } diff --git a/src/BootstrapBlazor/Extensions/ISearchItemExtensions.cs b/src/BootstrapBlazor/Extensions/ISearchItemExtensions.cs index 196bb72e892..4945254a806 100644 --- a/src/BootstrapBlazor/Extensions/ISearchItemExtensions.cs +++ b/src/BootstrapBlazor/Extensions/ISearchItemExtensions.cs @@ -65,8 +65,8 @@ public ISearchFormItemMetadata BuildSearchMetadata(SearchFormLocalizerOptions op } /// - /// 创建 搜索项的 RenderFragment 实例 - /// Creates a RenderFragment instance for the search item + /// 通过 SearchItem 实例 Metadata 创建搜索项 UI 方法 + /// Creates a search item UI method through the SearchItem instance Metadata /// public RenderFragment CreateSearchItemComponentByMetadata() => builder => { diff --git a/src/BootstrapBlazor/Extensions/IStringLocalizerExtensions.cs b/src/BootstrapBlazor/Extensions/IStringLocalizerExtensions.cs index 96a22fe5111..4b0504b465a 100644 --- a/src/BootstrapBlazor/Extensions/IStringLocalizerExtensions.cs +++ b/src/BootstrapBlazor/Extensions/IStringLocalizerExtensions.cs @@ -35,4 +35,20 @@ public static bool TryGetLocalizerString(this IStringLocalizer localizer, string } return ret; } + + /// + /// 通过资源文件获取 SearchFormLocalizerOptions 实例 + /// Get the SearchFormLocalizerOptions instance from the resource file + /// + /// + /// + public static SearchFormLocalizerOptions GetSearchFormLocalizerOptions(this IStringLocalizer localizer) => new SearchFormLocalizerOptions() + { + SelectAllText = localizer[nameof(Components.SearchFormLocalizerOptions.SelectAllText)], + BooleanAllText = localizer[nameof(Components.SearchFormLocalizerOptions.BooleanAllText)], + BooleanTrueText = localizer[nameof(Components.SearchFormLocalizerOptions.BooleanTrueText)], + BooleanFalseText = localizer[nameof(Components.SearchFormLocalizerOptions.BooleanFalseText)], + NumberStartValueLabelText = localizer[nameof(Components.SearchFormLocalizerOptions.NumberStartValueLabelText)], + NumberEndValueLabelText = localizer[nameof(Components.SearchFormLocalizerOptions.NumberEndValueLabelText)] + }; } diff --git a/test/UnitTest/Components/SearchFormTest.cs b/test/UnitTest/Components/SearchFormTest.cs index 8e251f6b01e..99c955aefcb 100644 --- a/test/UnitTest/Components/SearchFormTest.cs +++ b/test/UnitTest/Components/SearchFormTest.cs @@ -270,4 +270,40 @@ public void Reset_Ok() // Metadata 为空时不报错 item.Reset(); } + + [Fact] + public async Task CustomMetadata_Ok() + { + var filterKeyValueAction = new FilterKeyValueAction(); + var cut = Context.Render(pb => + { + pb.Add(a => a.OnChanged, action => + { + filterKeyValueAction = action; + return Task.CompletedTask; + }); + pb.Add(a => a.Items, new List() + { + new SearchItem(nameof(Foo.Name), typeof(string), "Name") + { + Metadata = new CustomeMetadata() { Value = "foo-name-value" } + } + }); + }); + + cut.Contains("value=\"foo-name-value\""); + } + + class CustomeMetadata : StringSearchMetadata + { + public override RenderFragment? RenderContent() => builder => + { + builder.OpenComponent>(0); + builder.AddAttribute(10, nameof(BootstrapInput<>.Value), Value); + builder.AddAttribute(20, nameof(BootstrapInput<>.OnValueChanged), ValueChangedHandler); + builder.AddAttribute(30, nameof(BootstrapInput<>.ShowLabel), true); + builder.AddAttribute(60, nameof(BootstrapInput<>.SkipValidate), true); + builder.CloseComponent(); + }; + } }