Skip to content

Commit 662be40

Browse files
authored
feat(EditDialog): add ShowCloseConfirm parameter (#7721)
* doc: 更新导出配置类文档 * feat: 增加 ShowConfirmCloseSwal 配置项 * feat: 增加弹窗确认功能 * doc: 更新多语言配置信息 * feat: 增加提示信息参数 * test: 增加单元测试 * doc: 更新注释信息 * feat: 增加 CloseConfirmTitle 参数 * feat: 增加抽屉组件参数设置 * feat: 增加 ShowConfirmCloseSwal 参数 * refactor: 代码格式化 * test: 增加确认文字参数单元测试 * test: 增加单元测试 * refactor: 更改参数名称
1 parent 22972e5 commit 662be40

17 files changed

+326
-74
lines changed

src/BootstrapBlazor/Components/Dialog/EditDialog.razor

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
@attribute [BootstrapModuleAutoLoader("Dialog/EditDialog.razor.js", AutoInvokeInit = false, AutoInvokeDispose = false)]
55

66
<ValidateForm Model="@Model" OnValidSubmit="@OnValidSubmitAsync" LabelWidth="@LabelWidth"
7+
OnFieldValueChanged="OnFieldValueChanged"
78
DisableAutoSubmitFormByEnter="@DisableAutoSubmitFormByEnter">
89
<CascadingValue Value="ItemChangedType" IsFixed="true">
910
@if (BodyTemplate != null)

src/BootstrapBlazor/Components/Dialog/EditDialog.razor.cs

Lines changed: 89 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,20 @@ public partial class EditDialog<TModel>
4949
[Parameter]
5050
public string? SaveButtonText { get; set; }
5151

52+
/// <summary>
53+
/// <para lang="zh">获得/设置 关闭确认弹窗标题</para>
54+
/// <para lang="en">Gets or sets Close Confirm Dialog Title</para>
55+
/// </summary>
56+
[Parameter]
57+
public string? CloseConfirmTitle { get; set; }
58+
59+
/// <summary>
60+
/// <para lang="zh">获得/设置 关闭确认弹窗内容</para>
61+
/// <para lang="en">Gets or sets Close Confirm Dialog Content</para>
62+
/// </summary>
63+
[Parameter]
64+
public string? CloseConfirmContent { get; set; }
65+
5266
/// <summary>
5367
/// <para lang="zh">获得/设置 保存回调委托 返回 false 时保持编辑弹窗 返回 true 时关闭编辑弹窗</para>
5468
/// <para lang="en">Gets or sets Save Callback Delegate. Return false to keep edit dialog, true to close it</para>
@@ -65,8 +79,8 @@ public partial class EditDialog<TModel>
6579
public string? CloseButtonIcon { get; set; }
6680

6781
/// <summary>
68-
/// <para lang="zh">获得/设置 获得/设置 重置按钮文本</para>
69-
/// <para lang="en">Gets or sets Reset Button Text</para>
82+
/// <para lang="zh">获得/设置 关闭按钮文本</para>
83+
/// <para lang="en">Gets or sets Close Button Text</para>
7084
/// </summary>
7185
[Parameter]
7286
public string? CloseButtonText { get; set; }
@@ -99,17 +113,46 @@ public partial class EditDialog<TModel>
99113
[Parameter]
100114
public RenderFragment<TModel>? FooterTemplate { get; set; }
101115

116+
/// <summary>
117+
/// <para lang="zh">获得/设置 是否显示关闭弹窗确认弹窗。默认为 null 使用全局配置设置值 <see cref="BootstrapBlazorOptions.EditDialogSettings"/></para>
118+
/// <para lang="en">Gets or sets whether to show the close confirm dialog. Default is null to use global configuration <see cref="BootstrapBlazorOptions.EditDialogSettings"/></para>
119+
/// </summary>
120+
[Parameter]
121+
public bool? ShowCloseConfirm { get; set; }
122+
102123
[CascadingParameter]
103124
private Func<Task>? CloseAsync { get; set; }
104125

126+
[CascadingParameter]
127+
private Modal? Modal { get; set; }
128+
105129
[Inject]
106130
[NotNull]
107131
private IStringLocalizer<EditDialog<TModel>>? Localizer { get; set; }
108132

133+
[Inject]
134+
[NotNull]
135+
private IOptions<BootstrapBlazorOptions>? BootstrapBlazorOptions { get; set; }
136+
137+
[Inject, NotNull]
138+
private SwalService? SwalService { get; set; }
139+
109140
[Inject]
110141
[NotNull]
111142
private IIconTheme? IconTheme { get; set; }
112143

144+
private bool _hasFieldValueChanged;
145+
146+
/// <summary>
147+
/// <inheritdoc/>
148+
/// </summary>
149+
protected override void OnInitialized()
150+
{
151+
base.OnInitialized();
152+
153+
Modal?.RegisterOnClosingCallback(OnClosingCallback);
154+
}
155+
113156
/// <summary>
114157
/// <para lang="zh">OnParametersSet 方法</para>
115158
/// <para lang="en">OnParametersSet Method</para>
@@ -123,6 +166,26 @@ protected override void OnParametersSet()
123166

124167
CloseButtonText ??= Localizer[nameof(CloseButtonText)];
125168
SaveButtonText ??= Localizer[nameof(SaveButtonText)];
169+
170+
CloseConfirmTitle ??= Localizer[nameof(CloseConfirmTitle)];
171+
CloseConfirmContent ??= Localizer[nameof(CloseConfirmContent)];
172+
}
173+
174+
private async Task<bool> OnClosingCallback()
175+
{
176+
var ret = true;
177+
if (BootstrapBlazorOptions.Value.GetEditDialogShowConfirmSwal(ShowCloseConfirm, _hasFieldValueChanged))
178+
{
179+
var op = new SwalOption()
180+
{
181+
Title = CloseConfirmTitle,
182+
Content = CloseConfirmContent,
183+
Category = SwalCategory.Question,
184+
};
185+
ret = await SwalService.ShowModal(op);
186+
}
187+
188+
return ret;
126189
}
127190

