Skip to content

Commit f0435a0

Browse files
authored
feat(Table): add Required parameter (#4213)
* doc: 更新注释文档 * feat: 增加 Required 参数 * feat: 增加 IsRequiredWhenAdd/Edit 参数 * refactor: 实现类实现 Required 参数 * doc: 更新文档 * feat: 增加 ShowRequired 参数 * refactor: 增加 Required 值传递逻辑 * feat: 实现必填项标志显示逻辑 * refactor: 更改为主构造函数 * feat: 增加 RequiredErrorMessage 参数 * feat: 增加 RequiredErrorMessage 参数 * feat: 增加必填项提示文字资源文件 * chore: bump version 8.9.1-beta04 * test: 更新单元测试 * test: 更新 Auto 标签单元测试 * test: 更新单元测试 * test: 更新单元测试 * refactor: 增加参数标签 * test: 更新单元测试
1 parent 8b7cf66 commit f0435a0

File tree

18 files changed

+231
-19
lines changed

18 files changed

+231
-19
lines changed

src/BootstrapBlazor/Attributes/AutoGenerateColumnAttribute.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,26 @@ public class AutoGenerateColumnAttribute : AutoGenerateBaseAttribute, ITableColu
8080
set => IsVisibleWhenEdit = value ?? true;
8181
}
8282

83+
/// <summary>
84+
/// <inheritdoc/>
85+
/// </summary>
86+
public bool? Required { get; set; }
87+
88+
/// <summary>
89+
/// <inheritdoc/>
90+
/// </summary>
91+
public bool? IsRequiredWhenAdd { get; set; }
92+
93+
/// <summary>
94+
/// <inheritdoc/>
95+
/// </summary>
96+
public bool? IsRequiredWhenEdit { get; set; }
97+
98+
/// <summary>
99+
/// <inheritdoc/>
100+
/// </summary>
101+
public string? RequiredErrorMessage { get; set; }
102+
83103
/// <summary>
84104
/// 获得/设置 是否显示标签 Tooltip 多用于标签文字过长导致裁减时使用 默认 false
85105
/// </summary>

src/BootstrapBlazor/BootstrapBlazor.csproj

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

33
<PropertyGroup>
4-
<Version>8.9.1-beta03</Version>
4+
<Version>8.9.1-beta04</Version>
55
</PropertyGroup>
66

77
<ItemGroup Condition="'$(TargetFramework)' == 'net5.0'">

src/BootstrapBlazor/Components/EditorForm/EditorItem.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,18 @@ public class EditorItem<TValue> : ComponentBase, IEditorItem
6161
[Parameter]
6262
public bool? Readonly { get; set; }
6363

64+
/// <summary>
65+
/// <inheritdoc/>
66+
/// </summary>
67+
[Parameter]
68+
public bool? Required { get; set; }
69+
70+
/// <summary>
71+
/// <inheritdoc/>
72+
/// </summary>
73+
[Parameter]
74+
public string? RequiredErrorMessage { get; set; }
75+
6476
/// <summary>
6577
/// 获得/设置 是否不进行验证 默认为 false
6678
/// </summary>

src/BootstrapBlazor/Components/EditorForm/IEditorItem.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public interface IEditorItem
1717
/// <summary>
1818
/// 获得/设置 当前编辑项是否可编辑 默认为 true
1919
/// </summary>
20-
[Obsolete("已弃用,是否显示使用 Visible 参数,新建时使用 IsVisibleWhenAdd 编辑时使用 IsVisibleWhenEdit 只读使用 Readonly 参数,新建时使用 IsReadonlyWhenAdd 编辑时使用 IsReadonlyWhenEdit 参数; Discarded, use Visible parameter. IsVisibleWhenAdd should be used when creating a new one, and IsVisibleWhenEdit should be used when editing")]
20+
[Obsolete("已弃用,是否显示使用 Visible 参数,新建时使用 IsVisibleWhenAdd 编辑时使用 IsVisibleWhenEdit 只读使用 Readonly 参数,新建时使用 IsReadonlyWhenAdd 编辑时使用 IsReadonlyWhenEdit 参数; Deprecated use Visible parameter. IsVisibleWhenAdd should be used when creating a new one, and IsVisibleWhenEdit should be used when editing")]
2121
bool Editable { get; set; }
2222

2323
/// <summary>
@@ -139,4 +139,14 @@ public interface IEditorItem
139139
/// 获得/设置 当前属性分组排序 默认 0
140140
/// </summary>
141141
int GroupOrder { get; set; }
142+
143+
/// <summary>
144+
/// 获得/设置 是否为必填项 默认为 null
145+
/// </summary>
146+
bool? Required { get; set; }
147+
148+
/// <summary>
149+
/// 获得/设置 必填项缺失时错误提示文本 默认为 null
150+
/// </summary>
151+
string? RequiredErrorMessage { get; set; }
142152
}

