diff --git a/src/BootstrapBlazor.Server/Components/Samples/UploadCards.razor b/src/BootstrapBlazor.Server/Components/Samples/UploadCards.razor index b783ed6e38b..c65276e5ad5 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/UploadCards.razor +++ b/src/BootstrapBlazor.Server/Components/Samples/UploadCards.razor @@ -1,4 +1,4 @@ -@page "/upload-card" +@page "/upload-card" @inject IOptions WebsiteOption @inject IStringLocalizer Localizer @inject ToastService ToastService @@ -52,6 +52,12 @@ +
+ + + + +
@@ -68,7 +74,7 @@ diff --git a/src/BootstrapBlazor.Server/Components/Samples/UploadCards.razor.cs b/src/BootstrapBlazor.Server/Components/Samples/UploadCards.razor.cs index 5459c1edb11..c12661e580a 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/UploadCards.razor.cs +++ b/src/BootstrapBlazor.Server/Components/Samples/UploadCards.razor.cs @@ -1,4 +1,4 @@ -// Licensed to the .NET Foundation under one or more agreements. +// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the Apache 2.0 License // See the LICENSE file in the project root for more information. // Maintainer: Argo Zhang(argo@live.ca) Website: https://www.blazor.zone @@ -17,6 +17,7 @@ public partial class UploadCards : IDisposable private bool _showProgress = true; private bool _showZoomButton = true; private bool _showDeleteButton = true; + private bool _showDeleteConfirmButton = true; private bool _showDownloadButton = true; private List DefaultFormatFileList { get; } = diff --git a/src/BootstrapBlazor/BootstrapBlazor.csproj b/src/BootstrapBlazor/BootstrapBlazor.csproj index 5467994fe63..8075f3488e6 100644 --- a/src/BootstrapBlazor/BootstrapBlazor.csproj +++ b/src/BootstrapBlazor/BootstrapBlazor.csproj @@ -1,7 +1,7 @@  - 10.2.1-beta05 + 10.2.1 diff --git a/src/BootstrapBlazor/Components/Upload/CardUpload.razor b/src/BootstrapBlazor/Components/Upload/CardUpload.razor index 1cd0f01ca64..040c857b915 100644 --- a/src/BootstrapBlazor/Components/Upload/CardUpload.razor +++ b/src/BootstrapBlazor/Components/Upload/CardUpload.razor @@ -67,11 +67,27 @@
@if (ShowDeleteButton) { - + @if (ShowDeleteConfirmButton) + { + + } + else + { + + } + } @if (GetShowProgress(item)) @@ -99,6 +115,6 @@ @code { RenderFragment RenderAdd => @
- +
; } diff --git a/src/BootstrapBlazor/Components/Upload/CardUpload.razor.cs b/src/BootstrapBlazor/Components/Upload/CardUpload.razor.cs index 7f746015eb1..82685e0863b 100644 --- a/src/BootstrapBlazor/Components/Upload/CardUpload.razor.cs +++ b/src/BootstrapBlazor/Components/Upload/CardUpload.razor.cs @@ -3,6 +3,8 @@ // See the LICENSE file in the project root for more information. // Maintainer: Argo Zhang(argo@live.ca) Website: https://www.blazor.zone +using Microsoft.Extensions.Localization; + namespace BootstrapBlazor.Components; /// @@ -135,6 +137,44 @@ public partial class CardUpload [Parameter] public List? AllowExtensions { get; set; } + /// + /// 获得/设置 删除前是否显示确认对话框,依赖 属性为 true 时有效 + /// + [Parameter] + public bool ShowDeleteConfirmButton { get; set; } + + /// + /// 获得/设置 删除确认弹窗中确认按钮颜色 默认 + /// + [Parameter] + public Color DeleteConfirmButtonColor { get; set; } = Color.Danger; + + /// + /// 获得/设置 删除确认弹窗中确认按钮图标 默认 null 未设置 + /// + [Parameter] + public string? DeleteConfirmButtonIcon { get; set; } + + /// + /// 获得/设置 删除确认弹窗中确认文本内容 默认 null 未设置 使用资源文件中内置文字 + /// + [Parameter] + public string? DeleteConfirmContent { get; set; } + /// + /// 获得/设置 删除确认弹窗中确认按钮显示文字 默认 null 未设置 + /// + [Parameter] + public string? DeleteConfirmButtonText { get; set; } + + /// + /// 获得/设置 删除确认弹窗中取消按钮显示文字 默认 null 未设置 + /// + [Parameter] + public string? DeleteCloseButtonText { get; set; } + + [Inject, NotNull] + private IStringLocalizer>? Localizer { get; set; } + /// /// /// @@ -146,6 +186,8 @@ protected override void OnParametersSet() StatusIcon ??= IconTheme.GetIconByKey(ComponentIcons.CardUploadStatusIcon); ZoomIcon ??= IconTheme.GetIconByKey(ComponentIcons.CardUploadZoomIcon); RemoveIcon ??= IconTheme.GetIconByKey(ComponentIcons.CardUploadRemoveIcon); + + DeleteConfirmContent ??= Localizer["DeleteConfirmContent"]; } /// diff --git a/src/BootstrapBlazor/Locales/en.json b/src/BootstrapBlazor/Locales/en.json index a195655f28f..6005210830b 100644 --- a/src/BootstrapBlazor/Locales/en.json +++ b/src/BootstrapBlazor/Locales/en.json @@ -402,5 +402,8 @@ }, "BootstrapBlazor.Components.LoadMore": { "NoMoreText": "No More Data" + }, + "BootstrapBlazor.Components.CardUpload": { + "DeleteConfirmContent": "Are you sure you want to delete the current data?" } } diff --git a/src/BootstrapBlazor/Locales/zh.json b/src/BootstrapBlazor/Locales/zh.json index e443d0dea41..733b6bd261d 100644 --- a/src/BootstrapBlazor/Locales/zh.json +++ b/src/BootstrapBlazor/Locales/zh.json @@ -402,5 +402,8 @@ }, "BootstrapBlazor.Components.LoadMore": { "NoMoreText": "没有更多数据了" + }, + "BootstrapBlazor.Components.CardUpload": { + "DeleteConfirmContent": "确定删除当前数据吗?" } } diff --git a/test/UnitTest/Components/UploadCardTest.cs b/test/UnitTest/Components/UploadCardTest.cs index fd2bf363a11..7bcfc90022d 100644 --- a/test/UnitTest/Components/UploadCardTest.cs +++ b/test/UnitTest/Components/UploadCardTest.cs @@ -321,6 +321,31 @@ public void ActionButtonTemplate_Ok() cut.Contains("action-button-test"); } + [Fact] + public async Task ShowConfirmButton_Ok() + { + var cut = Context.Render>(pb => + { + pb.Add(a => a.DefaultFileList, + [ + new() { FileName = "test.png" } + ]); + pb.Add(a => a.ShowDeleteButton, true); + pb.Add(a => a.ShowDeleteConfirmButton, 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 button = cut.FindComponent(); + Assert.NotNull(button); + Assert.NotNull(button.Instance.OnConfirm); + + await cut.InvokeAsync(button.Instance.OnConfirm); + } + private class MockBrowserFile(string name = "UploadTestFile", string contentType = "text", TimeSpan? delay = null) : IBrowserFile { public string Name { get; } = name;