diff --git a/src/BootstrapBlazor.Shared/Samples/EditDialogs.razor.cs b/src/BootstrapBlazor.Shared/Samples/EditDialogs.razor.cs index 7c3eeebc7a77d4e6cbd5c560707843baa3c61ccd..7c56d1e8ad37d803fadf129068143513207de249 100644 --- a/src/BootstrapBlazor.Shared/Samples/EditDialogs.razor.cs +++ b/src/BootstrapBlazor.Shared/Samples/EditDialogs.razor.cs @@ -54,7 +54,7 @@ namespace BootstrapBlazor.Shared.Samples Trace.Log("关闭按钮被点击"); return Task.CompletedTask; }, - OnSaveAsync = context => + OnEditAsync = context => { Trace.Log("保存按钮被点击"); return Task.FromResult(true); @@ -83,7 +83,7 @@ namespace BootstrapBlazor.Shared.Samples Trace.Log("关闭按钮被点击"); return Task.CompletedTask; }, - OnSaveAsync = context => + OnEditAsync = context => { Trace.Log("保存按钮被点击"); return Task.FromResult(true); @@ -117,7 +117,7 @@ namespace BootstrapBlazor.Shared.Samples Trace.Log("关闭按钮被点击"); return Task.CompletedTask; }, - OnSaveAsync = context => + OnEditAsync = context => { Trace.Log("保存按钮被点击"); return Task.FromResult(true); diff --git a/src/BootstrapBlazor/Components/Dialog/Dialog.razor.cs b/src/BootstrapBlazor/Components/Dialog/Dialog.razor.cs index b7d79b90b93292793877d86d9251755baa92f61a..1fe732d5f25e447cee5df998caba6d07be739d88 100644 --- a/src/BootstrapBlazor/Components/Dialog/Dialog.razor.cs +++ b/src/BootstrapBlazor/Components/Dialog/Dialog.razor.cs @@ -25,7 +25,7 @@ namespace BootstrapBlazor.Components /// /// 获得/设置 弹出对话框实例集合 /// - private List>> DialogParameters { get; } = new(); + private List> DialogParameters { get; } = new(); private bool IsKeyboard { get; set; } @@ -69,30 +69,45 @@ namespace BootstrapBlazor.Components { IsKeyboard = option.IsKeyboard; option.Dialog = ModalContainer; - var parameters = option.ToAttributes().ToList(); + var parameters = option.ToAttributes(); var content = option.BodyTemplate ?? option.Component?.Render(); if (content != null) { - parameters.Add(new(nameof(ModalDialog.BodyTemplate), content)); + parameters.Add(nameof(ModalDialog.BodyTemplate), content); } if (option.HeaderTemplate != null) { - parameters.Add(new(nameof(ModalDialog.HeaderTemplate), option.HeaderTemplate)); + parameters.Add(nameof(ModalDialog.HeaderTemplate), option.HeaderTemplate); } if (option.FooterTemplate != null) { - parameters.Add(new(nameof(ModalDialog.FooterTemplate), option.FooterTemplate)); + parameters.Add(nameof(ModalDialog.FooterTemplate), option.FooterTemplate); } if (!string.IsNullOrEmpty(option.Class)) { - parameters.Add(new(nameof(ModalDialog.Class), option.Class)); + parameters.Add(nameof(ModalDialog.Class), option.Class); } - parameters.Add(new(nameof(ModalDialog.OnClose), new Func(async () => + if (option.OnSaveAsync != null) + { + parameters.Add(nameof(ModalDialog.OnSaveAsync), option.OnSaveAsync); + } + + if (option.CloseButtonText != null) + { + parameters.Add(nameof(ModalDialog.CloseButtonText), option.CloseButtonText); + } + + if (option.SaveButtonText != null) + { + parameters.Add(nameof(ModalDialog.SaveButtonText), option.SaveButtonText); + } + + parameters.Add(nameof(ModalDialog.OnClose), new Func(async () => { // 回调 OnClose 方法 // 移除当前对话框 @@ -105,7 +120,7 @@ namespace BootstrapBlazor.Components // 支持多级弹窗 await ModalContainer.CloseOrPopDialog(); StateHasChanged(); - }))); + })); DialogParameters.Add(parameters); if (DialogParameters.Count == 1) diff --git a/src/BootstrapBlazor/Components/Dialog/DialogOption.cs b/src/BootstrapBlazor/Components/Dialog/DialogOption.cs index 0d33ff6804142ecdd2afc7fad0a9d4a76564bec7..4a31fb0958621e643d2fb75dc15e4489c9cdf03c 100644 --- a/src/BootstrapBlazor/Components/Dialog/DialogOption.cs +++ b/src/BootstrapBlazor/Components/Dialog/DialogOption.cs @@ -71,6 +71,11 @@ namespace BootstrapBlazor.Components /// public bool ShowPrintButton { get; set; } + /// + /// 获得/设置 是否显示保存按钮 默认 false 不显示 + /// + public bool ShowSaveButton { get; set; } + /// /// 获得/设置 打印按钮是否显示在 Header 中 默认 false 不显示 /// @@ -111,35 +116,51 @@ namespace BootstrapBlazor.Components /// public Func? OnCloseAsync { get; set; } + /// + /// 获得/设置 保存按钮回调方法 + /// + public Func>? OnSaveAsync { get; set; } + + /// + /// 获得/设置 关闭按钮文本 + /// + public string? CloseButtonText { get; set; } + + /// + /// 获得/设置 查询按钮文本 + /// + public string? SaveButtonText { get; set; } + /// /// 将参数转换为组件属性方法 /// /// - public IEnumerable> ToAttributes() + public Dictionary ToAttributes() { - var ret = new List> + var ret = new Dictionary { - new(nameof(Size), Size), - new(nameof(IsCentered), IsCentered), - new(nameof(IsScrolling), IsScrolling), - new(nameof(ShowCloseButton), ShowCloseButton), - new(nameof(ShowHeaderCloseButton), ShowHeaderCloseButton), - new(nameof(ShowFooter), ShowFooter), - new(nameof(ShowPrintButton), ShowPrintButton), - new(nameof(ShowPrintButtonInHeader), ShowPrintButtonInHeader), - new(nameof(IsKeyboard), IsKeyboard) + [nameof(Size)] = Size, + [nameof(IsCentered)] = IsCentered, + [nameof(IsScrolling)] = IsScrolling, + [nameof(ShowCloseButton)] = ShowCloseButton, + [nameof(ShowSaveButton)] = ShowSaveButton, + [nameof(ShowHeaderCloseButton)] = ShowHeaderCloseButton, + [nameof(ShowFooter)] = ShowFooter, + [nameof(ShowPrintButton)] = ShowPrintButton, + [nameof(ShowPrintButtonInHeader)] = ShowPrintButtonInHeader, + [nameof(IsKeyboard)] = IsKeyboard }; if (!string.IsNullOrEmpty(PrintButtonText)) { - ret.Add(new(nameof(PrintButtonText), PrintButtonText)); + ret.Add(nameof(PrintButtonText), PrintButtonText); } if (!string.IsNullOrEmpty(Title)) { - ret.Add(new(nameof(Title), Title)); + ret.Add(nameof(Title), Title); } if (BodyContext != null) { - ret.Add(new(nameof(BodyContext), BodyContext)); + ret.Add(nameof(BodyContext), BodyContext); } return ret; } diff --git a/src/BootstrapBlazor/Components/Dialog/DialogService.cs b/src/BootstrapBlazor/Components/Dialog/DialogService.cs index e3589f15152ef80d40f2a4d4a14b280d01320f18..6a911def4e70cba2f19e6d25c504fc518396bab9 100644 --- a/src/BootstrapBlazor/Components/Dialog/DialogService.cs +++ b/src/BootstrapBlazor/Components/Dialog/DialogService.cs @@ -16,28 +16,6 @@ namespace BootstrapBlazor.Components /// public class DialogService : BootstrapServiceBase { - private IStringLocalizer> EditDialogLocalizer { get; set; } - - private IStringLocalizer> SearchDialogLocalizer { get; set; } - - private IStringLocalizer ResultDialogLocalizer { get; set; } - - /// - /// 构造函数 - /// - /// - /// - /// - public DialogService( - IStringLocalizer> editLocalizer, - IStringLocalizer> seachLocalizer, - IStringLocalizer resultDialogLocalizer) - { - EditDialogLocalizer = editLocalizer; - SearchDialogLocalizer = seachLocalizer; - ResultDialogLocalizer = resultDialogLocalizer; - } - /// /// 显示 Dialog 方法 /// @@ -53,9 +31,6 @@ namespace BootstrapBlazor.Components /// 指定弹窗组件 默认为 null 使用 组件内置弹窗组件 public async Task ShowSearchDialog(SearchDialogOption option, Dialog? dialog = null) { - option.ResetButtonText ??= SearchDialogLocalizer[nameof(option.ResetButtonText)]; - option.QueryButtonText ??= SearchDialogLocalizer[nameof(option.QueryButtonText)]; - var parameters = new Dictionary { [nameof(SearchDialog.ShowLabel)] = option.ShowLabel, @@ -119,9 +94,6 @@ namespace BootstrapBlazor.Components /// public async Task ShowEditDialog(EditDialogOption option, Dialog? dialog = null) { - option.CloseButtonText ??= EditDialogLocalizer[nameof(option.CloseButtonText)]; - option.SaveButtonText ??= EditDialogLocalizer[nameof(option.SaveButtonText)]; - var parameters = new Dictionary { [nameof(EditDialog.ShowLoading)] = option.ShowLoading, @@ -134,9 +106,9 @@ namespace BootstrapBlazor.Components }), [nameof(EditDialog.OnSaveAsync)] = new Func(async context => { - if (option.OnSaveAsync != null) + if (option.OnEditAsync != null) { - var ret = await option.OnSaveAsync(context); + var ret = await option.OnEditAsync(context); if (ret) { option.Dialog.RemoveDialog(); @@ -202,10 +174,12 @@ namespace BootstrapBlazor.Components option.FooterTemplate = BootstrapDynamicComponent.CreateComponent(new Dictionary { + [nameof(ResultDialogFooter.ButtonCloseText)] = option.ButtonCloseText!, + [nameof(ResultDialogFooter.ButtonNoText)] = option.ButtonNoText!, + [nameof(ResultDialogFooter.ButtonYesText)] = option.ButtonYesText!, [nameof(ResultDialogFooter.ShowCloseButton)] = option.ShowCloseButton, [nameof(ResultDialogFooter.ButtonCloseColor)] = option.ButtonCloseColor, [nameof(ResultDialogFooter.ButtonCloseIcon)] = option.ButtonCloseIcon, - [nameof(ResultDialogFooter.ButtonCloseText)] = option.ButtonCloseText ?? ResultDialogLocalizer[nameof(option.ButtonCloseText)].Value, [nameof(ResultDialogFooter.OnClickClose)] = new Func(async () => { result = DialogResult.Close; @@ -215,7 +189,6 @@ namespace BootstrapBlazor.Components [nameof(ResultDialogFooter.ShowYesButton)] = option.ShowYesButton, [nameof(ResultDialogFooter.ButtonYesColor)] = option.ButtonYesColor, [nameof(ResultDialogFooter.ButtonYesIcon)] = option.ButtonYesIcon, - [nameof(ResultDialogFooter.ButtonYesText)] = option.ButtonYesText ?? ResultDialogLocalizer[nameof(option.ButtonYesText)].Value, [nameof(ResultDialogFooter.OnClickYes)] = new Func(async () => { result = DialogResult.Yes; @@ -225,7 +198,6 @@ namespace BootstrapBlazor.Components [nameof(ResultDialogFooter.ShowNoButton)] = option.ShowNoButton, [nameof(ResultDialogFooter.ButtonNoColor)] = option.ButtonNoColor, [nameof(ResultDialogFooter.ButtonNoIcon)] = option.ButtonNoIcon, - [nameof(ResultDialogFooter.ButtonNoText)] = option.ButtonNoText ?? ResultDialogLocalizer[nameof(option.ButtonNoText)].Value, [nameof(ResultDialogFooter.OnClickNo)] = new Func(async () => { result = DialogResult.No; diff --git a/src/BootstrapBlazor/Components/Dialog/EditDialogOption.cs b/src/BootstrapBlazor/Components/Dialog/EditDialogOption.cs index 6f293b2b120e380c38dc690ecb1943b2bcc497c3..19a73336ba210457a698e6e961875a472e725a8b 100644 --- a/src/BootstrapBlazor/Components/Dialog/EditDialogOption.cs +++ b/src/BootstrapBlazor/Components/Dialog/EditDialogOption.cs @@ -80,16 +80,6 @@ namespace BootstrapBlazor.Components /// /// 获得/设置 保存回调委托 /// - public Func>? OnSaveAsync { get; set; } - - /// - /// 获得/设置 关闭按钮文本 - /// - public string? CloseButtonText { get; set; } - - /// - /// 获得/设置 查询按钮文本 - /// - public string? SaveButtonText { get; set; } + public Func>? OnEditAsync { get; set; } } } diff --git a/src/BootstrapBlazor/Components/Dialog/ResultDialogFooter.razor.cs b/src/BootstrapBlazor/Components/Dialog/ResultDialogFooter.razor.cs index a12b267dbb067a37f1210ed6b9e6a51ac65b25bc..855ca8064dd9a546ec26e3e3e757770c314e373a 100644 --- a/src/BootstrapBlazor/Components/Dialog/ResultDialogFooter.razor.cs +++ b/src/BootstrapBlazor/Components/Dialog/ResultDialogFooter.razor.cs @@ -3,6 +3,7 @@ // Website: https://www.blazor.zone or https://argozhang.github.io/ using Microsoft.AspNetCore.Components; +using Microsoft.Extensions.Localization; using System; using System.Diagnostics.CodeAnalysis; using System.Threading.Tasks; @@ -95,23 +96,39 @@ namespace BootstrapBlazor.Components public Color ButtonCloseColor { get; set; } = Color.Secondary; /// - /// + /// 获得/设置 点击关闭按钮回调方法 /// [Parameter] public Func? OnClickClose { get; set; } /// - /// + /// 获得/设置 点击确认按钮回调方法 /// [Parameter] public Func? OnClickYes { get; set; } /// - /// + /// 获得/设置 点击取消按钮回调方法 /// [Parameter] public Func? OnClickNo { get; set; } + [Inject] + [NotNull] + private IStringLocalizer? Localizer { get; set; } + + /// + /// OnInitialized 方法 + /// + protected override void OnInitialized() + { + base.OnInitialized(); + + ButtonCloseText ??= Localizer[nameof(ButtonCloseText)]; + ButtonNoText ??= Localizer[nameof(ButtonNoText)]; + ButtonYesText ??= Localizer[nameof(ButtonYesText)]; + } + private async Task ButtonClick(DialogResult dialogResult) { if (dialogResult == DialogResult.Yes && OnClickYes != null) diff --git a/src/BootstrapBlazor/Components/Dialog/ResultDialogOption.cs b/src/BootstrapBlazor/Components/Dialog/ResultDialogOption.cs index a6a77725f123c2eccb1bd3e522ef85e6a18ef297..ee8f4c0ba620b4775e7572901b010059c79d9922 100644 --- a/src/BootstrapBlazor/Components/Dialog/ResultDialogOption.cs +++ b/src/BootstrapBlazor/Components/Dialog/ResultDialogOption.cs @@ -3,7 +3,6 @@ // Website: https://www.blazor.zone or https://argozhang.github.io/ using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; using System.Threading.Tasks; namespace BootstrapBlazor.Components @@ -29,7 +28,6 @@ namespace BootstrapBlazor.Components /// /// 确认按钮文本 /// - [NotNull] public string? ButtonYesText { get; set; } /// @@ -50,7 +48,6 @@ namespace BootstrapBlazor.Components /// /// 取消按钮文本 /// - [NotNull] public string? ButtonNoText { get; set; } /// @@ -66,7 +63,6 @@ namespace BootstrapBlazor.Components /// /// 关闭按钮文本 /// - [NotNull] public string? ButtonCloseText { get; set; } /// diff --git a/src/BootstrapBlazor/Components/Modal/ModalDialog.razor b/src/BootstrapBlazor/Components/Modal/ModalDialog.razor index 41c4fa3c268ab6d6393d2020d2d056e3e76465bb..8d0a70a1ae81e5da53fb829a5d379a5ed54aa0e6 100644 --- a/src/BootstrapBlazor/Components/Modal/ModalDialog.razor +++ b/src/BootstrapBlazor/Components/Modal/ModalDialog.razor @@ -30,12 +30,16 @@ } diff --git a/src/BootstrapBlazor/Components/Modal/ModalDialog.razor.cs b/src/BootstrapBlazor/Components/Modal/ModalDialog.razor.cs index 24d6a08474b5788bcdd67637b34917db98858048..9ed624c1d9385ce0fd470b2312256cdfe6975684 100644 --- a/src/BootstrapBlazor/Components/Modal/ModalDialog.razor.cs +++ b/src/BootstrapBlazor/Components/Modal/ModalDialog.razor.cs @@ -80,6 +80,12 @@ namespace BootstrapBlazor.Components [Parameter] public bool ShowCloseButton { get; set; } = true; + /// + /// 获得/设置 是否显示保存按钮 默认为 false 不显示 + /// + [Parameter] + public bool ShowSaveButton { get; set; } + /// /// 获得/设置 是否显示打印按钮 默认为 false 不显示 /// @@ -135,12 +141,26 @@ namespace BootstrapBlazor.Components public RenderFragment? HeaderTemplate { get; set; } /// - /// 获得/设置 关闭弹窗是回调委托 + /// 获得/设置 关闭弹窗回调委托 /// [Parameter] [NotNull] public Func? OnClose { get; set; } + /// + /// 获得/设置 保存按钮回调委托 + /// + [Parameter] + [NotNull] + public Func>? OnSaveAsync { get; set; } + + /// + /// 获得/设置 保存成功后是否自动关闭弹窗 默认 true 自动关闭 + /// + [Parameter] + [NotNull] + public bool IsAutoCloseAfterSave { get; set; } = true; + /// /// 获得/设置 关闭按钮显示文字 资源文件设置为 关闭 /// @@ -148,6 +168,13 @@ namespace BootstrapBlazor.Components [NotNull] public string? CloseButtonText { get; set; } + /// + /// 获得/设置 保存按钮显示文字 资源文件设置为 保存 + /// + [Parameter] + [NotNull] + public string? SaveButtonText { get; set; } + /// /// 获得/设置 弹窗容器实例 /// @@ -172,6 +199,7 @@ namespace BootstrapBlazor.Components } CloseButtonText ??= Localizer[nameof(CloseButtonText)]; + SaveButtonText ??= Localizer[nameof(SaveButtonText)]; PrintButtonText ??= Localizer[nameof(PrintButtonText)]; Interop = new JSInterop(JSRuntime); @@ -203,6 +231,15 @@ namespace BootstrapBlazor.Components } } + private async Task OnClickSave() + { + var ret = await OnSaveAsync(); + if (IsAutoCloseAfterSave && ret) + { + await OnClickClose(); + } + } + /// /// Close 方法 客户端按 ESC 键盘时调用 /// diff --git a/src/BootstrapBlazor/Components/Table/Table.razor.Toolbar.cs b/src/BootstrapBlazor/Components/Table/Table.razor.Toolbar.cs index 2aa735717b325e473951a9d1b61c4d00a9366cf5..b8c5905ac3be66ef19f955dbabc33f761def4215 100644 --- a/src/BootstrapBlazor/Components/Table/Table.razor.Toolbar.cs +++ b/src/BootstrapBlazor/Components/Table/Table.razor.Toolbar.cs @@ -544,7 +544,7 @@ namespace BootstrapBlazor.Components } await UpdateAsync(); }, - OnSaveAsync = async context => + OnEditAsync = async context => { await ToggleLoading(true); var valid = await SaveModelAsync(context, changedType); diff --git a/src/BootstrapBlazor/Locales/en.json b/src/BootstrapBlazor/Locales/en.json index fb95c6c66a1fdac6c98626dd739f1e026f9066ad..30cd083d00d6e473eba8542e95306cb0d0e7e57a 100644 --- a/src/BootstrapBlazor/Locales/en.json +++ b/src/BootstrapBlazor/Locales/en.json @@ -133,6 +133,7 @@ }, "BootstrapBlazor.Components.ModalDialog": { "CloseButtonText": "Close", + "SaveButtonText": "Save", "PrintButtonText": "Print" }, "BootstrapBlazor.Components.MultiSelect": { diff --git a/src/BootstrapBlazor/Locales/pt.json b/src/BootstrapBlazor/Locales/pt.json index 723ca9bc2cff05882d01b1822fffbc3f1f37854b..a21392f862a9973eba3e0c916deb86fda9bd77dc 100644 --- a/src/BootstrapBlazor/Locales/pt.json +++ b/src/BootstrapBlazor/Locales/pt.json @@ -133,6 +133,7 @@ }, "BootstrapBlazor.Components.ModalDialog": { "CloseButtonText": "Fechar", + "SaveButtonText": "Salvar", "PrintButtonText": "Imprimir" }, "BootstrapBlazor.Components.MultiSelect": { diff --git a/src/BootstrapBlazor/Locales/zh.json b/src/BootstrapBlazor/Locales/zh.json index 56f8642498c343c7ba8fbda36567e9fe3c59d0b9..a7c7648f56259c61ace77ffe5e6fa7fd706cb6a7 100644 --- a/src/BootstrapBlazor/Locales/zh.json +++ b/src/BootstrapBlazor/Locales/zh.json @@ -133,6 +133,7 @@ }, "BootstrapBlazor.Components.ModalDialog": { "CloseButtonText": "关闭", + "SaveButtonText": "保存", "PrintButtonText": "打印" }, "BootstrapBlazor.Components.MultiSelect": { diff --git a/test/UnitTest/Components/DialogTest.cs b/test/UnitTest/Components/DialogTest.cs index 0dabaab66cf87972e4e5bc586f668bc5f825139c..19e01e61f9e45b2737b9303f50efce1daab38a16 100644 --- a/test/UnitTest/Components/DialogTest.cs +++ b/test/UnitTest/Components/DialogTest.cs @@ -137,7 +137,7 @@ namespace UnitTest.Components // 设置保存回调 var saved = false; editOption.ShowLoading = true; - editOption.OnSaveAsync = context => + editOption.OnEditAsync = context => { saved = true; return Task.FromResult(true);