src/BootstrapBlazor/Components/Table/ITableColumn.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,16 @@ public interface ITableColumn : IEditorItem
154154
/// </summary>
155155
bool IsMarkupString { get; set; }
156156

157+
/// <summary>
158+
/// 获得/设置 新建时是否为必填项 默认为 null
159+
/// </summary>
160+
bool? IsRequiredWhenAdd { get; set; }
161+
162+
/// <summary>
163+
/// 获得/设置 编辑时是否为必填项 默认为 null
164+
/// </summary>
165+
bool? IsRequiredWhenEdit { get; set; }
166+
157167
/// <summary>
158168
/// 获得/设置 新建时此列只读 默认为 null 使用 <see cref="IEditorItem.Readonly"/> 值
159169
/// </summary>

src/BootstrapBlazor/Components/Table/InternalTableColumn.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,26 @@ class InternalTableColumn(string fieldName, Type fieldType, string? fieldText =
7272
/// </summary>
7373
public bool? IsVisibleWhenEdit { get; set; } = true;
7474

75+
/// <summary>
76+
/// <inheritdoc/>
77+
/// </summary>
78+
public bool? Required { get; set; }
79+
80+
/// <summary>
81+
/// <inheritdoc/>
82+
/// </summary>
83+
public bool? IsRequiredWhenAdd { get; set; }
84+
85+
/// <summary>
86+
/// <inheritdoc/>
87+
/// </summary>
88+
public bool? IsRequiredWhenEdit { get; set; }
89+
90+
/// <summary>
91+
/// <inheritdoc/>
92+
/// </summary>
93+
public string? RequiredErrorMessage { get; set; }
94+
7595
/// <summary>
7696
/// 获得/设置 是否显示标签 Tooltip 多用于标签文字过长导致裁减时使用 默认 null
7797
/// </summary>

src/BootstrapBlazor/Components/Table/TableColumn.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,30 @@ public class TableColumn<TItem, TType> : BootstrapComponentBase, ITableColumn
192192
[Parameter]
193193
public bool? IsVisibleWhenEdit { get; set; }
194194

195+
/// <summary>
196+
/// <inheritdoc/>
197+
/// </summary>
198+
[Parameter]
199+
public bool? Required { get; set; }
200+
201+
/// <summary>
202+
/// <inheritdoc/>
203+
/// </summary>
204+
[Parameter]
205+
public bool? IsRequiredWhenAdd { get; set; }
206+
207+
/// <summary>
208+
/// <inheritdoc/>
209+
/// </summary>
210+
[Parameter]
211+
public bool? IsRequiredWhenEdit { get; set; }
212+
213+
/// <summary>
214+
/// <inheritdoc/>
215+
/// </summary>
216+
[Parameter]
217+
public string? RequiredErrorMessage { get; set; }
218+
195219
/// <summary>
196220
/// <inheritdoc/>
197221
/// </summary>

src/BootstrapBlazor/Components/Validate/ValidateBase.cs

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// Website: https://www.blazor.zone or https://argozhang.github.io/
44

55
using Microsoft.AspNetCore.Components.Forms;
6+
using Microsoft.Extensions.Localization;
67
using System.Reflection;
78

89
namespace BootstrapBlazor.Components;
@@ -25,7 +26,7 @@ public abstract class ValidateBase<TValue> : DisplayBase<TValue>, IValidateCompo
2526
protected string? PreviousErrorMessage { get; set; }
2627

2728
/// <summary>
28-
/// Gets the associated <see cref="EditContext"/>.
29+
/// Gets the associated <see cref="EditContext"/>
2930
/// </summary>
3031
protected EditContext? EditContext { get; set; }
3132

@@ -169,12 +170,27 @@ protected string CurrentValueAsString
169170
[Parameter]
170171
public bool IsDisabled { get; set; }
171172

173+
/// <summary>
174+
/// 获得/设置 是否显示必填项标记 默认为 null 未设置
175+
/// </summary>
176+
[Parameter]
177+
public bool? ShowRequired { get; set; }
178+
179+
/// <summary>
180+
/// 获得/设置 必填项错误文本 默认为 null 未设置
181+
/// </summary>
182+
[Parameter]
183+
public string? RequiredErrorMessage { get; set; }
184+
172185
/// <summary>
173186
/// 获得 父组件的 EditContext 实例
174187
/// </summary>
175188
[CascadingParameter]
176189
protected EditContext? CascadedEditContext { get; set; }
177190

191+
[Inject, NotNull]
192+
private IStringLocalizer<ValidateBase<string>>? Localizer { get; set; }
193+
178194
/// <summary>
179195
/// Parses a string to create an instance of <typeparamref name="TValue"/>. Derived classes can override this to change how
180196
/// <see cref="CurrentValueAsString"/> interprets incoming values.
@@ -209,7 +225,7 @@ protected virtual bool TryParseValueFromString(string value, [MaybeNullWhen(fals
209225
/// 判断是否为必填字段
210226
/// </summary>
211227
/// <returns></returns>
212-
protected virtual bool IsRequired() => FieldIdentifier
228+
protected virtual bool IsRequired() => ShowRequired ?? FieldIdentifier
213229
?.Model.GetType().GetPropertyByName(FieldIdentifier.Value.FieldName)!.GetCustomAttribute<RequiredAttribute>(true) != null
214230
|| (ValidateRules?.OfType<FormItemValidator>().Select(i => i.Validator).OfType<RequiredAttribute>().Any() ?? false);
215231

@@ -221,8 +237,7 @@ protected virtual bool IsRequired() => FieldIdentifier
221237

222238
/// <summary>
223239
/// Gets a CSS class string that combines the <c>class</c> attribute and <see cref="FieldClass"/>
224-
/// properties. Derived components should typically use this value for the primary HTML element's
225-
/// 'class' attribute.
240+
/// properties. Derived components should typically use this value for the primary HTML element's class attribute.
226241
/// </summary>
227242
protected string? CssClass => CssBuilder.Default()
228243
.AddClass(FieldClass, IsNeedValidate)
@@ -277,6 +292,11 @@ protected override void OnParametersSet()
277292
base.OnParametersSet();
278293

279294
Required = (IsNeedValidate && !string.IsNullOrEmpty(DisplayText) && (ValidateForm?.ShowRequiredMark ?? false) && IsRequired()) ? "true" : null;
295+
296+
if (ShowRequired is true)
297+
{
298+
Rules.Add(new RequiredValidator() { ErrorMessage = RequiredErrorMessage ?? GetDefaultErrorMessage() });
299+
}
280300
}
281301

282302
/// <summary>
@@ -301,6 +321,14 @@ protected override async Task OnAfterRenderAsync(bool firstRender)
301321
}
302322
}
303323

324+
private string? _defaultErrorMessage;
325+
326+
private string GetDefaultErrorMessage()
327+
{
328+
_defaultErrorMessage ??= Localizer["DefaultErrorMessage"];
329+
return _defaultErrorMessage;
330+
}
331+
304332
#region Validation
305333
/// <summary>
306334
/// 获得 数据验证方法集合

src/BootstrapBlazor/Extensions/ITableColumnExtensions.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ public static void CopyValue(this ITableColumn dest, IEditorItem source)
6060
if (!string.IsNullOrEmpty(source.PlaceHolder)) dest.PlaceHolder = source.PlaceHolder;
6161
if (!string.IsNullOrEmpty(source.Step)) dest.Step = source.Step;
6262
if (source.Order != 0) dest.Order = source.Order;
63+
if (source.Required.HasValue) dest.Required = source.Required;
64+
if (!string.IsNullOrEmpty(source.RequiredErrorMessage)) dest.RequiredErrorMessage = source.RequiredErrorMessage;
6365

6466
if (source is ITableColumn col)
6567
{
@@ -104,6 +106,8 @@ private static void CopyValue(this ITableColumn col, ITableColumn dest)
104106
if (col.GetTooltipTextCallback != null) dest.GetTooltipTextCallback = col.GetTooltipTextCallback;
105107
if (col.CustomSearch != null) dest.CustomSearch = col.CustomSearch;
106108
if (col.ToolboxTemplate != null) dest.ToolboxTemplate = col.ToolboxTemplate;
109+
if (col.IsRequiredWhenAdd.HasValue) dest.IsRequiredWhenAdd = col.IsRequiredWhenAdd;
110+
if (col.IsRequiredWhenEdit.HasValue) dest.IsRequiredWhenEdit = col.IsRequiredWhenEdit;
107111
}
108112

109113
/// <summary>

src/BootstrapBlazor/Locales/en.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,5 +373,8 @@
373373
"AutoModeText": "Auto",
374374
"DarkModeText": "Dark",
375375
"LightModeText": "Light"
376+
},
377+
"BootstrapBlazor.Components.ValidateBase": {
378+
"DefaultErrorMessage": "{0} is required."
376379
}
377380
}

0 commit comments

Comments
 (0)