128191
private async Task OnValidSubmitAsync(EditContext context)
@@ -133,13 +196,23 @@ private async Task OnValidSubmitAsync(EditContext context)
133196
var save = await OnSaveAsync(context);
134197
await ToggleLoading(false);
135198

199+
if (save)
200+
{
201+
_hasFieldValueChanged = false;
202+
}
203+
136204
if (save && CloseAsync != null)
137205
{
138206
await CloseAsync();
139207
}
140208
}
141209
}
142210

211+
private void OnFieldValueChanged(string fieldName, object? value)
212+
{
213+
_hasFieldValueChanged = true;
214+
}
215+
143216
/// <summary>
144217
/// <para lang="zh">显示/隐藏 Loading 遮罩</para>
145218
/// <para lang="en">Show/Hide Loading Mask</para>
@@ -178,4 +251,18 @@ public async ValueTask ToggleLoading(bool state)
178251
builder.CloseComponent();
179252
}
180253
};
254+
255+
/// <summary>
256+
/// <inheritdoc/>
257+
/// </summary>
258+
/// <param name="disposing"></param>
259+
protected override async ValueTask DisposeAsync(bool disposing)
260+
{
261+
if (disposing)
262+
{
263+
Modal?.UnRegisterOnClosingCallback(OnClosingCallback);
264+
}
265+
266+
await base.DisposeAsync(disposing);
267+
}
181268
}

src/BootstrapBlazor/Components/Dialog/EditDialogOption.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,4 +97,19 @@ public EditDialogOption()
9797
/// <inheritdoc cref="ITableEditDialogOption{TModel}.OnEditAsync"/>
9898
/// </summary>
9999
public Func<EditContext, Task<bool>>? OnEditAsync { get; set; }
100+
101+
/// <summary>
102+
/// <inheritdoc cref="ITableEditDialogOption{TModel}.ShowConfirmCloseSwal"/>
103+
/// </summary>
104+
public bool? ShowConfirmCloseSwal { get; set; }
105+
106+
/// <summary>
107+
/// <inheritdoc cref="ITableEditDialogOption{TModel}.CloseConfirmTitle"/>
108+
/// </summary>
109+
public string? CloseConfirmTitle { get; set; }
110+
111+
/// <summary>
112+
/// <inheritdoc cref="ITableEditDialogOption{TModel}.CloseConfirmContent"/>
113+
/// </summary>
114+
public string? CloseConfirmContent { get; set; }
100115
}

src/BootstrapBlazor/Components/Table/ITableEditDialogOption.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,4 +132,22 @@ public interface ITableEditDialogOption<TModel>
132132
/// <para lang="en">Gets or sets EditDialog Footer template</para>
133133
/// </summary>
134134
RenderFragment<TModel>? DialogFooterTemplate { get; set; }
135+
136+
/// <summary>
137+
/// <para lang="zh">获得/设置 是否显示关闭弹窗确认弹窗。默认为 null 使用全局配置设置值 <see cref="BootstrapBlazorOptions.EditDialogSettings"/></para>
138+
/// <para lang="en">Gets or sets whether to show the close confirm dialog. Default is null to use global configuration <see cref="BootstrapBlazorOptions.EditDialogSettings"/></para>
139+
/// </summary>
140+
bool? ShowConfirmCloseSwal { get; set; }
141+
142+
/// <summary>
143+
/// <para lang="zh">获得/设置 关闭确认弹窗标题</para>
144+
/// <para lang="en">Gets or sets Close Confirm Dialog Title</para>
145+
/// </summary>
146+
string? CloseConfirmTitle { get; set; }
147+
148+
/// <summary>
149+
/// <para lang="zh">获得/设置 关闭确认弹窗内容</para>
150+
/// <para lang="en">Gets or sets Close Confirm Dialog Content</para>
151+
/// </summary>
152+
string? CloseConfirmContent { get; set; }
135153
}

