Preview(item.ValidateId ?? ""))">
+
OnFileDelete(item))"
+ @onclick:stopPropagation="true">
@if (GetShowProgress(item))
diff --git a/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor.cs b/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor.cs
index f0f32d4e66c..98a94d9c750 100644
--- a/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor.cs
+++ b/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor.cs
@@ -154,11 +154,11 @@ protected override async Task TriggerOnChanged(UploadFile file)
/// 预览当前头像方法
///
///
- public async Task Preview()
+ public async Task Preview(string id)
{
- if(ShowPreviewList)
+ if(ShowPreviewList && !string.IsNullOrWhiteSpace(id) && Files.Any(r => r.ValidateId == id))
{
- await InvokeVoidAsync("preview", PreviewerId, 0);
+ await InvokeVoidAsync("preview", PreviewerId, Files.IndexOf(Files.First(r => r.ValidateId == id)));
}
}
diff --git a/src/BootstrapBlazor/Components/Upload/InputUpload.razor.scss b/src/BootstrapBlazor/Components/Upload/InputUpload.razor.scss
index 33efcd27f79..b43f54ca7b0 100644
--- a/src/BootstrapBlazor/Components/Upload/InputUpload.razor.scss
+++ b/src/BootstrapBlazor/Components/Upload/InputUpload.razor.scss
@@ -157,6 +157,14 @@
.upload .upload-body.is-avatar .upload-item:hover .upload-item-actions .upload-item-delete {
display: block;
color: var(--bs-danger);
+ padding: 0.1rem;
+ border-radius: 0.5rem;
+ border: 0.1rem solid var(--bs-danger);
+}
+
+.upload .upload-body.is-avatar .upload-item:hover .upload-item-actions .upload-item-delete:hover {
+ color: var(--bs-white);
+ background-color: var(--bs-danger);
}
.upload .upload-body.is-avatar .upload-item.is-invalid .upload-item-spin {
From 60d29bb6076696b9b3b34fc52468e9a9e9e18198 Mon Sep 17 00:00:00 2001
From: momiji-gz302ea <2648863351@qq.com>
Date: Thu, 18 Dec 2025 18:44:01 +0800
Subject: [PATCH 02/19] refactor(AvatarUpload): Update unit test
---
test/UnitTest/Components/UploadAvatarTest.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/test/UnitTest/Components/UploadAvatarTest.cs b/test/UnitTest/Components/UploadAvatarTest.cs
index 9b32d935dd6..b2fc96a57f8 100644
--- a/test/UnitTest/Components/UploadAvatarTest.cs
+++ b/test/UnitTest/Components/UploadAvatarTest.cs
@@ -76,8 +76,8 @@ await cut.InvokeAsync(() => input.Instance.OnChange.InvokeAsync(new InputFileCha
new()
})));
- // call preview
- await cut.InvokeAsync(() => cut.Instance.Preview());
+ // call preview // without using reflection, it is not possible to obtain the actual runtime values.
+ await cut.InvokeAsync(() => cut.Instance.Preview(""));
// upload-item-delete
var button = cut.Find(".upload-item-delete");
From 9f8bd31080ca21250fed77373b94549386bf6b02 Mon Sep 17 00:00:00 2001
From: momiji-gz302ea <2648863351@qq.com>
Date: Thu, 18 Dec 2025 18:53:46 +0800
Subject: [PATCH 03/19] refactor(AvatarUpload): Refactor the related logic to
reduce redundant calculations.
---
src/BootstrapBlazor/Components/Upload/AvatarUpload.razor | 2 +-
.../Components/Upload/AvatarUpload.razor.cs | 8 +++++---
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor b/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor
index 18d8fe167ae..8bf58e7ebc2 100644
--- a/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor
+++ b/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor
@@ -16,7 +16,7 @@
{
-
Preview(item.ValidateId ?? ""))">
+
Preview(item.ValidateId))">
OnFileDelete(item))"
@onclick:stopPropagation="true">
diff --git a/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor.cs b/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor.cs
index 98a94d9c750..c2e2110f2d8 100644
--- a/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor.cs
+++ b/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor.cs
@@ -154,11 +154,13 @@ protected override async Task TriggerOnChanged(UploadFile file)
/// 预览当前头像方法
///
///
- public async Task Preview(string id)
+ public async Task Preview(string? id)
{
- if(ShowPreviewList && !string.IsNullOrWhiteSpace(id) && Files.Any(r => r.ValidateId == id))
+ if(ShowPreviewList && !string.IsNullOrWhiteSpace(id))
{
- await InvokeVoidAsync("preview", PreviewerId, Files.IndexOf(Files.First(r => r.ValidateId == id)));
+ var index = Files.FindIndex(r => r.ValidateId == id);
+ if (index != -1)
+ await InvokeVoidAsync("preview", PreviewerId, index);
}
}
From 285ffea48005adc54ccf5acd55d51ba6ec067341 Mon Sep 17 00:00:00 2001
From: momiji-gz302ea <2648863351@qq.com>
Date: Thu, 18 Dec 2025 19:01:21 +0800
Subject: [PATCH 04/19] refactor(AvatarUpload): Update unit test
---
test/UnitTest/Components/UploadAvatarTest.cs | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/test/UnitTest/Components/UploadAvatarTest.cs b/test/UnitTest/Components/UploadAvatarTest.cs
index b2fc96a57f8..e6687d36730 100644
--- a/test/UnitTest/Components/UploadAvatarTest.cs
+++ b/test/UnitTest/Components/UploadAvatarTest.cs
@@ -77,7 +77,11 @@ await cut.InvokeAsync(() => input.Instance.OnChange.InvokeAsync(new InputFileCha
})));
// call preview // without using reflection, it is not possible to obtain the actual runtime values.
- await cut.InvokeAsync(() => cut.Instance.Preview(""));
+ await cut.InvokeAsync(() => cut.Instance.Preview("test-id"));
+
+ // upload-item-actions
+ var img = cut.Find(".upload-item-actions");
+ await cut.InvokeAsync(() => img.Click());
// upload-item-delete
var button = cut.Find(".upload-item-delete");
From 509573ed50910ab2a9cb37d9f49c4b892ec507a3 Mon Sep 17 00:00:00 2001
From: momiji-gz302ea <2648863351@qq.com>
Date: Thu, 18 Dec 2025 19:23:24 +0800
Subject: [PATCH 05/19] refactor(AvatarUpload): Unit test need ok uploadFile,
Files search change to use PrevUrl
---
src/BootstrapBlazor/Components/Upload/AvatarUpload.razor | 2 +-
src/BootstrapBlazor/Components/Upload/AvatarUpload.razor.cs | 6 +++---
test/UnitTest/Components/UploadAvatarTest.cs | 4 ++--
3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor b/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor
index 8bf58e7ebc2..1163013955c 100644
--- a/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor
+++ b/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor
@@ -16,7 +16,7 @@
{
-
Preview(item.ValidateId))">
+
Preview(item))">
OnFileDelete(item))"
@onclick:stopPropagation="true">
diff --git a/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor.cs b/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor.cs
index c2e2110f2d8..a6dc6c97c72 100644
--- a/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor.cs
+++ b/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor.cs
@@ -154,11 +154,11 @@ protected override async Task TriggerOnChanged(UploadFile file)
/// 预览当前头像方法
///
///
- public async Task Preview(string? id)
+ public async Task Preview(UploadFile file)
{
- if(ShowPreviewList && !string.IsNullOrWhiteSpace(id))
+ if(ShowPreviewList && !string.IsNullOrWhiteSpace(file.PrevUrl))
{
- var index = Files.FindIndex(r => r.ValidateId == id);
+ var index = Files.FindIndex(r => r.PrevUrl == file.PrevUrl);
if (index != -1)
await InvokeVoidAsync("preview", PreviewerId, index);
}
diff --git a/test/UnitTest/Components/UploadAvatarTest.cs b/test/UnitTest/Components/UploadAvatarTest.cs
index e6687d36730..0db4d51f6cb 100644
--- a/test/UnitTest/Components/UploadAvatarTest.cs
+++ b/test/UnitTest/Components/UploadAvatarTest.cs
@@ -67,7 +67,7 @@ await cut.InvokeAsync(() => input.Instance.OnChange.InvokeAsync(new InputFileCha
pb.Add(a => a.ShowProgress, true);
pb.Add(a => a.DefaultFileList,
[
- new() { FileName = "Test-File" }
+ new() { FileName = "Test-File", PrevUrl = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAkCAYAAAD/yagrAAAE60lEQVR4AWJwL/AB9GIWvI0jURz/L1NomZmZP8p9kWNmhnIbKPdomZmZGcJgO7QsWMbce55Yl11t47FbVdKTYpjOr/+H4y4Z/MpYeJVV8KVvokFRylq9osKfVtGQ/NHyPl2CbNVGwau2oOlmgUDJtDJGzxtvvIA3vRH+7IgeA0VtYhQBtKPlToFgC6RY58aggfwLNKhr0Zry2NnPrpIM2YGW2+UBG1IEmdGVJEVXE+hQXt8joKhLjdGVZHd7TSD9DHmT3J1dheroSF4fhnvUVQwbZx9UOnHSzQjkTN0tIG+8hFdbxet4PQOG4WqJwN1hFVb+xUBmCblxvxRkIE+Q+Yf0T31NSrp4/RV4FhHgoSTchQRZBK4D1+Fe2q2g8CYXU6buQyNDaiZKZhn0IYXHVwbkRQydHyawOAGGisa/o3DvI/jF3QKKiuAy+LKs5CvaXMLdeXb35wbkKTjmReDZHysCBosWJqN7r0jZ/VfgXtIlUNQnVpK7D4nNJSC5BHGi1d108Ppr8MxlF0cJqBSyFJaUfUnvHLyO4cttgaI+NhGB7HE0MaSUks/gU5vwe1gv5tfhmUmAhxME8jbIUtiEDus+fhmDJlgCRY0ylZRZhybKWtNinmYlH9NvL5puO3m9UHOkgzb3xuF5HCkDyhYiSwrYVfQPTpYChTc+E35tG9VJBjGFFNmtVlNMDnjzbx0EBpKq1eTeh2awbArBRuHadBWu6WVB4U/NITfuobYoCZl7QL//wDtr+nTmsgzQh2Kwgtz7QAZWFeGw/RI8s94Kigp1PvzZg2i9x11FDtKn/oZCoZdZxhaAXmG4/ohJKHudLE1Gyu66DOfs10BRR5CU3TKQIrtzj9BAkF991dsMslTZEClLsI+jFmANZYFAdAJl9QG03jWH9GrcFh9QTP4Of6GfJGSpsv1J2aoEKRuWCANNJNqOFAaPAW36rVRMCjVf6ZCtqYF2p6Asxg5mWK6tQamY9RCs8z1wF+FxTR5UqYT/3GC7oCkMHcjxKguq6cnl+Egf2whip3C9Yu56jk+GXXOtv1XIa8L1f3AFkHe9az83AmNanwV/bhfa5JKJ3n1slCUL8dk7CNfvVFMfySRThoxbK7fh18tTZXI2QeySLk88IRGsbHkqQj6wUJ72G5CloCXKZrdbLPgVMgVfQMq5m97bfQWOOeVbaK02nSA2ofn2y662UJE47horLZTe38oDjdxQUhmawocxa0OJ5hXjnZE4w1y0uc/iULKGfk+xNuZxI/BnjhFs+THPq4phmTsbeYPXRjFsJJ+NSMlnInHkxrwzGDjR3uBcG1/B/b/TwZkhubb6tP2oVfTAD2G4kw9vYiA2h+zy4GwYxd7S4qGOgd6oqVn6re1DTXiO4e4wPF+yQlF4ZCBfheSPIjJn+ciS/w93qjA6aZYqeQ5D3dTqvuE6GZNTkov5vqsYvLh7j8u1sWWkLIdBQR+q+XdtaKGhJCWBDpkwgSw9gRpKyoNKw6rjCLCDP4yVflSgWFwt3C0HSUo2BTFYX28fVAaWPpDx7wtwjOSSUszawnUT0KTudlfrFQwZ3WNf867CNZQhk/C8kIFUhJLt/O3Jzn62IYNwrUvA8zws4W61CGlDSfugXMz5pJgiSFYyXMYiRXdH4GmyqaR9UHLxzxG41KAwpZxRPN4kRf85Z5I4MvYfFUFGfemJG40AAAAASUVORK5CYII=" },
]);
});
input = cut.FindComponent();
@@ -77,7 +77,7 @@ await cut.InvokeAsync(() => input.Instance.OnChange.InvokeAsync(new InputFileCha
})));
// call preview // without using reflection, it is not possible to obtain the actual runtime values.
- await cut.InvokeAsync(() => cut.Instance.Preview("test-id"));
+ await cut.InvokeAsync(() => cut.Instance.Preview(new UploadFile()));
// upload-item-actions
var img = cut.Find(".upload-item-actions");
From 84f274e9cd37c87f45afa1e2bdc4ae9fabf7d008 Mon Sep 17 00:00:00 2001
From: momiji-gz302ea <2648863351@qq.com>
Date: Thu, 18 Dec 2025 20:01:53 +0800
Subject: [PATCH 06/19] refactor(AvatarUpload): Update unit test
---
test/UnitTest/Components/UploadAvatarTest.cs | 19 ++++++++++++-------
1 file changed, 12 insertions(+), 7 deletions(-)
diff --git a/test/UnitTest/Components/UploadAvatarTest.cs b/test/UnitTest/Components/UploadAvatarTest.cs
index 0db4d51f6cb..f7fecffb6dc 100644
--- a/test/UnitTest/Components/UploadAvatarTest.cs
+++ b/test/UnitTest/Components/UploadAvatarTest.cs
@@ -77,15 +77,20 @@ await cut.InvokeAsync(() => input.Instance.OnChange.InvokeAsync(new InputFileCha
})));
// call preview // without using reflection, it is not possible to obtain the actual runtime values.
- await cut.InvokeAsync(() => cut.Instance.Preview(new UploadFile()));
+ await cut.InvokeAsync(() => cut.Instance.Preview(new UploadFile(){ FileName = "Test-File-HasErrData", PrevUrl = "ErrData" }));
- // upload-item-actions
- var img = cut.Find(".upload-item-actions");
- await cut.InvokeAsync(() => img.Click());
+ // all data
+ var length = cut.FindAll(".upload-item-actions").Count;
+ for (int i = 0; i < length; i++)
+ {
+ // upload-item-actions
+ var img = cut.Find(".upload-item-actions");
+ await cut.InvokeAsync(() => img.Click());
- // upload-item-delete
- var button = cut.Find(".upload-item-delete");
- await cut.InvokeAsync(() => button.Click());
+ // upload-item-delete
+ var button = cut.Find(".upload-item-delete");
+ await cut.InvokeAsync(() => button.Click());
+ }
cut.Contains("btn-browser");
cut.Render(pb =>
From 7827b37309c45dd6830381de958c087e0bf5c906 Mon Sep 17 00:00:00 2001
From: momiji-gz302ea <2648863351@qq.com>
Date: Thu, 18 Dec 2025 20:08:49 +0800
Subject: [PATCH 07/19] refactor(AvatarUpload): Update unit test
---
test/UnitTest/Components/UploadAvatarTest.cs | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/test/UnitTest/Components/UploadAvatarTest.cs b/test/UnitTest/Components/UploadAvatarTest.cs
index f7fecffb6dc..598d0c603b1 100644
--- a/test/UnitTest/Components/UploadAvatarTest.cs
+++ b/test/UnitTest/Components/UploadAvatarTest.cs
@@ -77,7 +77,8 @@ await cut.InvokeAsync(() => input.Instance.OnChange.InvokeAsync(new InputFileCha
})));
// call preview // without using reflection, it is not possible to obtain the actual runtime values.
- await cut.InvokeAsync(() => cut.Instance.Preview(new UploadFile(){ FileName = "Test-File-HasErrData", PrevUrl = "ErrData" }));
+ await cut.InvokeAsync(() => cut.Instance.Preview(new UploadFile(){ FileName = "Test-File-HasErrData1", PrevUrl = " " }));
+ await cut.InvokeAsync(() => cut.Instance.Preview(new UploadFile(){ FileName = "Test-File-HasErrData2", PrevUrl = "" }));
// all data
var length = cut.FindAll(".upload-item-actions").Count;
From 7e55079294f1e27bcbe79af8d5523915cdf8aec3 Mon Sep 17 00:00:00 2001
From: momiji-gz302ea <2648863351@qq.com>
Date: Thu, 18 Dec 2025 20:20:33 +0800
Subject: [PATCH 08/19] refactor(AvatarUpload): Update unit test
---
test/UnitTest/Components/UploadAvatarTest.cs | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/test/UnitTest/Components/UploadAvatarTest.cs b/test/UnitTest/Components/UploadAvatarTest.cs
index 598d0c603b1..ee0f083df73 100644
--- a/test/UnitTest/Components/UploadAvatarTest.cs
+++ b/test/UnitTest/Components/UploadAvatarTest.cs
@@ -60,6 +60,11 @@ await cut.InvokeAsync(() => input.Instance.OnChange.InvokeAsync(new InputFileCha
});
cut.Contains("--bb-upload-item-border-radius: 10px;");
+ // ShowPreviewList is false
+ var oldButton = cut.Find(".upload-item-delete");
+ await cut.InvokeAsync(() => oldButton.Click());
+ await cut.InvokeAsync(() => cut.Instance.Preview(new UploadFile(){ FileName = "Test-File-HasErrData", PrevUrl = "" }));
+
// DefaultFileList
cut.Render(pb =>
{
@@ -76,9 +81,10 @@ await cut.InvokeAsync(() => input.Instance.OnChange.InvokeAsync(new InputFileCha
new()
})));
- // call preview // without using reflection, it is not possible to obtain the actual runtime values.
- await cut.InvokeAsync(() => cut.Instance.Preview(new UploadFile(){ FileName = "Test-File-HasErrData1", PrevUrl = " " }));
- await cut.InvokeAsync(() => cut.Instance.Preview(new UploadFile(){ FileName = "Test-File-HasErrData2", PrevUrl = "" }));
+ // call preview
+ await cut.InvokeAsync(() => cut.Instance.Preview(new UploadFile(){ FileName = "Test-File-HasErrData1", PrevUrl = "ErrData" }));
+ await cut.InvokeAsync(() => cut.Instance.Preview(new UploadFile(){ FileName = "Test-File-HasErrData2", PrevUrl = " " }));
+ await cut.InvokeAsync(() => cut.Instance.Preview(new UploadFile(){ FileName = "Test-File-HasErrData3", PrevUrl = null }));
// all data
var length = cut.FindAll(".upload-item-actions").Count;
From 88aaa0b70b9158e788fe19071de3cad807106597 Mon Sep 17 00:00:00 2001
From: Argo Zhang
Date: Fri, 19 Dec 2025 09:40:16 +0800
Subject: [PATCH 09/19] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E4=BB=A3?=
=?UTF-8?q?=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Components/Upload/AvatarUpload.razor.cs | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor.cs b/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor.cs
index a6dc6c97c72..75242e08144 100644
--- a/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor.cs
+++ b/src/BootstrapBlazor/Components/Upload/AvatarUpload.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
@@ -154,13 +154,23 @@ protected override async Task TriggerOnChanged(UploadFile file)
/// 预览当前头像方法
///
///
- public async Task Preview(UploadFile file)
+ public async Task Preview()
{
- if(ShowPreviewList && !string.IsNullOrWhiteSpace(file.PrevUrl))
+ if (ShowPreviewList)
+ {
+ await InvokeVoidAsync("preview", PreviewerId, 0);
+ }
+ }
+
+ private async Task Preview(UploadFile file)
+ {
+ if (ShowPreviewList && !string.IsNullOrEmpty(file.PrevUrl))
{
var index = Files.FindIndex(r => r.PrevUrl == file.PrevUrl);
if (index != -1)
+ {
await InvokeVoidAsync("preview", PreviewerId, index);
+ }
}
}
From f6047d762911e77aeb0b57ab151c707cbc3990df Mon Sep 17 00:00:00 2001
From: Argo Zhang
Date: Fri, 19 Dec 2025 09:40:37 +0800
Subject: [PATCH 10/19] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E7=BC=96?=
=?UTF-8?q?=E7=A0=81=E6=96=B9=E5=BC=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/BootstrapBlazor/Components/Upload/AvatarUpload.razor | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor b/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor
index 1163013955c..74facab4083 100644
--- a/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor
+++ b/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor
@@ -1,4 +1,4 @@
-@namespace BootstrapBlazor.Components
+@namespace BootstrapBlazor.Components
@typeparam TValue
@inherits UploadBase
From 920286ca2de34b29085e8c74792b7e448720ddaa Mon Sep 17 00:00:00 2001
From: Argo Zhang
Date: Fri, 19 Dec 2025 09:41:14 +0800
Subject: [PATCH 11/19] =?UTF-8?q?style:=20=E5=BE=AE=E8=B0=83=E6=A0=B7?=
=?UTF-8?q?=E5=BC=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/BootstrapBlazor/Components/Upload/InputUpload.razor.scss | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/BootstrapBlazor/Components/Upload/InputUpload.razor.scss b/src/BootstrapBlazor/Components/Upload/InputUpload.razor.scss
index 0644fe24545..befa842cca1 100644
--- a/src/BootstrapBlazor/Components/Upload/InputUpload.razor.scss
+++ b/src/BootstrapBlazor/Components/Upload/InputUpload.razor.scss
@@ -85,7 +85,7 @@
}
.upload .upload-body.is-list .cancel-icon {
- margin-left: .5rem;
+ margin-inline-start: .5rem;
color: var(--bs-danger);
}
From fedc3b8b4113dc2554239544b09f8834c60b66fb Mon Sep 17 00:00:00 2001
From: Argo Zhang
Date: Fri, 19 Dec 2025 09:41:25 +0800
Subject: [PATCH 12/19] =?UTF-8?q?style:=20=E6=9B=B4=E6=96=B0=E6=A0=B7?=
=?UTF-8?q?=E5=BC=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Components/Upload/InputUpload.razor.scss | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/BootstrapBlazor/Components/Upload/InputUpload.razor.scss b/src/BootstrapBlazor/Components/Upload/InputUpload.razor.scss
index befa842cca1..45f7b40d418 100644
--- a/src/BootstrapBlazor/Components/Upload/InputUpload.razor.scss
+++ b/src/BootstrapBlazor/Components/Upload/InputUpload.razor.scss
@@ -157,9 +157,9 @@
.upload .upload-body.is-avatar .upload-item:hover .upload-item-actions .upload-item-delete {
display: block;
color: var(--bs-danger);
- padding: 0.1rem;
- border-radius: 0.5rem;
- border: 0.1rem solid var(--bs-danger);
+ padding: 0.25rem;
+ border-radius: var(--bs-border-radius);
+ border: 1px solid var(--bs-danger);
}
.upload .upload-body.is-avatar .upload-item:hover .upload-item-actions .upload-item-delete:hover {
From 7212c15e308ad38386a115fc51680fc963970cd7 Mon Sep 17 00:00:00 2001
From: Argo Zhang
Date: Fri, 19 Dec 2025 09:43:32 +0800
Subject: [PATCH 13/19] Revert "refactor(AvatarUpload): Update unit test"
This reverts commit 7e55079294f1e27bcbe79af8d5523915cdf8aec3.
---
test/UnitTest/Components/UploadAvatarTest.cs | 12 +++---------
1 file changed, 3 insertions(+), 9 deletions(-)
diff --git a/test/UnitTest/Components/UploadAvatarTest.cs b/test/UnitTest/Components/UploadAvatarTest.cs
index ee0f083df73..598d0c603b1 100644
--- a/test/UnitTest/Components/UploadAvatarTest.cs
+++ b/test/UnitTest/Components/UploadAvatarTest.cs
@@ -60,11 +60,6 @@ await cut.InvokeAsync(() => input.Instance.OnChange.InvokeAsync(new InputFileCha
});
cut.Contains("--bb-upload-item-border-radius: 10px;");
- // ShowPreviewList is false
- var oldButton = cut.Find(".upload-item-delete");
- await cut.InvokeAsync(() => oldButton.Click());
- await cut.InvokeAsync(() => cut.Instance.Preview(new UploadFile(){ FileName = "Test-File-HasErrData", PrevUrl = "" }));
-
// DefaultFileList
cut.Render(pb =>
{
@@ -81,10 +76,9 @@ await cut.InvokeAsync(() => input.Instance.OnChange.InvokeAsync(new InputFileCha
new()
})));
- // call preview
- await cut.InvokeAsync(() => cut.Instance.Preview(new UploadFile(){ FileName = "Test-File-HasErrData1", PrevUrl = "ErrData" }));
- await cut.InvokeAsync(() => cut.Instance.Preview(new UploadFile(){ FileName = "Test-File-HasErrData2", PrevUrl = " " }));
- await cut.InvokeAsync(() => cut.Instance.Preview(new UploadFile(){ FileName = "Test-File-HasErrData3", PrevUrl = null }));
+ // call preview // without using reflection, it is not possible to obtain the actual runtime values.
+ await cut.InvokeAsync(() => cut.Instance.Preview(new UploadFile(){ FileName = "Test-File-HasErrData1", PrevUrl = " " }));
+ await cut.InvokeAsync(() => cut.Instance.Preview(new UploadFile(){ FileName = "Test-File-HasErrData2", PrevUrl = "" }));
// all data
var length = cut.FindAll(".upload-item-actions").Count;
From 757b8f0b4276554fedb10f8974cfb7ea3ef12953 Mon Sep 17 00:00:00 2001
From: Argo Zhang
Date: Fri, 19 Dec 2025 09:43:37 +0800
Subject: [PATCH 14/19] Revert "refactor(AvatarUpload): Update unit test"
This reverts commit 7827b37309c45dd6830381de958c087e0bf5c906.
---
test/UnitTest/Components/UploadAvatarTest.cs | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/test/UnitTest/Components/UploadAvatarTest.cs b/test/UnitTest/Components/UploadAvatarTest.cs
index 598d0c603b1..f7fecffb6dc 100644
--- a/test/UnitTest/Components/UploadAvatarTest.cs
+++ b/test/UnitTest/Components/UploadAvatarTest.cs
@@ -77,8 +77,7 @@ await cut.InvokeAsync(() => input.Instance.OnChange.InvokeAsync(new InputFileCha
})));
// call preview // without using reflection, it is not possible to obtain the actual runtime values.
- await cut.InvokeAsync(() => cut.Instance.Preview(new UploadFile(){ FileName = "Test-File-HasErrData1", PrevUrl = " " }));
- await cut.InvokeAsync(() => cut.Instance.Preview(new UploadFile(){ FileName = "Test-File-HasErrData2", PrevUrl = "" }));
+ await cut.InvokeAsync(() => cut.Instance.Preview(new UploadFile(){ FileName = "Test-File-HasErrData", PrevUrl = "ErrData" }));
// all data
var length = cut.FindAll(".upload-item-actions").Count;
From 756bd8b69fc24d9f10f7119da56f445a38d029e5 Mon Sep 17 00:00:00 2001
From: Argo Zhang
Date: Fri, 19 Dec 2025 09:43:43 +0800
Subject: [PATCH 15/19] Revert "refactor(AvatarUpload): Update unit test"
This reverts commit 84f274e9cd37c87f45afa1e2bdc4ae9fabf7d008.
---
test/UnitTest/Components/UploadAvatarTest.cs | 19 +++++++------------
1 file changed, 7 insertions(+), 12 deletions(-)
diff --git a/test/UnitTest/Components/UploadAvatarTest.cs b/test/UnitTest/Components/UploadAvatarTest.cs
index f7fecffb6dc..0db4d51f6cb 100644
--- a/test/UnitTest/Components/UploadAvatarTest.cs
+++ b/test/UnitTest/Components/UploadAvatarTest.cs
@@ -77,20 +77,15 @@ await cut.InvokeAsync(() => input.Instance.OnChange.InvokeAsync(new InputFileCha
})));
// call preview // without using reflection, it is not possible to obtain the actual runtime values.
- await cut.InvokeAsync(() => cut.Instance.Preview(new UploadFile(){ FileName = "Test-File-HasErrData", PrevUrl = "ErrData" }));
+ await cut.InvokeAsync(() => cut.Instance.Preview(new UploadFile()));
- // all data
- var length = cut.FindAll(".upload-item-actions").Count;
- for (int i = 0; i < length; i++)
- {
- // upload-item-actions
- var img = cut.Find(".upload-item-actions");
- await cut.InvokeAsync(() => img.Click());
+ // upload-item-actions
+ var img = cut.Find(".upload-item-actions");
+ await cut.InvokeAsync(() => img.Click());
- // upload-item-delete
- var button = cut.Find(".upload-item-delete");
- await cut.InvokeAsync(() => button.Click());
- }
+ // upload-item-delete
+ var button = cut.Find(".upload-item-delete");
+ await cut.InvokeAsync(() => button.Click());
cut.Contains("btn-browser");
cut.Render(pb =>
From 81a4cc5a4b66156d0daa0d4d09e94ea2099c9ab7 Mon Sep 17 00:00:00 2001
From: Argo Zhang
Date: Fri, 19 Dec 2025 09:44:51 +0800
Subject: [PATCH 16/19] =?UTF-8?q?chore:=20=E9=87=8D=E6=9E=84=E5=8D=95?=
=?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
test/UnitTest/Components/UploadAvatarTest.cs | 10 +++-------
1 file changed, 3 insertions(+), 7 deletions(-)
diff --git a/test/UnitTest/Components/UploadAvatarTest.cs b/test/UnitTest/Components/UploadAvatarTest.cs
index 0db4d51f6cb..9b32d935dd6 100644
--- a/test/UnitTest/Components/UploadAvatarTest.cs
+++ b/test/UnitTest/Components/UploadAvatarTest.cs
@@ -67,7 +67,7 @@ await cut.InvokeAsync(() => input.Instance.OnChange.InvokeAsync(new InputFileCha
pb.Add(a => a.ShowProgress, true);
pb.Add(a => a.DefaultFileList,
[
- new() { FileName = "Test-File", PrevUrl = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAkCAYAAAD/yagrAAAE60lEQVR4AWJwL/AB9GIWvI0jURz/L1NomZmZP8p9kWNmhnIbKPdomZmZGcJgO7QsWMbce55Yl11t47FbVdKTYpjOr/+H4y4Z/MpYeJVV8KVvokFRylq9osKfVtGQ/NHyPl2CbNVGwau2oOlmgUDJtDJGzxtvvIA3vRH+7IgeA0VtYhQBtKPlToFgC6RY58aggfwLNKhr0Zry2NnPrpIM2YGW2+UBG1IEmdGVJEVXE+hQXt8joKhLjdGVZHd7TSD9DHmT3J1dheroSF4fhnvUVQwbZx9UOnHSzQjkTN0tIG+8hFdbxet4PQOG4WqJwN1hFVb+xUBmCblxvxRkIE+Q+Yf0T31NSrp4/RV4FhHgoSTchQRZBK4D1+Fe2q2g8CYXU6buQyNDaiZKZhn0IYXHVwbkRQydHyawOAGGisa/o3DvI/jF3QKKiuAy+LKs5CvaXMLdeXb35wbkKTjmReDZHysCBosWJqN7r0jZ/VfgXtIlUNQnVpK7D4nNJSC5BHGi1d108Ppr8MxlF0cJqBSyFJaUfUnvHLyO4cttgaI+NhGB7HE0MaSUks/gU5vwe1gv5tfhmUmAhxME8jbIUtiEDus+fhmDJlgCRY0ylZRZhybKWtNinmYlH9NvL5puO3m9UHOkgzb3xuF5HCkDyhYiSwrYVfQPTpYChTc+E35tG9VJBjGFFNmtVlNMDnjzbx0EBpKq1eTeh2awbArBRuHadBWu6WVB4U/NITfuobYoCZl7QL//wDtr+nTmsgzQh2Kwgtz7QAZWFeGw/RI8s94Kigp1PvzZg2i9x11FDtKn/oZCoZdZxhaAXmG4/ohJKHudLE1Gyu66DOfs10BRR5CU3TKQIrtzj9BAkF991dsMslTZEClLsI+jFmANZYFAdAJl9QG03jWH9GrcFh9QTP4Of6GfJGSpsv1J2aoEKRuWCANNJNqOFAaPAW36rVRMCjVf6ZCtqYF2p6Asxg5mWK6tQamY9RCs8z1wF+FxTR5UqYT/3GC7oCkMHcjxKguq6cnl+Egf2whip3C9Yu56jk+GXXOtv1XIa8L1f3AFkHe9az83AmNanwV/bhfa5JKJ3n1slCUL8dk7CNfvVFMfySRThoxbK7fh18tTZXI2QeySLk88IRGsbHkqQj6wUJ72G5CloCXKZrdbLPgVMgVfQMq5m97bfQWOOeVbaK02nSA2ofn2y662UJE47horLZTe38oDjdxQUhmawocxa0OJ5hXjnZE4w1y0uc/iULKGfk+xNuZxI/BnjhFs+THPq4phmTsbeYPXRjFsJJ+NSMlnInHkxrwzGDjR3uBcG1/B/b/TwZkhubb6tP2oVfTAD2G4kw9vYiA2h+zy4GwYxd7S4qGOgd6oqVn6re1DTXiO4e4wPF+yQlF4ZCBfheSPIjJn+ciS/w93qjA6aZYqeQ5D3dTqvuE6GZNTkov5vqsYvLh7j8u1sWWkLIdBQR+q+XdtaKGhJCWBDpkwgSw9gRpKyoNKw6rjCLCDP4yVflSgWFwt3C0HSUo2BTFYX28fVAaWPpDx7wtwjOSSUszawnUT0KTudlfrFQwZ3WNf867CNZQhk/C8kIFUhJLt/O3Jzn62IYNwrUvA8zws4W61CGlDSfugXMz5pJgiSFYyXMYiRXdH4GmyqaR9UHLxzxG41KAwpZxRPN4kRf85Z5I4MvYfFUFGfemJG40AAAAASUVORK5CYII=" },
+ new() { FileName = "Test-File" }
]);
});
input = cut.FindComponent();
@@ -76,12 +76,8 @@ await cut.InvokeAsync(() => input.Instance.OnChange.InvokeAsync(new InputFileCha
new()
})));
- // call preview // without using reflection, it is not possible to obtain the actual runtime values.
- await cut.InvokeAsync(() => cut.Instance.Preview(new UploadFile()));
-
- // upload-item-actions
- var img = cut.Find(".upload-item-actions");
- await cut.InvokeAsync(() => img.Click());
+ // call preview
+ await cut.InvokeAsync(() => cut.Instance.Preview());
// upload-item-delete
var button = cut.Find(".upload-item-delete");
From 2f86dd61622eade1bbea763f9b7aeec53fa120e1 Mon Sep 17 00:00:00 2001
From: Argo Zhang
Date: Fri, 19 Dec 2025 09:56:43 +0800
Subject: [PATCH 17/19] =?UTF-8?q?test:=20=E5=A2=9E=E5=8A=A0=E5=8D=95?=
=?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
test/UnitTest/Components/UploadAvatarTest.cs | 25 ++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/test/UnitTest/Components/UploadAvatarTest.cs b/test/UnitTest/Components/UploadAvatarTest.cs
index 9b32d935dd6..79b0e09ec43 100644
--- a/test/UnitTest/Components/UploadAvatarTest.cs
+++ b/test/UnitTest/Components/UploadAvatarTest.cs
@@ -98,6 +98,31 @@ await cut.InvokeAsync(() => input.Instance.OnChange.InvokeAsync(new InputFileCha
});
}
+ [Fact]
+ public async Task Preview_Ok()
+ {
+ var cut = Context.Render>(pb =>
+ {
+ pb.Add(a => a.DefaultFileList, new List()
+ {
+ new UploadFile() { PrevUrl = "./sample/preview.jpg" }
+ });
+ });
+
+ var action = cut.Find(".upload-item-actions");
+ await cut.InvokeAsync(() => action.Click());
+
+ cut.Render(pb =>
+ {
+ pb.Add(a => a.DefaultFileList, new List()
+ {
+ new UploadFile() { PrevUrl = "" }
+ });
+ });
+ action = cut.Find(".upload-item-actions");
+ await cut.InvokeAsync(() => action.Click());
+ }
+
[Fact]
public async Task AvatarUpload_ValidateForm_Ok()
{
From ddcd6f2b2913bdb2ddb20a8a07a6ac029208e485 Mon Sep 17 00:00:00 2001
From: Argo Zhang
Date: Fri, 19 Dec 2025 09:59:20 +0800
Subject: [PATCH 18/19] =?UTF-8?q?test:=20=E6=9B=B4=E6=96=B0=E5=8D=95?=
=?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/BootstrapBlazor/Components/Upload/AvatarUpload.razor.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor.cs b/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor.cs
index 75242e08144..9cd596900b5 100644
--- a/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor.cs
+++ b/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor.cs
@@ -164,7 +164,7 @@ public async Task Preview()
private async Task Preview(UploadFile file)
{
- if (ShowPreviewList && !string.IsNullOrEmpty(file.PrevUrl))
+ if (!string.IsNullOrEmpty(file.PrevUrl))
{
var index = Files.FindIndex(r => r.PrevUrl == file.PrevUrl);
if (index != -1)
From 7ca214f1bcf875b1cf06f765006eb3943824e745 Mon Sep 17 00:00:00 2001
From: Argo Zhang
Date: Fri, 19 Dec 2025 10:00:33 +0800
Subject: [PATCH 19/19] chore: bump version 10.1.4
---
src/BootstrapBlazor/BootstrapBlazor.csproj | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/BootstrapBlazor/BootstrapBlazor.csproj b/src/BootstrapBlazor/BootstrapBlazor.csproj
index c284f19acd6..cda610aa65a 100644
--- a/src/BootstrapBlazor/BootstrapBlazor.csproj
+++ b/src/BootstrapBlazor/BootstrapBlazor.csproj
@@ -1,7 +1,7 @@
- 10.1.4-beta07
+ 10.1.4