diff --git a/src/BootstrapBlazor.Server/Components/Samples/UploadCards.razor b/src/BootstrapBlazor.Server/Components/Samples/UploadCards.razor index bcfdac4aee3..a6f5e53bfb2 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/UploadCards.razor +++ b/src/BootstrapBlazor.Server/Components/Samples/UploadCards.razor @@ -74,7 +74,7 @@ diff --git a/src/BootstrapBlazor.Server/Components/Samples/UploadInputs.razor b/src/BootstrapBlazor.Server/Components/Samples/UploadInputs.razor index d5fc395fd2d..4b313756fa7 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/UploadInputs.razor +++ b/src/BootstrapBlazor.Server/Components/Samples/UploadInputs.razor @@ -15,7 +15,7 @@ Name="Normal">
-
diff --git a/src/BootstrapBlazor/Components/Button/PopConfirmButton.razor b/src/BootstrapBlazor/Components/Button/PopConfirmButton.razor index be939936c7a..2c823b1ac3c 100644 --- a/src/BootstrapBlazor/Components/Button/PopConfirmButton.razor +++ b/src/BootstrapBlazor/Components/Button/PopConfirmButton.razor @@ -1,4 +1,4 @@ -@namespace BootstrapBlazor.Components +@namespace BootstrapBlazor.Components @inherits PopConfirmButtonBase @if (_renderTooltip) @@ -35,7 +35,8 @@ else ; diff --git a/src/BootstrapBlazor/Components/Upload/CardUpload.razor b/src/BootstrapBlazor/Components/Upload/CardUpload.razor index beb494b22f0..d8d9cece1da 100644 --- a/src/BootstrapBlazor/Components/Upload/CardUpload.razor +++ b/src/BootstrapBlazor/Components/Upload/CardUpload.razor @@ -67,7 +67,7 @@
@if (ShowDeleteButton) { - @if (ShowDeleteConfirmButton) + @if (IsConfirmDelete) { + OnConfirm="@(()=> OnCardFileDelete(item))" /> } else { } diff --git a/src/BootstrapBlazor/Components/Upload/CardUpload.razor.cs b/src/BootstrapBlazor/Components/Upload/CardUpload.razor.cs index 2255ac61da9..e464c682e01 100644 --- a/src/BootstrapBlazor/Components/Upload/CardUpload.razor.cs +++ b/src/BootstrapBlazor/Components/Upload/CardUpload.razor.cs @@ -165,7 +165,16 @@ public partial class CardUpload /// Gets or sets whether to display a confirmation dialog before deletion. Only takes effect when the ShowDeleteButton property is true /// [Parameter] - public bool ShowDeleteConfirmButton { get; set; } + [Obsolete("已弃用,请使用 IsConfirmDelete 参数。Deprecated, please use the IsConfirmDelete parameter")] + [ExcludeFromCodeCoverage] + public bool ShowDeleteConfirmButton { get => IsConfirmDelete; set => IsConfirmDelete = value; } + + /// + /// 获得/设置 删除按钮否显示确认对话框,依赖 ShowDeleteButton 属性为 true 时有效 + /// Gets or sets whether to display a confirmation dialog before deletion. Only takes effect when the ShowDeleteButton property is true + /// + [Parameter] + public bool IsConfirmDelete { get; set; } /// /// 获得/设置 删除确认弹窗中确认按钮颜色,默认 Color.Danger diff --git a/src/BootstrapBlazor/Components/Upload/InputUpload.razor b/src/BootstrapBlazor/Components/Upload/InputUpload.razor index 50798e49d2a..55e6af9d8fa 100644 --- a/src/BootstrapBlazor/Components/Upload/InputUpload.razor +++ b/src/BootstrapBlazor/Components/Upload/InputUpload.razor @@ -1,4 +1,4 @@ -@namespace BootstrapBlazor.Components +@namespace BootstrapBlazor.Components @typeparam TValue @inherits UploadBase @@ -12,9 +12,28 @@ placeholder="@PlaceHolder" value="@CurrentValueAsString" /> @if (ShowDeleteButton) { - + @if (IsConfirmDelete) + { + + } + else + { + + } + } diff --git a/src/BootstrapBlazor/Components/Upload/InputUpload.razor.cs b/src/BootstrapBlazor/Components/Upload/InputUpload.razor.cs index 1c7de760004..de114dcd61e 100644 --- a/src/BootstrapBlazor/Components/Upload/InputUpload.razor.cs +++ b/src/BootstrapBlazor/Components/Upload/InputUpload.razor.cs @@ -64,6 +64,48 @@ public partial class InputUpload [Parameter] public bool ShowDeleteButton { get; set; } + /// + /// 获得/设置 删除按钮否显示确认对话框,依赖 ShowDeleteButton 属性为 true 时有效 + /// Gets or sets whether to display a confirmation dialog before deletion. Only takes effect when the ShowDeleteButton property is true + /// + [Parameter] + public bool IsConfirmDelete { get; set; } + + /// + /// 获得/设置 删除确认弹窗中确认按钮图标,默认 null + /// Gets or sets the confirmation button icon in the delete confirmation dialog. Default is null + /// + [Parameter] + public string? DeleteConfirmButtonIcon { get; set; } + + /// + /// 获得/设置 删除确认弹窗中确认按钮颜色,默认 Color.Danger + /// Gets or sets the color of the confirmation button in the delete confirmation dialog. Default is Color.Danger + /// + [Parameter] + public Color DeleteConfirmButtonColor { get; set; } = Color.Danger; + + /// + /// 获得/设置 删除确认弹窗中确认按钮显示文字,默认 null + /// Gets or sets the confirmation button display text in the delete confirmation dialog. Default is null + /// + [Parameter] + public string? DeleteConfirmButtonText { get; set; } + + /// + /// 获得/设置 删除确认弹窗中取消按钮显示文字,默认 null + /// Gets or sets the cancel button display text in the delete confirmation dialog. Default is null + /// + [Parameter] + public string? DeleteCloseButtonText { get; set; } + + /// + /// 获得/设置 删除确认弹窗中确认文本内容,默认 null 使用资源文件中内置文字 + /// Gets or sets the confirmation text content in the delete confirmation dialog. Default is null (uses built-in text from resource file) + /// + [Parameter] + public string? DeleteConfirmContent { get; set; } + /// /// 获得/设置 PlaceHolder 占位符文本 /// Gets or sets the placeholder text @@ -118,6 +160,5 @@ private async Task TriggerDeleteFile() var item = Files[index - 1]; await OnFileDelete(item); } - CurrentValue = default; } } diff --git a/src/BootstrapBlazor/Components/Upload/UploadBase.cs b/src/BootstrapBlazor/Components/Upload/UploadBase.cs index 4850b49e595..7d8a6feb57d 100644 --- a/src/BootstrapBlazor/Components/Upload/UploadBase.cs +++ b/src/BootstrapBlazor/Components/Upload/UploadBase.cs @@ -224,7 +224,7 @@ private void UpdateValue(List items) } else if (ValueType == typeof(IBrowserFile)) { - CurrentValue = (TValue)items[0].File!; + CurrentValue = items.Count != 0 ? (TValue?)items[0].File : default; } else if (ValueType == typeof(string)) { diff --git a/test/UnitTest/Components/UploadCardTest.cs b/test/UnitTest/Components/UploadCardTest.cs index b40e06a73e2..d4d7f792298 100644 --- a/test/UnitTest/Components/UploadCardTest.cs +++ b/test/UnitTest/Components/UploadCardTest.cs @@ -324,7 +324,7 @@ public void ActionButtonTemplate_Ok() } [Fact] - public async Task ShowConfirmButton_Ok() + public async Task IsConfirmDelete_Ok() { var cut = Context.Render>(pb => { @@ -333,7 +333,7 @@ public async Task ShowConfirmButton_Ok() new() { FileName = "test.png" } ]); pb.Add(a => a.ShowDeleteButton, true); - pb.Add(a => a.ShowDeleteConfirmButton, true); + pb.Add(a => a.IsConfirmDelete, true); pb.Add(a => a.DeleteConfirmButtonColor, Color.Danger); pb.Add(a => a.DeleteConfirmButtonIcon, "icon-delete"); pb.Add(a => a.DeleteConfirmContent, "content-delete"); diff --git a/test/UnitTest/Components/UploadInputTest.cs b/test/UnitTest/Components/UploadInputTest.cs index 491dff7b939..d1b84627478 100644 --- a/test/UnitTest/Components/UploadInputTest.cs +++ b/test/UnitTest/Components/UploadInputTest.cs @@ -80,6 +80,36 @@ await cut.InvokeAsync(() => input.Instance.OnChange.InvokeAsync(new InputFileCha cut.WaitForAssertion(() => cut.Contains("btn btn-delete")); } + [Fact] + public async Task IsConfirmDelete_Ok() + { + var file = new MockBrowserFile(); + var cut = Context.Render>(pb => + { + pb.Add(a => a.ShowDeleteButton, true); + pb.Add(a => a.IsConfirmDelete, true); + pb.Add(a => a.DeleteConfirmButtonColor, Color.Danger); + pb.Add(a => a.DeleteConfirmButtonIcon, "icon-delete"); + pb.Add(a => a.DeleteConfirmContent, "content-delete"); + pb.Add(a => a.DeleteConfirmButtonText, "confirm"); + pb.Add(a => a.DeleteCloseButtonText, "cancel"); + }); + + var input = cut.FindComponent(); + await cut.InvokeAsync(() => input.Instance.OnChange.InvokeAsync(new InputFileChangeEventArgs(new List() + { + new() + }))); + + var button = cut.FindComponent(); + Assert.NotNull(button); + Assert.NotNull(button.Instance.OnConfirm); + Assert.DoesNotContain("pop-confirm disabled", button.Markup); + + await cut.InvokeAsync(button.Instance.OnConfirm); + Assert.Contains("pop-confirm disabled", button.Markup); + } + [Fact] public async Task InputUpload_ValidateForm_Ok() { @@ -209,6 +239,7 @@ await cut.InvokeAsync(() => input.Instance.OnChange.InvokeAsync(new InputFileCha Assert.DoesNotContain("test5.png;test6.png", cut.Markup); } + [Fact] public void InputUpload_IsMultiple() {