src/BootstrapBlazor/Components/Table/Table.razor.Edit.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,27 @@ public partial class Table<TItem>
248248
[Parameter]
249249
public IDataService<TItem>? DataService { get; set; }
250250

251+
/// <summary>
252+
/// <para lang="zh">获得/设置 是否显示关闭弹窗确认弹窗。默认为 null 使用全局配置设置值 <see cref="BootstrapBlazorOptions.EditDialogSettings"/></para>
253+
/// <para lang="en">Gets or sets whether to show the close confirm dialog. Default is null to use global configuration <see cref="BootstrapBlazorOptions.EditDialogSettings"/></para>
254+
/// </summary>
255+
[Parameter]
256+
public bool? ShowCloseConfirm { get; set; }
257+
258+
/// <summary>
259+
/// <para lang="zh">获得/设置 关闭确认弹窗标题</para>
260+
/// <para lang="en">Gets or sets Close Confirm Dialog Title</para>
261+
/// </summary>
262+
[Parameter]
263+
public string? CloseConfirmTitle { get; set; }
264+
265+
/// <summary>
266+
/// <para lang="zh">获得/设置 关闭确认弹窗内容</para>
267+
/// <para lang="en">Gets or sets Close Confirm Dialog Content</para>
268+
/// </summary>
269+
[Parameter]
270+
public string? CloseConfirmContent { get; set; }
271+
251272
/// <summary>
252273
/// <para lang="zh">获得/设置 注入数据服务</para>
253274
/// <para lang="en">Gets or sets Injected Data Service</para>

