From 0699a81cb19caea68de56cca8366d225f4593ecf Mon Sep 17 00:00:00 2001 From: Argo-Tianyi Date: Sun, 20 Feb 2022 15:04:27 +0800 Subject: [PATCH 1/2] =?UTF-8?q?refactor:=20=E7=A7=BB=E9=99=A4=20Upload=20?= =?UTF-8?q?=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Attributes/FileValidationAttribute.cs | 2 +- .../Components/Upload/ButtonUpload.razor.cs | 2 +- .../Components/Upload/InputUpload.razor.cs | 12 ++---- .../Components/Upload/Upload.razor | 20 ---------- .../Components/Upload/Upload.razor.cs | 37 ------------------- .../Upload/{Upload.css => UploadBase.css} | 0 .../Upload/{Upload.js => UploadBase.js} | 0 src/BootstrapBlazor/Locales/en.json | 2 +- src/BootstrapBlazor/Locales/pt.json | 2 +- src/BootstrapBlazor/Locales/zh.json | 2 +- 10 files changed, 9 insertions(+), 70 deletions(-) delete mode 100644 src/BootstrapBlazor/Components/Upload/Upload.razor delete mode 100644 src/BootstrapBlazor/Components/Upload/Upload.razor.cs rename src/BootstrapBlazor/Components/Upload/{Upload.css => UploadBase.css} (100%) rename src/BootstrapBlazor/Components/Upload/{Upload.js => UploadBase.js} (100%) diff --git a/src/BootstrapBlazor/Attributes/FileValidationAttribute.cs b/src/BootstrapBlazor/Attributes/FileValidationAttribute.cs index 136a8981e..579622241 100644 --- a/src/BootstrapBlazor/Attributes/FileValidationAttribute.cs +++ b/src/BootstrapBlazor/Attributes/FileValidationAttribute.cs @@ -41,7 +41,7 @@ public class FileValidationAttribute : ValidationAttribute var file = (IBrowserFile?)value; if (file != null) { - Localizer = CacheManager.CreateLocalizer>(); + Localizer = CacheManager.CreateLocalizer>(); if (Extensions.Any() && !Extensions.Contains(Path.GetExtension(file.Name), StringComparer.OrdinalIgnoreCase)) { var errorMessage = Localizer?["FileExtensions", string.Join(", ", Extensions)]; diff --git a/src/BootstrapBlazor/Components/Upload/ButtonUpload.razor.cs b/src/BootstrapBlazor/Components/Upload/ButtonUpload.razor.cs index a2c327396..d7ed34b05 100644 --- a/src/BootstrapBlazor/Components/Upload/ButtonUpload.razor.cs +++ b/src/BootstrapBlazor/Components/Upload/ButtonUpload.razor.cs @@ -39,7 +39,7 @@ public sealed partial class ButtonUpload [Inject] [NotNull] - private IStringLocalizer>? Localizer { get; set; } + private IStringLocalizer>? Localizer { get; set; } /// /// OnInitialized 方法 diff --git a/src/BootstrapBlazor/Components/Upload/InputUpload.razor.cs b/src/BootstrapBlazor/Components/Upload/InputUpload.razor.cs index e7371e0f7..55d19c8c4 100644 --- a/src/BootstrapBlazor/Components/Upload/InputUpload.razor.cs +++ b/src/BootstrapBlazor/Components/Upload/InputUpload.razor.cs @@ -80,7 +80,7 @@ public partial class InputUpload [Inject] [NotNull] - private IStringLocalizer>? Localizer { get; set; } + private IStringLocalizer>? Localizer { get; set; } /// /// OnInitialized 方法 @@ -144,13 +144,9 @@ public partial class InputUpload { if (results.Any()) { - ErrorMessage = results.FirstOrDefault()?.ErrorMessage; - IsValid = string.IsNullOrEmpty(ErrorMessage); - - if (IsValid.HasValue && !IsValid.Value) - { - TooltipMethod = validProperty ? "show" : "enable"; - } + ErrorMessage = results.First().ErrorMessage; + IsValid = false; + TooltipMethod = validProperty ? "show" : "enable"; } else { diff --git a/src/BootstrapBlazor/Components/Upload/Upload.razor b/src/BootstrapBlazor/Components/Upload/Upload.razor deleted file mode 100644 index 43a4ce85e..000000000 --- a/src/BootstrapBlazor/Components/Upload/Upload.razor +++ /dev/null @@ -1,20 +0,0 @@ -@namespace BootstrapBlazor.Components -@typeparam TValue -@inherits ButtonUploadBase - -@if (Style == UploadStyle.Avatar) -{ - -} -else if (Style == UploadStyle.ClickToUpload) -{ - -} -else if (Style == UploadStyle.Card) -{ - -} -else -{ - -} diff --git a/src/BootstrapBlazor/Components/Upload/Upload.razor.cs b/src/BootstrapBlazor/Components/Upload/Upload.razor.cs deleted file mode 100644 index 1daa64fe3..000000000 --- a/src/BootstrapBlazor/Components/Upload/Upload.razor.cs +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) Argo Zhang (argo@163.com). All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -// Website: https://www.blazor.zone or https://argozhang.github.io/ - -using Microsoft.AspNetCore.Components; - -namespace BootstrapBlazor.Components; - -/// -/// -/// -public sealed partial class Upload -{ - /// - /// 获得/设置 上传组件模式 默认为 Normal 正常模式多用于表单中 - /// - [Parameter] - public UploadStyle Style { get; set; } - - /// - /// 获得/设置 文件预览框宽度 - /// - [Parameter] - public int Width { get; set; } = 100; - - /// - /// 获得/设置 文件预览框高度 - /// - [Parameter] - public int Height { get; set; } = 100; - - /// - /// 获得/设置 是否圆形图片框 Avatar 模式时生效 默认为 false - /// - [Parameter] - public bool IsCircle { get; set; } -} diff --git a/src/BootstrapBlazor/Components/Upload/Upload.css b/src/BootstrapBlazor/Components/Upload/UploadBase.css similarity index 100% rename from src/BootstrapBlazor/Components/Upload/Upload.css rename to src/BootstrapBlazor/Components/Upload/UploadBase.css diff --git a/src/BootstrapBlazor/Components/Upload/Upload.js b/src/BootstrapBlazor/Components/Upload/UploadBase.js similarity index 100% rename from src/BootstrapBlazor/Components/Upload/Upload.js rename to src/BootstrapBlazor/Components/Upload/UploadBase.js diff --git a/src/BootstrapBlazor/Locales/en.json b/src/BootstrapBlazor/Locales/en.json index 0fa4b14ff..c7cf084e3 100644 --- a/src/BootstrapBlazor/Locales/en.json +++ b/src/BootstrapBlazor/Locales/en.json @@ -296,7 +296,7 @@ "SearchPlaceHolderString": "Please input ...", "Text": "List" }, - "BootstrapBlazor.Components.Upload": { + "BootstrapBlazor.Components.UploadBase": { "DeleteButtonText": "Delete", "BrowserButtonText": "Browser", "FileExtensions": "File must have one of the following extensions: {0}", diff --git a/src/BootstrapBlazor/Locales/pt.json b/src/BootstrapBlazor/Locales/pt.json index 8ea862d09..2e0391550 100644 --- a/src/BootstrapBlazor/Locales/pt.json +++ b/src/BootstrapBlazor/Locales/pt.json @@ -296,7 +296,7 @@ "SearchPlaceHolderString": "Digite ...", "Text": "Lista" }, - "BootstrapBlazor.Components.Upload": { + "BootstrapBlazor.Components.UploadBase": { "DeleteButtonText": "Excluir", "BrowserButtonText": "Browser", "FileExtensions": "O aquivo deve conter uma das extensões: {0}", diff --git a/src/BootstrapBlazor/Locales/zh.json b/src/BootstrapBlazor/Locales/zh.json index 7164e2db1..7d9c57efd 100644 --- a/src/BootstrapBlazor/Locales/zh.json +++ b/src/BootstrapBlazor/Locales/zh.json @@ -296,7 +296,7 @@ "SearchPlaceHolderString": "请输入 ...", "Text": "列表" }, - "BootstrapBlazor.Components.Upload": { + "BootstrapBlazor.Components.UploadBase": { "DeleteButtonText": "删除", "BrowserButtonText": "浏览", "FileExtensions": "文件扩展名必须为以下几种格式: {0}", -- Gitee From b4d0839c15f8f3f62344b88ddef8ab8bd613cf0d Mon Sep 17 00:00:00 2001 From: Argo-Tianyi Date: Sun, 20 Feb 2022 15:04:50 +0800 Subject: [PATCH 2/2] =?UTF-8?q?test:=20=E5=A2=9E=E5=8A=A0=20InputUpload=20?= =?UTF-8?q?=E5=8D=95=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/UploadTest.cs | 139 +++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 test/UnitTest/Components/UploadTest.cs diff --git a/test/UnitTest/Components/UploadTest.cs b/test/UnitTest/Components/UploadTest.cs new file mode 100644 index 000000000..c285ef95d --- /dev/null +++ b/test/UnitTest/Components/UploadTest.cs @@ -0,0 +1,139 @@ +// Copyright (c) Argo Zhang (argo@163.com). All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Website: https://www.blazor.zone or https://argozhang.github.io/ + +using BootstrapBlazor.Shared; +using Microsoft.AspNetCore.Components.Forms; + +namespace UnitTest.Components; + +public class UploadTest : BootstrapBlazorTestBase +{ + [Fact] + public void InputUpload_Ok() + { + UploadFile? uploadFile = null; + var cut = Context.RenderComponent>(pb => + { + pb.Add(a => a.PlaceHolder, "TestPlaceHolder"); + pb.Add(a => a.OnChange, file => + { + uploadFile = file; + return Task.CompletedTask; + }); + }); + var input = cut.FindComponent(); + cut.InvokeAsync(() => input.Instance.OnChange.InvokeAsync(new InputFileChangeEventArgs(new List() + { + new MockBrowserFile() + }))); + Assert.Equal("UploadTestFile", uploadFile!.OriginFileName); + cut.Contains("fa fa-folder-open-o"); + cut.Contains("btn-primary"); + cut.Contains("TestPlaceHolder"); + + // 参数 + cut.SetParametersAndRender(pb => pb.Add(a => a.BrowserButtonIcon, "fa fa-browser")); + cut.Contains("fa fa-browser"); + + cut.SetParametersAndRender(pb => pb.Add(a => a.BrowserButtonClass, "btn btn-browser")); + cut.Contains("btn btn-browser"); + + cut.SetParametersAndRender(pb => + { + pb.Add(a => a.ShowDeleteButton, true); + pb.Add(a => a.DeleteButtonText, "Delete-Test"); + pb.Add(a => a.DeleteButtonIcon, "fa fa-delete-icon"); + }); + cut.Contains("fa fa-delete-icon"); + cut.Contains("btn-danger"); + + // 删除逻辑 + var deleted = false; + cut.SetParametersAndRender(pb => + { + pb.Add(a => a.DeleteButtonClass, "btn btn-delete"); + pb.Add(a => a.OnDelete, file => + { + deleted = true; + return Task.FromResult(true); + }); + }); + cut.Contains("btn btn-delete"); + + var button = cut.Find(".input-group button"); + cut.InvokeAsync(() => button.Click()); + Assert.True(deleted); + + // IsDisable + cut.SetParametersAndRender(pb => + { + pb.Add(a => a.IsDisabled, true); + }); + cut.Contains("btn btn-delete"); + } + + [Fact] + public void InputUpload_ValidateForm_Ok() + { + var invalid = false; + var foo = new Foo(); + var cut = Context.RenderComponent(pb => + { + pb.Add(a => a.Model, foo); + pb.AddChildContent>(pb => + { + pb.Add(a => a.Value, foo.Name); + pb.Add(a => a.ValueExpression, foo.GenerateValueExpression()); + }); + pb.Add(a => a.OnValidSubmit, context => + { + invalid = false; + return Task.CompletedTask; + }); + pb.Add(a => a.OnInvalidSubmit, context => + { + invalid = true; + return Task.CompletedTask; + }); + }); + + // 提交表单 + var form = cut.Find("form"); + cut.InvokeAsync(() => form.Submit()); + Assert.True(invalid); + + var input = cut.FindComponent(); + cut.InvokeAsync(() => input.Instance.OnChange.InvokeAsync(new InputFileChangeEventArgs(new List() + { + new MockBrowserFile() + }))); + cut.InvokeAsync(() => form.Submit()); + Assert.False(invalid); + } + + [ExcludeFromCodeCoverage] + private class MockBrowserFile : IBrowserFile + { + public MockBrowserFile() + { + Name = "UploadTestFile"; + LastModified = DateTimeOffset.Now; + Size = 10 * 1024; + ContentType = "jpg"; + } + + public string Name { get; } + + public DateTimeOffset LastModified { get; } + + public long Size { get; } + + public string ContentType { get; } + + public Stream OpenReadStream(long maxAllowedSize = 512000, CancellationToken cancellationToken = default) + { + throw new NotImplementedException(); + } + } +} -- Gitee