src/BootstrapBlazor/Components/Table/Table.razor.Toolbar.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -969,6 +969,9 @@ protected async Task ShowEditDialog(ItemChangedType changedType)
969969
IsDraggable = EditDialogIsDraggable,
970970
ShowMaximizeButton = EditDialogShowMaximizeButton,
971971
FullScreenSize = EditDialogFullScreenSize,
972+
ShowConfirmCloseSwal = ShowCloseConfirm,
973+
CloseConfirmTitle = CloseConfirmTitle,
974+
CloseConfirmContent = CloseConfirmContent,
972975
OnCloseAsync = async () =>
973976
{
974977
if (triggerFromSave == false && OnAfterCancelSaveAsync != null)
@@ -997,6 +1000,9 @@ protected async Task ShowEditDrawer(ItemChangedType changedType)
9971000
var saved = false;
9981001
var editOption = new TableEditDrawerOption<TItem>()
9991002
{
1003+
ShowConfirmCloseSwal = ShowCloseConfirm,
1004+
CloseConfirmTitle = CloseConfirmTitle,
1005+
CloseConfirmContent = CloseConfirmContent,
10001006
OnCloseAsync = async () =>
10011007
{
10021008
if (OnAfterCancelSaveAsync != null)

src/BootstrapBlazor/Components/Table/TableEditDrawerOption.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,4 +112,19 @@ public class TableEditDrawerOption<TModel> : ITableEditDialogOption<TModel>
112112
/// <inheritdoc cref="ITableEditDialogOption{TModel}.OnEditAsync"/>
113113
/// </summary>
114114
public Func<EditContext, Task<bool>>? OnEditAsync { get; set; }
115+
116+
/// <summary>
117+
/// <inheritdoc cref="ITableEditDialogOption{TModel}.ShowConfirmCloseSwal"/>
118+
/// </summary>
119+
public bool? ShowConfirmCloseSwal { get; set; }
120+
121+
/// <summary>
122+
/// <inheritdoc cref="ITableEditDialogOption{TModel}.CloseConfirmTitle"/>
123+
/// </summary>
124+
public string? CloseConfirmTitle { get; set; }
125+
126+
/// <summary>
127+
/// <inheritdoc cref="ITableEditDialogOption{TModel}.CloseConfirmContent"/>
128+
/// </summary>
129+
public string? CloseConfirmContent { get; set; }
115130
}

src/BootstrapBlazor/Extensions/BootstrapBlazorOptionsExtensions.cs

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,39 +6,45 @@
66
namespace BootstrapBlazor.Components;
77

88
/// <summary>
9-
/// <para lang="zh">BootstrapBlazorOptions configuration class extension methods</para>
10-
/// <para lang="en">BootstrapBlazorOptions configuration class extension methods</para>
9+
/// <para lang="zh">BootstrapBlazorOptions 配置类扩展方法</para>
10+
/// <para lang="en">BootstrapBlazorOptions extension methods</para>
1111
/// </summary>
1212
public static class BootstrapBlazorOptionsExtensions
1313
{
1414
/// <summary>
15-
/// <para lang="zh">Get step size generic method</para>
16-
/// <para lang="en">Get step size generic method</para>
15+
/// <para lang="zh">获得 步长</para>
16+
/// <para lang="en">Gets the step size</para>
1717
/// </summary>
1818
/// <typeparam name="TType">The type parameter</typeparam>
1919
/// <param name="options">The BootstrapBlazorOptions instance</param>
20-
/// <returns>The step size as a string</returns>
2120
public static string? GetStep<TType>(this BootstrapBlazorOptions options) => options.GetStep(typeof(TType));
2221

2322
/// <summary>
24-
/// <para lang="zh">Get step size method</para>
25-
/// <para lang="en">Get step size method</para>
23+
/// <para lang="zh">获得 步长</para>
24+
/// <para lang="en">Gets the step size</para>
2625
/// </summary>
2726
/// <param name="options">The BootstrapBlazorOptions instance</param>
2827
/// <param name="type">The data type</param>
29-
/// <returns>The step size as a string</returns>
3028
public static string? GetStep(this BootstrapBlazorOptions options, Type type)
3129
{
3230
var t = Nullable.GetUnderlyingType(type) ?? type;
3331
return options.StepSettings.GetStep(t);
3432
}
3533

3634
/// <summary>
37-
/// <para lang="zh">Get Modal IsFade value</para>
38-
/// <para lang="en">Get Modal IsFade value</para>
35+
/// <para lang="zh">获得 Modal IsFade </para>
36+
/// <para lang="en">Gets the Modal IsFade value</para>
3937
/// </summary>
4038
/// <param name="options">The BootstrapBlazorOptions instance</param>
4139
/// <param name="value">The default value</param>
42-
/// <returns>The IsFade value as a boolean</returns>
4340
public static bool GetIsFadeValue(this BootstrapBlazorOptions options, bool? value) => value ?? options.ModalSettings.IsFade ?? true;
41+
42+
/// <summary>
43+
/// <para lang="zh">获得 EditDialog 是否显示关闭确认弹窗值</para>
44+
/// <para lang="en">Gets whether to show the EditDialog close confirm dialog</para>
45+
/// </summary>
46+
/// <param name="options">The BootstrapBlazorOptions instance</param>
47+
/// <param name="value">The default value</param>
48+
/// <param name="modified">Indicates whether the value has been modified</param>
49+
public static bool GetEditDialogShowConfirmSwal(this BootstrapBlazorOptions options, bool? value, bool modified) => (value ?? options.EditDialogSettings.ShowCloseConfirm ?? false) && modified;
4450
}

src/BootstrapBlazor/Extensions/TableEditDialogOptionExtensions.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ public static class TableEditDialogOptionExtensions
3434
[nameof(EditDialog<TModel>.CloseButtonIcon)] = option.CloseButtonIcon,
3535
[nameof(EditDialog<TModel>.SaveButtonText)] = option.SaveButtonText,
3636
[nameof(EditDialog<TModel>.SaveButtonIcon)] = option.SaveButtonIcon,
37+
[nameof(EditDialog<TModel>.ShowCloseConfirm)] = option.ShowConfirmCloseSwal,
38+
[nameof(EditDialog<TModel>.CloseConfirmTitle)] = option.CloseConfirmTitle,
39+
[nameof(EditDialog<TModel>.CloseConfirmContent)] = option.CloseConfirmContent,
3740
[nameof(EditDialog<TModel>.Model)] = option.Model,
3841
[nameof(EditDialog<TModel>.DisableAutoSubmitFormByEnter)] = option.DisableAutoSubmitFormByEnter,
3942
[nameof(EditDialog<TModel>.LabelWidth)] = option.LabelWidth,

src/BootstrapBlazor/Locales/en.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,9 @@
261261
},
262262
"BootstrapBlazor.Components.EditDialog": {
263263
"CloseButtonText": "Close",
264-
"SaveButtonText": "Save"
264+
"SaveButtonText": "Save",
265+
"CloseConfirmTitle": "Warning",
266+
"CloseConfirmContent": "The form has been changed. Are you sure you continue to close it?"
265267
},
266268
"BootstrapBlazor.Components.TableColumnFilter": {
267269
"ClearButtonText": "Clear",

0 commit comments

Comments
 (0)